arm GIC介紹之四

2021-08-03 04:46:25 字數 3312 閱讀 4978

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 物件,就可以取回引起錯...