Страниц: 1 [2] 3
  Печать  
Автор Тема: аналог setpci ?  (Прочитано 15161 раз)
mv
Full Member
***
Offline Offline

Сообщений: 153


Просмотр профиля
« Ответ #15 : Мая 17, 2013, 06:49:42 pm »

Получается, что BIOS всё-таки диапазоны памяти и IO устройству выдаёт, но по какой-то причине их не включает. А эти диапазоны с другими PCI устройствами в системе не конфликтуют?

Странно, что QNX pci с первого захода не показывает эти диапазоны памяти и IO. Но тем не менее после работы вашей утилиты диапазоны памяти и IO он корректно считывает и они включены.

Я так понял, что вы принудительно в командный регистр ничего не писали и только вызвали
pci_attach_device с PCI_INIT_ALL, так?
Доступ к устройству через порты/память после этих манипуляций есть? Ваш код работает?

Дампил конфиг спейс вот так (в этот раз почему-то флаг PCI_INIT_ALL не приводил к зависанию):
Так диапазоны памяти выданы, они включены, прерывание есть. Зачем ему зависать?

Вам для вызова pci_read/write_config нужен только pci_attach().
pci_attach_device, тем более с PCI_INIT_ALL, вызывать нужно когда вы уже всё подкрутили в конфигурационной области.

А в чём разница? В обоих же случаях просто цело число, нет?

Так в них первые биты под флажки отведены. Эти макросы их и обрабатывают.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #16 : Мая 17, 2013, 09:07:26 pm »

У вас же класс устройства - мост. Запускайте 'pci-bios -B' в билд файле и будет вам счастье. Почему нерегулярно работает не знаю. Может батарейка, а может плату на изгиб потренировали.   

Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #17 : Мая 17, 2013, 09:21:50 pm »

А нет. Не мост. Странно. Надо внимательней посмотреть на конфиг спейс.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #18 : Мая 17, 2013, 09:58:19 pm »

BAR начиная со смещения 0х10 - чепуха полная. Даже после "успешного" конфигурирования там не все адреса прописаны.
BAR4 - 0xffffffff. Такого быть в принципе не должно, потому что если бит0 установлен чтобы показать что это порт вв, бит1 должен быть в нуле.
Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #19 : Мая 18, 2013, 01:10:54 am »

Получается, что BIOS всё-таки диапазоны памяти и IO устройству выдаёт, но по какой-то причине их не включает. А эти диапазоны с другими PCI устройствами в системе не конфликтуют?
Не конфликтуют, с адресами других устройств адреса этой платы не пересекаются.

Цитировать
Я так понял, что вы принудительно в командный регистр ничего не писали и только вызвали
pci_attach_device с PCI_INIT_ALL, так?
Доступ к устройству через порты/память после этих манипуляций есть? Ваш код работает?
Да, после этого дампа программа обмена работает.

Код:
Вам для вызова pci_read/write_config нужен только pci_attach().
pci_attach_device, тем более с PCI_INIT_ALL, вызывать нужно когда вы уже всё подкрутили в конфигурационной области.
Если я правильно понял, перед этим надо с помощью pci -vvv узнать номер шины, номер устройства и номер функции ?
Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #20 : Мая 18, 2013, 01:17:14 am »

Плата однозначно странная, при этом сегодня, несмотря на странности, программу обмена удавалось успешно запустить. Посмотрим, как она себя в понедельник покажет.

ed1k, mv, большое спасибо за помощь!
« Последнее редактирование: Мая 18, 2013, 01:18:51 am от Белый пони » Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #21 : Мая 18, 2013, 02:27:18 am »

А какой из трех ИО банков реально используется? Или все три? И я так понял, память, запрощенная платкой, вообще не используется?

Я не совсем понял откуда вывод, что биос адреса дает. Линукс при старте дает, но что-то ему не нравится, и ввод-вывод запрещен. Я бы еще логи линуксовые посмотрел.

Qnx при старте ничего не делает с ресурсами (в отличии от линукс)но при попытке реинициализации устройства виснет иногда. Вероятно по той же причине, по которой биос ресурсы не дал, и линукс хоть ресурсы дал но устройство запретил.
Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #22 : Мая 18, 2013, 01:23:23 pm »

А какой из трех ИО банков реально используется? Или все три? И я так понял, память, запрощенная платкой, вообще не используется?
Используется только второй IO адресс (в приведённых выше выводах - a400 в линуксе, и a200 в qnx).
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #23 : Мая 21, 2013, 08:53:24 am »

