@ Карта сайта News Автора!

Bog BOS: hardware:  PCI

Последнее изменение файла: 2017.12.11
Скопировано с www.bog.pp.ru: 2017.12.12

Bog BOS: hardware: PCI

Локальная шина PCI (бесприбыльная организация PCI-SIG, 1992 год) предназначена для обмена данными между контроллерами, платами расширения и процессором. Стандарт описывает протокол, электрические и механические характеристики (размеры плат, разъёмы), а также спецификацию пространства конфигурации. Не зависит от процессора и системной шины (требуется корневой мост). Ширина шины по данным - 32 или 64 бита (проверка чётности). Адресация - 32 или 64 бит (проверка чётности, не обязательна подержка шины данных 64 бит). Частота - 33 MHz (6 контроллеров на системной плате и 2 слота или 2 контроллера на системной плате и 4 слота) или 66 MHz (2 слота), одно медленное устройство замедляет всю шину. Задержка - 60 нс для 33 Мгц.

Одновременно действуют версии 2.3 (2001, наличие поддержки сигналов 5 В для TTL) и 3.0 (2002, отсутствие поддержки сигналов 5 В для TTL, только 3.3 В для CMOS). Для исключения смешения компонентов с неподходящим напряжением используется система ключей на материнской плате и плате расширения.

Разработчики PCI-X увеличили частоту до 66 MHz (4 слота), 133 MHz (266 MHz, 533 MHz) почти не меняя архитектуру системы (версия 2: сигналы 1.5V; 2 и 4 подфазы на такт, ECC, режим 16 бит).

PCI-SIG присваивает идентификаторы производителя (Vendor ID) и распространяет документацию среди своих членов, членство платное.

Архитектура

К шине PCI устройства PCI (контроллеры, агенты) подключены с помощью параллельного физического интерфейса с мультиплексированием адресов и данных, используется синхронная передача. Шина PCI (или сегмент, см. ниже) может подключаться к системной шине одним или несколькими (?) корневыми мостами (PCI Root Bridge, Host Bridge). Корневой мост (это тоже PCI устройство) имеет первичную системную шину (primary, upstream) и вторичную шину PCI (secondary, downstream). Через корневой мост устройства PCI непосредственно доступны в едином адресном пространстве памяти (MMIO) и IO портов. PCI устройства типа мастер (Master) имеют прямой доступ к памяти системы через корневой мост (он же арбитр для PCI шины и центральный ресурс). На шине может быть до 32 устройств (до 16 за мостом?). Устройство может реализовывать до 8 функций, функция 0 обязательна, номера не обязаны быть непрерывными.

Устройства PCI работают с 3 физическими адресными пространствами: адресное пространство памяти (MMIO), адресное пространство портов ввода-вывода (IO) и адресное пространство конфигурации устройства (256 байт на функцию, little endian), которое используется для инициализации устройства и обработки ошибок.

Доступ к адресному пространству конфигурации осуществляется с помощью специальной команды шины PCI (см. ниже) с явным указанием сигнала для нужного устройства, механизм выдачи команды описан только для архитектуры PC AT: через порты ввода-вывода CF8h для адреса конфигурации (шина, устройство, функция, смещение (номер регистра конфигурации)) и CFCh для данных конфигурации. Пространство конфигурации делится на стандартную (predefined header region) и нестандартную части (device dependent region). Чтение из пространства конфигурации несуществующего устройства возвращает все '1', что позволяет обойти (пронумеровать) все PCI агенты (контроллеры). Запись в пространство конфигурации по зарезервированному адресу уходит в никуда, чтение возвращает 0.

Первые 16 байт стандартной части одинаковы для всех типов заголовков устройств

Стандартные поля для заголовка типа 0:

