Для транзакций записи в память, находящуюся по другую сторону моста, мост должен производить отправленную запись (posted write). При этом адрес и данные записи принимаются в буферы моста, и для инициатора транзакция завершится раньше, чем данные дойдут до реального получателя. Мост выполнит их доставку в удобное для другой стороны время, причем эта доставка может выполняться и не за одну транзакцию, инициированную уже мостом. Конечно, если мост не успевает освободить свои буферы отправленной записи (их размер ограничен), то ему придется на некоторые транзакции записи в память отвечать условием «повтор» (Retry). Однако это не будет отложенной транзакцией — запросы на запись в память в очередь отложенных транзакций мост не ставит. Для отправленных записей у моста имеются отдельные буферы. Отправленная запись в общем случае применима только к памяти. Записи в порты ввода-вывода отправлять имеет право только главный мост, и то только для транзакций, инициированных центральным процессором. Запись в конфигурационное пространство отправлена быть не может.
Мосты могут преобразовывать транслируемые ими отправленные записи с целью оптимизации пропускной способности шины и эффективности всей системы. Мост может, например, одну длинную пакетную транзакцию обычной записи в память MW (Memory Write) блока, не выровненного по границам строк кэша, разбить на три: MW от начала до ближайшей границы строки, MWI (Memory Write Invalidate, запись с инвалидацией) с одной или несколькими целыми строками кэша и MW от последней границы строки до конца блока. Кроме того, несколько последовательных транзакций записи могут объединяться в одну пакетную, в которой лишние записи могут блокироваться с помощью сигналов разрешения байтов. Например, последовательность одиночных записей двойных слов по адресам 0, 4, Ch может быть скомбинирована (write combining) в один пакет с начальным адресом 0, а во время третьей фазы данных (когда предполагается нетребуемый адрес 8) все сигналы C/BE[3:0]# будут пассивны. Записи отдельных байтов в определенных случаях могут быть объединены (byte merging) в одну транзакцию, это допустимо для предвыбираемой памяти. Так, например, последовательность записей байтов по адресам 3, 1, 0 и 2 может быть объединена в одну запись двойного слова, поскольку эти байты принадлежат одному адресуемому двойному слову. Комбинирование и объединение могут работать независимо (объединенные транзакции могут комбинироваться), однако эти преобразования не изменяют порядок следования физических записей в устройства. Наличие этих возможностей не обязательно — оно зависит от «ловкости» мостов. Цель преобразований — сократить число отдельных транзакций (каждая имеет по крайней мере одну «лишнюю» фазу адреса) и, по возможности, фаз данных. Однако мост не имеет права коллапсировать записи (write collapsing): если к нему поступает две и более отправленных записи с одинаковым стартовым адресом, он должен все их отработать.
Устройства PCI должны нормально отрабатывать комбинированные записи — если устройство не допускает комбинирования, оно неправильно спроектировано. Если устройство не допускает объединения байтов, то оно в описании своей памяти должно иметь обнуленным бит Prefetchable.
Для облегчения взаимодействия с устройствами PCI имеются дополнительные функции BIOS, доступные как из реального, так и защищенного режима работы процессора. Функции PCI BIOS используются только для поиска и конфигурирования устройств PCI — процедур, требующих доступа к их конфигурационному пространству. Функции приходится поддерживать и использовать потому, что циклы конфигурационных обращений, как и специальный цикл, выполняются специфическим образом. Кроме того, PCI BIOS позволяет управлять коммутатором запроса прерываний (PCI Interrupt Steering), скрывая специфический программный интерфейс чипсета системной платы. Остальное взаимодействие с устройствами через их пространства памяти и ввода$вывода, а также обработка прерываний в поддержке со стороны BIOS не нуждаются, поскольку выполняются непосредственно командами процессора и не зависят от платформы (чипсета системной платы). Регулярная работа с этими устройствами выполняется через обращения к регистрам устройств по адресам, полученным при конфигурировании, и обработку известных номеров прерываний от этих устройств. Функция проверки наличия PCI BIOS позволяет определить доступные конфигурационные механизмы, и, зная их работу, программа в дальнейшем может обходиться и без вызовов PCI BIOS.
Программы с помощью функций PCI BIOS могут искать интересующие их устройства по идентификаторам или кодам класса. Если стоит задача полного «переучета» установленных устройств, то она решается чтением конфигурационной информации по всем функциям всех устройств всех шин — это быстрее, чем перебирать все возможные сочетания идентификаторов или классов кодов. Для найденных устройств программы должны определять реальные настройки чтением регистров конфигурационного пространства, учитывая возможность перемещения ресурсов по всему пространству и даже между пространствами памяти и вводавывода.
Для 16-битного интерфейса реального режима, V86 и 16$битного защищенного режима, функции PCI BIOS вызываются через прерывание Int 1Ah; номер функции задается при вызове в регистре AX. Возможна и программная имитация прерывания дальним вызовом по физическому адресу 000FFE6Eh (стандартная точка входа в обработчик Int 1Ah) с предварительным занесением в стек регистра флагов.
Для 32$разрядных вызовов защищенного режима все эти же функции вызываются через точку входа, найденную через каталог 32$разрядных сервисов (см. ниже), при этом назначение входных и выходных регистров и флага CF сохраняется. До использования 32$разрядного интерфейса следует сначала найти его каталог и убедиться в наличии сервисов PCI BIOS по идентификатору «$PCI» (049435024h).
Вызовы требуют глубокого стека (до 1024 байт). Признаком нормального выполнения является CF = 0 и AH = 0; при CF = 1 AH содержит код ошибки:
Функции PCI BIOS перечислены ниже:
AX = B101h — проверка присутствия PCI BIOS. При наличии PCI BIOS возвращает CF = 0, AH = 0 и EDX = 20494350h (строка символов «PCI»); проверяться должны все три признака. При этом в AL находится описатель аппаратного механизма доступа к конфигурационному пространству и генерации специальных циклов PCI:
В регистрах BH и BL возвращается старший и младший номер версии (BCD-цифры), в CL — максимальный номер шины PCI, присутствующий в системе (число шин — 1, поскольку они нумеруются с нуля последовательно). В регистре EDI может возвращаться линейный адрес точки входа 32$разрядных сервисов BIOS. Этот адрес возвращается не всеми версиями BIOS (некоторые не изменяют EDI); для проверки можно при вызове обнулять EDI и проверять на нуль возвращенное значение.
Смещение | Размер | Назначение |
0 | byte | PCI Bus number — номер шины PCI |
1 | byte | PCI Device number — номер устройства PCI |
2 | byte | Назначенная связь для линии INTA# (0 — нет, 1 — IRQ1, …0Fh — IRQ15) |
3 | word | Битовая карта возможных назначений для INTA# (бит 0 — IRQ0, … бит 15 — IRQ15) |
5 | byte | Назначенная связь для линии INTB# (аналогично) |
6 | word | Битовая карта возможных назначений для INTB# (аналогично) |
8 | byte | Назначенная связь для линии INTC# (аналогично) |
9 | word | Битовая карта возможных назначений для INTC# (аналогично) |
11 | byte | Назначенная связь для линии INTD# (аналогично) |
12 | word | Битовая карта возможных назначений для INTD# (аналогично) |
14 | byte | Номер слота (для физической идентификации карты) |
15 | byte | Резерв |
Для работы на шине PCI используются микросхемы КМОП (CMOS), причем имеются две спецификации: с напряжениями питания интерфейсных схем 5 и 3,3 В. Для них применимы параметры сигналов по постоянному току, приведенные в таблице. Однако мощность интерфейсных элементов (транзисторов для вентилей) выбрана меньшей, чем требовалось бы для переключения сигналов на высокой частоте (33 или 66 МГц). Здесь используется эффект отражения сигналов, формируемых микросхемами на проводниках шины, от несогласованных концов этих проводников, являющихся для таких высоких частот длинными линиями. На концах проводников шины нет терминаторов, поэтому от них приходящая волна сигнала отражается с тем же знаком и с той же амплитудой. Складываясь с прямым сигналом, обратная волна и обеспечивает нужный приемнику уровень сигнала. Таким образом, передатчик генерирует сигнал, уровень которого до прихода отраженного сигнала находится между уровнями переключения, и достигает требуемого уровня только после прихода отраженной волны. Это накладывает ограничение на физическую протяженность шины: сигнал должен успеть обернуться (дойти до конца и вернуться отраженным) за время, составляющее менее трети периода синхронизации (то есть 10 нс при 33 МГц, 5 нс при 66 МГц).
Параметр | 5 В интерфейс | 3,3 В интерфейс |
Входное напряжение низкого уровня, В | –0,5 ≤ Uil ≤ 0,8 | –0,5 ≤ Uil ≤ 0,3×Vcc |
Входное напряжение высокого уровня, В | 2 ≤ Uih ≤ Vcc +0,5 | Vcc/2 ≤ Uih ≤ Vcc +0,5 |
Выходное напряжение низкого уровня, В | Uol ≤ 0,55 | Uol ≤ 0,1×Vcc |
Выходное напряжение высокого уровня, В | Uoh ≥ 0,8 | Uoh ≥ 0,9×Vcc |
Напряжение питания VCC, В | 4,75 ≤ Ucc ≤ 5,25 | 3,0 ≤ Ucc ≤ 3,6 |
Области пространств памяти и ввода/вывода, занимаемые устройством (точнее, функцией), описываются регистрами BAR (Base Address Register) в заголовке конфигурационного пространства. При этом подразумевается, что длина области выражается числом 2n (n = 0, 1, 2…) и область выровнена естественным образом. В PCI области памяти выделяются по 2n параграфов (16 байт), то есть минимальный размер области — 16 байт. Области ввода/вывода выделяются по 2n двойных слов. Мосты PCI-PCI имеют карты адресов памяти с гранулярностью 1 Мбайт и карты ввода/вывода с гранулярностью 4 кбайт.
В PCI пакетная транзакция может быть прервана на границе любого двойного слова (в 64-битных операциях — учетверенного слова). В PCI-X ради оптимизации обращений к памяти пакетные транзакции разрешается прерывать только в разрешенных точках, называемых ADB (Allowable Disconnect Boundary — разрешенные границы отключения). Точки ADB располагаются с интервалом 128 байт — это целое число (1, 2, 4 или 8) строк кэша современных процессоров. Конечно, это ограничение относится только к границам транзакций внутри последовательности. Если последовательность должна по плану заканчиваться не на границе ADB, то и ее последняя транзакция будет завершена не на границе. Однако этой ситуации стараются избегать, разрабатывая такие структуры данных, которые могут быть выровнены подходящим образом (иногда даже ценой избыточности).
С границами адресов связан термин ADQ (ADB Delimited Quantum) — часть транзакции или буферной памяти (в мостах и устройствах), лежащая между границами соседних ADB. Например, транзакция, пересекающая одну границу ADB, состоит из двух ADQ (квантов) данных и занимает в мосте два буфера ADQ.
В соответствии с разрешенными границами транзакций области памяти, занимаемые устройствами PCI-X, также должны начинаться и заканчиваться на ADB — память выделяется квантами ADQ. Таким образом, минимальная область памяти, выделяемая устройству PCI-X, не может быть меньше 128 байт, а с учетом правил описания области ее размер может составлять 128 × 2n байт.
Протокол шины PCI-X обеспечивает мостам возможность более эффективной работы. Детерминированность длины транзакции позволяет мосту более эффективно планировать трансляцию транзакций. К размеру буферов мостов предъявляются особые требования: для каждого типа очередей буферы должны вмещать не менее двух строк кэша. По отношению к мостам PCI мост PCI-X имеет ряд особенностей, отмеченных далее.
Интерфейсы моста PCI-X могут работать как в режиме PCI, так и PCI-X (Mode 1 или Mode 2). Мост должен определить возможности самого слабого устройства на своем вторичном интерфейсе и перевести эту шину (все устройства) в соответствующий режим (по протоколу и частоте синхронизации).
В случае соединения шин PCI и PCI-X мосту приходится преобразовывать некоторые команды, а также преобразовывать протокол. При трансляции транзакции с PCI на PCI-X мосту приходится формировать атрибуты транзакции. Для них номер шины берется из регистров моста, номера устройства и функции устанавливаются нулевыми. Значение счетчика байтов для команд обращения к памяти мост может «придумать» исходя из команды (для чтения и записи строк кэша длину можно вычислить из длины строки) или адреса (определить возможность предвыборки).
Все одиночные (DWORD) транзакции, а также все пакетные чтения с шины PCI-X, адресуемые за мост, завершаются мостом как расщепленные транзакции (а не отложенные, как в PCI). Это более выгодное использование шины, поскольку инициатору (запросчику) транзакции не нужно периодически повторять запрос — ответ придет к нему сам, по мере своей готовности. Все пакетные записи в память отрабатываются как отправленные записи. Конечно, если у моста заполнены буферы запросов, то ему придется отложить транзакцию (условием Retry).