리눅스는 어떤 irq 번호를 사용해야 하는지 어떻게 알 수 있나요?

리눅스는 어떤 irq 번호를 사용해야 하는지 어떻게 알 수 있나요?

저는 드라이버 프로그래머가 아니며 Linux가 pcie 장치에 irq 번호를 할당하는 방법을 모릅니다.

NIC 드라이버 예에서 Linux는 "프로브" 또는 "열기" 기능을 실행하기 전에 어떤 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 인터럽트는 커널에 의해 생성되는 것 같습니다.

--

내가 이해한 바에 따르면, irq 번호는 PCIe 구성 공간의 인터럽트 라인 레지스터(오프셋 3Ch)에서 읽어야 합니다. 이것이 바로 kerenl이 이미 어떤 irq 번호를 사용해야 하는지 알고 있고 BIOS에서 인터럽트 라인 레지스터를 업데이트해야 하는 이유인 것 같습니다. (내 추측으로는) 부팅하는 동안 여전히 가상 IRQ가 있고(lspci에 -b가 없는 경우) MSI에 또 다른 IRQ(?)가 있는 것 같습니다. 메모리와 같은 공통 리소스를 예약해야 합니까?

답변1

레거시 인터럽트의 경우 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

답변2

우리가 말하는 기계에 따라 많은 것이 달라집니다. 오늘날의 PC에서는 구성 시 장치에 IRQ 번호가 동적으로 할당됩니다.

이 주제에 대해 더 자세히 알아보려면 다음을 확인하세요."리눅스 장치 드라이버"(예, 꽤 구식이지만 대부분의 내용은 여전히 ​​​​적용됩니다.)

답변3

MSI-X의 경우 acpi_pci_irq_check_entry()의 설명을 참조하세요.

/*
 * Type 1: Dynamic
 * ---------------
 * The 'source' field specifies the PCI interrupt link device used to
 * configure the IRQ assigned to this slot|dev|pin.  The 'source_index'
 * indicates which resource descriptor in the resource template (of
 * the link device) this interrupt is allocated from.
 * 
 * NOTE: Don't query the Link Device for IRQ information at this time
 *       because Link Device enumeration may not have occurred yet
 *       (e.g. exists somewhere 'below' this _PRT entry in the ACPI
 *       namespace).
 */

/*
 * Type 2: Static
 * --------------
 * The 'source' field is NULL, and the 'source_index' field specifies
 * the IRQ value, which is hardwired to specific interrupt inputs on
 * the interrupt controller.
 */

관련 정보