mirror of https://github.com/xemu-project/xemu.git
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:
parent
b69c3c21a5
commit
7ef1553dac
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue