novartis 0 19 октября, 2010 Опубликовано 19 октября, 2010 · Жалоба Добрый день. Вожусь с отладочной платой от Altera Stratix IV GX Dev Kit. Ваяем потихоньку драйвер для PCI Express. Ни как не получается задействовать режим Multiple Message Enable для MSI. В драйвере использую функцию pci_enable_msi_block: static int __devinit probe( struct pci_dev *pdev, const struct pci_device_id *id ) { ... pci_enable_device( pdev ); pci_set_master( pdev ); ... int msi_count = 1; int msiblock = pci_enable_msi_block( pdev , msi_count); ... request_irq( pdev->irq, interruptHandler, IRQF_SHARED, MODULE_NAME, pdev ); ... } В этом виде MSI разрешено, прерывание в обработчик поступает. Если ставлю msi_count больше 1 (по идее вплоть до 32) функция pci_enable_msi_block возвращает 1, то есть подключить можно только одну линию. Правильно ли я использую функцию pci_enable_msi_block и почему она разрешает подключить только одну линию прерываний? lspci на плату такой: #lspci -s 01:00.0 -vvv 01:00.0 Class ff00: Altera Corporation Device e001 (rev 01) Subsystem: Device 5bde:1100 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 Interrupt: pin A routed to IRQ 34 Region 0: Memory at 80000000 (64-bit, prefetchable) Capabilities: [50] MSI: Enable+ Count=1/32 Maskable- 64bit+ Address: 00000000fee0300c Data: 416b Capabilities: [78] 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: [80] Express (v2) Legacy Endpoint, MSI 00 DevCap: MaxPayload 128 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 128 bytes, MaxReadReq 512 bytes DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend- LnkCap: Port #1, Speed 5GT/s, Width x8, ASPM L0s, Latency L0 unlimited, L1 unlimited ClockPM- Surprise- LLActRep- BwNot- LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- DevCap2: Completion Timeout: Range ABCD, TimeoutDis+ DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-, Selectable De-emphasis: -6dB Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS- Compliance De-emphasis: -6dB LnkSta2: Current De-emphasis Level: -6dB Capabilities: [100 v1] Virtual Channel Caps: LPEVC=0 RefClk=100ns PATEntrySize=0 Arb: Fixed- WRR32- WRR64- WRR128- 100ns- onfig- - - TableOffset=0 Ctrl: ArbSelect=Fixed Status: InProgress- VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- Arb: Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256- Fixed- RR32- Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=ff Status: NegoPending- InProgress- Kernel driver in use: driver_altera Вообщем подскажите как в регистрах MSI: ------------------------------------------------------------- Capabilities: [50] MSI: Enable+ Count=1/32 Maskable- 64bit+ Address: 00000000fee0300c Data: 416b ------------------------------------------------------------- сделать Maskable+ и сделать Count=32/32? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vshemm 0 23 октября, 2010 Опубликовано 23 октября, 2010 · Жалоба pci_enable_msi_block используется правильно (с поправкой на то, что count может быть степенью 2). Наиболее вероятные причины невозможности подключения более одной линии следующие: 1. Само устройство не поддерживает несколько линий прерываний. Тут нужно смотреть даташит на него на предмет настройки разных линий прерываний для разных функций. Строчка Capabilities: [50] MSI: Enable+ Count=1/32 Maskable- 64bit+ показывает аппаратные возможности девайса, и нет общего способа их менять (опять же, нужно курить мануал на устройство). 2. Т.к. MSI требует, чтобы линии прерываний выделялись непрерывно, то возможен случай, когда не найдется 32 подряд идущих свободных линий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 26 октября, 2010 Опубликовано 26 октября, 2010 · Жалоба pci_enable_msi_block используется правильно (с поправкой на то, что count может быть степенью 2). Наиболее вероятные причины невозможности подключения более одной линии следующие: 1. Само устройство не поддерживает несколько линий прерываний. Тут нужно смотреть даташит на него на предмет настройки разных линий прерываний для разных функций. Строчка Capabilities: [50] MSI: Enable+ Count=1/32 Maskable- 64bit+ показывает аппаратные возможности девайса, и нет общего способа их менять (опять же, нужно курить мануал на устройство). 2. Т.к. MSI требует, чтобы линии прерываний выделялись непрерывно, то возможен случай, когда не найдется 32 подряд идущих свободных линий. Большое спасибо за ответ. Девайсом является плата Altera Stratix IV GX Dev Kit. В ней имеется аппаратный блок PCI Express, который я сам настраиваю в квартусе настройкой PCI Express Compiler - это альтеровское мегаядро. Доступными мне являются параметры Multiple Message Capable (я поставил 32, и это отразилось в строке Count=1/32) и поддержка 64-битной дресации (отразилось в строке 64bit+). Всего два настраиваемых со стороны платы параметра. Вот второй пункт вашего ответа объясняет причину невозможности подключения более одной линии. Тогда как выход мне представляется вариант уменьшения количества прерываний с 32 до меньшего числа (например, 4 или 2). Уж 4 то подряд идущих линии прерывания наверное найдутся. Вот только другой возникает вопрос. Если я выделю блок из 4 прерываний, как мне подключить обработчик прерываний: request_irq( irq, interruptHandler, IRQF_SHARED, MODULE_NAME, pdev ); Какое прерывание я должен передать как irq? или для каждой линии прерывания зарегестрировать отдельный обработчик: request_irq( irq_1, interruptHandler_1, IRQF_SHARED, MODULE_NAME, pdev ); request_irq( irq_2, interruptHandler_2, IRQF_SHARED, MODULE_NAME, pdev ); ... request_irq( irq_N, interruptHandler_N, IRQF_SHARED, MODULE_NAME, pdev );?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cont 0 23 января, 2012 Опубликовано 23 января, 2012 · Жалоба Аналогичная проблема. Не могу решить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба Приветствую. Получилось ли выделить число MSI отличное от 1? Ситуация аналогичная, ядро PCIe поддерживает вектор MSI 4, Linux Kernel разрешает только 1 MSI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vikS 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Аналогичная ситуация. Подскажите пожалуйста решение. Линукс видит только 1 вектор прерываний Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба У меня работает на том количестве,которое я завожу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 4 августа, 2020 Опубликовано 4 августа, 2020 · Жалоба On 6/22/2020 at 1:27 PM, vikS said: Аналогичная ситуация. Подскажите пожалуйста решение. Линукс видит только 1 вектор прерываний Реагировать на 1 MSI, остальное читать через MMIO, т.е. несколько событий генерируют 1 прерывание общее, но что именно сформировало его - читаем в регистре. Такое решение не годится? Хотя конечно лучше нормальная реакция на прерывания Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться