doom13 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба Приветствую. Хочу реализовать в устройстве PCIe несколько источников прерывания. Попытался использовать MSI, но система не хочет разрешать более одного MSI. Как быть в такой ситуации? Можно поставить контроллер прерываний, а сигнал от него завести на ядро PCIe, но правильно ли это? Кто как делал? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба просто почитайте внимательно MSI-HOWTO https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба просто почитайте внимательно 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)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба не знаю, как в убунте, но обычно настройки ядра (.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-поддержка с одним прерыванием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба а покажите, что у вас записано в MSI Control Register? в PCI BAR, в MSI capability structure. Это пока не могу, но #lspci -vv говорит, что поддерживает 4 или 2 (пробовал разные настройки для ядра PCIe Bridge). кроме того, дело может быть и в материнке. бывает так, что MSI-прерываний материнка поддерживает 1 на устройство, а MSI-X - несколько. а бывает наоборот, что MSI-X не поддерживается вообще, а MSI можно несколько. Попробовал и MSI-X использовать (настроил ядро на поддержку MSI-X), результат тот же - показывает, что устройство поддерживает 4, а система выделяет только одно, при попытке выделить больше выдаёт ошибку (если использую MSI, то просто выделяет одно). поэтому если хотите чтобы много прерываний было на разных платформах, то в драйвере придется раскорячится - и поддерживать по максимуму, и MSI, и MSI-X. но это не гарантирует того, что вашу плату не вставят туда, где будет только Legacy-поддержка с одним прерыванием. А что если использовать одно, но от AXI Interrupt Controller-a, а на него завести сколько необходимо? Или это "костыль" (в драйвере придётся разруливать, что за устройство послало прерывание) - правильно добиться выделения нескольких MSI/MSI-X прерываний? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 6 ноября, 2015 Опубликовано 6 ноября, 2015 · Жалоба не знаю, как в убунте, но обычно настройки ядра (.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 присутствует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 9 ноября, 2015 Опубликовано 9 ноября, 2015 · Жалоба Нашёл, что стояла неправильная опция для ядра AXI Bridge for PCIe, галка для MSI и для MSI-X одновременно (мануал говорит, что можно выбрать одно из двух). Для MSI, как и ранее, работает (выделяется) только одно прерывание, больше система не даёт, хотя видит, что устройство поддерживает 4. Для MSI-X удалось выделить два прерывания, вопрос - почему только два? lspci -vv выдаёт следующее: 1) модуль ядра не загружен 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) модуль ядра загружен 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? Может кто знает, почему изменился номер линии прерывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 10 ноября, 2015 Опубликовано 10 ноября, 2015 · Жалоба Почему 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 так же актуальны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 10 ноября, 2015 Опубликовано 10 ноября, 2015 · Жалоба Попробовал менять значения 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: 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться