pci: Convert shpc_init() to Error

In order to propagate error message better, convert shpc_init() to
Error also convert the pci_bridge_dev_initfn() to realize.

Cc: mst@redhat.com
Cc: marcel@redhat.com
Cc: armbru@redhat.com
Signed-off-by: Mao Zhongyi <maozy.fnst@cn.fujitsu.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Mao Zhongyi 2017-06-27 14:16:53 +08:00 committed by Michael S. Tsirkin
parent f8cd1b0201
commit 344475e77d
5 changed files with 20 additions and 22 deletions

View File

@ -49,7 +49,7 @@ struct PCIBridgeDev {
}; };
typedef struct PCIBridgeDev PCIBridgeDev; typedef struct PCIBridgeDev PCIBridgeDev;
static int pci_bridge_dev_initfn(PCIDevice *dev) static void pci_bridge_dev_realize(PCIDevice *dev, Error **errp)
{ {
PCIBridge *br = PCI_BRIDGE(dev); PCIBridge *br = PCI_BRIDGE(dev);
PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev); PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev);
@ -62,7 +62,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
dev->config[PCI_INTERRUPT_PIN] = 0x1; dev->config[PCI_INTERRUPT_PIN] = 0x1;
memory_region_init(&bridge_dev->bar, OBJECT(dev), "shpc-bar", memory_region_init(&bridge_dev->bar, OBJECT(dev), "shpc-bar",
shpc_bar_size(dev)); shpc_bar_size(dev));
err = shpc_init(dev, &br->sec_bus, &bridge_dev->bar, 0); err = shpc_init(dev, &br->sec_bus, &bridge_dev->bar, 0, errp);
if (err) { if (err) {
goto shpc_error; goto shpc_error;
} }
@ -71,7 +71,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
bridge_dev->msi = ON_OFF_AUTO_OFF; bridge_dev->msi = ON_OFF_AUTO_OFF;
} }
err = slotid_cap_init(dev, 0, bridge_dev->chassis_nr, 0); err = slotid_cap_init(dev, 0, bridge_dev->chassis_nr, 0, errp);
if (err) { if (err) {
goto slotid_error; goto slotid_error;
} }
@ -87,7 +87,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
/* Can't satisfy user's explicit msi=on request, fail */ /* Can't satisfy user's explicit msi=on request, fail */
error_append_hint(&local_err, "You have to use msi=auto (default) " error_append_hint(&local_err, "You have to use msi=auto (default) "
"or msi=off with this machine type.\n"); "or msi=off with this machine type.\n");
error_report_err(local_err); error_propagate(errp, local_err);
goto msi_error; goto msi_error;
} }
assert(!local_err || bridge_dev->msi == ON_OFF_AUTO_AUTO); assert(!local_err || bridge_dev->msi == ON_OFF_AUTO_AUTO);
@ -101,7 +101,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY | pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
PCI_BASE_ADDRESS_MEM_TYPE_64, &bridge_dev->bar); PCI_BASE_ADDRESS_MEM_TYPE_64, &bridge_dev->bar);
} }
return 0; return;
msi_error: msi_error:
slotid_cap_cleanup(dev); slotid_cap_cleanup(dev);
@ -111,8 +111,6 @@ slotid_error:
} }
shpc_error: shpc_error:
pci_bridge_exitfn(dev); pci_bridge_exitfn(dev);
return err;
} }
static void pci_bridge_dev_exitfn(PCIDevice *dev) static void pci_bridge_dev_exitfn(PCIDevice *dev)
@ -216,7 +214,7 @@ static void pci_bridge_dev_class_init(ObjectClass *klass, void *data)
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass); HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
k->init = pci_bridge_dev_initfn; k->realize = pci_bridge_dev_realize;
k->exit = pci_bridge_dev_exitfn; k->exit = pci_bridge_dev_exitfn;
k->config_write = pci_bridge_dev_write_config; k->config_write = pci_bridge_dev_write_config;
k->vendor_id = PCI_VENDOR_ID_REDHAT; k->vendor_id = PCI_VENDOR_ID_REDHAT;

View File

