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