Полная версия этой страницы:
PCI Control Register
Просветите пожалуйста, кто производит запись в регистр CONTROL биты 0 и 1. Я так понимаю, что запись производится при конфигурации, если было обнаружено, что устройство на шине требует н-ое кол-во адресного простр-ва ввода/вывода и ему назначен диапазон адресов (т.е. записан базовый адрес в в соответствующий BAR), то в бит 0 записывается 1. И соответственно для пространства памяти в бит 1 тоже.
Поправьте, если я не так понял. Спасибо.
Эти биты выставляются устройством, то есть вами.
Запись базовых адресов имеет смысл только если хотя бы один из этих бит = '1'.
Тогда как правильно определить, что моему устройству был выделен диапазон адресов: сравнить BAR после записи - если не равен всем единицам или нулям - значит базовый адрес записан?
DeadMoroz
Dec 6 2006, 02:59
Эти биты устанавливаются системой при конфигурировании базовых адресов.
В Вашем драйвере устройства также стоит проверить базовые адреса на отличие от 0.
Мнения разошлись! Может еще какие варианты будут?
И все таки, насколько я понимаю ихний, стандарт гласит (п.6.2.2 PCI Spec 2.2):
For instance, device that do not implement an I/O Space will not implement a writable element at bit location 0 of the Command register. Devices typically power up with all 0's in this register...
Т.е. если устройства обычно стартуют с нулями в этом регистре и при этом требуют адр. пространство, то все таки система должна в них писать единичку?
Единички должна писать система (BIOS). Смысл - разрешение декодирования адресов памяти и ввода вывода после записи в BARы конкретных значений. Но уж железными '1' они быть точно не могут, так как это противоречит спецификации.
BSV, полностью с вами согласен.
Добавлю, что если устройство не предполагает работы с каким-либо из этих адресных пространств,то в соотв. бит должен быть заведен 0 (записать 1 нельзя).То есть устройство не воспринимает транзакции в соответствующем адресном пространстве.В то же время это не влияет на генерацию транзакций самим устройством.Например, если биты 0 и 1 Command регистра PCI-PCI бриджа выставлены в 0, то он пропускает транзакции только в одном направлении (Secondary --> Primary).
Виноват, я поспешил с ответом. В свое оправдание скажу, что на практике это требование оказалось не так критично и жесткое прописывание битов вполне работоспособно (протестировано на многих современных материнках). Но стандарт есть стандарт, признаю ошибку.
DeadMoroz
Dec 7 2006, 04:16
Ну да, на практике я даже адреса жестко задавал, и работало (но не везде). Как говорится: если нельзя, но очень хочется, то можно
Спасибо всем за участие, имхо вопрос исчерпан.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.