реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> PCIe Interrupts, как реализовать несколько прерываний?
doom13
сообщение Nov 5 2015, 11:22
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Хочу реализовать в устройстве PCIe несколько источников прерывания. Попытался использовать MSI, но система не хочет разрешать более одного MSI. Как быть в такой ситуации? Можно поставить контроллер прерываний, а сигнал от него завести на ядро PCIe, но правильно ли это? Кто как делал?
Спасибо.
Go to the top of the page
 
+Quote Post
krux
сообщение Nov 5 2015, 14:02
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 581
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



просто почитайте внимательно MSI-HOWTO
https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 5 2015, 14:21
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(krux @ Nov 5 2015, 17:02) *
просто почитайте внимательно MSI-HOWTO
https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt

Много раз уже почитал, но не могу понять в чём дело, показывает (pci_msi_vec_count()), что устройство поддерживает 4 прерывания MSI,
разрешает (pci_enable_msi_range(pdev, 1, 4)) - 1 прерывание MSI.
Или Вы про это:
Цитата
4. How to use MSIs

PCI devices are initialised to use pin-based interrupts. The device
driver has to set up the device to use MSI or MSI-X. Not all machines
support MSIs correctly, and for those machines, the APIs described below
will simply fail and the device will continue to use pin-based interrupts.

4.1 Include kernel support for MSIs

To support MSI or MSI-X, the kernel must be built with the CONFIG_PCI_MSI
option enabled. This option is only available on some architectures,
and it may depend on some other options also being set. For example,
on x86, you must also enable X86_UP_APIC or SMP in order to see the
CONFIG_PCI_MSI option.

??? Как тогда определить моя система должна работать или нет (Ubuntu 15.04)?
Go to the top of the page
 
+Quote Post
krux
сообщение Nov 5 2015, 17:16
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 581
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



не знаю, как в убунте, но обычно настройки ядра (.config-файл с опциями) кладут в /boot , там можно поискать.
если нет - бывает этот файл вместе с -dev пакетом с ядром устанавливается. бывает ещё и /proc/config.gz
вот там CONFIG_PCI_MSI опцию и посмотреть.

а покажите, что у вас записано в MSI Control Register? в PCI BAR, в MSI capability structure.

кроме того, дело может быть и в материнке.
бывает так, что MSI-прерываний материнка поддерживает 1 на устройство, а MSI-X - несколько.
а бывает наоборот, что MSI-X не поддерживается вообще, а MSI можно несколько.

поэтому если хотите чтобы много прерываний было на разных платформах, то в драйвере придется раскорячится - и поддерживать по максимуму, и MSI, и MSI-X.
но это не гарантирует того, что вашу плату не вставят туда, где будет только Legacy-поддержка с одним прерыванием.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 5 2015, 20:36
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(krux @ Nov 5 2015, 20:16) *
а покажите, что у вас записано в MSI Control Register? в PCI BAR, в MSI capability structure.

Это пока не могу, но #lspci -vv говорит, что поддерживает 4 или 2 (пробовал разные настройки для ядра PCIe Bridge).

Цитата(krux @ Nov 5 2015, 20:16) *
кроме того, дело может быть и в материнке.
бывает так, что MSI-прерываний материнка поддерживает 1 на устройство, а MSI-X - несколько.
а бывает наоборот, что MSI-X не поддерживается вообще, а MSI можно несколько.

Попробовал и MSI-X использовать (настроил ядро на поддержку MSI-X), результат тот же - показывает, что устройство поддерживает 4, а система выделяет только одно, при попытке выделить больше выдаёт ошибку (если использую MSI, то просто выделяет одно).

Цитата(krux @ Nov 5 2015, 20:16) *
поэтому если хотите чтобы много прерываний было на разных платформах, то в драйвере придется раскорячится - и поддерживать по максимуму, и MSI, и MSI-X.
но это не гарантирует того, что вашу плату не вставят туда, где будет только Legacy-поддержка с одним прерыванием.

А что если использовать одно, но от AXI Interrupt Controller-a, а на него завести сколько необходимо? Или это "костыль" (в драйвере придётся разруливать, что за устройство послало прерывание) - правильно добиться выделения нескольких MSI/MSI-X прерываний?
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 6 2015, 06:55
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(krux @ Nov 5 2015, 20:16) *
не знаю, как в убунте, но обычно настройки ядра (.config-файл с опциями) кладут в /boot , там можно поискать.
если нет - бывает этот файл вместе с -dev пакетом с ядром устанавливается. бывает ещё и /proc/config.gz
вот там CONFIG_PCI_MSI опцию и посмотреть.

В /boot лежит файлик config-3.19xxxxx, он содержит:
Цитата
#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
CONFIG_PCIEPORTBUS=y
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_PCIEAER=y
# CONFIG_PCIE_ECRC is not set
# CONFIG_PCIEAER_INJECT is not set
CONFIG_PCIEASPM=y
CONFIG_PCIEASPM_DEBUG=y
CONFIG_PCIEASPM_DEFAULT=y
# CONFIG_PCIEASPM_POWERSAVE is not set
# CONFIG_PCIEASPM_PERFORMANCE is not set
CONFIG_PCIE_PME=y
CONFIG_PCI_BUS_ADDR_T_64BIT=y
CONFIG_PCI_MSI=y
# CONFIG_PCI_DEBUG is not set
CONFIG_PCI_REALLOC_ENABLE_AUTO=y
CONFIG_PCI_STUB=m
CONFIG_XEN_PCIDEV_FRONTEND=m
CONFIG_HT_IRQ=y
CONFIG_PCI_ATS=y
CONFIG_PCI_IOV=y
CONFIG_PCI_PRI=y
CONFIG_PCI_PASID=y
CONFIG_PCI_LABEL=y

