Гук Михаил Юрьевич
Шрифт:
В заголовке конфигурационного пространства описываются потребности в адресах трех типов:
• регистры в пространстве ввода_вывода (I/O Space));
• регистры ввода_вывода, отображенные на память (Memory Mapped I/O). Это область памяти, обращения к которой должны производиться в строгом соответствии с тем, что запрашивает инициатор обмена. Обращение к этим регистрам может изменять внутреннее состояние периферийных устройств;
• память, допускающая предвыборку (Prefetchable Memory). Это область памяти, «лишнее» чтение которой (с неиспользуемыми результатами) не приводит к побочным эффектам, все байты считываются независимо от сигналов BE[3:0]#, и записи отдельных байтов мостом могут быть объединены (то есть это память в чистом виде).
Потребности в адресах указываются в регистрах базовых адресов – BAR (Base Address Register). Конфигурирующая программа может определить и размеры требуемых областей. Для этого после аппаратного сброса она должна считать и сохранить значения базовых адресов (это будут адреса по умолчанию), записать в каждый регистр FFFFFFFFh и снова считать их значение. В полученных словах нужно обнулить биты декодирования типа (биты [3:0] для памяти и биты [1:0] для ввода-вывода), инвертировать и инкрементировать полученное 32-битное слово – результатом будет длина области (для портов биты [31:16] игнорировать). Метод подразумевает, что длина области выражается числом 2n и область выровнена естественным образом. Стандартный заголовок вмещает до 6 регистров базового адреса, но при использовании 64-битной адресации число описываемых блоков сокращается. Неиспользуемые регистры BAR при чтении всегда должны возвращать нули.
В PCI имеется поддержка старых (legacy) устройств (VGA, IDE), которые сами себя таковыми объявляют по коду класса в заголовке. Их традиционные (фиксированные) адреса портов не заявляются в конфигурационном пространстве, но как только устанавливается бит разрешения обращения к портам, устройствам разрешается ответ и по этим адресам.
Конфигурационное пространство обычных устройств (тип 0)
Формат заголовка конфигурационного пространства приведен на рис. 5.1, серым цветом здесь выделены поля, обязательные для всех устройств; регистры, специфичные для устройства, могут занимать адреса конфигурационного пространства в пределах 40-FFh.
Перечисленные ниже поля идентификации допускают только чтение:
• Device ID – идентификатор устройства, назначаемый производителем;
• Vendor ID – идентификатор производителя микросхемы PCI, назначенный PCI SIG. Идентификатор FFFFh является недопустимым; это значение должно возвращаться при чтении конфигурационного пространства несуществующего устройства;
• Revision ID – версия продукта, назначенная производителем. Используется как расширение поля Device ID;
• Header Type – тип заголовка (биты [6:0]), определяющий формат ячеек в диапазоне 10-3Fh и несущий признак многофункционального устройства (если бит 7 установлен). На рисунке приведен формат заголовка типа 0, относящийся
• именно к устройствам PCI. Тип 01 относится к мостам PCI-PCI; тип 02 относится к мостам для CardBus;
• Class Code – код класса, определяющий основную функцию устройства, а иногда и его программный интерфейс (см. далее). Старший байт (адрес 0Bh) определяет базовый класс, средний – подкласс, младший – программный интерфейс (если он стандартизован).
Остальные поля заголовка являются регистрами устройств, допускающими как запись, так и чтение.
Регистр команд Command (RW) служит для управления поведением устройства на шине PCI. Регистр допускает как запись, так и чтение. После аппаратного сброса все биты регистра (кроме специально оговоренных исключений) обнулены. Назначение бит регистра команд: бит 0 – IO Space – разрешение ответа на обращения к пространству ввода-вывода;
• бит 1 – Memory Space – разрешение ответа на обращения к пространству памяти;
• бит 2 – Bus Master – разрешение работы инициатором (в режиме прямого управления шиной); игнорируется в PCI–X при завершениях расщепленных транзакций;
• бит 3 – Special Cycles – разрешение реакции на специальные циклы;
• бит 4 – Memory Writes and Invalidate enable – разрешение использовать команды «запись с инвалидацией» при работе инициатором (если бит обнулен, то вместо этих команд должна использоваться обычная запись в память); игнорируется в PCI–X;
• бит 5 – VGA palette snoop – разрешение слежения за записью в регистр палитр;
• бит 6 – Parity Error Response – разрешение нормальной реакции (вырабатывать сигнал PERR#) на обнаруженную ошибку четности или ECC. Если бит обнулен, то устройство должно только фиксировать ошибку в регистре состояния и продолжать выполнение транзакции; при ECC$контроле данные об ошибке записываются в регистры ECC;
• бит 7 – Stepping Control – возможность пошагового переключения (address/data stepping) линий (если устройство никогда этого не делает, бит регистра «запаян» в «0», если делает всегда – в «1», устройство с такой возможностью по сбросу устанавливает этот бит в «1»). В версии 2.3 и PCI$X бит освобожден (в связи с отменой степинга);
• бит 8 – SERR# Enable – разрешение генерации сигнала ошибки SERR# (ошибка адреса сообщается, когда этот бит и бит 6 установлены);
• бит 9 – Fast Back-to-Back Enable (необязательный, игнорируется в PCI$X) – разрешение ведущему устройству использовать быстрые смежные обращения к разным устройствам (если бит обнулен, быстрые обращения допустимы лишь для транзакций с одним агентом);
• бит 10 Interrupt Disable —, запрет генерации сигнала прерываний по линиям INTx (по аппаратному сбросу и включению питания бит обнулен – прерывания разрешены). Бит определен начиная с PCI 2.3. Ранее был резервным;