diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-01-10 15:52:40 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-01-11 16:18:11 +0100 |
commit | cbc92325a1575a5ace57c458b998ea6d0b49b163 (patch) | |
tree | 13a9164f58d8d5ee807aca8b4604a6e1195cef92 /bsps | |
parent | libtests/ofw01: Fix wrapped in bsp_fdt_get() (diff) | |
download | rtems-cbc92325a1575a5ace57c458b998ea6d0b49b163.tar.bz2 |
bsp/qoriq: Implement Interrupt Manager directives
Update #3269.
Diffstat (limited to 'bsps')
-rw-r--r-- | bsps/powerpc/qoriq/irq/irq.c | 101 |
1 files changed, 77 insertions, 24 deletions
diff --git a/bsps/powerpc/qoriq/irq/irq.c b/bsps/powerpc/qoriq/irq/irq.c index 01e24998ba..dbc6ef2a78 100644 --- a/bsps/powerpc/qoriq/irq/irq.c +++ b/bsps/powerpc/qoriq/irq/irq.c @@ -280,6 +280,11 @@ static volatile qoriq_pic_src_cfg *get_src_cfg(rtems_vector_number vector) } } +static bool is_ipi(rtems_vector_number vector) +{ + return (vector - QORIQ_IRQ_IPI_BASE) < 4; +} + rtems_status_code qoriq_pic_set_priority( rtems_vector_number vector, int new_priority, @@ -320,8 +325,13 @@ rtems_status_code bsp_interrupt_set_affinity( const Processor_mask *affinity ) { - volatile qoriq_pic_src_cfg *src_cfg = get_src_cfg(vector); + volatile qoriq_pic_src_cfg *src_cfg; + if (is_ipi(vector)) { + return RTEMS_UNSATISFIED; + } + + src_cfg = get_src_cfg(vector); src_cfg->dr = _Processor_mask_To_uint32_t(affinity, 0); return RTEMS_SUCCESSFUL; } @@ -331,57 +341,96 @@ rtems_status_code bsp_interrupt_get_affinity( Processor_mask *affinity ) { - volatile qoriq_pic_src_cfg *src_cfg = get_src_cfg(vector); + volatile qoriq_pic_src_cfg *src_cfg; + + if (is_ipi(vector)) { + return RTEMS_UNSATISFIED; + } + src_cfg = get_src_cfg(vector); _Processor_mask_From_uint32_t(affinity, src_cfg->dr, 0); return RTEMS_SUCCESSFUL; } static void pic_vector_enable(rtems_vector_number vector, uint32_t msk) { - volatile qoriq_pic_src_cfg *src_cfg = get_src_cfg(vector); + volatile qoriq_pic_src_cfg *src_cfg; rtems_interrupt_lock_context lock_context; bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + src_cfg = get_src_cfg(vector); rtems_interrupt_lock_acquire(&lock, &lock_context); src_cfg->vpr = (src_cfg->vpr & ~VPR_MSK) | msk; rtems_interrupt_lock_release(&lock, &lock_context); } rtems_status_code bsp_interrupt_get_attributes( - rtems_vector_number vector, - rtems_interrupt_attributes *attributes + rtems_vector_number vector, + rtems_interrupt_attributes *attributes ) { - return RTEMS_SUCCESSFUL; + bool vector_is_ipi = is_ipi(vector); + attributes->is_maskable = true; + attributes->can_enable = true; + attributes->maybe_enable = true; + attributes->can_disable = true; + attributes->maybe_disable = true; + attributes->cleared_by_acknowledge = true; + attributes->can_get_affinity = !vector_is_ipi; + attributes->can_set_affinity = !vector_is_ipi; + attributes->can_raise = vector_is_ipi; + attributes->can_raise_on = vector_is_ipi; + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_is_pending( - rtems_vector_number vector, - bool *pending + rtems_vector_number vector, + bool *pending ) { - bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - bsp_interrupt_assert(pending != NULL); - *pending = false; - return RTEMS_UNSATISFIED; + volatile qoriq_pic_src_cfg *src_cfg; + + bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + bsp_interrupt_assert(pending != NULL); + + src_cfg = get_src_cfg(vector); + *pending = (src_cfg->vpr & VPR_A) != 0; + return RTEMS_SUCCESSFUL; +} + +static void raise_on(rtems_vector_number vector, uint32_t cpu_index) +{ + rtems_vector_number ipi_index = vector - QORIQ_IRQ_IPI_BASE; + qoriq.pic.ipidr[ipi_index].reg = 1U << cpu_index; } rtems_status_code bsp_interrupt_raise(rtems_vector_number vector) { - bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - return RTEMS_UNSATISFIED; + bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + + if (is_ipi(vector)) { + raise_on(vector, rtems_scheduler_get_processor()); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_UNSATISFIED; } #if defined(RTEMS_SMP) rtems_status_code bsp_interrupt_raise_on( - rtems_vector_number vector, - uint32_t cpu_index + rtems_vector_number vector, + uint32_t cpu_index ) { - bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - return RTEMS_UNSATISFIED; + bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + + if (is_ipi(vector)) { + raise_on(vector, cpu_index); + return RTEMS_SUCCESSFUL; + } + + return RTEMS_UNSATISFIED; } #endif @@ -392,14 +441,18 @@ rtems_status_code bsp_interrupt_clear(rtems_vector_number vector) } rtems_status_code bsp_interrupt_vector_is_enabled( - rtems_vector_number vector, - bool *enabled + rtems_vector_number vector, + bool *enabled ) { - bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); - bsp_interrupt_assert(enabled != NULL); - *enabled = false; - return RTEMS_UNSATISFIED; + volatile qoriq_pic_src_cfg *src_cfg; + + bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)); + bsp_interrupt_assert(enabled != NULL); + + src_cfg = get_src_cfg(vector); + *enabled = (src_cfg->vpr & VPR_MSK) == 0; + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) |