2014-02-19 8 views
1

В настоящее время у меня есть требование для поддержки MSI с двумя векторами на моем устройстве PCI. Каждый вектор должен иметь другую процедуру обработчика. HW документ говорит следующееВключение нескольких MSI в PCI-драйвере с различными обработчиками IRQ

вектор 0 для датчика температуры

вектор 1 для датчика мощности

Ниже приведен код драйвера я следующее. 1. Сначала включите два вектора, используя pci_enable_msi_block (pdev, 2) 2. Затем назначьте обработчики прерываний с помощью request_irq (два разных обработчика прерываний irq, two diff).

int vecs = 2; 
struct pci_dev *pdev = dev->pci_dev; 
result = pci_enable_msi_block(pdev, vecs); 

Здесь результат равен нулю, который говорит, что вызов преуспел в разрешении двух векторов.

Вопросы у меня есть:

  1. HW документ говорит вектор 0, я надеюсь, что это не вектор 0 ОС не так ли? В любом случае я не могу получить вектор 0 в ОС.
  2. Сложная проблема, с которой я столкнулся, - это когда я делаю request_irq() для первого irq, как я могу сказать OS, что мне нужно сопоставить этот запрос с вектором 0 HW? Последовательно для второго irq, как мне сопоставить t вектор 1 HW?

ответ

0

С MSI и MSI-X номер прерывания (irq) является «вектором» ЦП. Сигнальные прерывания сообщения позволяют устройству записывать небольшой объем данных в специальный адрес ввода-вывода с отображением памяти; чипсет затем передает соответствующее прерывание процессору.

Может быть, есть два разных данных прерывания MSI, которые могут быть записаны на адрес MSI. Его как ваше оборудование поддерживает 2 MSI (один для датчика температуры и один для датчика мощности). Поэтому, когда вы выдаете pci_enable_msi_block(pdev, 2);, прерывание будет утверждаться чипсетом процессору всякий раз, когда какой-либо из двух данных MSI записывается на специальный адрес ввода-вывода с памятью (адрес MSI). После звонка в pci_enable_msi_block(pdev, 2); вы можете запросить два irqs через request_irq(pdev->irq, handler, flags....) и request_irq(pdev->irq + 1, handler, flags....). Поэтому всякий раз, когда данные MSI записываются на адрес MSI, pdev->irq или pdev->irq + 1 будут утверждаться в зависимости от того, какой датчик отправил MSI, и соответствующий обработчик будет вызван.

Данные двух MSI могут быть настроены в регистр данных MSI оборудования.

2

pci_enable_msi_block:

Если 2 сообщения MSI запрашиваются с помощью этой функции и если вызов функции возвращает 0, то 2 сообщений MSI выделяются для устройства и pdev->irq обновляется до самого низкого из прерываний, назначенных к устройству ,

Таким образом, pdev->irq и pdev->irq+1 - это новые прерывания, назначенные устройству. Теперь вы можете зарегистрировать два обработчика прерываний:

request_irq(pdev->irq, handler1, ...) 
request_irq(pdev->irq+1, handler2, ...) 

 Смежные вопросы

  • Нет связанных вопросов^_^