每一个Interrupt Processor Targets Registers由32个bit组成,因此每个Interrupt Processor Targets Registers可以表示4个HW interrupt ID的affinity,因此上面的代码中的shift就是计算该HW interrupt ID在寄存器中的偏移。 (7)gic_set_wake 这个接口用来设定唤醒CPU的interrupt source。对于GIC,代码如下: static int gic_set...
每一个core的affnity值可以通过MPDIR_EL1寄存器获取,每一个affinity占用8bit。配置对应 core的MPIDR值,可以将中断路由到该core上。每个core,连接一个cpu interface,而cpu interface会连接gic中的一个redistributor。redistributor的标识和core的标识一样。 各个affinity的定义是根据SOC自己的定义,比如: <group of groups...
irq_data_update_effective_affinity(d, cpumask_of(cpu));returnIRQ_SET_MASK_OK_DONE; } gic_set_affinity先判断当前中断是否使能,如果使能则disable掉该中断; 然后根据gic_mpidr_to_affinity函数获取需要绑定中断到对应core的路由, staticu64gic_mpidr_to_affinity(unsignedlongmpidr){ u64 aff; aff = ((u...
6、gic_set_affinity 在多处理器的环境下,外部设备产生了一个中断就需要送到一个或者多个处理器去,这个设定是通过设定处理器的affinity进行的。具体代码如下: static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, bool force) { void __iomem *reg = gic_dist_base(d) + ...
用...的形式组成一个PE的路由。每一个core的affnity值可以通过MPDIR_EL1寄存器获取,每一个affinity占用8bit。配置对应 core的MPIDR值,可以将中断路由到该core上。每个core,连接一个cpu interface,而cpu interface会连接gic中的一个redistributor。redistributor的标识和core的标识一样。
.irq_set_vcpu_affinity = gic_irq_set_vcpu_affinity, .flags = IRQCHIP_SET_TYPE_MASKED, }; 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 当然,这里设置的函数都是对GIC控制器进行的操作。
该类型中断不与特定的cpu绑定,可以根据affinity配置被路由到任意cpu或一组特定的cpu上。如一般的外设中断都是通过SPI方式连接的。 2 PPI中断(private peripheral interrupt) 该类型中断是每个处理器私有的,即一个特定的中断只会被路由到特定的处理器上。且其同一个中断号在每个处理器上都可以有不同的中断,如对于一...
由于GIC最大支持8个process,因此每个hw interrupt ID需要8个bit来表示送达的process。每一个Interrupt Processor Targets Registers由32个bit组成,因此每个Interrupt Processor Targets Registers可以表示4个HW interrupt ID的affinity。 7、gic_set_wake 这个接口用来设定唤醒CPU的interrupt source。对于GIC,代码如下:...
(*irq_set_affinity)(structirq_data *data,conststructcpumask *dest,boolforce);//在SMP中设置CPU亲和力int(*irq_retrigger)(structirq_data *data);//重新发送中断到CPUint(*irq_set_type)(structirq_data *data,unsignedintflow_type);//设置中断触发类型int(*irq_set_wake)(structirq_data *data,...
staticintgicv2_set_irq_affinity(uint32_tirq,uint32_tpcpu){if(pcpu > NR_GIC_CPU_IF || irq <32)return-EINVAL; spin_lock(&gicv2_lock);/* Set target CPU mask (RAZ/WI on uniprocessor) */writeb_gicd(1<< pcpu, GICD_ITARGETSR + irq); ...