1152 - gic_smp_init 函数,cpuhp_setup_state_nocalls 设置 CPUHP_AP_IQR_GIC_STARTING 回调 gic_starting_cpu 1152staticvoid__init gic_smp_init(void)1153{1160cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_GIC_STARTING,1161"irqchip/arm/gicv3:starting",1162gic_starting_cpu, NULL);1172} 1640staticint...
gic_cpu_init //初始化当前core its_cpu_init __irq_domain_alloc_irqs //提前分配8个SGI中断irq/irq_desc ,主要是IPI核之间通信用 set_smp_ipi_range //request_percpu_irq 申请IPIX } gic_cpu_pm_init(); if (gic_dist_supports_lpis()) { its_init(handle, &gic_data.rdists, gic_data.domain...
its_init(handle, &gic_data.rdists, gic_data.domain); --- (8) gic_smp_init(); ---(9) gic_dist_init(); ---(10) gic_cpu_init(); ---(11) gic_cpu_pm_init(); ---(12)return0; out_free:if(gic_data.domain) irq_domain_remove(gic_data.domain); free_percpu(gic_data.rdi...
if (IS_ENABLED(CONFIG_ARM_GIC_V3_ITS) && gic_dist_supports_lpis()) its_init(handle, &gic_data.rdists, gic_data.domain); gic_smp_init(); gic_dist_init(); gic_cpu_init(); gic_cpu_pm_init(); return 0; out_free: if (gic_data.domain) irq_domain_remove(gic_data.domain); fre...
在系统INIT时候,图左侧红色框内,会使用set_smp_cross_call来注册系统的IPI消息发送函数,这里是gic_raise_softirq,那么右侧红色框内,发送一个特定IPI消息时候,当调用到__smp_cross_all时候就会链到绿色线所指的gic_raise_softirq,来产生一个IPI消息(SGI),见下面代码。
static int __init __gic_init_bases(struct gic_chip_data *gic, int irq_start, struct fwnode_handle *handle) { ... if (gic == &gic_data[0]) { set_smp_cross_call(gic_raise_softirq); ...1 cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_GIC_STARTING, ...2 "AP_IRQ_GIC_STARTING", ...
gicv2_cpu_init static void __init_text gicv2_cpu_init(void) { int i; int cpuid = smp_processor_id(); // 读取 GICD_ITARGETSR0 会返回当前 cpuid gic_cpu_mask[cpuid] = readl_gicd(GICD_ITARGETSR) & 0xff; pr_debug("gicv2 gic mask of cpu%d: 0x%x\n", cpuid, gic_cpu_mask...
在内核启动初始化中断的函数中,of_irq_init函数会去查找设备节点信息,该函数的传入参数就是__irqchip_of_table段,由于IRQCHIP_DECLARE已经将信息填充好了,of_irq_init函数会根据arm,gic-400去查找对应的设备节点,并获取设备的信息。中断控制器也存在级联的情况,of_irq_init函数中也处理了这种情况; ...
set_smp_cross_call(gic_raise_softirq);---设定raise SGI的方法 register_cpu_notifier(&gic_cpu_notifier);---在multi processor环境下,当其他processor online的时候,需要调用回调函数来初始化GIC的cpu interface。 #endif set_handle_irq(gic_handle_irq); } gic_chip.flags ...
staticint __initgic_of_init(struct device_node*node,struct device_node*parent){void__iomem*dist_base;struct redist_region*rdist_regs;u64 redist_stride;u32 nr_redist_regions;int err,i;dist_base=of_iomap(node,0);err=gic_validate_dist_version(dist_base);if(err){pr_err("%pOF: no dist...