intel-logo

Intel OPAE FPGA Linux Device Driver Arhitektura

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

OPAE Intel FPGA Linux arhitektura upravljačkog programa

OPAE Intel FPGA drajver pruža interfejse za aplikacije u korisničkom prostoru za konfigurisanje, nabrajanje, otvaranje i pristup FPGA akceleratorima na platformama opremljenim Intel FPGA rešenjima i omogućava funkcije upravljanja na nivou sistema kao što su FPGA rekonfiguracija, upravljanje napajanjem i virtuelizacija.

Arhitektura hardvera

Sa stanovišta OS-a viewFPGA hardver se pojavljuje kao običan PCIe uređaj. Memorija FPGA uređaja je organizirana korištenjem unaprijed definirane strukture podataka (Lista karakteristika uređaja). Funkcije koje podržava FPGA uređaj izložene su kroz ove strukture podataka, kao što je ilustrovano u nastavku na sljedećoj slici:

FPGA PCIe uređaj

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

Drajver podržava PCIe SR-IOV za kreiranje virtuelnih funkcija (VF) koje se mogu koristiti za dodeljivanje pojedinačnih akceleratora virtuelnim mašinama.

Intel Corporation. Sva prava zadržana. Intel, Intel logo i druge Intel oznake su zaštitni znaci Intel Corporation ili njenih podružnica. Intel garantuje performanse svojih FPGA i poluprovodničkih proizvoda u skladu sa trenutnim specifikacijama u skladu sa Intelovom standardnom garancijom, ali zadržava pravo da izvrši izmene bilo kojeg proizvoda i usluge u bilo koje vreme bez prethodne najave. Intel ne preuzima nikakvu odgovornost ili odgovornost koja proizilazi iz primene ili korišćenja bilo koje informacije, proizvoda ili usluge opisane ovde, osim ako je Intel izričito pristao u pisanoj formi. Intelovim kupcima se savjetuje da nabave najnoviju verziju specifikacija uređaja prije nego što se oslone na bilo koju objavljenu informaciju i prije naručivanja proizvoda ili usluga.

Druga imena i robne marke mogu se smatrati vlasništvom drugih.

Virtuelizirani FPGA PCIe uređaj

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

FPGA Management Engine (FME)
FPGA Management Engine obavlja upravljanje napajanjem i toplinom, izvještavanje o greškama, rekonfiguraciju, izvještavanje o performansama i druge infrastrukturne funkcije. Svaki FPGA ima jedan FME, kojem se uvijek pristupa putem fizičke funkcije (PF). Aplikacije u korisničkom prostoru mogu steći ekskluzivni pristup FME koristeći open() i osloboditi ga korištenjem close() kao privilegirani korisnik (root).

Luka
Port predstavlja interfejs između statičke FPGA strukture (“FPGA Interface Manager (FIM)”) i delimično rekonfigurabilnog regiona koji sadrži funkciju akceleratora (AF). Port kontroliše komunikaciju od softvera do akceleratora i izlaže funkcije kao što su resetovanje i otklanjanje grešaka. PCIe uređaj može imati nekoliko Portova, a svaki Port može biti izložen kroz VF dodjeljujući ga korištenjem FPGA_FME_PORT_ASSIGN ioctl na FME uređaju.

Jedinica funkcije akceleratora (AF).

  • Jedinica akceleratorske funkcije (AF) je spojena na port i izlaže 256K MMIO regiju koja će se koristiti za kontrolne registre specifične za akcelerator.
  • Aplikacije u korisničkom prostoru mogu steći ekskluzivni pristup AFU spojenom na Port korištenjem open() na Port uređaju i osloboditi ga korištenjem close().
  • Aplikacije u korisničkom prostoru također mogu mmap() akcelerator MMIO regiona.

Djelomična rekonfiguracija
Kao što je gore spomenuto, akceleratori se mogu rekonfigurirati kroz djelomičnu rekonfiguraciju funkcije akceleratora (AF) file. Funkcija akceleratora (AF) mora biti generisana za tačan FIM i ciljani statički region (Port) FPGA; u suprotnom, operacija rekonfiguracije neće uspjeti i može uzrokovati nestabilnost sistema. Ova kompatibilnost se može provjeriti upoređivanjem ID-a interfejsa navedenog u AF zaglavlju sa ID-om interfejsa koji je izložio FME preko sysfs-a. Ovu provjeru obično obavlja korisnički prostor prije pozivanja IOCTL-a za rekonfiguraciju.

