определить номер шины PCI
От: alex_line  
Дата: 16.11.06 10:47
Оценка:
Необходимо получить в драйвере номер шины , к которой подключена плата (PCI).
Плата представляет собой мост PCI-PCI и несколько чипов, для которых и устанавливается драйвер.
Для моста винда драйвер устанавливает свой, "стандартный".
Причем внутри платы образуется новая PCI шина, к которой и "подключены" чипы. Таким образом обращение
к IoGetDeviceProperty с PDO чипа дает естественно номер шины внутри платы. А мне нужен номер
шины, куда подключен мост(сама плата).

Полагаю надо каким-то образом получить PDO моста, чтобы затем вызвать IoGetDeviceProperty и
получить то, что требуется, но каким образом узнать PDO моста?

В MSDN ничего путного не нашел...
Re: определить номер шины PCI
От: Геннадий Майко США  
Дата: 16.11.06 12:34
Оценка:
Здравствуйте, alex_line,

_>Необходимо получить в драйвере номер шины , к которой подключена плата (PCI).

_>Плата представляет собой мост PCI-PCI и несколько чипов, для которых и устанавливается драйвер.
_>Для моста винда драйвер устанавливает свой, "стандартный".
_>Причем внутри платы образуется новая PCI шина, к которой и "подключены" чипы. Таким образом обращение
_>к IoGetDeviceProperty с PDO чипа дает естественно номер шины внутри платы. А мне нужен номер
_>шины, куда подключен мост(сама плата).

_>Полагаю надо каким-то образом получить PDO моста, чтобы затем вызвать IoGetDeviceProperty и

_>получить то, что требуется, но каким образом узнать PDO моста?
--
Если Вы знаете VendorId и DeviceId этого PCI-to-PCI моста на плате, то можно воспользоваться старым добрым способом — просканировать все PCI шины с помощью функции HalGetBusData, читая первый DWORD из конфигурационного пространства. Это будет работать даже в Vista.

C уважением,
Геннадий Майко.
Re[2]: определить номер шины PCI
От: alex_line  
Дата: 16.11.06 14:45
Оценка:
Здравствуйте, Геннадий Майко,

ГМ>Если Вы знаете VendorId и DeviceId этого PCI-to-PCI моста на плате, то можно воспользоваться старым добрым способом — просканировать все PCI шины с помощью функции HalGetBusData, читая первый DWORD из конфигурационного пространства. Это будет работать даже в Vista.


Спасибо за совет до этого сам не дошел...

Только не понятно в случае нескольких(а это почти всегда так) плат в системе. Просканировав PCI находим несколько "своих" мостов, как им поставить в соотвествие чип, для которого в данный момент создается устройство FDO?
Для этого надо как-то узнать номер шины, которую образует каждый найденный при сканировании мост... Только вот как?
Re[3]: определить номер шины PCI
От: Геннадий Майко США  
Дата: 16.11.06 15:45
Оценка:
Здравствуйте, alex_line,

_>Только не понятно в случае нескольких(а это почти всегда так) плат в системе. Просканировав PCI находим несколько "своих" мостов, как им поставить в соотвествие чип, для которого в данный момент создается устройство FDO?

_>Для этого надо как-то узнать номер шины, которую образует каждый найденный при сканировании мост... Только вот как?
--
Ну, это просто — сначала определите при помощи той же функции, что этот PCI-to-PCI мост является Вашим, например, по тому-же Hardware ID и DeviceID и, возможно, прочитав дополнительно Header Type (bits [23:16]) по смещение 0x0C из конфигурационного пространства. Затем прочтите DWORD из конфигурационного пространства по смещению 0x18 и получите Primary bus number (bits [7:0]), Secondary bus number (bits [15:8]) и Subordinate Bus number bits ([23:16]). Другие устройства на Вашей плате будут "сидеть", скорее всего, на Secondary bus number (если у Вас только одна "локальная" PCI шина на плате).

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

C уважением,
Геннадий Майко.
Re[4]: определить номер шины PCI
От: alex_line  
Дата: 16.11.06 16:31
Оценка:
ГМ>Ну, это просто — сначала определите при помощи той же функции, что этот PCI-to-PCI мост является Вашим, например, по тому-же Hardware ID и DeviceID и, возможно, прочитав дополнительно Header Type (bits [23:16]) по смещение 0x0C из конфигурационного пространства. Затем прочтите DWORD из конфигурационного пространства по смещению 0x18 и получите Primary bus number (bits [7:0]), Secondary bus number (bits [15:8]) и Subordinate Bus number bits ([23:16]). Другие устройства на Вашей плате будут "сидеть", скорее всего, на Secondary bus number (если у Вас только одна "локальная" PCI шина на плате).

спасибо, это то, что мне и требовалось узнать.
можно даже сделать проще — поскольку известно на какой шине "сидит" чип, то при сканировании проверять принадлежность устройства к мостам (проверять только тип), а если это мост, то проверить Secondary bus number — если совпадет , то это "наш"!

ГМ>Теперь я буду ждать вопроса, как узнать соответствие найденного номера "локальной" PCI шины и той физической платы, на которой она "расположена"


