diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2015-03-27 15:15:02 +0100 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2015-03-29 21:25:45 +0200 |
commit | 263fcd312deffb9bf10f007f958dccfa64a807f5 (patch) | |
tree | c424529594bcb4798dc802860e67fbd0f6600d78 /drivers/irqchip/irq-gic-v3-its.c | |
parent | irqchip: gicv3-its: Support safe initialization (diff) | |
download | linux-263fcd312deffb9bf10f007f958dccfa64a807f5.tar.xz linux-263fcd312deffb9bf10f007f958dccfa64a807f5.zip |
irqchip: gicv3-its: Fix encoding of collection's target redistributor
With a monolithic GICv3, redistributors are addressed using a linear
number, while a distributed implementation uses physical addresses.
When encoding a target address into a command, we strip the lower
16 bits, as redistributors are always 64kB aligned. This works
perfectly well with a distributed implementation, but has the
silly effect of always encoding target 0 in the monolithic case
(unless you have more than 64k CPUs, of course).
The obvious fix is to shift the linear target number by 16 when
computing the target address, so that we don't loose any precious
bit.
Reported-by: Andre Przywara <andre.przywara@arm.com>
Tested-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Link: https://lkml.kernel.org/r/1427465705-17126-2-git-send-email-marc.zyngier@arm.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Diffstat (limited to 'drivers/irqchip/irq-gic-v3-its.c')
-rw-r--r-- | drivers/irqchip/irq-gic-v3-its.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 596b0a9eee99..7318dba11957 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -1026,7 +1026,7 @@ static void its_cpu_init_collection(void) * This ITS wants a linear CPU number. */ target = readq_relaxed(gic_data_rdist_rd_base() + GICR_TYPER); - target = GICR_TYPER_CPU_NUMBER(target); + target = GICR_TYPER_CPU_NUMBER(target) << 16; } /* Perform collection mapping */ |