Napomena:
Trenutno, svaki softverski program koji pristupa FPGA, uključujući i one koji rade u virtueliziranom hostu, mora biti zatvoren prije pokušaja djelomične rekonfiguracije. Koraci bi bili:

  1. Iskrcaj vozača iz gosta
  2. Isključite VF od gosta
  3. Onemogućite SR-IOV
  4. Izvršite djelomičnu rekonfiguraciju
  5. Omogućite SR-IOV
  6. Priključite VF na gosta
  7. Učitajte vozača u gosta

FPGA virtuelizacija
Da biste omogućili pristup akceleratoru iz aplikacija koje se pokreću u VM-u, odgovarajući AFU port mora biti dodijeljen VF-u koristeći sljedeće korake:

  1. PF po defaultu posjeduje sve AFU portove. Svaki port koji treba ponovo dodijeliti VF-u mora se prvo osloboditi od PF-a kroz FPGA_FME_PORT_RELEASE ioctl na FME uređaju.
  2. Kada se N portova oslobodi od PF-a, naredba u nastavku se može koristiti za omogućavanje SRIOV i VF-ova. Svaki VF posjeduje samo jedan port sa AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Prođite kroz VF do VM.
  4. AFU pod VF je dostupan iz aplikacija u VM (koristeći isti drajver unutar VF).

Napomena:
FME se ne može dodijeliti VF-u, tako da su PR i druge funkcije upravljanja dostupne samo preko PF-a.

Organizacija vozača

Upravljački program PCIe modula

Organizacija vozača

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

FPGA uređaji se pojavljuju kao obični PCIe uređaji; stoga, drajver FPGA PCIe uređaja (intel-FPGA-PCI.ko) se uvijek učitava prvi kada se detektuje FPGA PCIe PF ili VF. Ovaj drajver igra infrastrukturnu ulogu u arhitekturi drajvera. To:

  • Kreira FPGA kontejnerski uređaj kao roditelj funkcija uređaja.
  • Prolazi kroz listu funkcija uređaja, koja je implementirana u memoriju PCIe uređaja BAR, kako bi otkrila uređaje sa karakteristikama i njihove pod-funkcije i kreirala platformske uređaje za njih ispod uređaja kontejnera.
  • Podržava SR-IOV.
  • Uvodi infrastrukturu uređaja sa značajkama, koja apstrahuje operacije za pod-funkcije i izlaže uobičajene funkcije upravljačkim programima uređaja.

Funkcije upravljačkog programa PCIe modula

  • Sadrži PCIe otkrivanje, nabrajanje uređaja i otkrivanje funkcija.
  • Kreira sysfs direktorije za roditeljski uređaj, FPGA Management Engine (FME) i Port.
  • Kreira instance drajvera platforme, uzrokujući da Linux kernel učitava odgovarajuće drajvere modula platforme.

Upravljački program modula FME platforme

  • Upravljanje napajanjem i toplinom, izvještavanje o greškama, izvještavanje o performansama i druge infrastrukturne funkcije. Ovim funkcijama možete pristupiti preko sysfs interfejsa koje je izložio FME drajver.
  • Djelomična rekonfiguracija. FME drajver registruje FPGA Manager tokom inicijalizacije PR pod-funkcije; kada od vas primi FPGA_FME_PORT_PR ioctl, on poziva funkciju zajedničkog interfejsa od FPGA Manager-a da završi delimičnu rekonfiguraciju toka bitova na dati Port.
  • Upravljanje portovima za virtuelizaciju. FME drajver uvodi dva ioctl-a, FPGA_FME_PORT_RELEASE, koji oslobađaju dati Port iz PF-a; i FPGA_FME_PORT_ASSIGN, koji dodeljuje port nazad na PF. Kada se port oslobodi od PF-a, može se dodijeliti VF-u preko SR-IOV sučelja koje pruža PCIe drajver. Za više informacija pogledajte “FPGA virtuelizacija”.

