fix(interrupts): check support for ESPI before testing it

It is possible for extended range interrupts to be enabled by software
but the underlying hardware (GIC) may not support it. In such,
scenarios check if the support exists before exercising the
ESPI functionality.

Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
Change-Id: Ibdf18be8403539c0ae9204309adc8a81dd0382d3
diff --git a/include/drivers/arm/arm_gic.h b/include/drivers/arm/arm_gic.h
index 0f27dc1..528ec6e 100644
--- a/include/drivers/arm/arm_gic.h
+++ b/include/drivers/arm/arm_gic.h
@@ -7,6 +7,7 @@
 #ifndef __ARM_GIC_H__
 #define __ARM_GIC_H__
 
+#include <stdbool.h>
 #include <stdint.h>
 
 /***************************************************************************
@@ -150,4 +151,9 @@
  *****************************************************************************/
 void arm_gic_restore_context_global(void);
 
+/******************************************************************************
+ * Check if extended SPI range is implemented by GIC.
+ *****************************************************************************/
+bool arm_gic_is_espi_supported(void);
+
 #endif /* __ARM_GIC_H__ */
diff --git a/include/drivers/arm/gic_v3.h b/include/drivers/arm/gic_v3.h
index e164103..2f4b52d 100644
--- a/include/drivers/arm/gic_v3.h
+++ b/include/drivers/arm/gic_v3.h
@@ -34,6 +34,13 @@
 #define IROUTER_IRM_SHIFT	31
 #define IROUTER_IRM_MASK	0x1
 
+/* GICD_TYPER shifts and masks */
+#define	TYPER_ESPI		U(1 << 8)
+#define	TYPER_DVIS		U(1 << 18)
+#define	TYPER_ESPI_RANGE_MASK	U(0x1f)
+#define	TYPER_ESPI_RANGE_SHIFT	U(27)
+#define	TYPER_ESPI_RANGE	U(TYPER_ESPI_MASK << TYPER_ESPI_SHIFT)
+
 /*******************************************************************************
  * GICv3 Re-distributor interface registers & constants
  ******************************************************************************/
@@ -229,6 +236,10 @@
  */
 void gicv3_enable_cpuif(void);
 
+/*
+ * Return the value of GICD_TYPER.
+ */
+unsigned int gicv3_get_gicd_typer(void);
 
 #endif /*__ASSEMBLY__*/
 #endif /* __GIC_V3_H__ */