[rtems commit] bsp/qoriq: Virtual interrupt controller support

Sebastian Huber sebh at rtems.org
Tue Sep 12 08:02:47 UTC 2017


Module:    rtems
Branch:    master
Commit:    df62e51974e2f6919315baa859f39d1d8c3ae7f3
Changeset: http://git.rtems.org/rtems/commit/?id=df62e51974e2f6919315baa859f39d1d8c3ae7f3

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Sep  8 10:11:20 2017 +0200

bsp/qoriq: Virtual interrupt controller support

Update #3085.

---

 c/src/lib/libbsp/powerpc/qoriq/irq/irq.c | 86 ++++++++++++++++++++++++++++++--
 1 file changed, 81 insertions(+), 5 deletions(-)

diff --git a/c/src/lib/libbsp/powerpc/qoriq/irq/irq.c b/c/src/lib/libbsp/powerpc/qoriq/irq/irq.c
index c63ffee..ee9ad1b 100644
--- a/c/src/lib/libbsp/powerpc/qoriq/irq/irq.c
+++ b/c/src/lib/libbsp/powerpc/qoriq/irq/irq.c
@@ -7,7 +7,7 @@
  */
 
 /*
- * Copyright (c) 2010-2015 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2010, 2017 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -26,6 +26,8 @@
 
 #include <libcpu/powerpc-utility.h>
 
+#include <asm/epapr_hcalls.h>
+
 #include <bsp.h>
 #include <bsp/irq.h>
 #include <bsp/irq-generic.h>
@@ -33,6 +35,82 @@
 #include <bsp/utility.h>
 #include <bsp/qoriq.h>
 
+RTEMS_INTERRUPT_LOCK_DEFINE(static, lock, "QorIQ IRQ")
+
+#define SPURIOUS 0xffff
+
+#ifdef QORIQ_IS_HYPERVISOR_GUEST
+
+void bsp_interrupt_set_affinity(
+	rtems_vector_number vector,
+	const Processor_mask *affinity
+)
+{
+	uint32_t config;
+	unsigned int priority;
+	uint32_t destination;
+	uint32_t new_destination;
+	rtems_interrupt_lock_context lock_context;
+
+	new_destination = _Processor_mask_Find_last_set(affinity) - 1;
+
+	rtems_interrupt_lock_acquire(&lock, &lock_context);
+	ev_int_get_config(vector, &config, &priority, &destination);
+	ev_int_set_config(vector, config, priority, new_destination);
+	rtems_interrupt_lock_release(&lock, &lock_context);
+}
+
+void bsp_interrupt_get_affinity(
+	rtems_vector_number vector,
+	Processor_mask *affinity
+)
+{
+	uint32_t config;
+	unsigned int priority;
+	uint32_t destination;
+
+	ev_int_get_config(vector, &config, &priority, &destination);
+	_Processor_mask_From_uint32_t(affinity, destination, 0);
+}
+
+void bsp_interrupt_vector_enable(rtems_vector_number vector)
+{
+	bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
+	ev_int_set_mask(vector, 0);
+}
+
+void bsp_interrupt_vector_disable(rtems_vector_number vector)
+{
+	bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
+	ev_int_set_mask(vector, 1);
+}
+
+void bsp_interrupt_dispatch(void)
+{
+	unsigned int vector;
+
+	ev_int_iack(0, &vector);
+
+	if (vector != SPURIOUS) {
+		uint32_t msr;
+
+		msr = ppc_external_exceptions_enable();
+		bsp_interrupt_handler_dispatch(vector);
+		ppc_external_exceptions_disable(msr);
+
+		ev_int_eoi(vector);
+	} else {
+		bsp_interrupt_handler_default(vector);
+	}
+}
+
+rtems_status_code bsp_interrupt_facility_initialize(void)
+{
+	return RTEMS_SUCCESSFUL;
+}
+
+#else /* !QORIQ_IS_HYPERVISOR_GUEST */
+
 #define VPR_MSK BSP_BBIT32(0)
 #define VPR_A BSP_BBIT32(1)
 #define VPR_P BSP_BBIT32(8)
@@ -47,10 +125,6 @@
 #define GCR_RST BSP_BBIT32(0)
 #define GCR_M BSP_BBIT32(2)
 
-#define SPURIOUS 0xffff
-
-RTEMS_INTERRUPT_LOCK_DEFINE(static, lock, "QorIQ IRQ")
-
 #define SRC_CFG_IDX(i) ((i) - QORIQ_IRQ_EXT_BASE)
 
 static const uint16_t src_cfg_offsets [] = {
@@ -291,3 +365,5 @@ rtems_status_code bsp_interrupt_facility_initialize(void)
 
 	return RTEMS_SUCCESSFUL;
 }
+
+#endif /* QORIQ_IS_HYPERVISOR_GUEST */




More information about the vc mailing list