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:
Sebastian Huber
2024-04-05 11:07:23 +02:00
committed by Kinsey Moore
parent 89ccc65d1a
commit ab8817ca03
58 changed files with 2189 additions and 228 deletions

View File

@@ -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 ) {
/*

View File

@@ -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 ) {
/*

View File

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

View File

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