logo intel

architektúra ovládačov zariadení intel OPAE FPGA Linux

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

Architektúra ovládačov zariadení Intel FPGA OPAE

Ovládač OPAE Intel FPGA poskytuje rozhrania pre aplikácie v používateľskom priestore na konfiguráciu, enumeráciu, otváranie a prístup k urýchľovačom FPGA na platformách vybavených riešeniami Intel FPGA a umožňuje funkcie správy na úrovni systému, ako je rekonfigurácia FPGA, správa napájania a virtualizácia.

Hardvérová architektúra

Z pohľadu OS view, hardvér FPGA sa javí ako bežné PCIe zariadenie. Pamäť FPGA zariadenia je organizovaná pomocou vopred definovanej dátovej štruktúry (Device Feature List). Funkcie podporované zariadením FPGA sú vystavené prostredníctvom týchto dátových štruktúr, ako je znázornené nižšie na nasledujúcom obrázku:

Zariadenie FPGA PCIe

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

Ovládač podporuje PCIe SR-IOV na vytváranie virtuálnych funkcií (VF), ktoré možno použiť na priradenie jednotlivých akcelerátorov k virtuálnym počítačom.

Intel Corporation. Všetky práva vyhradené. Intel, logo Intel a ďalšie značky Intel sú ochranné známky spoločnosti Intel Corporation alebo jej dcérskych spoločností. Spoločnosť Intel zaručuje výkon svojich FPGA a polovodičových produktov podľa aktuálnych špecifikácií v súlade so štandardnou zárukou spoločnosti Intel, ale vyhradzuje si právo kedykoľvek bez upozornenia zmeniť akékoľvek produkty a služby. Spoločnosť Intel nepreberá žiadnu zodpovednosť ani zodpovednosť vyplývajúcu z aplikácie alebo používania akýchkoľvek informácií, produktov alebo služieb opísaných v tomto dokumente, pokiaľ to nie je výslovne písomne ​​dohodnuté spoločnosťou Intel. Zákazníkom spoločnosti Intel sa odporúča získať najnovšiu verziu špecifikácií zariadenia skôr, ako sa budú spoliehať na akékoľvek zverejnené informácie a pred zadaním objednávky produktov alebo služieb.

Iné názvy a značky môžu byť majetkom iných.

Virtualizované FPGA PCIe zariadenie

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

FPGA Management Engine (FME)
FPGA Management Engine vykonáva správu napájania a teploty, hlásenie chýb, rekonfiguráciu, hlásenie výkonu a ďalšie funkcie infraštruktúry. Každé FPGA má jeden FME, ku ktorému sa vždy pristupuje cez fyzikálnu funkciu (PF). Aplikácie v užívateľskom priestore môžu získať výhradný prístup k FME pomocou open() a uvoľniť ho pomocou close() ako privilegovaný používateľ (root).

Port
Port predstavuje rozhranie medzi statickou štruktúrou FPGA („FPGA Interface Manager (FIM)“) a čiastočne rekonfigurovateľnou oblasťou obsahujúcou funkciu akcelerátora (AF). Port riadi komunikáciu zo softvéru na akcelerátor a odhaľuje funkcie, ako je reset a ladenie. Zariadenie PCIe môže mať niekoľko portov a každý port môže byť vystavený prostredníctvom VF jeho priradením pomocou ioctl FPGA_FME_PORT_ASSIGN na zariadení FME.

Jednotka funkcie akcelerátora (AF).

  • Jednotka funkcie akcelerátora (AF) je pripojená k portu a odhaľuje oblasť 256 kB MMIO, ktorú možno použiť pre riadiace registre špecifické pre akcelerátor.
  • Aplikácie v užívateľskom priestore môžu získať výhradný prístup k AFU pripojenému k portu pomocou open() na zariadení Port a uvoľniť ho pomocou close().
  • Aplikácie v užívateľskom priestore môžu tiež MMIO regióny s akcelerátorom mmap().

