refactor(gic): add a is_feat_gic_supported() standard helper
FEAT_GIC is a CPU feature like any other, add an arch_features.h helper
for it.
Change-Id: I762b6333907f5f3dd3352544c1f2fb211a794b3e
Signed-off-by: Boyan Karatotev <boyan.karatotev@arm.com>
diff --git a/drivers/arm/gic/gic_v2v3_common.c b/drivers/arm/gic/gic_v2v3_common.c
index 00ebcc9..4eafa59 100644
--- a/drivers/arm/gic/gic_v2v3_common.c
+++ b/drivers/arm/gic/gic_v2v3_common.c
@@ -6,6 +6,7 @@
#include <arch.h>
#include <arch_helpers.h>
+#include <arch_features.h>
#include <assert.h>
#include <drivers/arm/gic_v2v3_common.h>
#include <drivers/arm/gic_v3.h>
@@ -187,16 +188,11 @@
priority & GIC_PRI_MASK);
}
-unsigned int is_gicv3_mode(void)
+bool is_gicv3_mode(void)
{
/* Check if GICv3 system register available */
-#ifdef __aarch64__
- if (!(read_id_aa64pfr0_el1() & (ID_AA64PFR0_GIC_MASK << ID_AA64PFR0_GIC_SHIFT)))
+ if (!is_feat_gic_supported())
return 0;
-#else
- if (!(read_id_pfr1() & (ID_PFR1_GIC_MASK << ID_PFR1_GIC_SHIFT)))
- return 0;
-#endif
/* Check whether the system register interface is enabled */
return !!is_sre_enabled();
diff --git a/drivers/arm/gic/gic_v3.c b/drivers/arm/gic/gic_v3.c
index 7b2d8d8..8bbea48 100644
--- a/drivers/arm/gic/gic_v3.c
+++ b/drivers/arm/gic/gic_v3.c
@@ -5,6 +5,7 @@
*/
#include <arch.h>
+#include <arch_features.h>
#include <arch_helpers.h>
#include <assert.h>
#include <debug.h>
@@ -477,12 +478,8 @@
assert(gicd_base_addr);
/* Check for system register support */
-#ifdef __aarch64__
- assert(read_id_aa64pfr0_el1() &
- (ID_AA64PFR0_GIC_MASK << ID_AA64PFR0_GIC_SHIFT));
-#else
- assert(read_id_pfr1() & (ID_PFR1_GIC_MASK << ID_PFR1_GIC_SHIFT));
-#endif
+
+ assert(is_feat_gic_supported());
/* Assert that system register access is enabled */
assert(is_sre_enabled());
diff --git a/include/drivers/arm/gic_v2v3_common.h b/include/drivers/arm/gic_v2v3_common.h
index 673ee08..7bcae6a 100644
--- a/include/drivers/arm/gic_v2v3_common.h
+++ b/include/drivers/arm/gic_v2v3_common.h
@@ -7,6 +7,8 @@
#ifndef __GIC_COMMON_H__
#define __GIC_COMMON_H__
+#include <stdbool.h>
+
/***************************************************************************
* Defines and prototypes common to GIC v2 and v3 drivers.
**************************************************************************/
@@ -49,7 +51,7 @@
#include <mmio.h>
/* Helper to detect the GIC mode (GICv2 or GICv3) configured in the system */
-unsigned int is_gicv3_mode(void);
+bool is_gicv3_mode(void);
/*******************************************************************************
* Private GIC Distributor function prototypes for use by GIC drivers
diff --git a/include/lib/aarch32/arch.h b/include/lib/aarch32/arch.h
index cfbce56..255a9eb 100644
--- a/include/lib/aarch32/arch.h
+++ b/include/lib/aarch32/arch.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2023, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2025, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -142,7 +142,7 @@
#define ID_PFR1_GENTIMER_SHIFT U(16)
#define ID_PFR1_GENTIMER_MASK U(0xf)
#define ID_PFR1_GIC_SHIFT U(28)
-#define ID_PFR1_GIC_MASK U(0xf)
+#define ID_PFR1_GIC_WIDTH U(4)
/* SCTLR definitions */
#define SCTLR_RES1_DEF ((U(1) << 23) | (U(1) << 22) | (U(1) << 4) | \
diff --git a/include/lib/aarch32/arch_features.h b/include/lib/aarch32/arch_features.h
index 999f7ec..44a6845 100644
--- a/include/lib/aarch32/arch_features.h
+++ b/include/lib/aarch32/arch_features.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019-2024, Arm Limited. All rights reserved.
+ * Copyright (c) 2019-2025, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -66,4 +66,9 @@
ID_PFR0_AMU_MASK;
}
+static inline bool is_feat_gic_supported(void)
+{
+ return EXTRACT(ID_PFR1_GIC, read_id_pfr1()) >= 1;
+}
+
#endif /* ARCH_FEATURES_H */
diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h
index 94837ea..e0e1a9d 100644
--- a/include/lib/aarch64/arch.h
+++ b/include/lib/aarch64/arch.h
@@ -180,7 +180,6 @@
#define ID_AA64PFR0_ADVSIMD_MASK U(0xf)
#define ID_AA64PFR0_GIC_SHIFT U(24)
#define ID_AA64PFR0_GIC_WIDTH U(4)
-#define ID_AA64PFR0_GIC_MASK ULL(0xf)
#define ID_AA64PFR0_GIC_NOT_SUPPORTED ULL(0x0)
#define ID_AA64PFR0_GICV3_GICV4_SUPPORTED ULL(0x1)
#define ID_AA64PFR0_GICV4_1_SUPPORTED ULL(0x2)
diff --git a/include/lib/aarch64/arch_features.h b/include/lib/aarch64/arch_features.h
index cb3936c..dfc9850 100644
--- a/include/lib/aarch64/arch_features.h
+++ b/include/lib/aarch64/arch_features.h
@@ -595,4 +595,10 @@
return EXTRACT(ID_AA64MMFR3_EL1_MEC, read_id_aa64mmfr3_el1())
== ID_AA64MMFR3_EL1_MEC_SUPPORTED;
}
+
+static inline bool is_feat_gic_supported(void)
+{
+ return EXTRACT(ID_AA64PFR0_GIC, read_id_aa64pfr0_el1())
+ >= ID_AA64PFR0_GICV3_GICV4_SUPPORTED;
+}
#endif /* ARCH_FEATURES_H */