diff options
author | Jeenu Viswambharan <jeenu.viswambharan@arm.com> | 2017-09-22 08:32:09 +0100 |
---|---|---|
committer | Jeenu Viswambharan <jeenu.viswambharan@arm.com> | 2017-10-16 16:50:02 +0100 |
commit | c639e8ebeeb152fc32f2feff65c84a37825400b3 (patch) | |
tree | fe704f7f1d4b259c2eec38e1a8970e554fca2b27 /docs/firmware-design.rst | |
parent | 22966106967b01768db5140ce20f62dd7f20358f (diff) |
GIC: Allow specifying interrupt properties
The GIC driver initialization currently allows an array of interrupts to
be configured as secure. Future use cases would require more interrupt
configuration other than just security, such as priority.
This patch introduces a new interrupt property array as part of both
GICv2 and GICv3 driver data. The platform can populate the array with
interrupt numbers and respective properties. The corresponding driver
initialization iterates through the array, and applies interrupt
configuration as required.
This capability, and the current way of supplying array (or arrays, in
case of GICv3) of secure interrupts, are however mutually exclusive.
Henceforth, the platform should supply either:
- A list of interrupts to be mapped as secure (the current way).
Platforms that do this will continue working as they were. With this
patch, this scheme is deprecated.
- A list of interrupt properties (properties include interrupt group).
Individual interrupt properties are specified via. descriptors of
type 'interrupt_prop_desc_t', which can be populated with the macro
INTR_PROP_DESC().
A run time assert checks that the platform doesn't specify both.
Henceforth the old scheme of providing list of secure interrupts is
deprecated. When built with ERROR_DEPRECATED=1, GIC drivers will require
that the interrupt properties are supplied instead of an array of secure
interrupts.
Add a section to firmware design about configuring secure interrupts.
Fixes ARM-software/tf-issues#262
Change-Id: I8eec29e72eb69dbb6bce77879febf32c95376942
Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
Diffstat (limited to 'docs/firmware-design.rst')
-rw-r--r-- | docs/firmware-design.rst | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/docs/firmware-design.rst b/docs/firmware-design.rst index 997d29b8..aeb883ab 100644 --- a/docs/firmware-design.rst +++ b/docs/firmware-design.rst @@ -1161,6 +1161,56 @@ In other words, the reset handler should be able to detect whether an action has already been performed and act as appropriate. Possible courses of actions are, e.g. skip the action the second time, or undo/redo it. +Configuring secure interrupts +----------------------------- + +The GIC driver is responsible for performing initial configuration of secure +interrupts on the platform. To this end, the platform is expected to provide the +GIC driver (either GICv2 or GICv3, as selected by the platform) with the +interrupt configuration during the driver initialisation. + +There are two ways to specify secure interrupt configuration: + +#. Array of secure interrupt properties: In this scheme, in both GICv2 and GICv3 + driver data structures, the ``interrupt_props`` member points to an array of + interrupt properties. Each element of the array specifies the interrupt + number and its configuration, viz. priority, group, configuration. Each + element of the array shall be populated by the macro ``INTR_PROP_DESC()``. + The macro takes the following arguments: + + - 10-bit interrupt number, + + - 8-bit interrupt priority, + + - Interrupt type (one of ``INTR_TYPE_EL3``, ``INTR_TYPE_S_EL1``, + ``INTR_TYPE_NS``), + + - Interrupt configuration (either ``GIC_INTR_CFG_LEVEL`` or + ``GIC_INTR_CFG_EDGE``). + +#. Array of secure interrupts: In this scheme, the GIC driver is provided an + array of secure interrupt numbers. The GIC driver, at the time of + initialisation, iterates through the array and assigns each interrupt + the appropriate group. + + - For the GICv2 driver, in ``gicv2_driver_data`` structure, the + ``g0_interrupt_array`` member of the should point to the array of + interrupts to be assigned to *Group 0*, and the ``g0_interrupt_num`` + member of the should be set to the number of interrupts in the array. + + - For the GICv3 driver, in ``gicv3_driver_data`` structure: + + - The ``g0_interrupt_array`` member of the should point to the array of + interrupts to be assigned to *Group 0*, and the ``g0_interrupt_num`` + member of the should be set to the number of interrupts in the array. + + - The ``g1s_interrupt_array`` member of the should point to the array of + interrupts to be assigned to *Group 1 Secure*, and the + ``g1s_interrupt_num`` member of the should be set to the number of + interrupts in the array. + + **Note that this scheme is deprecated.** + CPU specific operations framework --------------------------------- |