{/* 计算中断@d->hwirq 的 ICDIPTRn 寄存器地址 */void__iomem *reg =gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3);/* ICDIPTRn 是 32-bit 寄存器,包含4个中断的设置,要计算中断@d->hwirq 配置域的位偏移 */unsignedintcpu, shift = (gic_irq(d) %4) *8; u32 val, mas...
for(i=0;i<32;i+=4) { cpu_group=readl(base+GIC_DIST_IGROUP+i); printk("reg[%d],cpu_group:0x%x\n",i/4,cpu_group);//default for group0 } /* 设置中断路由:GIC_DIST_TARGET * *前32个中断怎么路由是GIC芯片固定的,因此先读GIC_DIST_TARGET前面的值 * 然后全部填充到 SPI的中断号 */ ...
staticint__initgic_of_init(structdevice_node *node,structdevice_node *parent){void__iomem *dist_base;structredist_region*rdist_regs;u64 redist_stride; u32 nr_redist_regions;interr, i; dist_base = of_iomap(node,0); --- (1)if(!dist_base) { pr_err("%pOF: unable to map gic dist...
比如struct gic_chip_data类型的 gic_data 数组中的每个成员,不带 bank 寄存器的 GIC 驱动中使用 gic->dist_base.percpu_base 记录 distributor 的基地址,否则使用 gic->dist_base.common_base. 大多数的 GIC 实现都支持 bank 寄存器,因此说它是正常的 GIC 实现. 至于irq domain 和 irq 映射相关的,这是...
gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset, node);))---主处理过程,后面详述 if (!gic_cnt) gic_init_physaddr(node); ---对于不支持big.LITTLE switcher(CONFIG_BL_SWITCHER)的系统,该函数为空。 if (parent) {---处理interrupt级联 irq = irq_of...
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); if (!dist_base) { pr_err("%s: unable to map gic dist registers\n", node->full_name); ...
分发器对中断的控制分成两个级别,一个是全局中断的控制(GIC_DIST_CTRL),一旦禁能了全局的中断,那么任何的中断源产生的中断事件都不会被传递到CPU接口;另外一个级别是对针对各个中断源进行控制(GIC_DIST_ENABLE_CLEAR),禁能某一个中断源会导致该中断事件不会分发到CPU接口,但不影响其他中断源产生中断事件的分发...
***/ void gicv3_rdistif_mark_coreasleep(uintptr_t gicr_base) { /* Mark theconnected core as asleep */ /* 执行在core的程序,将GICR_WAKER.Processor位给置高, * 表示要disconnect redistributor。 */ gicr_write_waker(gicr_base, gicr_read_waker(_base) | WAKER_PS_BIT); /* Wait till...
// gicv2.cstaticvoid*gicv2_dbase;staticvoid*gicv2_cbase; 首先定义了两个变量,gicc(cpu interface) 和 gicd(distributor)基地值,这个值是在设备树文件中定义,然后 gic 初始化函数中映射到 hyp 虚拟地址 staticinlinevoidwriteb_gicd(uint8_tval,unsignedintoffset){ ...
GIC驱动代码分析 ⼀、前⾔ GIC(Generic Interrupt Controller)是ARM公司提供的⼀个通⽤的中断控制器。GIC通过 AMBA(Advanced Microcontroller Bus Architecture)这样的⽚上总线连接到⼀个或者多个ARM processor上。本⽂主要分析了linux kernel中GIC中断控制器的驱动代码。具体的分析⽅法是按照source code为...