интел-лого

Архитектура на двигател на уреди на интел OPAE FPGA Linux

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

Архитектура на двигател на уреди OPAE Intel FPGA Linux

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

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

Од гледна точка на ОС на view, хардверот FPGA се појавува како обичен PCIe уред. Меморијата на уредот FPGA е организирана со користење на претходно дефинирана структура на податоци (Список на карактеристики на уредот). Карактеристиките поддржани од уредот FPGA се изложени преку овие структури на податоци, како што е илустрирано подолу на следната слика:

FPGA PCIe уред

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

Возачот поддржува PCIe SR-IOV за создавање виртуелни функции (VF) кои може да се користат за доделување поединечни забрзувачи на виртуелни машини.

Интел корпорација. Сите права се задржани. Intel, логото на Intel и другите ознаки на Intel се заштитни знаци на Intel Corporation или нејзините подружници. Интел гарантира изведба на своите FPGA и полупроводнички производи според тековните спецификации во согласност со стандардната гаранција на 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 интерфејс менаџер (FIM)“) и делумно реконфигурабилниот регион кој содржи функција за забрзување (AF). Портата ја контролира комуникацијата од софтверот до забрзувачот и ги изложува функциите како што се ресетирање и отстранување грешки. Уредот PCIe може да има неколку порти, а секоја порта може да биде изложена преку VF со тоа што ќе ја доделите со помош на FPGA_FME_PORT_ASSIGN ioctl на уредот FME.

Единица за функција за забрзување (AF).

  • Единицата за акцелераторска функција (AF) е прикачена на пристаниште и изложува 256K MMIO регион што ќе се користи за контролни регистри специфични за забрзувачот.
  • Апликациите за кориснички простор можат да добијат ексклузивен пристап до AFU прикачен на Порт со користење на open() на уредот Port и да го ослободат со помош на close().
  • Апликациите за кориснички простор исто така можат да mmap() ги забрзуваат MMIO регионите.

Делумна реконфигурација
Како што споменавме погоре, акцелераторите може да се реконфигурираат преку делумна реконфигурација на функцијата за забрзување (AF) file. Функцијата за забрзување (AF) мора да е генерирана за точниот FIM и насочениот статичен регион (Порта) на FPGA; во спротивно, операцијата за реконфигурација ќе пропадне и евентуално ќе предизвика нестабилност на системот. Оваа компатибилност може да се провери со споредување на ID на интерфејсот забележан во заглавието 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 преку FPGA_FME_PORT_RELEASE ioctl на уредот FME.
  2. Откако N порти ќе бидат ослободени од PF, командата подолу може да се користи за да се овозможи SRIOV и VFs. Секој 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) и Port.
  • Креира примероци на двигатели на платформата, предизвикувајќи кернелот на 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 fileи го имплементира FME sysfs file додатоци.
  • Ги имплементира под-двигателите за приватни функции FME.
  • Под-двигатели на приватни функции на FME:
    • Заглавие FME
    • Термички менаџмент
    • Управување со енергија
    • Глобална грешка
    • Делумна реконфигурација
    • Глобални перформанси

Возач на уредот за модул на платформата на пристаништето
Слично на двигателот FME, двигателот на портата FPGA (и AFU) (intel-fpga-afu. ko) се испитува откако ќе се креира уредот на платформата Port. Главната функција на овој модул е ​​да обезбеди интерфејс за апликации за кориснички простор за пристап до индивидуалните акцелератори, вклучително и основна контрола на ресетирање на Порт, извоз на регионот AFU MMIO, услуга за мапирање на баферот DMA, известување UMsg(1) и функции за далечинско отстранување грешки ( види погоре).

UMsg е поддржан само преку Acceleration Stack за Intel Xeon® процесор со интегриран FPGA.

Функции на двигателот на уредот на модулот на платформата на пристаништето

  • Го создава јазолот на уредот со знаци Port.
  • Создава порт sysfs fileи го имплементира Port sysfs file додатоци.
  • Ги имплементира под-двигателите на приватната функција Port.
  • Под-двигатели на приватни функции за пристаниште:
    • Заглавие на пристаништето
    • АФУ
    • Грешка во пристаништето
    • UMsg (2)
    • Допрете на сигналот

Апликација FPGA Device Enumeration
Овој дел воведува како апликациите го набројуваат уредот FPGA од хиерархијата sysfs под /sys/class/fpga. Во ексampподолу, два Intel FPGA уреди се инсталирани во домаќинот. Секој 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. Нагласени се главните структури и функции на податоци. Овој дел најдобро се следи кога viewвнесување на придружниот изворен код (pcie.c).

