intel OPAE FPGA Linux Архитектура на драйвер на устройство
OPAE Intel FPGA Linux архитектура на драйвер на устройство
Драйверът OPAE Intel FPGA предоставя интерфейси за приложения в потребителското пространство за конфигуриране, изброяване, отваряне и достъп до FPGA ускорители на платформи, оборудвани с решения на Intel FPGA, и позволява функции за управление на системно ниво, като преконфигуриране на FPGA, управление на захранването и виртуализация.
Хардуерна архитектура
От гледна точка на ОС view, FPGA хардуерът изглежда като обикновено PCIe устройство. Паметта на FPGA устройството е организирана с помощта на предварително дефинирана структура от данни (списък с функции на устройството). Функциите, поддържани от FPGA устройството, са изложени чрез тези структури от данни, както е илюстрирано по-долу на следната фигура:
FPGA PCIe устройство
Драйверът поддържа PCIe SR-IOV за създаване на виртуални функции (VF), които могат да се използват за присвояване на отделни ускорители към виртуални машини.
Корпорация Intel. Всички права запазени. Intel, логото на Intel и други марки на Intel са търговски марки на Intel Corporation или нейните филиали. Intel гарантира производителността на своите FPGA и полупроводникови продукти според настоящите спецификации в съответствие със стандартната гаранция на Intel, но си запазва правото да прави промени на продукти и услуги по всяко време без предизвестие. Intel не поема никаква отговорност или задължения, произтичащи от приложението или използването на каквато и да е информация, продукт или услуга, описани тук, освен в случаите, когато Intel е изрично договорено в писмен вид. Клиентите на Intel се съветват да получат най-новата версия на спецификациите на устройството, преди да разчитат на публикувана информация и преди да направят поръчки за продукти или услуги.
Други имена и марки могат да бъдат заявени като собственост на други.
Виртуализирано FPGA PCIe устройство
Механизъм за управление на FPGA (FME)
Механизмът за управление на FPGA изпълнява управление на мощността и топлината, отчитане на грешки, преконфигуриране, отчитане на производителността и други инфраструктурни функции. Всеки FPGA има един FME, който винаги е достъпен чрез физическата функция (PF). Приложенията в потребителското пространство могат да получат изключителен достъп до FME с помощта на open() и да го освободят с помощта на close() като привилегирован потребител (root).
Порт
Портът представлява интерфейса между статичната FPGA структура („FPGA Interface Manager (FIM)“) и частично преконфигурируема област, съдържаща функция за ускоряване (AF). Портът контролира комуникацията от софтуера към ускорителя и излага функции като нулиране и отстраняване на грешки. PCIe устройство може да има няколко порта и всеки порт може да бъде изложен чрез VF, като го присвоите с помощта на FPGA_FME_PORT_ASSIGN ioctl на FME устройството.
Модул за ускорителна функция (AF).
- Модул за ускорителна функция (AF) е прикрепен към порт и излага 256K MMIO регион, който да се използва за специфични за ускорителя контролни регистри.
- Приложенията за потребителско пространство могат да получат ексклузивен достъп до AFU, прикрепен към порт, като използват open() на порт устройството и го освобождават чрез close().
- Приложенията за потребителско пространство също могат да ускоряват mmap() MMIO региони.
Частична преконфигурация
Както бе споменато по-горе, ускорителите могат да бъдат преконфигурирани чрез частично преконфигуриране на функцията на ускорителя (AF) file. Функцията на ускорителя (AF) трябва да е генерирана за точния FIM и целевия статичен регион (порт) на FPGA; в противен случай операцията по преконфигуриране ще се провали и вероятно ще причини нестабилност на системата. Тази съвместимост може да се провери чрез сравняване на идентификатора на интерфейса, отбелязан в заглавката на AF, с идентификатора на интерфейса, изложен от FME чрез sysfs. Тази проверка обикновено се извършва от потребителското пространство, преди да се извика IOCTL за преконфигуриране.
Забележка:
Понастоящем всяка софтуерна програма, която има достъп до FPGA, включително тези, работещи във виртуализиран хост, трябва да бъде затворена преди опит за частично преконфигуриране. Стъпките биха били:
- Разтоварете драйвера от госта
- Изключете VF от госта
- Деактивирайте SR-IOV
- Извършете частично преконфигуриране
- Активирайте SR-IOV
- Включете VF към госта
- Заредете драйвера в госта
FPGA виртуализация
За да разрешите достъп до ускорител от приложения, работещи във VM, съответният порт на 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 Management Engine (FME) и порт.
- Създава екземпляри на драйвера на платформата, карайки ядрото на Linux да зареди съответните драйвери на модула на платформата.
Драйвер на устройство за платформен модул FME
- Управление на мощността и топлината, отчитане на грешки, отчитане на производителността и други инфраструктурни функции. Можете да получите достъп до тези функции чрез sysfs интерфейси, изложени от FME драйвера.
- Частична преконфигурация. Драйверът на FME регистрира FPGA мениджър по време на инициализация на PR подфункция; след като получи FPGA_FME_PORT_PR ioctl от вас, той извиква функцията за общ интерфейс от FPGA Manager, за да завърши частичното преконфигуриране на битовия поток към дадения порт.
- Управление на портове за виртуализация. Драйверът на FME въвежда два ioctl, FPGA_FME_PORT_RELEASE, който освобождава дадения порт от PF; и FPGA_FME_PORT_ASSIGN, който присвоява порта обратно на PF. След като портът бъде освободен от PF, той може да бъде присвоен на VF чрез интерфейсите SR-IOV, предоставени от PCIe драйвера. За повече информация вижте „FPGA виртуализация“.
Функции на драйвера на устройството на платформения модул FME
- Създава възела на символното устройство FME.
- Създава FME sysfs files и внедрява FME sysfs file аксесоари.
- Внедрява частните поддрайвери на FME.
- Поддрайвери за частни функции на FME:
- FME Header
- Топлинно управление
- Управление на мощността
- Глобална грешка
- Частична преконфигурация
- Глобално представяне
Драйвер на устройство за модул на платформа за портове
Подобно на драйвера на FME, драйверът на FPGA порт (и AFU) (intel-fpga-afu. ko) се изследва, след като бъде създадено устройството на платформата за порт. Основната функция на този модул е да предостави интерфейс за приложения в потребителското пространство за достъп до отделните ускорители, включително основен контрол за нулиране на порт, AFU MMIO експортиране на регион, услуга за картографиране на DMA буфер, UMsg(1) уведомяване и функции за отдалечено отстраняване на грешки ( виж по-горе).
UMsg се поддържа само чрез Acceleration Stack за процесор Intel Xeon® с интегрирана FPGA.
Функции на драйвера на модула на портовата платформа
- Създава възела на символното устройство на порта.
- Създава sysfs на порта files и внедрява Port sysfs file аксесоари.
- Внедрява частните поддрайвери на порта.
- Поддрайвери за частни функции на порта:
- Заглавие на порта
- AFU
- Грешка в порта
- UMsg (2)
- Докоснете сигнал
Приложение FPGA устройство изброяване
Този раздел въвежда как приложенията изброяват FPGA устройството от sysfs йерархията под /sys/class/fpga. В изхampпо-долу две FPGA устройства на Intel са инсталирани в хоста. Всяко FPGA устройство има един FME и два порта (AFU). За всяко FPGA устройство се създава директория на устройството под /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Всеки възел има един FME и два порта (AFU) като дъщерни устройства:
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-fme.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.0
/sys/class/fpga/intel-fpga-dev.0/intel-fpga-port.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-fme.1
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.2
/sys/class/fpga/intel-fpga-dev.1/intel-fpga-port.3
Като цяло интерфейсите на FME/Port sysfs са именувани както следва:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/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. Подчертани са основните структури и функции на данните. Този раздел е най-добре да следвате, когато viewing на придружаващия изходен код (pcie.c).
Структури на данни за изброяване
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
статична структура idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *име;
dev_t devt;
};
struct 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_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int device_id;
struct устройство *fme_dev;
struct mutex заключване;
struct list_head port_dev_list;
int номер_на_освободен_порт;
struct list_head региони;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int текуща_лента;
void __iomem *pfme_hdr;
struct устройство *parent_dev;
struct 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 главен режим и конфигурирайте 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.
- Разпределете масив от struct ресурс в feature_dev.resource.
- Разпределете структура feature_platform_data, инициализирайте я и съхранете указател в feature_dev.dev.platform_data
- build_info_commit_dev()
- Добавете struct feature_platform_data.node за порта към списъка с портове в struct 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() * Инициализиране на feature_dev.resource[id]. * feature_platform_data_add() Инициализиране на feature_platform_data.features[id], всичко освен .fops.
- parse_ports_from_fme()
- Ако драйверът е зареден на физическата функция (PF), тогава:
- Изпълнете потока parse_feature_list() на всеки порт, описан в заглавката на FME.
- Използвайте лентата, спомената във всеки запис на порт в заглавката.
Инициализация на устройството на платформата FME
Този раздел дава надview на кодовия поток за инициализация на FME устройство, извършен от intel-fpga-fme.ko. Основните структури от данни и функции са осветени. Този раздел е най-добре да следвате, когато viewing на придружаващия изходен код (fme-main.c).
Структури на данни на устройството на платформата FME
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
дълго (*ioctl)(struct platform_device *pdev, struct функция *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struct функция {
const char *име;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head възел;
struct mutex заключване;
неподписан дълъг dev_status;
структура cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
празен *частен;
int номер;
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];
};
struct perf_object {
int идентификатор;
const struct attribute_group **attr_groups;
struct устройство *fme_dev;
struct list_head възел;
struct list_head деца;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct устройство *dev_err;
struct perf_object *perf_dev;
struct 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 за всяка попълнена функция.
- Извикайте тестовата функция, ако има такава, от структурата.
- Извикайте функцията init от структурата.
- fme_probe() fpga_register_dev_ops()
- Създайте възела на символното устройство FME, като регистрирате структура file_операции.
Инициализация на устройството на платформата на порта
Този раздел дава надview на кодовия поток за инициализация на портово устройство, извършено от intel-fpga-afu.ko. Подчертани са основните структури и функции на данните. Този раздел е най-добре да следвате, когато viewing на придружаващия изходен код (afu.c).
Структури на данни на устройството на портовата платформа
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
дълго (*ioctl)(struct platform_device *pdev, struct функция *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struct функция {
const char *име;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head възел;
struct mutex заключване;
неподписан дълъг dev_status;
структура cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
празен *частен;
int номер;
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];
};
struct fpga_afu_region {
u32 индекс;
u32 знамена;
u64 размер;
u64 офсет;
u64 физика;
struct list_head възел;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 дължина;
u64 iova;
struct page **pages;
struct rb_node възел;
bool в_използване;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head региони;
struct rb_root dma_regions;
struct 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 за всяка попълнена функция.
- Извикайте тестовата функция, ако има такава, от структурата.
- Извикайте функцията init от структурата.
- afu_probe() fpga_register_dev_ops()
- Създайте възела на символното устройство на порта, като регистрирате структура file_операции.
FME IOCTL
IOCTL, които се извикват при отваряне file дескриптор за /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—връща текущата версия като цяло число, като се започне от 0.
FPGA_CHECK_EXTENSION—в момента не се поддържа.
FPGA_FME_PORT_RELEASE—arg е указател към:
struct fpga_fme_port_release {
__u32 argsz; // в: sizeof(struct fpga_fme_port_release)
__u32 флагове; // в: трябва да е 0
__u32 port_id; // в: ИД на порт (от 0) за освобождаване.
};
FPGA_FME_PORT_ASSIGN—arg е указател към:
struct fpga_fme_port_assign {
__u32 argsz; // в: sizeof(struct fpga_fme_port_assign)
__u32 флагове; // в: трябва да е 0
__u32 port_id; // in: ID на порт (от 0) за присвояване. (трябва да е било
издаден преди това от FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg е указател към:
struct fpga_fme_port_pr {
__u32 argsz; // в: sizeof(struct fpga_fme_port_pr)
__u32 флагове; // в: трябва да е 0
__u32 port_id; // в: ID на порт (от 0)
__u32 буфер_размер; // in: размер на буфера на bitstream в байтове. Трябва да е 4-байтов
подравнен.
__u64 буфер_адрес; // в: адрес на процеса на буфера на битовия поток
__u64 състояние; // out: състояние на грешка (bitmask)
};
Портове IOCTL
IOCTL, които се извикват при отваряне file дескриптор за /dev/intel-fpga-port.k FPGA_GET_API_VERSION—връща текущата версия като цяло число, започвайки от 0. FPGA_CHECK_EXTENSION—в момента не се поддържа.
FPGA_PORT_GET_INFO—arg е указател към:
struct fpga_port_info {
__u32 argsz; // в: sizeof(struct fpga_port_info)
__u32 флагове; // out: връща 0
__u32 брой_региони; // out: брой MMIO региони, 2 (1 за AFU и 1 за
STP)
__u32 num_umsgs; // out: брой UMsg, поддържани от хардуера
};
FPGA_PORT_GET_REGION_INFO—arg е указател към:
struct fpga_port_region_info {
__u32 argsz; // в: sizeof(struct fpga_port_region_info)
__u32 флагове; // out: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 индекс; // в: FPGA_PORT_INDEX_UAFU или FPGA_PORT_INDEX_STP
__u32 подложка; // в: трябва да е 0
__u64 размер; // out: размер на MMIO регион в байтове
__u64 отместване; // out: отместване на MMIO регион от началото на устройството fd
};
FPGA_PORT_DMA_MAP—arg е указател към:
struct fpga_port_dma_map {
__u32 argsz; // в: sizeof(struct fpga_port_dma_map)
__u32 флагове; // в: трябва да е 0 __u64 user_addr; // в: виртуален процес
адрес. Трябва да е подравнено по страницата.
__u64 дължина; // in: дължина на преобразуване в байтове. Трябва да е кратно на страница
размер.
__u64 iova; // out: IO виртуален адрес };
FPGA_PORT_DMA_UNMAP—arg е указател към:
struct fpga_port_dma_unmap {
__u32 argsz; // в: sizeof(struct fpga_port_dma_unmap)
__u32 флагове; // в: трябва да е 0
__u64 iova; // in: IO виртуален адрес, върнат от предишен
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg трябва да е NULL.
- FPGA_PORT_UMSG_ENABLE—arg трябва да е NULL.
- FPGA_PORT_UMSG_DISABLE—аргументите трябва да са NULL.
FPGA_PORT_UMSG_SET_MODE—arg е указател към:
struct fpga_port_umsg_cfg {
__u32 argsz; // в: sizeof(struct fpga_port_umsg_cfg)
__u32 флагове; // в: трябва да е 0
__u32 hint_bitmap; // в: растерно изображение в режим на подсказка UMsg. Показва кои са UMsg
активиран.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg трябва да бъде деактивиран преди издаването на този ioctl.
- Полето iova трябва да е за буфер, достатъчно голям за всички UMsg (num_umsgs * PAGE_SIZE).
- Буферът е маркиран като „в употреба“ от управлението на буфера на драйвера.
- Ако iova е NULL, всеки предишен регион е демаркиран като „в употреба“.
- arg е указател към:
struct fpga_port_umsg_base_addr {- u32 argsz; // в: sizeof(struct fpga_port_umsg_base_addr)
- u32 знамена; // в: трябва да е 0
- u64 iova; // в: IO виртуален адрес от FPGA_PORT_DMA_MAP. };
Забележка:
- За да изчистите грешките на портовете, трябва да напишете точната битова маска на текущите грешки, напрample, cat errors > clear
- UMsg се поддържа само чрез Acceleration Stack за процесор Intel Xeon с интегрирана FPGA.
sysfs Files
FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio поле | тип | достъп |
номер_портове | fme_header.capability.num_ports | десетичен int | Само за четене |
кеш_размер | fme_header.capability.cache_size | десетичен int | Само за четене |
версия | fme_header.capability.fabric_verid | десетичен int | Само за четене |
socket_id | fme_header.capability.socket_id | десетичен int | Само за четене |
bitstream_id | fme_header.bitstream_id | шестнадесетичен uint64_t | Само за четене |
bitstream_metadata | fme_header.bitstream_md | шестнадесетичен uint64_t | Само за четене |
FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio поле | тип | достъп |
праг1 | heat.threshold.tmp_thshold1 | десетичен int | Потребител: Само за четене Root: Четене-запис |
праг2 | heat.threshold.tmp_thshold2 | десетичен int | Потребител: Само за четене Root: Четене-запис |
threshold_trip | heat.threshold.therm_trip_thshold | десетичен int | Само за четене |
threshold1_reached | термичен.праг.thshold1_статус | десетичен int | Само за четене |
threshold2_reached | термичен.праг.thshold2_статус | десетичен int | Само за четене |
threshold1_policy | топлинна. threshold.thshold_policy | десетичен int | Потребител: Само за четене Root: Четене-запис |
температура | termal.rdsensor_fm1.fpga_temp | десетичен int | Само за четене |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio поле | тип | достъп |
консумирани | power.status.pwr_consumed | шестнадесетичен uint64_t | Само за четене |
праг1 | мощност.праг.праг1 | шестнадесетичен uint64_t | Потребител: Само за четене Root: Четене-запис |
праг2 | мощност.праг.праг2 | шестнадесетичен uint64_t | Потребител: Само за четене Root: Четене-запис |
threshold1_статус | power.threshold.threshold1_status | десетична без знак | Само за четене |
threshold2_статус | power.threshold.threshold2_status | десетична без знак | Само за четене |
rtl | power.status.fpga_latency_report | десетична без знак | Само за четене |
Глобална грешка на FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/грешки/
sysfs file | mmio поле | тип | достъп |
pcie0_грешки | gerror.pcie0_err | шестнадесетичен uint64_t | Чети пиши |
pcie1_грешки | gerror.pcie1_err | шестнадесетичен uint64_t | Чети пиши |
инжектиране_грешка | gerror.ras_error_inj | шестнадесетичен uint64_t | Чети пиши |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio поле | тип | достъп |
грешки | gerror.fme_err | шестнадесетичен uint64_t | Само за четене |
първа_грешка | gerror.fme_first_err.err_reg_status | шестнадесетичен uint64_t | Само за четене |
следваща_грешка | gerror.fme_next_err.err_reg_status | шестнадесетичен uint64_t | Само за четене |
ясно | Изчиства грешки, first_error, next_error | различни uint64_t | Само за писане |
Забележка:
За да изчистите грешките на FME, трябва да напишете точната битова маска на текущите грешки, напрample cat errors > clear.
sysfs за частично преконфигуриране на FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio поле | тип | достъп |
интерфейс_id | 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/clock
sysfs file | mmio поле | тип | достъп |
часовник | gperf.clk.afu_interf_clock | шестнадесетичен uint64_t | Само за четене |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Не е валидно за Acceleration Stack за Intel Xeon CPU с FPGA)
sysfs file | mmio поле | тип | достъп |
замръзвам | gperf.ch_ctl.freeze | десетичен int | Чети пиши |
read_hit | gperf.CACHE_RD_HIT | шестнадесетичен uint64_t | Само за четене |
read_miss | gperf.CACHE_RD_MISS | шестнадесетичен uint64_t | Само за четене |
write_hit | 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 | mmio поле | тип | достъп |
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/ (Не е валидно за Acceleration Stack за Intel Xeon CPU с FPGA)
sysfs file | mmio поле | тип | достъп |
замръзвам | gperf.vtd_ctl.freeze | десетичен int | Потребител: Само за четене Root: Четене-запис |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Не е валидно за Acceleration Stack за Intel Xeon CPU с FPGA)
sysfs file | mmio поле | тип | достъп |
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/fabric/
sysfs file | mmio поле | тип | достъп |
активирайте | gperf.fab_ctl.(активиран) | десетичен int | Потребител: Само за четене Root: Четене-запис |
замръзвам | gperf.fab_ctl.freeze | десетичен int | Потребител: Само за четене Root: Четене-запис |
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/fabric/portk/
sysfs file | mmio поле | тип | достъп |
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 | mmio поле | тип | достъп |
id | port_header.capability.port_number | десетичен int | Само за четене |
лтр | port_header.control.latency_tolerance | десетичен int | Само за четене |
Порт AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio поле | тип | достъп |
afu_id | afu_header.guid | шестнадесетичен 16-байт | Само за четене |
Грешка в порта sysfs files
intel-fpga-dev.i/intel-fpga-port.k/грешки/
sysfs file | mmio поле | тип | достъп |
грешки | грешка.порт_грешка | шестнадесетичен uint64_t | Само за четене |
първа_грешка | грешка.порт_първа_грешка | шестнадесетичен uint64_t | Само за четене |
first_malformed_req | грешка.malreq | шестнадесетичен 16-байт | Само за четене |
ясно | грешка. (всички грешки) | различни uint64_t | Само за писане |
Забележка:
За да изчистите грешките на порта, трябва да напишете точната битова маска на текущите грешки, напрample cat errors > clear.
История на ревизиите
Версия на документа | Промени |
2017.10.02 | Първоначално издание. |
OPAE Intel FPGA Linux Ръководство за архитектура на драйвери на устройства
Документи / Ресурси
![]() |
intel OPAE FPGA Linux Архитектура на драйвер на устройство [pdf] Ръководство за потребителя OPAE FPGA Архитектура на драйвера на Linux устройство, OPAE FPGA, Архитектура на драйвера на Linux устройство, Архитектура на драйвера, Архитектура |