M-да. Веселенькая платка. А заменить ее на настоящую мысли нету?

Еще вопрос: когда вы говорили pci_attach_device() c pci_init_all зависал, это весь комп зависал или только ваше приложение?
Потому как сдается мне наиболее правильное действие при такой кривизне железа будет делать атач девайса без инит ол, смотреть адрес (вдруг биос выдал), если адрес не выдан, делать атач девайса с флагом инит ол и таймером, чтобы снять свой поток если он зависнет. 
Записан
mv
Full Member
***
Offline Offline

Сообщений: 153


Просмотр профиля
« Ответ #24 : Мая 21, 2013, 01:32:48 pm »


Если я правильно понял, перед этим надо с помощью pci -vvv узнать номер шины, номер устройства и номер функции ?


Это можно и в коде с помощью pci_find_device() это узнать.

Про выдачу адресов BIOS'ом похоже поторопился.
Перед вызовом pci_attach_device() стоит посмотреть какие адреса в конфигурационной области BIOS после себя оставил. В вашей тестовой утилите дамп конфигурационной области уже есть, нужно только его перенести до pci_attach_device().

Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #25 : Мая 21, 2013, 05:12:24 pm »

Лучше не перенести, а скопировать.
 
А на плате нету джамперов или конф свичей? Железячники часто любят, что-нибудь такое ставить на всякий случай. Или почитайте доку на этот plx. Используется bar2 и он сконфигурирован правильно. Bar0 не используется  и тоже сконфигурирован правильно. Остальные Bar как будто случайным образом сконфигурированы, а должны быть как bar0.
Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #26 : Мая 21, 2013, 11:42:54 pm »

