Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шины.PCI,.USB.и.FireWire

.pdf
Скачиваний:
59
Добавлен:
19.03.2016
Размер:
6 Mб
Скачать

Чтобы ускорить выполнение транзакций, пришедших с первичной шины, мосту выгодно парковать вторичную шину на самого себя: если вторичная шина свобод$ на, при трансляции транзакции мост не будет терять время на захват шины.

Отложенные транзакции

Отложенные транзакции выполняются мостом PCI для всех команд обращения к вводу$выводу и конфигурационным регистрам, а также всех разновидностей чте$ ния памяти. Отложенные транзакции выполняются в три фазы:

запрос транзакции инициатором (обмена данными с целевым устройством еще нет);

завершение целевым устройством;

завершение инициатором.

Для того чтобы отложить транзакцию, мост должен поставить в очередь отложен ный запрос (delayed request) и сигналом STOP# ввести условие Retry. На этом первая фаза отложенной транзакции завершается. В запросе содержатся зафиксирован$ ные значения адреса, команды, разрешенных байт, линий четности (и линии REQ64# для 64$битных шин); для отложенных транзакций записи нужно сохранить еще и данные. Этой информации мосту достаточно, чтобы инициировать транзакцию на противоположном интерфейсе, — вторую фазу отложенной транзакции. Ее ре$ зультатом будет преобразование в очереди отложенного запроса в отложенное за вершение (delayed completion) — запрос вместе с ответом в виде состояния (и за$ прошенных данных чтения). Изначальный инициатор транзакции, получив условие Retry, должен через некоторое время повторить запрос, причем в точности совпа$ дающий с первоначальным (иначе он мостом будет воспринят как новый). Если к этому моменту мост успел отработать данную транзакцию, то этот повторный запрос будет завершен нормальным образом (или отвергнут, если так ответило це$ левое устройство), а мост удалит отложенное завершение из своей очереди. Если транзакция еще не отработана, то мост снова запросит повтор, и инициатор дол$ жен будет повторять свой запрос до тех пор, пока мост не обеспечит нормального завершения. Это будет третьей, заключительной фазой отложенной транзакции.

Инициатор, получивший условие Retry, обязан в точности повторить тот же за$ прос транзакции, иначе мост будет накапливать невостребованные ответы. Конеч$ но, и мост должен отслеживать невостребованные транзакции и через некоторое время (210 или 215 тактов шины, в зависимости от значений в регистре Bridge Control) удалять их из своей очереди, чтобы не переполнить ее по «забывчивос$ ти» инициатора.

Откладывание транзакций мостом заметно увеличивает время исполнения каж$ дой из них (с точки зрения инициатора), однако оно позволяет обслуживать мно$ жество транзакций, находящихся в очередях мостов. В результате достигается уве$ личение суммарного объема произведенных транзакций на всех шинах PCI за единицу времени, то есть повышается производительность системы в целом. Мост, как держатель очереди транзакций, в принципе, может одновременно выполнять

две транзакции, каждую на своем интерфейсе. Если бы транзакции не откладыва$ лись, а выполнялись непосредственно, то инициатору пришлось бы держать свою шину до тех пор, пока не освободится шина назначения (и все промежуточные шины, если транзакция проходит через несколько мостов). В результате число бес$ полезных тактов ожидания на всех шинах было бы недопустимо велико.

