Jump to content

    

MSI прерывания в QNX 6.5.0 X86

Всем добрый вечер!!!

 

Есть плата с шиной Pci Express, в данной плате реализована работа MSI прерываний

 

я написал драйвер под Linux, разрешение MSI прерываний осуществляется через функцию pci_msi_anable и все хорошо работало, пока не появилась потребность переписать драйвер под QNX 6.5.0

 

по документации на pci server(стандартный, что устанавливается вместе с QNX), достаточно просто передать флаг PCI_USE_MSI в функцию pci_attach_device и все само настроится... но вот только не работает...

 

вот таким образом я получаю дескриптор на устройство:

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 прерывания запрещены, адреса в нулях и данные...

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;

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 недели уже бьюсь, пока результата никакого????

Edited by xxxmatrixxx

Share this post


Link to post
Share on other sites

нашел причину, почему стандартные средства QNX не отрабатывали флаг PCI_USE_MSI - необходимо грузить ядро с pci-bios-v2 вместо простого pci-bios, после пересборки ядра с этим сервером, MSI верно определились

 

всю информацию можно найти в http://www.qnx.com/developers/docs/6.5.0/i...ck_gettime.html

 

вбив в строку поиска msi

 

надеюсь, эта информация кому-нибудь поможет

Share this post


Link to post
Share on other sites
надеюсь, эта информация кому-нибудь поможет

Информация любопытная... познавательная...

Только вряд ли "кому-нибудь поможет", ... потому как OS QNX на сегодня, на 36-м году своей жизни (с 1982) - абсолютно мёртвое изделие, конченое ... и даже не только в преждних версиях 6.5.Х, а даже в 7.0 от марта 2017 - это всё "потуги".

Проторговались, прожлобились... :santa2: ... при активной помощи питерской "СВД Встраиваемые системы" :wacko:

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this