Funkcije upravljačkog programa modula FME platforme

  • Kreira čvor uređaja FME karaktera.
  • Kreira FME sysfs files i implementira FME sysfs file pristupnici.
  • Implementira FME privatne pod-drivere.
  • FME privatni pod-drajveri:
    • FME Header
    • Thermal Management
    • Upravljanje napajanjem
    • Global Error
    • Djelomična rekonfiguracija
    • Global Performance

Upravljački program modula port platforme
Slično FME drajveru, drajver FPGA porta (i AFU) (intel-fpga-afu. ko) se ispituje nakon kreiranja uređaja Port platforme. Glavna funkcija ovog modula je da obezbijedi interfejs aplikacijama u korisničkom prostoru za pristup pojedinačnim akceleratorima, uključujući osnovnu kontrolu resetovanja na portu, izvoz AFU MMIO regiona, uslugu mapiranja DMA bafera, obaveštenje UMsg(1) i funkcije udaljenog otklanjanja grešaka ( vidi gore).

UMsg je podržan samo kroz Acceleration Stack za Intel Xeon® procesor sa integrisanim FPGA.

Funkcije upravljačkog programa modula platforme porta

  • Kreira čvor uređaja karaktera Port.
  • Kreira port sysfs files i implementira port sysfs file pristupnici.
  • Implementira pod-drivere funkcije Port private.
  • Pod-drajveri za privatne funkcije porta:
    • Port Header
    • AFU
    • Port Error
    • UMsg(2)
    • Signal Tap

Aplikacija FPGA Device Enumeration
Ovaj odjeljak uvodi kako aplikacije nabrajaju FPGA uređaj iz sysfs hijerarhije pod /sys/class/fpga. U exampu nastavku, dva Intel FPGA uređaja su instalirana u hostu. Svaki FPGA uređaj ima jedan FME i dva porta (AFU). Za svaki FPGA uređaj kreira se direktorij uređaja pod /sys/class/fpga:

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

Svaki čvor ima jedan FME i dva porta (AFU) kao podređeni uređaj:
/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

Općenito, FME/Port sysfs interfejsi se nazivaju kako slijedi:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

sa I uzastopnim numerisanjem svih kontejnerskih uređaja, j uzastopnim numerisanjem FME-ova i k uzastopnim numerisanjem svih portova.

Čvorovi uređaja koji se koriste za ioctl() i mmap() mogu se referencirati putem:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Numeracija PCIe drajvera
Ovaj odjeljak daje overview toka koda za nabrajanje uređaja koje izvodi intel-fpga-pci.ko. Naglašene su glavne strukture podataka i funkcije. Ovaj odjeljak je najbolje slijediti kada viewkorištenje pratećeg izvornog koda (pcie.c).

Strukture podataka nabrajanja

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statička struktura idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *name;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statička struktura klase *fpga_class;
static struct 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,}
};
static struct 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 uređaj *fme_dev;
struct mutex zaključavanje;
struct list_head port_dev_list;
int release_port_num;
struct list_head regiona;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
struct uređaj *parent_dev;
struct platform_device *feature_dev;
};