Čiastočná rekonfigurácia
Ako je uvedené vyššie, urýchľovače možno prekonfigurovať čiastočnou rekonfiguráciou funkcie akcelerátora (AF) file. Funkcia akcelerátora (AF) musí byť vygenerovaná pre presnú FIM a cieľovú statickú oblasť (Port) FPGA; inak operácia rekonfigurácie zlyhá a môže spôsobiť nestabilitu systému. Túto kompatibilitu je možné skontrolovať porovnaním ID rozhrania zaznamenaného v hlavičke AF s ID rozhrania, ktoré zverejnil FME prostredníctvom sysfs. Túto kontrolu zvyčajne vykonáva užívateľský priestor pred volaním rekonfigurácie IOCTL.

Poznámka:
V súčasnosti musí byť každý softvérový program, ktorý pristupuje k FPGA, vrátane tých, ktoré bežia na virtualizovanom hostiteľovi, pred pokusom o čiastočnú rekonfiguráciu zatvorený. Kroky by boli:

  1. Vyložte vodiča z hosťa
  2. Odpojte VF od hosťa
  3. Zakázať SR-IOV
  4. Vykonajte čiastočnú rekonfiguráciu
  5. Povoliť SR-IOV
  6. Pripojte VF k hosťovi
  7. Naložte ovládač do hosťa

Virtualizácia FPGA
Ak chcete povoliť prístup k akcelerátoru z aplikácií spustených vo VM, príslušný port AFU musí byť priradený k VF pomocou nasledujúcich krokov:

  1. PF štandardne vlastní všetky porty AFU. Akýkoľvek port, ktorý je potrebné znova priradiť k VF, musí byť najprv uvoľnený z PF cez ioctl FPGA_FME_PORT_RELEASE na zariadení FME.
  2. Po uvoľnení N portov z PF je možné použiť príkaz uvedený nižšie na aktiváciu SRIOV a VF. Každý VF vlastní iba jeden port s AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Prejdite cez VF do VM.
  4. AFU pod VF je prístupné z aplikácií vo VM (pomocou rovnakého ovládača vo VF).

Poznámka:
FME nie je možné priradiť k VF, preto sú PR a ďalšie riadiace funkcie dostupné len cez PF.

Organizácia vodičov

Ovládač zariadenia modulu PCIe

Organizácia vodičov

intel-OPAE-FPGA-Linux-Device-Driver-Architecture-Architecture-obr- (3)

Zariadenia FPGA sa javia ako bežné zariadenia PCIe; teda ovládač zariadenia FPGA PCIe (intel-FPGA-PCI.ko) sa vždy načíta ako prvý, keď sa zistí FPGA PCIe PF alebo VF. Tento ovládač zohráva v architektúre ovládača úlohu infraštruktúry. to:

  • Vytvorí kontajnerové zariadenie FPGA ako nadradeného zariadenia s funkciami.
  • Prechádza zoznamom funkcií zariadenia, ktorý je implementovaný v pamäti BAR zariadenia PCIe, aby objavil funkčné zariadenia a ich podfunkcie a vytvoril pre ne platformové zariadenia pod kontajnerovým zariadením.
  • Podporuje SR-IOV.
  • Predstavuje infraštruktúru funkčných zariadení, ktorá abstrahuje operácie pre čiastkové funkcie a sprístupňuje bežné funkcie ovládačom zariadení.

Funkcie ovládača zariadenia modulu PCIe

  • Obsahuje zisťovanie PCIe, enumeráciu zariadení a zisťovanie funkcií.
  • Vytvára adresáre sysfs pre nadradené zariadenie, FPGA Management Engine (FME) a ​​Port.
  • Vytvorí inštancie ovládačov platformy, čo spôsobí, že jadro Linuxu načíta príslušné ovládače modulov platformy.

