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 */