Re: [Qemu-devel] [PATCH v4 9/9] ppc/xics: move set_nr_{irqs, servers} to xics.c
On Mon, Sep 19, 2016 at 11:59:37AM +0530, Nikunj A Dadhania wrote: > Get this duplicate code in the base implementation. > > Signed-off-by: Nikunj A Dadhania > --- > hw/intc/xics.c| 74 > --- > hw/intc/xics_kvm.c| 34 +++ > hw/intc/xics_native.c | 51 +-- > hw/intc/xics_spapr.c | 49 +- > include/hw/ppc/xics.h | 19 ++--- > 5 files changed, 126 insertions(+), 101 deletions(-) > > diff --git a/hw/intc/xics.c b/hw/intc/xics.c > index 4ac2d00..9fbf962 100644 > --- a/hw/intc/xics.c > +++ b/hw/intc/xics.c > @@ -54,8 +54,9 @@ int xics_get_cpu_index_by_dt_id(int cpu_dt_id) > void xics_cpu_destroy(XICSState *xics, PowerPCCPU *cpu) > { > CPUState *cs = CPU(cpu); > -ICPState *ss = &xics->ss[cs->cpu_index]; > +ICPState *ss; > > +ss = xics->ss + sizeof(ICPState) * cs->cpu_index; > assert(cs->cpu_index < xics->nr_servers); > assert(cs == ss->cs); > > @@ -67,9 +68,10 @@ void xics_cpu_setup(XICSState *xics, PowerPCCPU *cpu) > { > CPUState *cs = CPU(cpu); > CPUPPCState *env = &cpu->env; > -ICPState *ss = &xics->ss[cs->cpu_index]; > +ICPState *ss; > XICSStateClass *info = XICS_COMMON_GET_CLASS(xics); > > +ss = xics->ss + sizeof(ICPState) * cs->cpu_index; > assert(cs->cpu_index < xics->nr_servers); > > ss->cs = cs; > @@ -101,10 +103,12 @@ static void xics_common_reset(DeviceState *d) > { > XICSState *xics = XICS_COMMON(d); > ICSState *ics; > +ICPState *ss; > int i; > > for (i = 0; i < xics->nr_servers; i++) { > -device_reset(DEVICE(&xics->ss[i])); > +ss = xics->ss + sizeof(ICPState) * i; > +device_reset(DEVICE(ss)); > } > > QLIST_FOREACH(ics, &xics->ics, list) { > @@ -193,6 +197,7 @@ static void xics_common_initfn(Object *obj) > XICSState *xics = XICS_COMMON(obj); > > QLIST_INIT(&xics->ics); > +xics->ss_class = object_class_by_name(TYPE_ICP); > object_property_add(obj, "nr_irqs", "int", > xics_prop_get_nr_irqs, xics_prop_set_nr_irqs, > NULL, NULL, NULL); > @@ -201,7 +206,15 @@ static void xics_common_initfn(Object *obj) > NULL, NULL, NULL); > > /* For exclusive use of monitor command */ > -g_xics = XICS_COMMON(obj); > +g_xics = xics; Looks like this change should be folded into the patch introducing g_xics. > +} > + > +static void xics_common_realize(DeviceState *dev, Error **errp) > +{ > +XICSState *xics = XICS_COMMON(dev); > +XICSStateClass *xsc = XICS_COMMON_GET_CLASS(xics); > + > +xsc->realize(dev, errp); > } > > static void xics_common_class_init(ObjectClass *oc, void *data) > @@ -209,6 +222,7 @@ static void xics_common_class_init(ObjectClass *oc, void > *data) > DeviceClass *dc = DEVICE_CLASS(oc); > > dc->reset = xics_common_reset; > +dc->realize = xics_common_realize; > } > > static const TypeInfo xics_common_info = { > @@ -277,7 +291,7 @@ static void icp_check_ipi(ICPState *ss) > > static void icp_resend(XICSState *xics, int server) > { > -ICPState *ss = xics->ss + server; > +ICPState *ss = xics->ss + server * sizeof(ICPState); > ICSState *ics; > > if (ss->mfrr < CPPR(ss)) { > @@ -290,7 +304,7 @@ static void icp_resend(XICSState *xics, int server) > > void icp_set_cppr(XICSState *xics, int server, uint8_t cppr) > { > -ICPState *ss = xics->ss + server; > +ICPState *ss = xics->ss + server * sizeof(ICPState); > uint8_t old_cppr; > uint32_t old_xisr; > > @@ -317,7 +331,7 @@ void icp_set_cppr(XICSState *xics, int server, uint8_t > cppr) > > void icp_set_mfrr(XICSState *xics, int server, uint8_t mfrr) > { > -ICPState *ss = xics->ss + server; > +ICPState *ss = xics->ss + server * sizeof(ICPState); > > ss->mfrr = mfrr; > if (mfrr < CPPR(ss)) { > @@ -349,7 +363,7 @@ uint32_t icp_ipoll(ICPState *ss, uint32_t *mfrr) > > void icp_eoi(XICSState *xics, int server, uint32_t xirr) > { > -ICPState *ss = xics->ss + server; > +ICPState *ss = xics->ss + server * sizeof(ICPState); > ICSState *ics; > uint32_t irq; > > @@ -370,7 +384,7 @@ void icp_eoi(XICSState *xics, int server, uint32_t xirr) > static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority) > { > XICSState *xics = ics->xics; > -ICPState *ss = xics->ss + server; > +ICPState *ss = xics->ss + server * sizeof(ICPState); > > trace_xics_icp_irq(server, nr, priority); > > @@ -488,6 +502,14 @@ static const TypeInfo icp_info = { > .class_size = sizeof(ICPStateClass), > }; > > +static const TypeInfo icp_native_info = { > +.name = TYPE_NATIVE_ICP, > +.parent = TYPE_ICP, > +.instance_size = sizeof(ICPNative), > +.class_init = icp_class_init, > +.class_size = sizeof(ICPStateClass), > +}; >
[Qemu-devel] [PATCH v4 9/9] ppc/xics: move set_nr_{irqs, servers} to xics.c
Get this duplicate code in the base implementation. Signed-off-by: Nikunj A Dadhania --- hw/intc/xics.c| 74 --- hw/intc/xics_kvm.c| 34 +++ hw/intc/xics_native.c | 51 +-- hw/intc/xics_spapr.c | 49 +- include/hw/ppc/xics.h | 19 ++--- 5 files changed, 126 insertions(+), 101 deletions(-) diff --git a/hw/intc/xics.c b/hw/intc/xics.c index 4ac2d00..9fbf962 100644 --- a/hw/intc/xics.c +++ b/hw/intc/xics.c @@ -54,8 +54,9 @@ int xics_get_cpu_index_by_dt_id(int cpu_dt_id) void xics_cpu_destroy(XICSState *xics, PowerPCCPU *cpu) { CPUState *cs = CPU(cpu); -ICPState *ss = &xics->ss[cs->cpu_index]; +ICPState *ss; +ss = xics->ss + sizeof(ICPState) * cs->cpu_index; assert(cs->cpu_index < xics->nr_servers); assert(cs == ss->cs); @@ -67,9 +68,10 @@ void xics_cpu_setup(XICSState *xics, PowerPCCPU *cpu) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; -ICPState *ss = &xics->ss[cs->cpu_index]; +ICPState *ss; XICSStateClass *info = XICS_COMMON_GET_CLASS(xics); +ss = xics->ss + sizeof(ICPState) * cs->cpu_index; assert(cs->cpu_index < xics->nr_servers); ss->cs = cs; @@ -101,10 +103,12 @@ static void xics_common_reset(DeviceState *d) { XICSState *xics = XICS_COMMON(d); ICSState *ics; +ICPState *ss; int i; for (i = 0; i < xics->nr_servers; i++) { -device_reset(DEVICE(&xics->ss[i])); +ss = xics->ss + sizeof(ICPState) * i; +device_reset(DEVICE(ss)); } QLIST_FOREACH(ics, &xics->ics, list) { @@ -193,6 +197,7 @@ static void xics_common_initfn(Object *obj) XICSState *xics = XICS_COMMON(obj); QLIST_INIT(&xics->ics); +xics->ss_class = object_class_by_name(TYPE_ICP); object_property_add(obj, "nr_irqs", "int", xics_prop_get_nr_irqs, xics_prop_set_nr_irqs, NULL, NULL, NULL); @@ -201,7 +206,15 @@ static void xics_common_initfn(Object *obj) NULL, NULL, NULL); /* For exclusive use of monitor command */ -g_xics = XICS_COMMON(obj); +g_xics = xics; +} + +static void xics_common_realize(DeviceState *dev, Error **errp) +{ +XICSState *xics = XICS_COMMON(dev); +XICSStateClass *xsc = XICS_COMMON_GET_CLASS(xics); + +xsc->realize(dev, errp); } static void xics_common_class_init(ObjectClass *oc, void *data) @@ -209,6 +222,7 @@ static void xics_common_class_init(ObjectClass *oc, void *data) DeviceClass *dc = DEVICE_CLASS(oc); dc->reset = xics_common_reset; +dc->realize = xics_common_realize; } static const TypeInfo xics_common_info = { @@ -277,7 +291,7 @@ static void icp_check_ipi(ICPState *ss) static void icp_resend(XICSState *xics, int server) { -ICPState *ss = xics->ss + server; +ICPState *ss = xics->ss + server * sizeof(ICPState); ICSState *ics; if (ss->mfrr < CPPR(ss)) { @@ -290,7 +304,7 @@ static void icp_resend(XICSState *xics, int server) void icp_set_cppr(XICSState *xics, int server, uint8_t cppr) { -ICPState *ss = xics->ss + server; +ICPState *ss = xics->ss + server * sizeof(ICPState); uint8_t old_cppr; uint32_t old_xisr; @@ -317,7 +331,7 @@ void icp_set_cppr(XICSState *xics, int server, uint8_t cppr) void icp_set_mfrr(XICSState *xics, int server, uint8_t mfrr) { -ICPState *ss = xics->ss + server; +ICPState *ss = xics->ss + server * sizeof(ICPState); ss->mfrr = mfrr; if (mfrr < CPPR(ss)) { @@ -349,7 +363,7 @@ uint32_t icp_ipoll(ICPState *ss, uint32_t *mfrr) void icp_eoi(XICSState *xics, int server, uint32_t xirr) { -ICPState *ss = xics->ss + server; +ICPState *ss = xics->ss + server * sizeof(ICPState); ICSState *ics; uint32_t irq; @@ -370,7 +384,7 @@ void icp_eoi(XICSState *xics, int server, uint32_t xirr) static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority) { XICSState *xics = ics->xics; -ICPState *ss = xics->ss + server; +ICPState *ss = xics->ss + server * sizeof(ICPState); trace_xics_icp_irq(server, nr, priority); @@ -488,6 +502,14 @@ static const TypeInfo icp_info = { .class_size = sizeof(ICPStateClass), }; +static const TypeInfo icp_native_info = { +.name = TYPE_NATIVE_ICP, +.parent = TYPE_ICP, +.instance_size = sizeof(ICPNative), +.class_init = icp_class_init, +.class_size = sizeof(ICPStateClass), +}; + /* * ICS: Source layer */ @@ -689,7 +711,7 @@ void xics_hmp_info_pic(Monitor *mon, const QDict *qdict) uint32_t i; for (i = 0; i < g_xics->nr_servers; i++) { -ICPState *icp = &g_xics->ss[i]; +ICPState *icp = g_xics->ss + i * sizeof(ICPState); if (!icp->output) { continue; @@ -829,12 +851,44 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi) lsi ? XICS_FLAG