Прерывания PCI Express в драйвере

#linux-device-driver #kernel-module #pci-e

#linux-устройство-драйвер #kernel-module #pci-e

Вопрос:

Здравствуйте, я разрабатываю связь PCIe между ПЛИС Xilinx и ПК Intel… Я написал модуль ядра (драйвер Linux), я использую прерывания INTx. Я столкнулся с проблемой обработки прерываний….

Перед загрузкой модуля ядра:

из lspci: INT A—>11

из конфигурации читайте: INT A—> 11

из /proc/interrupts : ничего, потому что irq не зарегистрирован

После загрузки модуля ядра:

из lspci: INT A—>16

из конфигурации читайте: INT A—> 11

из /proc/interrupts: INT 11 registerd

Когда я запускал программу в FPGA, она отправляла прерывание на IRQ-16 и говорила, что никто не заботился, и он был отключен.

в моем module_init:

 request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev));
 

Мой обработчик irq:

 static irqreturn_t XPCIe_IRQHandler(int irq, void *dev_id, struct pt_regs *regs)
{    return IRQ_HANDLED; }
 

Итак, кто-нибудь может сказать, в чем может быть проблема….

Ответ №1:

Вы не показываете, откуда у вас dev->gIrq установлено, но ваш модуль ядра должен принимать номер прерывания из struct pci_dev связанного с вашим устройством. Смотрите этот комментарий в include/linux/pci.h :

 struct pci_dev {
    ...
    /*
     * Instead of touching interrupt line and base address registers
     * directly, use the values stored here. They might be different!
     */
    unsigned int    irq;
 

Комментарии:

1. И в новейшем ядре вы не должны делать даже этого, а вместо этого использовать pci_alloc_irq_vectors() amp; Co .

Ответ №2:

Да, Гил, спасибо за твой ответ.. в коде

  request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev));
 

dev-> gIrq — это не что иное, как то, что я взял только из структуры pci_dev.

и

Энди, я не использую какие-либо прерывания MSI или MSI-X для использования pci_alloc_irq_vectors().