Tok nabrajanja

  • ccidrv_init()
    • Inicijalizirajte fpga_ids koristeći idr_init().
    • Inicijalizirajte fpga_chrdevs[i].devt koristeći alloc_chrdev_region().
    • Inicijalizirajte fpga_class koristeći class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Omogućite PCI uređaj, zatražite pristup njegovim regijama, postavite PCI master mod i konfigurirajte DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Dodijelite strukturu build_feature_devs_info, inicijalizirajte je.
      .parent_dev je postavljen na nadređeni sysfs direktorij (intel-fpga-dev.id) koji sadrži direktorije FME i Port sysfs.
  • parse_feature_list()
    • Prošetajte BAR0 Listom funkcija uređaja da otkrijete FME, Port i njihove privatne karakteristike.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Kada se naiđe na FME:
  • build_info_create_dev()
    • Dodijelite uređaj platforme za FME, pohranjujući u build_feature_devs_info.feature_dev.
    • feature_dev.id je inicijaliziran na rezultat idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent je postavljen na build_feature_devs_info.parent_dev.
    • Dodijelite niz strukturnih resursa u feature_dev.resource.
  • Dodijelite strukturu feature_platform_data, inicijalizirajte je i pohranite pokazivač u feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Inicijalizirajte feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Inicijalizirajte feature_platform_data.features[FME_FEATURE_ID_HEADER], sve osim .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Kada se naiđe na port:
  • build_info_create_dev()
    • Dodijelite uređaj platforme za Port, pohranjujući u build_feature_devs_info.feature_dev.
    • feature_dev.id je inicijaliziran na rezultat idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent je postavljen na build_feature_devs_info.parent_dev.
    • Dodijelite niz struct resursa u feature_dev.resource.
    • Dodijelite strukturu feature_platform_data, inicijalizirajte je i pohranite pokazivač u feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Dodajte strukturu feature_platform_data.node za Port na listu Portova u struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Inicijalizirajte feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Inicijalizirajte feature_platform_data.features[PORT_FEATURE_ID_HEADER], sve osim .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Kada se naiđe na AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicijalizirajte feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Inicijalizirajte feature_platform_data.features[PORT_FEATURE_ID_UAFU], sve osim .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Kada se naiđe na privatnu funkciju FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicijalizirajte feature_dev.resource[id].
  • feature_platform_data_add()
    • Inicijalizirajte feature_platform_data.features[id], sve osim .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Kada se naiđe na privatnu funkciju Porta: * create_feature_instance() build_info_add_sub_feature() * Inicijaliziraj feature_dev.resource[id]. * feature_platform_data_add() Inicijaliziranje feature_platform_data.features[id], sve osim .fops.
  • parse_ports_from_fme()
    • Ako je upravljački program učitan na Physical Function (PF), tada:
  • Pokrenite tok parse_feature_list() na svakom portu opisanom u FME zaglavlju.
  • Koristite BAR spomenut u svakom unosu porta u zaglavlju.

Inicijalizacija uređaja FME platforme
Ovaj odjeljak daje overview toka koda za inicijalizaciju FME uređaja koju izvodi intel-fpga-fme.ko. Glavne strukture podataka i funkcije su istaknute. Ovaj odjeljak je najbolje slijediti kada viewkorištenje pratećeg izvornog koda (fme-main.c).

Strukture podataka uređaja FME platforme

struct feature_ops {
int (*init)(struct platform_device *pdev, struct karakteristika *feature);
int (*uinit)(struct platform_device *pdev, struct karakteristika *feature);
long (*ioctl)(struct platform_device *pdev, struct karakteristika *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct karakteristika *feature);
};
struct feature {
const char *name;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head čvor;
struct mutex zaključavanje;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
void *privatno;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*podudaranje)(struct platform_device *, void *)); struct
karakteristike[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struct uređaj *fme_dev;
struct list_head čvor;
struct list_head djeca;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct uređaj *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

Tok inicijalizacije uređaja FME platforme

FME inicijalizacijski tokintel-OPAE-FPGA-Linux-Driver-Device-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Inicijalizirajte strukturu fpga_fme i pohranite je u polje feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Sačuvajte strukturu feature_ops u feature_platform_data.features za svaku popunjenu funkciju.
    • Pozovite testnu funkciju, ako postoji, iz strukture.
    • Pozovite init funkciju iz strukture.
  • fme_probe() fpga_register_dev_ops()
    • Kreirajte čvor uređaja FME karaktera, registrirajući strukturu file_operacije.

Inicijalizacija uređaja platforme porta
Ovaj odjeljak daje overview toka koda za inicijalizaciju uređaja porta koju izvodi intel-fpga-afu.ko. Naglašene su glavne strukture podataka i funkcije. Ovaj odjeljak je najbolje slijediti kada viewkorištenje pratećeg izvornog koda (afu.c).

Strukture podataka uređaja platforme porta

struct feature_ops {
int (*init)(struct platform_device *pdev, struct karakteristika *feature);
int (*uinit)(struct platform_device *pdev, struct karakteristika *feature);
long (*ioctl)(struct platform_device *pdev, struct karakteristika *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct karakteristika *feature);
};
struct feature {
const char *name;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head čvor;
struct mutex zaključavanje;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
void *privatno;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*podudaranje)(struct platform_device *, void *));
karakteristike karakteristike strukture[0];
};
struct fpga_afu_region {
u32 indeks;
u32 zastave;
veličina u64;
u64 offset;
u64 phys;
struct list_head čvor;
};
struct fpga_afu_dma_region {
u64 user_addr;
dužina u64;
u64 iova;
struct stranica **stranice;
struct rb_node čvor;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head regiona;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Tok inicijalizacije uređaja platforme porta

Tok inicijalizacije portaintel-OPAE-FPGA-Linux-Driver-Device-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Inicijalizirajte strukturu fpga_afu i pohranite je u polje feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Sačuvajte strukturu feature_ops u feature_platform_data.features za svaku popunjenu funkciju.
    • Pozovite testnu funkciju, ako postoji, iz strukture.
    • Pozovite init funkciju iz strukture.
  • afu_probe() fpga_register_dev_ops()
    • Kreirajte čvor uređaja karaktera Port, registrirajući strukturu file_operacije.

FME IOCTL
IOCTL-ovi koji se pozivaju na open file deskriptor za /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—vrati trenutnu verziju kao cijeli broj, počevši od 0.

FPGA_CHECK_EXTENSION—trenutno nije podržano.

FPGA_FME_PORT_RELEASE—arg je pokazivač na:

struct fpga_fme_port_release {
__u32 argsz; // u: sizeof(struct fpga_fme_port_release)
__u32 zastave; // u: mora biti 0
__u32 port_id; // u: ID porta (od 0) za oslobađanje.
};

FPGA_FME_PORT_ASSIGN—arg je pokazivač na:

struct fpga_fme_port_assign {
__u32 argsz; // u: sizeof(struct fpga_fme_port_assign)
__u32 zastave; // u: mora biti 0
__u32 port_id; // u: ID porta (od 0) za dodjelu. (mora biti
prethodno izdao FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg je pokazivač na:

struct fpga_fme_port_pr {
__u32 argsz; // u: sizeof(struct fpga_fme_port_pr)
__u32 zastave; // u: mora biti 0
__u32 port_id; // u: ID porta (od 0)
__u32 buffer_size; // in: veličina bafera bitstreama u bajtovima. Mora biti 4-bajta
poravnati.
__u64 buffer_address; // u: procesna adresa bafera bitstreama
__u64 status; // out: status greške (bitmask)
};

Port IOCTL
IOCTL-ovi koji se pozivaju na open file deskriptor za /dev/intel-fpga-port.k FPGA_GET_API_VERSION—vraća trenutnu verziju kao cijeli broj, počevši od 0. FPGA_CHECK_EXTENSION—trenutno nije podržano.

FPGA_PORT_GET_INFO—arg je pokazivač na:

struct fpga_port_info {
__u32 argsz; // u: sizeof(struct fpga_port_info)
__u32 zastave; // izlaz: vraća 0
__u32 num_regions; // izlaz: broj MMIO regija, 2 (1 za AFU i 1 za
STP)
__u32 num_umsgs; // out: broj UMsg-ova podržanih od strane hardvera
};

FPGA_PORT_GET_REGION_INFO—arg je pokazivač na:

struct fpga_port_region_info {
__u32 argsz; // u: sizeof(struct fpga_port_region_info)
__u32 zastave; // izlaz: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // u: FPGA_PORT_INDEX_UAFU ili FPGA_PORT_INDEX_STP
__u32 padding; // u: mora biti 0
__u64 veličina; // out: veličina MMIO regije u bajtovima
__u64 offset; // izlaz: pomak MMIO regije od početka uređaja fd
};

FPGA_PORT_DMA_MAP—arg je pokazivač na:
struct fpga_port_dma_map {
__u32 argsz; // u: sizeof(struct fpga_port_dma_map)
__u32 zastave; // u: mora biti 0 __u64 user_addr; // u: proces virtualni
adresa. Mora biti poravnat na stranici.
__u64 dužina; // in: dužina mapiranja u bajtovima. Mora biti višestruka stranica
veličina.
__u64 iova; // izlaz: IO virtuelna adresa };

FPGA_PORT_DMA_UNMAP—arg je pokazivač na:
struct fpga_port_dma_unmap {
__u32 argsz; // u: sizeof(struct fpga_port_dma_unmap)
__u32 zastave; // u: mora biti 0
__u64 iova; // u: IO virtuelna adresa vraćena prethodnim
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg mora biti NULL.
  • FPGA_PORT_UMSG_ENABLE—arg mora biti NULL.
  • FPGA_PORT_UMSG_DISABLE—args moraju biti NULL.

FPGA_PORT_UMSG_SET_MODE—arg je pokazivač na:

struct fpga_port_umsg_cfg {
__u32 argsz; // u: sizeof(struct fpga_port_umsg_cfg)
__u32 zastave; // u: mora biti 0
__u32 hint_bitmap; // u: bitmap moda UMsg savjeta. Označava koji su UMsg
omogućeno.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg mora biti onemogućen prije izdavanja ovog ioctl-a.
  • Polje iova mora biti za bafer dovoljno velik za sve UMsg-ove (num_umsgs * PAGE_SIZE).
    • Bafer je označen kao "u upotrebi" od strane upravljačkog upravljanja baferom.
    • Ako je iova NULL, svaka prethodna regija nije označena kao „u upotrebi“.
  • arg je pokazivač na:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // u: sizeof(struct fpga_port_umsg_base_addr)
    • u32 zastave; // u: mora biti 0
    • u64 iova; // u: IO virtuelna adresa iz FPGA_PORT_DMA_MAP. };

Napomena:

