diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2016-10-14 10:13:07 -0400 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2016-10-17 06:59:30 -0400 |
commit | 589ce5f447b8610df0dbd6935b56d5cda17b9cec (patch) | |
tree | 16ccd5619168aa7f2e67139badec48e9e23d5e69 | |
parent | 1001354ca34179f3db924eb66672442a173147dc (diff) |
irqchip/gic-v3-its: Fix 64bit GIC{R,ITS}_TYPER accesses
The GICv3 architecture specification mentions that a 64bit
register can be accessed using two 32bit accesses. What it
doesn't mention is that this is only guaranteed on a system
that implements AArch32, and a pure AArch64 system is allowed
not to support this. This causes issues with the GICR_TYPER
and GITS_TYPER registers, which are both RO 64bit registers.
In order to solve this, this patch switches the TYPER accesses
to the gic_read_typer macro already used in other parts of the
driver. This makes sure that we always use a 64bit access on
64bit systems, and two 32bit accesses on 32bit system.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r-- | drivers/irqchip/irq-gic-v3-its.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 003495d91f9c..c5dee300e8a3 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c | |||
@@ -1023,7 +1023,7 @@ static void its_free_tables(struct its_node *its) | |||
1023 | 1023 | ||
1024 | static int its_alloc_tables(struct its_node *its) | 1024 | static int its_alloc_tables(struct its_node *its) |
1025 | { | 1025 | { |
1026 | u64 typer = readq_relaxed(its->base + GITS_TYPER); | 1026 | u64 typer = gic_read_typer(its->base + GITS_TYPER); |
1027 | u32 ids = GITS_TYPER_DEVBITS(typer); | 1027 | u32 ids = GITS_TYPER_DEVBITS(typer); |
1028 | u64 shr = GITS_BASER_InnerShareable; | 1028 | u64 shr = GITS_BASER_InnerShareable; |
1029 | u64 cache = GITS_BASER_WaWb; | 1029 | u64 cache = GITS_BASER_WaWb; |
@@ -1198,7 +1198,7 @@ static void its_cpu_init_collection(void) | |||
1198 | * We now have to bind each collection to its target | 1198 | * We now have to bind each collection to its target |
1199 | * redistributor. | 1199 | * redistributor. |
1200 | */ | 1200 | */ |
1201 | if (readq_relaxed(its->base + GITS_TYPER) & GITS_TYPER_PTA) { | 1201 | if (gic_read_typer(its->base + GITS_TYPER) & GITS_TYPER_PTA) { |
1202 | /* | 1202 | /* |
1203 | * This ITS wants the physical address of the | 1203 | * This ITS wants the physical address of the |
1204 | * redistributor. | 1204 | * redistributor. |
@@ -1208,7 +1208,7 @@ static void its_cpu_init_collection(void) | |||
1208 | /* | 1208 | /* |
1209 | * This ITS wants a linear CPU number. | 1209 | * This ITS wants a linear CPU number. |
1210 | */ | 1210 | */ |
1211 | target = readq_relaxed(gic_data_rdist_rd_base() + GICR_TYPER); | 1211 | target = gic_read_typer(gic_data_rdist_rd_base() + GICR_TYPER); |
1212 | target = GICR_TYPER_CPU_NUMBER(target) << 16; | 1212 | target = GICR_TYPER_CPU_NUMBER(target) << 16; |
1213 | } | 1213 | } |
1214 | 1214 | ||
@@ -1691,7 +1691,7 @@ static int __init its_probe_one(struct resource *res, | |||
1691 | INIT_LIST_HEAD(&its->its_device_list); | 1691 | INIT_LIST_HEAD(&its->its_device_list); |
1692 | its->base = its_base; | 1692 | its->base = its_base; |
1693 | its->phys_base = res->start; | 1693 | its->phys_base = res->start; |
1694 | its->ite_size = ((readl_relaxed(its_base + GITS_TYPER) >> 4) & 0xf) + 1; | 1694 | its->ite_size = ((gic_read_typer(its_base + GITS_TYPER) >> 4) & 0xf) + 1; |
1695 | its->numa_node = numa_node; | 1695 | its->numa_node = numa_node; |
1696 | 1696 | ||
1697 | its->cmd_base = kzalloc(ITS_CMD_QUEUE_SZ, GFP_KERNEL); | 1697 | its->cmd_base = kzalloc(ITS_CMD_QUEUE_SZ, GFP_KERNEL); |
@@ -1763,7 +1763,7 @@ out_unmap: | |||
1763 | 1763 | ||
1764 | static bool gic_rdists_supports_plpis(void) | 1764 | static bool gic_rdists_supports_plpis(void) |
1765 | { | 1765 | { |
1766 | return !!(readl_relaxed(gic_data_rdist_rd_base() + GICR_TYPER) & GICR_TYPER_PLPIS); | 1766 | return !!(gic_read_typer(gic_data_rdist_rd_base() + GICR_TYPER) & GICR_TYPER_PLPIS); |
1767 | } | 1767 | } |
1768 | 1768 | ||
1769 | int its_cpu_init(void) | 1769 | int its_cpu_init(void) |