C6678的中斷控制器

2021-08-02 12:55:13 字數 2028 閱讀 8127

c6678

的中斷控制器

分兩層,一層是每個core內部的中斷控制器,這個叫interruptcontroller,簡寫intc;一層是整個晶元的,屬於晶元級的,在每個core的外面,這個叫chip-level interrupt controller,縮寫cic。

分兩層其實兩層功能也不同,這個不用細說,intc可以直接處理一些中斷,這些是每個核都同樣的,但是還有一些中斷,如果有需要不能讓所有的核都能看到,則這個時候就需要在所有的核外進行統一管理了,這個就是cic。在c6678上,cic可以進行中斷對映,這個功能就可以將一些中斷對映至希望接管的core上,而讓其他核感知不到這個中斷。對於c6678的cic可以管控的中斷一共最多可以有1024個,管控方式是可以將每個中斷通過配置,對映至256個channel中的某乙個,乙個channel上可以同時對映多個中斷,對映至同乙個channel的中斷,相互之間就是邏輯「或」的關係了,即如果其中任何乙個中斷產生,該channel均會上報中斷;system events至channel對映完了之後,還不能完成中斷的上報,還需要把這256個channel對映至host interrupt,host interrupt的數量最大也是256個。這個host interrupt的編號和cicx_outn是一一對應的,但是整個對應關係並不是從cic0開始按序號一邊編到最後的cicx,而是cic分多個,每個cic的out都是從out0開始編號。實際上cicx_outn到corepac的intc的輸入,是定死的,如下圖:

比如21行中的cic0_out,對於core0來說,core0的intc的system event21接的就是cic0_out(32 + 0 + 11 * 0),即cic0_out32啦,這個cic0_out32是不可能讓其他core來接管的;

同樣,對於core1來說,core1 intc的system event21接的就是cic0_out(32 + 0 + 11 * 1),即cic0_out43,這個cic0_out43同樣也只能由core1接管,不可能讓其他core來接管cic0_out43。其他類推。

因此對於從cic的輸入,到最後core可以處理的整個流程,有3個環節決定cic的輸入最終由哪個core來處理,這3個環節分別是:

1、  system interrupt到channel的map

2、  channel到host interrupt的map

3、  host interrupt到corepac intc的連線

之所以最後乙個叫連線,而不叫map,是因為這個level上確實不存在什麼map不map,而是直接連死的,如上面圖下的分析。而前面的兩個map中,真正算的上map的只能有1個,就是第乙個,system interrupt到channel的map,因為這個level是可以配置的,可以隨意配置,而第二個map,即channel到host interrupt的map實際上是硬體固定的,但是有乙個map狀態暫存器可以查詢。第三個也是硬體固定的,貌似跟第二個差不多,但是不叫map,至於原因,是因為這個level上連像第二級的對映查詢都沒有。

因此,需要將systeminterrupt配置至要處理的core能正確感知的話,主要是配置level1,即system interrupt到channel的map,而且需要根據level2和level3的關係來確定level1的配置,比如有乙個cic上連的中斷,如果我們希望這個中斷由core0來接管的話,那麼先確認core0可以相應那些cicx_outn,然後確認這個outn的host interrupt編號,此時便可以確認map到該host interrupt的是哪個channel了,再然後,將core0要接管的這個cic中斷map到對應的channel上即可,最後還需要幾個使能,包含cic輸入的使能、host interrupt的使能,以及intc對應的event使能。當然,並非所有的cic上的中斷都可以由core0來接管,因為可以對映到core0的中斷實際僅僅侷限於cic0上的,具體限制如下圖所示:

C6678的中斷控制器

c6678的中斷控制器 分兩層,一層是每個core內部的中斷控制器,這個叫interruptcontroller,簡寫intc 一層是整個晶元的,屬於晶元級的,在每個core的外面,這個叫chip level interrupt controller,縮寫cic。分兩層其實兩層功能也不同,這個不用細...

linux zynq 中斷控制器

一 zynq中斷說明 uart e0001000 第二個引數是中斷號。傳遞的過程中會區分是否為spi中斷,如果是spi中斷則加16,非spi則加32 所以在devicetree中的生成的中斷號是實際中斷號減去32 二 實際使用過程 pl端配置中斷控制in9 這樣我們在配置裝置樹需 pl int 這裡...

C6678多核應用的cache小測試

c6678多核之間在msmc中互動資料,缺省會用到l1d cache 資料一致性問題是很令人困擾的。小測試驗證了關於l1d cache 的linesize 是64byte 初始化 if dnum 0 然後在多核同步中斷程式中 test if dnum 0 else 如此測試條件下,兩個資料始終相差0...