mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
pci: Convert msi_init() to Error and fix callers to check it
msi_init() reports errors with error_report(), which is wrong when it's used in realize(). Fix by converting it to Error. Fix its callers to handle failure instead of ignoring it. For those callers who don't handle the failure, it might happen: when user want msi on, but he doesn't get what he want because of msi_init fails silently. cc: Gerd Hoffmann <kraxel@redhat.com> cc: John Snow <jsnow@redhat.com> cc: Dmitry Fleytman <dmitry@daynix.com> cc: Jason Wang <jasowang@redhat.com> cc: Michael S. Tsirkin <mst@redhat.com> cc: Hannes Reinecke <hare@suse.de> cc: Paolo Bonzini <pbonzini@redhat.com> cc: Alex Williamson <alex.williamson@redhat.com> cc: Markus Armbruster <armbru@redhat.com> cc: Marcel Apfelbaum <marcel@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Cao jin <caoj.fnst@cn.fujitsu.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Hannes Reinecke <hare@suse.com>
This commit is contained in:
parent
69b205bb0b
commit
1108b2f8a9
15 changed files with 150 additions and 67 deletions
|
@ -29,7 +29,7 @@
|
|||
#include "hw/scsi/scsi.h"
|
||||
#include "block/scsi.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include "qapi/error.h"
|
||||
#include "mfi.h"
|
||||
|
||||
#define MEGASAS_VERSION_GEN1 "1.70"
|
||||
|
@ -2330,6 +2330,8 @@ static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
|
|||
MegasasBaseClass *b = MEGASAS_DEVICE_GET_CLASS(s);
|
||||
uint8_t *pci_conf;
|
||||
int i, bar_type;
|
||||
Error *err = NULL;
|
||||
int ret;
|
||||
|
||||
pci_conf = dev->config;
|
||||
|
||||
|
@ -2338,6 +2340,24 @@ static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
|
|||
/* Interrupt pin 1 */
|
||||
pci_conf[PCI_INTERRUPT_PIN] = 0x01;
|
||||
|
||||
if (megasas_use_msi(s)) {
|
||||
ret = msi_init(dev, 0x50, 1, true, false, &err);
|
||||
/* Any error other than -ENOTSUP(board's MSI support is broken)
|
||||
* is a programming error */
|
||||
assert(!ret || ret == -ENOTSUP);
|
||||
if (ret && s->msi == ON_OFF_AUTO_ON) {
|
||||
/* Can't satisfy user's explicit msi=on request, fail */
|
||||
error_append_hint(&err, "You have to use msi=auto (default) or "
|
||||
"msi=off with this machine type.\n");
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
} else if (ret) {
|
||||
/* With msi=auto, we fall back to MSI off silently */
|
||||
s->msi = ON_OFF_AUTO_OFF;
|
||||
error_free(err);
|
||||
}
|
||||
}
|
||||
|
||||
memory_region_init_io(&s->mmio_io, OBJECT(s), &megasas_mmio_ops, s,
|
||||
"megasas-mmio", 0x4000);
|
||||
memory_region_init_io(&s->port_io, OBJECT(s), &megasas_port_ops, s,
|
||||
|
@ -2345,10 +2365,6 @@ static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
|
|||
memory_region_init_io(&s->queue_io, OBJECT(s), &megasas_queue_ops, s,
|
||||
"megasas-queue", 0x40000);
|
||||
|
||||
if (megasas_use_msi(s) &&
|
||||
msi_init(dev, 0x50, 1, true, false)) {
|
||||
s->msi = ON_OFF_AUTO_OFF;
|
||||
}
|
||||
if (megasas_use_msix(s) &&
|
||||
msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000,
|
||||
&s->mmio_io, b->mmio_bar, 0x3800, 0x68)) {
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include "hw/scsi/scsi.h"
|
||||
#include "block/scsi.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include "qapi/error.h"
|
||||
#include "mptsas.h"
|
||||
#include "mpi.h"
|
||||
|
||||
|
@ -1273,10 +1273,33 @@ static void mptsas_scsi_init(PCIDevice *dev, Error **errp)
|
|||
{
|
||||
DeviceState *d = DEVICE(dev);
|
||||
MPTSASState *s = MPT_SAS(dev);
|
||||
Error *err = NULL;
|
||||
int ret;
|
||||
|
||||
dev->config[PCI_LATENCY_TIMER] = 0;
|
||||
dev->config[PCI_INTERRUPT_PIN] = 0x01;
|
||||
|
||||
if (s->msi != ON_OFF_AUTO_OFF) {
|
||||
ret = msi_init(dev, 0, 1, true, false, &err);
|
||||
/* Any error other than -ENOTSUP(board's MSI support is broken)
|
||||
* is a programming error */
|
||||
assert(!ret || ret == -ENOTSUP);
|
||||
if (ret && s->msi == ON_OFF_AUTO_ON) {
|
||||
/* Can't satisfy user's explicit msi=on request, fail */
|
||||
error_append_hint(&err, "You have to use msi=auto (default) or "
|
||||
"msi=off with this machine type.\n");
|
||||
error_propagate(errp, err);
|
||||
s->msi_in_use = false;
|
||||
return;
|
||||
} else if (ret) {
|
||||
/* With msi=auto, we fall back to MSI off silently */
|
||||
error_free(err);
|
||||
s->msi_in_use = false;
|
||||
} else {
|
||||
s->msi_in_use = true;
|
||||
}
|
||||
}
|
||||
|
||||
memory_region_init_io(&s->mmio_io, OBJECT(s), &mptsas_mmio_ops, s,
|
||||
"mptsas-mmio", 0x4000);
|
||||
memory_region_init_io(&s->port_io, OBJECT(s), &mptsas_port_ops, s,
|
||||
|
@ -1284,12 +1307,6 @@ static void mptsas_scsi_init(PCIDevice *dev, Error **errp)
|
|||
memory_region_init_io(&s->diag_io, OBJECT(s), &mptsas_diag_ops, s,
|
||||
"mptsas-diag", 0x10000);
|
||||
|
||||
if (s->msi != ON_OFF_AUTO_OFF &&
|
||||
msi_init(dev, 0, 1, true, false) >= 0) {
|
||||
/* TODO check for errors */
|
||||
s->msi_in_use = true;
|
||||
}
|
||||
|
||||
pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->port_io);
|
||||
pci_register_bar(dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY |
|
||||
PCI_BASE_ADDRESS_MEM_TYPE_32, &s->mmio_io);
|
||||
|
|
|
@ -1063,7 +1063,7 @@ pvscsi_init_msi(PVSCSIState *s)
|
|||
PCIDevice *d = PCI_DEVICE(s);
|
||||
|
||||
res = msi_init(d, PVSCSI_MSI_OFFSET(s), PVSCSI_MSIX_NUM_VECTORS,
|
||||
PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK);
|
||||
PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK, NULL);
|
||||
if (res < 0) {
|
||||
trace_pvscsi_init_msi_fail(res);
|
||||
s->msi_used = false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue