Всем добрый вечер!!!
Есть плата с шиной Pci Express, в данной плате реализована работа MSI прерываний
я написал драйвер под Linux, разрешение MSI прерываний осуществляется через функцию pci_msi_anable и все хорошо работало, пока не появилась потребность переписать драйвер под QNX 6.5.0
по документации на pci server(стандартный, что устанавливается вместе с QNX), достаточно просто передать флаг PCI_USE_MSI в функцию pci_attach_device и все само настроится... но вот только не работает...
вот таким образом я получаю дескриптор на устройство:
CODE
pci_dev_hndl = pci_attach_device(NULL,( PCI_SEARCH_VENDEV | PCI_INIT_ALL | PCI_INIT_IRQ | PCI_MASTER_ENABLE | PCI_USE_MSI),minor,&pci_info);
результат так же сохраняется в структуре pci_dev_info pci_info, одним из полей которой является:
uint8_t msi;
данное поле всегда равно нулю при считывании после выполнения pci_attach_device, мне казалось, там должен быть сохранен номер msi прерывания, информации по данному полю я не смог найти
если набрать команду pci -vvv до загрузки драйвера и после, то ничего не меняется в адресном пространстве pci, самое главное, что я смотрю, это capability регистр с id 0x05, там видно, что msi прерывания запрещены, адреса в нулях и данные...
CODE
Class = Communication (Other)
Vendor ID = a203h, Unknown
Device ID = 9472h, Unknown Unknown
PCI index = 0h
Class Codes = 078000h
Revision ID = 3h
Bus number = 3
Device number = 0
Function num = 0
Status Reg = 10h
Command Reg = 107h
I/O space access enabled
Memory space access enabled
Bus Master enabled
Special Cycle operations ignored
Memory Write and Invalidate disabled
Palette Snooping disabled
Parity Error Response disabled
Data/Address stepping disabled
SERR# driver enabled
Fast back-to-back transactions to different agents disabled
PCI INTx enabled
Header type = 0h Single-function
BIST = 0h Build-in-self-test not supported
Latency Timer = 0h
Cache Line Size= 8h un-cacheable
BAR - 0 [Mem] = f7d80000h 64bit length 524288 enabled
Subsystem Vendor ID = a203h
Subsystem ID = 9472h
Max Lat = 0ns
Min Gnt = 0ns
PCI Int Pin = INT A
Interrupt line = 5
CPU Interrupt = 5h
Capabilities Pointer = 40h
Capability ID = 1h - Power Management
Capabilities = 7e03h - 8h
Capability ID = 5h - Message Signaled Interrupts
Capabilities = 80h - 0h
Capability ID = 10h - PCI Express
Capabilities = 1h - 288fc0h
Device Dependent Registers:
0x040: 0148 037e 0800 0000 0558 8000 0000 0000
0x050: 0000 0000 0000 0000 1000 0100 c08f 2800
0x060: 1028 0b00 11f4 0300 0000 1110 0000 0000
0x070: 0000 0000 0000 0000 0000 0000 0000 0000
...
0x0f0: 0000 0000 0000 0000 0000 0000 0000 0000
я решил ручками написать функцию, которая активирует MSI прерывания, формально реализовать ту же функцию pci_msi_anable в линукс, но наткнулся на особенную организацию MSI прерываний в архитектуре Intel, настроил адреса вот так:
addr_dma_msi_lo = 0xFEE00000; // low part address
addr_dma_msi_hi = 0x00000000; // hi part address
данные:
msi_cap_message_data = 0x4042;
CODE
Class = Communication (Other)
Vendor ID = a203h, Unknown
Device ID = 9472h, Unknown Unknown
PCI index = 0h
Class Codes = 078000h
Revision ID = 3h
Bus number = 3
Device number = 0
Function num = 0
Status Reg = 10h
Command Reg = 507h
I/O space access enabled
Memory space access enabled
Bus Master enabled
Special Cycle operations ignored
Memory Write and Invalidate disabled
Palette Snooping disabled
Parity Error Response disabled
Data/Address stepping disabled
SERR# driver enabled
Fast back-to-back transactions to different agents disabled
PCI INTx disabled
Header type = 0h Single-function
BIST = 0h Build-in-self-test not supported
Latency Timer = 0h
Cache Line Size= 8h un-cacheable
BAR - 0 [Mem] = f7d80000h 64bit length 524288 enabled
Subsystem Vendor ID = a203h
Subsystem ID = 9472h
Max Lat = 0ns
Min Gnt = 0ns
PCI Int Pin = INT A
Interrupt line = 5
CPU Interrupt = 5h
Capabilities Pointer = 40h
Capability ID = 1h - Power Management
Capabilities = 7e03h - 8h
Capability ID = 5h - Message Signaled Interrupts
Capabilities = 81h - fee0000h Enabled
Capability ID = 10h - PCI Express
Capabilities = 1h - 288fc0h
Device Dependent Registers:
0x040: 0148 037e 0800 0000 0558 8100 0000 e0fe
0x050: 0000 0000 4240 0000 1000 0100 c08f 2800
0x060: 1028 0b00 11f4 0300 0000 1110 0000 0000
0x070: 0000 0000 0000 0000 0000 0000 0000 0000
...
0x0f0: 0000 0000 0000 0000 0000 0000 0000 0000
но мне не получилось зарегистрировать обработчик прерывания на вектор 0x42, что я указал, постоянно InterruptAttach выдавал ошибку
уважаемые форумчане, был ли у кого опыт включения MSI прерываний под QNX 6.5.0 X86, поделитесь, пожалуйста опытом, 2 недели уже бьюсь, пока результата никакого????
Сообщение отредактировал xxxmatrixxx - Jan 16 2018, 17:32