rpi3: Implement simple interrupt routing
authorAntonio Nino Diaz <antonio.ninodiaz@arm.com>
Wed, 11 Jul 2018 20:00:32 +0000 (21:00 +0100)
committerAntonio Nino Diaz <antonio.ninodiaz@arm.com>
Wed, 11 Jul 2018 20:00:32 +0000 (21:00 +0100)
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>
docs/plat/rpi3.rst
plat/rpi3/rpi3_common.c

index c8e2405cc0e242b34b18de326624e8e4fab73fbe..5e535c61dea67bd87d7180c1954d0e11d7d920d3 100644 (file)
@@ -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
index 65f5e7ad00bb09ac357bbbf6cf87e208ed2e62f0..98cf534c73766bb068c07b1800108ce4da1cbdd8 100644 (file)
@@ -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);
 }