Kernel

linux如何知道應該使用哪個irq號?

  • April 25, 2019

我不是驅動程序程序員,我不清楚 linux 如何為 pcie 設備分配 irq 號。

從 NIC 驅動程序範例中,Linux 似乎在執行“probe”或“open”函式之前就已經知道應該使用哪個 irq 號。

例如:https ://github.com/torvalds/linux/blob/4608f064532c28c0ea3c03fe26a3a5909852811a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c#L6608

錯誤 = ixgbe_request_irq(適配器);

ixgbe 可以通過 ‘adapter’ 變數的數據獲取 irq 編號,這意味著 irq 值已經在適配器結構中,它不是生成的編號,它是一個已經存在的值。

如果從pci/pcie配置空間讀取,是不是很容易和其他設備衝突?

如果它是由核心生成/排列的,“適配器”變數中的 irq 號如何?(或者它是由 BIOS 分配的?)

對於 MSI 的中斷,它似乎是由核心生成的??

據我了解,應該從 PCIe 配置空間中的中斷線路寄存器(偏移 3Ch)中讀取 irq 編號,我猜這就是為什麼 kerenl 已經知道應該使用哪個 irq 編號,並且應該由 BIOS 更新中斷線路寄存器(我的猜測)在啟動期間,但仍然有一個虛擬 IRQ(當 lspci 沒有 -b 時),並且似乎 MSI 有另一個 irq(?),它們是公共資源,如要安排的記憶體嗎?

對於 legacy 中斷,irq 值是從配置空間讀取的,但是 irq 值主要由 BIOS 分配。

這部分的更多資訊:http: //tldp.org/HOWTO/Plug-and-Play-HOWTO-7.html

對於 MSI/MSI-X 中斷,它是通過分配來完成的。

例如:pci_alloc_irq_vectors() https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt

這在很大程度上取決於我們正在談論的機器……在當今的 PC 上,設備在配置時會即時分配 IRQ 編號。

要深入研究這個主題,請看一下“Linux 設備驅動程序”(是的,它已經過時了,但它所說的大部分內容仍然適用)。

引用自:https://unix.stackexchange.com/questions/440322