Message ID | 20190128094625.4428-19-clg@kaod.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ppc: support for the baremetal XIVE interrupt controller (POWER9) | expand |
On Mon, Jan 28, 2019 at 10:46:24AM +0100, Cédric Le Goater wrote: > From: Benjamin Herrenschmidt <benh@kernel.crashing.org> > > It should be generic Hypervisor Virtualization interrupts for HV > directed rings and traditional External Interrupts for the OS directed > ring. > > Don't generate anything for the user ring as it isn't actually > supported. > > Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > --- > include/hw/ppc/xive.h | 3 ++- > hw/intc/xive.c | 22 +++++++++++++++++++--- > 2 files changed, 21 insertions(+), 4 deletions(-) > > diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h > index 2bad8526221b..82e9aef677c5 100644 > --- a/include/hw/ppc/xive.h > +++ b/include/hw/ppc/xive.h > @@ -316,7 +316,8 @@ typedef struct XiveTCTX { > DeviceState parent_obj; > > CPUState *cs; > - qemu_irq output; > + qemu_irq hv_output; > + qemu_irq os_output; > > uint8_t regs[XIVE_TM_RING_COUNT * XIVE_TM_RING_SIZE]; > uint32_t hw_cam; > diff --git a/hw/intc/xive.c b/hw/intc/xive.c > index 119bb02d345d..14b854181ab7 100644 > --- a/hw/intc/xive.c > +++ b/hw/intc/xive.c > @@ -61,13 +61,28 @@ static uint8_t exception_mask(uint8_t ring) > } > } > > +static qemu_irq xive_tctx_output(XiveTCTX *tctx, uint8_t ring) > +{ > + switch (ring) { > + case TM_QW0_USER: > + return 0; /* Not supported */ > + case TM_QW1_OS: > + return tctx->os_output; > + case TM_QW2_HV_POOL: > + case TM_QW3_HV_PHYS: > + return tctx->hv_output; > + default: > + return 0; > + } > +} > + > static uint64_t xive_tctx_accept(XiveTCTX *tctx, uint8_t ring) > { > uint8_t *regs = &tctx->regs[ring]; > uint8_t nsr = regs[TM_NSR]; > uint8_t mask = exception_mask(ring); > > - qemu_irq_lower(tctx->output); > + qemu_irq_lower(xive_tctx_output(tctx, ring)); > > if (regs[TM_NSR] & mask) { > uint8_t cppr = regs[TM_PIPR]; > @@ -100,7 +115,7 @@ static void xive_tctx_notify(XiveTCTX *tctx, uint8_t ring) > default: > g_assert_not_reached(); > } > - qemu_irq_raise(tctx->output); > + qemu_irq_raise(xive_tctx_output(tctx, ring)); > } > } > > @@ -554,7 +569,8 @@ static void xive_tctx_realize(DeviceState *dev, Error **errp) > env = &cpu->env; > switch (PPC_INPUT(env)) { > case PPC_FLAGS_INPUT_POWER9: > - tctx->output = env->irq_inputs[POWER7_INPUT_INT]; > + tctx->hv_output = env->irq_inputs[POWER9_INPUT_HINT]; > + tctx->os_output = env->irq_inputs[POWER9_INPUT_INT]; > break; > > default:
diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h index 2bad8526221b..82e9aef677c5 100644 --- a/include/hw/ppc/xive.h +++ b/include/hw/ppc/xive.h @@ -316,7 +316,8 @@ typedef struct XiveTCTX { DeviceState parent_obj; CPUState *cs; - qemu_irq output; + qemu_irq hv_output; + qemu_irq os_output; uint8_t regs[XIVE_TM_RING_COUNT * XIVE_TM_RING_SIZE]; uint32_t hw_cam; diff --git a/hw/intc/xive.c b/hw/intc/xive.c index 119bb02d345d..14b854181ab7 100644 --- a/hw/intc/xive.c +++ b/hw/intc/xive.c @@ -61,13 +61,28 @@ static uint8_t exception_mask(uint8_t ring) } } +static qemu_irq xive_tctx_output(XiveTCTX *tctx, uint8_t ring) +{ + switch (ring) { + case TM_QW0_USER: + return 0; /* Not supported */ + case TM_QW1_OS: + return tctx->os_output; + case TM_QW2_HV_POOL: + case TM_QW3_HV_PHYS: + return tctx->hv_output; + default: + return 0; + } +} + static uint64_t xive_tctx_accept(XiveTCTX *tctx, uint8_t ring) { uint8_t *regs = &tctx->regs[ring]; uint8_t nsr = regs[TM_NSR]; uint8_t mask = exception_mask(ring); - qemu_irq_lower(tctx->output); + qemu_irq_lower(xive_tctx_output(tctx, ring)); if (regs[TM_NSR] & mask) { uint8_t cppr = regs[TM_PIPR]; @@ -100,7 +115,7 @@ static void xive_tctx_notify(XiveTCTX *tctx, uint8_t ring) default: g_assert_not_reached(); } - qemu_irq_raise(tctx->output); + qemu_irq_raise(xive_tctx_output(tctx, ring)); } } @@ -554,7 +569,8 @@ static void xive_tctx_realize(DeviceState *dev, Error **errp) env = &cpu->env; switch (PPC_INPUT(env)) { case PPC_FLAGS_INPUT_POWER9: - tctx->output = env->irq_inputs[POWER7_INPUT_INT]; + tctx->hv_output = env->irq_inputs[POWER9_INPUT_HINT]; + tctx->os_output = env->irq_inputs[POWER9_INPUT_INT]; break; default: