gic是arm體系中重要的元件,在認識到gic的組成和功能之後,了解到irq的大致流程,從硬體irq到來,到irq結束。我們實際在kernel裡面,或者在裝置驅動裡面處理的irq其實是軟體意義上的,那麼硬體的中斷和軟體的中斷如何聯絡起來的呢,大概的處理流程是如何呢?
這章我們介紹這部分內容。
gic 中斷處理流程
我們希望理解概念和流程,總結認識和思路,所以**細節上的解釋需要忽略掉。可以看**細節,但是總結時候要去掉。畢竟,即使是自己看過了,過了一段時間再重新讀**,也是有些陌生的。我們還是以圖開始。
我們在之前介紹「arm gic介紹之一/二/三」:
一直在強調,gic上對物理的irq的處理,比如上圖,乙個device_1上觸發乙個irq,到gic,hwirq為111,如果軟體側管理中斷不衝突的話,可以直接對映desc_irq 111,以此為結構並處理。但是實際中並不這麼完美。
比如圖中另外乙個device,同時來了3個訊號,或者說,而這個裝置和gic只有乙個irq的物理連線通路,只能傳遞乙個irq訊號,那麼這又如何表示和區分3個訊號呢,如何和cpu的軟體意義上的irq聯絡起來呢?
這就新增加了irq_domain的概念。
struct irq_domain ;
簡化後如圖:
總結來說,irq_domain是以gic 為單位,乙個gic裝置對應乙個irq_domain, 從圖中可以看出,如果系統中有多個irq_domain,那麼會形成乙個list,統一管理。
irq_domain裡面包含了gic的基本資訊,比如host_data,可以儲存對應的distributor的基位址;最大的硬體中斷數目hwirq_max;如果是線性對映,那麼linear_revmap儲存了線性對映的關係;
當然,重要的irq_domain_ops裡面有對應的操作,eg:gic_irq_domain_map這就是如何把硬體irq和軟體處理側的desc_irq對應起來的。
只有這樣對映後,軟體側才方便以desc_irq單位對irq進行管理和處理,desc_irq如圖:
對每個desc_irq,不僅包含了乙個irq的基本資訊,也包含了對應的控制等資訊。
irq_data中,有乙個irq對應的硬體中斷號hwirq,對應的gic domain。當然irq_chip以及對應的api,提供了如何向gic寫入資訊比如表示irq處理結束寫入irq_eoi等等。
irq_action 裡面有中斷的處理入口,以及對應的具體函式handler。
這是在軟體處理層面的,有了這樣的介面和資訊,乙個驅動才可以獲得乙個desc_irq,把對應的irq註冊到裡面,並對觸發方式,是否mask進行控制,並找到對應的handler進行註冊和後續處理。所以從整個的流程來說我們給出這樣的邏輯結構,見下圖:
整個結構分為3部分,上面試driver,可以認為是使用者,中間是軟體的層面,最下面是hardware ,這裡重要的是中間的結構,為上層driver提供了irq的註冊介面request_threaded_irq,使能介面enable_irq,親和性或者說送到具體cpu處理的配置介面irq_set_affinity等,這裡不全部列舉。
那麼這些介面要具體配置到gic硬體的hardware上,在irq general logic中就有對應的 irq_set_chip,這裡面對應的操作會去執行和具體平台硬體相關的設定。不僅如此,當設定完成,允許中斷,如果來了乙個硬體中斷到hardware ,那麼也在irq general logic進行先處理,所以這提供雙向的service。會先irq_to_desc,找到對應的desc_irq,然後分類處理如果ipi走對應處理,如果是其它的走generic_handle_irq,這就轉到了左側的irq flow
control-layer 。
irq flow control-layer顧名思義,就是把眾多的接受到的中斷分流,如果是level觸發型別的,走handle_level_irq,上下沿觸發的走handle_edge_irq,不同的入口可能對eoi的寫入時機和方式有區別等等。再如handle_percpu_irq在處理時候,因為不涉及到其它cpu,所以對於多個cpu之間共享的操作就不需要lock做保護。然後再去找特定的每個驅動定義的handler處理。
gic 中斷處理流程例項
看下:shell@amt6797_64_open:/ sh
ell@
amt679764
open
:/cat /proc/interrupts
cpu0
29: 0 gicv3 29 arch_timer_sec_zhonghua
30: 50721 gicv3 30 arch_timer
96: 0 gicv3 96 mtk_cpuxgpt0
97: 0 gicv3 97 mtk_cpuxgpt1
……184: 45 gicv3 184 mtk_cmdq
188: 0 gicv3 188 m4u
201: 0 gicv3 201 mt-gpt
210: 0 gicv3 210 pmic_wrap
211: 0 gicv3 211 mtk-kpd
212: 0 gicv3 212 spm
231: 0 gicv3 231 scp ipc_md2host
234: 720 gicv3 234 mutex
這裡名字上說是associate,其實是對這些irq做些分類的基本資訊填充,主要的是區分16~31號中斷的描述資訊,由於是ppi中斷,所以將其分流入口設定為handle_percpu_devid_irq。那麼其它一般的spi 分流入口這裡都設定為handle_fasteoi_irq,而不是handle_level_irq或者handle_edge_irq。
arm GIC介紹之四
本文摘自 sunsissy 的 arm gic介紹之一 請大家多多尊重原創 一直在強調,gic上對物理的irq的處理,比如上圖,乙個device 1上觸發乙個irq,到gic,hwirq為111,如果軟體側管理中斷不衝突的話,可以直接對映desc irq 111,以此為結構並處理。但是實際中並不這麼...
ARM GIC(四) gicv3架構基礎
gicv3架構是gicv2架構的公升級版,增加了很多東西。變化在於以下 對於cpu inte ce的暫存器,增加系統暫存器訪問方式 一 gicv3結構 下圖是gicv3的架構。包含了以下的元件 其中,cpu inte ce是實現在core內部的,distributor,redistributor,i...
XML介紹之DTD約束語法詳解四
6.dtd 驗證 previous page next page internet explorer 5.0 可根據某個 dtd 來驗證您的 xml。通過 xml 解析器進行驗證 當您試圖開啟某個 xml 文件時,xml 解析器有可能會產生錯誤。通過訪問 parseerror 物件,就可以取回引起錯...