Такой вопрос, как можно узнать что PCI устройство это AGP , такой каламбур. Так как при скане PCI шины все устройства PCI/PCI-X/AGP/PCI-E показываются как PCI, то и встал вопрос как понять что видеокарта AGP а не PCI.
O>Такой вопрос, как можно узнать что PCI устройство это AGP , такой каламбур. Так как при скане PCI шины все устройства PCI/PCI-X/AGP/PCI-E показываются как PCI, то и встал вопрос как понять что видеокарта AGP а не PCI.
Не уверен, что оно самое, но думаю стоит посмотреть в сторону IoGetDeviceProperty() с флагом DevicePropertyBusTypeGuid. Определения GUID'ов можно найти в файле wdmguid.h.
Здравствуйте, olegto,
O>Такой вопрос, как можно узнать что PCI устройство это AGP , такой каламбур
--
Попробуйте использовать Capability IDs из конфигурационного пространства PCI устройства.
Для этого прочитайте сначала Status регистр из стандартного конфигурационного пространства PCI устройства, и, если бит "PCI Capabilities" не установлен, то это, скорее всего, обыкновенное PCI устройство (по крайней мере, это не PCI-X, не PCI-E и не AGP устройстов в Вашем случае).
Если же он установлен, то прочитайте регистр CAP_PTR (Capabilities pointer) и используйте его для чтения следующего PCI Device Dependent region. Все такие region связаны в список, и обязательно имеют в своем составе поля Next Item Pointer и Capability ID (в частности, для Вашего случая, Capability ID = 0x02 — AGP Capability, 0x07 — PCI-X device, 0x10 — PCI Express capability). Заканчивается список таких region, когда текущий Next Item Pointer равен 0.
Читайте и просматривайте такой список, используя значения сначала CAP_PTR, а затем Next Item Pointer и проверяя значение Capability ID.
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Здравствуйте, olegto,
O>>Такой вопрос, как можно узнать что PCI устройство это AGP , такой каламбур ГМ>-- ГМ>Попробуйте использовать Capability IDs из конфигурационного пространства PCI устройства.
ГМ>Для этого прочитайте сначала Status регистр из стандартного конфигурационного пространства PCI устройства, и, если бит "PCI Capabilities" не установлен, то это, скорее всего, обыкновенное PCI устройство (по крайней мере, это не PCI-X, не PCI-E и не AGP устройстов в Вашем случае). ГМ>Если же он установлен, то прочитайте регистр CAP_PTR (Capabilities pointer) и используйте его для чтения следующего PCI Device Dependent region. Все такие region связаны в список, и обязательно имеют в своем составе поля Next Item Pointer и Capability ID (в частности, для Вашего случая, Capability ID = 0x02 — AGP Capability, 0x07 — PCI-X device, 0x10 — PCI Express capability). Заканчивается список таких region, когда текущий Next Item Pointer равен 0. ГМ>Читайте и просматривайте такой список, используя значения сначала CAP_PTR, а затем Next Item Pointer и проверяя значение Capability ID.
ГМ>C уважением, ГМ>Геннадий Майко.
Большое спасибо за ответ (особенно за: "0x07 — PCI-X device, 0x10 — PCI Express capability" эти дефинейшен я не нашёл ни где, хотя и подозревал что это так), я уже и сам набрёл на это.
Кстати нет ли у вас описания структуры 0x10 PCI_CAPABILITY_ID_PCI_EXPRESS, так как там дожно быть расписано где и как можно узанть на какой скорости работает PCI Express- х1 или ... х16.
Здравствуйте, olegto,
O>Кстати нет ли у вас описания структуры 0x10 PCI_CAPABILITY_ID_PCI_EXPRESS, так как там дожно быть расписано где и как можно узанть на какой скорости работает PCI Express- х1 или ... х16.
--
В принципе есть, постараюсь его кратко здесь описать:
DWORD DW0:
PCI Express Capability ID Register [7:0 bits]
Next Capability Pointer Register [15:8]
PCI Express Capabilities Register [31:16]
DW1:
Device Capabilities Register [31:00]
DW2:
Device Control Register [15:0]
Device Status Register [31:16]
DW3:
Link Capabilities Register [31:0]
Maximum Link Width, bits [9:4]:
000000bin = reserved
000001 = x1
000010 = x2
000100 = x4
001000 = x12
010000 = x16
100000 = x32
все остальные значения = reserved.
DW4
Link Control Register [15:0]
Link Status Register [31:16]
Negotiated Link Width, bits [9:4] (эти биты относятся к 16-ти разрядному Link Status register, a не ко всему DW4):
000000bin = reserved
000001 = x1
000010 = x2
000100 = x4
001000 = x12
010000 = x16
100000 = x32
все осталные значения = reserved.
O>Такой вопрос, как можно узнать что PCI устройство это AGP
1. Качается AGP spec, так как технология устаревшая, она давно заморожена.
2. Смотрится, чем PCI отличается от AGP по конфиг-спейсу
3. Читается конфиг-спейс (надо рассказывать, как?)
Здравствуйте, Maxim S. Shatskih, Вы писали:
O>>Такой вопрос, как можно узнать что PCI устройство это AGP
MSS>1. Качается AGP spec, так как технология устаревшая, она давно заморожена. MSS>2. Смотрится, чем PCI отличается от AGP по конфиг-спейсу MSS>3. Читается конфиг-спейс (надо рассказывать, как?)
Скачл такую програмулину: "RW-Everything", она показывает все 256 байт ей я и подгонял свою програмулину.
"MSS>1. Качается AGP spec, так как технология устаревшая, она давно заморожена.
..."
Не нашел такой, быстрее нашел PCI_CAP_ID_AGP и тд описания структур и уже от этого отталкивался.
К сожалению на MSDN-е здесь неописаны все структуру PCI_***_CAPABILITY, товарищ Геннадий Майко помог.
Вот если бы ещё достать описание PCI_CAPABILITY_ID_AGP точнее где в структуре описа скорость AGP х8, х4 ...