0.目录
文章目录
1.概述
本文介绍:
- GICv3中断控制器的相关操作
- 如何在裸机环境下配置GICv3中断控制器
本文是_Arm CoreSight Generic Interrupt Controllers_相关指南的三部曲其一:
- Arm CoreLink Generic Interrupt Controller v3 and v4: Overview (this guide)
- Arm CoreLink Generic Interrupt Controller v3 and v4: Locality-specific Peripheral Interrupts
- Arm CoreLink Generic Interrupt Controller v3 and v4: Virtualization
1.1 背景
GIC两个至关重要的作用:优先级排序和路由。
GIC可以提高处理器效率以及使能中断虚拟化。
GICs的实现基于Arm GIC架构。这个架构由GICv1发展到最新的 GICv3 和 GICv4 版本。Arm设计了若干通用中断控制器,向Arm Cortex多处理器系统提供一系列的中断管理方案。这些控制器的范围从用于CPU核数较少的系统的最简单的GIC-400到用于高性能和多芯片系统的GIC-600。GIC-600AE为高性能ASIL B系统增加了额外的安全功能。
看完本文,你将学会:
- 不同类型的中断
- 能够编写代码,使能FIC以及配置不同的中断类型
2.开始之前
本指南涵盖了GICv3和v4的基本操作,以及共享外围中断(spi)、私有外围中断(PPIs)和软件生成中断(SGIs)的使用。本文是对Arm Generic Interrupt Controller Architecture Specification GIC architecture version 3.0 and 4.0的补充。
GICv3和GICv4允许不同的配置和用例。为了简单起见,本指南集中于这些配置和用例的子集,其中:
- 存在两种安全状态
- 每一种安全状态的Affinity路由使能
- 所有异常等级的系统寄存器访问使能
- 处理器兼容Armv8-A,所有异常等级都实现且每种异常等级都使用AArch64
本文不包括:
- Legacy operation
- 使用AArch32
前置知识:异常模型
3.什么是通用中断控制器(Generic Interrupt Controller)
GIC处理来自外设的中断,根据优先级排序,将中断分发到合适的处理器核。下图显示了一个GIC接收来自n个不同外设的中断,并将它们分配给两个不同的处理器。
GIC是Arm Cortex-A和Arm Cortex-R处理器的标准中断控制器。
3.1 Arm CoreLink GIC简史
主要特征 | |
---|---|
GICv1 | 支持8个处理单元 支持1020个中断号 支持两种安全状态 |
GICv2 | 所有GICv1的主要特征 支持虚拟化 |
GICv3 | 所有GICv2的主要特征 支持超过8个处理单元 支持消息信号中断 系统寄存器访问CPU接口寄存器 安全模型增强:分离了安全和非安全的Group 1中断 |
GICv4 | 所有GICv3的主要特征 直接注入虚拟中断 |
本文涵盖了Arm CoreLink GICv3和GICv4,它们被大多数Armv8-A和Armv8-R设计所使用。
版本小更新:
- GICv3.1:
- 增加了支持额外的有线中断,安全虚拟化和内存系统资源
- 分区和监视(MPAM)
- GICv4.1:
- 扩展的虚拟化支持,包括直接注入虚拟软件生成的中断(SGIs)
4.Arm CoreLink GIC基本原理
在本节中,我们将看看Arm CoreLink GICv3和v4中断控制器的基本操作。
4.1 中断类型
GIC可以处理四种不同类型的中断源:
- SPI:可以转发给任意相关的核
- PPI:属于某个核私有。例如通用计时器
- SGI(Software Generated Interrupt):典型用于处理器间通信。向GIC中的SGI寄存器写值将生成SGI。
- LPI(Locality-specific Peripheral Interrupt)(不太懂):Arm CoreLink Generic Interrupt Controller v3 and v4: Locality-specific Peripheral Interrupts一文中介绍了LPI的配置
每个中断源都由一个ID号标识,这个ID号被称为INTID。上述列表中引入的中断类型是根据intid范围定义的:
INTID | 中断类型 | 注释 |
---|---|---|
0 - 15 | SGIs | Banked per PE |
16 – 31 1056 – 1119 (GICv3.1) |
PPIs | Banked per PE |
32 – 1019 4096 – 5119 (GICv3.1) |
SPIs | |
1020 - 1023 | 特殊的中断号 | 详情见5.2 |
1024 - 8191 | Reserved | |
8192~ | LPIs | 上线由具体厂家定义 |
4.1.1 中断如何通知中断控制器
传统上,中断使用专用硬件信号从外设发送到中断控制器,如下图所示:
Arm CoreLink GICv3增加了一种信号机制:message-signaled interrupts (MSI)。MSI通过向中断控制器的寄存器写值发送。如下:
通过消息发送中断,中断源无需专门的信号。
这两种发送中断的方式对于中断如何处理几乎没有影响。可能需要一些对外设的配置。例如,可能需要指定中断控制器的地址。外设的配置不在本文范畴之内。
Arm CoreLink GICv3中,SPI可以是message-signaled中断。LPI总是message-signaled中断。不同的寄存器用于不同的中断类型,如下所示:
中断类型 | 寄存器 |
---|---|
SPI | GICD_SETSPI_NSR 断言中断GICD_CLRSPI_NSR 解除中断 |
LPI | GITS_TRANSLATER |
4.2 中断状态机
中断控制器为每个SPI、PPI和SGI中断源维护一个状态机。这个状态机包含四个状态:
- Inactive:中断源当前没有断言
- Pending:中断源已经断言,但是没有PE接收。
- Active:中断源已经断言,且已被PE接收
- Active and Pending:一个中断已被接收,另一个中断在排队。
注意:LPIs有着类似的状态机。详情请查看6.2节。
状态机如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syx4n2lg-1610113945096)(https://image-1304693124.cos.ap-shanghai.myqcloud.com/img/image-20210107213122412.png)]
中断的生命周期取决于它是被配置为电平触发还是边沿触发:
- 对于电平敏感的中断,在中断输入上的上升边缘会导致中断成为挂起,并且中断被保持,直到外围设备解除中断信号。
- 对于边缘敏感中断,在中断输入上的上升边缘会导致中断成为挂起,但是中断不会被保持。
4.2.2 边沿触发中断
下图显示了中断状态转换与中断信号的对应关系:
依次考虑每个状态转换:
-
从Inactive到pending:发生在中断源被断言的时候。如果中断使能且优先级适当,那么GIC就向PE断言了中断信号
-
从Pending到active:发