Структури на податоци за набројување

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
статична структура idr fpga_ids[FPGA_ID_MAX];
структура 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
};
структура cci_drvdata {
int уред_ид;
struct уред *fme_dev;
struct mutex брава;
struct list_head port_dev_list;
int release_port_num;
struct list_head региони;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
празнина __iomem *ioend;
int current_bar;
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.
    • Доделете низа од структурен ресурс во feature_dev.resource.
    • Доделете структура feature_platform_data, иницијализирајте ја и складирајте покажувач во feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Додајте го struct feature_platform_data.node за Порта на листата на Ports во 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. Главните структури на податоци и функции се нагласени. Овој дел најдобро се следи кога viewвнесување на придружниот изворен код (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 функција *функција,
непотпишан int cmd, непотпишан долг арг);
int (*тест) (struct platform_device *pdev, struct feature *feature);
};
структурна карактеристика {
const char *име;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head јазол;
struct mutex брава;
непотпишан долг dev_status;
struct cdev cdev;
struct platform_device *dev;
непотпишана int disable_count;
празнина *приватно;
int num;
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 {
int id;
const struct атрибут_група **attr_групи;
struct уред *fme_dev;
struct list_head јазол;
struct list_head деца;
struct kobject kobj;
};
структура 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()
    • Зачувајте struct feature_ops во feature_platform_data.features за секоја населена карактеристика.
    • Повикајте ја тест функцијата, доколку ја има, од структурата.
    • Повикајте ја функцијата init од структурата.
  • fme_probe() fpga_register_dev_ops()
    • Креирајте го јазолот за уред со знаци FME, регистрирајќи структура file_операции.

Иницијализација на уредот на платформата на пристаништето
Овој дел дава завршницаview на протокот на код за иницијализација на уредот на пристаништето изведена од intel-fpga-afu.ko. Нагласени се главните структури и функции на податоци. Овој дел најдобро се следи кога viewвнесување на придружниот изворен код (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 функција *функција,
непотпишан int cmd, непотпишан долг арг);
int (*тест) (struct platform_device *pdev, struct feature *feature);
};
структурна карактеристика {
const char *име;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head јазол;
struct mutex брава;
непотпишан долг dev_status;
struct cdev cdev;
struct platform_device *dev;
непотпишана int disable_count;
празнина *приватно;
int num;
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 *));
struct карактеристики карактеристики[0];
};
структура fpga_afu_region {
индекс u32;
знамиња u32;
големина u64;
u64 поместување;
u64 физика;
struct list_head јазол;
};
struct fpga_afu_dma_region {
u64 user_addr;
должина u64;
u64 iova;
struct страница **страници;
struct rb_node јазол;
bool in_use;
};
структура fpga_afu {
u64 region_cur_offset;
int број_региони;
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()
    • Зачувајте struct feature_ops во feature_platform_data.features за секоја населена карактеристика.
    • Повикајте ја тест функцијата, доколку ја има, од структурата.
    • Повикајте ја функцијата init од структурата.
  • afu_probe() fpga_register_dev_ops()
    • Создадете го јазолот на уредот со знаци Port, регистрирајќи структура file_операции.

FME IOCTLs
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(структура fpga_fme_port_release)
__u32 знамиња; // во: мора да биде 0
__u32 port_id; // во: ID на порта (од 0) за ослободување.
};

FPGA_FME_PORT_ASSIGN-arg е покажувач на:

struct fpga_fme_port_assign {
__u32 argsz; // во: sizeof(структура fpga_fme_port_assign)
__u32 знамиња; // во: мора да биде 0
__u32 port_id; // во: ID на порта (од 0) за доделување. (мора да било
претходно објавено од FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR-arg е покажувач на:

struct fpga_fme_port_pr {
__u32 argsz; // во: sizeof(структура fpga_fme_port_pr)
__u32 знамиња; // во: мора да биде 0
__u32 port_id; // во: ID на порта (од 0)
__u32 бафер_големина; // во: големина на битстрим бафер во бајти. Мора да биде 4-бајти
подредени.
__u64 тампон_адреса; // во: процесна адреса на баферот на битстрим
__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 argsz; // во: sizeof(struct fpga_port_info)
__u32 знамиња; // надвор: враќа 0
__u32 број_региони; // надвор: број на MMIO региони, 2 (1 за AFU и 1 за
STP)
__u32 num_umsgs; // надвор: број на UMsg поддржани од хардверот
};

FPGA_PORT_GET_REGION_INFO-arg е покажувач на:

struct fpga_port_region_info {
__u32 argsz; // во: sizeof(структура fpga_port_region_info)
__u32 знамиња; // надвор: (бит-маска) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 индекс; // во: FPGA_PORT_INDEX_UAFU или FPGA_PORT_INDEX_STP
__u32 баласт; // во: мора да биде 0
__u64 големина; // надвор: големина на MMIO регионот во бајти
__u64 офсет; // надвор: поместување на регионот MMIO од почетокот на уредот fd
};

