PCI и PCI-X

Шины PCI и PCI-X

Поиск 32-разрядных сервисов BIOS

32-разрядные сервисы BIOS32 ищутся через каталог 32разрядных сервисов. Адрес точки входа в каталог сервисов заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти 0E0000–0FFFFFh в началах параграфов (младшие 4 бита адреса нулевые) ищется строка-сигнатура "_32_" заголовка (число 325F5F33h), за которой следует 32-разрядный физический адрес точки входа в каталог. Точки входа в сами сервисы ищутся через каталог сервисов. Номер, параметры вызываемых функций и результаты передаются на регистрах процессора. Для поиска сервиса в каталоге 4-байтная строка-идентификатор сервиса заносятся в регистр EAX, в EBX заносится 0 (код функции поиска в каталоге) и выполняется дальний вызов (CALL FAR) по адресу точки входа в каталог. Результат поиска передается на регистрах: AL = 00h — сервис найден, при этом в EBX — базовый адрес сервиса, в ECX — его длина (определяет длину сегмента), EDX — смещение точки входа от начала сервиса (от EBX). Если AL = 81h — сервис не найден. До попытки использования каталога сервисов следует убедиться в корректности заголовка, проверив его контрольную сумму: накопленная сумма всех байтов заголовка должна быть нулевой. Длина заголовка (в параграфах) указана в байте со смещением 9, в байте 8 — номер ревизии заголовка. Проверка контрольной суммы обязательна, поскольку 4-байтная сигнатура может совпасть с фрагментом программного кода BIOS (строка _32_ дизассемблируется как POP DI; XOR SI,[BP + SI]). 32-разрядные сервисы вызываются дальними вызовами (CALL FAR), при этом сегмент кода CS должен иметь базу в начале 4-килобайтной страницы, в которую попадает точка входа, а лимит должен позволять охватывать эту и следующую страницу1. Сегмент DS должен иметь такую же базу и не меньший лимит. Напомним, что здесь идет речь о физических адресах (после страничного преобразования линейных).



Sitelinkx by eXtro-media.de

Время выполнения транзакций, таймеры и буферы

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

Каждое целевое устройство должно достаточно быстро отвечать на адресованную ему транзакцию. Ответ адресованного целевого устройства (сигнал DEVSEL#) должен появиться в 1–3 такте после фазы адреса, в зависимости от «проворности» устройства: 1 такт — быстрое (Fast), 2 — среднее (Medium), 3 — медленное (Slow) декодирование. Следующий такт при отсутствии ответа отводится на перехват транзакции мостом с субтрактивным декодированием адреса. Задержка первой фазы данных (target initial latency), то есть задержка появления сигнала TRDY# относительно FRAME#, не должна превышать 16 тактов шины. Если устройство по своей природе иногда может не успевать уложиться в этот интервал, оно должно формировать сигнал STOP#, прекращая транзакцию. Это заставит ведущее устройство повторить транзакцию, и с большой вероятностью эта попытка окажется успешной. Если устройство медленное и часто не укладывается в 16 тактов, то оно должно выполнять отложенную транзакцию (Delayed Transaction, см. выше). Целевое устройство имеет инкрементный механизм слежения за длительностью циклов (Incremental Latency Mechanism), который не позволяет интервалу между соседними фазами данных в пакете (target subsequent latency) превышать 8 тактов шины. Если целевое устройство не успевает работать в таком темпе, оно обязано остановить транзакцию. Желательно, чтобы устройство сообщало о своем «неуспевании» как можно раньше, не выжидая предельных 16 или 8 тактов, — это экономит полосу пропускания шины.

Инициатор также не должен задерживать поток — допустимая задержка от начала FRAME# до сигнала IRDY# (master data latency) и между фазами данных не должна превышать 8 тактов. Целевое устройство время от времени может отвергать операцию записи в память с запросом повтора (это, к примеру, может происходить при записи в видеопамять). У инициатора есть «предел терпения» для завершения операции — таймер максимального времени исполнения (maximum complete time). Таймер имеет порог 10 мкс — 334 такта при 33 МГц или 668 тактов на 66 МГц. За это время инициатор должен иметь возможность «протолкнуть» хоть одну фазу данных. Таймер начинает отсчет с момента запроса повтора операции записи в память и сбрасывается при последующем завершении транзакции записи в память, отличном от запроса повтора. Устройства, не способные выдерживать ограничение на максимальное время исполнения записи в память, должны предоставлять драйверу возможность определять их состояние, в котором достаточно быстрая запись в память невозможна. Драйвер, естественно, должен учитывать это состояние и не «напрягать» шину и устройство бесплодными попытками записи.

Право на управление шиной (сигнал GNT#) может быть отобрано у инициатора в любой момент времени. В зависимости от исполняемой команды и состояния сигналов ведущее устройство должно либо прервать транзакцию, либо продолжать ее до запланированного завершения. Каждое ведущее устройство, способное сформировать пакет с более чем двумя фазами данных, должно иметь собственный программируемый таймер задержки (master latency timer, или просто latency timer). Этот таймер фактически задает ограничение на длину пакетной транзакции и, следовательно, на пропускную способность шины, предоставляемую этому устройству. Таймер запускается каждый раз по выставлении этим устройством сигнала FRAME# и отсчитывает такты шины до достижения значения, указанного в одноименном конфигурационном регистре. Поведение ведущего устройства после срабатывания таймера зависит от типа команды и состояния сигналов FRAME# и GNT# на момент срабатывания таймера:

  • если ведущее устройство снимает сигнал FRAME# до срабатывания таймера, транзакция завершается нормально;
  • Если сигнал GNT# снят и исполняемая команда не является записью памяти с инвалидацией, то инициатор обязан сократить транзакцию, сняв сигнал FRAME#. При этом ему позволяется завершить текущую и выполнить еще одну фазу данных;
  • если сигнал GNT# снят и исполняется запись в память с инвалидацией, то инициатор должен завершить транзакцию по концу текущей (если передается не последнее двойное слово строки) или следующей (если двойное слово — последнее) строки кэша.

Задержка арбитража (arbitration latency) определяется как число тактов от подачи инициатором запроса REQ# до получения права управления шиной GNT#. Эта задержка зависит от активности других инициаторов, быстродействия устройств (чем меньше они вводят тактов ожидания, тем лучше) и «проворности» собственно арбитра.

При конфигурировании ведущие устройства сообщают свои потребности, указывая максимально допустимую задержку предоставления доступа к шине (Max_Lat) и минимальное время, на которое им должно предоставляться управление шиной (Min_GNT). Эти потребности определяются присущим устройству темпом передачи данных и его организацией. Однако будут ли эти потребности реально удовлетворены (по ним должна определяться стратегия арбитража) — неясно. Задержка предоставления доступа определяется как время от подачи запроса REQ# до получения GNT# и перехода шины в состояние покоя (только с этого момента данное устройство может начать транзакцию). Она зависит от числа ведущих устройств на шине, их активности и назначенных им значений таймеров задержки (в их регистрах Latency Timer, где время задается в тактах шины). Чем больше значения у этих таймеров, тем большее время придется другим устройствам ожидать предоставления управления шиной при ее значительной загрузке. Одно из слагаемых задержки предоставления доступа — задержка арбитража.

Шина позволяет уменьшить мощность (ток), потребляемую устройствами, ценой увеличения числа тактов в транзакциях, применяя пошаговое переключение линий AD[31:0] и PAR, — так называемый степпинг (address/data stepping). Здесь возможны два варианта:

  • плавный шаг (continuous stepping) — начало формирования сигналов слаботочными формирователями за несколько тактов до выставления сигнала-квалификатора действительной информации (FRAME# в фазе адреса, IRDY# или TRDY# в фазе данных). За эти несколько тактов сигналы «доползут» до требуемого значения при меньшем токе потребления;
  • дискретный шаг (diskrete stepping) — нормальные формирователи срабатывают не все сразу, а группами (например, побайтно), в каждом такте по группе. При этом снижаются броски тока, поскольку одновременно переключается меньше формирователей.

Устройство само может и не пользоваться этими возможностями (см. описание бита 7 регистра команд в прошлых темах), но должно «понимать» такие циклы. Задерживая сигнал FRAME#, устройство рискует потерять право доступа к шине, если арбитр получит запрос от более приоритетного устройства. По этой причине PCI 2.3 степпинг отменен для всех транзакций, кроме обращений к конфигурационному пространству устройств (конфигурационные циклы типа 0). В этих циклах устройство может и не успеть в первом же такте транзакции распознать сигнал выборки IDSEL, который приходит с соответствующей линии ADx через резистор.

В PCI-X требования к количеству тактов ужесточились:

  • инициатор не имеет права вводить такты ожидания. В транзакциях записи инициатор выставляет на шину начальные данные (Data0) через 2 такта после фазы атрибутов; если транзакция пакетная, то следующие (Data1) — через 2 такта после ответа устройства сигналом DEVSEL#. Если целевое устройство не дает готовности (сигнала TRDY#), то инициатор должен в каждом такте чередовать данные Data0–Data1, пока целевое устройство не даст готовность (ему позволительно вводить только четное число тактов ожидания);
  • целевое устройство имеет право вводить такты ожидания только для начальной фазы данных транзакции; для последующих фаз данных ожидание недопустимо.

Для максимального использования возможностей шины устройства должны иметь буферы, чтобы накапливать в них данные для пакетных транзакций. Рекомендуется для устройств со скоростью передачи данных до 5 Мбайт/с иметь буфер, по крайней мере на 4 двойных слова. Для более высоких скоростей рекомендуется буфер на 32 двойных слова. Для обмена с системной памятью наиболее эффективны транзакции, работающие с целыми строками кэша, что тоже учитывают при определении размера буфера. Однако увеличение размера буфера может вызвать трудности при обработке ошибок, а также вести к увеличению задержек доставки данных (пока устройство не заполнит определенный объем буфера, оно не начнет передачу этих данных по шине, и их потребители будут ожидать).

В спецификации приводится пример организации карты Fast Ethernet (скорость передачи — 10 Мбайт/с), у которой для каждого направления передачи имеется 64-байтный буфер, разделенный на две половины (ping-pong buffer). Когда адаптер заполняет одну половину буфера приходящим кадром, он выводит в память накопленное содержимое другой половины, после чего половины меняются ролями. Каждая половина выводится в память за 8 фаз данных (около 0,25 мкс на частоте 33 МГц), что соответствует установке MIN_GNT = 1. При скорости прихода данных 10 Мбайт/с каждая половина заполняется за 3,2 мкс, что соответствует установке MAX_LAT = 12 (в регистрах MIN_GNT и MAX_LAT время задается в интервалах по 0,25 мкс).

 



Sitelinkx by eXtro-media.de

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

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

Мосты подчиняются следующим основным правилам:

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

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

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



Sitelinkx by eXtro-media.de

Expansion ROM карт PCI

В микросхеме ROM BIOS, установленной на системной плате, поддерживаются только стандартные (по назначению и реализации) устройства. При необходимости дополнительные устройства, устанавливаемые в слоты шин расширения (ISA, PCI, PCMCIA), могут иметь микросхемы ПЗУ своей программной поддержки — Additional ROM BIOS (дополнительные модули ROM BIOS), они же Expansion ROM. Эта необходимость возникает, когда программная поддержка устройств требуется до загрузки ОС и прикладного ПО. Роль Expansion ROM может и не ограничиваться поддержкой данного устройства — в таком модуле может содержаться и вся программа функционирования специализированного бездискового контроллера на базе PC. Расширения ROM BIOS используют графические адаптеры EGA/VGA/SVGA, некоторые контроллеры жестких дисков, контроллеры SCSI, сетевые адаптеры с удаленной загрузкой и другие периферийные устройства. Для модулей расширения устройств с шиной ISA в пространстве памяти зарезервирована область C8000h–F4000h. POST сканирует эту область с шагом 2 Kбайт в поисках дополнительных модулей BIOS на завершающем этапе выполнения (после загрузки векторов прерываний указателями на собственные обработчики). Дополнительный модуль BIOS графического адаптера (EGA, VGA, SVGA) имеет фиксированный адрес C0000 и инициализируется раньше (на шаге инициализации видеоадаптера). Устройства с шиной PCI в своем конфигурационном пространстве содержат лишь признак использования модуля расширения, а его приписку к адресам памяти назначает POST.

Дополнительный модуль ROM BIOS должен иметь заголовок, выровненный по границе 2-килобайтной страницы памяти, формат заголовка ПЗУ иллюстрирует таблица.

Смещение Длина Назначение
0 2 Сигнатура (признак начала модуля): байт 0=55h, байт 1=AAh
2 1 Длина, указанная в блоках по 512 байт
3 3 Точка входа процедуры инициализации, заканчивающейся дальним возвратом Ret Far (вызывается инструкцией Far Call во время POST). Обычно здесь располагается 3-байтная инструкция JMP, указывающая на начало процедуры
6-17h
 
Резерв
18h 2 Указатель на структуру данных PCI (только для карт PCI)
1Ah 2 Указатель на структуру расширенного заголовка карт ISA PnP

Таблица. Заголовок модуля дополнительного ПЗУ

В традиционном заголовке присутствовали только первые три поля, указатели на структуры PCI и ISA PnP ввели позже. Корректным считается модуль, начинающийся с признака AA55h (значения 16-битного слова с учетом порядка байтов) и нулевой суммой (по модулю 256) всех байтов в объявленной области (реальная длина модуля может превышать объявленную, но байт контрольной суммы, естественно, должен входить в объявленную область).

В случае обнаружения корректного модуля POST дальним вызовом (Call Far) вызывает процедуру инициализации модуля, начинающуюся с 3-го адреса заголовка модуля. Ответственность за ее корректность полностью ложится на разработчика. Процедура может переопределять векторы прерываний, обслуживаемых BIOS. Переопределив на себя вектор Bootstrap (Int 19h), можно получить управление при загрузке, что и используется, например, для удаленной загрузки компьютеров через локальную сеть (Remote Boot Reset). Если стандартное продолжение процедуры загрузки не требуется, а дополнительный модуль представляет собой, например, управляющую программу для какого-либо оборудования, вместо процедуры инициализации в ПЗУ может находиться и основная программа, не возвращающая управление системной последовательности POST, которая бы выполнила обычную загрузку.

Процедура инициализации и программная поддержка устройства в ПЗУ должны быть написаны таким образом, чтобы им были безразличны абсолютные адреса, по которым они размещаются в пространстве памяти. На картах расширения, как правило, имеются средства изменения базового адреса, а иногда и размера ПЗУ (джамперы или программно-управляемые переключатели). Это позволяет бесконфликтно разместить модули ПЗУ нескольких установленных карт.

Для содержимого ПЗУ расширения BIOS, установленных на картах PCI, принят стандарт, несколько отличающийся от традиционных дополнительных модулей ROM BIOS. Заголовок ПЗУ соответствует традиционному, но дополнительно имеет указатель на структуру данных PCI (см. следующую таблицу). Идентификаторы производителя и устройства, а также код класса совпадают с описанными в конфигурационном пространстве устройства PCI. Поскольку шина PCI используется не только в PC, в ПЗУ карты может храниться несколько программных модулей. Каждый модуль начинается со структуры данных, сам модуль следует сразу за структурой. За ним начинается структура для следующего модуля (если у предыдущего не установлен признак последнего модуля) и т. д. Тип платформы (процессора) указывается в заголовке модуля и при инициализации BIOS активизируется только нужный. Такой механизм позволяет, например, один и тот же графический адаптер устанавливать и в IBM PC, и в Power PC.

 

Смещение Длина, байт Назначение
0 4 Сигнатура, строка символов «PCIR»
4 2 Идентификатор производителя
6 2 Идентификатор устройства
8 2 Резерв
Ah 2 Длина структуры (в байтах), начиная с сигнатуры
Ch 1 Версия структуры (0 для данной версии)
Dh 3 Код класса
10h 2 Длина рабочего образа
12h 2 Версия кода/данных
14h 1 Тип кода: 0 — x86 для PC-AT, 2 — HP PA-RISC
15h 1 Индикатор: 1 — последний образ, 0 — не последний
16h 2 Резерв

Таблица. Структура данных PCI

Применительно к дополнительному ПЗУ карты PCI имеется три параметра, относящихся к размерам областей памяти. Размер ПЗУ определяется чтением конфигурационного пространства. Размер, указанный в байте 2 заголовка, указывает на длину модуля на этапе инициализации. Этот модуль POST загружает в ОЗУ перед тем, как вызвать процедуру инициализации (точка входа со смещением 3). Контрольная сумма, расположенная обычно в конце модуля, обеспечивает нулевую сумму всех байтов. Длина рабочего образа, указанная в структуре данных PCI (слово со смещением 10h), описывает размер области, которая должна постоянно оставаться в памяти в режиме нормального функционирования (она может быть меньше указанной в байте 2 заголовка, поскольку код процедуры инициализации уже не требуется). Эта область также защищается контрольной суммой.

Работа с модулями ПЗУ для карт PCI выполняется в соответствии с моделью DDIM (Device Driver Initialization Model — модель инициализации драйвера устройств). POST определяет наличие ПЗУ по полю Expansion ROM Base Address в конфигурационном пространстве устройства, обнаруженного на карте, и назначает ему адрес в свободном пространстве памяти. После этого программированием регистра команд данного устройства разрешается считывание ПЗУ и в нем ищется сигнатура заголовка AA55h. Когда сигнатура найдена, POST ищет подходящий образ (по типу программного кода и совпадающий по идентификаторам с обнаруженными устройствами PCI) и копирует его в ОЗУ (в область C0000–DFFFFh), оставляя разрешенной запись в эту область. Далее чтение ПЗУ запрещается (записью в поле Expansion ROM Base Address) и вызывается процедура инициализации модуля (по адресу 3). При вызове процедуры POST сообщает номер шины (в регистре AH), номер устройства (AL[7:3]) и номер функции (AL[2:0]), благодаря чему процедура узнает точные координаты (идентификатор на шине PCI) аппаратных средств, которые ей предстоит инициализировать. После отработки инициализации определяется размер области, которую следует оставить в памяти (по байту 2, который может быть модифицирован процедурой инициализации), и для этой области запрещается запись. Если процедура инициализации «урезает» занимаемую память, она должна позаботиться о достоверности контрольной суммы области, описанной байтом 2. Если память освобождается полностью (процедура обнуляет байт 2), то контрольная сумма, естественно, не нужна. Расширение для VGA (определяется по коду класса) обрабатывается особым образом — загружается по адресу C0000h. Процедура инициализации может определить наличие PnP BIOS в системе, проверив значение контрольной структуры PnP по адресу, указанному ей программой POST в регистрах ES:DI, и исполняться в зависимости от обнаруженного системного окружения.

Для более эффективной работы во время инициализации драйвера устройства желательно использовать не только стандартную, но и расширенную память (за пределами первого мегабайта), в то время как POST работает в реальном режиме процессора. Решить эту проблему помогает режим «Big Real Mode», который поддерживают все 32-разрядные процессоры. Специально для предоставления доступа ко всей памяти процедурами инициализации фирмы Phoenics и Intel разработали спецификацию PMM (POST Memory Manager Specification), версия 1.01 была опубликована в конце 1997 года. Эта спецификация определяет несколько дополнительных сервисов BIOS, позволяющих выделять, находить и освобождать блоки в любой, в том числе и расширенной, памяти. Клиенты этого сервиса запрашивают блок памяти требуемого размера, а BIOS возвращает физический 32-разрядный адрес начала выделяемого блока (если она способна его выделить). Клиент помечает свой блок 32-битным индексом (handle), по которому его в дальнейшем можно найти функцией поиска. Анонимный блок (индекс FFFFFFFFh) поиску не поддается. Этими сервисами можно пользоваться только до начала процедуры начальной загрузки (Int 19h), работу с вентилем Gate A20 они берут на себя. Перед начальной загрузкой BIOS освобождает и обнуляет все блоки расширенной памяти, занятые с помощью этих сервисов. Наличие сервисов PMM определяется по контрольной структуре, начинающейся со строки-сигнатуры -PMM и расположенной на границе раздела в области E0000–FFFF0h.



Sitelinkx by eXtro-media.de

Контроль достоверности передачи и обработка ошибок

Для контроля достоверности передачи информации на шине PCI применяется проверка четности адреса и данных; в PCI-X используется и ECC-контроль с исправлением однобитных ошибок. ECC-контроль обязателен при работе в Mode 2, он может использоваться и при работе в Mode 1. Метод контроля достоверности сообщается мостом в шаблоне инициализации по окончании аппаратного сброса шины. Мост выбирает тот метод контроля, который поддерживают все абоненты его вторичной шины (и он сам). Для сообщения об ошибках служат сигналы PERR# (протокольная сигнализация между устройствами) и SERR# (сигнал фатальной ошибки, вызывающий, как правило, немаскируемое прерывание системы).

При контроле четности используются сигналы PAR и PAR64, обеспечивающие четность числа «единиц» на наборах линий AD[31:0], C/BE[3:0]#, PAR и AD[63:32], C/BE[7:4]#, PAR64. Сигналы четности PAR и PAR64 вырабатываются тем устройством, которое в данный момент управляет шиной AD (выводит команду и адрес, атрибуты или данные). Сигналы четности в режиме PCI вырабатываются с задержкой на один такт относительно контролируемых ими линий AD и C/BE#. В PCI-X при операциях чтения правила немного иные: биты четности в такте N относятся к битам данных такта N – 1 и сигналам C/BE# такта N – 2. Сигналы PERR# и SERR# вырабатываются приемником информации в такте, следующем за тактом, в котором нарушено условие четности.

При ECC-контроле в 32-разрядном режиме для контроля линий AD[31:0] и C/BE[3:0]# применяется 7-битный код ECC с сигналами ECC[6:0]; в 64-разрядном режиме применяется 8-битный код с сигналами ECC[7:0]; в 16-разрядном режиме  применяется несколько измененная схема ECC7 + 1. В любом из режимов ECC-контроль позволяет исправлять только одиночные ошибки и обнаруживать большинство ошибок с большей кратностью. Исправление ошибок может быть запрещено программно (через регистр управления ECC-контролем), при этом обнаруживаются все ошибки кратности 1, 2 и 3. В любом случае в регистрах ECCконтроля сохраняется диагностическая информация. Биты ECC выводятся на шину по тем же правилам и с теми же задержками, как и биты четности. Однако сигналы PERR# и SERR# вырабатываются приемником информации через такт после действительных бит ECC — «лишний» такт отдается на анализ синдрома ECC и попытку исправления ошибки.

Обнаруженная ошибка четности, как и ошибка более чем в одном бите, обнаруженная при ECC-контроле, считается неисправимой (unrecoverable). Достоверность информации в фазе адреса, а в PCI-X и в фазе атрибутов, проверяется целевым устройством. В случае обнаружения неисправимой ошибки в этих фазах целевое устройство подает сигнал SERR# (в течение одного такта) и устанавливает в своем регистре состояния бит 14 — Signaled System Error. В фазе данных достоверность проверяет устройство-приемник данных; в случае обнаружения неисправимой ошибки оно подает сигнал PERR# и устанавливает в своем регистре состояния бит 15 — Detected Parity Error. 

В регистре состояния устройства имеется бит 8 (Master Data Parity Error), который отражает неудачу выполнения транзакции (последовательности) из-за обнаруженной ошибки данных. В PCI и PCI-X его правила установки формально различны:

  • в PCI этот бит устанавливается только инициатором транзакции, когда он сам ввел (при чтении) или обнаружил (при записи) сигнал PERR#;
  • в PCI-X этот бит устанавливается запросчиком транзакции или мостом: будучи инициатором команд чтения, мост обнаруживает ошибку в данных; будучи инициатором команд записи, мост обнаруживает сигнал PERR#; будучи целевым устройством, мост получает данные завершения с ошибкой или сообщение завершения с ошибкой транзакции записи от одного из устройств.

В случае обнаружения ошибки данных у устройства PCI-X и его драйвера есть два варианта поведения:

  • не пытаясь выполнить какие-то действия по восстановлению и продолжению работы, подать сигнал SERR# — это сигнал катастрофической ошибки, который может трактоваться ОС как повод к перезагрузке. Для устройств PCI это единственно возможный вариант поведения;
  • не подавать сигнал SERR#, а пытаться обработать ошибку самостоятельно. Это можно делать только программно с учетом всех возможных побочных эффектов от лишних операций (простой повтор чтения может, например, привести к потере данных).

Выбор варианта поведения обеспечивается установкой бита 0 (Uncorrectable Data Error Recovery Enable) в регистре PCI-X Command. По умолчанию (после сброса) он обнулен — по ошибке данных устанавливается сигнал SERR#; иной вариант должен выбирать драйвер, «умеющий» самостоятельно обрабатывать ошибки. Обнаружение ошибки в фазе адреса или атрибутов всегда является фатальной ошибкой.

Инициатор (запросчик) транзакции должен иметь возможность уведомить драйвер об отвержении транзакции по условию Master Abort (нет ответа от целевого устройства) или Target Abort (отказ целевого устройства), используя прерывания или другие подходящие средства. Если такое уведомление невозможно, устройство должно подавать сигнал SERR#.



Sitelinkx by eXtro-media.de

Подкатегории

Яндекс.Метрика