intel-логотип

Архитектура драйверов устройств Intel OPAE FPGA для Linux

Intel-OPAE-FPGA-Linux-Device-Driver-Architecture-product

Архитектура драйвера устройства OPAE Intel FPGA Linux

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

Архитектура оборудования

С точки зрения ОС view, оборудование FPGA отображается как обычное устройство PCIe. Память устройства FPGA организована с использованием предопределенной структуры данных (Device Feature List). Функции, поддерживаемые устройством FPGA, раскрываются через эти структуры данных, как показано ниже на следующем рисунке:

ПЛИС PCIe-устройство

Intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (1)

Драйвер поддерживает PCIe SR-IOV для создания виртуальных функций (VF), которые можно использовать для назначения отдельных ускорителей виртуальным машинам.

Корпорация Интел. Все права защищены. Intel, логотип Intel и другие товарные знаки Intel являются товарными знаками корпорации Intel или ее дочерних компаний. Корпорация Intel гарантирует производительность своих FPGA и полупроводниковых продуктов в соответствии с текущими спецификациями в соответствии со стандартной гарантией Intel, но оставляет за собой право вносить изменения в любые продукты и услуги в любое время без предварительного уведомления. Intel не принимает на себя никакой ответственности или обязательств, возникающих в связи с применением или использованием какой-либо информации, продуктов или услуг, описанных в настоящем документе, за исключением случаев, когда это прямо согласовано с корпорацией Intel в письменной форме. Клиентам Intel рекомендуется получить последнюю версию спецификаций устройств, прежде чем полагаться на какую-либо опубликованную информацию и размещать заказы на продукты или услуги.

Другие названия и бренды могут быть заявлены как собственность других лиц.

Виртуализированное устройство FPGA PCIe

Intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (2)

Механизм управления ПЛИС (FME)
Механизм управления FPGA выполняет управление питанием и температурой, отчеты об ошибках, реконфигурацию, отчеты о производительности и другие функции инфраструктуры. Каждая FPGA имеет один FME, доступ к которому всегда осуществляется через физическую функцию (PF). Приложения пользовательского пространства могут получать эксклюзивный доступ к FME с помощью open() и освобождать его с помощью close() от имени привилегированного пользователя (root).

Порт
Порт представляет собой интерфейс между статической структурой FPGA («Менеджер интерфейса FPGA (FIM)») и частично реконфигурируемой областью, содержащей функцию ускорителя (AF). Порт управляет связью между программным обеспечением и ускорителем и предоставляет такие функции, как сброс и отладка. Устройство PCIe может иметь несколько портов, и каждый порт может быть открыт через VF, назначив его с помощью ioctl FPGA_FME_PORT_ASSIGN на устройстве FME.

Блок функции акселератора (AF)

  • Модуль Accelerator Function (AF) подключен к порту и предоставляет область MMIO 256 КБ, которая будет использоваться для регистров управления, специфичных для ускорителя.
  • Приложения пользовательского пространства могут получить эксклюзивный доступ к AFU, подключенному к порту, с помощью open() на устройстве порта и освободить его с помощью close().
  • Приложения пользовательского пространства также могут ускорять mmap() регионы MMIO.

Частичная реконфигурация
Как упоминалось выше, ускорители можно перенастроить путем частичной перенастройки функции ускорителя (AF). file. Функция ускорителя (AF) должна быть сгенерирована для точного FIM и целевой статической области (порта) FPGA; в противном случае операция реконфигурации завершится ошибкой и может привести к нестабильности системы. Эту совместимость можно проверить, сравнив идентификатор интерфейса, указанный в заголовке AF, с идентификатором интерфейса, предоставляемым FME через sysfs. Эта проверка обычно выполняется пространством пользователя перед вызовом IOCTL реконфигурации.

Примечание:
В настоящее время любая программа, имеющая доступ к ПЛИС, в том числе работающая на виртуализированном хосте, должна быть закрыта перед попыткой частичной реконфигурации. Шаги будут такими:

  1. Выгрузить драйвер из гостевой
  2. Отключите VF от гостя
  3. Отключить SR-IOV
  4. Выполнить частичную перенастройку
  5. Включить SR-IOV
  6. Подключите VF к гостю
  7. Загрузите драйвер в гостевой

