Я не уверен, что правильно понимаю, что вы имеете в виду под регистром вектора (указатель на некоторую документацию поможет мне точно определить ваш случай).
В любом случае, любое PCI-устройство получает уникальный номер прерывания (заданный BIOS или некоторым программным обеспечением на других архитектурах, отличных от x86). Вам просто нужно зарегистрировать это прерывание в вашем драйвере.
priv->name = DRV_NAME;
err = request_irq(pdev->irq, your_irqhandler, IRQF_SHARED, priv->name,
pdev);
if (err) {
dev_err(&pdev->dev, "cannot request IRQ\n");
goto err_out_unmap;
}
Еще одна вещь, которую я не совсем понимаю, это то, почему вы должны экспортировать свои прерывания как узел разработки: прерывания, безусловно, должны оставаться в коде вашего драйвера / ядра. Но я думаю, что здесь вы хотите экспортировать устройство, к которому затем осуществляется доступ в пользовательском пространстве. Я просто считаю / dev / int no хорошим названием.
По вашему вопросу о нескольких узлах разработки: если ваши разные источники прерываний предоставляют доступ к разным аппаратным ресурсам (даже если на одной плате PCI), я бы выбрал вариант 1) с ожиданием_квата для каждого устройства. Иначе я бы выбрал вариант 2)
Поскольку ваши прерывания исходят от одного и того же физического устройства, если вы выбрали вариант 1) или вариант 2), строка прерывания должна быть разделена, и вам придется читать вектор в вашем прерывании. обработчик, чтобы определить, какой аппаратный ресурс вызвал прерывание.
Для варианта 1) это будет примерно так:
static irqreturn_t pex_irqhandler(int irq, void *dev) {
struct pci_dev *pdev = dev;
int result;
result = pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &myirq);
if (result) {
int vector = read_vector();
if (vector == A) {
set_flagA(flag);
} else if (vector == B) {
set_flagB(flag);
}
wake_up_interruptible(wait_queue, flag);
return IRQ_HANDLED;
} else {
return IRQ_NONE;
}
Для варианта 2 он будет аналогичным, но у вас будет только одно условие if (для соответствующего векторного значения) в каждом отдельном обработчике прерываний, который вы будете запрашивать для каждого узла.