Message ID | 155059670389.1466090.10015601248906623076.stgit@bahia.lab.toulouse-stg.fr.ibm.com |
---|---|
State | New |
Headers | show |
Series | spapr: Add support for PHB hotplug | expand |
On Tue, Feb 19, 2019 at 06:18:23PM +0100, Greg Kurz wrote: > From: Michael Roth <mdroth@linux.vnet.ibm.com> > > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> > Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > Signed-off-by: Greg Kurz <groug@kaod.org> Applied, thanks. > --- > hw/ppc/spapr.c | 13 +++++++++++++ > hw/ppc/spapr_drc.c | 17 +++++++++++++++++ > include/hw/ppc/spapr.h | 1 + > include/hw/ppc/spapr_drc.h | 8 ++++++++ > 4 files changed, 39 insertions(+) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 9364d07364ac..96bea7580a3f 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -2875,6 +2875,19 @@ static void spapr_machine_init(MachineState *machine) > /* We always have at least the nvram device on VIO */ > spapr_create_nvram(spapr); > > + /* > + * 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 (smc->dr_phb_enabled) { > + for (i = 0; i < SPAPR_MAX_PHBS; i++) { > + spapr_dr_connector_new(OBJECT(machine), TYPE_SPAPR_DRC_PHB, i); > + } > + } > + > /* Set up PCI */ > spapr_pci_rtas_init(); > > diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c > index 87ca7d973564..fd6380adb367 100644 > --- a/hw/ppc/spapr_drc.c > +++ b/hw/ppc/spapr_drc.c > @@ -696,6 +696,15 @@ static void spapr_drc_lmb_class_init(ObjectClass *k, void *data) > drck->dt_populate = spapr_lmb_dt_populate; > } > > +static void spapr_drc_phb_class_init(ObjectClass *k, void *data) > +{ > + sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k); > + > + drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PHB; > + drck->typename = "PHB"; > + drck->drc_name_prefix = "PHB "; > +} > + > static const TypeInfo spapr_dr_connector_info = { > .name = TYPE_SPAPR_DR_CONNECTOR, > .parent = TYPE_DEVICE, > @@ -739,6 +748,13 @@ static const TypeInfo spapr_drc_lmb_info = { > .class_init = spapr_drc_lmb_class_init, > }; > > +static const TypeInfo spapr_drc_phb_info = { > + .name = TYPE_SPAPR_DRC_PHB, > + .parent = TYPE_SPAPR_DRC_LOGICAL, > + .instance_size = sizeof(sPAPRDRConnector), > + .class_init = spapr_drc_phb_class_init, > +}; > + > /* helper functions for external users */ > > sPAPRDRConnector *spapr_drc_by_index(uint32_t index) > @@ -1207,6 +1223,7 @@ static void spapr_drc_register_types(void) > type_register_static(&spapr_drc_cpu_info); > type_register_static(&spapr_drc_pci_info); > type_register_static(&spapr_drc_lmb_info); > + type_register_static(&spapr_drc_phb_info); > > spapr_rtas_register(RTAS_SET_INDICATOR, "set-indicator", > rtas_set_indicator); > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index 5e3c76072505..b173fd714904 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -104,6 +104,7 @@ struct sPAPRMachineClass { > > /*< public >*/ > bool dr_lmb_enabled; /* enable dynamic-reconfig/hotplug of LMBs */ > + bool dr_phb_enabled; /* enable dynamic-reconfig/hotplug of PHBs */ > bool update_dt_enabled; /* enable KVMPPC_H_UPDATE_DT */ > bool use_ohci_by_default; /* use USB-OHCI instead of XHCI */ > bool pre_2_10_has_unused_icps; > diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h > index f32758ec8487..46b0f6216d83 100644 > --- a/include/hw/ppc/spapr_drc.h > +++ b/include/hw/ppc/spapr_drc.h > @@ -71,6 +71,14 @@ > #define SPAPR_DRC_LMB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ > TYPE_SPAPR_DRC_LMB) > > +#define TYPE_SPAPR_DRC_PHB "spapr-drc-phb" > +#define SPAPR_DRC_PHB_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PHB) > +#define SPAPR_DRC_PHB_CLASS(klass) \ > + OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_PHB) > +#define SPAPR_DRC_PHB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ > + TYPE_SPAPR_DRC_PHB) > + > /* > * Various hotplug types managed by sPAPRDRConnector > * >
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 9364d07364ac..96bea7580a3f 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2875,6 +2875,19 @@ static void spapr_machine_init(MachineState *machine) /* We always have at least the nvram device on VIO */ spapr_create_nvram(spapr); + /* + * 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 (smc->dr_phb_enabled) { + for (i = 0; i < SPAPR_MAX_PHBS; i++) { + spapr_dr_connector_new(OBJECT(machine), TYPE_SPAPR_DRC_PHB, i); + } + } + /* Set up PCI */ spapr_pci_rtas_init(); diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 87ca7d973564..fd6380adb367 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -696,6 +696,15 @@ static void spapr_drc_lmb_class_init(ObjectClass *k, void *data) drck->dt_populate = spapr_lmb_dt_populate; } +static void spapr_drc_phb_class_init(ObjectClass *k, void *data) +{ + sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k); + + drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PHB; + drck->typename = "PHB"; + drck->drc_name_prefix = "PHB "; +} + static const TypeInfo spapr_dr_connector_info = { .name = TYPE_SPAPR_DR_CONNECTOR, .parent = TYPE_DEVICE, @@ -739,6 +748,13 @@ static const TypeInfo spapr_drc_lmb_info = { .class_init = spapr_drc_lmb_class_init, }; +static const TypeInfo spapr_drc_phb_info = { + .name = TYPE_SPAPR_DRC_PHB, + .parent = TYPE_SPAPR_DRC_LOGICAL, + .instance_size = sizeof(sPAPRDRConnector), + .class_init = spapr_drc_phb_class_init, +}; + /* helper functions for external users */ sPAPRDRConnector *spapr_drc_by_index(uint32_t index) @@ -1207,6 +1223,7 @@ static void spapr_drc_register_types(void) type_register_static(&spapr_drc_cpu_info); type_register_static(&spapr_drc_pci_info); type_register_static(&spapr_drc_lmb_info); + type_register_static(&spapr_drc_phb_info); spapr_rtas_register(RTAS_SET_INDICATOR, "set-indicator", rtas_set_indicator); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 5e3c76072505..b173fd714904 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -104,6 +104,7 @@ struct sPAPRMachineClass { /*< public >*/ bool dr_lmb_enabled; /* enable dynamic-reconfig/hotplug of LMBs */ + bool dr_phb_enabled; /* enable dynamic-reconfig/hotplug of PHBs */ bool update_dt_enabled; /* enable KVMPPC_H_UPDATE_DT */ bool use_ohci_by_default; /* use USB-OHCI instead of XHCI */ bool pre_2_10_has_unused_icps; diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index f32758ec8487..46b0f6216d83 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -71,6 +71,14 @@ #define SPAPR_DRC_LMB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ TYPE_SPAPR_DRC_LMB) +#define TYPE_SPAPR_DRC_PHB "spapr-drc-phb" +#define SPAPR_DRC_PHB_GET_CLASS(obj) \ + OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PHB) +#define SPAPR_DRC_PHB_CLASS(klass) \ + OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_PHB) +#define SPAPR_DRC_PHB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ + TYPE_SPAPR_DRC_PHB) + /* * Various hotplug types managed by sPAPRDRConnector *