Виртуализация ПЛИС
Чтобы разрешить доступ к ускорителю из приложений, работающих на виртуальной машине, соответствующий порт AFU необходимо назначить VF, выполнив следующие действия:

  1. По умолчанию PF владеет всеми портами AFU. Любой порт, который необходимо переназначить для VF, должен быть сначала освобожден от PF через ioctl FPGA_FME_PORT_RELEASE на устройстве FME.
  2. Как только N портов будут освобождены от PF, приведенную ниже команду можно использовать для включения SRIOV и VF. Каждому VF принадлежит только один порт с AFU. эхо N > PCI_DEVICE_PATH/sriov_numvfs
  3. Пройдите через VF к VM.
  4. AFU под VF доступен из приложений в VM (с использованием того же драйвера внутри VF).

Примечание:
FME не может быть назначен VF, поэтому PR и другие функции управления доступны только через PF.

Организация водителей

Драйвер устройства модуля PCIe

Организация водителей

Intel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (3)

Устройства FPGA отображаются как обычные устройства PCIe; таким образом, драйвер устройства FPGA PCIe (intel-FPGA-PCI.ko) всегда загружается первым после обнаружения FPGA PCIe PF или VF. Этот драйвер играет инфраструктурную роль в архитектуре драйвера. Это:

  • Создает контейнерное устройство FPGA в качестве родителя функциональных устройств.
  • Просматривает список функций устройств, реализованный в памяти BAR устройств PCIe, для обнаружения функциональных устройств и их подфункций и создания для них устройств платформы в контейнерном устройстве.
  • Поддерживает SR-IOV.
  • Представляет инфраструктуру функциональных устройств, которая абстрагирует операции для подфункций и предоставляет общие функции драйверам функциональных устройств.

Функции драйвера устройства модуля PCIe

  • Содержит обнаружение PCIe, перечисление устройств и обнаружение функций.
  • Создает каталоги sysfs для родительского устройства, механизма управления FPGA (FME) и порта.
  • Создает экземпляры драйверов платформы, заставляя ядро ​​Linux загружать соответствующие драйверы модулей платформы.

Драйвер устройства модуля платформы FME

  • Управление питанием и температурой, отчеты об ошибках, отчеты о производительности и другие функции инфраструктуры. Вы можете получить доступ к этим функциям через интерфейсы sysfs, предоставляемые драйвером FME.
  • Частичная реконфигурация. Драйвер FME регистрирует диспетчер FPGA во время инициализации подфункции PR; как только он получает от вас ioctl FPGA_FME_PORT_PR, он вызывает функцию общего интерфейса из FPGA Manager для завершения частичной реконфигурации битового потока на заданный порт.
  • Управление портами для виртуализации. Драйвер FME вводит два ioctl, FPGA_FME_PORT_RELEASE, которые освобождают данный порт от PF; и FPGA_FME_PORT_ASSIGN, который снова назначает порт PF. После освобождения порта от PF его можно назначить VF через интерфейсы SR-IOV, предоставляемые драйвером PCIe. Дополнительные сведения см. в разделе «Виртуализация ПЛИС».

Функции драйвера устройства модуля платформы FME

  • Создает узел символьного устройства FME.
  • Создает sysfs FME files и реализует FME sysfs file аксессуары.
  • Реализует поддрайверы частных функций FME.
  • Поддрайверы частных функций FME:
    • Заголовок FME
    • Управление температурным режимом
    • Управление питанием
    • Глобальная ошибка
    • Частичная реконфигурация
    • Глобальная производительность

Драйвер устройства модуля платформы порта
Подобно драйверу FME, драйвер порта FPGA (и AFU) (intel-fpga-afu.ko) проверяется после создания устройства платформы порта. Основная функция этого модуля — предоставить интерфейс для приложений пользовательского пространства для доступа к отдельным ускорителям, включая базовое управление сбросом порта, экспорт региона AFU MMIO, службу сопоставления буфера DMA, уведомление UMsg(1) и функции удаленной отладки ( см выше).