PCI протокол не описывает доступ к хранилищу на плате, только к копии в памяти (RomImage, RomSize). PCI Expansion ROM (Option ROM, EPROM) не должен быть более 16 МБ, может содержать несколько образов Legacy BIOS (первым) и/или EFI (PCI Expansion ROM и PE/COFF)) для нескольких архитектур. Каждый образ начинается на границе блока 512 байт и начинается с заголовка Expansion ROM, который включает признак начала заголовка (байты 0x55, 0xAA), архитектурное расширение и ссылку в этом же регионе (16 бит!) на структуру PCI Data. Архитектурное расширение для PC-AT содержит размер кода инициализации (в блоках по 512 байт) и ссылку на адрес кода инициализации (3 байта). PCI Data содержит: признак начала ("PCIR"), идентификатор поставщика, идентификатор устройства, раньше был указатель на Vital Product Data (устарело), версия формата PCI Data (0), класс устройства (см. выше), размер образа (в блоках по 512 байт, 16 бит), версия кода в образе (Revision Level), тип кода (0 - x86 PC-AT, 1 - Open Firmware IEEE 1275-1994, 2 - HP PA RISC, 3 - EFI), индикатор последнего образа в списке. POST первоначально проверяет наличие регистра базового адреса расширения ROM и отображает ROM в адресное пространство, затем ищет среди образов образ с нужным типом кода и для нужного идентификатора поставщика и идентификатора устройства и (для архитектуры x86 PC-AT) копирует код инициализации в память (0C0000h-0DFFFFh?), устанавливает регистр базового адреса расширения ROM в память (Expansion ROM в lspci показывает размер и адрес в памяти), выделяет ресурсы (заполняет регистры базового адреса и прерывания), затем запускает код инициализации устройства (для архитектуры x86 PC-AT делается FAR CALL на указатель на код инициализации в памяти, параметры: номер шины, номер устройства, номер функции). Код инициализации может изменять себя и свой размер (даже до нуля) в заголовке Expansion ROM для уменьшения потребности в дефицитном адресном пространстве нижней части памяти во время выполнения. Кроме стандартного заголовка может содержать заголовки расширения, например, для загрузчика IPL.

Пакет flashrom позволяет искать, читать и писать прошивку для поддерживаемых материнских плат, сетевых карт, SATA и прочих. Например, сетевая карта Intel 82599 10-Gigabit SFI/SFP+ Network Controller (X520-2):

flashrom --programmer nicintel_spi

This PCI device is UNTESTED
This PCI device is UNTESTED
Error: Multiple supported PCI devices found. Use 'flashrom -p xxxx:pci=bb:dd.f'

flashrom --programmer nicintel_spi:pci=04:00.0 -V

Found "Intel 82599 10-Gigabit SFI/SFP+ Network Controller" (8086:10fb, BDF 04:00.0)
This PCI device is UNTESTED
Found Micron/Numonyx/ST flash chip "M25P40" (512 kB, SPI) on nicintel_spi

flashrom --programmer nicintel_spi:pci=04:00.0 -V -r Intel82599.rom -o Intel82599.backup.log

file Intel82599.rom
Intel82599.rom: BIOS (ia32) ROM Ext. (32*512) # UNDI PXE 2.1 и/или Setup?

/usr/bin/EfiRom --dump Intel82599.rom # из edk2-tools (edk2-tools-docs)
Image 1 -- Offset 0x0
  ROM header contents
    Signature              0xAA55
    PCIR offset            0x0040
    Signature               PCIR
    Vendor ID               0x8086
    Device ID               0x10FB
    Length                  0x001C
    Revision                0x0003
    DeviceListOffset        0x339E
    Class Code              0x020000
    Image size              0xF000
    Code revision:          0x0201
    MaxRuntimeImageLength   0x08
    ConfigUtilityCodeHeaderOffset 0x00
    DMTFCLPEntryPointOffset 0x00
    Indicator               0x80   (last image)
    Code type               0x00