Ovládač zariadenia FME Platform Module

  • Správa napájania a tepla, hlásenie chýb, hlásenie výkonu a ďalšie funkcie infraštruktúry. K týmto funkciám môžete pristupovať cez rozhrania sysfs vystavené ovládačom FME.
  • Čiastočná rekonfigurácia. Ovládač FME zaregistruje manažéra FPGA počas inicializácie podfunkcie PR; akonáhle od vás dostane FPGA_FME_PORT_PR ioctl, vyvolá funkciu spoločného rozhrania z FPGA Managera na dokončenie čiastočnej rekonfigurácie bitového toku na daný port.
  • Správa portov pre virtualizáciu. Ovládač FME zavádza dva ioctly, FPGA_FME_PORT_RELEASE, ktoré uvoľňujú daný port z PF; a FPGA_FME_PORT_ASSIGN, ktorý priradí port späť k PF. Po uvoľnení portu z PF ho možno priradiť k VF cez rozhrania SR-IOV poskytované ovládačom PCIe. Ďalšie informácie nájdete v časti „Virtualizácia FPGA“.

Funkcie ovládača zariadenia modulu platformy FME

  • Vytvorí uzol znakového zariadenia FME.
  • Vytvorí FME sysfs files a implementuje FME sysfs file prídavné zariadenia.
  • Implementuje podriadiče súkromných funkcií FME.
  • Vedľajšie ovládače súkromných funkcií FME:
    • Hlavička FME
    • Tepelný manažment
    • Správa napájania
    • Globálna chyba
    • Čiastočná rekonfigurácia
    • Globálna výkonnosť

Ovládač zariadenia modulu platformy portu
Podobne ako pri ovládači FME, ovládač portu FPGA (a AFU) (intel-fpga-afu. ko) sa testuje po vytvorení zariadenia platformy Port. Hlavnou funkciou tohto modulu je poskytnúť rozhranie pre aplikácie v užívateľskom priestore na prístup k jednotlivým akcelerátorom, vrátane základného ovládania resetovania na porte, exportu regiónu AFU MMIO, služby mapovania vyrovnávacej pamäte DMA, upozornenia UMsg(1) a funkcií vzdialeného ladenia ( viď vyššie).

UMsg je podporovaný iba cez Acceleration Stack pre procesor Intel Xeon® s integrovaným FPGA.

Funkcie ovládača zariadenia modulu platformy portu

  • Vytvorí uzol zariadenia so znakom portu.
  • Vytvorí Port sysfs files a implementuje Port sysfs file prídavné zariadenia.
  • Implementuje podriadiče súkromnej funkcie Port.
  • Vedľajšie ovládače súkromnej funkcie portu:
    • Hlavička portu
    • AFU
    • Chyba portu
    • UMsg(2)
    • Signal Tap

Aplikácia FPGA Device Enumeration
Táto časť predstavuje spôsob, akým aplikácie vymenúvajú zariadenie FPGA z hierarchie sysfs pod /sys/class/fpga. V exampNižšie sú v hostiteľovi nainštalované dve zariadenia Intel FPGA. Každé zariadenie FPGA má jeden FME a dva porty (AFU). Pre každé FPGA zariadenie sa vytvorí adresár zariadenia pod /sys/class/fpga:

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

Každý uzol má jeden FME a dva porty (AFU) ako detské zariadenia:
/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

Vo všeobecnosti sú rozhrania FME/Port sysfs pomenované takto:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

pričom I postupne očísluje všetky kontajnerové zariadenia, j postupne očísluje FME a k postupne očísluje všetky porty.

Na uzly zariadenia používané pre ioctl() a mmap() je možné odkazovať prostredníctvom:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Enumerácia ovládačov PCIe
Táto časť uvádza koniecview toku kódu pre enumeráciu zariadení vykonanú intel-fpga-pci.ko. Hlavné dátové štruktúry a funkcie sú zvýraznené. Túto časť je najlepšie dodržiavať, keď viewv priloženom zdrojovom kóde (pcie.c).

Enumeračné dátové štruktúry

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statická štruktúra idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *meno;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statická struct class *fpga_class;
statická štruktúra 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,}
};
statická štruktúra 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 device *fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int release_port_num;
struct list_head regióny;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int aktualny_bar;
void __iomem *pfme_hdr;
struct device *parent_dev;
struct platform_device *feature_dev;
};

