/kernel/irq/handle.c:#ifdefCONFIG_GENERIC_IRQ_MULTI_HANDLERint__initset_handle_irq(void(*handle_irq)(structpt_regs *)){if(handle_arch_irq)return-EBUSY; handle_arch_irq = handle_irq;return0; }#endif /drivers/irqchip/irq-gic-v3.c:staticint__initgic_init_bases(void__iomem *dist_base...
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", ...
void __init gic_init_bases(unsigned int gic_nr, int irq_start, void __iomem *dist_base, void __iomem *cpu_base, u32 percpu_offset, struct device_node *node) { irq_hw_number_t hwirq_base; struct gic_chip_data *gic; int gic_irqs, irq_base, i; gic = &gic_data[gic_nr]; ...
void __init gic_init_bases(unsigned int gic_nr, int irq_start, void __iomem *dist_base, void __iomem *cpu_base, u32 percpu_offset, struct device_node *node) { irq_hw_number_t hwirq_base; struct gic_chip_data *gic; int gic_irqs, irq_base, i; BUG_ON(gic_nr >= MAX_GIC_...
gic_acpi_init acpi_data.dist_base = ioremap(dist->base_address,ACPI_GICV3_DIST_MEM_SIZE); //解析Distributor 基地址 gic_acpi_collect_gicr_base //解析出每个Redistributor的地址。总共128个,保存在acpi_data.redist_regs。 gic_init_bases //填充gic_chip_data 结构体。包括per_cpu的rdists信息。也是...
gic_init_bases的代码如下: void __init gic_init_bases(unsigned int gic_nr, int irq_start, void __iomem *dist_base, void __iomem *cpu_base, u32 percpu_offset, struct device_node *node) { irq_hw_number_t hwirq_base; struct gic_chip_data *gic; ...
@@ -1620,6 +1622,7 @@ static int __init gic_init_bases(void __iomem *dist_base, gic_data.rdists.has_rvpeid = true; gic_data.rdists.has_vlpis = true; gic_data.rdists.has_direct_lpi = true; gic_data.rdists.has_vpend_valid_dirty = true; if (WARN_ON(!gic_data.domain) ...
3. gic_init_bases流程 staticint__initgic_init_bases(void__iomem *dist_base,structredist_region *rdist_regs, u32 nr_redist_regions, u64 redist_stride,structfwnode_handle *handle){ u32 typer;intgic_irqs;interr; gic_data.fwnode = handle; ...
}staticint__init __gic_init_bases(structgic_chip_data *gic,intirq_start,structfwnode_handle *handle) {if(gic == &gic_data[0]) {/* ROOT 中断控制器 */for(i =0; i < NR_GIC_CPU_IF; i++) gic_cpu_map[i] =0xff;/* 初始将中断转发给所有 CPU interface 上的 CPU */.../* 设...
gic_init_bases(gic_cnt,-1,dist_base,cpu_base,percpu_offset,node); //本例子中gic_cnt=0 if(!gic_cnt) gic_init_physaddr(node); //gic一般不会有parent if(parent) { irq=irq_of_parse_and_map(node,0); gic_cascade_irq(gic_cnt,irq); ...