Шины PCI могут соединяться с помощью мостов PCI to PCI (PCI-to-PCI, P2P Bridge) в сегмент PCI (топология - иерархия, дерево), до 256 шин. Задача моста - обеспечить выполнение транзакции, затребованной мастером на исходной шине (originating bus), исполнителем на шине назначения (destination bus), мост играет исполнителем на исходной шине от имени реального исполнителя и мастером на шине назначения от имени реального мастера. Мост P2P имеет первичную шину PCI (primary, upstream) и вторичную шину PCI (secondary, downstream), мастер и исполнитель могут находиться как на первичной, так и на вторичной шине. Мост имеет свои регистры конфигурации только на первичной шине (не реализована обработка сигнала выбора устройства IDSEL на вторичной шине), RST на вторичной шине тоже не действует. Явно запрещается подключать 2 различные первичные шины к общей вторичной, иметь несколько мостов между одной и той же первичной и одной и той же вторичной шиной, делать циклы (первичный интерфейс одного моста подключается к вторичному интерфейсу второго моста и наоборот). Не передаются транзакции специального цикла (широковещательные). Единое адресное пространство конфигурации делится между всеми устройствами сегмента, каждому устройству соответствует уникальный интервал адресов портов и памяти, При инициализации обеспечивается общая нумерация шин сегмента. Возможности моста P2P по буферизации передачи определяются реализацией. Мост P2P может поддерживать функции горячего подключения. При расположении первичного загрузочного ROM на вторичном интерфейсе необходимо понимать, что мост должен кто-то предварительно сконфигурировать.

Стандартные поля для заголовка типа 1 (мост PCI-to-PCI):

Несколько сегментов с единым адресным пространством конфигурации образует домен PCI. Система может иметь несколько доменов PCI.

Передачи по шине идут пачками (транзакциями) - сначала передаётся адрес, затем идёт 1 или несколько кадров передачи данных. Мастер задаёт команду управления шиной в начале транзакции, потенциальные исполнителю сравнивают адрес памяти иили порта в команде со своими и при совпадении взводят сигнал DEVSEL, команды:

Необходимый минимум контактов (ещё есть 2 контакта PRSNT - физическое наличие платы расширения в слоте и требования по питанию - 0, 7.5 Вт, 15 Вт, 25 Вт) - 47 (49 для мастера):

Дополнительные сигналы:

Прерывания INT[A-D] асинхронные, по одному прерыванию на функцию (устройство с 1 функцией может только INTA). Многофункциональные устройства могут иметь таблицу отображения между функцией и набором INTx, несколько функций могут отображаться на один и тот же INTx. Таблица отображения комбинации INTx на номер прерывания лежит на совести разработчика, номер прерывания выделяется функции во время POST (Interupt Line и Interupt Pin). Одно прерывание может обслуживать несколько устройств.

MSI (Message Signaled Interrupts) - возможность запросить обслуживание системы записав указанные системой данные по указанному системой адресу (данные и адрес - вектор). При инициализации системы каждой функции назначется 1 или несолько (до 32) векторов. Каждый вектор может быть маскирован отдельно (Mask and Pending). Описывается структурой возможностей (05h): управление (включить, 64-битные адреса, возможность маскирования, количество запрашиваемых и выделенных векторов - степень 2), адрес вектора, данные вектора, биты маски и ожиданий. Если функции выделено несколько векторов, то нужный вектор задаётся модификацией младших бит данных вектора. Если сообщение вызвано снова до обработки сообщения с тем же вектором, то оно может потеряться - используйте много векторов. spurious прерывание - были взведены биты маски и ожидания, сервис был обслужен, но бит ожидания не был очищен перед сбросом маски.

MSI-X - расширение MSI - позволяет больше (до 2048) векторов на функцию (например, Intel X520-2 (82599ES 10Gb) - 64 вектора, а Intel XL710 - 129), адреса задаются таблицей векторов в памяти (младшая часть адреса, данные, маска и ожидания), адреса всегда 64-битные, всегда есть маскирование. Функция может поддерживать как MSI так и MSI-X, но нельзя использовать одновременно (и одновременно с INTx). Описывается отдельной структурой возможностей (11h): управление (включить, размер таблицы), старшая часть 64-битного адреса вектора, BIR (BAR Indicator register) - адрес регистра базового адреса для таблицы (обязательно память), смещение таблицы относительно регистра.

Встроенный (необязательный) SMBus 2.0 (System Management Bus (SMBus) Specification 2.0, последовательный интерфейс по 2 проводам - SMBCLK и SMBDAT) позволяет опрашивать и управлять устройством, опрашивать датчики. Похож на I2C, но не совпадает. Может работать от 3.3Vaux при переводе системы в режим низкого потребления. Физическая шина SMBus - прямые соединения без использования повторителей и мостов. Логическая шина SMBus - объединение физических шин SMBus с помощью повторителей, обеспечивает общее адресное пространство и единый домен арбитража. Материнская плата предоставляет контроллер шины с механизмом арбитрации multi-master и возможности как мастера так и подчинённого. Все PCI устройства в одном шасси должны представлять 1 логическую шину SMBus. Адреса подчинённых устройств на картах расширения назначаются с помощью протокола ARP (address resolution protocol), реализация обязательна. Адреса устройств на материнской плате могут быть постоянными. SMBus на карте расширения должна предоставлять возможности подчинённого устройства.

Линии питания (ещё есть несколько линий земли и резерв): +5В (5A, 8 штук), +3.3В (7.6A, до 23 штук), +12В (500 ma) и -12В (100 mA) и опционально 3.3Vaux (требуется поддержка управления питанием). Карта расширения не должна потреблять более 25 Вт по всем линиям (10 Вт в неинициализированном состоянии).

Гнездо на материнской плате имеет ключ в позициях 12 и 13 для версии с обработкой сигналов 3.3 В и ключ в позициях 50 и 51 для версии с обработкой сигналов 5 В. Соединитель платы расширения имеет вырез для ключа 3.3 В или для обоих (Dual Voltage). Часть контактов для 64-битных команд (AD, C/BE, PAR64) отделены от основной части соединителя промежутком между позициями 62 и 63 (REQ64 и ACK64 расположены на первой (32-битной) части соединителя). Всего 62 двусторонних контакта (94 для 64-битной версии), из них 2 изоасходованы под ключ.

Механически платы расширения делятся на длинные (312 мм или 340.74 с корпусом, высота до 106.68 мм), короткие (длина до 167.64 мм), низкопрофильные (высота до 64.41 мм; длина MD1 - 121.79 мм , MD2 - 169.92 мм, MD3 - 243.18 мм). Толщина - 14.71 мм без учёта заднего монтажа, передняя панель - 17.15, компоненты на передней стороне - 14.48 мм, компоненты на задней стороне - 2.67 мм, интервал между картами - 20.32 мм. Контакты должны быть покрыты золотом поверх никеля или позолочены поверх палладиума и никеля и выдерживать более 100 циклов. Также стандартизованы разъёмы переходников (riser card). Имеется отдельный стандарт Mini PCI.

В протоколе прямо заявляется о возможности дедлоков (3.10.5) и чтения "зачерствевших" данных (3.10.6).

Управление питанием устройством и шиной PCI

Состояния питания функции - D0 (нормальная работа), D1 (разрешается инициировать только PME, отвечать только на запросы к конфигурационному пространству), D2 (разрешается инициировать только PME, отвечать только на запросы к конфигурационному пространству, для перехода в D0 требуется не менее 200 мкс), D3hot (логическое отключение, имеется Vcc, отвечать только на запросы к конфигурационному пространству, можно вернуться в D0 записью в регистр PMCSR (возможен внутренний сброс - No_Soft_Reset=0), не менее 10 мс) и D3cold (физическое отключение, отсутствует Vcc, можно перейти в D0 подачей питания и сигнала RST, но в неинициализированное состояние). D0 делится на неинициализированное состояние (переход из D3cold подачей питания) и активное. Следует учесть, что каждая функция имеет свои настройки управления питанием, но все функции одного устройства разделяют общую нагрузку на шину. Для каждого класса устройств должна быть определена своя политика (потребляемая мощность, задержки, урезание возможностей) для различных состояний. Стандарт определяет политику только для мостов. Управление питанием фукции осуществляется с помощью возможности 1, регистры управления питанием:

Состояния питания шины - B0 (полная работоспособность), B1 (тактовая частота есть, только PME), B2 (питание есть, остановить тактовый генератор, только PME, требуется 50 мс для перехода в B0), B3 (отключить питание, только PME, отсюда только в B0, при возвращении питания выдаётся сигнал RST). Отключение питания переводит шину в B3, сигнал RST переводит шину в B0, для перевода в B1 и B2 (и B3) требуется перевести исходящее устройство (Originating Device - мост, для которого эта шина является вторичной) в D1 или D2 (и D3hot).

Для каждого сочетания состояний D и B определяется: сохраняемый контекст, потребление, задержка доступа к функции, время восстановления до активного D0, доступные функции действия на шине PCI, доступные действия с функцией как исполнителем.

Сигнал PME (контакт 19A) - необязательный, асинхронный, выходной для функции (PME_En).

Устройство (все функции) имеет право потреблять не более 375 мА из 3.3Vaux при выдаче сигнала PME из D3cold, и не более 10 мА (20 mA?) при запрете выдачи. Суммарное потребление из 3.3Vaux по всей шине в B3 должно быть не менее 375 мА на выдающее в данный момент сигнал PME и по 20 мА на остальные слоты. В режимах B0/B1/B2 необходимо обеспечить все слоты 375 мА с шины питания 3.3Vaux (т.е. на 4 слота - 1.5A).

Сброс устройства без перезагрузки

Универсальные методы работы с PCI/PCI-Express устройствами описаны в Documentation/ABI/testing/sysfs-bus-pci.

Сброс устройства без перезагрузки (в данном случае Fibre Channel to PCI Express HBA от QLogic, драйвер qla2xxx):

echo 1 > /sys/bus/pci/devices/0000:02:00.0/host6/reset

Jan 13 04:54:31 s87 kernel: qla2xxx [0000:02:00.0]-d001:6: Firmware dump saved to temp buffer (6/ffffc90016fcb000), dump status flags (0x3f).
Jan 13 04:54:31 s87 kernel: qla2xxx [0000:02:00.0]-101e:6: Mailbox cmd timeout occurred, cmd=0x54, mb[0]=0x54. Scheduling ISP abort
Jan 13 04:54:31 s87 kernel: qla2xxx [0000:02:00.0]-00af:6: Performing ISP error recovery - ha=ffff880c6644d000.
Jan 13 04:54:35 s87 kernel: qla2xxx [0000:02:00.0]-500a:6: LOOP UP detected (8 Gbps).
Jan 13 04:54:35 s87 kernel: qla2xxx [0000:02:00.0]-801c:6: Abort command issued nexus=6:0:1 --  0 2002.
Jan 13 04:54:37 s87 kernel: qla2xxx [0000:02:00.0]-8009:6: DEVICE RESET ISSUED nexus=6:0:0 cmd=ffff880658703ec0.
Jan 13 04:54:37 s87 kernel: qla2xxx [0000:02:00.0]-800e:6: DEVICE RESET SUCCEEDED nexus:6:0:0 cmd=ffff880658703ec0.
Jan 13 04:54:37 s87 kernel: qla2xxx [0000:02:00.0]-8009:6: DEVICE RESET ISSUED nexus=6:0:1 cmd=ffff880c627a8280.
Jan 13 04:54:37 s87 kernel: qla2xxx [0000:02:00.0]-800e:6: DEVICE RESET SUCCEEDED nexus:6:0:1 cmd=ffff880c627a8280. 

