arm gic 中斷控制器工作原理概述
linux pinctrl 裡面有個gpio抽象的中斷控制器與系統的gic中斷控制器級聯cascade
閱讀arm generic interrupter controller architecture specification,總結下
支援的中斷型別
平常工作接觸到的是ppi,sgi和spi,ppi和sgi是對某一個核的,spi是對所有核的,sgi一般是用來核間通訊
gic 的hw 分為簡單兩部分distributor和cpu interface(實際上還有int service 和 redistributor),下圖以是gic工作原理的簡化圖,distributor是隻有一個,cpu interface 每個核有一個,每個核可以通過一個private bus去訪問gic的暫存器
distributor 的功能包括(針對不同型別中斷可能支援的功能不同,如下只描述spi):
.中斷的優先順序控制(group0 group1)
.中斷的security 配置(secure non-secure)
.中斷的affinity配置(親核性 )
.中斷的level-edge sensitive
.對中斷active或者pending(state machine)
cpu interface的功能包括:
.中斷的ACK
.中斷的priority drop
.中斷在對應的security狀態執行(secure non-secure)
.中斷的deavtive
gic state machine
一般的中斷處理流程: 中斷的初始狀態是inactive,device assert 中斷後狀態變為pending如果這個時候priority security 條件都滿足的話cpu interface會ack to this interrupter,中斷的狀態變為active,系統讀取中斷號然後執行中斷,如果之後該device沒有再assert中斷的話,中斷的狀態就變為了inactive
device assert 中斷對於level-edge sensitive(配置在distributor)的中斷是不一樣的,這次想翻看gic文件的目的是想知道level sensitive的中斷gic會不會有device已經關掉中斷,gic還記錄著該中斷是pending的狀態,答案是不會