summaryrefslogtreecommitdiff
path: root/drivers/arm/gic
diff options
context:
space:
mode:
authorAlexei Fedorov <Alexei.Fedorov@arm.com>2020-04-06 19:00:35 +0100
committerAlexei Fedorov <Alexei.Fedorov@arm.com>2020-04-07 11:17:58 +0100
commit5875f2665d7efd7fe3e71e53a7c83dafc9717315 (patch)
tree3627e2538bedf776fef045e3342a9194d48735c1 /drivers/arm/gic
parent8f3ad7661400c1cf23276f8ffff905102c54329a (diff)
downloadarm-trusted-firmware-5875f2665d7efd7fe3e71e53a7c83dafc9717315.tar.gz
TF-A: Add GICv4 extension for GIC driver
This patch adds support for GICv4 extension. New `GIC_ENABLE_V4_EXTN` option passed to gicv3.mk makefile was added, and enables GICv4 related changes when set to 1. This option defaults to 0. Change-Id: I30ebe1b7a98d3a54863900f37eda4589c707a288 Signed-off-by: Alexei Fedorov <Alexei.Fedorov@arm.com>
Diffstat (limited to 'drivers/arm/gic')
-rw-r--r--drivers/arm/gic/v3/gicv3.mk5
-rw-r--r--drivers/arm/gic/v3/gicv3_main.c19
2 files changed, 18 insertions, 6 deletions
diff --git a/drivers/arm/gic/v3/gicv3.mk b/drivers/arm/gic/v3/gicv3.mk
index 73339d991..0f401035d 100644
--- a/drivers/arm/gic/v3/gicv3.mk
+++ b/drivers/arm/gic/v3/gicv3.mk
@@ -8,6 +8,7 @@
GICV3_IMPL ?= GIC500
GICV3_IMPL_GIC600_MULTICHIP ?= 0
GICV3_OVERRIDE_DISTIF_PWR_OPS ?= 0
+GIC_ENABLE_V4_EXTN ?= 0
GIC_EXT_INTID ?= 0
GICV3_SOURCES += drivers/arm/gic/v3/gicv3_main.c \
@@ -33,6 +34,10 @@ else
$(error "Incorrect GICV3_IMPL value ${GICV3_IMPL}")
endif
+# Set GICv4 extension
+$(eval $(call assert_boolean,GIC_ENABLE_V4_EXTN))
+$(eval $(call add_define,GIC_ENABLE_V4_EXTN))
+
# Set support for extended PPI and SPI range
$(eval $(call assert_boolean,GIC_EXT_INTID))
$(eval $(call add_define,GIC_EXT_INTID))
diff --git a/drivers/arm/gic/v3/gicv3_main.c b/drivers/arm/gic/v3/gicv3_main.c
index aefaa3595..8c27efdae 100644
--- a/drivers/arm/gic/v3/gicv3_main.c
+++ b/drivers/arm/gic/v3/gicv3_main.c
@@ -116,12 +116,20 @@ void __init gicv3_driver_init(const gicv3_driver_data_t *plat_driver_data)
(ID_AA64PFR0_GIC_MASK << ID_AA64PFR0_GIC_SHIFT)) != 0U);
#endif /* !__aarch64__ */
- /* The GIC version should be 3 */
gic_version = gicd_read_pidr2(plat_driver_data->gicd_base);
gic_version >>= PIDR2_ARCH_REV_SHIFT;
gic_version &= PIDR2_ARCH_REV_MASK;
- assert(gic_version == ARCH_REV_GICV3);
+ /* Check GIC version */
+#if GIC_ENABLE_V4_EXTN
+ assert(gic_version == ARCH_REV_GICV4);
+
+ /* GICv4 supports Direct Virtual LPI injection */
+ assert((gicd_read_typer(plat_driver_data->gicd_base)
+ & TYPER_DVIS) != 0);
+#else
+ assert(gic_version == ARCH_REV_GICV3);
+#endif
/*
* Find out whether the GIC supports the GICv2 compatibility mode.
* The ARE_S bit resets to 0 if supported
@@ -165,10 +173,9 @@ void __init gicv3_driver_init(const gicv3_driver_data_t *plat_driver_data)
flush_dcache_range((uintptr_t)gicv3_driver_data,
sizeof(*gicv3_driver_data));
#endif
-
- INFO("GICv3 with%s legacy support detected."
- " ARM GICv3 driver initialized in EL3\n",
- (gicv2_compat == 0U) ? "" : "out");
+ INFO("GICv%u with%s legacy support detected.\n", gic_version,
+ (gicv2_compat == 0U) ? "" : "out");
+ INFO("ARM GICv%u driver initialized in EL3\n", gic_version);
}
/*******************************************************************************