mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 06:08:20 +00:00
rtems: Add get/set interrupt priorities
Add directives to get and set the priority of an interrupt vector. Implement the directives for the following BSP families: * arm/lpc24xx * arm/lpc32xx * powerpc/mpc55xxevb * powerpc/qoriq Implement the directives for the following interrupt controllers: * GICv2 and GICv3 (arm and aarch64) * NVIC (arm) * PLIC (riscv) Update #5002.
This commit is contained in:
committed by
Kinsey Moore
parent
89ccc65d1a
commit
ab8817ca03
@@ -46,6 +46,9 @@ rtems_status_code bsp_interrupt_get_attributes(
|
||||
attributes->maybe_enable = true;
|
||||
attributes->maybe_disable = true;
|
||||
attributes->can_raise = true;
|
||||
attributes->can_get_priority = true;
|
||||
attributes->can_set_priority = true;
|
||||
attributes->maximum_priority = 255;
|
||||
|
||||
if ( vector <= ARM_GIC_IRQ_SGI_LAST ) {
|
||||
/*
|
||||
|
||||
@@ -48,6 +48,9 @@ rtems_status_code bsp_interrupt_get_attributes(
|
||||
attributes->maybe_enable = true;
|
||||
attributes->maybe_disable = true;
|
||||
attributes->can_raise = true;
|
||||
attributes->can_get_priority = true;
|
||||
attributes->can_set_priority = true;
|
||||
attributes->maximum_priority = 255;
|
||||
|
||||
if ( vector <= ARM_GIC_IRQ_SGI_LAST ) {
|
||||
/*
|
||||
|
||||
@@ -272,40 +272,36 @@ BSP_START_TEXT_SECTION void arm_gic_irq_initialize_secondary_cpu(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
rtems_status_code arm_gic_irq_set_priority(
|
||||
rtems_status_code bsp_interrupt_set_priority(
|
||||
rtems_vector_number vector,
|
||||
uint8_t priority
|
||||
uint32_t priority
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
uint8_t gic_priority = (uint8_t) priority;
|
||||
|
||||
if (bsp_interrupt_is_valid_vector(vector)) {
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||
|
||||
gic_id_set_priority(dist, vector, priority);
|
||||
} else {
|
||||
sc = RTEMS_INVALID_ID;
|
||||
if (gic_priority != priority) {
|
||||
return RTEMS_INVALID_PRIORITY;
|
||||
}
|
||||
|
||||
return sc;
|
||||
gic_id_set_priority(dist, vector, gic_priority);
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_status_code arm_gic_irq_get_priority(
|
||||
rtems_status_code bsp_interrupt_get_priority(
|
||||
rtems_vector_number vector,
|
||||
uint8_t *priority
|
||||
uint32_t *priority
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
|
||||
if (bsp_interrupt_is_valid_vector(vector)) {
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||
bsp_interrupt_assert(priority != NULL);
|
||||
|
||||
*priority = gic_id_get_priority(dist, vector);
|
||||
} else {
|
||||
sc = RTEMS_INVALID_ID;
|
||||
}
|
||||
|
||||
return sc;
|
||||
*priority = gic_id_get_priority(dist, vector);
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_status_code arm_gic_irq_set_group(
|
||||
|
||||
@@ -208,53 +208,52 @@ BSP_START_TEXT_SECTION void arm_gic_irq_initialize_secondary_cpu(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
rtems_status_code arm_gic_irq_set_priority(
|
||||
rtems_status_code bsp_interrupt_set_priority(
|
||||
rtems_vector_number vector,
|
||||
uint8_t priority
|
||||
uint32_t priority
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
uint8_t gic_priority = (uint8_t) priority;
|
||||
|
||||
if (bsp_interrupt_is_valid_vector(vector)) {
|
||||
if (vector >= 32) {
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
gic_id_set_priority(dist, vector, priority);
|
||||
} else {
|
||||
gicv3_sgi_ppi_set_priority(
|
||||
vector,
|
||||
priority,
|
||||
_SMP_Get_current_processor()
|
||||
);
|
||||
}
|
||||
} else {
|
||||
sc = RTEMS_INVALID_ID;
|
||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||
|
||||
if (gic_priority != priority) {
|
||||
return RTEMS_INVALID_PRIORITY;
|
||||
}
|
||||
|
||||
return sc;
|
||||
if (vector >= 32) {
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
gic_id_set_priority(dist, vector, priority);
|
||||
} else {
|
||||
gicv3_sgi_ppi_set_priority(
|
||||
vector,
|
||||
priority,
|
||||
_SMP_Get_current_processor()
|
||||
);
|
||||
}
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_status_code arm_gic_irq_get_priority(
|
||||
rtems_status_code bsp_interrupt_get_priority(
|
||||
rtems_vector_number vector,
|
||||
uint8_t *priority
|
||||
uint32_t *priority
|
||||
)
|
||||
{
|
||||
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
|
||||
bsp_interrupt_assert(priority != NULL);
|
||||
|
||||
if (bsp_interrupt_is_valid_vector(vector)) {
|
||||
if (vector >= 32) {
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
*priority = gic_id_get_priority(dist, vector);
|
||||
} else {
|
||||
*priority = gicv3_sgi_ppi_get_priority(
|
||||
vector,
|
||||
_SMP_Get_current_processor()
|
||||
);
|
||||
}
|
||||
if (vector >= 32) {
|
||||
volatile gic_dist *dist = ARM_GIC_DIST;
|
||||
*priority = gic_id_get_priority(dist, vector);
|
||||
} else {
|
||||
sc = RTEMS_INVALID_ID;
|
||||
*priority = gicv3_sgi_ppi_get_priority(
|
||||
vector,
|
||||
_SMP_Get_current_processor()
|
||||
);
|
||||
}
|
||||
|
||||
return sc;
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
#ifdef RTEMS_SMP
|
||||
|
||||
Reference in New Issue
Block a user