bsp/qoriq: Implement Interrupt Manager directives

Update #3269.
This commit is contained in:
Sebastian Huber
2022-01-10 15:52:40 +01:00
parent 963a26c34b
commit cbc92325a1

View File

@@ -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)