Enumeračný tok

  • ccidrv_init()
    • Inicializujte fpga_ids pomocou idr_init().
    • Inicializujte fpga_chrdevs[i].devt pomocou alloc_chrdev_region().
    • Inicializujte fpga_class pomocou class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Povoľte zariadenie PCI, požiadajte o prístup k jeho regiónom, nastavte režim PCI master a nakonfigurujte DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Prideľte štruktúru build_feature_devs_info, inicializujte ju.
      .parent_dev je nastavený na nadradený adresár sysfs (intel-fpga-dev.id), ktorý obsahuje adresáre FME a Port sysfs.
  • parse_feature_list()
    • Prejdite si zoznam funkcií zariadenia BAR0 a objavte FME, port a ich súkromné ​​funkcie.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Keď sa stretnete s FME:
  • build_info_create_dev()
    • Prideľte platformové zariadenie pre FME a uložte ho do build_feature_devs_info.feature_dev.
    • feature_dev.id je inicializovaný na výsledok idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent je nastavený na build_feature_devs_info.parent_dev.
    • Prideľte pole zdrojov štruktúr v feature_dev.resource.
  • Prideľte štruktúru feature_platform_data, inicializujte ju a uložte ukazovateľ do feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Inicializujte feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Inicializujte feature_platform_data.features[FME_FEATURE_ID_HEADER], všetko okrem .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Keď narazíte na port:
  • build_info_create_dev()
    • Prideľte platformové zariadenie pre port a uložte ho do build_feature_devs_info.feature_dev.
    • feature_dev.id je inicializovaný na výsledok idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent je nastavený na build_feature_devs_info.parent_dev.
    • Prideľte pole prostriedkov struct v feature_dev.resource.
    • Prideľte štruktúru feature_platform_data, inicializujte ju a uložte ukazovateľ do feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Pridajte struct feature_platform_data.node pre port do zoznamu portov v struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Inicializujte feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Inicializujte feature_platform_data.features[PORT_FEATURE_ID_HEADER], všetko okrem .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Keď sa stretnete s AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicializujte feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Inicializujte feature_platform_data.features[PORT_FEATURE_ID_UAFU], všetko okrem .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Keď sa stretnete so súkromnou funkciou FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicializujte feature_dev.resource[id].
  • feature_platform_data_add()
    • Inicializujte feature_platform_data.features[id], všetko okrem .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Keď sa vyskytne súkromná funkcia portu: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Inicializujte feature_platform_data.features[id], všetko okrem .fops.
  • parse_ports_from_fme()
    • Ak je ovládač načítaný vo fyzickej funkcii (PF), potom:
  • Spustite tok parse_feature_list() na každom porte opísanom v hlavičke FME.
  • Použite BAR uvedený v každej položke Port v hlavičke.

Inicializácia zariadenia platformy FME
Táto časť uvádza koniecview toku kódu pre inicializáciu FME zariadenia vykonanú intel-fpga-fme.ko. Hlavné dátové štruktúry a funkcie sú zvýraznené. Túto časť je najlepšie dodržiavať, keď viewpomocou priloženého zdrojového kódu (fme-main.c).

Štruktúry údajov zariadení platformy FME

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struct feature {
const char *meno;
int zdroj_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
neplatné *súkromné;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*zhoda)(struct platform_device *, void *)); štrukturovať
vlastnosti[0];
};
struct perf_object {
int id;
const struct atribút_group **attr_groups;
struct device *fme_dev;
struct list_head node;
struct list_head deti;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct device *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

Priebeh inicializácie zariadenia platformy FME

Inicializačný tok FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-Architecture-obr- (4)

