summaryrefslogtreecommitdiffstats
path: root/bsps/m68k
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-06-25 15:52:16 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-07-26 19:57:31 +0200
commite5183238723bb35f5f5d2f0624b821f75f8b424b (patch)
tree6c410c8ae06dfeb9abaee226d7fdf025095d9dac /bsps/m68k
parentbsps/irq: Move bsp_interrupt_handler_is_empty() (diff)
downloadrtems-e5183238723bb35f5f5d2f0624b821f75f8b424b.tar.bz2
bsps/irq: Add rtems_interrupt_entry_install()
Add rtems_interrupt_entry_remove(). Split up irq-generic.c into several files. In particular, place all functions which use dynamic memory into their own file. Add optional macros to let the BSP customize the vector installation after installing the first entry and the vector removal before removing the last entry: * bsp_interrupt_vector_install() * bsp_interrupt_vector_remove() Use these new customization options in the m68k/genmcf548x BSP so re-use the generic interrupt controller support. Update #3269.
Diffstat (limited to 'bsps/m68k')
-rw-r--r--bsps/m68k/genmcf548x/include/bsp/irq.h8
-rw-r--r--bsps/m68k/genmcf548x/irq/irq.c140
2 files changed, 18 insertions, 130 deletions
diff --git a/bsps/m68k/genmcf548x/include/bsp/irq.h b/bsps/m68k/genmcf548x/include/bsp/irq.h
index 4c90c6ad0e..140868f022 100644
--- a/bsps/m68k/genmcf548x/include/bsp/irq.h
+++ b/bsps/m68k/genmcf548x/include/bsp/irq.h
@@ -99,4 +99,12 @@ static inline bool bsp_interrupt_is_valid_vector(rtems_vector_number vector)
&& vector < (rtems_vector_number) BSP_INTERRUPT_VECTOR_COUNT;
}
+void mcf548x_interrupt_vector_install(rtems_vector_number vector);
+
+void mcf548x_interrupt_vector_remove(rtems_vector_number vector);
+
+#define bsp_interrupt_vector_install(v) mcf548x_interrupt_vector_install(v)
+
+#define bsp_interrupt_vector_remove(v) mcf548x_interrupt_vector_remove(v)
+
#endif /* LIBBSP_M68K_MCF548X_IRQ_H */
diff --git a/bsps/m68k/genmcf548x/irq/irq.c b/bsps/m68k/genmcf548x/irq/irq.c
index cd38b3e153..4a9fefee33 100644
--- a/bsps/m68k/genmcf548x/irq/irq.c
+++ b/bsps/m68k/genmcf548x/irq/irq.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013, 2021 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -20,14 +20,6 @@ void asm_default_interrupt(void);
typedef void (*void_func)(void);
-typedef struct {
- rtems_interrupt_handler handler;
- void *arg;
- const char *info;
-} interrupt_control;
-
-static interrupt_control interrupt_controls[BSP_INTERRUPT_VECTOR_COUNT];
-
static uint32_t vector_to_reg(rtems_vector_number vector)
{
return ((vector + 32U) >> 5) & 0x1;
@@ -131,18 +123,6 @@ rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
return RTEMS_SUCCESSFUL;
}
-static void_func get_exception_handler(rtems_vector_number vector)
-{
- void **vbr;
- void_func *exception_table;
-
- m68k_get_vbr(vbr);
-
- exception_table = (void_func *)vbr;
-
- return exception_table[vector_to_exception_vector(vector)];
-}
-
static void set_exception_handler(rtems_vector_number vector, void_func handler)
{
void **vbr;
@@ -157,119 +137,19 @@ static void set_exception_handler(rtems_vector_number vector, void_func handler)
static void dispatch_handler(rtems_vector_number exception_vector)
{
- const interrupt_control *ic =
- &interrupt_controls[exception_vector_to_vector(exception_vector)];
-
- (*ic->handler)(ic->arg);
+ bsp_interrupt_handler_dispatch_unchecked(
+ exception_vector_to_vector(exception_vector)
+ );
}
-static uint8_t get_intc_icr(rtems_vector_number vector)
+void mcf548x_interrupt_vector_install(rtems_vector_number vector)
{
- volatile uint8_t *icr = &MCF548X_INTC_ICR0;
-
- return icr[vector];
+ _ISR_Vector_table[vector_to_exception_vector(vector)]
+ = dispatch_handler;
+ set_exception_handler(vector, _ISR_Handler);
}
-rtems_status_code rtems_interrupt_handler_install(
- rtems_vector_number vector,
- const char *info,
- rtems_option options,
- rtems_interrupt_handler handler,
- void *arg
-)
+void mcf548x_interrupt_vector_remove(rtems_vector_number vector)
{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (bsp_interrupt_is_valid_vector(vector)) {
- rtems_interrupt_level level;
-
- rtems_interrupt_disable(level);
-
- if (
- get_exception_handler(vector) == asm_default_interrupt
- && get_intc_icr(vector) != 0
- ) {
- interrupt_control *ic = &interrupt_controls[vector];
-
- ic->handler = handler;
- ic->arg = arg;
- ic->info = info;
-
- _ISR_Vector_table[vector_to_exception_vector(vector)]
- = dispatch_handler;
- set_exception_handler(vector, _ISR_Handler);
- bsp_interrupt_vector_enable(vector);
- } else {
- sc = RTEMS_RESOURCE_IN_USE;
- }
-
- rtems_interrupt_enable(level);
- } else {
- sc = RTEMS_INVALID_ID;
- }
-
- return sc;
-}
-
-static bool is_occupied_by_us(rtems_vector_number vector)
-{
- return get_exception_handler(vector) == _ISR_Handler
- && _ISR_Vector_table[vector_to_exception_vector(vector)]
- == dispatch_handler;
-}
-
-rtems_status_code rtems_interrupt_handler_remove(
- rtems_vector_number vector,
- rtems_interrupt_handler handler,
- void *arg
-)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (bsp_interrupt_is_valid_vector(vector)) {
- rtems_interrupt_level level;
- interrupt_control *ic = &interrupt_controls[vector];
-
- rtems_interrupt_disable(level);
-
- if (
- is_occupied_by_us(vector)
- && ic->handler == handler
- && ic->arg == arg
- ) {
- bsp_interrupt_vector_disable(vector);
- set_exception_handler(vector, asm_default_interrupt);
-
- memset(ic, 0, sizeof(*ic));
- } else {
- sc = RTEMS_UNSATISFIED;
- }
-
- rtems_interrupt_enable(level);
- } else {
- sc = RTEMS_INVALID_ID;
- }
-
- return sc;
-}
-
-rtems_status_code rtems_interrupt_handler_iterate(
- rtems_vector_number vector,
- rtems_interrupt_per_handler_routine routine,
- void *arg
-)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
-
- if (bsp_interrupt_is_valid_vector(vector)) {
- if (is_occupied_by_us(vector)) {
- const interrupt_control *ic = &interrupt_controls[vector];
-
- (*routine)(arg, ic->info, RTEMS_INTERRUPT_UNIQUE, ic->handler, ic->arg);
- }
- } else {
- sc = RTEMS_INVALID_ID;
- }
-
- return sc;
+ set_exception_handler(vector, asm_default_interrupt);
}