Нет, теперь вопрос другой — при сканировании надо ли каким-то образом синхронизировать этот процесс с системой, ведь работа будет с одними и теми же портами? Думается что надо, но на сколько это критично?
Re[5]: определить номер шины PCI
От: Геннадий Майко США  
Дата: 16.11.06 17:59
Оценка:
Здравствуйте, alex_line,

_> Нет, теперь вопрос другой — при сканировании надо ли каким-то образом синхронизировать этот процесс с системой, ведь работа будет с одними и теми же портами? Думается что надо, но на сколько это критично?

--
Действительно, чтение конфигурационного пространства будет осуществялться через 2 IO порта с предопределенными адресами — 0x0CF8 и 0x0CFC. Однако я абсолютно уверен, что внутри этих функций чтения HalGetXXX доступ к этим портам будет синхронизирован каким-то образом, скорее всего спинлоком. Поэтому специально синхронизировать это процесс с системой не нужно.

C уважением,
Геннадий Майко.
Re[4]: определить номер шины PCI
От: alex_line  
Дата: 16.11.06 19:41
Оценка:
Здравствуйте, Геннадий Майко,

ГМ>Ну, это просто — сначала определите при помощи той же функции, что этот PCI-to-PCI мост является Вашим, например, по тому-же Hardware ID и DeviceID и, возможно, прочитав дополнительно Header Type (bits [23:16]) по смещение 0x0C из конфигурационного пространства. Затем прочтите DWORD из конфигурационного пространства по смещению 0x18 и получите Primary bus number (bits [7:0]), Secondary bus number (bits [15:8]) и Subordinate Bus number bits ([23:16]). Другие устройства на Вашей плате будут "сидеть", скорее всего, на Secondary bus number (если у Вас только одна "локальная" PCI шина на плате).


ну и последний, надеюсь , вопрос:
У всех ли мостов PCI-PCI номера шин можно смотреть по смещению 0x18 в configuration space, на "своем" мосту еще не пробовал, но хотелось бы заведомо универсальное решение, не зависящее от типа моста. Спецификаций на configuration space мостов отдельных не нашел, на сайте интела есть документ по мостам 21154 и 21152, там действительно номера шин находятся по этому смещению. В моем случае надо будет работать и с мостами шин PCI-X, PCI-Express... Не будет ли тут граблей?

заранее благодарен
Re[5]: определить номер шины PCI
От: Геннадий Майко США  
Дата: 17.11.06 04:36
Оценка:
Здравствуйте, alex_line,

_>У всех ли мостов PCI-PCI номера шин можно смотреть по смещению 0x18 в configuration space, на "своем" мосту еще не пробовал, но хотелось бы заведомо универсальное решение, не зависящее от типа моста. Спецификаций на configuration space мостов отдельных не нашел, на сайте интела есть документ по мостам 21154 и 21152, там действительно номера шин находятся по этому смещению. В моем случае надо будет работать и с мостами шин PCI-X, PCI-Express... Не будет ли тут граблей?

--
Думаю, что не будет.
Все PCI-to-PCI мосты должны поддерживать одну и ту же стандартную структуру в начале конфигурационного пространства. Если Вы определили, что это таки да PCI-to-PCI мост, то Вы должны трактовать информацию из его конфигурационного пространства как относящуюся именно к типу 1.

Если я не ошибаюсь, конфигурационное пространство стандартных PCI устройств есть подмножество PCI-X и PCI-E, а для доступа к остальной информации из этого конфигурационного пространства используют Vendor-Specific Capability регистры. Поэтому проблем и с этими шинами быть не должно (во всяком случае, с этой точки зрения, для наших PCI и PCI-E микросхем драйвера ничем не отличаются).

Кстати, можно эту же информацию о шинах PCI получить и в user mode, построив список devnodes (для устройств с enum'ератором ROOT\PCI) с помощью функций SetupDiXXX; затем найдя нужное Вам устройство, проанализировав, например, HardwareId; затем определить его parent device (это должен быть как раз PCI-to-PCI мост); а для него уже можно определить его Location, включая PCI bus и slot number.

C уважением,
Геннадий Майко.
Re: определить номер шины PCI
От: alex_line  
Дата: 22.11.06 15:59
Оценка:
Все получилось, Геннадию Майко — спасибо!

Сделал все сканированием PCI шин с помощью ф-ии HalGetBusData. Был один глюк (или не глюк) — при вызове HalGetBusData постоянно получал "синий экран". Дело оказалось в директиве DRIVERTYPE=WDM (файл sources), если ее убрать, то все работает, иначе — "синий экран".

Может кому пригодится, нашел на тему доступа к конфигурационному пространству стеков других драйверов статейку в MSDN (DDK\Kernel-ModeDriver Architecture\Design Guide\Input-Output Techniques\Accessign Device Configuration Space\Obtaining Configuration Information from Other Driver Stack).

Варианты доступа следующие :

1. Использовать HalGetBusData/HalSetBusData. Не рекомендовано к применению, но ,на мой взляд, самый лучший способ.

2. С помощью механизма инерфейсов (инерфейс BUS_INTERFACE_STANDARD).
Насколько я понял из статьи, этот способ не работает только для мостов PCI-PCI, потому как для них такой интерфейс не регистрируется (во всяком случае для мостов он точно не годится, поэтому и пробовать не стал).

3. Использование драйвера-фильтра.
Уж слишком все усложняется в этом случае...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.