}staticintgic_init_bases(structgic_chip_data *gic,intirq_start,structfwnode_handle *handle){ ... gic_dist_init(gic); ret = gic_cpu_init(gic);if(ret)gotoerror; ... }staticvoidgic_dist_init(structgic_chip_data *gic){ ... cpumask = gic_get_cpumask(gic);/* 读取当前 CPU 的默认...
GIC INIT gicv2_dist_init staticvoid__init_textgicv2_dist_init(void){uint32_ttype;uint32_tcpumask;uint32_tgic_cpus;unsignedintnr_lines;inti;// 所有中断都往 pcpu0 发送cpumask = readl_gicd(GICD_ITARGETSR) &0xff; cpumask = (cpumask ==0) ? (1<<0) : cpumask; cpumask |= cpuma...
格式如上,一般我们写 0xff,表示不屏蔽任何中断(值越大,优先级越低) GIC INIT gicv2_dist_init static void __init_text gicv2_dist_init(void) { uint32_t type; uint32_t cpumask; uint32_t gic_cpus; unsigned int nr_lines; int i; // 所有中断都往 pcpu0 发送 cpumask = readl_gicd(GICD...
GIC INIT gicv2_dist_init staticvoid__init_textgicv2_dist_init(void){uint32_ttype;uint32_tcpumask;uint32_tgic_cpus;unsignedintnr_lines;inti;// 所有中断都往 pcpu0 发送cpumask = readl_gicd(GICD_ITARGETSR) &0xff; cpumask = (cpumask ==0) ? (1<<0) : cpumask; cpumask |= cpuma...
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()) { ...
__gic_init_bases 是 GIC 初始化的核心函数,不过在讲解这个函数之前,有必要先了解两个数据结构:irq_chip_data 和irq_desc。 先来看看 irq_chip_data 结构: struct gic_chip_data { struct irq_chip chip; union gic_base dist_base; union gic_base cpu_base; void __iomem *raw_dist_base; void _...
gicv2_dist_init AI检测代码解析 static void __init_text gicv2_dist_init(void) { uint32_t type; uint32_t cpumask; uint32_t gic_cpus; unsigned int nr_lines; int i; // 所有中断都往 pcpu0 发送 cpumask = readl_gicd(GICD_ITARGETSR) & 0xff; ...
分发器对中断的控制分成两个级别,一个是全局中断的控制(GIC_DIST_CTRL),一旦禁能了全局的中断,那么任何的中断源产生的中断事件都不会被传递到CPU接口;另外一个级别是对针对各个中断源进行控制(GIC_DIST_ENABLE_CLEAR),禁能某一个中断源会导致该中断事件不会分发到CPU接口,但不影响其他中断源产生中断事件的分发...
gic_of_init的代码如下: int __init gic_of_init(struct device_node *node, struct device_node *parent) { void __iomem *cpu_base; void __iomem *dist_base; u32 percpu_offset; int irq; if (WARN_ON(!node)) return -ENODEV; dist_base = of_iomap(node, 0);---映射GIC Distributor的寄...
= bitmap) { gicd_set_ctlr(gicv3_driver_data->gicd_base, bitmap, RWP_TRUE); } } /*** * ARM common helper to initialize the GIC. Only invoked by BL31 ***/ void __init plat_arm_gic_init(void) { gicv3_distif_init(); gicv3_rdistif_init(plat_my_core_pos()); gicv3...