[gic]-ARM gicv2和gicv3的中断模型总结
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
文章目錄
- GICV2
- 1、gicv2的中斷模型
- 2、gicv2寄存器
- (1)、Distributor register
- (2)、CPU interface register
- 3、中斷處理的過程
- GICV3
- 1、gicv3的中斷模型
- 2、gicv3的寄存器
- 3、中斷處理的過程
★★★ 友情鏈接 : 個人博客導讀首頁—點擊此處 ★★★
GICV2
1、gicv2的中斷模型
在SOC中,中斷產生后,怎么講信息發送給CPU的呢,如下圖所示,畫了一個簡要說明:
ARM CORE只有4根線用于接受中斷,nIRQ、nFIQ、nvIRQ、nvFIQ. 未enable hypevisor時,我們只看nIRQ、nFIQ就可以了;
SOC中的所有中斷都接到gic上,然后gic再輸出nIRQ、nFIQ、nvIRQ、nvFIQ四根信號給ARM core;
ARM CORE在收到中斷信號后,會通過AXI總線去讀寫GIC的寄存器(軟件上是通過memory-map的方式去讀寫),繼而獲取是哪個中斷號產生的中斷。
當一個device需要使用中斷,該device會輸出一個中斷信號線,該中斷線會接到gic上,gic中的cpu interface組件中的GICC_IAR寄存器就會跟著發生變化, 例如:
指紋模組產生了一個中斷,該中斷線接到了gic上,gic收到該中斷后,相應的GICC_IAR寄存器就會發送變化。 這些都是由ASIC來設計的,例如我們由一個指紋中斷,中斷號是59,所謂的該中斷號是59,其實就是該引腳產生中斷信號后,相應的GICC_IAR寄存器會被寫入59數值。
2、gicv2寄存器
(1)、Distributor register
(2)、CPU interface register
3、中斷處理的過程
在中斷產生后,ARM Core接收到IRQ或FIQ信號會跳轉到ARM的IRQ/FIQ異步異常向量表.
該向量表是在linux kernel開機初始化時設置,在該向量表的處理中,會跳轉到gicv2的hander函數:gic_handle_irq()
我們剖析一下這段代碼:
irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);
irqnr = irqstat & GICC_IAR_INT_ID_MASK;
GIC_CPU_INTACK是0X0C,對應gicv2文檔中的GICC_IAR,也就是讀取gic中的物理中斷號
if (likely(irqnr > 15 && irqnr < 1021)) 如果是PPI/SPI中斷,則執行handle_domain_irq()
if (irqnr < 16)如果是SGI中斷,則會執行后面的handle_IPI()
GICV3
1、gicv3的中斷模型
在gicv3中,發生了很大的變化,原gicv2組件中的cpu interface移到了ARM Core中,
ARM Core通過系統寄存器的方式訪問cpu interface寄存器(msr/mrs指令),不再是memory-map方式了。
當然了,訪問destributor/redestributor還是通過memory-map方式.
gic同ARM Core的接口,也變成了AXI stream.
當有中斷進來時,gic組件會通過AXI Stream傳輸信息給cpu interface,cpu interface仲裁后,再將FIQ/IRQ信號發送給真正的ARM CORE.
2、gicv3的寄存器
gicv3有組件中:detributor、redetributor、its再gicv3中, cpu interface挪到了ARM Core中
gicv3的寄存器有兩種訪問方式:一類是通過memory-map方式訪問、一類是通過系統寄存器方式訪問;
- GICD 開頭的寄存器是detributor寄存器,只能通過memory-map方式
- GICR 開頭的寄存器是redetributor寄存器,只能通過memory-map方式
- GITS 開頭的寄存器是its寄存器,只能通過memory-map方式
- GICC 開頭的寄存器是cpu interface寄存器,可以通過memory-map方式
- ICC 開頭的寄存器是cpu interface寄存器,可以通過系統寄存器方式訪問 —— 對于cpu
interface寄存器,我們一般采取這種訪問
3、中斷處理的過程
在中斷產生后,ARM Core接收到IRQ或FIQ信號會跳轉到ARM的IRQ/FIQ異步異常向量表.
該向量表是在linux kernel開機初始化時設置,在該向量表的處理中,會跳轉到gicv2的hander函數:gic_handle_irq()
我們剖析一下這段代碼:
irqnr = gic_read_iar() 使用mrs指令讀取cpu interface寄存器中的ICC_IAR_EL1寄存器,該寄存器記錄著物理中斷號;
if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) 如果是PPI、SPI、LPI中斷
if (irqnr < 16)如果是SGI中斷,則會執行后面的handle_IPI()
總結
以上是生活随笔為你收集整理的[gic]-ARM gicv2和gicv3的中断模型总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [trustzone]-ARMV8的aa
- 下一篇: optee的异常向量表-(irq,fiq