arm GIC介紹之四
GIC是ARM體系中重要的元件,在認識到GIC的組成和功能之後,瞭解到IRQ的大致流程,從硬體IRQ到來,到IRQ結束。我們實際在KERNEL裡面,或者在裝置驅動裡面處理的IRQ其實是軟體意義上的,那麼硬體的中斷和軟體的中斷如何聯絡起來的呢,大概的處理流程是如何呢?
這章我們介紹這部分內容。
GIC 中斷處理流程
我們希望理解概念和流程,總結認識和思路,所以程式碼細節上的解釋需要忽略掉。可以看程式碼細節,但是總結時候要去掉。畢竟,即使是自己看過了,過了一段時間再重新讀程式碼,也是有些陌生的。我們還是以圖開始。
我們在之前介紹“arm GIC介紹之一/二/三”:
http://blog.csdn.net/sunsissy/article/details/73791470
http://blog.csdn.net/sunsissy/article/details/73842533
http://blog.csdn.net/sunsissy/article/details/73842533
一直在強調,GIC上對物理的IRQ的處理,比如上圖,一個DEVICE_1上觸發一個IRQ,到GIC,HWIRQ為111,如果軟體側管理中斷不衝突的話,可以直接對映desc_irq 111,以此為結構並處理。但是實際中並不這麼完美。
比如圖中另外一個DEVICE,同時來了3個訊號,或者說,而這個裝置和GIC只有一個IRQ的物理連線通路,只能傳遞一個IRQ訊號,那麼這又如何表示和區分3個訊號呢,如何和CPU的軟體意義上的IRQ聯絡起來呢?
這就新增加了IRQ_DOMAIN的概念。
struct irq_domain {
struct list_head link;
const char *name;
const struct irq_domain_ops *ops; //callback函式
void *host_data;//this will point to irq_data, and contains gicd_base, info and so on.
/* Optional data */
struct device_node *of_node;//該interrupt domain對應的interrupt controller的device node
struct irq_domain_chip_generic *gc; //generic irq chip concept , we ignore this.
/* reverse map data. The linear map gets appended to the irq_domain */
irq_hw_number_t hwirq_max; //該domain中最大的那個HW interrupt ID
unsigned int revmap_direct_max_irq; //
unsigned int revmap_size; //線性對映的size,for Radix Tree map和no map,該值等於0
struct radix_tree_root revmap_tree; //Radix Tree map will use radix tree root node
unsigned int linear_revmap[]; //linear mapping lookup table, we will pay attention to it.
};
簡化後如圖:
總結來說,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 中斷處理流程例項
看下:
[email protected]_64_open:/
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
……
255: 0 GICv3 255 aal
361: 0 GICv3 361 ocp_cluster2
362: 0 GICv3 362 ocp_cluster2
389: 1 mt-eint 5 TOUCH_PANEL-eint
390: 0 mt-eint 6 11240000.msdc1 cd
392: 0 mt-eint 8 iddig_eint
400: 0 mt-eint 16 accdet-eint
560: 1 mt-eint 176 pmic-eint
IPI0: 7106 Rescheduling interrupts
IPI1: 7 Function call interrupts
IPI2: 196 Single function call interrupts
IPI3: 0 CPU stop interrupts
IPI4: 0 Timer broadcast interrupts
IPI5: 112 IRQ work interrupts
Err: 0
[email protected]_64_open:/
上面是從X20上看到interrupts。左側部分加粗體是硬體中斷號,右側對應的斜體數字是軟體看到的desc_irq對應的編號。
這裡面可以看到,以左側硬體中斷號為索引來說。上面是29和30號中斷,這個是PPI中斷型別,在這裡是CPU對應的TIMER,從這往後到362是SPI,在X20上支援384個硬體中斷號,所以多出來的389~560就奇怪了。我們後面介紹。
另外就是IPI訊息,這個比較少。
我們先分析下,硬體中斷號如何和軟體對應的。
首先:
在進入KERNEL之後,進行GIC初始化後,我們之前提到IRQ_DOMAIN的配置,提到以GIC為單位。那麼在這裡通過讀取引數獲取到支援的HARDWARE IRQ數目是384個,去掉其中16個SGI(不需要對映),新申請384-16個desc_irq,並且把IRQ_DOMAIN其它資料如基地址等都填好,掛到LIST上統一管理。在這裡,採用的是簡單的線性MAPPING,所以17到384這中間的硬體中斷號和軟體中斷號是一一對應的,打印出來:
第一個編號為16,最後一個編號為383的IRQ。
之後進行基本的irq_domain_associate_many。我們看下這裡做了什麼:
這裡名字上說是associate,其實是對這些IRQ做些分類的基本資訊填充,主要的是區分16~31號中斷的描述資訊,由於是PPI中斷,所以將其分流入口設定為handle_percpu_devid_irq。那麼其它一般的SPI 分流入口這裡都設定為handle_fasteoi_irq,而不是handle_level_irq或者handle_edge_irq。
相關推薦
arm GIC介紹之四
GIC是ARM體系中重要的元件,在認識到GIC的組成和功能之後,瞭解到IRQ的大致流程,從硬體IRQ到來,到IRQ結束。我們實際在KERNEL裡面,或者在裝置驅動裡面處理的IRQ其實是軟體意義上的,那麼硬體的中斷和軟體的中斷如何聯絡起來的呢,大概的處理流程是如何
arm GIC介紹之三
GIC_V3 初始化設定 在GIC 介紹之一和二中,可以看到GIC的邏輯結構和硬體框架。 那麼在初始化時候,需要將各個元件配置起來,Interrupt Controller中的Distributor,Redistributor,CPU Interface需要
國密SKF介面函式介紹之四:檔案管理函式
概述 檔案管理函式用以滿足使用者擴充套件開發的需要,包括建立檔案、刪除檔案、列舉檔案、獲取檔案資訊、檔案讀寫等操作。檔案管理系列函式如下表所示:表:檔案管理系列函式 函式名稱 功能 SKF_CreateFile 建立檔案 SKF_DeleteFile 刪除檔
arm GIC介紹之一
GIC是ARM架構中及其重要的部分,本文只在公開ARM對應資料基礎上,以MTK開發板為基礎整理。個人理解之後記錄,鞏固和加深認識,僅此而已,如果有錯誤,歡迎指出。 1. GIC的概述 看過SOC架構的同學知道,CPU接受外部的中斷處理請求,並進行處理,其實是一
Android官方架構組件介紹之應用(四)
怎麽 nbsp 註冊 bool 其他 info get inf prot 講一個項目常見的功能,友盟統計功能 例如一個項目有很多多modlue,每個裏面modlue都有Activity,Activity需要友盟統一,Fragment也需要友盟統計。一般做法就是繼承一個Bas
Memcached學習筆記之四:Memcache應用場景介紹
對於高併發高訪問的Web應用程式來說,資料庫存取瓶頸一直是個令人頭疼的問題。特別當你的程式架構還是建立在單資料庫模式,而一個數據池連線數峰 值已經達到500的時候,那你的程式執行離崩潰的邊緣也不遠了。很多小網站的開發人員一開始都將注意力放在了產品需求設計上,缺忽視了程式整體效能,可擴 展性等方面的考
.Neter玩轉Linux系列之四:Linux下shell介紹以及TCP、IP基礎
基礎篇 實戰篇 一、Linux下的shell 概述:每個人在成功登入LINUX後,系統會出現不同的提示符號,例如 $、~、#等,然後你就可以開始輸入需要的命令,若是命令正確,系統 就會依據命令的要求來執行,直到登出系統為止,在登入到登出期間, 輸入的每個命令都會經常解譯及
第18章 ARM Linux裝置樹之四(常用的OF API)
18.4 常用的OF API除了前文介紹的of_machine_is_compatible()、of_device_is_compatible()等常用函式以外,在Linux的BSP和驅動程式碼中,經常會使用到一些Linux中其他裝置樹的API,這些API通常被冠以of_字首
彙總(之四):交叉編譯工具鏈arm-none-linux-gnueabi-, Qt交叉編譯安裝和移植,Qt桌面版編譯安裝,QTcreator安裝和配置
4. QTcreator2.5.2安裝和配置 首先,從官網下載了qt-creator-linux-x86-opensource-2.5.2.bin檔案。 下面的安裝就比較簡單了,首先更改檔案屬性,使它可執行。 chmod u+x qt-creator-linux
Burp Suite工具使用之四-Sequencer模組介紹
hi,everyone! I’m using a request that the Burp Suite captured when I browsed to the MSN homepage today. The request is to an ad hosting
ARM GIC中斷控制器介紹
這幾天長三角爆發禽流感,搞的連菜市場都不敢靠近了,頗有點SARS的架勢,我真懷疑上帝是不是個程式猿,造人搞這麼多bug, H7N9的driver還沒寫好吧,害的我們只能不停的打patch,時不時來個oops。今天看了一個專家的解說:"H7N9基因有八節,其中H7的部分是來自浙江的野鳥, N9的部分是來自韓國
iOS開發筆記之四十八——gem、brew、rvm、bundle的相關介紹
一、相關概念 1、GEM的概念 gem其實就是RubyGems,RubyGems是一個包管理框架,提供了ruby社群的gem的託管服務,用於ruby軟體包的下載、安裝、使用;ruby的軟體包被稱為gem,包含了ruby應用或庫。 安裝RubyGems需要先下載安裝包
設計模式之四-Factory模式
無需 告訴 實現 比較 原則 更強 方便 可能 fprintf 簡單工廠模式 簡單工廠模式是工廠模式中最簡單的一種,他可以用比較簡單的方式隱藏創建對象的細節,一般只需要告訴工廠類所需要的類型,工廠類就會返回需要的產品類,但客戶端看到的只是產品的抽象對象,無需關心到底是
遊戲制作大致流程粗談之四
提升 理解 登陸界面 例子 部件 actor 專業 所有 團隊 這次來介紹一下遊戲開發團隊中的美工角色 遊戲美術設計師可以簡單的分為2D和3D兩類,2D即使用位圖等二維圖形制作遊戲;3D則是通過大型的3D遊戲引擎制作遊戲世界和各種物件的3D模型,並有計算機處理後得到真實感較
【只怕沒有幾個人能說清楚】系列之四:碰撞信息、觸發信息的檢測
col lis 至少 one ati spa nbsp 觸發 trigge 碰撞器分為三種: static collider 靜態碰撞器 rigidbody collider 剛體碰撞器 kinematic rigidbody
maven插件介紹之maven-jar-plugin
content letter post end version class pid 技術交流 cut maven-jar-plugin 插件的maven依賴為: <dependency> <groupId>org.apache.maven
與其放在電腦裏占內存,還不如拿出來幫助一群小白白之html篇之四
ext one mar solid ul li lis class eight seo <!doctype html><html><head><meta charset="utf-8"><title>無標題文檔&l
《C#圖解教程》讀書筆記之四:類和繼承
intern html pan 類中訪問 ted obj 小寫 his new 本篇已收錄至《C#圖解教程》讀書筆記目錄貼,點擊訪問該目錄可獲取更多內容。 一、萬物之宗:Object (1)除了特殊的Object類,其他所有類都是派生類,即使他們沒有顯示基類定義。
轉深入Java虛擬機 之四:類加載機制
method jre 聲明 常量 資源 inittest java開發 啟動 由於 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17881581 類加載過程 類從被加載到虛擬機內存中開始,到卸載出內存
談談環保問題之四-做環保的程序員
校園 -1 大學 bsp 服務 互聯網 沒有 普通 名片 一直想談談節制這個問題,俏皮一點來講,我們要做環保的程序員。 記得大學一年級那會,學校的政策是不讓學生用電腦,良苦用心怕我們沈迷網絡,考不過英語四級。也怪當時的手機還不是智能機,個別能上W