MPSoC是带ARM处理器和FPGA(PL)的SoC,包含4核A53及其常用外部模块(PS)。A53(PS)使用Arm GIC-400,属于GICv2架构。如果想了解GIC-400的具体细节,请参考文档APU GIC: CoreLink GIC-400 Generic Interrupt Controller, DDI 0471B, r0p1。
MPSoC的A53(PS)的中断细节,在Xilinx的UG1085的Table 13‐1: System Interrupts部分做了详细介绍。
需要注意的是,UG1085的Table 13‐1描述的是芯片的内部连线,是硬件中断号,和Linux Kernel使用的软件中断号(逻辑中断号)有区别。有的SOC只有一个中断控制器,有的SOC有多个串联/并联的中断控制器。Linux Kernel为了各种处理复杂的中断控制器设计,并给中断提供统一的API,在内部使用统一编址的的软件中断号。同时,GIC的Linux Kernel驱动内部有一个表,用于转换硬件中断号和软件中断号。这样的好处是,即使不同SoC系统里有不同的中断控制器结构,驱动程序也可以忽略这些细节,使用统一的API,比如platform_get_irq,从Device Tree里获取中断号,并向Linux Kernel注册驱动程序的中断处理程序。另外,设备的Device Tree里的中断号是局部的,在它所属的中断控制器里保持唯一即可。Linux Kernel使用的软件中断号,是整个Linux Kernel系统的,需要在Linux Kernel范围内保持唯一。
更多信息可以参考Linux Kernel代码,以及Linux kernel的中断子系统之(二):IRQ Domain介绍。
MPSoC的Device Tree的软件中断号,比UG1085的Table 13‐1提供的硬件中断号小32。这是因为A53内部的中断号0-31是私有中断。
以GEM0为例,UG1085的Table 13‐1提供的硬件中断号是89,Device Tree里的设备号是0x39(57),驱动程序里使用platform_get_irq(pdev, 0)获取软件中断号。
VCU TRD 2020.2基于zcu106_llp2_xv20的PetaLinux工程里的GEM0的中断信息:
ethernet@ff0b0000 {
compatible = "cdns,zynqmp-gem\0cdns,gem";
interrupt-parent = <0x04>;
interrupts = <0x00 0x39 0x04 0x00 0x39 0x04>;
};
UG1085的Table 13‐1里GEM0的硬件中断号
UG1085的Table 35‐6: PS-PL Interrupts Summary,使用的是Device Tree里的软件中断号。
需要更多信息,可以参考MPSoC Device tree interrupt number for PL-PS interrupt, Zynq-7000 mapping irq number into device tree value。