FPGA_PORT_DMA_MAP-arg е покажувач на:
struct fpga_port_dma_map {
__u32 argsz; // во: sizeof(структура fpga_port_dma_map)
__u32 знамиња; // во: мора да биде 0 __u64 user_addr; // во: процес виртуелен
адреса. Мора да биде усогласена со страницата.
__u64 должина; // во: должина на пресликување во бајти. Мора да биде множител на страницата
големина.
__u64 iova; // надвор: IO виртуелна адреса };

FPGA_PORT_DMA_UNMAP-arg е покажувач на:
struct fpga_port_dma_unmap {
__u32 argsz; // во: sizeof(структура fpga_port_dma_unmap)
__u32 знамиња; // во: мора да биде 0
__u64 iova; // во: IO виртуелна адреса вратена од претходна
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET-arg мора да биде NULL.
  • FPGA_PORT_UMSG_ENABLE-arg мора да биде NULL.
  • FPGA_PORT_UMSG_DISABLE - args мора да биде NULL.

FPGA_PORT_UMSG_SET_MODE-arg е покажувач на:

struct fpga_port_umsg_cfg {
__u32 argsz; // во: sizeof(структура 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(структура fpga_port_umsg_base_addr)
    • знамиња u32; // во: мора да биде 0
    • u64 iova; // во: IO виртуелна адреса од FPGA_PORT_DMA_MAP. };

Забелешка:

  • За да ги избришете грешките на пристаништето, треба да ја напишете точната битмаска на тековните грешки, на пр.ample, cat грешки > јасно
  • UMsg е поддржан само преку Acceleration Stack за Intel Xeon процесор со интегрирана FPGA.

sysfs Files

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

sysfs file mmio поле тип пристап
ports_num fme_header.capability.num_ports децимален инт Само за читање
кеш_големина fme_header.capability.cache_size децимален инт Само за читање
верзија fme_header.capability.fabric_verid децимален инт Само за читање
socket_id fme_header.capability.socket_id децимален инт Само за читање
bitstream_id fme_header.bitstream_id хексадецимален uint64_t Само за читање
битстрим_метаподатоци fme_header.bitstream_md хексадецимален uint64_t Само за читање

FME Термички менаџмент sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio поле тип пристап
праг1 термички.праг.tmp_thshold1 децимален инт Корисник: Root само за читање: Читање-пишување
праг2 термички.праг.tmp_thshold2 децимален инт Корисник: Root само за читање: Читање-пишување
праг_патување термички.праг.therm_trip_thshold децимален инт Само за читање
праг1_достигнат термички.праг.thshold1_status децимален инт Само за читање
праг2_достигнат термички.праг.thshold2_status децимален инт Само за читање
праг1_политика термички. праг.thshold_policy децимален инт Корисник: Root само за читање: Читање-пишување
температура термички.rdsensor_fm1.fpga_temp децимален инт Само за читање

FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio поле тип пристап
консумираат моќ.статус.pwr_consumed хексадецимален uint64_t Само за читање
праг1 моќ.праг.праг1 хексадецимален uint64_t Корисник: Root само за читање: Читање-пишување
праг2 моќ.праг.праг2 хексадецимален uint64_t Корисник: Root само за читање: Читање-пишување
threshold1_status моќ.праг.праг1_статус децимален непотпишан Само за читање
threshold2_status моќ.праг.праг2_статус децимален непотпишан Само за читање
rtl power.status.fpga_latency_report децимален непотпишан Само за читање

FME Глобална грешка sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio поле тип пристап
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/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 грешки > јасно.

FME делумна реконфигурација sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio поле тип пристап
интерфејс_ид 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/ (Не важи за стек за забрзување за процесорот Intel Xeon со FPGA)

sysfs file mmio поле тип пристап
замрзнување gperf.ch_ctl.freeze децимален инт Читај пишувај
читај_погоди gperf.CACHE_RD_HIT хексадецимален uint64_t Само за читање
read_miss 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 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/ (Не важи за стек за забрзување за процесорот Intel Xeon со FPGA)

sysfs file mmio поле тип пристап
замрзнување gperf.vtd_ctl.freeze децимален инт Корисник: Root само за читање: Читање-пишување

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Не важи за стек за забрзување за процесорот Intel Xeon со 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.(овозможено) децимален инт Корисник: Root само за читање: Читање-пишување
замрзнување gperf.fab_ctl.freeze децимален инт Корисник: 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 децимален инт Само за читање
ltr port_header.control.latency_tolerance децимален инт Само за читање

Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio поле тип пристап
afu_id afu_header.водич хексадецимален 16-бајт Само за читање

Грешка во пристаништето sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio поле тип пристап
грешки грешка.порта_грешка хексадецимален uint64_t Само за читање
прва_грешка грешка.port_first_error хексадецимален uint64_t Само за читање
first_malformed_req ужас.malreq хексадецимален 16-бајт Само за читање
јасно грешка. (сите грешки) разни uint64_t Само за пишување

Забелешка:
За да ги избришете грешките на Порт, мора да ја напишете точната битмаска на тековните грешки, на прample cat грешки > јасно.

Историја на ревизии

Верзија на документ Промени
2017.10.02 Почетно објавување.

Водич за архитектура на драјвери за уред OPAE Intel FPGA Linux

Документи / ресурси

Архитектура на двигател на уреди на интел OPAE FPGA Linux [pdf] Упатство за корисникот
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Референци

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

Вашата адреса за е-пошта нема да биде објавена. Задолжителните полиња се означени *