文件目录:linux\\Documentation\devicetree\bindings\arm\gic.txt
。
一、ARM 通用中断控制器
ARM
内核通常与一个 GIC
相关联,为每个处理器提供 PPI
(外设私有中断)、SPI
(公用外设中断)和 SGI
(软件触发中断)。
1、必须属性
compatible
:必须是以下选项之一
"arm,gic-400"
"arm,cortex-a15-gic"
"arm,cortex-a9-gic"
"arm,cortex-a7-gic"
"arm,arm11mp-gic"
"brcm,brahma-b15-gic"
"arm,arm1176jzf-devchip-gic"
"qcom,msm-8660-qgic"
"qcom,msm-qgic2"
interrupt-controller
:将节点标识为中断控制器#interrupt-cells
:指定对中断源进行编码所需的单元格数。这个必须被设置为 3。
// 第一个单元用于说明中断类型
0:SPI 类型中断
1:PPI 类型中断
// 第二个单元用于说明中断号
SPI 类型中断号范围 [0-987]
PPI 类型中断号范围 [0-15]
// 第三个单元用于说明标志
// bit[3:0]用于标识触发类型
1:上升沿触发
2:下降沿触发
4:高电平触发
8:低电平触发
// bit[15:8]用于标识 PPI 中断掩码
reg
:指定GIC
寄存器的基本物理地址和大小。
第一个区域是 GIC 分发器寄存器基地址和大小
第二个区域是 GIC 的 CPU 接口寄存器基地址和大小
2、可选属性
interrupts
:二级GIC
父中断控制器的中断源,或主GIC
上的VGIC
维护中断。cpu-offset
:分发器和CPU
接口区域内的每个CPU
偏移,当GIC
没有备份寄存器时使用。
3、示例
intc: interrupt-controller@fff11000 {
compatible = "arm,cortex-a9-gic";
#interrupt-cells = <3>;
#address-cells = <1>;
interrupt-controller;
reg = <0xfff11000 0x1000>,
<0xfff10100 0x100>;
};
二、GIC 虚拟化扩展 (VGIC)
对于支持虚拟化扩展的 ARM
内核,必须描述额外的属性(仅当 GIC
是主中断控制器时才存在)。
1、必须属性
reg
:指定VGIC
寄存器的基本物理地址和大小的其他区域。
第一个附加区域为 GIC 虚拟接口控制器寄存器基地址和大小
第二个附加区域为 GIC 虚拟 CPU 接口寄存器基地址和大小
interrupts
:VGIC
维护中断。
2、示例
interrupt-controller@2c001000 {
compatible = "arm,cortex-a15-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x2c001000 0x1000>,
<0x2c002000 0x1000>,
<0x2c004000 0x2000>,
<0x2c006000 0x2000>;
interrupts = <1 9 0xf04>;
};
三、用于支持 MSI/MSI-x 的 GICv2m 扩展(可选)
GIC-400
的某些修订版通过 V2M
寄存器帧支持 MSI/MSI-x
。这可以通过指定 v2m
子节点来启用。
1、必需属性
-
compatible
:这里的值应包含"arm,gic-v2m-frame"
。 -
msi-controller
:将节点标识为MSI
控制器。 -
reg
:GICv2m MSI
接口寄存器基地址和大小
可选属性:
arm,msi-base-spi
:当MSI_TYPER
寄存器包含不正确的值时,此属性应包含MSI
帧的SPI
基数,并覆盖硬件值。arm,msi-num-spis
:当MSI_TYPER
寄存器包含不正确的值时,此属性应包含分配给帧的SPI
数,并覆盖硬件值。
2、示例
interrupt-controller@e1101000 {
compatible = "arm,gic-400";
#interrupt-cells = <3>;
#address-cells = <2>;
#size-cells = <2>;
interrupt-controller;
interrupts = <1 8 0xf04>;
ranges = <0 0 0 0xe1100000 0 0x100000>;
reg = <0x0 0xe1110000 0 0x01000>,
<0x0 0xe112f000 0 0x02000>,
<0x0 0xe1140000 0 0x10000>,
<0x0 0xe1160000 0 0x10000>;
v2m0: v2m@0x8000 {
compatible = "arm,gic-v2m-frame";
msi-controller;
reg = <0x0 0x80000 0 0x1000>;
};
....
v2mN: v2m@0x9000 {
compatible = "arm,gic-v2m-frame";
msi-controller;
reg = <0x0 0x90000 0 0x1000>;
};
};