diff --git a/arch/arm/src/armv7-a/arm_gicv2.c b/arch/arm/src/armv7-a/arm_gicv2.c index 3f7fc667ed8..8f6f8ab34fc 100644 --- a/arch/arm/src/armv7-a/arm_gicv2.c +++ b/arch/arm/src/armv7-a/arm_gicv2.c @@ -504,6 +504,33 @@ int up_prioritize_irq(int irq, int priority) return -EINVAL; } +/**************************************************************************** + * Name: up_affinity_irq + * + * Description: + * Set an IRQ affinity by software. + * + ****************************************************************************/ + +void up_affinity_irq(int irq, cpu_set_t cpuset) +{ + if (irq >= GIC_IRQ_SPI && irq < NR_IRQS) + { + uintptr_t regaddr; + uint32_t regval; + + /* Write the new cpuset to the corresponding field in the in the + * distributor Interrupt Processor Target Register (GIC_ICDIPTR). + */ + + regaddr = GIC_ICDIPTR(irq); + regval = getreg32(regaddr); + regval &= ~GIC_ICDIPTR_ID_MASK(irq); + regval |= GIC_ICDIPTR_ID(irq, cpuset); + putreg32(regval, regaddr); + } +} + /**************************************************************************** * Name: up_trigger_irq * diff --git a/arch/arm/src/armv7-r/arm_gicv2.c b/arch/arm/src/armv7-r/arm_gicv2.c index bd5f0cf79f3..2da122198b5 100644 --- a/arch/arm/src/armv7-r/arm_gicv2.c +++ b/arch/arm/src/armv7-r/arm_gicv2.c @@ -503,6 +503,33 @@ int up_prioritize_irq(int irq, int priority) return -EINVAL; } +/**************************************************************************** + * Name: up_affinity_irq + * + * Description: + * Set an IRQ affinity by software. + * + ****************************************************************************/ + +void up_affinity_irq(int irq, cpu_set_t cpuset) +{ + if (irq >= GIC_IRQ_SPI && irq < NR_IRQS) + { + uintptr_t regaddr; + uint32_t regval; + + /* Write the new cpuset to the corresponding field in the in the + * distributor Interrupt Processor Target Register (GIC_ICDIPTR). + */ + + regaddr = GIC_ICDIPTR(irq); + regval = getreg32(regaddr); + regval &= ~GIC_ICDIPTR_ID_MASK(irq); + regval |= GIC_ICDIPTR_ID(irq, cpuset); + putreg32(regval, regaddr); + } +} + /**************************************************************************** * Name: up_trigger_irq * diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h index e4bdc9c19dd..467942e4eaa 100644 --- a/include/nuttx/arch.h +++ b/include/nuttx/arch.h @@ -1489,6 +1489,18 @@ void up_enable_irq(int irq); void up_disable_irq(int irq); #endif +/**************************************************************************** + * Name: up_affinity_irq + * + * Description: + * Set an IRQ affinity by software. + * + ****************************************************************************/ + +#ifdef CONFIG_SMP +void up_affinity_irq(int irq, cpu_set_t cpuset); +#endif + /**************************************************************************** * Name: up_trigger_irq *