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:
parent
f8cd1b0201
commit
344475e77d
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user