Перейти к содержанию
    

PCIe Interrupts

Приветствую.

Хочу реализовать в устройстве PCIe несколько источников прерывания. Попытался использовать MSI, но система не хочет разрешать более одного MSI. Как быть в такой ситуации? Можно поставить контроллер прерываний, а сигнал от него завести на ядро PCIe, но правильно ли это? Кто как делал?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

просто почитайте внимательно MSI-HOWTO

https://www.kernel.org/doc/Documentation/PCI/MSI-HOWTO.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

просто почитайте внимательно 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)?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не знаю, как в убунте, но обычно настройки ядра (.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-поддержка с одним прерыванием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а покажите, что у вас записано в 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 прерываний?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не знаю, как в убунте, но обычно настройки ядра (.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 присутствует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашёл, что стояла неправильная опция для ядра 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?

Может кто знает, почему изменился номер линии прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему 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 так же актуальны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал менять значения 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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...