Since we route hotplugged PHBs to their DR connector using their PHB.index value, we align the number of DR connectors with the maximum index value: SPAPR_PCI_MAX_INDEX.
Signed-off-by: Michael Roth <mdr...@linux.vnet.ibm.com> --- hw/ppc/spapr.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index c8ad5b0..c539932 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -90,6 +90,9 @@ #define HTAB_SIZE(spapr) (1ULL << ((spapr)->htab_shift)) +/* maximum number of hotpluggable PHBs */ +#define SPAPR_DRC_MAX_PHB (SPAPR_PCI_MAX_INDEX + 1) + typedef struct sPAPRMachineClass sPAPRMachineClass; typedef struct sPAPRMachineState sPAPRMachineState; @@ -1387,6 +1390,16 @@ static SaveVMHandlers savevm_htab_handlers = { .load_state = htab_load, }; +static void spapr_drc_reset(void *opaque) +{ + sPAPRDRConnector *drc = opaque; + DeviceState *d = DEVICE(drc); + + if (d) { + device_reset(d); + } +} + /* pSeries LPAR / sPAPR hardware init */ static void ppc_spapr_init(MachineState *machine) { @@ -1561,6 +1574,21 @@ static void ppc_spapr_init(MachineState *machine) spapr->dr_phb_enabled = smc->dr_phb_enabled; + /* Setup hotplug / dynamic-reconfiguration connectors. top-level + * connectors (described in root DT node's "ibm,drc-types" property) + * are pre-initialized here. additional child connectors (such as + * connectors for a PHBs PCI slots) are added as needed during their + * parent's realization. + */ + if (spapr->dr_phb_enabled) { + for (i = 0; i < SPAPR_DRC_MAX_PHB; i++) { + sPAPRDRConnector *drc = + spapr_dr_connector_new(OBJECT(machine), + SPAPR_DR_CONNECTOR_TYPE_PHB, i); + qemu_register_reset(spapr_drc_reset, drc); + } + } + /* Set up PCI */ spapr_pci_rtas_init(); -- 1.9.1