close

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裝置的能力暫存器

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 kaivy2001 的頭像
    kaivy2001

    K的生活札記

    kaivy2001 發表在 痞客邦 留言(1) 人氣()