@ -446,16 +446,14 @@ static void shpc_cap_update_dword(PCIDevice *d)
} }
/* Add SHPC capability to the config space for the device. */ /* Add SHPC capability to the config space for the device. */
static int shpc_cap_add_config(PCIDevice *d) static int shpc_cap_add_config(PCIDevice *d, Error **errp)
{ {
uint8_t *config; uint8_t *config;
int config_offset; int config_offset;
Error *local_err = NULL;
config_offset = pci_add_capability(d, PCI_CAP_ID_SHPC, config_offset = pci_add_capability(d, PCI_CAP_ID_SHPC,
0, SHPC_CAP_LENGTH, 0, SHPC_CAP_LENGTH,
&local_err); errp);
if (config_offset < 0) { if (config_offset < 0) {
error_report_err(local_err);
return config_offset; return config_offset;
} }
config = d->config + config_offset; config = d->config + config_offset;
@ -584,13 +582,14 @@ void shpc_device_hot_unplug_request_cb(HotplugHandler *hotplug_dev,
} }
/* Initialize the SHPC structure in bridge's BAR. */ /* Initialize the SHPC structure in bridge's BAR. */
int shpc_init(PCIDevice *d, PCIBus *sec_bus, MemoryRegion *bar, unsigned offset) int shpc_init(PCIDevice *d, PCIBus *sec_bus, MemoryRegion *bar,
unsigned offset, Error **errp)
{ {
int i, ret; int i, ret;
int nslots = SHPC_MAX_SLOTS; /* TODO: qdev property? */ int nslots = SHPC_MAX_SLOTS; /* TODO: qdev property? */
SHPCDevice *shpc = d->shpc = g_malloc0(sizeof(*d->shpc)); SHPCDevice *shpc = d->shpc = g_malloc0(sizeof(*d->shpc));
shpc->sec_bus = sec_bus; shpc->sec_bus = sec_bus;
ret = shpc_cap_add_config(d); ret = shpc_cap_add_config(d, errp);
if (ret) { if (ret) {
g_free(d->shpc); g_free(d->shpc);
return ret; return ret;

View File

@ -9,14 +9,14 @@
int slotid_cap_init(PCIDevice *d, int nslots, int slotid_cap_init(PCIDevice *d, int nslots,
uint8_t chassis, uint8_t chassis,
unsigned offset) unsigned offset,
Error **errp)
{ {
int cap; int cap;
Error *local_err = NULL;
if (!chassis) { if (!chassis) {
error_report("Bridge chassis not specified. Each bridge is required " error_setg(errp, "Bridge chassis not specified. Each bridge is required"
"to be assigned a unique chassis id > 0."); " to be assigned a unique chassis id > 0.");
return -EINVAL; return -EINVAL;
} }
if (nslots < 0 || nslots > (PCI_SID_ESR_NSLOTS >> SLOTID_NSLOTS_SHIFT)) { if (nslots < 0 || nslots > (PCI_SID_ESR_NSLOTS >> SLOTID_NSLOTS_SHIFT)) {
@ -25,9 +25,8 @@ int slotid_cap_init(PCIDevice *d, int nslots,
} }
cap = pci_add_capability(d, PCI_CAP_ID_SLOTID, offset, cap = pci_add_capability(d, PCI_CAP_ID_SLOTID, offset,
SLOTID_CAP_LENGTH, &local_err); SLOTID_CAP_LENGTH, errp);
if (cap < 0) { if (cap < 0) {
error_report_err(local_err);
return cap; return cap;
} }
/* We make each chassis unique, this way each bridge is First in Chassis */ /* We make each chassis unique, this way each bridge is First in Chassis */

View File

@ -38,7 +38,8 @@ struct SHPCDevice {
void shpc_reset(PCIDevice *d); void shpc_reset(PCIDevice *d);
int shpc_bar_size(PCIDevice *dev); int shpc_bar_size(PCIDevice *dev);
int shpc_init(PCIDevice *dev, PCIBus *sec_bus, MemoryRegion *bar, unsigned off); int shpc_init(PCIDevice *dev, PCIBus *sec_bus, MemoryRegion *bar,
unsigned off, Error **errp);
void shpc_cleanup(PCIDevice *dev, MemoryRegion *bar); void shpc_cleanup(PCIDevice *dev, MemoryRegion *bar);
void shpc_free(PCIDevice *dev); void shpc_free(PCIDevice *dev);
void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len); void shpc_cap_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int len);

View File

@ -5,7 +5,8 @@
int slotid_cap_init(PCIDevice *dev, int nslots, int slotid_cap_init(PCIDevice *dev, int nslots,
uint8_t chassis, uint8_t chassis,
unsigned offset); unsigned offset,
Error **errp);
void slotid_cap_cleanup(PCIDevice *dev); void slotid_cap_cleanup(PCIDevice *dev);
#endif #endif