intel-лого

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

intel-OPAE-FPGA-Linux-Device-Driver-Архитектура-продукт

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

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

Хардуерна архитектура

От гледна точка на ОС view, FPGA хардуерът изглежда като обикновено PCIe устройство. Паметта на FPGA устройството е организирана с помощта на предварително дефинирана структура от данни (списък с функции на устройството). Функциите, поддържани от FPGA устройството, са изложени чрез тези структури от данни, както е илюстрирано по-долу на следната фигура:

FPGA PCIe устройство

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

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

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

Други имена и марки могат да бъдат заявени като собственост на други.

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

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

Механизъм за управление на 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, включително тези, работещи във виртуализиран хост, трябва да бъде затворена преди опит за частично преконфигуриране. Стъпките биха били:

  1. Разтоварете драйвера от госта
  2. Изключете VF от госта
  3. Деактивирайте SR-IOV
  4. Извършете частично преконфигуриране
  5. Активирайте SR-IOV
  6. Включете VF към госта
  7. Заредете драйвера в госта

FPGA виртуализация
За да разрешите достъп до ускорител от приложения, работещи във VM, съответният порт на 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 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.
  • 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

Поток на инициализация на 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 за всяка попълнена функция.
    • Извикайте тестовата функция, ако има такава, от структурата.
    • Извикайте функцията 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;
};

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

Поток на инициализация на порт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 за всяка попълнена функция.
    • Извикайте тестовата функция, ако има такава, от структурата.
    • Извикайте функцията 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 устройство, Архитектура на драйвера, Архитектура

Референции

Оставете коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са маркирани *