From 1fde611fd22f02f6f17afd52539f5e23f0afffd8 Mon Sep 17 00:00:00 2001 From: David Wang Date: Wed, 3 May 2017 14:26:34 +0800 Subject: [PATCH] [Fix]The other bits in GICD_CTLR should not be touched The `gic_init` function enables secure and non-secure group1 interrupts in GICD_CTLR register. But the other bits should not be modified to avoid `UNPREDICTABLE` behaviours as per ARM GICv3 specification. Signed-off-by: David Wang Reviewed-by: Jens Wiklander --- core/drivers/gic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/drivers/gic.c b/core/drivers/gic.c index a202eabc03d..cc2655dde5f 100644 --- a/core/drivers/gic.c +++ b/core/drivers/gic.c @@ -219,8 +219,8 @@ void gic_init(struct gic_data *gd, vaddr_t gicc_base __maybe_unused, write32(GICC_CTLR_ENABLEGRP0 | GICC_CTLR_ENABLEGRP1 | GICC_CTLR_FIQEN, gd->gicc_base + GICC_CTLR); #endif - write32(GICD_CTLR_ENABLEGRP0 | GICD_CTLR_ENABLEGRP1, - gd->gicd_base + GICD_CTLR); + write32(read32(gd->gicd_base + GICD_CTLR) | GICD_CTLR_ENABLEGRP0 | + GICD_CTLR_ENABLEGRP1, gd->gicd_base + GICD_CTLR); } void gic_init_base_addr(struct gic_data *gd, vaddr_t gicc_base __maybe_unused,