байтов.
♦ Длина транзакции явно указывается в запросе.
♦ Конвейерные запросы не гарантируют когерентность памяти и кэша. Для операций, требующих когерентности, должны использоваться транзакции PCI.
Возможны
♦ Запросы вводятся по шине AD[31:0] и С/BE[3:0] с помощью сигнала PIPE#, по каждому фронту CLK ведущее устройство передает очередное двойное слово запроса вместе с кодом команды.
♦ Команды подаются через внеполосные (sideband) линии адреса SBA[7:0]. «Внеполосность» означает, что эти сигналы используются независимо от занятости шины AD. Синхронизация подачи запросов зависит от режима (1х, 2х или 4х).
PIPE# код команды AGP (CCCC) кодируется сигналами С/BE[3:0], при этом на шине AD помещается начальный адрес (на AD[31:3]) и длина n (на AD[2:0]) запрашиваемого блока данных. Определены следующие команды:
♦ 0000 (Read) — чтение из памяти (n+1) учетверенных слов (по 8 байт) данных, начиная с указанного адреса;
♦ 0001 (HP Read) — чтение с высоким приоритетом;
♦ 0100 (Write) — запись в память;
♦ 0101 (HP Write) — запись с высоким приоритетом;
♦ 1000 (Long Read) — «длинное» чтение (n+1)×4 учетверенных слов (до 256 байт данных);
♦ 1001 (HP Long Read) — «длинное» чтение с высоким приоритетом;
♦ 1010 (Flush) — очистка, выгрузка данных всех предыдущих команд записи по адресам назначения (на порте AGP выглядит как чтение, возвращающее произвольное учетверенное слово в качестве подтверждения исполнения; адрес и длина, указанные в запросе, значения не имеют);
♦ 1100 (Fence) — установка «ограждений», позволяющих низкоприоритетному потоку записей не пропускать чтения;
♦ 1101 (Dual Address Cycle, DAC) — двухадресный цикл для 64-битной адресации: в первом такте по AD передается младшая часть адреса и длина запроса, а во втором — старшая часть адреса (по AD) и код исполняемой команды (по С/BE[3:0]).
♦ тип 1: 0ААА AAAA AAAA ALLL — поле длины (LLL) и младшие биты адреса (А[14:03]);
♦ тип 2: 10СС CCRA AAAA АААА — код команды (CCCC) и средние биты адреса (А[23:15]);
♦ тип 3: 110R AAAA АААА AAAA — старшие биты адреса (А [35:24]);
♦ тип 4: 1110 AAAA АААА AAAA — дополнительные старшие биты адреса, если требуется 64-битная адресация.
Посылка из всех единиц является пустой командой (NOP); они посылаются в покое шины SBA. Биты «R» зарезервированы. Посылки типов 2, 3 и 4 являются «липкими» (sticky) — значения, ими определяемые, сохраняются до введения новой посылки того же типа. Постановку команды в очередь инициирует посылка типа 1, задающая длину транзакции и ее младшие адреса, — код команды и остальная часть адреса должны быть определены ранее введенными посылками типов 2–4. Такой способ очень экономно использует такты шины для подачи команд при пересылках массивов. Синхронизация данных на SBA зависит от режима порта.
♦ В режиме 1х каждая часть передается по фронту CLK; начало посылки (старшая часть) определяется по получению байта, отличного от 11111111b, по последующему фронту передается младшая часть. Очередная команда может вводиться
♦ В режиме 2х для SBA используется отдельный строб SB_STB, по его спаду передается старшая часть, а по последующему фронту — младшая. Частота этого строба (но не фаза) совпадает с CLK, так что очередная команда может вводиться
♦ В режиме 4х используется еще и дополнительный (инверсный) строб SB_STB#. Старшая часть фиксируется по спаду SB_STB, а младшая — по последующему спаду SB_STB#. Частота стробов в два раза выше, чем CLK, так что в каждом такте CLK может вводиться
Конечно, полный цикл введения команд (с посылками всех четырех типов) с учетом посылки NOP оказывается больше — 10, 5 и 2,5 тактов частоты CLK для режимов 1х, 2х и 4х соответственно.
В ответ на полученные команды порт AGP выполняет
ST[2:0] (действительны только во время сигнала GNT#, коды 100–110 зарезервированы):
♦ 000 — ведущему устройству будут передаваться данные низкоприоритетного запроса чтения, ранее поставленного в очередь (или выполняется очистка);
♦ 001 — ведущему устройству будут передаваться данные высокоприоритетного запроса чтения;
♦ 010 — ведущее устройство должно будет предоставлять данные низкоприоритетного запроса записи;
♦ 011 — ведущее устройство должно будет предоставлять данные высокоприоритетного запроса записи;
♦ 111 — ведущему устройству разрешается поставить в очередь команду AGP (сигналом PIPE#) или начать транзакцию PCI (сигналом FRAME#).
Ускоритель узнает лишь тип и приоритет команды, результаты которой последуют в данной транзакции. Какую именно команду из очереди отрабатывает порт, ускоритель определяет сам, так как именно он ставил их в очередь (ему известен порядок). Никаких тегов транзакций (как, например, в системной шине процессоров P6) в интерфейсе AGP нет. Имеется только 4 независимых очереди для каждого типа команд (чтение низкоприоритетное, чтение высокоприоритетное, запись низкоприоритетная, запись высокоприоритетная). Фазы исполнения команд разных очередей могут чередоваться произвольным образом; порт имеет право исполнять их в порядке, оптимальном с точки зрения производительности. Реальный порядок исполнения команд (чтения и записи памяти) тоже может изменяться. Однако для каждой очереди порядок выполнения всегда совпадает с порядком подачи команд (об этом знают и ускоритель, и порт).
Запросы AGP с высоким приоритетом для арбитра системной логики являются более приоритетными, чем запросы от центрального процессора и ведущих устройств шины PCI. Запросы AGP с низким приоритетом для арбитра имеют приоритет ниже, чем от процессора, но выше, чем от остальных ведущих устройств. Хотя принятый протокол никак явно не ограничивает глубину очередей, спецификация AGP формально ее ограничивает до 256 запросов. На этапе конфигурирования устройства система PnP устанавливает реальное ограничение (в конфигурационном регистре ускорителя) в соответствии с его