UMsg поддерживается только через стек ускорения для процессоров Intel Xeon® с интегрированной FPGA.

Функции драйвера устройства модуля платформы порта

  • Создает узел символьного устройства порта.
  • Создает порт sysfs files и реализует Port sysfs file аксессуары.
  • Реализует поддрайверы частной функции порта.
  • Поддрайверы частных функций порта:
    • Заголовок порта
    • ВСУ
    • Ошибка порта
    • UMsg(2)
    • Отвод сигнала

Перечень устройств FPGA приложения
В этом разделе рассказывается, как приложения перечисляют устройство FPGA в иерархии sysfs в /sys/class/fpga. В бывшемampВ приведенном ниже файле на хосте установлены два устройства Intel FPGA. Каждое устройство FPGA имеет один FME и два порта (AFU). Для каждого устройства FPGA создается каталог устройства в /sys/class/fpga:

/sys/класс/fpga/intel-fpga-dev.0
/sys/класс/fpga/intel-fpga-dev.1

Каждый узел имеет один FME и два порта (AFU) в качестве дочерних устройств:
/sys/класс/fpga/intel-fpga-dev.0/intel-fpga-fme.0
/sys/класс/fpga/intel-fpga-dev.0/intel-fpga-port.0
/sys/класс/fpga/intel-fpga-dev.0/intel-fpga-port.1
/sys/класс/fpga/intel-fpga-dev.1/intel-fpga-fme.1
/sys/класс/fpga/intel-fpga-dev.1/intel-fpga-port.2
/sys/класс/fpga/intel-fpga-dev.1/intel-fpga-port.3

В общем случае интерфейсы FME/Port sysfs называются следующим образом:
/sys/класс/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/класс/fpga/intel-fpga-dev.i/intel-fpga-port.k/

где I последовательно нумерует все контейнерные устройства, j последовательно нумерует FME и k последовательно нумерует все порты.

На узлы устройств, используемые для ioctl() и mmap(), можно ссылаться через:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Перечисление драйверов PCIe
Этот раздел дает болееview потока кода для перечисления устройств, выполняемого intel-fpga-pci.ko. Выделены основные структуры данных и функции. Этот раздел лучше всего использовать, когда viewв сопроводительном исходном коде (pcie.c).

Структуры данных перечисления

