summaryrefslogtreecommitdiffstats
path: root/bsps
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2022-01-10 15:52:40 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2022-01-11 16:18:11 +0100
commitcbc92325a1575a5ace57c458b998ea6d0b49b163 (patch)
tree13a9164f58d8d5ee807aca8b4604a6e1195cef92 /bsps
parentlibtests/ofw01: Fix wrapped in bsp_fdt_get() (diff)
downloadrtems-cbc92325a1575a5ace57c458b998ea6d0b49b163.tar.bz2
bsp/qoriq: Implement Interrupt Manager directives
Update #3269.
Diffstat (limited to 'bsps')
-rw-r--r--bsps/powerpc/qoriq/irq/irq.c101
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)