Skip to content

Commit

Permalink
ppc/xive: Make XIVE generate the proper interrupt types
Browse files Browse the repository at this point in the history
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>
Message-Id: <20190606174409.12502-1-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
  • Loading branch information
ozbenh authored and dgibson committed Jun 12, 2019
1 parent 8d40926 commit 4aca978
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
22 changes: 19 additions & 3 deletions hw/intc/xive.c
Expand Up @@ -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];
Expand Down Expand Up @@ -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));
}
}

Expand Down Expand Up @@ -556,7 +571,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[POWER9_INPUT_INT];
tctx->hv_output = env->irq_inputs[POWER9_INPUT_HINT];
tctx->os_output = env->irq_inputs[POWER9_INPUT_INT];
break;

default:
Expand Down
3 changes: 2 additions & 1 deletion include/hw/ppc/xive.h
Expand Up @@ -317,7 +317,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];
} XiveTCTX;
Expand Down

0 comments on commit 4aca978

Please sign in to comment.