diff options
Diffstat (limited to 'bsps/sparc/shared/irq/irq-shared.c')
-rw-r--r-- | bsps/sparc/shared/irq/irq-shared.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/bsps/sparc/shared/irq/irq-shared.c b/bsps/sparc/shared/irq/irq-shared.c index 68ad57d723..8896aca761 100644 --- a/bsps/sparc/shared/irq/irq-shared.c +++ b/bsps/sparc/shared/irq/irq-shared.c @@ -26,17 +26,41 @@ static inline int bsp_irq_cpu(int irq) } #if !defined(LEON3) +bool bsp_interrupt_is_valid_vector(rtems_vector_number vector) +{ + if (vector == 0) { + return false; + } + + return vector <= BSP_INTERRUPT_VECTOR_MAX_STD; +} + rtems_status_code bsp_interrupt_facility_initialize(void) { /* Nothing to do */ return RTEMS_SUCCESSFUL; } +static bool is_maskable(rtems_vector_number vector) +{ + return vector != 15; +} + rtems_status_code bsp_interrupt_get_attributes( rtems_vector_number vector, rtems_interrupt_attributes *attributes ) { + attributes->is_maskable = is_maskable(vector); + attributes->can_enable = true; + attributes->maybe_enable = true; + attributes->can_disable = is_maskable(vector); + attributes->maybe_disable = is_maskable(vector); + attributes->can_raise = true; + attributes->can_raise_on = true; + attributes->can_clear = true; + attributes->cleared_by_acknowledge = true; + attributes->can_set_affinity = true; return RTEMS_SUCCESSFUL; } @@ -47,14 +71,16 @@ rtems_status_code bsp_interrupt_is_pending( { bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); bsp_interrupt_assert(pending != NULL); - *pending = false; - return RTEMS_UNSATISFIED; + *pending = BSP_Is_interrupt_pending(vector) || + BSP_Is_interrupt_forced(vector); + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_raise(rtems_vector_number vector) { bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - return RTEMS_UNSATISFIED; + BSP_Force_interrupt(vector); + return RTEMS_SUCCESSFUL; } #if defined(RTEMS_SMP) @@ -64,14 +90,17 @@ rtems_status_code bsp_interrupt_raise_on( ) { bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - return RTEMS_UNSATISFIED; + BSP_Force_interrupt(vector); + return RTEMS_SUCCESSFUL; } #endif rtems_status_code bsp_interrupt_clear(rtems_vector_number vector) { bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - return RTEMS_UNSATISFIED; + BSP_Clear_forced_interrupt(vector); + BSP_Clear_interrupt(vector); + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_vector_is_enabled( @@ -81,8 +110,8 @@ rtems_status_code bsp_interrupt_vector_is_enabled( { bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); bsp_interrupt_assert(enabled != NULL); - *enabled = false; - return RTEMS_UNSATISFIED; + *enabled = !BSP_Cpu_Is_interrupt_masked(vector, bsp_irq_cpu(vector)); + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) @@ -95,6 +124,11 @@ rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector) { bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + + if (!is_maskable(vector)) { + return RTEMS_UNSATISFIED; + } + BSP_Cpu_Mask_interrupt(vector, 0); return RTEMS_SUCCESSFUL; } |