разрешение MSI присутствует.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 9 2015, 10:59
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Нашёл, что стояла неправильная опция для ядра AXI Bridge for PCIe, галка для MSI и для MSI-X одновременно (мануал говорит, что можно выбрать одно из двух).
Для MSI, как и ранее, работает (выделяется) только одно прерывание, больше система не даёт, хотя видит, что устройство поддерживает 4.
Для MSI-X удалось выделить два прерывания, вопрос - почему только два?

lspci -vv выдаёт следующее:
1) модуль ядра не загружен
CODE

01:00.0 Multimedia controller: Xilinx Corporation Device 7024
Subsystem: Xilinx Corporation Device 0007
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 11
Region 0: Memory at f7e00000 (64-bit, non-prefetchable) [size=128K]
Capabilities: [80] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [b0] MSI-X: Enable- Count=2 Masked-
Vector table: BAR=0 offset=00000200
PBA: BAR=0 offset=00000280

Capabilities: [c0] Express (v2) Endpoint, MSI 00
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+
MaxPayload 256 bytes, MaxReadReq 512 bytes
DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 5GT/s, Width x4, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
ClockPM- Surprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 5GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range B, TimeoutDis+, LTR-, OBFF Not Supported
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-, EqualizationPhase1-
EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-

2) модуль ядра загружен
CODE

01:00.0 Multimedia controller: Xilinx Corporation Device 7024
Subsystem: Xilinx Corporation Device 0007
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 16
Region 0: Memory at f7e00000 (64-bit, non-prefetchable) [size=128K]
Capabilities: [80] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [b0] MSI-X: Enable+ Count=2 Masked-
Vector table: BAR=0 offset=00000200
PBA: BAR=0 offset=00000280

Capabilities: [c0] Express (v2) Endpoint, MSI 00
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+
MaxPayload 256 bytes, MaxReadReq 512 bytes
DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 5GT/s, Width x4, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
ClockPM- Surprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 5GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range B, TimeoutDis+, LTR-, OBFF Not Supported
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-, EqualizationPhase1-
EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
Kernel driver in use: htg_v7_g3


Почему MSI-X: Count=2? Система вычитала из конфигурационной области ядра AXI PCIe Bridge?
Может кто знает, почему изменился номер линии прерывания?
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 10 2015, 08:10
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(doom13 @ Nov 9 2015, 13:59) *
Почему MSI-X: Count=2? Система вычитала из конфигурационной области ядра AXI PCIe Bridge?

Тут, похоже, ответ нашёлся, в Common PCI Configuration Space Header по адресу 0xB0 лежит 0001_C011, где 0001 - содержимое Message Control for MSI-X (16 bit register). Младшие 11 бит - Table Size (Read Only) и 1 означает, что размер таблицы 2 для MSI-X, что и показывала lspci -vv.
Получается, что это ядро AXI Bridge for PCIe ограничивает количество возможных MSI-X.

Остаётся вопрос, почему оно так сделано, может быть можно как-то менять значение данного регистра? Вопросы с MSI так же актуальны.
Go to the top of the page
 
+Quote Post
doom13
сообщение Nov 10 2015, 09:18
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 327
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Попробовал менять значения Common PCI Configuration Space Header для MSI (pci_read_config_word(), pci_write_config_word()). Message Control for MSI располагается со смещением 0х90 + 2, дефолтное значение для него 0084_C005, если записать 00A5_C005 то lspci -vv для устройства покажет, что используются все четыре возможных MSI:
CODE

01:00.0 Multimedia controller: Xilinx Corporation Device 7024
Subsystem: Xilinx Corporation Device 0007
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 16
Region 0: Memory at f7e00000 (64-bit, non-prefetchable) [size=128K]
Capabilities: [80] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [90] MSI: Enable+ Count=4/4 Maskable- 64bit+
Address: 00000000feeff00c Data: 4153

Capabilities: [c0] Express (v2) Endpoint, MSI 00
DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+
MaxPayload 256 bytes, MaxReadReq 512 bytes
DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 5GT/s, Width x4, ASPM not supported, Exit Latency L0s unlimited, L1 unlimited
ClockPM- Surprise- LLActRep- BwNot-
LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 5GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range B, TimeoutDis+, LTR-, OBFF Not Supported
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled
LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance De-emphasis: -6dB
LnkSta2: Current De-emphasis Level: -3.5dB, EqualizationComplete-, EqualizationPhase1-
EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
Kernel driver in use: htg_v7_g3


Как понимаю, такие изменения в шапку ядра PCIe должна была внести функция pci_enable_msi_range(pdev, 1, 4).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th December 2017 - 14:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01305 секунд с 7
ELECTRONIX ©2004-2016