spapr_pci: Drop some dead error handling

chassis_from_bus() uses object_property_get_uint() to get property
"chassis_nr" of the bridge device.  Failure would be a programming
error.  Pass &error_abort, and simplify its callers.

Cc: David Gibson <david@gibson.dropbear.id.au>
Cc: qemu-ppc@nongnu.org
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20200505152926.18877-18-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2020-05-05 17:29:25 +02:00
parent b69c3c21a5
commit 7ef1553dac
1 changed files with 18 additions and 68 deletions

View File

@ -1203,46 +1203,36 @@ static SpaprDrc *drc_from_devfn(SpaprPhbState *phb,
drc_id_from_devfn(phb, chassis, devfn)); drc_id_from_devfn(phb, chassis, devfn));
} }
static uint8_t chassis_from_bus(PCIBus *bus, Error **errp) static uint8_t chassis_from_bus(PCIBus *bus)
{ {
if (pci_bus_is_root(bus)) { if (pci_bus_is_root(bus)) {
return 0; return 0;
} else { } else {
PCIDevice *bridge = pci_bridge_get_device(bus); PCIDevice *bridge = pci_bridge_get_device(bus);
return object_property_get_uint(OBJECT(bridge), "chassis_nr", errp); return object_property_get_uint(OBJECT(bridge), "chassis_nr",
&error_abort);
} }
} }
static SpaprDrc *drc_from_dev(SpaprPhbState *phb, PCIDevice *dev) static SpaprDrc *drc_from_dev(SpaprPhbState *phb, PCIDevice *dev)
{ {
Error *local_err = NULL; uint8_t chassis = chassis_from_bus(pci_get_bus(dev));
uint8_t chassis = chassis_from_bus(pci_get_bus(dev), &local_err);
if (local_err) {
error_report_err(local_err);
return NULL;
}
return drc_from_devfn(phb, chassis, dev->devfn); return drc_from_devfn(phb, chassis, dev->devfn);
} }
static void add_drcs(SpaprPhbState *phb, PCIBus *bus, Error **errp) static void add_drcs(SpaprPhbState *phb, PCIBus *bus)
{ {
Object *owner; Object *owner;
int i; int i;
uint8_t chassis; uint8_t chassis;
Error *local_err = NULL;
if (!phb->dr_enabled) { if (!phb->dr_enabled) {
return; return;
} }
chassis = chassis_from_bus(bus, &local_err); chassis = chassis_from_bus(bus);
if (local_err) {
error_propagate(errp, local_err);
return;
}
if (pci_bus_is_root(bus)) { if (pci_bus_is_root(bus)) {
owner = OBJECT(phb); owner = OBJECT(phb);
@ -1256,21 +1246,16 @@ static void add_drcs(SpaprPhbState *phb, PCIBus *bus, Error **errp)
} }
} }
static void remove_drcs(SpaprPhbState *phb, PCIBus *bus, Error **errp) static void remove_drcs(SpaprPhbState *phb, PCIBus *bus)
{ {
int i; int i;
uint8_t chassis; uint8_t chassis;
Error *local_err = NULL;
if (!phb->dr_enabled) { if (!phb->dr_enabled) {
return; return;
} }
chassis = chassis_from_bus(bus, &local_err); chassis = chassis_from_bus(bus);
if (local_err) {
error_propagate(errp, local_err);
return;
}
for (i = PCI_SLOT_MAX * PCI_FUNC_MAX - 1; i >= 0; i--) { for (i = PCI_SLOT_MAX * PCI_FUNC_MAX - 1; i >= 0; i--) {
SpaprDrc *drc = drc_from_devfn(phb, chassis, i); SpaprDrc *drc = drc_from_devfn(phb, chassis, i);
@ -1488,17 +1473,11 @@ int spapr_pci_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
} }
static void spapr_pci_bridge_plug(SpaprPhbState *phb, static void spapr_pci_bridge_plug(SpaprPhbState *phb,
PCIBridge *bridge, PCIBridge *bridge)
Error **errp)
{ {
Error *local_err = NULL;
PCIBus *bus = pci_bridge_get_sec_bus(bridge); PCIBus *bus = pci_bridge_get_sec_bus(bridge);
add_drcs(phb, bus, &local_err); add_drcs(phb, bus);
if (local_err) {
error_propagate(errp, local_err);
return;
}
} }
static void spapr_pci_plug(HotplugHandler *plug_handler, static void spapr_pci_plug(HotplugHandler *plug_handler,
@ -1529,11 +1508,7 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
g_assert(drc); g_assert(drc);
if (pc->is_bridge) { if (pc->is_bridge) {
spapr_pci_bridge_plug(phb, PCI_BRIDGE(plugged_dev), &local_err); spapr_pci_bridge_plug(phb, PCI_BRIDGE(plugged_dev));
if (local_err) {
error_propagate(errp, local_err);
return;
}
} }
/* Following the QEMU convention used for PCIe multifunction /* Following the QEMU convention used for PCIe multifunction
@ -1560,12 +1535,7 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
spapr_drc_reset(drc); spapr_drc_reset(drc);
} else if (PCI_FUNC(pdev->devfn) == 0) { } else if (PCI_FUNC(pdev->devfn) == 0) {
int i; int i;
uint8_t chassis = chassis_from_bus(pci_get_bus(pdev), &local_err); uint8_t chassis = chassis_from_bus(pci_get_bus(pdev));
if (local_err) {
error_propagate(errp, local_err);
return;
}
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
SpaprDrc *func_drc; SpaprDrc *func_drc;
@ -1587,17 +1557,11 @@ out:
} }
static void spapr_pci_bridge_unplug(SpaprPhbState *phb, static void spapr_pci_bridge_unplug(SpaprPhbState *phb,
PCIBridge *bridge, PCIBridge *bridge)
Error **errp)
{ {
Error *local_err = NULL;
PCIBus *bus = pci_bridge_get_sec_bus(bridge); PCIBus *bus = pci_bridge_get_sec_bus(bridge);
remove_drcs(phb, bus, &local_err); remove_drcs(phb, bus);
if (local_err) {
error_propagate(errp, local_err);
return;
}
} }
static void spapr_pci_unplug(HotplugHandler *plug_handler, static void spapr_pci_unplug(HotplugHandler *plug_handler,
@ -1619,11 +1583,7 @@ static void spapr_pci_unplug(HotplugHandler *plug_handler,
pci_device_reset(PCI_DEVICE(plugged_dev)); pci_device_reset(PCI_DEVICE(plugged_dev));
if (pc->is_bridge) { if (pc->is_bridge) {
Error *local_err = NULL; spapr_pci_bridge_unplug(phb, PCI_BRIDGE(plugged_dev));
spapr_pci_bridge_unplug(phb, PCI_BRIDGE(plugged_dev), &local_err);
if (local_err) {
error_propagate(errp, local_err);
}
return; return;
} }
@ -1654,13 +1614,7 @@ static void spapr_pci_unplug_request(HotplugHandler *plug_handler,
SpaprDrcClass *func_drck; SpaprDrcClass *func_drck;
SpaprDREntitySense state; SpaprDREntitySense state;
int i; int i;
Error *local_err = NULL; uint8_t chassis = chassis_from_bus(pci_get_bus(pdev));
uint8_t chassis = chassis_from_bus(pci_get_bus(pdev), &local_err);
if (local_err) {
error_propagate(errp, local_err);
return;
}
if (pc->is_bridge) { if (pc->is_bridge) {
error_setg(errp, "PCI: Hot unplug of PCI bridges not supported"); error_setg(errp, "PCI: Hot unplug of PCI bridges not supported");
@ -1745,7 +1699,7 @@ static void spapr_phb_unrealize(DeviceState *dev)
} }
} }
remove_drcs(sphb, phb->bus, &error_abort); remove_drcs(sphb, phb->bus);
for (i = PCI_NUM_PINS - 1; i >= 0; i--) { for (i = PCI_NUM_PINS - 1; i >= 0; i--) {
if (sphb->lsi_table[i].irq) { if (sphb->lsi_table[i].irq) {
@ -1984,11 +1938,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
} }
/* allocate connectors for child PCI devices */ /* allocate connectors for child PCI devices */
add_drcs(sphb, phb->bus, &local_err); add_drcs(sphb, phb->bus);
if (local_err) {
error_propagate(errp, local_err);
goto unrealize;
}
/* DMA setup */ /* DMA setup */
for (i = 0; i < windows_supported; ++i) { for (i = 0; i < windows_supported; ++i) {