GIC: Add APIs to query interrupt types
authorJeenu Viswambharan <jeenu.viswambharan@arm.com>
Fri, 22 Sep 2017 07:32:09 +0000 (08:32 +0100)
committerJeenu Viswambharan <jeenu.viswambharan@arm.com>
Mon, 16 Oct 2017 15:50:01 +0000 (16:50 +0100)
These APIs allow the GIC implementation to categorize interrupt numbers
into SPIs, PPIs, and SGIs. The default implementations for GICv2 and
GICv3 follows interrupt numbering as specified by the ARM GIC
architecture.

API documentation updated.

Change-Id: Ia6aa379dc955994333232e6138f259535d4fa087
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
docs/platform-interrupt-controller-API.rst
include/drivers/arm/gic_common.h
include/plat/common/platform.h
plat/common/plat_gicv2.c
plat/common/plat_gicv3.c

index 9ef2e3f678041dc6aa5614a3a81e4da8856ab0ea..a94a90c755536e40c73b90e0067e25226b177e3b 100644 (file)
@@ -27,6 +27,45 @@ acknowledged via. ``plat_ic_acknowledge_interrupt``.
 In the case of ARM standard platforms using GIC, the *Running Priority Register*
 is read to determine the priority of the interrupt.
 
+Function: int plat_ic_is_spi(unsigned int id); [optional]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    Argument : unsigned int
+    Return   : int
+
+The API should return whether the interrupt ID (first parameter) is categorized
+as a Shared Peripheral Interrupt. Shared Peripheral Interrupts are typically
+associated to system-wide peripherals, and these interrupts can target any PE in
+the system.
+
+Function: int plat_ic_is_ppi(unsigned int id); [optional]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    Argument : unsigned int
+    Return   : int
+
+The API should return whether the interrupt ID (first parameter) is categorized
+as a Private Peripheral Interrupt. Private Peripheral Interrupts are typically
+associated with peripherals that are private to each PE. Interrupts from private
+peripherals target to that PE only.
+
+Function: int plat_ic_is_sgi(unsigned int id); [optional]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    Argument : unsigned int
+    Return   : int
+
+The API should return whether the interrupt ID (first parameter) is categorized
+as a Software Generated Interrupt. Software Generated Interrupts are raised by
+explicit programming by software, and are typically used in inter-PE
+communication. Secure SGIs are reserved for use by Secure world software.
+
 ----
 
 *Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.*
index b9cae802f23d28af7bbd96eb9d7c5c59ac6ba0f8..f4e2c5266b50a198282f659ce501e927fdf5e913 100644 (file)
@@ -12,6 +12,7 @@
  ******************************************************************************/
 /* Constants to categorise interrupts */
 #define MIN_SGI_ID             0
+#define MIN_SEC_SGI_ID         8
 #define MIN_PPI_ID             16
 #define MIN_SPI_ID             32
 #define MAX_SPI_ID             1019
index 7468352d12d66754ba7c3052bc39cc422e770c7b..f00db0db2389fc4d41be22a8e2108075bc6531fa 100644 (file)
@@ -73,6 +73,9 @@ uint32_t plat_interrupt_type_to_line(uint32_t type,
  * Optional interrupt management functions, depending on chosen EL3 components.
  ******************************************************************************/
 unsigned int plat_ic_get_running_priority(void);
+int plat_ic_is_spi(unsigned int id);
+int plat_ic_is_ppi(unsigned int id);
+int plat_ic_is_sgi(unsigned int id);
 
 /*******************************************************************************
  * Optional common functions (may be overridden)
index 1be693bb3d634472df60b9e857ae0652f7ccbc1c..7d91f792291870dd76705e16ad76077a100fe2d9 100644 (file)
@@ -21,6 +21,9 @@
 #pragma weak plat_interrupt_type_to_line
 
 #pragma weak plat_ic_get_running_priority
+#pragma weak plat_ic_is_spi
+#pragma weak plat_ic_is_ppi
+#pragma weak plat_ic_is_sgi
 
 /*
  * This function returns the highest priority pending interrupt at
@@ -129,3 +132,18 @@ unsigned int plat_ic_get_running_priority(void)
 {
        return gicv2_get_running_priority();
 }
+
+int plat_ic_is_spi(unsigned int id)
+{
+       return (id >= MIN_SPI_ID) && (id <= MAX_SPI_ID);
+}
+
+int plat_ic_is_ppi(unsigned int id)
+{
+       return (id >= MIN_PPI_ID) && (id < MIN_SPI_ID);
+}
+
+int plat_ic_is_sgi(unsigned int id)
+{
+       return (id >= MIN_SGI_ID) && (id < MIN_PPI_ID);
+}
index 02317f1df58ba5c7f7ba31a35ac95b25903b8d57..5a6021c4afdcc40496eaad1a4fde1aea18cdcabd 100644 (file)
@@ -27,6 +27,9 @@
 #pragma weak plat_interrupt_type_to_line
 
 #pragma weak plat_ic_get_running_priority
+#pragma weak plat_ic_is_spi
+#pragma weak plat_ic_is_ppi
+#pragma weak plat_ic_is_sgi
 
 CASSERT((INTR_TYPE_S_EL1 == INTR_GROUP1S) &&
        (INTR_TYPE_NS == INTR_GROUP1NS) &&
@@ -163,6 +166,20 @@ unsigned int plat_ic_get_running_priority(void)
        return gicv3_get_running_priority();
 }
 
+int plat_ic_is_spi(unsigned int id)
+{
+       return (id >= MIN_SPI_ID) && (id <= MAX_SPI_ID);
+}
+
+int plat_ic_is_ppi(unsigned int id)
+{
+       return (id >= MIN_PPI_ID) && (id < MIN_SPI_ID);
+}
+
+int plat_ic_is_sgi(unsigned int id)
+{
+       return (id >= MIN_SGI_ID) && (id < MIN_PPI_ID);
+}
 #endif
 #ifdef IMAGE_BL32