arm GIC介紹之一
GIC是ARM架構中及其重要的部分,本文只在公開ARM對應資料基礎上,以MTK開發板為基礎整理。個人理解之後記錄,鞏固和加深認識,僅此而已,如果有錯誤,歡迎指出。
1. GIC的概述
看過SOC架構的同學知道,CPU接受外部的中斷處理請求,並進行處理,其實是一個被動接受的過程,這樣好處是既能
保證主任務的執行效率,又能及時獲知外部的請求,從而處理重要的裝置請求操作。
如圖:
GIC的全稱為general interrupt controller,主要作用可以歸結為:
接受硬體中斷訊號,並進行簡單處理,通過一定的設定策略,分給對應的CPU進行處理。
這樣的圖比較簡單,可以看下在
這是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之間的關係,才將其邏輯圖表示成大家看到的。詳細的可以參考
2.硬體中斷的分類和GIC的組成
2.1 GIC_V2的介紹
我們知道了GIC的大致用途,那麼它包含了那些部分,如果工作的,有什麼特殊的地方呢。
OK,我們一個一個來。先來看下GIC的大致組成結構:
這是經典的GIC V2圖,實際上大家能看到的經典的圖也是這個。
2.1.1中斷源的分類
這裡面把硬體中斷源分為了3類:
SPI:這是shared peripheral interrupt , 這是常見的外部裝置中斷,也定義為共享中斷,比如按鍵觸發一箇中斷,手機觸控式螢幕觸發的中斷,共享的意思是說
可以多個Cpu或者說Core處理,不限定特定的Cpu。一般定義的硬體中斷號範圍
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 andpending 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的組成和功能也就明白了。
即將增加GIC介紹之二,暫存器說明......