Страниц: 1 2 [3]
  Печать  
Автор Тема: аналог setpci ?  (Прочитано 15193 раз)
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #30 : Мая 22, 2013, 08:00:04 pm »

И еще один момент не понятен, почему после инициализации cardbus cis pointer и bar-4 оба равны 0xffffffff. Может, конечно, в джамперах вся соль. Обе платы ведут себя идентично, что говорит, что это глюк by design.
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


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

И еще один момент не понятен, почему после инициализации cardbus cis pointer и bar-4 оба равны 0xffffffff. Может, конечно, в джамперах вся соль. Обе платы ведут себя идентично, что говорит, что это глюк by design.
Ну, тут довольно просто. При выяснении размера окна сначала пишутся в бары FF-ы,
после бары читаются, и по спецификации устройство должно установить часть битов
в "1", которые можно менять при настройке (нули при этом определяют максимальный
смещение внутри окна, или размер). Таким образом, в данном случае размер окна 0.
Так часто делают хитрые кардбасы и пр., когда в слот ничего не вставлено.
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #32 : Мая 23, 2013, 12:07:27 am »

MLP, единственный правильный способ общения с конфигурационным пространством PCI в QNX - через pci server. Причем pci_*_config*() используются *только* при настройке расширенного пространства о котором pci server не знает. Для настройки ресурсов существуют другие функции, более того, если вы читаете ресурсы с помощью pci_read_config*() можете получить не то, что хотели.

Для диагностики зависания включите verbose у pci server. Там вроде 5 уровень надо включить (5 штук в параметре -vvvvv) чтобы он выводил сообщения в stderr. Лог в студию.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #33 : Мая 23, 2013, 01:23:25 am »

И еще один момент не понятен, почему после инициализации cardbus cis pointer и bar-4 оба равны 0xffffffff. Может, конечно, в джамперах вся соль. Обе платы ведут себя идентично, что говорит, что это глюк by design.
Ну, тут довольно просто. При выяснении размера окна сначала пишутся в бары FF-ы,
после бары читаются, и по спецификации устройство должно установить часть битов
в "1", которые можно менять при настройке (нули при этом определяют максимальный
смещение внутри окна, или размер). Таким образом, в данном случае размер окна 0.
Так часто делают хитрые кардбасы и пр., когда в слот ничего не вставлено.
Это хорошо, что вы ссылаетесь на спецификацию. Жаль только что вы ее не читали или не поняли. Когда размер окна 0, все биты регистра заведены на 0.
Записан
mv
Full Member
***
Offline Offline

Сообщений: 153


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

MLP, единственный правильный способ общения с конфигурационным пространством PCI в QNX - через pci server. Причем pci_*_config*() используются *только* при настройке расширенного пространства о котором pci server не знает. Для настройки ресурсов существуют другие функции, более того, если вы читаете ресурсы с помощью pci_read_config*() можете получить не то, что хотели.

Да это просто дамп, чтобы посмотреть. Ресурсы берутся из pci_dev_info после pci_attach_device(), как и положено. На прошлой странице Пони кусок кода своего выкладывал.


И еще один момент не понятен, почему после инициализации cardbus cis pointer и bar-4 оба равны 0xffffffff. Может, конечно, в джамперах вся соль. Обе платы ведут себя идентично, что говорит, что это глюк by design.

Учитывая, что у линукса там тоже самое:
Цитировать
20: ff ff ff ff 00 01 00 fa ff ff ff ff d1 dd 02 00
и QNX'вый PCI сервер cardbus_cis вообще трогать не должен, получается некоторого рода особенность.


Про размер окна, вот кусок из PCI сервера:
Код:
в Base_Address_Regs[i] пишем 0xffffffff
читаем Base_Address_Regs[i] в tmp
if (0xffffffff == tmp)
size = DEFAULT_SIZE; //256
else
size = (~tmp) + 1;
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #35 : Мая 23, 2013, 06:40:21 pm »

Это хорошо, что вы ссылаетесь на спецификацию. Жаль только что вы ее не читали или не поняли. Когда размер окна 0, все биты регистра заведены на 0.
Да неужели? Wink Есть разница между выключенным баром (когда там нули) и включенным, но без девайса.
В последнем случае фактически происходит ошибка транзакции и бар должен устанавливаться в FF-ы,
при этом софт должен выставлять размер окна в 0. Наблюдается как раз у мостов, которые в общем
случае не знают, есть ли по транслированному адресу устройство или нет. А PLX - мост. Строго говоря,
для них все бары - device specific, в данном случае старшие 4 бара программируются вообще из EEPROM.

Да это просто дамп, чтобы посмотреть. Ресурсы берутся из pci_dev_info после pci_attach_device(), как и положено. На прошлой странице Пони кусок кода своего выкладывал.
Я имел ввиду, что данные полученным с помощью pci_read_config*() нельзя напрямую пихать в InterruptAttach() и т.д.
Для дампа - все ок.

Про размер окна, вот кусок из PCI сервера:
Код:
в Base_Address_Regs[i] пишем 0xffffffff
читаем Base_Address_Regs[i] в tmp
if (0xffffffff == tmp)
size = DEFAULT_SIZE; //256
else
size = (~tmp) + 1;
Вот тут скорее всего и кроется ошибка - линукс выставляет окно в 0, а QNX в 256. Первая же транзакция
в это окно может привести к тому, что мост выплюнет ее наружу (в local bus в данном случае) и начнет
ждать ack или abort, короче говоря, завершения транзакции. Если устройства физически нет, то это может
продолжаться вечно (особенно если соотвествующие ноги у моста висят в воздухе), при этом с другой
стороны PLX блокирует PCI шину (он обязан это делать) и все висит.

Если это так, то самое логичное - перепрошить EEPROM так, чтобы остались только нужные бары, которые
транслируют адреса к физически подсоединенному устройству. Это уже надо уточнять у производителя платы.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


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

>Вот тут скорее всего и кроется ошибка - линукс выставляет окно в 0, а QNX в 256.

А скажите, почему линукс не разрешает при этом работу этого устройства? (ведь с другими платами не надо setpci в линуксе делать, а с этой надо).
 
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #37 : Мая 24, 2013, 03:53:57 am »

>Вот тут скорее всего и кроется ошибка - линукс выставляет окно в 0, а QNX в 256.

А скажите, почему линукс не разрешает при этом работу этого устройства? (ведь с другими платами не надо setpci в линуксе делать, а с этой надо).
Включение устройства (через PCI_COMMAND) делает непосредственно драйвер, поэтому варианты следующие:
1. Драйвер не загружен (наиболее вероятно).
2. Загружен, но не тот (hisax, что сообщил lspci - это вообще ISDN карта).
3. Обломался непосредственно pci_device_enable() - надо смотреть логи.

Кстати, вместо перепрошивки EEPROM можно указать не PCI_INIT_ALL, а только рабочие ресурсы
(PCI_INIT_BASE2|PCI_INIT_IRQ|...) - эффект должен быть тем же самым.
Записан
Страниц: 1 2 [3]
  Печать  
 
Перейти в: