Гук Михаил Юрьевич
Шрифт:
Порядок выполнения операций и синхронизация
Механизмы отправленных записей и отложенных транзакций нацелены на по возможности одновременное выполнение множества операций обмена в системе шин 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) устройств (например, управления энергопотреблением) в конфигурационном пространстве имеются блоки регистров известного назначения. Эти блоки организуются в цепочки, на первый такой блок есть ссылка в стандартном заголовке (CAPPTR); в первом же регистре блока есть ссылка на следующий блок (или 0, если данный блок – последний). Таким образом, просмотрев цепочку, конфигурационное ПО получает список всех доступных свойств устройства и их позиций в конфигурационном пространстве функции. В PCI 2.3 определены следующие идентификаторы CAPID, часть из которых рассматривается в данной книге:
• 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 или при загрузке ОС), в конфигурационные регистры устройства записываются параметры конфигурирования (базовые адреса). Только после этого устройствам (точнее, функциям) устанавливаются биты, разрешающие им отвечать на команды обращения к памяти и портам ввода-вывода, а также самим управлять шиной. Для того чтобы всегда можно было найти работоспособную конфигурацию, все ресурсы, занимаемые картами, должны быть перемещаемыми в своих пространствах. Для многофункциональных устройств каждая функция должна иметь собственное конфигурационное пространство. Устройство может одни и те же регистры отображать и на память, и на пространство ввода$вывода. При этом в их конфигурационных регистрах должны присутствовать оба описателя, но драйвер должен использовать только один способ обращения (предпочтительно через память).