  • fme_probe() fme_dev_init()
    • Inicializujte štruktúru fpga_fme a uložte ju do poľa feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Uložte struct feature_ops do feature_platform_data.features pre každý vyplnený objekt.
    • Zavolajte testovaciu funkciu, ak existuje, zo štruktúry.
    • Zavolajte funkciu init zo štruktúry.
  • fme_probe() fpga_register_dev_ops()
    • Vytvorte uzol znakového zariadenia FME a zaregistrujte štruktúru file_operácie.

Port Platform Inicializácia zariadenia
Táto časť uvádza koniecview toku kódu pre inicializáciu portového zariadenia vykonanú intel-fpga-afu.ko. Hlavné dátové štruktúry a funkcie sú zvýraznené. Túto časť je najlepšie dodržiavať, keď viewv sprievodnom zdrojovom kóde (afu.c).

Port Platform Device Data Structures

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struct feature {
const char *meno;
int zdroj_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
neplatné *súkromné;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*zhoda)(struct platform_device *, void *));
struct feature features[0];
};
struct fpga_afu_region {
index u32;
vlajky u32;
veľkosť u64;
ofset u64;
u64 fyz.
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
dĺžka u64;
u64 iova;
struct page **pages;
struct rb_node node;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head regióny;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Priebeh inicializácie zariadenia Port Platform

Priebeh inicializácie portuintel-OPAE-FPGA-Linux-Device-Driver-Architecture-Architecture-obr- (5)

  • afu_probe() afu_dev_init()
    • Inicializujte štruktúru fpga_afu a uložte ju do poľa feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Uložte struct feature_ops do feature_platform_data.features pre každý vyplnený objekt.
    • Zavolajte testovaciu funkciu, ak existuje, zo štruktúry.
    • Zavolajte funkciu init zo štruktúry.
  • afu_probe() fpga_register_dev_ops()
    • Vytvorte uzol zariadenia so znakom portu a zaregistrujte štruktúru file_operácie.

FME IOCTL
IOCTL, ktoré sa volajú na open file deskriptor pre /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—vráti aktuálnu verziu ako celé číslo, začínajúce od 0.

FPGA_CHECK_EXTENSION – momentálne nie je podporované.

FPGA_FME_PORT_RELEASE—arg je ukazovateľ na:

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 vlajky; // v: musí byť 0
__u32 port_id; // v: ID portu (od 0) na uvoľnenie.
};

FPGA_FME_PORT_ASSIGN—arg je ukazovateľ na:

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 vlajky; // v: musí byť 0
__u32 port_id; // in: ID portu (od 0) na priradenie. (muselo byť
predtým vydané FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg je ukazovateľ na:

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 vlajky; // v: musí byť 0
__u32 port_id; // v: ID portu (od 0)
__u32 buffer_size; // in: veľkosť vyrovnávacej pamäte bitového toku v bajtoch. Musí mať 4 bajty
zarovnané.
__u64 buffer_address; // in: adresa procesu vyrovnávacej pamäte bitového toku
stav __u64; // out: chybový stav (bitová maska)
};

Port IOCTL
IOCTL, ktoré sa volajú na open file deskriptor pre /dev/intel-fpga-port.k FPGA_GET_API_VERSION – vráti aktuálnu verziu ako celé číslo počnúc od 0. FPGA_CHECK_EXTENSION – momentálne nie je podporované.

FPGA_PORT_GET_INFO—arg je ukazovateľ na:

struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 vlajky; // out: vráti 0
__u32 num_regions; // out: počet oblastí MMIO, 2 (1 pre AFU a 1 pre
STP)
__u32 num_umsgs; // out: počet UMsg podporovaných hardvérom
};

FPGA_PORT_GET_REGION_INFO—arg je ukazovateľ na:

struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 vlajky; // výstup: (bitová maska) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
index __u32; // v: FPGA_PORT_INDEX_UAFU alebo FPGA_PORT_INDEX_STP
__u32 výplň; // v: musí byť 0
veľkosť __u64; // out: veľkosť oblasti MMIO v bajtoch
__u64 offset; // out: offset oblasti MMIO od začiatku zariadenia fd
};

FPGA_PORT_DMA_MAP—arg je ukazovateľ na:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 vlajky; // v: musí byť 0 __u64 user_addr; // v: proces virtuálny
adresu. Musí byť zarovnané na stranu.
__u64 dĺžka; // in: dĺžka mapovania v bajtoch. Musí to byť násobok strany
veľkosť.
__u64 iova; // out: IO virtuálna adresa };

