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

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

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

из lspci: INT A -> 11

из конфигурации читать: INT A -> 11

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

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

от lspci: INT A -> 16

из конфигурации читать: INT A -> 11

из / proc / interrupts: INT 11 зарегистрировано

Когда я запускал программу на ПЛИС, она отправляла прерывание на 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; }

Так что любой может сказать, в чем может быть проблема ....


person Nag    schedule 16.10.2016    source источник


Ответы (2)


Вы не показываете, откуда установлен ваш 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;
person Gil Hamilton    schedule 18.10.2016
comment
И в новейшем ядре вы не должны этого делать, а вместо этого используете pci_alloc_irq_vectors() & Co. - person 0andriy; 19.10.2016

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

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

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

и

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

person Nag    schedule 21.10.2016