summaryrefslogtreecommitdiffstats
path: root/bsps/sparc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-08-03 19:55:14 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2023-07-14 12:21:33 +0200
commitf6b7279687ca4ab1ec47f8a8f66c8f82c7b13a2d (patch)
treec872ae05a14aabd6ad848d6dcbf23c0066ff96dd /bsps/sparc
parentbsp/leon3: Add LEON3_PROBE_ASR_22_23_UP_COUNTER (diff)
downloadrtems-f6b7279687ca4ab1ec47f8a8f66c8f82c7b13a2d.tar.bz2
bsp/leon3: Add LEON3_IRQAMP_EXTENDED_INTERRUPT
Diffstat (limited to 'bsps/sparc')
-rw-r--r--bsps/sparc/leon3/include/bsp/irqimpl.h4
-rw-r--r--bsps/sparc/leon3/start/eirq.c8
2 files changed, 12 insertions, 0 deletions
diff --git a/bsps/sparc/leon3/include/bsp/irqimpl.h b/bsps/sparc/leon3/include/bsp/irqimpl.h
index ee5beaf72c..f5b0c205e0 100644
--- a/bsps/sparc/leon3/include/bsp/irqimpl.h
+++ b/bsps/sparc/leon3/include/bsp/irqimpl.h
@@ -103,7 +103,11 @@ extern struct ambapp_dev *LEON3_IrqCtrl_Adev;
*
* This object should be read-only after initialization.
*/
+#if defined(LEON3_IRQAMP_EXTENDED_INTERRUPT)
+#define LEON3_IrqCtrl_EIrq LEON3_IRQAMP_EXTENDED_INTERRUPT
+#else
extern uint32_t LEON3_IrqCtrl_EIrq;
+#endif
/**
* @brief Initializes the interrupt controller for the boot processor.
diff --git a/bsps/sparc/leon3/start/eirq.c b/bsps/sparc/leon3/start/eirq.c
index 5576c37c22..05e6789f69 100644
--- a/bsps/sparc/leon3/start/eirq.c
+++ b/bsps/sparc/leon3/start/eirq.c
@@ -35,8 +35,10 @@
#include <bsp/irq-generic.h>
#include <bsp/irqimpl.h>
+#if !defined(LEON3_IRQAMP_EXTENDED_INTERRUPT)
/* GRLIB extended IRQ controller IRQ number */
uint32_t LEON3_IrqCtrl_EIrq;
+#endif
rtems_interrupt_lock LEON3_IrqCtrl_Lock =
RTEMS_INTERRUPT_LOCK_INITIALIZER("LEON3 IrqCtrl");
@@ -47,7 +49,9 @@ void leon3_ext_irq_init(irqamp *regs)
grlib_store_32(&regs->pimask[LEON3_Cpu_Index], 0);
grlib_store_32(&regs->piforce[LEON3_Cpu_Index], 0);
grlib_store_32(&regs->iclear, 0xffffffff);
+#if !defined(LEON3_IRQAMP_EXTENDED_INTERRUPT)
LEON3_IrqCtrl_EIrq = IRQAMP_MPSTAT_EIRQ_GET(grlib_load_32(&regs->mpstat));
+#endif
}
bool bsp_interrupt_is_valid_vector(rtems_vector_number vector)
@@ -56,11 +60,15 @@ bool bsp_interrupt_is_valid_vector(rtems_vector_number vector)
return false;
}
+#if defined(LEON3_IRQAMP_EXTENDED_INTERRUPT)
+ return vector <= BSP_INTERRUPT_VECTOR_MAX_EXT;
+#else
if (LEON3_IrqCtrl_EIrq > 0) {
return vector <= BSP_INTERRUPT_VECTOR_MAX_EXT;
}
return vector <= BSP_INTERRUPT_VECTOR_MAX_STD;
+#endif
}
#if defined(RTEMS_SMP)