mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: gic-v3: Preserve ARE_NS when disabling the distributor
gicv3_dist_init() disables the distributor before reprogramming the
global interrupt state. It used to do this by writing 0 to GICD_CTLR.
On a system where firmware has already enabled Non-secure affinity
routing, a zero write clears the Non-secure view's GICD_CTLR.ARE_NS bit.
Arm IHI 0069H.b, section 2.3.3 ("Changing affinity routing enables"),
states that changing GICD_CTLR.ARE_NS from 1 to 0 is UNPREDICTABLE. The
GICD_CTLR register description in section 12.9.4 carries the same rule
for the ARE_NS field.
Preserve ARE_NS while clearing the group enable bits. If firmware left
ARE_NS clear, the value written is still 0, preserving the existing
initialization flow.
Fixes: bc183a0235 ("xen/arm: Add support for GIC v3")
Signed-off-by: Mykola Kvach <mykola_kvach@epam.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
Reviewed-by: Luca Fancellu <luca.fancellu@arm.com>
Release-Acked-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
(cherry picked from commit e63ba93511)
This commit is contained in:
1 parent
08156620f1
commit
20c5792dc9
1 file changed
+7
-2
@@ -749,12 +749,17 @@ static void __init gicv3_dist_espi_init_aff(uint64_t affinity) { }
|
||||
static void __init gicv3_dist_init(void)
|
||||
{
|
||||
uint32_t type;
|
||||
uint32_t ctlr;
|
||||
uint64_t affinity;
|
||||
unsigned int nr_lines;
|
||||
int i;
|
||||
|
||||
/* Disable the distributor */
|
||||
writel_relaxed(0, GICD + GICD_CTLR);
|
||||
/*
|
||||
* Disable the distributor without clearing ARE_NS. The GIC architecture
|
||||
* makes changing ARE_NS from 1 to 0 UNPREDICTABLE.
|
||||
*/
|
||||
ctlr = readl_relaxed(GICD + GICD_CTLR);
|
||||
writel_relaxed(ctlr & GICD_CTLR_ARE_NS, GICD + GICD_CTLR);
|
||||
|
||||
type = readl_relaxed(GICD + GICD_TYPER);
|
||||
nr_lines = 32 * ((type & GICD_TYPE_LINES) + 1);
|
||||
|
||||