Транслируя транзакции чтения памяти (как отложенные запросы), мост в некото$ рых случаях может использовать предвыборку (prefetch, чтение про запас) с целью ускорения работы с памятью. Выполняя предвыборку, мост рискует считать из источника данных больше, чем инициатор заберет от него в данной транзакции. В фазе завершения транзакции инициатором лишние данные в буфере моста про$ ще всего аннулировать, поскольку до возможного последующего востребования в их реальном источнике они могут быть уже модифицированы. Более сложный мост может отслеживать и эти изменения, аннулируя лишь модифицированные данные. Обращения командами обычного чтения памяти разрешают мосту счи$ тать только точно затребованное количество данных. При этом возможности уско$ рения передач меньше, но не возникнет побочных эффектов от лишних чтений. Лишние чтения совершенно недопустимы для регистров ввода$вывода, отображен$ ных на память. Например, чтение управляющих регистров может изменять их со$ стояние; лишнее (с неиспользуемым результатом) чтение регистров данных мо$ жет привести к потере данных. Мост может смело выполнять предвыборку, когда отрабатывает запросы с командами чтения строк и множественного чтения, транс$ лируемые в любом направлении. Применивший эти команды мастер отвечает за то, что для адресованных областей предвыборка допустима. Если у моста есть ре$ гистры, описывающие предвыбираемую память, то транзакции с командами про$ стого чтения с первичного интерфейса, обращенные к предвыбираемой памяти на вторичном интерфейсе, при трансляции могут преобразовываться в команды чте$ ния строк или множественного чтения. Мост может предположить также, что все транзакции к памяти с вторичного интерфейса имеют устройством назначения оперативную память и, следовательно, допускают предвыборку. Однако мост дол$ жен иметь специальный бит, запрещающий преобразование команд и предвыбор$ ку по этому предположению («слепая» предвыборка может порождать проблемы взаимодействия ПО и аппаратуры).

Отправленные записи

Для транзакций записи в память, находящуюся по другую сторону моста, мост дол$ жен производить отправленную запись (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 X

Протокол шины 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).

Порядок выполнения операций и синхронизация

Механизмы отправленных записей и отложенных транзакций нацелены на по воз$ можности одновременное выполнение множества операций обмена в системе шин PCI. Каждый мост имеет буферы и очереди отправленных записей и отложенных транзакций для команд, транслируемых в обоих направлениях. При этом мост од$ новременно может выполнять обмены данными на обоих своих интерфейсах, бу$ дучи как инициатором, так и играя роль целевого устройства. Возникает вопрос о порядке выполнения транзакций, причем речь идет именно о порядке заверше$ ний (фаз, в которых происходит взаимодействие с конечным целевым устройством). Мосты подчиняются следующим основным правилам:

отправленные записи, проходящие через мост в одном направлении, заверша$ ются в устройстве назначения в том же порядке, что и на шине инициатора;

транзакции записей, идущие через мост во встречных направлениях, по поряд$ ку друг с другом не увязываются;

транзакция чтения выталкивает из моста все записи, отправленные с той же стороны до ее прихода. Перед тем как эта транзакция завершится на стороне ее инициатора (перед третьей фазой отложенной транзакции), она выталкивает из моста и все записи, отправленные с противоположной стороны до завершения данного чтения конечным целевым устройством. Таким образом, сохраняется очередность операций записи и чтения;

мост (как целевое устройство) не будет принимать для посылки транзакцию записи в память до тех пор, пока он не завершит неблокированную транзакцию как ведущее устройство на той же шине.

