PCI規範學習筆記(2)

那天和一個朋友討論了一下MSI/MSIX方面的問題,下面是對討論內容的整理:

1.MSI-X Table和PBA結構太大,MSIX Capability又只能放到配置空間64-255這個區域,所以只能把Table和PBA放到設備內存空間了。MSIX Capability存着BAR的編號和偏移量來從配置空間索引Table和PBA。

2.
MSI capability裏“消息地址”字段在PCI規範裏沒有格式定義,這是因爲PCI規範需要支持多種平臺。在x86上和在SPARC上,消息地址的定義是不同的。

3. x86上MSI”消息地址“(64或32位)在Intel 系統編程卷裏定義,
Solaris是用本地APIC的基地址0xfee00000按位或8位目標處理器ID再或1位RH(取值0),或1位DM(取值0),得到的地址就是設備發中斷用的內存地址。

4. x86上MSI“消息數據”(16位)的定義比較簡單, Solaris使用邊緣觸發方式,投遞模式是固定,最後低8位是中斷向量地址。 關於“消息地址”和“消息數據”,Solaris請參考apic_pci_msi_enable_vector

5. 需要注意的是,MSI“消息數據"的低3位是要根據MSI控制寄存器的Multiple Message Enable位來由設備動態修改的,所以一個”消息數據“寄存器可以被最多32個向量共用。

6. MSI capability裏支持最多32個向量,但由於這32個向量共享一個“消息地址”。而在x86上,這個"消息地址"用來決定發送到哪一個CPU的本地APIC,所以32個向量只能綁定在同一個CPU了。

7. MSIX capability指向了Table和PBA表在哪一個BAR對應的內存空間裏。Table裏包含了“消息地址”和”消息數據“, x86下格式和MSI的完全一樣。PBA指示了是否有待處理的中斷消息。

8.
一 個設備理論上最多分配32個MSI中斷, 向量數大於1時,需要分配連續相鄰的向量,這是MSI capability裏”消息數據“和”Multiple Message Enable“的定義決定的。Solaris可參考apic_alloc_msi_vectors的實現。

9.
一個設備理論上最多可以分配2K個MSIX中斷, 而且每個中斷向量可以是不連續的, 因爲Table的大小是11位二進制表示的, 其中每個表項都有獨立的”消息地址“和“消息數據”。Solaris可參考apic_alloc_msix_vectors。

10. 因爲每個向量對應獨立的“消息地址”和“消息數據”, MSIX可以讓一個設備多至2K箇中斷獨立的綁定在不同的CPU上,CPU足夠多的時候它們互相不影響,所以Intel的SRIOV 1/10G卡的VF都只支持MSIX而不是MSI。

發佈了105 篇原創文章 · 獲贊 21 · 訪問量 72萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章