Home | History | Annotate | Download | only in docs
      1 Platform Interrupt Controller API documentation
      2 ===============================================
      3 
      4 .. section-numbering::
      5     :suffix: .
      6 
      7 .. contents::
      8 
      9 This document lists the optional platform interrupt controller API that
     10 abstracts the runtime configuration and control of interrupt controller from the
     11 generic code. The mandatory APIs are described in the `porting guide`__.
     12 
     13 .. __: porting-guide.rst#interrupt-management-framework-in-bl31
     14 
     15 Function: unsigned int plat_ic_get_running_priority(void); [optional]
     16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     17 
     18 ::
     19 
     20     Argument : void
     21     Return   : unsigned int
     22 
     23 This API should return the priority of the interrupt the PE is currently
     24 servicing. This must be be called only after an interrupt has already been
     25 acknowledged via. ``plat_ic_acknowledge_interrupt``.
     26 
     27 In the case of ARM standard platforms using GIC, the *Running Priority Register*
     28 is read to determine the priority of the interrupt.
     29 
     30 Function: int plat_ic_is_spi(unsigned int id); [optional]
     31 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     32 
     33 ::
     34 
     35     Argument : unsigned int
     36     Return   : int
     37 
     38 The API should return whether the interrupt ID (first parameter) is categorized
     39 as a Shared Peripheral Interrupt. Shared Peripheral Interrupts are typically
     40 associated to system-wide peripherals, and these interrupts can target any PE in
     41 the system.
     42 
     43 Function: int plat_ic_is_ppi(unsigned int id); [optional]
     44 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     45 
     46 ::
     47 
     48     Argument : unsigned int
     49     Return   : int
     50 
     51 The API should return whether the interrupt ID (first parameter) is categorized
     52 as a Private Peripheral Interrupt. Private Peripheral Interrupts are typically
     53 associated with peripherals that are private to each PE. Interrupts from private
     54 peripherals target to that PE only.
     55 
     56 Function: int plat_ic_is_sgi(unsigned int id); [optional]
     57 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     58 
     59 ::
     60 
     61     Argument : unsigned int
     62     Return   : int
     63 
     64 The API should return whether the interrupt ID (first parameter) is categorized
     65 as a Software Generated Interrupt. Software Generated Interrupts are raised by
     66 explicit programming by software, and are typically used in inter-PE
     67 communication. Secure SGIs are reserved for use by Secure world software.
     68 
     69 Function: unsigned int plat_ic_get_interrupt_active(unsigned int id); [optional]
     70 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     71 
     72 ::
     73 
     74     Argument : unsigned int
     75     Return   : int
     76 
     77 This API should return the *active* status of the interrupt ID specified by the
     78 first parameter, ``id``.
     79 
     80 In case of ARM standard platforms using GIC, the implementation of the API reads
     81 the GIC *Set Active Register* to read and return the active status of the
     82 interrupt.
     83 
     84 Function: void plat_ic_enable_interrupt(unsigned int id); [optional]
     85 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     86 
     87 ::
     88 
     89     Argument : unsigned int
     90     Return   : void
     91 
     92 This API should enable the interrupt ID specified by the first parameter,
     93 ``id``. PEs in the system are expected to receive only enabled interrupts.
     94 
     95 In case of ARM standard platforms using GIC, the implementation of the API
     96 inserts barrier to make memory updates visible before enabling interrupt, and
     97 then writes to GIC *Set Enable Register* to enable the interrupt.
     98 
     99 Function: void plat_ic_disable_interrupt(unsigned int id); [optional]
    100 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    101 
    102 ::
    103 
    104     Argument : unsigned int
    105     Return   : void
    106 
    107 This API should disable the interrupt ID specified by the first parameter,
    108 ``id``. PEs in the system are not expected to receive disabled interrupts.
    109 
    110 In case of ARM standard platforms using GIC, the implementation of the API
    111 writes to GIC *Clear Enable Register* to disable the interrupt, and inserts
    112 barrier to make memory updates visible afterwards.
    113 
    114 Function: void plat_ic_set_interrupt_priority(unsigned int id, unsigned int priority); [optional]
    115 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    116 
    117 ::
    118 
    119     Argument : unsigned int
    120     Argument : unsigned int
    121     Return   : void
    122 
    123 This API should set the priority of the interrupt specified by first parameter
    124 ``id`` to the value set by the second parameter ``priority``.
    125 
    126 In case of ARM standard platforms using GIC, the implementation of the API
    127 writes to GIC *Priority Register* set interrupt priority.
    128 
    129 Function: int plat_ic_has_interrupt_type(unsigned int type); [optional]
    130 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    131 
    132 ::
    133 
    134     Argument : unsigned int
    135     Return   : int
    136 
    137 This API should return whether the platform supports a given interrupt type. The
    138 parameter ``type`` shall be one of ``INTR_TYPE_EL3``, ``INTR_TYPE_S_EL1``, or
    139 ``INTR_TYPE_NS``.
    140 
    141 In case of ARM standard platforms using GICv3, the implementation of the API
    142 returns ``1`` for all interrupt types.
    143 
    144 In case of ARM standard platforms using GICv2, the API always return ``1`` for
    145 ``INTR_TYPE_NS``. Return value for other types depends on the value of build
    146 option ``GICV2_G0_FOR_EL3``:
    147 
    148 - For interrupt type ``INTR_TYPE_EL3``:
    149 
    150   - When ``GICV2_G0_FOR_EL3`` is ``0``, it returns ``0``, indicating no support
    151     for EL3 interrupts.
    152 
    153   - When ``GICV2_G0_FOR_EL3`` is ``1``, it returns ``1``, indicating support for
    154     EL3 interrupts.
    155 
    156 - For interrupt type ``INTR_TYPE_S_EL1``:
    157 
    158   - When ``GICV2_G0_FOR_EL3`` is ``0``, it returns ``1``, indicating support for
    159     Secure EL1 interrupts.
    160 
    161   - When ``GICV2_G0_FOR_EL3`` is ``1``, it returns ``0``, indicating no support
    162     for Secure EL1 interrupts.
    163 
    164 Function: void plat_ic_set_interrupt_type(unsigned int id, unsigned int type); [optional]
    165 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    166 
    167 ::
    168 
    169     Argument : unsigned int
    170     Argument : unsigned int
    171     Return   : void
    172 
    173 This API should set the interrupt specified by first parameter ``id`` to the
    174 type specified by second parameter ``type``. The ``type`` parameter can be
    175 one of:
    176 
    177 - ``INTR_TYPE_NS``: interrupt is meant to be consumed by the Non-secure world.
    178 
    179 - ``INTR_TYPE_S_EL1``: interrupt is meant to be consumed by Secure EL1.
    180 
    181 - ``INTR_TYPE_EL3``: interrupt is meant to be consumed by EL3.
    182 
    183 In case of ARM standard platforms using GIC, the implementation of the API
    184 writes to the GIC *Group Register* and *Group Modifier Register* (only GICv3) to
    185 assign the interrupt to the right group.
    186 
    187 For GICv3:
    188 
    189 - ``INTR_TYPE_NS`` maps to Group 1 interrupt.
    190 
    191 - ``INTR_TYPE_S_EL1`` maps to Secure Group 1 interrupt.
    192 
    193 - ``INTR_TYPE_EL3`` maps to Secure Group 0 interrupt.
    194 
    195 For GICv2:
    196 
    197 - ``INTR_TYPE_NS`` maps to Group 1 interrupt.
    198 
    199 - When the build option ``GICV2_G0_FOR_EL3`` is set to ``0`` (the default),
    200   ``INTR_TYPE_S_EL1`` maps to Group 0. Otherwise, ``INTR_TYPE_EL3`` maps to
    201   Group 0 interrupt.
    202 
    203 Function: void plat_ic_raise_el3_sgi(int sgi_num, u_register_t target); [optional]
    204 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    205 
    206 ::
    207 
    208     Argument : int
    209     Argument : u_register_t
    210     Return   : void
    211 
    212 This API should raise an EL3 SGI. The first parameter, ``sgi_num``, specifies
    213 the ID of the SGI. The second parameter, ``target``, must be the MPIDR of the
    214 target PE.
    215 
    216 In case of ARM standard platforms using GIC, the implementation of the API
    217 inserts barrier to make memory updates visible before raising SGI, then writes
    218 to appropriate *SGI Register* in order to raise the EL3 SGI.
    219 
    220 Function: void plat_ic_set_spi_routing(unsigned int id, unsigned int routing_mode, u_register_t mpidr); [optional]
    221 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    222 
    223 ::
    224 
    225     Argument : unsigned int
    226     Argument : unsigned int
    227     Argument : u_register_t
    228     Return   : void
    229 
    230 This API should set the routing mode of Share Peripheral Interrupt (SPI)
    231 specified by first parameter ``id`` to that specified by the second parameter
    232 ``routing_mode``.
    233 
    234 The ``routing_mode`` parameter can be one of:
    235 
    236 - ``INTR_ROUTING_MODE_ANY`` means the interrupt can be routed to any PE in the
    237   system. The ``mpidr`` parameter is ignored in this case.
    238 
    239 - ``INTR_ROUTING_MODE_PE`` means the interrupt is routed to the PE whose MPIDR
    240   value is specified by the parameter ``mpidr``.
    241 
    242 In case of ARM standard platforms using GIC, the implementation of the API
    243 writes to the GIC *Target Register* (GICv2) or *Route Register* (GICv3) to set
    244 the routing.
    245 
    246 Function: void plat_ic_set_interrupt_pending(unsigned int id); [optional]
    247 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    248 
    249 ::
    250 
    251     Argument : unsigned int
    252     Return   : void
    253 
    254 This API should set the interrupt specified by first parameter ``id`` to
    255 *Pending*.
    256 
    257 In case of ARM standard platforms using GIC, the implementation of the API
    258 inserts barrier to make memory updates visible before setting interrupt pending,
    259 and writes to the GIC *Set Pending Register* to set the interrupt pending
    260 status.
    261 
    262 Function: void plat_ic_clear_interrupt_pending(unsigned int id); [optional]
    263 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    264 
    265 ::
    266 
    267     Argument : unsigned int
    268     Return   : void
    269 
    270 This API should clear the *Pending* status of the interrupt specified by first
    271 parameter ``id``.
    272 
    273 In case of ARM standard platforms using GIC, the implementation of the API
    274 writes to the GIC *Clear Pending Register* to clear the interrupt pending
    275 status, and inserts barrier to make memory updates visible afterwards.
    276 
    277 Function: unsigned int plat_ic_set_priority_mask(unsigned int id); [optional]
    278 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    279 
    280 ::
    281 
    282     Argument : unsigned int
    283     Return   : int
    284 
    285 This API should set the priority mask (first parameter) in the interrupt
    286 controller such that only interrupts of higher priority than the supplied one
    287 may be signalled to the PE. The API should return the current priority value
    288 that it's overwriting.
    289 
    290 In case of ARM standard platforms using GIC, the implementation of the API
    291 inserts to order memory updates before updating mask, then writes to the GIC
    292 *Priority Mask Register*, and make sure memory updates are visible before
    293 potential trigger due to mask update.
    294 
    295 ----
    296 
    297 *Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.*
    298