forked from Imagelibrary/rtems
@@ -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_status_code qoriq_pic_set_priority(
|
||||||
rtems_vector_number vector,
|
rtems_vector_number vector,
|
||||||
int new_priority,
|
int new_priority,
|
||||||
@@ -320,8 +325,13 @@ rtems_status_code bsp_interrupt_set_affinity(
|
|||||||
const Processor_mask *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);
|
src_cfg->dr = _Processor_mask_To_uint32_t(affinity, 0);
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
@@ -331,57 +341,96 @@ rtems_status_code bsp_interrupt_get_affinity(
|
|||||||
Processor_mask *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);
|
_Processor_mask_From_uint32_t(affinity, src_cfg->dr, 0);
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pic_vector_enable(rtems_vector_number vector, uint32_t msk)
|
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;
|
rtems_interrupt_lock_context lock_context;
|
||||||
|
|
||||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||||
|
|
||||||
|
src_cfg = get_src_cfg(vector);
|
||||||
rtems_interrupt_lock_acquire(&lock, &lock_context);
|
rtems_interrupt_lock_acquire(&lock, &lock_context);
|
||||||
src_cfg->vpr = (src_cfg->vpr & ~VPR_MSK) | msk;
|
src_cfg->vpr = (src_cfg->vpr & ~VPR_MSK) | msk;
|
||||||
rtems_interrupt_lock_release(&lock, &lock_context);
|
rtems_interrupt_lock_release(&lock, &lock_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_get_attributes(
|
rtems_status_code bsp_interrupt_get_attributes(
|
||||||
rtems_vector_number vector,
|
rtems_vector_number vector,
|
||||||
rtems_interrupt_attributes *attributes
|
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_status_code bsp_interrupt_is_pending(
|
||||||
rtems_vector_number vector,
|
rtems_vector_number vector,
|
||||||
bool *pending
|
bool *pending
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
volatile qoriq_pic_src_cfg *src_cfg;
|
||||||
bsp_interrupt_assert(pending != NULL);
|
|
||||||
*pending = false;
|
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||||
return RTEMS_UNSATISFIED;
|
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)
|
rtems_status_code bsp_interrupt_raise(rtems_vector_number vector)
|
||||||
{
|
{
|
||||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||||
return RTEMS_UNSATISFIED;
|
|
||||||
|
if (is_ipi(vector)) {
|
||||||
|
raise_on(vector, rtems_scheduler_get_processor());
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RTEMS_UNSATISFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(RTEMS_SMP)
|
#if defined(RTEMS_SMP)
|
||||||
rtems_status_code bsp_interrupt_raise_on(
|
rtems_status_code bsp_interrupt_raise_on(
|
||||||
rtems_vector_number vector,
|
rtems_vector_number vector,
|
||||||
uint32_t cpu_index
|
uint32_t cpu_index
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||||
return RTEMS_UNSATISFIED;
|
|
||||||
|
if (is_ipi(vector)) {
|
||||||
|
raise_on(vector, cpu_index);
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RTEMS_UNSATISFIED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -392,14 +441,18 @@ rtems_status_code bsp_interrupt_clear(rtems_vector_number vector)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_vector_is_enabled(
|
rtems_status_code bsp_interrupt_vector_is_enabled(
|
||||||
rtems_vector_number vector,
|
rtems_vector_number vector,
|
||||||
bool *enabled
|
bool *enabled
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
volatile qoriq_pic_src_cfg *src_cfg;
|
||||||
bsp_interrupt_assert(enabled != NULL);
|
|
||||||
*enabled = false;
|
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||||
return RTEMS_UNSATISFIED;
|
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)
|
rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
|
||||||
|
|||||||
Reference in New Issue
Block a user