Мосты сами по себе не предпринимают никаких действий для синхронизации транзакций и запросов прерываний. В то время как транзакции буферируются (могут на некоторое время «застрять» в очередях мостов), сигналы запросов пре$ рывания (INTx#) транслируются мостом совершенно прозрачно (мост просто элек$ трически соединяет эти линии первичного и вторичного интерфейса). Для кор$ ректной работы ПО с устройствами в общем случае требуется, чтобы все данные, посланные до выдачи сигнала прерывания, дошли до своих получателей. Для это$ го нужно разгрузить все буферы всех мостов, находящихся между устройством, выдавшим запрос прерывания, и его конечными партнерами по транзакциям. Про$ граммно этого легко достичь чтением любого регистра устройства — чтение через мост выгружает буферы. Возможен и аппаратный вариант: до посылки сигнала прерывания устройство выполняет чтение последних записанных им данных. С прерываниями MSI дело обстоит проще: сообщение MSI не может обогнать дан$ ные, ранее посланные этим устройством.

Одной из особенностей применения шины PCI с ее мостовыми соединениями яв$ ляется возможность действительно одновременного выполнения более одного об$ мена данными по непересекающимся путям — Concurrent PCI Transferring или PCI Concurrency. Например, во время взаимодействия процессора с памятью ведущее устройство шины PCI может обмениваться данными с другим устройством PCI. Этот пример одновременности обмена скорее теоретический, поскольку ведущее устройство шины PCI, как правило, обменивается данными с системной памятью. Более интересный случай — обмен графического адаптера, подключенного к пор$ ту AGP («родственнику» PCI, см. главу 7), с памятью одновременно с обменом процессора с устройством PCI или, наоборот, загрузка данных процессором в гра$ фический адаптер одновременно с обменом между ведущим устройством шины PCI и системной памятью. Одновременность требует довольно сложной логики централизованного арбитража запросов всех агентов системы и различных ухищ$ рений в буферизации данных. Одновременность реализуется не всеми чипсетами (в описаниях она всегда специально подчеркивается) и может быть запрещена на$ стройками CMOS Setup.

ГЛАВА 5

Конфигурирование и BIOS устройств PCI и PCI X

В шину PCI изначально заложены возможности автоматического конфигуриро$ вания системных ресурсов (пространств памяти и ввода$вывода и линий запроса прерываний). Автоматическое конфигурирование устройств (выбор адресов и пре$ рываний) поддерживается средствами BIOS и ОС; оно ориентировано на техно$ логию PnP. Стандарт PCI определяет для каждой функции конфигурационное пространство размером до 256 регистров (8$битных), не приписанных ни к про$ странству памяти, ни к пространству ввода$вывода. Доступ к ним осуществляется по специальным командам шины Configuration Read и Configuration Write, выраба$ тываемым с помощью одного из аппаратно$программных механизмов, описанных далее. В этом пространстве есть области, обязательные для всех устройств, и спе$ цифические. Конкретное устройство может иметь регистры не во всех адресах, но должно поддерживать нормальное завершение для адресуемых к ним операций. При этом чтение несуществующих регистров должно возвращать нули, а запись выполняться как холостая операция.

Конфигурационное пространство функции начинается со стандартного заголов ка, в котором содержатся идентификаторы производителя, устройства и его клас$ са, а также описание требуемых и занимаемых системных ресурсов. Структура за$ головка стандартизована для обычных устройств (тип 0), мостов PCI$PCI (тип 1), мостов PCI$CardBus (тип 2). Тип заголовка определяет расположение общеизве$ стных регистров и назначение их бит. После заголовка могут располагаться регис$ тры, специфичные для устройства. Для стандартизованных свойств (capability) устройств (например, управления энергопотреблением) в конфигурационном про$ странстве имеются блоки регистров известного назначения. Эти блоки организу$ ются в цепочки, на первый такой блок есть ссылка в стандартном заголовке (CAP_PTR); в первом же регистре блока есть ссылка на следующий блок (или 0, если данный блок — последний). Таким образом, просмотрев цепочку, конфигура$ ционное ПО получает список всех доступных свойств устройства и их позиций в конфигурационном пространстве функции. В PCI 2.3 определены следующие идентификаторы CAP_ID, часть из которых рассматривается в данной книге:

01 — управление энергопотреблением;

02 — порт AGP;

03 — VPD (Vital Product Data), данные, дающие исчерпывающее описание ап$ паратных (возможно, и программных) свойств устройств;

04 — нумерация слотов и шасси;

05 — прерывания MSI;

06 — Hot Swap, горячее подключение для Compact PCI;

07 — протокольные расширения PCI$X;

08 — зарезервировано для AMD;

09 — на усмотрение производителя (Vendor Specific);

0Ah — отладочный порт (Debug Port);

0Bh — PCI Hot Plug, стандартное обеспечение «горячего подключения».

В PCI$X для устройств Mode 2 конфигурационное пространство расширено до 4096 байт; в расширенном пространстве могут присутствовать расширенные опи$ сания свойств (см. ниже).

После аппаратного сброса (или при включении питания) устройства PCI не отве$ чают на обращения к пространству памяти и ввода$вывода, они доступны только для операций конфигурационного считывания и записи. В этих операциях устройства выбираются по индивидуальным сигналам IDSEL, чтением регистров конфигурационное ПО узнает о потребностях в ресурсах и возможных вариантах конфигурирования устройств. После распределения ресурсов, выполняемого про$ граммой конфигурирования (во время теста POST или при загрузке ОС), в кон$ фигурационные регистры устройства записываются параметры конфигурирования (базовые адреса). Только после этого устройствам (точнее, функциям) уста$ навливаются биты, разрешающие им отвечать на команды обращения к памяти

ипортам ввода$вывода, а также самим управлять шиной. Для того чтобы всегда можно было найти работоспособную конфигурацию, все ресурсы, занимаемые кар$ тами, должны быть перемещаемыми в своих пространствах. Для многофункцио$ нальных устройств каждая функция должна иметь собственное конфигурацион$ ное пространство. Устройство может одни и те же регистры отображать и на память,

ина пространство ввода$вывода. При этом в их конфигурационных регистрах долж$ ны присутствовать оба описателя, но драйвер должен использовать только один способ обращения (предпочтительно через память).

В заголовке конфигурационного пространства описываются потребности в адре$ сах трех типов:

регистры в пространстве ввода вывода (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) опре$ деляет базовый класс, средний — подкласс, младший — программный интерфейс

(если он стандартизован).

Рис. 5.1. Формат заголовка типа 0 конфигурационного пространства устройства PCI

Остальные поля заголовка являются регистрами устройств, допускающими как запись, так и чтение.

Регистр команд Command (RW) служит для управления поведением устройства на шине PCI. Регистр допускает как запись, так и чтение. После аппаратного сбро$ са все биты регистра (кроме специально оговоренных исключений) обнулены. Назначение бит регистра команд:

бит 0 — IO Space — разрешение ответа на обращения к пространству ввода$ вывода;

бит 1 — Memory Space — разрешение ответа на обращения к пространству памяти;

бит 2 — Bus Master — разрешение работы инициатором (в режиме прямого уп$ равления шиной); игнорируется в PCI$X при завершениях расщепленных тран$ закций;

бит 3 — Special Cycles — разрешение реакции на специальные циклы;

бит 4 — Memory Write& 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. Ранее был резервным;

биты [11:15] — резерв.

Регистр Status служит для определения состояния и свойств устройства. Биты, помеченные как RO, допускают только считывание. Другие биты регистра могут быть программно модифицированы операцией записи, с помощью которой можно только обнулять биты, но не устанавливать. При записи в позиции обнуляемых бит устанавливаются единичные значения. Назначение бит регистра состояния:

биты [0:2] — резерв;

бит 3— Interrupt Status (RO), наличие запроса прерывания. Устанавливает$ ся в единицу перед подачей сигнала по линии INTx, независимо от значения бита Interrupt Disable. С прерываниями MSI не связан. Бит определен начиная с PCI 2.3, ранее был резервным. В PCI$X 2.0 бит обязателен;

бит 4 — Capability List (RO, необязательный) — признак наличия указателя новых возможностей в регистре со смещением 34h;

бит 5 — 66 MHz Capable (RO, необязательный) — признак поддержки частоты 66 МГц;

бит 6 — резерв;

бит 7 — Fast Back-to-Back Capable (RO, необязательный) — признак под$ держки быстрых смежных транзакций (fast back$to$back) с разными устрой$ ствами;

бит 8 — Master Data Parity Error (только для устройств с прямым управле$ нием) — инициатор (запросчик) транзакции обнаружил неисправимую ошиб$ ку данных;

биты [10:9] — DEVSEL Timing — скорость выборки: 00 — быстрая, 01 — средняя, 10 — низкая (определяет самую медленную реакцию DEVSEL# на все команды, кроме Configuration Read и Configuration Write);