Книга: Аппаратные интерфейсы ПК. Энциклопедия

6.2.11. Программный доступ к конфигурационному пространству и генерация специальных циклов

6.2.11. Программный доступ к конфигурационному пространству и генерация специальных циклов

Поскольку конфигурационное пространство PCI обособлено, в главный мост приходится вводить специальный механизм доступа к нему командами процессора, который «умеет» обращаться только к памяти или вводу-выводу. Этот же механизм используется и для генерации специальных циклов. Для PC-совместимых компьютеров предусмотрено два механизма, из которых в спецификации 2.2 оставлен только первый (Configuration Mechanism #1). Номер механизма, которым пользуется конкретная системная плата, можно узнать путем вызова PCI BIOS.

Конфигурационные циклы адресуются к конкретному устройству (микросхеме PCI), для которого должен быть сформирован сигнал выборки IDSEL (единичное значение). Номер функции и адрес регистра декодируется самим устройством. Поскольку сигнал IDSEL воспринимается устройством только в фазе адреса, для него используют позиционное кодирование в линиях старших битов шины AD (конфигурационное пространство всех устройств занимает лишь малую часть пространства с 32-битной адресацией). На этих линиях в фазе адреса конфигурационного обращения может быть лишь один единичный бит, остальные — нулевые. Таким образом, только одно устройство будет выбрано сигналом IDSEL.

Для работы механизма № 1 в пространстве ввода-вывода зарезервированы 32-битные порты с адресами 0CF8H и 0CFCh, входящие в главный мост. Для обращения к конфигурационному пространству в порт CONFIG_ADDRESS (RW, адрес CF8h) заносят 32-разрядный адрес, декодируемый в соответствии с рис. 6.9, а. После занесения адреса обращением к порту CONFIG_DATA (RW, адрес CFCh) можно прочитать или записать содержимое требуемого конфигурационного регистра. В регистре CONFIG_ADDRESS бит 31 является разрешением формирования конфигурационных и специальных циклов. В зависимости от номера шины, указанного в этом регистре, главный мост генерирует конфигурационные циклы одного из двух типов.

Для обращения к устройству, находящемуся на нулевой шине (подключенной к главному мосту), используется цикл типа 0 (биты 1:0=00). Главный мост декодирует поле номера устройства в позиционный код, помещаемый на линии AD[31:11]; номер адресуемой функции, адрес регистра и биты 1:0=00 передаются на шину прозрачно (рис. 6.9, б). Устройству 0 соответствует бит AD11, устройству 1 — AD12, устройству 20 — AD31. Поскольку нулевым устройством является главный мост, который и осуществляет декодирование, на шину единичное значение AD11 в цикле типа 0 не выводится. Устройства PCI, расположенные в микросхеме главного моста, могут использовать номера 21–31, для которых линий AD уже не хватает. На системной плате вход IDSEL каждого слота или микросхемы PCI-устройства соединяется со своей линией адреса. Как правило, слоты подключаются, начиная с линии AD31 (и «вниз»), микросхемы устройств PCI, расположенные на системной плате, подключаются, начиная с AD12 (и «вверх»), но может быть и иной порядок. Цикл типа 0 игнорируется всеми другими мостами, подключенными к нулевой шине.

Для обращения к устройству, находящемуся на ненулевой шине, используется цикл типа 1. Здесь главный мост передает адресную часть регистра CONFIG_ADDRESS на главную шину PCI, обнуляя старшие биты (31:24) и устанавливая в битах 1:0 признак типа «01» (рис. 6.9, в). Мост, опознавший номер подключаемой им шины, передает транзакцию на эту шину, декодируя поле номера устройства в позиционный код (как это делал главный мост для своей шины) и обнуляя биты AD[1:0].


Рис. 6.9. Адресация конфигурационных циклов: а — формат регистра CONFIG_ADDRESS, б — формат адреса на шине в цикле типа 0, в — формат адреса на шине в цикле типа 1

Если конфигурационный цикл не воспринимается ни одним из устройств, мосты могут эту ситуацию отрабатывать двояко: фиксировать отсутствие устройства (сработает Master Abort) или же выполнять операции вхолостую. Однако в любом случае чтение конфигурационного регистра несуществующего устройства (функции) должно возвращать значение FFFFFFFFh (это будет безопасной информацией, поскольку даст недопустимое значение идентификатора устройства).

Если главный мост подключает несколько равноранговых шин (peer buses), то одна из них назначается условно главной, так что вышеописанная логика сохраняется. Чтобы не заботиться об изучении реальной топологии шин, для конфигурационных обращений программам удобно использовать вызовы PCI BIOS, которые имеются для всех режимов процессора (оптимизировать быстродействие здесь не приходится, поскольку эти обращения выполняются не так уж и часто).

Специальный цикл генерируется при записи в CONFIG_DATA, когда в регистре CONFIG_ADDRESS все биты [15:8] единичные, [7:0] нулевые, номер шины, на которой формируется цикл, задается битами [23:16]. В специальном цикле адресная информация не передается (он широковещательный), но путем задания номера шины можно управлять его распространением. Если хост генерирует специальный цикл с нулевым адресом шины, то на главную шину этот цикл выйдет как цикл типа 0 и всеми остальными мостами распространяться не будет. Если требуется полная широковещательность, то хост должен записать ненулевой адрес шины; тогда на главную шину специальный цикл выйдет с типом 1, и все остальные мосты пропустят его на свои шины. Специальный цикл, генерируемый ведущим устройством шины, действует только на шине этого устройства и не распространяется через мосты. Если требуется полная широковещательность, это ведущее устройство должно генерировать специальный цикл посредством записей в регистры CONFIG_ADDRESS и CONFIG_DATA, задавая ненулевой номер шины.

Для работы механизма № 2 в пространстве ввода-вывода зарезервированы два 8-битных порта с адресами 0CF8H и 0CFAh, входящие в главный мост. Этот механизм использует отображение конфигурационного пространства устройств PCI на область C000-CFFF пространства ввода-вывода. Поскольку этой области (4 К портов) недостаточно для отображения конфигурационного пространства всех устройств всех шин PCI, формирование адреса выполняется весьма замысловатым образом. В регистре CSE (Configuration Space Enable) с адресом 0CFSh биты 7:4 являются ключом разрешения отображения: при нулевом ключе область С000-CFFFh остается нормальной частью пространства ввода-вывода, а при ненулевом — отображается на конфигурационное пространство. Биты [3:1] несут номер функции, к пространству которой адресуются обращения. Единичное значение бита 1 вызывает формирование специального цикла (Special Cycle Enable, SCE). При обращении к конфигурационному пространству устройств нулевой шины чтение или запись двойного слова в порт по адресу C000-CFFCh генерирует конфигурационный цикл, в котором из адреса порта биты [2:7] поступают на шину AD[2:7] как индекс регистра конфигурационного пространства, а биты [11:8] декодируются в позиционный код выбора устройства (линии IDSEL) на линиях AD[31:16]. Номер функции на линии AD[10:8] поступает из регистра CSE, линии AD[1:0] нулевые. Для обращения к устройствам ненулевой шины служит регистр перенаправления (Forward Register) с адресом 0CFAh, в который помещают номер шины (по сбросу этот регистр обнуляется). Если номер шины ненулевой, то генерируется цикл типа 1 (см. рис. 6.9, в), в котором номер функции поступает из регистра CSE, младшие 4 бита номера устройства поступают с битов адреса (AD15=0), а номер шины — из регистра перенаправления (биты AD[1:0]=01 и AD[31:24]=0 формируются аппаратно).

Для генерации специального цикла по этому механизму в регистре CSE устанавливается ненулевой ключ, номер функции 111 и SCE=1, после чего выполняется запись по адресу порта CF00h. В зависимости от содержимого регистра перенаправления будет сгенерирован специальный цикл типа 0 или типа 1 (см. выше).

Оглавление книги


Генерация: 1.467. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз