diff options
author | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2018-07-11 21:00:32 +0100 |
---|---|---|
committer | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2018-07-11 21:00:32 +0100 |
commit | d35de55e55667b26e2969df191ae472f20e5ce45 (patch) | |
tree | 626a5ab1faf1cc00ba22e2f78d6d5f2050dd9700 | |
parent | df4c512d470d8bb728343b7edf040ce7c515bd79 (diff) | |
download | platform_external_arm-trusted-firmware-d35de55e55667b26e2969df191ae472f20e5ce45.tar.gz platform_external_arm-trusted-firmware-d35de55e55667b26e2969df191ae472f20e5ce45.tar.bz2 platform_external_arm-trusted-firmware-d35de55e55667b26e2969df191ae472f20e5ce45.zip |
rpi3: Implement simple interrupt routing
Implement minimal interrupt routing functions. All interrupts are
treated as non-secure interrupts to be handled by the non-secure world.
Add note to the documentation about disabling FIQs qhen using OP-TEE
with Linux.
Change-Id: I937096542d973925e43ae946c5d0b306d0d95a94
Tested-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
-rw-r--r-- | docs/plat/rpi3.rst | 6 | ||||
-rw-r--r-- | plat/rpi3/rpi3_common.c | 21 |
2 files changed, 20 insertions, 7 deletions
diff --git a/docs/plat/rpi3.rst b/docs/plat/rpi3.rst index c8e2405cc..5e535c61d 100644 --- a/docs/plat/rpi3.rst +++ b/docs/plat/rpi3.rst @@ -243,6 +243,12 @@ The following build options are supported: BL32_EXTRA1=tee-pager_v2.bin BL32_EXTRA2=tee-pageable_v2.bin`` to put the binaries into the FIP. + Note: If OP-TEE is used it may be needed to add the following options to the + Linux command line so that the USB driver doesn't use FIQs: + ``dwc_otg.fiq_enable=0 dwc_otg.fiq_fsm_enable=0 dwc_otg.nak_holdoff=0``. + This will unfortunately reduce the performance of the USB driver. It is needed + when using Raspbian, for example. + - ``TRUSTED_BOARD_BOOT``: This port supports TBB. Set this option ``TRUSTED_BOARD_BOOT=1`` to enable it. In order to use TBB, you might want to set ``GENERATE_COT=1`` to let the contents of the FIP automatically diff --git a/plat/rpi3/rpi3_common.c b/plat/rpi3/rpi3_common.c index 65f5e7ad0..98cf534c7 100644 --- a/plat/rpi3/rpi3_common.c +++ b/plat/rpi3/rpi3_common.c @@ -5,6 +5,7 @@ */ #include <arch_helpers.h> +#include <assert.h> #include <bl_common.h> #include <console.h> #include <debug.h> @@ -198,15 +199,21 @@ unsigned int plat_get_syscnt_freq2(void) uint32_t plat_ic_get_pending_interrupt_type(void) { + ERROR("rpi3: Interrupt routed to EL3.\n"); return INTR_TYPE_INVAL; } -uint32_t plat_interrupt_type_to_line(uint32_t type, - uint32_t security_state) +uint32_t plat_interrupt_type_to_line(uint32_t type, uint32_t security_state) { - /* It is not expected to receive an interrupt route to EL3. - * Hence panic() to flag error. - */ - ERROR("Interrupt not expected to be routed to EL3"); - panic(); + assert((type == INTR_TYPE_S_EL1) || (type == INTR_TYPE_EL3) || + (type == INTR_TYPE_NS)); + + assert(sec_state_is_valid(security_state)); + + /* Non-secure interrupts are signalled on the IRQ line always. */ + if (type == INTR_TYPE_NS) + return __builtin_ctz(SCR_IRQ_BIT); + + /* Secure interrupts are signalled on the FIQ line always. */ + return __builtin_ctz(SCR_FIQ_BIT); } |