Jump to content

    
Sign in to follow this  
xxxmatrixxx

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

Recommended Posts

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

 

Есть плата с шиной 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this