Шины PCI, USB и FireWire
Шрифт:
• target-abort – отказ, введение сигнала STOP# одновременно со снятием сигнала DEVSEL# (в предыдущих случаях во время появления сигнала STOP# сигнал DEVSEL# был активен). После этого данные уже не передаются. Отказ производится, когда целевое устрйство обнаруживает фатальную ошибку или иные условия, по которым оно уже никак не сможет обслужить данный запрос (в том числе и неподдерживаемую команду).
Использование трех типов прекращения транзакции вовсе не обязательно для всех целевых устройств, однако любое ведущее устройство должно быть готово к завершению транзакций по любой из этих причин.
Прекращение типа retry используется для организации отложенных транзакций (delayed transactions). Отложенные транзакции используются только медленными целевыми устройствами, а также мостами PCI
Инициатор транзакции может потребовать монопольного использования шины PCI на все время выполнения операции обмена, требующей нескольких шинных транзакций. Так, например, если центральный процессор выполняет инструкцию модификации данных в ячейке памяти, принадлежащей устройству PCI, ему нужно прочитать данные из устройства, модифицировать их в своем АЛУ и вернуть результат в устройство. Чтобы в эту операцию не вклинивались транзакции от других инициаторов (что чревато нарушением целостности данных), главный мост выполняет ее как блокированную – на все время исполнения операции подается шинный сигнал LOCK#. Этот сигнал никак не используется (и не вырабатывается) обычными устройствами PCI (не мостами); он используется только мостами для управления арбитражем.
Команды шины PCI
Команды PCI определяют направление и тип транзакций, а также адресное пространство, к которому они относятся. Набор команд шины PCI включает следующие:
• I/O Read, I/O Write – команды чтения и записи ввода/вывода, служат для обращения к пространству портов;
• Memory Read, Memory Write – команды чтения и записи памяти, служат для выполнения коротких (как правило, непакетных) транзакций. Их прямое назначение – обращение к отображенным на память устройствам ввода/вывода. Для «настоящей» памяти, допускающей предвыборки, предназначены команды чтения строк, множественного чтения и записи с инвалидацией;
• Memory-Read Line – чтение строки памяти, применяется, когда в транзакции планируется чтение до конца строки кэша. Выделение данного типа чтения позволяет повысить производительность обмена с памятью;
• Multiple Memory Read – множественное чтение памяти, используется для транзакций, затрагивающих более одной строки кэш-памяти. Использование данного типа транзакций позволяет контроллеру памяти выполнять упреждающую выборку строк, что дает дополнительный выигрыш производительности;
• Memory Write and Invalidate (MVI) – запись с инвалидацией, применяется к целым строкам кэша, причем все байты во всех фазах должны быть разрешены.
Эта операция заставляет контроллер кэш-памяти очищать «грязные» строки кэша, соответствующие записываемой области, без их выгрузки в ОЗУ, что экономит время. Инициатор, вводящий эту команду, должен знать размер строки кэша в данной системе (для этого у него есть специальный регистр в конфигурационном пространстве);
• Dual Address Cycle (DAC) – двухадресный цикл, позволяет по 32-битной шине обращаться к устройствам с 64-битной адресацией. В этом случае младшие 32 бита адреса передаются одновременно с данной командой, а далее следует обычный цикл, определяющий команду обмена и несущий старшие 32 бита адреса. Шина PCI допускает 64-битную адресацию как памяти, так и портов ввода/вывода (последнее для систем на x86 бесполезно, но PCI существует и на других платформах);
• Configuration Read, Configuration Write – команды конфигурационного чтения и записи, адресуются к конфигурационному пространству устройств. Обращение производится только выровненными двойными словами, биты AD[1:0] используются для идентификации типа цикла (см. ниже). Для генерации данных команд требуется специальный аппаратно-программный механизм (см. главу 5);
• Special Cycle – специальный цикл, отличается от всех других тем, что является широковещательным. Однако ни один агент на него не отвечает, а главный мост или иное устройство, вводящее этот цикл, всегда завершает его способом Master Abort (на него требуется 6 тактов шины). Специальный цикл предназначен для генерации широковещательных сообщений, которые могут читать любые «заинтересованные» агенты шины. Тип сообщения декодируется содержимым линий AD[15:0]; на линиях AD[31:16] могут помещаться данные, передаваемые в сообщении. Фаза адреса в этом цикле обычными устройствами игнорируется, но мосты используют ее информацию для управления распространением сообщения. Сообщения с кодами 0000h, 0001h и 0002h требуются для указания на отключение (сообщение Shutdown), остановку (сообщение Halt) процессора или специфические функции процессора x86, связанные с кэшем и трассировкой. Коды 0003h-FFFFh зарезервированы. Специальный цикл может генерироваться тем же аппаратно-программным механизмом, что и конфигурационные циклы, но со специфическим значением адреса;
• Interrupt Acknowledge (INTA) – команда подтверждения прерывания, предназначена для чтения вектора прерываний. По протоколу она выглядит как команда чтения, неявно адресованная к системному контроллеру прерываний. Здесь в фазе адреса по шине AD полезная информация не передается (BE[3:0]# задают размер вектора), но ее инициатор (главный мост) должен обеспечить стабильность сигналов и корректность бита четности. В х86-архитектуре 8-битный вектор передается в байте 0 по готовности контроллера прерываний (по сигналу TRDY#). Подтверждение прерываний выполняется за один цикл (первый холостой цикл, который процессоры x86 делают в дань совместимости со стариной, мостом подавляется).
Команды кодируются значениями бит C/BE# в фазе адреса (табл. 2.2), специфические команды PCI–X рассмотрены в последующих разделах.
В каждой команде шины указывается адрес, относящийся к первой фазе данных пакета. Для каждой последующей фазы данных пакета адрес увеличивается на 4 (следующее двойное слово) или 8 (для 64-битных передач), но в командах обращения к памяти предусматривался и иной порядок (см. далее).
В шине PCI байты шины AD, несущие реальную информацию, определяются сигналами C/BE[3:0]# в фазах данных. Разрешенные байты могут быть разрозненными; возможны фазы данных, в которых не разрешено ни одного байта. В PCI–X правила разрешения байтов изменились (см. ниже). Сигналами C/BE[3:0]# управляет инициатор, он указывает требуемые байты для каждой фазы данных и не меняет состояние этих сигналов в течение всей этой фазы. В транзакциях чтения байты «заказывает» опять же инициатор; если поведение целевого устройства (источника данных для чтения) зависит от того, какие байты заказаны, то целевое устройство вынуждено растягивать каждую фазу данных. При этом в первом такте каждой фазы данных целевое устройство принимает C/BE[3:0]# и только в последующем такте (а может, и с дополнительным ожиданием) выдает данные чтения.
В отличие от шины ISA на PCI нет динамического изменения разрядности – все устройства должны подключаться к шине 32– или 64-разрядным способом. Если в устройстве PCI применяются функциональные схемы иной разрядности (к примеру, нужно подключить микросхему 8255, имеющую 8-битную шину данных и четыре регистра), то приходится применять схемотехнические методы преобразования, отображающие все регистры на 32-разрядную шину AD. Возможность 16-битных подключений появилась только во второй версии PCI–X.