鐵人賽
首先簡單複習昨日所介紹的,在繼續將剩餘的介紹完畢,先前我們有介紹,對於 APLIC 支持的每個 interrupt domain,都有一個專用的 memory mappped 控制區域用於管理該 domain 中的 interrupt 。
此控制區域的大小是 4 KB 的倍數,並與 4 KB 地址邊界對齊。最小的有效控制區域為 16 KB,接下來我們來詳細介紹這前16 KB的暫存器。補充一下 IDC 結構是從 0x4000 開始具體有哪些暫存器可以觀看前一天的文章,或後一天我們將更詳細介紹他們。
以下照片是 domaincfg 的格式:
IE (Interrupt enable) 用途為 interrupt domain 的所有 active interrupt 啟用,當 IE = 1 時,pending 以及 enable bit 的 interrutp 才會真正發送 signal 或轉發到 hart。
DM(Delivery mode) 是 WARL,它決定了該 interrupt domain 如何將 interrupt 傳遞給 hart。DM 有可能下面兩個值
在 direct delivert mode,interrupt 被優先處理並由 APLIC 直接向 harts 發出 signal。
在 MSI delivery mode,interrutp 由 APLIC 轉為 MSI 再轉發到 hart,(是由 IMSIC 接收)。
如果 interrupt domain 的 harts 具有 IMSIC,則這些 IMSIC 的相關 interrutp file 的 register: eidelivery 須為 0x40000000,否則將 DM 設置為零。
BE (big-Endian) ,是 WARL,它確定 interrupt domain 的暫存器 byte 的順序, 如果 BE = 0,表示 byte 順序為 little-endian,如果 BE = 1,表示為 big-endian (little-endian 與 big-endian 差異)。
在系統重置時,domaincfg 中的所有可寫位都被初始化為零,包括 IE
sourcecfg 控制 interrupt domain 中 source i 以及 source 到 child domain 的任何委派。當 source i 未實現,或出現在該 domain 中未實現時,sourcecfg[i] 為只讀零。
Child Index 是 WLRL ,指定該 source 被委派到哪個 interrupt domain。
如果 interrupt domain 在 domain hierarchy 中沒有 child domain,則該 domain 當中任何 sourcecfg 暫存器中 D 不能設 1。
SM(source mode) 是 WARL,控制 interrupt source 是否在該 interrutp domain 處在 active 的狀態。
下圖為 SM value 所代表狀態意義
每當 interrupt source i 在 interrupt domain 中處於 inactive 狀態時,該 domain 中相對應的 interrupt pending 和 interrupt enable 都是只讀零, target[i] 也是只讀零。
如果 source i 從 inactive 模式更改為 active 模式,則 pending bit 和 enable bit 還是保持零。
對於 machine level 的 interrupt domain 暫存器 mmsiaddrcfg and mmsiaddrcfgh 將提供傳出的 MSI 地址參數。
如果 APLIC 的 interrupt domain 沒有支援 MSI delivery 模式,則此兩個 register 沒有作用。
mmisaddrcfg
格式如下:
mmsiaddrcfgh
格式如下:
mmsiaddrcfgh
(high base) 以及 mmsiaddrcfg
(low base) 連接成一個 44 bit 的 base。
當 mmsiaddrcfg 和 mmsiaddrcfgh
可寫時,除了 L bit 其他皆是 WARL。
當在 mmsiaddrcfgh
的 bit L 被設為 1 時,則 mmsiaddrcfg and mmsiaddrcfgh
被 lock,並且忽略對該暫存器的寫入,使其暫存器只可讀。當 L = 1 時,mmsiaddrcfg
和 mmsiaddrcfgh
中的其他字段可以選擇全部讀為零。在此 case 情況下,當 root domain 首次設置 L,且其他 bit 為非 0 時,他們的值會在 APLIC 內部保留,但如果透過讀取 mmsiaddrcfg 和 mmsiaddrcfgh
將不可再見到這些值。
如果 smiaddrcfg
和 smsiaddrcfgh
也被實現的話,將 mmsiaddrcfgh.L
設置為 1 也會鎖定 smsiaddrcfg 和 smsiaddrcfgh
。
對於 root domain, L 在系統重設時初始化為 1 或 0,看 APLIC 的實作決定。如果初始時 L 為 1,則 APLIC 有不同的方法來確定 MSI 寫入的地址,在此情況下,mmsiaddrcfg 和 mmsiaddrcfgh
中的其他字段可能都讀為零,因此 mmsiaddrcfg
和 mmsiaddrcfgh
可能為 0x0 或是 0x80000000。
對於 M level, smsiaddrcfg 和 smsiaddrcfgh
可以選擇 S level 所使用的參數,用來寫入傳出 MSI 的地址參數
如果 domain 實現 mmsiaddrcfg 和 mmsiaddrcfgh
並且 APLIC 具有 S level interrupt domain 則 smsiaddrcfg 和 smsiaddrcfgh
由 domain 實現。
當 smisadrcfg 實現時,具有以下格式
以及當 smsiadrcfgh 實現時,具有以下格式:
如果 domain 當中的 mmisaddrcfgh
的 L bit 被設為 1 時,則 smisaddrcfg 和 smsiaddrcfgh
與 mmisaddrcfg 和 mmisaddrcfgh
一起被鎖定為只讀。
讀取或寫入 setip[k] 可以修改 interrupt source k*32
到 k*32+31
的 pending bit。對於該範圍內所實現的 interrupt source i,source i 的 pending bit 位於 (i mod 32)的位置。讀取 setip 會回傳相對應的 interrupt source 的 pending bit,假設該 interrupt source 並未實現,則讀取 setip 相對應的位置為 0。
在寫入 setip 時,對於寫入的 32 bit 中的每位 bit 表示,該位置是否為 active interrupt source ,假設為 active interrupt source ,則該 pending bit 設為 1。
如果 i 是 interrupt domain 當中的 active interrupt source number,則將 i 寫到 setipnum 會讓 pending bit設為 1。
如果寫入的值不是 interrupt domain 當中的 actvie interrupt source,則忽略 setipnum 的寫入。
讀取 clrip[k] 回傳 interrupt source k*32
到 k*32+31
的校正輸入值,而寫入 clrip[k] 會修改相同 source 的 pending bit。
在寫入 clrip 時,對於寫入的 32 bit 值中為 1 的每個 bit,如果該 bit 位置對應於一個 active interrupt source ,則該 source 的 interrupt pending bit 會被清除。
如果 domain 當中 i 是 active interrupt source number,則將 i 寫入 clripnum 會使 source i 的 pending bit 清除。
如果寫入的值不是 domian 中的 active interrupt source number,則忽略 clripnum 的寫入。
讀取或寫入 setie[k] 可以修改 interrupt source k*32
到 *32+31
的 enable bit。對於該範圍內所實現的 interrupt source i,source i 的 enable bit 位於 (i mod 32)的位置。讀取 setie 會回傳 相對應的 interrupt source 的 enable bit,假設該 interrupt source 並未實現,則讀取 setie 相對應的位置為0 。
在 寫入 setie 時,對於寫入的 32 bit 中的每位 bit 表示,該位置是否為 active interrupt source ,假設為 active interrupt source ,則該 enable bit 設為 1。
如果 i 是 interrupt domain 當中的 active interrupt source number,則將 i 寫到 setienum 會讓 enable bit設為 1。
如果寫入的值不是 interrupt domain 當中的 actvie interrupt source,則忽略 setienum 的寫入。
讀取或寫入 clrie[k] 可以修改 interrupt source k*32
到 *32+31
的 enable bit。對於該範圍內所實現的 interrupt source i。
在 寫入 clrie 時,對於寫入的 32 bit 中的每位 bit 表示,清除該 source 的 enable bit。
讀取 clrie 總是回傳 0。
如果 i 是 interrupt domain 當中的 active interrupt source number,則將 i 寫到 clrienum 會使 enable bit被清除。
如果寫入的值不是 interrupt domain 當中的 actvie interrupt source,則忽略 clrienum 的寫入。
暫存器 setipnum_le 的作用與 setipnum 相同,只是 byte順序為 little-endian。
對於只有 big-endian 且 domaincfg BE 為1 的系統,不需要實現 setipnum_le。
setipnum_le 可用於 MSI 的寫入 port。
暫存器 setipnum_be 的作用與 setipnum 相同,只是 byte順序為 big-endian。
對於只有 big-endian 且 domaincfg BE 為 0 的系統,不需要實現 setipnum_be。
當 domaincfg DM(delivery mode)=1,genmsi 可用於從APLIC 向 hart 發送 MSI。
主要目的是幫助在 hart 寫入 APLIC 的暫存器,和將 MSI 從 APLIC 傳輸到 hart 之間建立一個臨時的已知順序。
出於各種目的,向 hart 發送 MSI 通常最好是透過直接寫入 IMSIC 來完成,而不是使用 APLIC 作為中介。應盡量減少使用 genmsi 以避免它成為瓶頸.
下圖為 gensmi 的格式:
對於 machine level interrupt domain,一個 MSI 被發送到 machine level 的目標 hart,而對於 supervisor level interrupt domain 一個 MSI 被發送到 supervisor level 的目標 hart。
APLIC 應該以最小的延遲來發送 MSI,一旦 MSI 離開 APLIC,並且 APLIC 接受對 genmsi 的新寫入,以獲取另一個 MSI,此時 busy bit 回復成 0。當 busy bit 為1時,寫入 genmsi 將被忽略。
MSI 不受 domaincfg 的 IE bit 影響。即使 domaincfg IE = 0,也會發送一個 MSI。
當 interrupt domain 配置為直接傳遞模式(domaincfg DM = 0)時, genmsi 為只讀零。
如果 interrupt source i 在 domain 當中處於 inactive,則 target[i] 只讀0,如果 interrupt source i 處於 active,則 target[i] 要確定向哪個 hart 發送singal。
下圖格式為當 interrupt source 為 active 狀態,且 direct delivery 模式(domaincfg DM = 0):
Hart Index 表示將要送到哪個 hart
IPRIO(interrupt priority) interrupt source的優先級的編號,允許的範圍值為 1 到 2^IPRIOLEN − 1 。
較小的優先級數字表示較高的優先級。當 interrupt source 具有相同的優先級編號時,具有最低標識號的 source 具有最高優先級。 (數字越低 priority 越高)
下圖格式為 當 interrupt source 為 active 狀態,且為 MSI 模式(domaincfg DM = 1)
Hart Index表示將要送到哪個hart
如果 interrupt domain 處於 S level 且該 domain 的hart 實現了 hypervisor extexnsion,則 Guest Index 是 WLRL 且能夠保留 0 到 GEILEN 的所有值 (GEILEN 由Privileged Architecture’s hypervisor extension定義的),否則 Guest Index 只讀0.
hart index 和 guest index 用來確認轉發的 MSI 的地址。
EIID(external interrupt ID)指定這些 MSI 的data value,最終成為 target hart external interrupt的次要ID。
今日介紹了 APLIC ,memory mapped 各種暫存器,明天來介紹 IDC 架構。