включить / отключить прерывания PCI

8

Я реализую драйвер PCIe, и я хотел бы понять, на каком уровне прерывания могут быть или должны быть включены / отключены. Я намеренно не указываю ОС, так как полагаю, что это должно быть актуально для любой платформы. Под уровнями я имею в виду следующее:

  • Специфичная для ОС структура обработки прерываний
  • Прерывания могут быть отключены или включены в регистрах пространства конфигурации PCI / PCIe, например, регистр COMMAND
  • Прерывания также могут маскироваться на уровне устройства, например, мы можем настроить устройство так, чтобы оно не вызывало определенные прерывания для хоста.

Я понимаю, что какой бы тип прерывания не использовался в PCIe (эмуляция INTx, MSI или MSI-X), он должен быть доставлен в хост-ОС.

Поэтому мой вопрос: нужно ли нам на самом деле включать или отключать прерывания на каждом уровне, или этого достаточно только на самом близком к аппаратному обеспечению, например, в соответствующих регистрах PCI?

отметка
источник
1
В драйверах Windows KMDF вы указываете в INF-файле драйвера, какой тип прерываний использовать (MSI vs INTx vs MSI-x), и структура драйвера будет правильно конфигурировать само пространство конфигурации PCIe при загрузке. Я не знаю о других ОС, но, поскольку .inf специфичны для Windows, я думаю, что это, вероятно, зависит от ОС.
Том Карпентер
2
Как правило, вы должны включить их полностью, предоставив конфигурацию для того, что должно быть сделано с прерыванием. После того, как это будет сделано, отключение будет на процессоре только в течение коротких периодов непрерывной работы, пока вы не отключите устройство (например, для экономии энергии)
pjc50
1
Если вы используете Linux, можете ли вы использовать DMA Framework для своего приложения? Это очень хорошо, вы создаете транзакцию и она возвращается с необязательным таймаутом, когда транзакция завершена - вам не нужно дурачиться с фактическим прерыванием
johnnymopo
@ pjc50, если драйвер выбирает использование прерываний определенного типа, например INTx, нужно ли ему отключать доставку прерываний MSI / MSI-X через pci-регистры MSI_CAP? (И наоборот - отключить INTx при использовании MSI)
Марк

Ответы:

1

Операционные системы обычно громко жалуются на неожиданные прерывания, потому что это легко обнаруживаемые ошибки программирования в драйверах.

Как правило, ваше оборудование запускается в довольно инертном состоянии после сброса, где оно ожидает настройки. В этом состоянии нет никакого значимого способа генерировать прерывание, потому что еще не установлено отображение, и вы не знаете, какое прерывание.

Во время конфигурирования появляется сопоставление прерываний, и карте сообщается, какую линию прерываний использовать (INTA..INTD в качестве устаревшего PCI или MSI / MSI-X), но пока еще нет драйвера для обработки прерываний. У Linux здесь есть обработчик по умолчанию, который жалуется в системный журнал, а затем отключает источник прерываний, так как оборудование кажется неисправным (то есть по умолчанию все прерывания включены, но на самом деле ожидаются только те, для которых зарегистрирован обработчик). ,

Драйвер, наконец, регистрирует обработчики прерываний и разрешает те прерывания, которые ему интересны. Если драйвер больше не интересуется определенным состоянием, ему необходимо отключить прерывание в устройстве, потому что именно там маскируются конкретные причины прерывания устройства - нижние слои знают только, что «что-то случилось».

Саймон Рихтер
источник