MSI : Message Signaled Interrupts (訊息驅動中斷)
@ 簡介
MSI 是PCI Express 中定義的原生中斷產生方式
其方式是裝置為透過寫入一個特定的記憶體位址到根聯合體(Root Union)來觸發中斷
在使用MSI之前,Host 與Device必須先透過Configuration 設定
協議好MSI 所對應的記憶體位址
@ 使用MSI來觸發中斷的好處
1) MSI並不需要額外的硬體線路(有效減少接腳數)
2) 每個裝置能夠用有更多的中斷(MSI 最多可擁有32個中斷向量, MSI-X則可到2048個中斷向量, 傳統的中斷每張卡只有4個中斷, 且與其他裝置共享)
3) 透過裝置寫入的記憶體位址即能夠區別觸發中斷的裝置
4) 避免硬體中斷線路與DMA記憶體存取所造成的相競現象
@ MSI的種類
1) MSI: 定義於PCI 2.2的規範中,允許一個裝置能夠擁有1,2,4,8,16,32 個中斷向量
2) MSI-X:
定義於PCI-3.0中,該規範允許裝置最多支援到2048個中斷向量。 原本的MSI使用單一位址的方式被發現在某些平台上有所限制。
MSI-X允許為每一個中斷配置一個獨立的記憶體位址與訊息資料。 MSI-X的裝置並不一定要支援到2048個中斷,但至少要支援64個中斷。
此外,MSI-X也一定要支援64位元定址與裝置遮罩
@ 啟用流程:
1) 啟動時搜尋裝置的組態設定,並找出Capability ID==0x5h的MSI Capability暫存器,
若找不到則表示該裝置不支援MSI
2) Host AP 寫入一個Double Align的記憶體位址到MSI Capability暫存器的
訊息位址暫存器,這個位址即為裝置觸發MSI中斷所需的目標記憶體位址
3) Host AP 檢查其訊息控制暫存器,檢查是否支援多重訊息 (事件的各數)?
4) 組態設定軟體配置等於或小於裝置要求個數的訊息給裝置 (至少1個)
5) 組態設定軟體將訊息資料基底(Message Data Base)寫入裝置的訊息資料暫存器(Message Data register)
假設該裝置支援多組訊息時,第一組的MSI Vecotr為 Message Data ,之後的MSI vector則依序+1
ex: event 0: 0x0500h, event 1 : 0x0501h, event 2: 0x0502h ...
當裝置要送出MSI中斷時,則必須將對應訊息寫入到Message Address Register所指定的位址
6) 設定裝置的Message Control Register的MSI Enable bit 來啟用MSI
@ Linux 程式碼: drivers/pci/msi.c
msi_capability_init :: 設定MSI裝置的能力暫存器