[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 06/33] xics: Create sPAPR specific ICS subtype
From: |
Greg Kurz |
Subject: |
Re: [PATCH v2 06/33] xics: Create sPAPR specific ICS subtype |
Date: |
Fri, 27 Sep 2019 09:22:40 +0200 |
On Fri, 27 Sep 2019 15:50:01 +1000
David Gibson <address@hidden> wrote:
> We create a subtype of TYPE_ICS specifically for sPAPR. For now all this
> does is move the setup of the PAPR specific hcalls and RTAS calls to
> the realize() function for this, rather than requiring the PAPR code to
> explicitly call xics_spapr_init(). In future it will have some more
> function.
>
> Signed-off-by: David Gibson <address@hidden>
> Reviewed-by: Cédric Le Goater <address@hidden>
> ---
Reviewed-by: Greg Kurz <address@hidden>
> hw/intc/xics_spapr.c | 34 +++++++++++++++++++++++++++++++++-
> hw/ppc/spapr_irq.c | 6 ++----
> include/hw/ppc/xics_spapr.h | 4 +++-
> 3 files changed, 38 insertions(+), 6 deletions(-)
>
> diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c
> index 3e9444813a..e6dd004587 100644
> --- a/hw/intc/xics_spapr.c
> +++ b/hw/intc/xics_spapr.c
> @@ -283,8 +283,18 @@ static void rtas_int_on(PowerPCCPU *cpu,
> SpaprMachineState *spapr,
> rtas_st(rets, 0, RTAS_OUT_SUCCESS);
> }
>
> -void xics_spapr_init(SpaprMachineState *spapr)
> +static void ics_spapr_realize(DeviceState *dev, Error **errp)
> {
> + ICSState *ics = ICS_SPAPR(dev);
> + ICSStateClass *icsc = ICS_GET_CLASS(ics);
> + Error *local_err = NULL;
> +
> + icsc->parent_realize(dev, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +
> spapr_rtas_register(RTAS_IBM_SET_XIVE, "ibm,set-xive", rtas_set_xive);
> spapr_rtas_register(RTAS_IBM_GET_XIVE, "ibm,get-xive", rtas_get_xive);
> spapr_rtas_register(RTAS_IBM_INT_OFF, "ibm,int-off", rtas_int_off);
> @@ -319,3 +329,25 @@ void spapr_dt_xics(SpaprMachineState *spapr, uint32_t
> nr_servers, void *fdt,
> _FDT(fdt_setprop_cell(fdt, node, "linux,phandle", phandle));
> _FDT(fdt_setprop_cell(fdt, node, "phandle", phandle));
> }
> +
> +static void ics_spapr_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + ICSStateClass *isc = ICS_CLASS(klass);
> +
> + device_class_set_parent_realize(dc, ics_spapr_realize,
> + &isc->parent_realize);
> +}
> +
> +static const TypeInfo ics_spapr_info = {
> + .name = TYPE_ICS_SPAPR,
> + .parent = TYPE_ICS,
> + .class_init = ics_spapr_class_init,
> +};
> +
> +static void xics_spapr_register_types(void)
> +{
> + type_register_static(&ics_spapr_info);
> +}
> +
> +type_init(xics_spapr_register_types)
> diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
> index 6c45d2a3c0..8c26fa2d1e 100644
> --- a/hw/ppc/spapr_irq.c
> +++ b/hw/ppc/spapr_irq.c
> @@ -98,7 +98,7 @@ static void spapr_irq_init_xics(SpaprMachineState *spapr,
> int nr_irqs,
> Object *obj;
> Error *local_err = NULL;
>
> - obj = object_new(TYPE_ICS);
> + obj = object_new(TYPE_ICS_SPAPR);
> object_property_add_child(OBJECT(spapr), "ics", obj, &error_abort);
> object_property_add_const_link(obj, ICS_PROP_XICS, OBJECT(spapr),
> &error_fatal);
> @@ -109,9 +109,7 @@ static void spapr_irq_init_xics(SpaprMachineState *spapr,
> int nr_irqs,
> return;
> }
>
> - spapr->ics = ICS(obj);
> -
> - xics_spapr_init(spapr);
> + spapr->ics = ICS_SPAPR(obj);
> }
>
> static int spapr_irq_claim_xics(SpaprMachineState *spapr, int irq, bool lsi,
> diff --git a/include/hw/ppc/xics_spapr.h b/include/hw/ppc/xics_spapr.h
> index 5dabc9a138..691a6d00f7 100644
> --- a/include/hw/ppc/xics_spapr.h
> +++ b/include/hw/ppc/xics_spapr.h
> @@ -31,11 +31,13 @@
>
> #define XICS_NODENAME "interrupt-controller"
>
> +#define TYPE_ICS_SPAPR "ics-spapr"
> +#define ICS_SPAPR(obj) OBJECT_CHECK(ICSState, (obj), TYPE_ICS_SPAPR)
> +
> void spapr_dt_xics(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt,
> uint32_t phandle);
> int xics_kvm_connect(SpaprMachineState *spapr, Error **errp);
> void xics_kvm_disconnect(SpaprMachineState *spapr, Error **errp);
> bool xics_kvm_has_broken_disconnect(SpaprMachineState *spapr);
> -void xics_spapr_init(SpaprMachineState *spapr);
>
> #endif /* XICS_SPAPR_H */
- [PATCH v2 00/33] spapr: IRQ subsystem cleanup, David Gibson, 2019/09/27
- [PATCH v2 01/33] xics: Minor fixes for XICSFabric interface, David Gibson, 2019/09/27
- [PATCH v2 02/33] xics: Eliminate 'reject', 'resend' and 'eoi' class hooks, David Gibson, 2019/09/27
- [PATCH v2 03/33] xics: Rename misleading ics_simple_*() functions, David Gibson, 2019/09/27
- [PATCH v2 05/33] xics: Merge TYPE_ICS_BASE and TYPE_ICS_SIMPLE classes, David Gibson, 2019/09/27
- [PATCH v2 07/33] spapr: Fold spapr_phb_lsi_qirq() into its single caller, David Gibson, 2019/09/27
- [PATCH v2 06/33] xics: Create sPAPR specific ICS subtype, David Gibson, 2019/09/27
- Re: [PATCH v2 06/33] xics: Create sPAPR specific ICS subtype,
Greg Kurz <=
- [PATCH v2 10/33] spapr: Eliminate nr_irqs parameter to SpaprIrq::init, David Gibson, 2019/09/27
- [PATCH v2 18/33] spapr: Use less cryptic representation of which irq backends are supported, David Gibson, 2019/09/27
- [PATCH v2 14/33] spapr: Remove unhelpful tracepoints from spapr_irq_free_xics(), David Gibson, 2019/09/27
- [PATCH v2 17/33] xive: Improve irq claim/free path, David Gibson, 2019/09/27
- [PATCH v2 04/33] xics: Eliminate reset hook, David Gibson, 2019/09/27
- [PATCH v2 21/33] spapr, xics, xive: Move cpu_intc_create from SpaprIrq to SpaprInterruptController, David Gibson, 2019/09/27