if (static_key_true(&supports_deactivate)) gic_write_dir(irqnr); #ifdef CONFIG_SMP /* * Unlike GICv2, we don't need an smp_rmb() here. * The control dependency from gic_read_iar to * the ISB in gic_write_eoir is enough to ensure * that any shared data read by handle_IPI wi...
gic_write_eoir(irqnr);if(static_branch_likely(&supports_deactivate_key)) gic_write_dir(irqnr);#ifdefCONFIG_SMP/* * Unlike GICv2, we don't need an smp_rmb() here. * The control dependency from gic_read_iar to * the ISB in gic_write_eoir is enough to ensure * that any shared d...
GIC_Type *gic = get_gic_base(); /* write GICC_EOIR inform the CPU interface that it has completed * the processing of the specified interrupt */ gic->C_EOIR = nr; }
643 if (static_branch_likely(&supports_deactivate_key)) 644 gic_write_eoir(irqnr); /*先做EOI,这和标准的GIC中断状态转移略有不同,我理解因为linux没有中断嵌套,所以先执行中断号specific的中断处理函数,还是先执行EOI,没有太大区别【这里不确定】*/ 645 else 646 isb(); 647 648 err = handle_domain...
writel_gicd(1UL << (irq % 32), GICD_ICENABLER + (irq / 32) * 4); dsb(); spin_unlock_irqrestore(&gicv2_lock, flags); } // 使能中断号为 irq 的中断 static void gicv2_unmask_irq(uint32_t irq) { unsigned long flags;
当GICC_CTLR.EOImode = 0 是,Priority drop 和 Interrupt deactivation 两个步骤是在一起的,写 GICC_EOIR 寄存器就表示完成两个步骤 GICC_DIR 和 GICC_EOIR 格式都如下所示: AI检测代码解析 static void gicv2_eoi_irq(uint32_t irq) { writel_gicc(irq, GICC_EOIR); ...
gic_write_eoir(irqnr); } } continue; } if (irqnr < 16) { gic_write_eoir(irqnr); if (static_key_true(&supports_deactivate)) gic_write_dir(irqnr); #ifdef CONFIG_SMP /* * Unlike GICv2, we don't need an smp_rmb() here. ...
pending。(A2) (6) 当处理器完成中断服务,必须发送一个完成信号EOI(End Of Interrupt)给GIC控制器。软件写GICC_EOIR寄存器,状态变成inactive。(E1...GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多智能推荐GIC...
运行 AI代码解释 intc:interrupt-controller@666688888{compatible="arm,gic-v3";#interrupt-cells=<3>;interrupt-controller;#redistributor-regions=<1>;redistributor-stride=<0x00x20000>;reg=<0x6666888880x10000>,/* GICD */<0x6666e88880x100000>;/* GICR * 8 */interrupts=<GIC_PPI8IRQ_TYPE_LEVEL_HIGH...
The root cause of this behavior is the write operation of register ICCEOIR in XScuGic_InterruptHandler(). It should be written with the full value of ICCIAR.Here is the original driver:void XScuGic_InterruptHandler(XScuGic *InstancePtr)