Архитектура драйверов устройств Intel OPAE FPGA для Linux
Архитектура драйвера устройства OPAE Intel FPGA Linux
Драйвер OPAE Intel FPGA предоставляет интерфейсы для приложений пользовательского пространства для настройки, перечисления, открытия и доступа к ускорителям FPGA на платформах, оснащенных решениями Intel FPGA, и обеспечивает функции управления на уровне системы, такие как реконфигурация FPGA, управление питанием и виртуализация.
Архитектура оборудования
С точки зрения ОС view, оборудование FPGA отображается как обычное устройство PCIe. Память устройства FPGA организована с использованием предопределенной структуры данных (Device Feature List). Функции, поддерживаемые устройством FPGA, раскрываются через эти структуры данных, как показано ниже на следующем рисунке:
ПЛИС PCIe-устройство
Драйвер поддерживает PCIe SR-IOV для создания виртуальных функций (VF), которые можно использовать для назначения отдельных ускорителей виртуальным машинам.
Корпорация Интел. Все права защищены. Intel, логотип Intel и другие товарные знаки Intel являются товарными знаками корпорации Intel или ее дочерних компаний. Корпорация Intel гарантирует производительность своих FPGA и полупроводниковых продуктов в соответствии с текущими спецификациями в соответствии со стандартной гарантией Intel, но оставляет за собой право вносить изменения в любые продукты и услуги в любое время без предварительного уведомления. Intel не принимает на себя никакой ответственности или обязательств, возникающих в связи с применением или использованием какой-либо информации, продуктов или услуг, описанных в настоящем документе, за исключением случаев, когда это прямо согласовано с корпорацией Intel в письменной форме. Клиентам Intel рекомендуется получить последнюю версию спецификаций устройств, прежде чем полагаться на какую-либо опубликованную информацию и размещать заказы на продукты или услуги.
Другие названия и бренды могут быть заявлены как собственность других лиц.
Виртуализированное устройство FPGA PCIe
Механизм управления ПЛИС (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 реконфигурации.
Примечание:
В настоящее время любая программа, имеющая доступ к ПЛИС, в том числе работающая на виртуализированном хосте, должна быть закрыта перед попыткой частичной реконфигурации. Шаги будут такими:
- Выгрузить драйвер из гостевой
- Отключите VF от гостя
- Отключить SR-IOV
- Выполнить частичную перенастройку
- Включить SR-IOV
- Подключите VF к гостю
- Загрузите драйвер в гостевой
Виртуализация ПЛИС
Чтобы разрешить доступ к ускорителю из приложений, работающих на виртуальной машине, соответствующий порт AFU необходимо назначить VF, выполнив следующие действия:
- По умолчанию PF владеет всеми портами AFU. Любой порт, который необходимо переназначить для VF, должен быть сначала освобожден от PF через ioctl FPGA_FME_PORT_RELEASE на устройстве FME.
- Как только N портов будут освобождены от PF, приведенную ниже команду можно использовать для включения SRIOV и VF. Каждому VF принадлежит только один порт с AFU. эхо N > PCI_DEVICE_PATH/sriov_numvfs
- Пройдите через VF к VM.
- AFU под VF доступен из приложений в VM (с использованием того же драйвера внутри VF).
Примечание:
FME не может быть назначен VF, поэтому PR и другие функции управления доступны только через PF.
Организация водителей
Драйвер устройства модуля PCIe
Организация водителей
Устройства 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.
- Выделите структуру build_feature_devs_info, инициализируйте ее.
- 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
Поток инициализации FME
- 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;
};
Поток инициализации устройства платформы порта
Поток инициализации порта
- 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, Архитектура драйвера, Архитектура |