diff options
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared/irq/irq-shared.c')
-rw-r--r-- | c/src/lib/libbsp/sparc/shared/irq/irq-shared.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c b/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c index ab2b4cfcf4..2b3868cbb2 100644 --- a/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c +++ b/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c @@ -2,6 +2,30 @@ #include <bsp.h> #include <bsp/irq-generic.h> +#if defined(RTEMS_SMP) && defined(LEON3) +/* Interrupt to CPU map. Default to CPU0 since in BSS. */ +unsigned char bsp_irq2cpu[32] __attribute__((weak)); + +/* On SMP use map table above relative to SMP Boot CPU (normally CPU0) */ +static inline int bsp_irq_cpu(int irq) +{ + /* protect from bad user configuration, defualt to boot cpu */ + if (rtems_configuration_get_maximum_processors() <= bsp_irq2cpu[irq]) + bsp_irq2cpu[irq] = 0; + return LEON3_Cpu_Index + bsp_irq2cpu[irq]; +} +#else +/* when not SMP the local CPU is returned */ +static inline int bsp_irq_cpu(int irq) +{ +#ifdef LEON3 + return _LEON3_Get_current_processor(); +#else + return 0; +#endif +} +#endif + static inline void bsp_dispatch_irq(int irq) { bsp_interrupt_handler_entry *e = @@ -54,26 +78,28 @@ rtems_status_code bsp_interrupt_facility_initialize(void) rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) { - BSP_Unmask_interrupt((int)vector); + int irq = (int)vector; + BSP_Cpu_Unmask_interrupt(irq, bsp_irq_cpu(irq)); - return RTEMS_SUCCESSFUL; + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector) { - BSP_Mask_interrupt((int)vector); + int irq = (int)vector; + BSP_Cpu_Mask_interrupt(irq, bsp_irq_cpu(irq)); - return RTEMS_SUCCESSFUL; + return RTEMS_SUCCESSFUL; } void BSP_shared_interrupt_mask(int irq) { - BSP_Mask_interrupt(irq); + BSP_Cpu_Mask_interrupt(irq, bsp_irq_cpu(irq)); } void BSP_shared_interrupt_unmask(int irq) { - BSP_Unmask_interrupt(irq); + BSP_Cpu_Unmask_interrupt(irq, bsp_irq_cpu(irq)); } void BSP_shared_interrupt_clear(int irq) |