Skip to content

Commit

Permalink
xive: Fix mangling of interrupt server# in opal_get/set_xive()
Browse files Browse the repository at this point in the history
The OPAL API uses mangled server numbers with the link in the
bottom 2 bits like a real XICS does, we need to account for it.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
  • Loading branch information
ozbenh authored and stewartsmith committed Nov 15, 2016
1 parent faaf3f8 commit b1d434d
Showing 1 changed file with 5 additions and 7 deletions.
12 changes: 5 additions & 7 deletions hw/xive.c
Expand Up @@ -1477,7 +1477,7 @@ static int64_t xive_source_get_xive(struct irq_source *is __unused,
uint32_t target_id;

if (xive_get_eq_info(isn, &target_id, prio)) {
*server = target_id;
*server = target_id << 2;
return OPAL_SUCCESS;
} else
return OPAL_PARAMETER;
Expand All @@ -1490,6 +1490,9 @@ static int64_t xive_source_set_xive(struct irq_source *is, uint32_t isn,
uint32_t idx = isn - s->esb_base;
void *mmio_base;

/* Unmangle server */
server >>= 2;

/* Let XIVE configure the EQ */
if (!xive_set_eq_info(isn, server, prio))
return OPAL_PARAMETER;
Expand Down Expand Up @@ -1704,15 +1707,10 @@ struct xive_cpu_state {
static void xive_ipi_init(struct xive *x, struct cpu_thread *cpu)
{
struct xive_cpu_state *xs = cpu->xstate;
uint32_t idx = GIRQ_TO_IDX(xs->ipi_irq);
uint8_t *mm = x->esb_mmio + idx * 0x20000;

assert(xs);

xive_source_set_xive(&x->ipis.is, xs->ipi_irq, cpu->pir, 0x7);

/* Clear P and Q */
in_8(mm + 0x10c00);
xive_source_set_xive(&x->ipis.is, xs->ipi_irq, cpu->pir << 2, 0x7);
}

static void xive_ipi_eoi(struct xive *x, uint32_t idx)
Expand Down

0 comments on commit b1d434d

Please sign in to comment.