Оживление зависшего устройства (в данном случае MegaRAID 9266 от LSI/Avago/Broadcom/как-его-там-сегодня-зовут, подвисшее устройство:

lspci -vvv -s 06:00.0
pcilib: sysfs_read_vpd: read failed: Connection timed out 

попробовал sg_ses и smartctl -i

Jan 13 05:44:53 x142 kernel: megasas: Found FW in FAULT state, will reset adapter scsi9.
Jan 13 05:44:53 x142 kernel: megaraid_sas: resetting fusion adapter scsi9.
Jan 13 05:44:53 x142 kernel: megaraid_sas: Reset not supported, killing adapter scsi9.
Jan 13 05:44:54 x142 kernel: ses 9:0:8:0: Device offlined - not ready after error recovery
Jan 13 05:44:54 x142 kernel: ses 9:0:8:0: Device offlined - not ready after error recovery
Jan 13 05:44:54 x142 kernel: ses 9:0:9:0: Device offlined - not ready after error recovery
Jan 13 05:51:46 x142 kernel: Controller in crit error

Удаление и повторное сканирование шины:

echo 1 > /sys/bus/pci/devices/0000:06:00.0/remove
ls -lL /sys/bus/pci/devices/0000:06:00.0
ls: cannot access /sys/bus/pci/devices/0000:06:00.0: No such file or directory

echo 1 > /sys/bus/pci/rescan
Jan 13 06:08:21 x142 kernel: pci 0000:06:00.0: BAR 3: assigned [mem 0xdfa00000-0xdfa3ffff 64bit]
Jan 13 06:08:21 x142 kernel: pci 0000:06:00.0: BAR 6: assigned [mem 0xdfa40000-0xdfa5ffff pref]
Jan 13 06:08:21 x142 kernel: pci 0000:06:00.0: BAR 1: assigned [mem 0xdfa60000-0xdfa63fff 64bit]
Jan 13 06:08:21 x142 kernel: pci 0000:06:00.0: BAR 0: assigned [io  0x5000-0x50ff]
Jan 13 06:08:21 x142 kernel: mgag200 0000:08:03.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
Jan 13 06:08:21 x142 kernel: megasas: Waiting for FW to come to ready state
Jan 13 06:08:21 x142 kernel: megasas: FW now in Ready state
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: firmware supports msix#011: (16)
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: current msix/online cpus#011: (12/12)
Jan 13 06:08:21 x142 kernel: megasas:IOC Init cmd success
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: firmware type#011: Extended VD(240 VD)firmware
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: controller type#011: MR(1024MB)
Jan 13 06:08:21 x142 kernel: megasas: INIT adapter done
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: pci id#011#011: (0x1000)/(0x005b)/(0x1000)/(0x9266)
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: unevenspan support#011: no
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: disable ocr#011#011: no
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: firmware crash dump#011: no
Jan 13 06:08:21 x142 kernel: megaraid_sas 0000:06:00.0: secure jbod#011#011: no
Jan 13 06:08:21 x142 kernel: scsi host10: Avago SAS based MegaRAID driver
Jan 13 06:08:21 x142 kernel: scsi 10:0:8:0: Enclosure         LSI      SAS3x40          0601 PQ: 0 ANSI: 5
Jan 13 06:08:21 x142 kernel: scsi 10:0:9:0: Enclosure         LSI      SAS3x40          0601 PQ: 0 ANSI: 5
Jan 13 06:08:21 x142 kernel: ses 10:0:8:0: Attached Enclosure device
Jan 13 06:08:21 x142 kernel: ses 10:0:8:0: Attached scsi generic sg5 type 13
Jan 13 06:08:21 x142 kernel: ses 10:0:9:0: Attached Enclosure device
Jan 13 06:08:21 x142 kernel: ses 10:0:9:0: Attached scsi generic sg6 type 13 

Ссылки

@ Карта сайта News Автора!

Bog BOS: hardware:  PCI

TopList

Copyright © 1996-2017 Sergey E. Bogomolov; www.bog.pp.ru (КГБ знает все, даже то что у Вас на диске ;)