перечисление fpga_id_type {
PARENT_ID,
FME_ID,
ПОРТ_ИД,
FPGA_ID_MAX
};
статический идентификатор структуры fpga_ids[FPGA_ID_MAX];
структура fpga_chardev_info {
const char * name;
dev_t devt;
};
структура fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME},
{ .name = FPGA_FEATURE_DEV_PORT},
};
класс статической структуры *fpga_class;
статическая структура pci_device_id cci_pcie_id_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_DCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_DCP),},
{0,}
};
статическая структура pci_driver cci_pci_driver = {
.name = ИМЯ_DRV,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.удалить = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
структура cci_drvdata {
интервал_идентификатор_устройства;
структурное устройство *fme_dev;
блокировка структуры мьютекса;
структура list_head port_dev_list;
int выпущенный_порт_номер;
регионы struct list_head;
};
структура build_feature_devs_info {
структура pci_dev *pdev;
недействительным __iomem *ioaddr;
недействительным __iomem *ioend;
интервал текущий_бар;
недействительным __iomem *pfme_hdr;
структура устройства *parent_dev;
структура Platform_device *feature_dev;
};

Поток перечисления

  • ccidrv_init()
    • Инициализируйте fpga_ids с помощью idr_init().
    • Инициализируйте fpga_chrdevs[i].devt с помощью alloc_chrdev_region().
    • Инициализируйте fpga_class с помощью class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Включите устройство PCI, запросите доступ к его регионам, установите режим PCI master и настройте DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Выделите структуру build_feature_devs_info, инициализируйте ее.
      .parent_dev указывает на родительский каталог sysfs (intel-fpga-dev.id), который содержит каталоги FME и Port sysfs.
  • parse_feature_list()
    • Просмотрите список функций устройства BAR0, чтобы узнать о FME, порте и их частных функциях.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • При обнаружении FME:
  • build_info_create_dev()
    • Выделите устройство платформы для FME, сохраняя в build_feature_devs_info.feature_dev.
    • feature_dev.id инициализируется результатом idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent имеет значение build_feature_devs_info.parent_dev.
    • Выделите массив ресурсов структуры в feature_dev.resource.
  • Выделите структуру feature_platform_data, инициализируйте ее и сохраните указатель в feature_dev.dev.platform_data.
    • create_feature_instance() build_info_add_sub_feature()
    • Инициализировать feature_dev.resource[FME_FEATURE_ID_HEADER].
    • Feature_platform_data_add()
    • Инициализировать feature_platform_data.features[FME_FEATURE_ID_HEADER], все, кроме .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Когда встречается порт:
  • build_info_create_dev()
    • Выделите платформенное устройство для порта, сохранив его в build_feature_devs_info.feature_dev.
    • feature_dev.id инициализируется результатом idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent имеет значение build_feature_devs_info.parent_dev.
    • Выделите массив ресурсов структуры в feature_dev.resource.
    • Выделите структуру feature_platform_data, инициализируйте ее и сохраните указатель в feature_dev.dev.platform_data.
  • build_info_commit_dev()
    • Добавьте структуру feature_platform_data.node для порта в список портов в структуре cci_drvdata.port_dev_list.
  • create_feature_instance() build_info_add_sub_feature()
    • Инициализировать feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • Feature_platform_data_add()
    • Инициализируйте feature_platform_data.features[PORT_FEATURE_ID_HEADER], все, кроме .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • При обнаружении AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Инициализировать feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • Feature_platform_data_add()
    • Инициализируйте feature_platform_data.features[PORT_FEATURE_ID_UAFU], все, кроме .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • При обнаружении частной функции FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Инициализировать feature_dev.resource[id].
  • Feature_platform_data_add()
    • Инициализируйте feature_platform_data.features[id], все, кроме .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Когда встречается частная функция порта: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Инициализировать feature_platform_data.features[id], все, кроме .fops.
  • parse_ports_from_fme()
    • Если драйвер загружен на Physical Function (PF), то:
  • Запустите поток parse_feature_list() для каждого порта, описанного в заголовке FME.
  • Используйте BAR, упомянутый в каждой записи порта в заголовке.

Инициализация устройства платформы FME
Этот раздел дает болееview потока кода для инициализации устройства FME, выполняемого intel-fpga-fme.ko. Выделены основные структуры данных и функции. Этот раздел лучше всего использовать, когда viewиспользуя прилагаемый исходный код (fme-main.c).

Структуры данных устройств платформы FME

структура feature_ops {
int (*init)(struct Platform_device *pdev, struct Feature *feature);
int (*uinit)(struct Platform_device *pdev, struct Feature *feature);
long (*ioctl)(struct Platform_device *pdev, struct Feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct Platform_device *pdev, struct Feature *feature);
};
функция структуры {
const char * name;
интервал ресурс_индекс;
недействительным __iomem *ioaddr;
структура feature_ops *ops;
};
структура feature_platform_data {
узел struct list_head;
блокировка структуры мьютекса;
беззнаковый длинный dev_status;
структура cdev cdev;
структура platform_device *dev;
беззнаковый int disabled_count;
пустота *частное;
целочисленное число;
int (*config_port)(struct Platform_device *, u32, bool);
struct Platform_device *(*fpga_for_each_port)(struct Platform_device *,
void *, int (*match)(struct platform_device *, void *)); структура
характеристики[0];
};
структура perf_object {
внутренний идентификатор;
const structattribute_group **attr_groups;
структурное устройство *fme_dev;
узел struct list_head;
struct list_head дочерние элементы;
структура kobject kobj;
};
структура fpga_fme {
u8 идентификатор_порта;
u64 пр_ошибка;
структурное устройство *dev_err;
структура perf_object *perf_dev;
структура feature_platform_data *pdata;
};

Процесс инициализации устройства платформы FME

Поток инициализации FMEIntel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Инициализируйте структуру fpga_fme и сохраните ее в поле feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() Feature_instance_init()
    • Сохраните структуру feature_ops в файле feature_platform_data.features для каждой заполненной функции.
    • Вызовите тестовую функцию, если она есть, из структуры.
    • Вызов функции инициализации из структуры.
  • fme_probe() fpga_register_dev_ops()
    • Создайте узел символьного устройства FME, зарегистрировав структуру file_операции.

Инициализация устройства платформы порта
Этот раздел дает болееview потока кода для инициализации портового устройства, выполненного intel-fpga-afu.ko. Выделены основные структуры данных и функции. Этот раздел лучше всего использовать, когда viewиспользуя прилагаемый исходный код (afu.c).

Структуры данных устройств платформы портов

структура feature_ops {
int (*init)(struct Platform_device *pdev, struct Feature *feature);
int (*uinit)(struct Platform_device *pdev, struct Feature *feature);
long (*ioctl)(struct Platform_device *pdev, struct Feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct Platform_device *pdev, struct Feature *feature);
};
функция структуры {
const char * name;
интервал ресурс_индекс;
недействительным __iomem *ioaddr;
структура feature_ops *ops;
};
структура feature_platform_data {
узел struct list_head;
блокировка структуры мьютекса;
беззнаковый длинный dev_status;
структура cdev cdev;
структура platform_device *dev;
беззнаковый int disabled_count;
пустота *частное;
целочисленное число;
int (*config_port)(struct Platform_device *, u32, bool);
struct Platform_device *(*fpga_for_each_port)(struct Platform_device *,
void *, int (*match)(struct Platform_device *, void *));
особенности структуры[0];
};
структура fpga_afu_region {
индекс у32;
флаги U32;
размер u64;
смещение u64;
у64 физ;
узел struct list_head;
};
структура fpga_afu_dma_region {
u64 адрес_пользователя;
длина у64;
u64 йова;
страница структуры **страницы;
узел структуры rb_node;
логическое значение in_use;
};
структура fpga_afu {
u64 Region_cur_offset;
целое число_регионов;
u8 num_umsgs;
регионы struct list_head;
структура rb_root dma_regions;
структура feature_platform_data *pdata;
};

Поток инициализации устройства платформы порта

Поток инициализации портаIntel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Инициализируйте структуру fpga_afu и сохраните ее в поле feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() Feature_instance_init()
    • Сохраните структуру feature_ops в файле feature_platform_data.features для каждой заполненной функции.
    • Вызовите тестовую функцию, если она есть, из структуры.
    • Вызов функции инициализации из структуры.
  • afu_probe() fpga_register_dev_ops()
    • Создайте узел символьного устройства порта, зарегистрировав структуру file_операции.

IOCTL FME
IOCTL, которые вызываются при открытии file дескриптор для /dev/intel-fpga-fme.j FPGA_GET_API_VERSION — возвращает текущую версию в виде целого числа, начиная с 0.

FPGA_CHECK_EXTENSION — в настоящее время не поддерживается.

FPGA_FME_PORT_RELEASE — arg является указателем на:

структура fpga_fme_port_release {
__u32 аргументы; // in: sizeof(struct fpga_fme_port_release)
__u32 флаги; // в: должно быть 0
__u32 идентификатор_порта; // in: идентификатор порта (от 0) для освобождения.
};

FPGA_FME_PORT_ASSIGN — arg является указателем на:

структура fpga_fme_port_assign {
__u32 аргументы; // in: sizeof(struct fpga_fme_port_assign)
__u32 флаги; // в: должно быть 0
__u32 идентификатор_порта; // in: идентификатор порта (от 0) для назначения. (должно быть
ранее выпущенный FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR — arg является указателем на:

структура fpga_fme_port_pr {
__u32 аргументы; // in: sizeof(struct fpga_fme_port_pr)
__u32 флаги; // в: должно быть 0
__u32 идентификатор_порта; // in: идентификатор порта (от 0)
__u32 размер_буфера; // in: размер буфера битового потока в байтах. Должен быть 4-байтным
выровнены.
__u64 адрес_буфера; // in: адрес обработки буфера битового потока
__u64 статус; // выход: статус ошибки (битовая маска)
};

IOCTL портов
IOCTL, которые вызываются при открытии file дескриптор для /dev/intel-fpga-port.k FPGA_GET_API_VERSION — возвращает текущую версию в виде целого числа, начиная с 0. FPGA_CHECK_EXTENSION — в настоящее время не поддерживается.

FPGA_PORT_GET_INFO — arg является указателем на:

структура fpga_port_info {
__u32 аргументы; // in: sizeof(struct fpga_port_info)
__u32 флаги; // выход: возвращает 0
__u32 количество_регионов; // out: количество регионов MMIO, 2 (1 для AFU и 1 для
СТП)
__u32 num_umsgs; // out: количество UMsg, поддерживаемых оборудованием
};

FPGA_PORT_GET_REGION_INFO — arg является указателем на:

структура fpga_port_region_info {
__u32 аргументы; // in: sizeof(struct fpga_port_region_info)
__u32 флаги; // выход: (битовая маска) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__у32 индекс; // в: FPGA_PORT_INDEX_UAFU или FPGA_PORT_INDEX_STP
__u32 заполнение; // в: должно быть 0
__размер u64; // out: размер области MMIO в байтах
__u64 смещение; // out: смещение региона MMIO от начала устройства fd
};

FPGA_PORT_DMA_MAP — arg является указателем на:
структура fpga_port_dma_map {
__u32 аргументы; // in: sizeof(struct fpga_port_dma_map)
__u32 флаги; // in: должно быть 0 __u64 user_addr; // in: виртуальный процесс
адрес. Должен быть выровнен по странице.
__длина у64; // in: длина отображения в байтах. Должно быть кратно странице
размер.
__u64 иова; // out: виртуальный адрес ввода/вывода };

FPGA_PORT_DMA_UNMAP — arg является указателем на:
структура fpga_port_dma_unmap {
__u32 аргументы; // in: sizeof(struct fpga_port_dma_unmap)
__u32 флаги; // в: должно быть 0
__u64 иова; // in: виртуальный адрес ввода-вывода, возвращенный предыдущим
FPGA_PORT_DMA_MAP};

  • FPGA_PORT_RESET — аргумент должен иметь значение NULL.
  • FPGA_PORT_UMSG_ENABLE — аргумент должен иметь значение NULL.
  • FPGA_PORT_UMSG_DISABLE — аргументы должны быть NULL.

FPGA_PORT_UMSG_SET_MODE — arg является указателем на:

структура fpga_port_umsg_cfg {
__u32 аргументы; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 флаги; // в: должно быть 0
__u32 hint_bitmap; // in: растровое изображение режима подсказки UMsg. Обозначает, какие UMsg
включено.
};

FPGA_PORT_UMSG_SET_BASE_ADDR —

  • UMsg должен быть отключен до выдачи этого ioctl.
  • Поле iova должно быть достаточно большим для буфера для всех UMsg (num_umsgs * PAGE_SIZE).
    • Буфер помечается как «используемый» системой управления буфером драйвера.
    • Если iova имеет значение NULL, все предыдущие регионы не помечаются как «используемые».
  • arg является указателем на:
    структура fpga_port_umsg_base_addr {
    • u32 аргументы; // in: sizeof(struct fpga_port_umsg_base_addr)
    • флаги U32; // в: должно быть 0
    • u64 йова; // in: виртуальный адрес ввода-вывода из FPGA_PORT_DMA_MAP. };

Примечание:

  • Чтобы очистить ошибки порта, вы должны написать точную битовую маску текущих ошибок, напримерampле, кошачьи ошибки > очистить
  • UMsg поддерживается только через стек ускорения для процессоров Intel Xeon с интегрированной FPGA.

sysfs Files

sysfs заголовка FME files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file поле ммио тип доступ
порты_номер fme_header.capability.num_ports десятичное целое Только для чтения
размер_кеша fme_header.capability.cache_size десятичное целое Только для чтения
версия fme_header.capability.fabric_verid десятичное целое Только для чтения
идентификатор_сокета fme_header.capability.socket_id десятичное целое Только для чтения
битовый поток_id fme_header.bitstream_id шестнадцатеричный uint64_t Только для чтения
битстрим_метаданные fme_header.bitstream_md шестнадцатеричный uint64_t Только для чтения

Системы терморегулирования FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file поле ммио тип доступ
порог1 тепловой.порог.tmp_thshold1 десятичное целое Пользователь: только для чтения Корень: чтение-запись
порог2 тепловой.порог.tmp_thshold2 десятичное целое Пользователь: только для чтения Корень: чтение-запись
порог_путешествия тепловой.порог.therm_trip_thshold десятичное целое Только для чтения
порог1_достигнутый тепловой.порог.thshold1_status десятичное целое Только для чтения
порог2_достигнутый тепловой.порог.thshold2_status десятичное целое Только для чтения
порог1_политика термальный. порог.thshold_policy десятичное целое Пользователь: только для чтения Корень: чтение-запись
температура тепловой.rdsensor_fm1.fpga_temp десятичное целое Только для чтения

sysfs управления электропитанием FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file поле ммио тип доступ
потребленный power.status.pwr_consumed шестнадцатеричный uint64_t Только для чтения
порог1 мощность.порог.порог1 шестнадцатеричный uint64_t Пользователь: только для чтения Корень: чтение-запись
порог2 мощность.порог.порог2 шестнадцатеричный uint64_t Пользователь: только для чтения Корень: чтение-запись
порог1_статус power.threshold.threshold1_status десятичный беззнаковый Только для чтения
порог2_статус power.threshold.threshold2_status десятичный беззнаковый Только для чтения
ртл power.status.fpga_latency_report десятичный беззнаковый Только для чтения

Глобальная ошибка FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/ошибки/

sysfs file поле ммио тип доступ
pcie0_errors gerror.pcie0_err шестнадцатеричный uint64_t Читай пиши
pcie1_errors gerror.pcie1_err шестнадцатеричный uint64_t Читай пиши
инжект_ошибка gerror.ras_error_inj шестнадцатеричный uint64_t Читай пиши

intel-fpga-dev.i/intel-fpga-fme.j/ошибки/fme-ошибки/

sysfs file поле ммио тип доступ
ошибки gerror.fme_err шестнадцатеричный uint64_t Только для чтения
первая_ошибка gerror.fme_first_err.err_reg_status шестнадцатеричный uint64_t Только для чтения
следующая_ошибка gerror.fme_next_err.err_reg_status шестнадцатеричный uint64_t Только для чтения
прозрачный Очищает ошибки, первая_ошибка, следующая_ошибка различные uint64_t Только запись

Примечание:
Чтобы очистить ошибки FME, вы должны написать точную битовую маску текущих ошибок, напримерampкошачьи ошибки > очистить.

Частичная реконфигурация FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file поле ммио тип доступ
идентификатор_интерфейса pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l шестнадцатеричный 16-байтовый Только для чтения

FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/часы

sysfs file поле ммио тип доступ
часы gperf.clk.afu_interf_lock шестнадцатеричный uint64_t Только для чтения

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (недействительно для стека ускорения для ЦП Intel Xeon с ПЛИС)

sysfs file поле ммио тип доступ
заморозить gperf.ch_ctl.freeze десятичное целое Читай пиши
чтение_хит gperf.CACHE_RD_HIT шестнадцатеричный uint64_t Только для чтения
чтение_пропустить gperf.CACHE_RD_MISS шестнадцатеричный uint64_t Только для чтения
запись_хит gperf.CACHE_WR_HIT шестнадцатеричный uint64_t Только для чтения
write_miss gperf.CACHE_WR_MISS шестнадцатеричный uint64_t Только для чтения
удержание_запроса gperf.CACHE_HOLD_REQ шестнадцатеричный uint64_t Только для чтения
tx_req_stall gperf.CACHE_TX_REQ_STALL шестнадцатеричный uint64_t Только для чтения
sysfs file поле ммио тип доступ
rx_req_stall gperf.CACHE_RX_REQ_STALL шестнадцатеричный uint64_t Только для чтения
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN шестнадцатеричный uint64_t Только для чтения
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN шестнадцатеричный uint64_t Только для чтения

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (недействительно для стека ускорения для ЦП Intel Xeon с ПЛИС)

sysfs file поле ммио тип доступ
заморозить gperf.vtd_ctl.freeze десятичное целое Пользователь: только для чтения Корень: чтение-запись

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (недействительно для стека ускорения для процессоров Intel Xeon с FPGA)

sysfs file поле ммио тип доступ
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS шестнадцатеричный uint64_t Только для чтения
запись_транзакция gperf.VTD_AFU0_MEM_WR_TRANS шестнадцатеричный uint64_t Только для чтения
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT шестнадцатеричный uint64_t Только для чтения
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT шестнадцатеричный uint64_t Только для чтения

intel-fpga-dev.i/intel-fpga-fme.j/dperf/ткань/

sysfs file поле ммио тип доступ
давать возможность gperf.fab_ctl.(включено) десятичное целое Пользователь: только для чтения Корень: чтение-запись
заморозить gperf.fab_ctl.freeze десятичное целое Пользователь: только для чтения Корень: чтение-запись
pcie0_read gperf.FAB_PCIE0_RD шестнадцатеричный uint64_t Только для чтения
pcie0_write gperf.FAB_PCIE0_WR шестнадцатеричный uint64_t Только для чтения
pcie1_read gperf.FAB_PCIE1_RD шестнадцатеричный uint64_t Только для чтения
pcie1_write gperf.FAB_PCIE1_WR шестнадцатеричный uint64_t Только для чтения
upi_read gperf.FAB_UPI_RD шестнадцатеричный uint64_t Только для чтения
upi_write gperf.FAB_UPI_WR шестнадцатеричный uint64_t Только для чтения

intel-fpga-ev.i/intel-fpga/fme.j/dperf/ткань/portk/

sysfs file поле ммио тип доступ
pcie0_read gperf.FAB_PCIE0_RD шестнадцатеричный uint64_t Только для чтения
pcie0_write gperf.FAB_PCIE0_WR шестнадцатеричный uint64_t Только для чтения
pcie1_read gperf.FAB_PCIE1_RD шестнадцатеричный uint64_t Только для чтения
pcie1_write gperf.FAB_PCIE1_WR шестнадцатеричный uint64_t Только для чтения
upi_read gperf.FAB_UPI_RD шестнадцатеричный uint64_t Только для чтения
upi_write gperf.FAB_UPI_WR шестнадцатеричный uint64_t Только для чтения

Заголовок порта sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file поле ммио тип доступ
id port_header.capability.port_number десятичное целое Только для чтения
лтр port_header.control.latency_tolerance десятичное целое Только для чтения

Заголовок порта AFU sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file поле ммио тип доступ
afu_id afu_header.guid шестнадцатеричный 16-байтовый Только для чтения

Ошибка порта sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file поле ммио тип доступ
ошибки perror.port_error шестнадцатеричный uint64_t Только для чтения
первая_ошибка perror.port_first_error шестнадцатеричный uint64_t Только для чтения
first_malformed_req ошибка.malreq шестнадцатеричный 16-байтовый Только для чтения
прозрачный ошибка.(все ошибки) различные uint64_t Только запись

Примечание:
Чтобы очистить ошибки порта, вы должны написать точную битовую маску текущих ошибок, напримерampкошачьи ошибки > очистить.

История изменений

Версия документа Изменения
2017.10.02 Первоначальный выпуск.

Руководство по архитектуре драйверов устройств OPAE Intel FPGA Linux

Документы/Ресурсы

Архитектура драйверов устройств Intel OPAE FPGA для Linux [pdf] Руководство пользователя
OPAE FPGA Архитектура драйвера устройства Linux, OPAE FPGA, Архитектура драйвера устройства Linux, Архитектура драйвера, Архитектура

Ссылки

Оставьте комментарий

Ваш адрес электронной почты не будет опубликован. Обязательные поля отмечены *