PCIe MSI-X 中斷編程

1. 前言

當前數據中心服務器,CPU基本都是基於PCIE總線和各種設備(例如,內存、顯卡和網卡等)相連。而各種PCIE設備采用 MSIX(Message Signaled Interrupt eXtended - 基於消息的信號中斷擴展)將中斷信號發送給CPU。我們知道MSI最多支持32個中斷向量號,而MSI-X中斷向量數目最大為2048。那我們編程時如何獲取、申請、控制這些中斷向量資源呢,本文將為你揭開神秘的面紗。

2. MSI-X Capability

基於lscpi 命令可以輕易獲取到當前系統中PCI 設備的能力,而MSI-X 能力是PCIE設備眾多能力中的一個。下面將基於網卡設備查看其 MSI-X Capability配置。

2.1 Capability配置

  • 查看系統中的PCIE網卡設備
  • # lspci | grep Eth
  • 查看 PCIE 設備 1a:00.0 的MSI-X Capability
  • # lspci -s 1a:00.0 -vvv

lspci -s <BDF> -vvv 顯示pcie設備配置空間信息

從上圖PCIE設備的配置空間信息可以看出,該PCIE設備支持兩個Bar地址空間(Region 0 & Region 3),

  • Bar0:總線地址起始位置為 0x98000000, 總大小時 16MB
  • Bar3:總線地址起始位置為 0x9a018000, 總大小時 32KB
  • MSI-X :中斷能力 為 Enable 狀態,支持 129 中斷向量號
  • MSI-X Vector Table:位於 Bar3,起始地址或 offset 為 0
  • MSI-X PBA (pending table):也位於Bar3,但起始地址為 0x00001000

下圖展示瞭MSIX Capability在配置空間中的位置,其大小為3個DWORD,即12字節:

1365f65199e87e2948b9a395dabc7948

2.2 Capability標準

上圖第二個紅框關於MSI-X Capability的標準如下:

  • 第1個DWORD 0x068位置:關鍵是 16~26 bit,存放著 Vector Table 的Size,最大為0x7FF,共11位,所以可知一個 PCIE function 最多隻能支持 2的11次方,即2048個中斷號。

9c117633f5d10987cc3d3c346175bdce

  • 第2個DWORD 0x06C位置:3~31 位是 MSI-X Table位於Bar空間的起始位置

40e3366df4eaeb7835cb44989a4485f5

  • 第3個DWORD 0x06D位置:3~31 位是 MSI-X PBA位於Bar空間的起始位置

如何獲取MSIX Capability的信息呢?下面將基於內核代碼解釋讀取第一個DOWRD 中 Size of the MSI-X Table(即中斷向量總數 Vector Number )的過程。

2.3 編程獲取Capability

可以基於接口 pci_read_config_word 來讀取PCIE EP(end point)設備的配置空間信息。下面代碼用該接口讀取MSIX Capability 的第一個DWORD 中的Message Control(16~31 位),從而獲取到當前 PCIE EP 真實支持中斷號數量。例如上面PCIE 網卡設備的 num_vectors 為130(129+1)。

#include <linux/pci.h>

/* MSI-X registers (in MSI-X capability) */
#define PCI_MSIX_FLAGS 2 /* Message Control */
#define PCI_MSIX_FLAGS_QSIZE 0x07FF /* Table size */

struct pci_dev *pdev = pci_dev;
u16 msix_config;
int num_vectors;
// pdev 為 PCIE 設備,pdev->msix_cap為設備配置空間中MSIX Capability的起始位置(PCI_MSIX_FLAGS表示讀取Message Control)
// 讀取到的 message control 寄存器放置於 msix_config 變量
pci_read_config_word(pdev, pdev->msix_cap + PCI_MSIX_FLAGS, &msix_config);
num_vectors = ((msix_config & PCI_MSIX_FLAGS_QSIZE) + 1);
pr_info("MSIX: num_vectors=%dn", num_vectors);

发表回复

相关推荐

淘宝千牛后台操作

1、千牛后台基本设置熟悉 2、消费者保障金缴纳 3、订单险与账期保障 4、子账号介绍和设置 5、发货和退货地址设置

· 34秒前

菠萝格多少钱一方?杭州

今天小编给广大用户介绍下目前近期的菠萝格价格。

· 1分钟前

針對“諾安事件”的一點看法!談談為什麼我多次建議大傢避開諾安這類基金!

最近諾安成長混合這隻基金儼然已經成為瞭一隻“網紅基金”瞭,熱度持續很久依舊絲毫未減。這支曾經凈值一度暴漲超過200%,出現...

· 2分钟前

杭州傑仕健身(星光城店)維權退款全過程

歷時3個月(6月8日辦卡以後,9月30日全款退款到位)被傑仕健身套路後,終於全款到手。在此期間,妥協還是堅持,經歷瞭多次糾...

· 5分钟前

重装展新颜 启航新征程 | 平安银行深圳梅林支行喜迎重装开业

夏日和煦,生机勃勃。为进一步优化网点硬件设施,提升金融服务水平,改善客户体验,6月2日,平安银行深圳梅林支行重装开业, ...

· 5分钟前

Copyright 2015-2025 www.icpchaxun.com ©All Rights Reserved.