06-GICv3_v4_overview
目錄
- 1 簡介
- 2 gic的版本號
- 3 gic模型
- 4 gic的基礎知識
- 4.1. 中斷類型
- 4.1.1 外設給gic的中斷信號
- 4.2. 中斷的狀態
- 4.2.1 點評中斷
- 4.2.2 邊沿中斷
- 4.3. Target interrupts :中斷affinity
- 4.4. 中斷的安全模型
- 4.4.1 中斷分組的配置
- 4.4.2 gic安全狀態的配置
- 4.5. gic的組件和寄存器介紹
- 4.5.1 Distributor (GICD_*) 介紹
- 4.5.2 Redistributors (GICR_*)介紹
- 4.5.3 CPU interfaces (ICC_*_ELn)介紹
- 4.5.4 GICD寄存器
- 4.5.5 GICR寄存器
- 4.5.6 GICR寄存器– SGI/PPI
- 4.5.7 cpu interface寄存器
- 5 gic寄存器的配置
- 5.1. 針對全局的配置
- 5.2. 針對每個PE的配置
- 5.2.1 Redistributor配置
- 5.2.2 CPU interface配置
- 5.2.3 PE配置
- 5.2.4 SPI, PPI and SGI的配置
- 5.2.5 Arm CoreLink GICv3.1 and the extended INTID ranges
- 5.2.6 Setting the target PE for SPIs
- 6 中斷處理
- 6.1. Routing a pending interrupt to a PE
- 6.2. Taking an interrupt
- 6.2.1 Example of interrupt handling
- 6.3. 運行優先級和搶占:Running priority and preemption
- 6.4. 結束一個中斷
- 6.5. Checking the current state of the system
- 6.5.1 Highest priority pending interrupt and running priority
- 6.5.2 State of individual INTIDs
- 7 Sending and receiving Software Generated Interrupts
- 7.1. Generating SGIs
- 7.2. 對比GICv3和GICv2
- 8 Example
- 9 Appendix: Legacy operation
1 簡介
本文概述了 Arm CoreLink Generic Interrupt Controller (GIC) v3 and v4的功能。 描述了 GICv3 兼容中斷控制器的操作。 它還描述了如何配置 GICv3 中斷控制器以在裸機環境中使用。
中斷是給處理器的信號,告訴處理器發生了需要處理的事件。 中斷通常由外圍設備生成。
例如,系統可能使用通用異步接收器/發送器 (UART) 接口與外部世界進行通信。 當 UART 接收到數據時,它需要一種機制來告訴處理器新數據已經到達并準備好進行處理。 UART 可以使用的一種機制是生成中斷以向處理器發送信號。
小型系統可能只有幾個中斷源和一個處理器。 然而,更大的系統可能有更多潛在的中斷源和處理器。 GIC 執行中斷管理、優先級和路由等關鍵任務。 GIC 對來自整個系統的所有中斷進行編組,對它們進行優先級排序,并將它們發送到要處理的核心。 GIC 主要用于提高處理器效率和啟用中斷虛擬化。
GIC 是基于 Arm GIC 架構實現的。 這種架構已經從 GICv1 發展到最新版本的 GICv3 和 GICv4。 Arm 擁有多個通用中斷控制器,可為所有類型的 Arm Cortex 多處理器系統提供一系列中斷管理解決方案。 這些控制器的范圍從用于 CPU 內核數較少的系統的最簡單的 GIC-400 到用于高性能和多芯片系統的 GIC-600。 GIC-600AE 針對高性能 ASIL B 到 ASIL D 系統增加了額外的安全功能。
2 gic的版本號
- gic400,支持gicv2架構版本。
- gic500,支持gicv3架構版本。
- gic600,支持gicv3架構版本
- gic700, 支持gicv4.1架構版本
本文涵蓋了大多數 Armv8-A 和 Armv8-R 設計使用的 Arm CoreLink GICv3 和 GICv4。
Arm CoreLink GICv3 和 GICv4 自發布以來也進行過小更新:
- GICv3.1 添加了對額外有線中斷、安全虛擬化和內存系統資源分區和監控 (MPAM) 的支持
- GICv4.1 擴展虛擬化支持以涵蓋虛擬軟件生成中斷 (SGI) 的直接注入
3 gic模型
通用中斷控制器 (GIC :Generic Interrupt Controller) 接收來自外設的中斷,對它們進行優先級排序,然后將它們傳送到適當的處理器內核。 下圖顯示了一個 GIC 從 n 個不同的外設獲取中斷,并將它們分配給兩個不同的處理器。
GIC 是 Arm Cortex-A 和 Arm Cortex-R 配置文件處理器的標準中斷控制器。 GIC 提供了一種靈活且可擴展的中斷管理方法,支持具有單核的系統到具有數百個核的大型多芯片設計。
4 gic的基礎知識
在本節中,我們將了解 Arm CoreLink GICv3 和 v4 中斷控制器的基本操作
4.1. 中斷類型
GIC 分為不同類型的中斷源:
- Shared Peripheral Interrupt (SPI) : 共享中斷
- Private Peripheral Interrupt (PPI) : 私有中斷
- Software Generated Interrupt (SGI) : 軟件產生中斷
- Locality-specific Peripheral Interrupt (LPI)
每個中斷源都由一個 ID 號標識,稱為 INTID。 前面列表中介紹的中斷類型就是根據 INTID 的范圍定義的:
4.1.1 外設給gic的中斷信號
傳統上,中斷是使用專用硬件信號從外設發送到中斷控制器的,如下圖所示:
GICv3 支持這種模型,另外還支持基于消息的中斷。 基于消息的中斷 message-based interrupt是通過寫入中斷控制器中的寄存器來設置和清除的中斷。
使用消息將中斷從外設轉發到中斷控制器消除了對每個中斷源的專用信號的要求。 這對于大型系統的設計人員來說可能是一個優勢,其中可能有數百甚至數千個信號可能通過 SoC 路由并匯聚到中斷控制器上。
中斷是作為消息發送還是使用專用信號對中斷處理代碼處理中斷的方式幾乎沒有影響。 可能需要對外圍設備進行一些配置。 例如,可能需要指定中斷控制器的地址。
在 Arm CoreLink GICv3 中,SPI 可以是消息信號中斷。 LPI 始終是消息信號中斷。 不同的寄存器用于不同的中斷類型,如下表所示( Message-based interrupt registers):
4.2. 中斷的狀態
中斷控制器為每個 SPI、PPI 和 SGI 中斷源維護一個狀態機。 這個狀態機由四個狀態組成:
- Inactive
The interrupt source is not currently asserted. - Pending
The interrupt source has been asserted, but the interrupt has not yet been acknowledged by a PE. - Active
The interrupt source has been asserted, and the interrupt has been acknowledged by a PE. - Active and Pending
An instance of the interrupt has been acknowledged, and another instance is now pending.
(注:如果是LPI,則 沒有Active或Active and Pending狀態)
中斷的生命周期取決于它是否配置為電平觸發( level-sensitive )或邊沿觸發(edge-triggered):
- 對于電平觸中斷,中斷輸入的上升沿導致中斷變為掛起狀態,并且中斷保持有效,直到外設取消中斷信號。
- 對于邊沿觸發中斷,中斷輸入的上升沿會導致中斷變為掛起狀態,但中斷不會保持有效。
4.2.1 點評中斷
如下展示了電平觸發中斷的信號的示例:
4.2.2 邊沿中斷
如下展示了邊沿觸發中斷的信號的示例:
4.3. Target interrupts :中斷affinity
Arm 架構為每個 PE 分配一個層次標識符,稱為affinity。 GIC 使用affinity來標記特定內核的中斷。
affinity是一個 32 位值,分為四個字段:
<affinity level 3>.<affinity level 2>.<affinity level 1>.<affinity level 0>
PE的affinity值是從MPIDR_EL1讀取的。
不同級別關聯的affinity含義由特定處理器和 SoC 定義。 例如,Arm Cortex-A53 和 Arm Cortex-A57 處理器使用:
<group of groups>. <group of processors>.<processor>.<core>
后來的設計,如 Arm Cortex-A55 和 Arm Cortex-A76 處理器中使用的設計,使用:
<group of processors>.<processor>.<core>.<thread
所有可能的節點都存在于單個實現中的可能性很小。 例如,用于移動設備的 SoC 可能具有如下布局:
0.0.0.[0:3] Cores 0 to 3 of a Cortex-A53 processor
0.0.1.[0:1] Cores 0 to 1 of a Cortex-A57 processor
注意:AArch32 狀態和 Armv7-A 只能支持三個級別的關聯。 這意味著使用 AArch32 狀態的設計僅限于關聯級別 3 (0.x.y.z) 的單個節點。 GICD_TYPER.A3V 表示中斷控制器是否可以支持多個三級節點。
4.4. 中斷的安全模型
Arm CoreLink GICv3 架構支持 Arm TrustZone 技術。 必須通過軟件為每個 INTID 分配一個組和安全設置。 GICv3 支持三種設置組合,如下表所示:
group 0 中斷始終作為 FIQ 發出信號。 group 1中斷以 IRQ 或 FIQ 的形式發出信號,具體取決于 PE 的當前安全狀態和異常級別,如下所示:
這些規則旨在補充 AArch64 安全狀態和異常級別的路由控制。 下圖顯示了一個簡化的軟件框圖,以及在 EL0 處執行時發出不同類型中斷信號時是怎樣處理的:
在這個例子中,IRQ 被路由到 EL1 (SCR_EL3.IRQ0) 而 FIQ 被路由到 EL3 (SCR_EL3.FIQ1) 。 考慮到上述規則,在 EL1 或 EL0 執行時,當前安全狀態的組 1 中斷被視為 IRQ。
其他安全狀態的中斷觸發 FIQ,并將異常處理到 EL3。 這允許在 EL3 執行的軟件執行必要的上下文切換。
4.4.1 中斷分組的配置
在配置中斷控制器時,軟件控制 INTID 到中斷組的分配。 只有在安全狀態下執行的軟件才能將 INTID 分配給中斷組。
通常,只有在安全狀態下執行的軟件才能訪問安全中斷的設置和狀態:group 0 和secure group 1。
可以啟用從非安全狀態到安全中斷設置和狀態的訪問。 這使用 GICD_NSACRn 和GICR_NSACR 寄存器為每個 INTID 單獨控制。
注意:LPI 始終被視為non-secure group 1中斷。
4.4.2 gic安全狀態的配置
GICv3 支持 Arm TrustZone 技術,但 TrustZone 的使用是可選的。 這意味著您可以將實現配置為具有單個安全狀態或兩個安全狀態:
- GICD_CTLR.DS == 0
Two Security states, Secure and Non-secure, are supported. - GICD_CTLR.DS == 1
Only a single Security state is supported.
將 GIC 配置為使用與連接的 PE 相同數量的安全狀態。 通常,這意味著 GIC 在連接到 Arm Cortex-A 配置文件處理器時將支持兩種安全狀態,當連接到 Arm Cortex-R 處理器時將支持一種安全狀態。
4.5. gic的組件和寄存器介紹
GICv3 中斷控制器的寄存器接口分為三類:
- Distributor interface
- Redistributor interface
- CPU interface
下面是一個GICV3模塊的結構框圖:
一般情況下,Distributor 和 Redistributor 用于配置中斷,CPU 接口用于處理中斷。
4.5.1 Distributor (GICD_*) 介紹
Distributor registers是memory-mapped,用于SPI中斷。它的作用主要有:
- SPI的中斷優先級和路由
- 啟用和禁用 SPI
- 設置每個SPI的優先級
- 每個SPI的路由信息
- 將每個 SPI 設置為電平敏感或邊沿觸發
- 生成message-signaled SPI
- 控制 SPI 的active 和pending 狀態
- 確定每個安全狀態中使用的模型:affinity routing或 legacy
4.5.2 Redistributors (GICR_*)介紹
一個Redistributor per connected連接一個 core,它的作用主要有:
- 啟用和禁用 SGI 和 PPI
- 設置 SGI 和 PPI 的優先級
- 將每個 PPI 設置為電平敏感或邊沿觸發
- 將每個 SGI 和 PPI 分配給一個中斷組
- 控制 SGI 和 PPI 的狀態
- 控制內存中支持相關中斷屬性和 LPI 掛起狀態的數據結構的基地址
- 為連接的PE提供電源管理支持
4.5.3 CPU interfaces (ICC_*_ELn)介紹
每一個Core都有一個cpu interface,它是通過memory-mapped或系統寄存器的方式來方式,它的作用為:
- 提供通用控制和配置以啟用中斷處理
- 確認中斷:Acknowledge an interrupt
- 執行優先級降低和中斷停用: priority drop 和deactivation
- 為 PE 設置中斷優先級掩碼
- 定義PE的搶占策略
- 確定 PE 的pending中斷的最高優先級
在 Arm CoreLink GICv3 中,CPU 接口寄存器作為系統寄存器訪問:ICC_*_ELn。
如果要通過系統寄存器的方式來訪問,那么必現enable 系統寄存器訪問的這個開關,通過ICC_SRE_ELn寄存器來控制。
4.5.4 GICD寄存器
4.5.5 GICR寄存器
4.5.6 GICR寄存器– SGI/PPI
4.5.7 cpu interface寄存器
5 gic寄存器的配置
對于Locality-specific Peripheral Interrupts (LPIs)中斷,它和Shared Peripheral Interrupts (SPIs)、Private Peripheral Interrupt (PPIs)、Software Generated Interrupts (SGIs)有太多的不同的地方,基本也用不到,本文就不詳細介紹了。
大多數使用 GICv3 中斷控制器的系統都是多核系統,也可能是多處理器系統。 有些設置是全局的,這意味著會影響所有連接的 PE。 其他設置特定于單個 PE。
然后我們看看全局設置,然后是每個 PE 的設置。
5.1. 針對全局的配置
GICD_CTLR 必須配置為啟用中斷組并設置路由模式如下:
- Enable Affinity routing (ARE bits):
GICD_CTLR 中的 ARE 位控制 GIC 是在 GICv3 模式還是legacy模式下運行。 legacy模式提供與 GICv2 兼容。 本文假設 ARE 位設置為 1,以便使用 GICv3 模式。 - Enables: GICD_CTLR 包group 0、secure group 1 和non-secure group 的單獨啟用位:
(1)、EnableGrp1S : enables distribution of Secure Group 1 interrupts.
(2)、EnableGrp1NS : enables distribution of Non-secure Group 1 interrupts.
(3)、EnableGrp0 : enables distribution of Group 0 interrupts.
注意:Arm CoreLink GIC-600 不支持legacy操作,并且 ARE 位永久設置為 1。
5.2. 針對每個PE的配置
下面再來看針對單個PE的配置
5.2.1 Redistributor配置
每一個Core都對應一個Redistributor
Redistributor 包含一個名為 GICR_WAKER 的寄存器,用于記錄連接的 PE 是在線還是離線。 中斷僅轉發給 GIC 認為在線的 PE。 復位時,所有 PE 都被視為離線。
要將連接的 PE 標記為在線,軟件必須:
- Clear GICR_WAKER.ProcessorSleep to 0.
- Poll GICR_WAKER.ChildrenAsleep until it reads 0.
軟件在配置 CPU 接口之前執行這些步驟很重要,否則行為可能是不可預測的。
當 PE 離線 (GICR_WAKER.ProcessorSleep==1) 時,針對 PE 的中斷將導致喚醒請求信號被斷言。 通常,該信號將進入系統的電源控制器。 然后電源控制器打開 PE。 喚醒時,該 PE 上的軟件將清除 ProcessorSleep 位,允許轉發喚醒 PE 的中斷。
5.2.2 CPU interface配置
CPU 接口負責向它所連接的 PE 傳遞中斷異常。 要啟用 CPU 接口,軟件必須配置以下內容:
(1)、Enable System register access
通過設置 ICC_SRE_ELn.SRE 就可以enable系統寄存器訪問的方式. 注意:許多最新的 Arm Cortex 處理器不支持legacy操作,并且 SRE 位固定為1。 在這些處理器上,可以跳過此步驟。
(2)、Set Priority Mask and Binary Point registers
CPU 接口包含優先屏蔽寄存器 (ICC_PMR_EL1) 和Binary Point registers (ICC_BPRn_EL1)。 優先級掩碼設置中斷必須具有的最低優先級才能轉發到 PE。 Binary Point registers用于優先分組和搶占。
(3)、Set EOI mode
CPU 接口中 ICC_CTLR_EL1 和 ICC_CTLR_EL3 中的 EOI mode 位控制如何處理中斷的完成。
(4)、Enable signaling of each interrupt group
每個中斷組必須先使能,然后該組的中斷才會通過 CPU interface轉發到 PE。 要使能中斷組,軟件必須針對 Group 1 中斷寫入 ICC_IGRPEN1_EL1 寄存器,針對 Group 0 中斷寫入 ICC_IGRPEN0_EL1 寄存器。 ICC_IGRPEN1_EL1 是根據安全狀態banked,這意味著 ICC_GRPEN1_EL1 控制當前安全狀態的group 1。 在 EL3,軟件可以使用 ICC_IGRPEN1_EL3 訪問Group 1 使能寄存器。
5.2.3 PE配置
- Routing controls - SCR_EL3 、 HCR_EL2
- Interrupt masks - PSTATE
- Vector table - VBAR_ELn
5.2.4 SPI, PPI and SGI的配置
- SPIs are configured through the Distributor, using the GICD_* registers.
- PPIs and SGIs are configured through the individual Redistributors, using the GICR_* registers
對于每一個中斷,軟件必需配置的:
- Priority: GICD_IPRIORITYn, GICR_IPRIORITYn
- Group: GICD_IGROUPn, GICD_IGRPMODn, GICR_IGROUPn, GICR_IGRPMODn
- Edge-triggered or level-sensitive: GICD_ICFGRn, GICR_ICFGRn
- Enable: GICD_ISENABLERn, GICD_ICENABLER, GICR_ISENABLERn, GICR_ICENABLERn
5.2.5 Arm CoreLink GICv3.1 and the extended INTID ranges
5.2.6 Setting the target PE for SPIs
6 中斷處理
6.1. Routing a pending interrupt to a PE
- Check that the group associated with the interrupt is enabled
- Check that the interrupt is enabled
- Check the routing controls to decide which PEs can receive the interrupt.
routing is controlled by GICD_IROUTERn,An SPI can target one specific PE, or any one of the connected PEs - Check the interrupt priority and priority mask to decide which PEs are suitable to handle the interrupt
Each PE has a Priority Mask register, ICC_PMR_EL1, in its CPU interface - Check the running priority to decide which PEs are available to handle the interrup
Only an interrupt with a higher priority than the running priority can preempt the current interrupt
6.2. Taking an interrupt
6.2.1 Example of interrupt handling
6.3. 運行優先級和搶占:Running priority and preemption
6.4. 結束一個中斷
- Priority drop - 將中斷優先級降到中斷產生之前的值
- Deactivation - 將中斷從active變成inactive
在gicv3中,drop和deactivation通常是一起打開的。
ICC_CTLR_ELn.EOImode = 1: 通過寫ICC_EOIR0_EL1、ICC_EOIR1_EL1讓drop and deactivation同時生效
ICC_CTLR_ELn.EOImode = 0: 通過寫ICC_EOIR0_EL1、ICC_EOIR1_EL1讓drop生效,寫ICC_DIR_EL1讓deactivation生效,這在虛擬化中會用到.
大多數的軟件系統中 EOIMode0,而下hypervisor的系統中 EOIMode1
6.5. Checking the current state of the system
6.5.1 Highest priority pending interrupt and running priority
6.5.2 State of individual INTIDs
7 Sending and receiving Software Generated Interrupts
7.1. Generating SGIs
- PE在secure執行時,可以產生secure和non-secure的SGI;
- PE在non-secure執行時,也是可以產生secure的SGI,但是取決于GICR_NSACR寄存器的配置,該寄存器只能在secure中讀寫
7.2. 對比GICv3和GICv2
在gicv2中,SGI INTIDs對于originating PE和the target PE是banked
在gicv3中,SGI僅僅對target PE是banked
在gicv2中同時收到兩個SGI=5中斷,兩個中斷都會被PE處理。
而在gicv3上,由于originating不是banked,所有前一個SGI=5中斷將會丟失。PE只能收到一個
8 Example
9 Appendix: Legacy operation
- When ARE==0, affinity routing is disabled (legacy operation)
- When ARE==1, affinity routing is enabled (GICv3 operation)
總結
以上是生活随笔為你收集整理的06-GICv3_v4_overview的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 05-异常模型
- 下一篇: 07-Armv8-A virtualiz