Сегодня опять плата работала относительно нормально.
Т.е. при включении адреса назначались не всегда и регистр command мог быть 0. Но после  pci_attach_device() c PCI_INIT_ALL (который почему-то в этот раз не подвешивал комп) назначались и адреса и выставлялся регистр command=3. После чего программа обмена с платой работала исправно.
Т.е. в принципе всё работает, только не сразу после перезагрузки/включения.
Почему так - не знаю, на ум приходит только батарейка((

M-да. Веселенькая платка. А заменить ее на настоящую мысли нету?

Еще вопрос: когда вы говорили pci_attach_device() c pci_init_all зависал, это весь комп зависал или только ваше приложение?
Потому как сдается мне наиболее правильное действие при такой кривизне железа будет делать атач девайса без инит ол, смотреть адрес (вдруг биос выдал), если адрес не выдан, делать атач девайса с флагом инит ол и таймером, чтобы снять свой поток если он зависнет. 
Заменить в будущем планы есть. Но пока так.  Да и я с QNX относительно недавно начал работать и хочется понять, это именно в плате проблемы или во мне Smiley
Зависал весь комп. На клавиатуру и движение мыши(при запуске в photon'е) никак не реагировал, только reset. Насколько я понимаю тут таймер не поможет, вы какой таймер имеете в виду?


Если я правильно понял, перед этим надо с помощью pci -vvv узнать номер шины, номер устройства и номер функции ?


Это можно и в коде с помощью pci_find_device() это узнать.

Про выдачу адресов BIOS'ом похоже поторопился.
Перед вызовом pci_attach_device() стоит посмотреть какие адреса в конфигурационной области BIOS после себя оставил. В вашей тестовой утилите дамп конфигурационной области уже есть, нужно только его перенести до pci_attach_device().



Тут не понял ((
Для чтения конфигурационной области с помощью pci_read_config() нужен указатель void* handle который получается только после вызова pci_attach_device() http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/p/pci_read_config.html. А pci_find_device() возвращает значения типа int, которое я так и не понял, что значит. http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/p/pci_find_device.html 
или этот int и есть тот же указатель, что возвращает pci_attach_device() ?

Пока адреса, оставленные в конфигурационной области BIOS'ом, я считываю сразу после включения с помощью pci -vvv. Если не повезло, то регистры с адресами - нулевые, а после pci_attach_device() с PCI_INIT_ALL появляются адресса и 3-ка в регистре command.


Лучше не перенести, а скопировать.
 
А на плате нету джамперов или конф свичей? Железячники часто любят, что-нибудь такое ставить на всякий случай. Или почитайте доку на этот plx. Используется bar2 и он сконфигурирован правильно. Bar0 не используется  и тоже сконфигурирован правильно. Остальные Bar как будто случайным образом сконфигурированы, а должны быть как bar0.

Пара джамперов есть, но я их пока не трогал. Может надо. Пока изучаю описание этого plx'а.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #27 : Мая 21, 2013, 11:59:51 pm »

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

>Для чтения конфигурационной области с помощью pci_read_config() нужен указатель void* handle который получается


А для чтения с помощью pci_read_config32() нужны bus и dev_func, которые pci_find_device() и находит. (ну или ненаходит, если вернутый int не pci_success).

« Последнее редактирование: Мая 22, 2013, 12:09:25 am от ed1k » Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #28 : Мая 22, 2013, 05:31:58 pm »

Сегодня опять всё работало после PCI_INIT_ALL.
Вот конфиг спейсы до и после вызовая pci_attach_device с PCI_INIT_ALL, может кому-то пригодятся. (раздобыл вторую плату и дамплю обе)

До:
Код:
# ./dumb_config4find
PCI server handle: 3

Found device No.0 at bus 0x 2, dev_func 0x 8.
  B5  10  50  90   0   0  80   2   2   0   0  11   0   0   0   0
   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0   0   0   0  D1  DD   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

Found device No.1 at bus 0x 2, dev_func 0x20.
  B5  10  50  90   0   0  80   2   2   0   0  11   0   0   0   0
   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0   0   0   0  D1  DD   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
Device No.2 not found.

Device No.3 not found.

После:
Код:
# ./dumb_config4
PCI server handle: 3

PLX device  No. 0  handle: 134674408
Bus num:0x2,  DevFunc:0x8  Base addr :  0x0  0x8001  0x8201  0xFA000000  0x8301  0xFA000100
  B5  10  50  90   3   0  80   2   2   0   0  11   0   0   0   0
   0   0   0   0   1  80   0   0   1  82   0   0   0   0   0  FA
  FF  FF  FF  FF   0   1   0  FA  FF  FF  FF  FF  D1  DD   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   6   1   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

PLX device  No. 1  handle: 134673816
Bus num:0x2,  DevFunc:0x20  Base addr :  0x0  0x9801  0x8401  0xFA000200  0x8501  0xFA000300
  B5  10  50  90   3   0  80   2   2   0   0  11   0   0   0   0
   0   0   0   0   1  98   0   0   1  84   0   0   0   2   0  FA
  FF  FF  FF  FF   0   3   0  FA  FF  FF  FF  FF  D1  DD   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   7   1   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

PLX device  No. 2  handle: 0
     device No. 2 not found.

PLX device  No. 3  handle: 0
     device No. 3 not found.

(забыл обёртку для адресов PCI_IO_ADDR )


Вот программа, которой дампил "до" с помощью pci_find_device()

Код:
#include <stdio.h>
#include <hw/pci.h>
#include <string.h>

int main ()
{
int pci_server_handle = pci_attach(0);

printf("PCI server handle: %d\n", pci_server_handle);

unsigned device = 0x9050;
unsigned vendor = 0x10b5;
unsigned index = 0;

unsigned bus = 0x666;
unsigned dev_func = 0x666;

unsigned char c[256];

int i = 0; int ii = 0;
int retval = 666;
for( i = 0; i < 4 ; i++)
{
index = i;
retval = pci_find_device( device, vendor, index, &bus, &dev_func );

if( retval == PCI_SUCCESS )
{
printf("\nFound device No.%d at bus 0x%2X, dev_func 0x%2X.", index, bus, dev_func);

memset(  c, 0, sizeof(c) );
pci_read_config8( bus, dev_func, 0x00, 256, c);
for( ii = 0; ii < 128; ii++)
{
if( (ii%16) == 0) printf("\n");
printf("  %2X", c[ii]);
}

}
else
{
printf("Device No.%d not found.\n", i );
}

printf("\n");
}

pci_detach( pci_server_handle );
}

Записан
mv
Full Member
***
Offline Offline

Сообщений: 153


Просмотр профиля
« Ответ #29 : Мая 22, 2013, 06:43:06 pm »

Получается, что после BIOS всё девственно чисто и PCI сервер доблестно раздаёт адреса, прерывания и включает IO/MEM в командном регистре.
Остаётся непонятным что вызывало зависание в предыдущих конфигурациях "без батарейки".
Записан
Страниц: 1 [2] 3
  Печать  
 
Перейти в: