GIC是ARM架構中及其重要的部分,本文只在公開ARM對應資料基礎上,以MTK開發板為基礎整理。個人理解之后記錄,鞏固和加深認識,僅此而已,如果有錯誤,歡迎指出。
1. GIC的概述
看過SOC架構的同學知道,CPU接受外部的中斷處理請求,并進行處理,其實是一個被動接受的過程,這樣好處是既能
保證主任務的執行效率,又能及時獲知外部的請求,從而處理重要的設備請求操作。
如圖:
GIC的全稱為general interrupt controller,主要作用可以歸結為:
接受硬件中斷信號,并進行簡單處理,通過一定的設置策略,分給對應的CPU進行處理。
這樣的圖比較簡單,可以看下在ARM完整的SOC結構中,其位置是什么樣的:
這是ARM比較新的架構圖,其中CORELINK CCI-500是片上互聯總線,也就是AMBA,在這總線上面掛了不同的設備。比如NIC-400設備,這可以理解為network interface設備,在這個設備上使用者可以再連接其它需要的器件。那么cpu,也就是cortex-72(大核)和cortex-53(小核)也是掛在總線上。上接GIC-500,也就是我們說的中斷控制器,這個圖其實是邏輯上的,實際中,GIC-500也是有線連接到CCI-500上,通過CCI-500和cpu連接交互,ARM的Distributor應該是為表示cpu和GIC之間的關系,才將其邏輯圖表示成大家看到的。詳細的可以參考ARM的官方網站介紹。
2.硬件中斷的分類和GIC的組成
2.1 GIC_V2的介紹
我們知道了GIC的大致用途,那么它包含了那些部分,如果工作的,有什么特殊的地方呢。
OK,我們一個一個來。先來看下GIC的大致組成結構:
這是經典的GIC V2圖,實際上大家能看到的經典的圖也是這個。
2.1.1中斷源的分類
這里面把硬件中斷源分為了3類:
SPI:這是shared peripheral interrupt , 這是常見的外部設備中斷,也定義為共享中斷,比如按鍵觸發一個中斷,手機觸摸屏觸發的中斷,共享的意思是說
可以多個Cpu或者說Core處理,不限定特定的Cpu。一般定義的硬件中斷號范圍31~1019.
PPI:這里指的是private peripheral interrupt,16~31,私有中斷,為什么這樣說呢,這些中斷一般是發送給特定的Cpu的,比如每個Cpu有自己對應的Physicaltimer,產生的中斷信號就發送給這個特定的cpu進行處理。比如ARM_V8平臺上的:
在設備上,cat /proc/interrupts可以看到:
SGI:這個中斷有些同學遇到的比較少,software generatedinterrupt,軟件出發產生的中斷,中斷號范圍0~15,也就是最前的16個中斷。如果在X86平臺上做過開發工作的同學可能有影響,其實這就是相當于IPI,簡單的說Cpu_1要給Cpu_2發送特定信息,比如時間同步,全局進程調度信息,就通過軟件中斷方式,目標Cpu接受到這樣的中斷信息,可以獲取到信息是哪個Cpu發送過來的,具體的中斷ID是哪個數字,從而找到對應處理方式進行處理。比如MTK上的:
2.1.2 GIC的組成
這是硬件中斷的分類。
那么GIC控制器完成這樣的中斷信號收集和分發工作,也劃分了幾個功能部分,見上面第2個圖。包含2個部分:
Distributor和CPU interface.
Distributor:
The Distributor block performs interruptprioritization anddistribution to the CPU interface
blocks that connect to the processors in the system. The Distributor blockregisters are identified by the GICD_ prefix
The Distributor provides a programminginterface for:
? Globally enabling the forwarding of interrupts to the CPU interfaces.
? Enabling or disabling eachinterrupt.
? Setting the priority level of each interrupt.
? Setting the target processor list of each interrupt.
? Setting each peripheral interrupt to be level-sensitive oredge-triggered.
? Setting each interrupt as either Group 0 or Group 1.
CPU Interface:
Each CPU interface block provides theinterface for a processorthat is connected to the GIC. Each CPUinterfaceprovides
a programming interface for:
? enabling the signaling of interrupt requests to the processor
? acknowledging an interrupt
? indicating completion of the processing of an interrupt
? setting an interrupt priority mask for the processor
? defining the preemption policy for the processor
? determiningthe highest priority pending interrupt for the processor .
這是其英文解釋,其實總的來說:
Distributor,做為一個中斷路由的設備,主要完成工作:
對整個中斷控制器設備的使能等操作。
對每一個中斷的優先級控制。
對每一個中斷的觸發方式設置。
對沒一個中斷的目標發送CPU進行設置,決定分發到哪個具體的CPU上進行處理。
對中斷的去向,是到G0還是G1,這個是安全域的概念。我們后面補充GIC V3和V4的概念再展開說。
記錄每個中斷的狀態,是否到來,是否處理中,是否處理完,是否在等待發送狀態等等。
那么,CPUInterface主要工作是:
使能和發送一個具體的中斷信號到特定對應的CPU上,
確認具體中斷已經被CPU接受,處理,以及處理完成。
設置cpu能接受的中斷的優先級別。以及對應的基于級別的中斷搶斷等處理。
所以,從第二個圖來說。中斷信號先到Distributor,然后根據設定目標CPU,送到CPU對應的Interface上,在這里仲裁是否優先級足夠高,
是否可以搶斷或者打斷當前的終端處理等,如果可以,那么CPU Interface就發送一個物理的SIGNAL到CPU的IRQ接線上,CPU感知到中斷信號,
從而轉到中斷模式進行處理。
那么途中帶*號的IRQ和FIQ是什么意思呢?
FIQ是Fastinterrupt request,這是ARM上定義的一種中斷處理方式,某些終端需要快速處理完成,在這種情況下,CPU會簡化操作,然后退出中斷。
那么從留向來說,途中是直接到CPU側的,沒有經過Distributor?
是的,我們說過,Distributor可以被使能,等各種操作,那么當其主功能暫時關閉了怎么辦呢,這就又了BYPASS功能,一個已將IRQ直接繞過它,
送到CPU側,在某些情況下這可以作為一個喚醒的信號源去WAKE UP 對應的CPU,或者可以設置成為X86上的NMI,也就是不可屏蔽中斷來處理。
2.2 GIC_V3的介紹
在現在市面上看到的手機或者其它設備產品中,既有老的V2版本的中斷控制器,也有比較新的V3結構的,而且是在不斷向后演進,我們有必要依照新的V3的來說明,畢竟,這是后面的趨勢,比如現在大家現在可以看到GIC_V4的介紹了。
好,我們切入正題,在之前介紹GIC_V2的基礎上我們擴展下。
在上圖中,我們在GIC_V3的基礎上整理出這樣的結構圖,其實主題結構和V2是大致一樣的,但是我們會發現,多了Redistributor這樣的組件,這是為啥呢?另外,我也也看到cpuinterface移到GIC外面了,為啥這樣表示邏輯圖呢?多出來的LPI這個中斷是做什么用的?
2.2.2 GIC中斷
其實,LPI解釋為LPI (Locality-specific Peripheral Interrupt)。
所有的中斷類型可以分為:
SGI:software generated Interrupt
軟件觸發的中斷,這個和之前解釋的一致。
PPI:Private Peripheral Interrupt
私有中斷類型,這個和之前解釋的也是一致。但是PPI直接到Redistributor,繞過, 這是因為增加的Redistributor一個是為LPI需要,特殊的中斷類型,既然PPI是各自CPU都有的,就沒必要再經過之前的Distributor
來分發了,這樣也導致了其中的寄存器等也做了修改。我們后面介紹寄存器時候再說明。
SPI:SharedPeripheral InterruptDistributor
共享外圍硬件中斷,這個也是和GIC_V2解釋一樣的ID32-ID1019。
但是,多了LPI(Locality-specific Peripheral Interrupt)
LPIs are new in GICv3, and they are different to the other types of interruptin a number of ways . In particular, LPIs are always message-based interrupts,and their configuration is held in tables in memory rather than registers.
這是一個基于消息的中斷類型,是ARM為后續的SERVER等產品做的擴展。
在傳統的GIC流程中如上圖,外圍設備的中斷觸發線是引出到GIC上的,這樣可以理解為一個物理的SIGNAL,比如一個高電平信號,邊沿觸發信號。
但是實際上在現在GIC_V3中,中斷可以依照MESSAGEBASED方式來觸發,外圍設備的終端信號先到INTERCONNECT(AMBA總線),然后片上總線再給GIC發送一個消息,這個作為一個IRQ來源,這就是基于消息的中斷的簡單解釋,當然這個需要總線,SOC等做調整適配,在這里我們不展開來說,有興趣的同學可以看看CCI-500等總線如何定義信號燈細節的。
我們這樣來表示下整個圖:
從ITS是Interrupt Translate service,如果我們只看圖右側的部分,X86上經典的PCI總線,經過一系列轉換發送一個中斷到X86的CPU上,從而處理。那么現在我要直接把這部分搬到arm,由于體系架構不同,中斷控制器邏輯和流程都不一樣, X86對應APIC-IO 和Local APIC這樣的終端控制邏輯。
但是我們可以這樣來處理:
我們增加一個ITS,在這里定義好特定的消息,包含消息從哪里來的,比如PCI-ROOT,具體的設備編號,比如PCIe-endpoint對應的設備,可能是個音頻設備,或者簡單的按鍵,這都不是重點。關鍵是ITS可以根據定義好的配置,來把對PCI發來的中斷消息進行轉換,比如轉換成IRQ_ID:8200終端
這樣就可以發送到Redistributor上進行分發處理,和一般的IRQ類似,但是不經過Distributor,其中斷也沒有Pending狀態,如果處理不過來丟失了那就丟失了,不會特別的關注。
從現在我們看到的資料來說,還沒有看到LPI的具體應用,但是ARM已經在在很多方面為SERVER的架構做了調整,這也是其中一個,所以在這里會提示下,但不是我們介紹的重點。
2.2.2 GIC的組成
我們在上面圖中,給出GIC_V3已經之后對應的邏輯圖,從中可以看到幾個部分:
Distributor
The Distributor registers arememory-mapped, and contain global settings that affect all PEs
connected to the interrupt controller. The Distributor provides a programminginterface for:
· Interrupt prioritization and distribution of SPIs.
· Enabling and disabling SPIs.
· Setting the priority level of each SPI.
· Routing information for each SPI.
· Setting each SPI to be level-sensitive or edge-triggered.
· Generating message-based SPIs.
· Controlling the active and pending state of SPIs.
· Controls to determine the programmers’ model that is used in each Securitystate (affinity routing or legacy).
CPU Interface
Each Redistributor is connected to aCPU interface. The CPU interface provides a programming interface for:
· General control and configuration to enable interrupt handling.
· Acknowledging an interrupt.
· Performing a priority drop and deactivation of interrupts.
· Setting an interrupt priority mask for the PE.
· Defining the preemption policy for the PE.
· Determining the highest priority pending interrupt for the PE
Redistribute (V3,V4)
For each connected PE there is aRedistributor. The Redistributors provides a programming interface for:
· Enabling and disabling SGIs and PPIs.
· Setting the priority level of SGIs and PPIs.
· Setting each PPI to be level-sensitive or edge-triggered.
· Assigning each SGI and PPI to an interrupt group.
· Controlling the state of SGIs and PPIs.
· Base address control for the data structures in memory that support theassociated interrupt properties and pending state for LPIs.
· Power management support for the connected PE.
其實之前對應的Distributor 和CPU Interface也還是一致的,但是Distributor不再處理PPI這樣的中斷,PPI直接送到Redistribute來處理,另外Redistribute也會處理LPI類型中斷,其它邏輯上和我們之前介紹的是相似的,在這里不再重復。
2.3 IRQ生命周期
從GIC角度來說,一個中斷可以分為幾個階段,對應不同的狀態:
當GIC上配置的中斷,配置好之后,沒有其對應的中斷到來,或者之前處理的中斷已經完全結束了,這個可以表示為
Deactive狀態或者Inactive,如果中斷信號到來,GIC獲取到了,這個時候要經過一系列的的判斷,然后送給對應的CPU來處理,在CPU確認該中斷并處理之前,狀態是Pending,如果CPU獲取到了該終端確認要處理了,那么久變為Active狀態。這個時候,對應的GIC上終端信號線可能依舊有效,比如高電平觸發的終端信號還沒有被拉低,或者說又來一個同樣的終端,那就是Activeand Pending。
2.4 IRQ Group
在ARM中,新的架構上引入了EX的概念,如果Ex0/1/2/3,以及安全域和非安全域,這個我會在補充個Topic:TRUSTZONE來說明,或者大家也查看資料來理解ARM的工作模式,比如FIQ/IRQ等傳統模式。只是現在ARM淡化了這樣模式,使用Ex,exception level 0/1/2/3,比如我們看到的ANDROID APP就是在Ex0,也就是USER空間,Ex1是我們常見的KERNEL空間。Ex2是對應的Hypervisor,虛擬化對應的空間,那么Ex3就是最好的權限和異常級別,這里可以由各個芯片廠家自己定義來添加對應的如ATF底層功能。
另外還在CPU上劃分了SECURE 和NON-SECURE空間,這需要ARM對應的控制寄存器等來進行權限控制。
所以,IRQ的發到一個CPU上,還需要知道送到哪個Ex去處理,是送到KERNEL(Ex1)?還是安全域里面,這也在GIC里面進行配置,然后一個IRQ到來了才會往對應的寄存器里面發送。
OK,這概念比較抽象,我們在后面詳細介紹GIC主要的寄存器和功能時候,會介紹,如果能理解對應的寄存器和作用,那么GIC的組成和功能也就明白了。
上一篇:ARM40-A5應用——fbset與液晶屏參數的適配
下一篇:arm GIC介紹之四
推薦閱讀最新更新時間:2025-03-28 21:00


設計資源 培訓 開發板 精華推薦
- 應用示例 - STM32F101xx 和 STM32F103xx 內核和系統外設之一
- DC2254A-B,用于具有按鈕控制的 LTC2956-2 喚醒定時器的演示板
- DC538A,LTC3734EUH 演示板,單相 IMVP4 電源,Vin=7.5V 至 24V,Vout= 0.6V-1.75V@15A
- LTC3615EUF-1 雙路 3A 同步降壓型 DC/DC 轉換器用于軟啟動電路的典型應用
- PCF2129T 工業 TCXO RTC 的計時、CLKOUT、電源管理和時間戳應用
- 16 位、220KSPS、4 通道便攜式 DAC
- LT1185IT 低輸入電壓監視器的典型應用電路跟蹤壓差特性
- RDR-805 - 100 W USB PD 3.0,采用 3.3 V-21 V PPS 電源,使用 InnoSwitch3-Pro 和 VIA Labs VP302 控制器
- 具有穩壓輸出的 ADP3605 120 mA 開關電容電壓逆變器的典型應用
- LTC3219 演示板、250mA 通用九通道 LED 驅動器