  • Da biste obrisali greške porta, morate napisati tačnu bitmasku trenutnih grešaka, nprample, mačke greške > jasno
  • UMsg je podržan samo kroz Acceleration Stack za Intel Xeon procesor sa integrisanim FPGA.

sysfs Files

FME zaglavlje sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file mmio polje tip pristup
ports_num fme_header.capability.num_ports decimalni int Samo za čitanje
cache_size fme_header.capability.cache_size decimalni int Samo za čitanje
verzija fme_header.capability.fabric_verid decimalni int Samo za čitanje
socket_id fme_header.capability.socket_id decimalni int Samo za čitanje
bitstream_id fme_header.bitstream_id hex uint64_t Samo za čitanje
bitstream_metadata fme_header.bitstream_md hex uint64_t Samo za čitanje

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

sysfs file mmio polje tip pristup
prag1 termalni.threshold.tmp_thshold1 decimalni int Korisnik: Samo za čitanje Root: Čitanje-pisanje
prag2 termalni.threshold.tmp_thshold2 decimalni int Korisnik: Samo za čitanje Root: Čitanje-pisanje
threshold_trip termalni.threshold.therm_trip_thshold decimalni int Samo za čitanje
threshold1_reached termalni.threshold.thshold1_status decimalni int Samo za čitanje
threshold2_reached termalni.threshold.thshold2_status decimalni int Samo za čitanje
threshold1_policy termalni. threshold.thshold_policy decimalni int Korisnik: Samo za čitanje Root: Čitanje-pisanje
temperaturu term.rdsensor_fm1.fpga_temp decimalni int Samo za čitanje

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

sysfs file mmio polje tip pristup
konzumira power.status.pwr_consumed hex uint64_t Samo za čitanje
prag1 power.threshold.threshold1 hex uint64_t Korisnik: Samo za čitanje Root: Čitanje-pisanje
prag2 power.threshold.threshold2 hex uint64_t Korisnik: Samo za čitanje Root: Čitanje-pisanje
threshold1_status power.threshold.threshold1_status decimalni bez predznaka Samo za čitanje
threshold2_status power.threshold.threshold2_status decimalni bez predznaka Samo za čitanje
rtl power.status.fpga_latency_report decimalni bez predznaka Samo za čitanje

FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio polje tip pristup
pcie0_errors gerror.pcie0_err hex uint64_t Čitaj-piši
pcie1_errors gerror.pcie1_err hex uint64_t Čitaj-piši
inject_error gerror.ras_error_inj hex uint64_t Čitaj-piši

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

sysfs file mmio polje tip pristup
greške gerror.fme_err hex uint64_t Samo za čitanje
prva_greška gerror.fme_first_err.err_reg_status hex uint64_t Samo za čitanje
next_error gerror.fme_next_err.err_reg_status hex uint64_t Samo za čitanje
jasno Briše greške, first_error, next_error razne uint64_t Samo za pisanje

Napomena:
Da biste obrisali FME greške, morate napisati tačnu bitmasku trenutnih grešaka, nprample cat errors > clear.

FME djelomična rekonfiguracija sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio polje tip pristup
interfejs_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l heksadecimalni 16-bajt Samo za čitanje

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

sysfs file mmio polje tip pristup
sat gperf.clk.afu_interf_clock hex uint64_t Samo za čitanje

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ne vrijedi za Acceleration Stack za Intel Xeon CPU sa FPGA)

sysfs file mmio polje tip pristup
zamrznuti gperf.ch_ctl.freeze decimalni int Čitaj-piši
read_hit gperf.CACHE_RD_HIT hex uint64_t Samo za čitanje
read_miss gperf.CACHE_RD_MISS hex uint64_t Samo za čitanje
write_hit gperf.CACHE_WR_HIT hex uint64_t Samo za čitanje
write_miss gperf.CACHE_WR_MISS hex uint64_t Samo za čitanje
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Samo za čitanje
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Samo za čitanje
sysfs file mmio polje tip pristup
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Samo za čitanje
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Samo za čitanje
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Samo za čitanje

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ne važi za Acceleration Stack za Intel Xeon CPU sa FPGA)

sysfs file mmio polje tip pristup
zamrznuti gperf.vtd_ctl.freeze decimalni int Korisnik: Samo za čitanje Root: Čitanje-pisanje

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ne važi za Acceleration Stack za Intel Xeon CPU sa FPGA)

sysfs file mmio polje tip pristup
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Samo za čitanje
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Samo za čitanje
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Samo za čitanje
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Samo za čitanje

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

sysfs file mmio polje tip pristup
omogućiti gperf.fab_ctl.(omogućeno) decimalni int Korisnik: Samo za čitanje Root: Čitanje-pisanje
zamrznuti gperf.fab_ctl.freeze decimalni int Korisnik: Samo za čitanje Root: Čitanje-pisanje
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Samo za čitanje
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Samo za čitanje
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Samo za čitanje
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Samo za čitanje
upi_read gperf.FAB_UPI_RD hex uint64_t Samo za čitanje
upi_write gperf.FAB_UPI_WR hex uint64_t Samo za čitanje

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

sysfs file mmio polje tip pristup
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Samo za čitanje
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Samo za čitanje
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Samo za čitanje
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Samo za čitanje
upi_read gperf.FAB_UPI_RD hex uint64_t Samo za čitanje
upi_write gperf.FAB_UPI_WR hex uint64_t Samo za čitanje

Zaglavlje porta sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio polje tip pristup
id port_header.capability.port_number decimalni int Samo za čitanje
ltr port_header.control.latency_tolerance decimalni int Samo za čitanje

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

sysfs file mmio polje tip pristup
afu_id afu_header.guid heksadecimalni 16-bajt Samo za čitanje

Port Error sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio polje tip pristup
greške perror.port_error hex uint64_t Samo za čitanje
prva_greška perror.port_first_error hex uint64_t Samo za čitanje
first_malformed_req perror.malreq heksadecimalni 16-bajt Samo za čitanje
jasno greška.(sve greške) razne uint64_t Samo za pisanje

Napomena:
Da obrišete greške porta, morate napisati tačnu bitmasku trenutnih grešaka, nprample cat errors > clear.

Istorija revizija

Verzija dokumenta Promjene
2017.10.02 Prvo izdanje.

Vodič za arhitekturu upravljačkog programa OPAE Intel FPGA Linux uređaja

Dokumenti / Resursi

Intel OPAE FPGA Linux Device Driver Arhitektura [pdf] Korisnički priručnik
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Reference

Ostavite komentar

Vaša email adresa neće biti objavljena. Obavezna polja su označena *