FPGA_PORT_DMA_UNMAP—arg je ukazovateľ na:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 vlajky; // v: musí byť 0
__u64 iova; // in: IO virtuálna adresa vrátená predchádzajúcim
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—argument musí mať hodnotu NULL.
  • FPGA_PORT_UMSG_ENABLE—argument musí mať hodnotu NULL.
  • FPGA_PORT_UMSG_DISABLE—argumenty musia byť NULL.

FPGA_PORT_UMSG_SET_MODE—arg je ukazovateľ na:

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 vlajky; // v: musí byť 0
__u32 hint_bitmap; // v: bitmapa režimu nápovedy UMsg. Označuje, ktoré UMsg sú
povolené.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg musí byť pred vydaním tohto ioctl vypnuté.
  • Pole iova musí byť pre vyrovnávaciu pamäť dostatočne veľkú pre všetky UMsg (num_umsgs * PAGE_SIZE).
    • Vyrovnávacia pamäť je označená ako „používaná“ riadením vyrovnávacej pamäte vodiča.
    • Ak má iova hodnotu NULL, žiadna predchádzajúca oblasť nebude označená ako „používaná“.
  • arg je ukazovateľ na:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • vlajky u32; // v: musí byť 0
    • u64 iova; // in: IO virtuálna adresa z FPGA_PORT_DMA_MAP. };

Poznámka:

  • Ak chcete odstrániť chyby portov, musíte napísať presnú bitovú masku aktuálnych chýb, naprample, mačacie chyby > jasné
  • UMsg je podporovaný iba cez Acceleration Stack pre procesor Intel Xeon s integrovaným FPGA.

sysfs Files

Hlavička FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file pole mmio typu prístup
ports_num fme_header.capability.num_ports desatinná int Iba na čítanie
cache_size fme_header.capability.cache_size desatinná int Iba na čítanie
verzia fme_header.capability.fabric_verid desatinná int Iba na čítanie
socket_id fme_header.capability.socket_id desatinná int Iba na čítanie
bitstream_id fme_header.bitstream_id hex uint64_t Iba na čítanie
bitstream_metadata fme_header.bitstream_md hex uint64_t Iba na čítanie

FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file pole mmio typu prístup
prah 1 tepelný.prah.tmp_thshold1 desatinná int Používateľ: Iba na čítanie Koreň: Čítanie a zápis
prah 2 tepelný.prah.tmp_thshold2 desatinná int Používateľ: Iba na čítanie Koreň: Čítanie a zápis
prahová_cesta termálny.threshold.therm_trip_thshold desatinná int Iba na čítanie
prah 1_dosiahnutý tepelný.prah.thshold1_status desatinná int Iba na čítanie
prah 2_dosiahnutý tepelný.prah.thshold2_status desatinná int Iba na čítanie
prahová hodnota1_policy tepelný. prah.zásada_thshold_policy desatinná int Používateľ: Iba na čítanie Koreň: Čítanie a zápis
teplota teplotný.rdsensor_fm1.fpga_temp desatinná int Iba na čítanie

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

sysfs file pole mmio typu prístup
spotrebované power.status.pwr_consumed hex uint64_t Iba na čítanie
prah 1 výkon.prah.prah1 hex uint64_t Používateľ: Iba na čítanie Koreň: Čítanie a zápis
prah 2 výkon.prah.prah2 hex uint64_t Používateľ: Iba na čítanie Koreň: Čítanie a zápis
prah1_stav power.threshold.threshold1_status desatinná čiarka bez znamienka Iba na čítanie
prah2_stav power.threshold.threshold2_status desatinná čiarka bez znamienka Iba na čítanie
rtl power.status.fpga_latency_report desatinná čiarka bez znamienka Iba na čítanie

Globálna chyba FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file pole mmio typu prístup
pcie0_errors gerror.pcie0_err hex uint64_t Čítaj píš
pcie1_errors gerror.pcie1_err hex uint64_t Čítaj píš
inject_error gerror.ras_error_inj hex uint64_t Čítaj píš

intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/

sysfs file pole mmio typu prístup
chyby gerror.fme_err hex uint64_t Iba na čítanie
first_error gerror.fme_first_err.err_reg_status hex uint64_t Iba na čítanie
next_error gerror.fme_next_err.err_reg_status hex uint64_t Iba na čítanie
jasné Vymaže chyby, first_error, next_error rôzne uint64_t Iba na písanie

Poznámka:
Ak chcete odstrániť chyby FME, musíte napísať presnú bitovú masku aktuálnych chýb, naprample mačacie chyby > jasné.

FME čiastočná rekonfigurácia sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file pole mmio typu prístup
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hexadecimálne 16-bajtové Iba na čítanie

FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file pole mmio typu prístup
hodiny gperf.clk.afu_interf_clock hex uint64_t Iba na čítanie

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Neplatí pre Acceleration Stack pre procesor Intel Xeon s FPGA)

sysfs file pole mmio typu prístup
zmraziť gperf.ch_ctl.freeze desatinná int Čítaj píš
read_hit gperf.CACHE_RD_HIT hex uint64_t Iba na čítanie
read_miss gperf.CACHE_RD_MISS hex uint64_t Iba na čítanie
písať_hit gperf.CACHE_WR_HIT hex uint64_t Iba na čítanie
písať_miss gperf.CACHE_WR_MISS hex uint64_t Iba na čítanie
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Iba na čítanie
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Iba na čítanie
sysfs file pole mmio typu prístup
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Iba na čítanie
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Iba na čítanie
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Iba na čítanie

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Neplatí pre Acceleration Stack pre procesor Intel Xeon s FPGA)

sysfs file pole mmio typu prístup
zmraziť gperf.vtd_ctl.freeze desatinná int Používateľ: Iba na čítanie Koreň: Čítanie a zápis

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Neplatí pre Acceleration Stack pre procesor Intel Xeon s FPGA)

sysfs file pole mmio typu prístup
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Iba na čítanie
zápis_transakcie gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Iba na čítanie
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Iba na čítanie
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Iba na čítanie

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

sysfs file pole mmio typu prístup
povoliť gperf.fab_ctl. (povolené) desatinná int Používateľ: Iba na čítanie Koreň: Čítanie a zápis
zmraziť gperf.fab_ctl.freeze desatinná int Používateľ: Iba na čítanie Koreň: Čítanie a zápis
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Iba na čítanie
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Iba na čítanie
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Iba na čítanie
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Iba na čítanie
upi_read gperf.FAB_UPI_RD hex uint64_t Iba na čítanie
upi_write gperf.FAB_UPI_WR hex uint64_t Iba na čítanie

intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/

sysfs file pole mmio typu prístup
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Iba na čítanie
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Iba na čítanie
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Iba na čítanie
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Iba na čítanie
upi_read gperf.FAB_UPI_RD hex uint64_t Iba na čítanie
upi_write gperf.FAB_UPI_WR hex uint64_t Iba na čítanie

Hlavička portu sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file pole mmio typu prístup
id port_header.capability.port_number desatinná int Iba na čítanie
ltr port_header.control.latency_tolerance desatinná int Iba na čítanie

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

sysfs file pole mmio typu prístup
afu_id afu_header.guid hexadecimálne 16-bajtové Iba na čítanie

Chyba portu sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file pole mmio typu prístup
chyby chyba.port_chyba hex uint64_t Iba na čítanie
first_error peror.port_first_error hex uint64_t Iba na čítanie
first_malformed_req chyba.malreq hexadecimálne 16-bajtové Iba na čítanie
jasné chyba. (všetky chyby) rôzne uint64_t Iba na písanie

Poznámka:
Ak chcete odstrániť chyby portu, musíte napísať presnú bitovú masku aktuálnych chýb, naprample mačacie chyby > jasné.

História revízií

Verzia dokumentu Zmeny
2017.10.02 Počiatočné vydanie.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Dokumenty / zdroje

architektúra ovládačov zariadení intel OPAE FPGA Linux [pdf] Používateľská príručka
OPAE FPGA Linuxová architektúra ovládačov zariadení, OPAE FPGA, Linuxová architektúra ovládačov zariadení, architektúra ovládačov, architektúra

Referencie

Zanechajte komentár

Vaša emailová adresa nebude zverejnená. Povinné polia sú označené *