intel-logo

intel OPAE FPGA Linux arhitektura upravljačkog programa uređaja

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

OPAE Intel FPGA Linux arhitektura upravljačkog programa uređaja

OPAE Intel FPGA upravljački program pruža sučelja za aplikacije korisničkog prostora za konfiguriranje, nabrajanje, otvaranje i pristup FPGA akceleratorima na platformama opremljenim Intelovim FPGA rješenjima i omogućuje funkcije upravljanja na razini sustava kao što su rekonfiguracija FPGA, upravljanje napajanjem i virtualizacija.

Hardverska arhitektura

Sa stajališta OS-a view, FPGA hardver se pojavljuje kao uobičajeni PCIe uređaj. Memorija FPGA uređaja organizirana je pomoću unaprijed definirane strukture podataka (Device Feature List). Značajke koje podržava FPGA uređaj izložene su kroz ove strukture podataka, kao što je prikazano na sljedećoj slici:

FPGA PCIe uređaj

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

Upravljački program podržava PCIe SR-IOV za stvaranje virtualnih funkcija (VF) koje se mogu koristiti za dodjeljivanje pojedinačnih akceleratora virtualnim strojevima.

Intel Corporation. Sva prava pridržana. Intel, Intelov logotip i druge Intelove oznake zaštitni su znakovi Intel Corporation ili njegovih podružnica. Intel jamči performanse svojih FPGA i poluvodičkih proizvoda prema trenutnim specifikacijama u skladu s Intelovim standardnim jamstvom, ali zadržava pravo izmjene bilo kojeg proizvoda i usluge u bilo koje vrijeme bez prethodne najave. Intel ne preuzima nikakvu odgovornost niti obvezu proizašlu iz primjene ili upotrebe bilo koje informacije, proizvoda ili usluge opisane ovdje, osim ako je Intel izričito pismeno pristao. Klijentima Intela savjetuje se da nabave najnoviju verziju specifikacija uređaja prije nego što se pouzdaju u bilo kakve objavljene informacije i prije naručivanja proizvoda ili usluga.

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

Virtualizirani FPGA PCIe uređaj

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

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

Luka
Port predstavlja sučelje između statičke FPGA strukture ("FPGA Interface Manager (FIM)") i djelomično rekonfigurabilnog područja koje sadrži funkciju akceleratora (AF). Port kontrolira komunikaciju od softvera do akceleratora i izlaže značajke kao što su reset i debug. PCIe uređaj može imati nekoliko priključaka, a svaki priključak može biti izložen kroz VF dodjeljivanjem pomoću FPGA_FME_PORT_ASSIGN ioctl na FME uređaju.

Jedinica funkcije akceleratora (AF).

  • Jedinica za funkciju akceleratora (AF) priključena je na port i izlaže 256K MMIO regiju koja se koristi za kontrolne registre specifične za akcelerator.
  • Aplikacije korisničkog prostora mogu steći ekskluzivni pristup AFU-u pripojenom Portu pomoću open() na Port uređaju i otpustiti ga pomoću close().
  • Aplikacije korisničkog prostora također mogu mmap() ubrzati MMIO regije.

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 generirana za točan FIM i ciljanu statičku regiju (priključak) FPGA; u suprotnom, operacija rekonfiguracije neće uspjeti i može uzrokovati nestabilnost sustava. Ova se kompatibilnost može provjeriti usporedbom ID-a sučelja navedenog u zaglavlju AF-a s ID-om sučelja koje je otkrio FME kroz sysfs. Ovu provjeru obično obavlja korisnički prostor prije pozivanja rekonfiguracijskog IOCTL-a.

Bilješka:
Trenutačno se svaki softverski program koji pristupa FPGA-u, uključujući one koji se izvode u virtualiziranom hostu, mora zatvoriti prije pokušaja djelomične rekonfiguracije. Koraci bi bili sljedeći:

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

FPGA virtualizacija
Da biste omogućili pristup akceleratoru iz aplikacija koje se izvode u VM-u, odgovarajući AFU port treba dodijeliti VF-u pomoću sljedećih koraka:

  1. PF posjeduje sve AFU priključke prema zadanim postavkama. Bilo koji priključak koji treba ponovno dodijeliti VF-u mora se prvo osloboditi iz PF-a putem FPGA_FME_PORT_RELEASE ioctl na FME uređaju.
  2. Nakon što se N portova oslobodi iz PF-a, naredba u nastavku može se koristiti za omogućavanje SRIOV-a i VF-ova. Svaki VF posjeduje samo jedan priključak s AFU-om. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Prođite kroz VF-ove do VM-ova.
  4. AFU pod VF je dostupan iz aplikacija u VM (koristeći isti upravljački program unutar VF).

Bilješka:
FME se ne može dodijeliti VF-u, stoga su PR i druge funkcije upravljanja dostupne samo preko PF-a.

Organizacija vozača

Upravljački program uređaja PCIe modula

Organizacija vozača

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

FPGA uređaji pojavljuju se kao obični PCIe uređaji; stoga se upravljački program FPGA PCIe uređaja (intel-FPGA-PCI.ko) uvijek prvi učitava kada se otkrije FPGA PCIe PF ili VF. Ovaj pokretački program igra infrastrukturnu ulogu u arhitekturi upravljačkog programa. To:

  • Stvara FPGA kontejnerski uređaj kao nadređenog uređaja značajke.
  • Prolazi kroz popis značajki uređaja, koji je implementiran u BAR memoriju PCIe uređaja, kako bi se otkrili uređaji s značajkama i njihove podznačajke i izradili platformski uređaji za njih pod spremnikom uređaja.
  • Podržava SR-IOV.
  • Predstavlja infrastrukturu značajnih uređaja, koja apstrahira operacije za podznačajke i izlaže uobičajene funkcije upravljačkim programima značajki uređaja.

Funkcije upravljačkog programa uređaja PCIe modula

  • Sadrži PCIe otkrivanje, nabrajanje uređaja i otkrivanje značajki.
  • Stvara sysfs direktorije za nadređeni uređaj, FPGA Management Engine (FME) i priključak.
  • Stvara instance upravljačkog programa platforme, uzrokujući da Linux kernel učita odgovarajuće upravljačke programe modula platforme.

Upravljački program za modul FME platforme

  • Upravljanje napajanjem i toplinom, izvješćivanje o pogreškama, izvješćivanje o performansama i druge infrastrukturne funkcije. Ovim funkcijama možete pristupiti preko sysfs sučelja koje otkriva FME upravljački program.
  • Djelomična rekonfiguracija. FME upravljački program registrira FPGA Manager tijekom inicijalizacije PR podznačajke; nakon što od vas primi FPGA_FME_PORT_PR ioctl, poziva funkciju zajedničkog sučelja iz FPGA Managera kako bi dovršio djelomičnu rekonfiguraciju bitstreama na dati priključak.
  • Upravljanje portom za virtualizaciju. FME upravljački program uvodi dva ioctl-a, FPGA_FME_PORT_RELEASE, koji oslobađa dani priključak iz PF-a; i FPGA_FME_PORT_ASSIGN, koji dodjeljuje priključak natrag PF-u. Nakon što se priključak oslobodi od PF-a, može se dodijeliti VF-u putem SR-IOV sučelja koje pruža PCIe upravljački program. Za više informacija pogledajte “FPGA virtualizacija”.

Funkcije upravljačkog programa modula FME platforme

  • Stvara čvor FME znakovnog uređaja.
  • Stvara FME sysfs files i implementira FME sysfs file pristupnici.
  • Implementira podpokretače privatnih značajki FME.
  • Podpokretači privatnih značajki FME:
    • FME zaglavlje
    • Upravljanje toplinom
    • Upravljanje napajanjem
    • Globalna pogreška
    • Djelomična rekonfiguracija
    • Globalna izvedba

Upravljački program uređaja modula port platforme
Slično upravljačkom programu FME, upravljački program FPGA porta (i AFU) (intel-fpga-afu. ko) ispituje se nakon što se izradi port platformski uređaj. Glavna funkcija ovog modula je pružiti sučelje za aplikacije korisničkog prostora za pristup pojedinačnim akceleratorima, uključujući osnovnu kontrolu resetiranja na portu, izvoz AFU MMIO regije, uslugu mapiranja DMA međuspremnika, UMsg(1) obavijest i funkcije daljinskog otklanjanja pogrešaka ( vidi gore).

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

Funkcije upravljačkog programa modula port platforme

  • Stvara čvor uređaja znakova Port.
  • Stvara port sysfs files i implementira Port sysfs file pristupnici.
  • Implementira privatne pod-pokretačke značajke porta.
  • Pod-pokretači privatnih značajki priključka:
    • Zaglavlje priključka
    • AFU
    • Pogreška priključka
    • UMsg (2)
    • Signalna slavina

Pobrojavanje FPGA uređaja aplikacije
Ovaj odjeljak predstavlja način na koji aplikacije numeriraju FPGA uređaj iz sysfs hijerarhije pod /sys/class/fpga. U exampispod, dva Intel FPGA uređaja instalirana su u glavnom računalu. Svaki FPGA uređaj ima jedan FME i dva priključka (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 priključka (AFU) kao podređene uređaje:
/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 sučelja nazivaju se na sljedeći način:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

pri čemu I uzastopno numerira sve kontejnerske uređaje, j uzastopno numerira FME-ove i k uzastopno numerira sve priključke.

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

Popis PCIe upravljačkog programa
Ovaj odjeljak daje overview toka koda za numeraciju uređaja koju izvodi intel-fpga-pci.ko. Istaknute su glavne podatkovne strukture i funkcije. Ovaj odjeljak najbolje je slijediti kada viewing popratnog 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 *ime;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
static struct class *fpga_class;
statička struktura 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,}
};
statička struktura pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.ukloni = cci_pci_ukloni,
.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 released_port_num;
struct list_head regije;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
praznina __iomem *iokraj;
int trenutna_traka;
void __iomem *pfme_hdr;
struct uređaj *parent_dev;
struct platform_device *feature_dev;
};

Tijek nabrajanja

  • ccidrv_init()
    • Inicijalizirajte fpga_ids koristeći idr_init().
    • Inicijalizirajte fpga_chrdevs[i].devt pomoću alloc_chrdev_region().
    • Inicijalizirajte fpga_class pomoću class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Omogućite PCI uređaj, zatražite pristup njegovim regijama, postavite PCI glavni način rada 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 FME i Port sysfs direktorije.
  • parse_feature_list()
    • Prošećite popisom značajki BAR0 uređaja kako biste otkrili FME, priključak i njihove privatne značajke.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Kada se naiđe na FME:
  • build_info_create_dev()
    • Dodijelite platformski uređaj za FME, pohranjujući u build_feature_devs_info.feature_dev.
    • feature_dev.id se inicijalizira na rezultat idr_alloc(fpga_ids[FME_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
    • create_feature_instance() build_info_add_sub_feature()
    • Inicijaliziraj feature_dev.resource[FME_FEATURE_ID_HEADER].
    • značajka_platforma_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 luku:
  • build_info_create_dev()
    • Dodijelite platformski uređaj za priključak, pohranjujući u build_feature_devs_info.feature_dev.
    • feature_dev.id se inicijalizira 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 struct feature_platform_data.node za Port na popis Portova u struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Inicijaliziraj feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • značajka_platforma_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()
    • Inicijaliziraj feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • značajka_platforma_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 FME privatnu značajku:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicijaliziraj feature_dev.resource[id].
  • značajka_platforma_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 značajku porta: * create_feature_instance() build_info_add_sub_feature() * Inicijalizirajte 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 fizičku funkciju (PF), tada:
  • Pokrenite tok parse_feature_list() na svakom priključku opisanom u FME zaglavlju.
  • Koristite BAR naveden u svakom unosu priključka 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 podatkovne strukture i funkcije su istaknute. Ovaj odjeljak najbolje je slijediti kada viewučitavanje priloženog izvornog koda (fme-main.c).

Strukture podataka uređaja platforme FME

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct značajka *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);
};
značajka strukture {
const char *ime;
int indeks_resursa;
void __iomem *ioaddr;
struct značajka_ops *ops;
};
struct feature_platform_data {
struct list_head čvor;
struct mutex zaključavanje;
nepotpisani dugi dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
ništavan *privatan;
int broj;
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 *)); strukturirati
značajke značajke[0];
};
struct perf_object {
ti ruka;
const struct atribut_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_greška;
struct uređaj *dev_err;
struct perf_object *perf_dev;
struct značajka_platforma_data *pdata;
};

Tijek inicijalizacije uređaja platforme FME

Tok inicijalizacije FMEintel-OPAE-FPGA-Linux-Device-Driver-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()
    • Spremite strukturu feature_ops u feature_platform_data.features za svaku popunjenu značajku.
    • Pozovite testnu funkciju, ako postoji, iz strukture.
    • Pozovite funkciju init iz strukture.
  • fme_probe() fpga_register_dev_ops()
    • Stvorite čvor FME znakovnog uređaja, registrirajući strukturu file_operacije.

Inicijalizacija uređaja port platforme
Ovaj odjeljak daje overview toka koda za inicijalizaciju port uređaja koju izvodi intel-fpga-afu.ko. Istaknute su glavne podatkovne strukture i funkcije. Ovaj odjeljak najbolje je slijediti kada viewing popratnog izvornog koda (afu.c).

Strukture podataka uređaja platforme luka

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct značajka *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);
};
značajka strukture {
const char *ime;
int indeks_resursa;
void __iomem *ioaddr;
struct značajka_ops *ops;
};
struct feature_platform_data {
struct list_head čvor;
struct mutex zaključavanje;
nepotpisani dugi dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
ništavan *privatan;
int broj;
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 *));
značajke strukture [0];
};
struct fpga_afu_region {
u32 indeks;
u32 zastave;
veličina u64;
u64 pomak;
u64 phys;
struct list_head čvor;
};
struct fpga_afu_dma_region {
u64 korisnička_adresa;
u64 duljina;
u64 iova;
struct stranica **stranice;
struct rb_node čvor;
bool u_upotrebi;
};
struct fpga_afu {
u64 region_cur_offset;
int broj_regija;
u8 broj_umsgs;
struct list_head regije;
struct rb_root dma_regions;
struct značajka_platforma_data *pdata;
};

Tijek inicijalizacije uređaja platforme priključka

Tok inicijalizacije portaintel-OPAE-FPGA-Linux-Device-Driver-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()
    • Spremite strukturu feature_ops u feature_platform_data.features za svaku popunjenu značajku.
    • Pozovite testnu funkciju, ako postoji, iz strukture.
    • Pozovite funkciju init iz strukture.
  • afu_probe() fpga_register_dev_ops()
    • Stvorite čvor karakternog uređaja Port, registrirajući strukturu file_operacije.

FME IOCTL-ovi
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—trenutačno 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; // in: mora biti 0
__u32 port_id; // u: port ID (od 0) za otpuštanje.
};

FPGA_FME_PORT_ASSIGN—arg je pokazivač na:

struct fpga_fme_port_assign {
__u32 argsz; // u: sizeof(struct fpga_fme_port_assign)
__u32 zastave; // in: mora biti 0
__u32 port_id; // u: port ID (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; // in: mora biti 0
__u32 port_id; // u: port ID (od 0)
__u32 veličina_spremnika; // in: veličina međuspremnika bitstreama u bajtovima. Mora biti 4-bajtna
usklađeni.
__u64 adresa_spremnika; // in: adresa procesa međuspremnika toka bitova
__u64 status; // out: status greške (bitmaska)
};

Port IOCTL-ovi
IOCTL-ovi koji se pozivaju na open file deskriptor za /dev/intel-fpga-port.k FPGA_GET_API_VERSION—vrati trenutnu verziju kao cijeli broj, počevši od 0. FPGA_CHECK_EXTENSION—trenutačno 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; // out: vraća 0
__u32 broj_regija; // out: broj MMIO regija, 2 (1 za AFU i 1 za
STP)
__u32 num_umsgs; // out: broj UMsg-ova koje podržava hardver
};

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: (bitmaska) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // u: FPGA_PORT_INDEX_UAFU ili FPGA_PORT_INDEX_STP
__u32 ispuna; // in: mora biti 0
__u64 veličina; // out: veličina MMIO regije u bajtovima
__u64 pomak; // out: pomak MMIO regije od početka fd uređaja
};

FPGA_PORT_DMA_MAP—arg je pokazivač na:
struct fpga_port_dma_map {
__u32 argsz; // u: sizeof(struct fpga_port_dma_map)
__u32 zastave; // in: mora biti 0 __u64 user_addr; // in: virtualni proces
adresa. Mora biti poravnat sa stranicom.
__u64 duljina; // in: duljina mapiranja u bajtovima. Mora biti višekratnik stranice
veličina.
__u64 iova; // out: IO virtualna 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; // in: mora biti 0
__u64 iova; // in: IO virtualna adresa koju je vratio prethodni
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg mora biti NULL.
  • FPGA_PORT_UMSG_ENABLE—arg mora biti NULL.
  • FPGA_PORT_UMSG_DISABLE—argovi 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; // in: mora biti 0
__u32 hint_bitmap; // u: UMsg bitmapa načina hintiranja. Označava koji su UMsg-ovi
omogućeno.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg mora biti onemogućen prije izdavanja ovog ioctl-a.
  • Polje iova mora biti dovoljno veliko za međuspremnik za sve UMsg-ove (num_umsgs * PAGE_SIZE).
    • Međuspremnik je označen kao "u upotrebi" od strane upravljačkog programa upravljanja međuspremnikom.
    • Ako je iova NULL, svaka prethodna regija je uklonjena 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; // in: mora biti 0
    • u64 iova; // in: IO virtualna adresa iz FPGA_PORT_DMA_MAP. };

Bilješka:

  • Za brisanje pogrešaka porta, morate napisati točnu bitmasku trenutnih pogrešaka, nprample, mačka pogreške > jasno
  • UMsg je podržan samo kroz Acceleration Stack za Intel Xeon procesor s integriranim FPGA.

sysfs Files

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

sysfs file polje mmio 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_metapodaci fme_header.bitstream_md hex uint64_t Samo za čitanje

FME sustav toplinskog upravljanja files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file polje mmio tip pristup
prag1 toplinski.prag.tmp_thshold1 decimalni int Korisnik: samo za čitanje Root: čitanje-pisanje
prag2 toplinski.prag.tmp_thshold2 decimalni int Korisnik: samo za čitanje Root: čitanje-pisanje
prag_putovanja toplinski.prag.therm_trip_thshold decimalni int Samo za čitanje
threshold1_reached termalni.prag.thshold1_status decimalni int Samo za čitanje
threshold2_reached termalni.prag.thshold2_status decimalni int Samo za čitanje
politika_praga1 toplinski. prag.thshold_policy decimalni int Korisnik: samo za čitanje Root: čitanje-pisanje
temperatura termalni.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 polje mmio tip pristup
potrošeno power.status.pwr_consumed hex uint64_t Samo za čitanje
prag1 snaga.prag.prag1 hex uint64_t Korisnik: samo za čitanje Root: čitanje-pisanje
prag2 snaga.prag.prag2 hex uint64_t Korisnik: samo za čitanje Root: čitanje-pisanje
prag1_status snaga.prag.prag1_status decimala bez predznaka Samo za čitanje
prag2_status snaga.prag.prag2_status decimala bez predznaka Samo za čitanje
rtl power.status.fpga_latency_report decimala bez predznaka Samo za čitanje

FME Globalna pogreška sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/greške/

sysfs file polje mmio tip pristup
pcie0_greške gerror.pcie0_err hex uint64_t Čitaj-piši
pcie1_greške gerror.pcie1_err hex uint64_t Čitaj-piši
inject_error gerror.ras_greška_inj hex uint64_t Čitaj-piši

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

sysfs file polje mmio tip pristup
pogreške gerror.fme_err hex uint64_t Samo za čitanje
prva_pogreška gerror.fme_first_err.err_reg_status hex uint64_t Samo za čitanje
sljedeća_pogreška gerror.fme_next_err.err_reg_status hex uint64_t Samo za čitanje
jasan Briše pogreške, first_error, next_error razne uint64_t Samo za pisanje

Bilješka:
Da biste izbrisali FME pogreške, morate napisati točnu bitmasku trenutnih pogrešaka, nprample cat pogreške > jasno.

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

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

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

sysfs file polje mmio 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 s FPGA-ima)

sysfs file polje mmio 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
napisati_hit gperf.CACHE_WR_HIT hex uint64_t Samo za čitanje
napiši_promašiti 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 polje mmio tip pristup
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Samo za čitanje
sukob_priključka_za_pisanje 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 vrijedi za Acceleration Stack za Intel Xeon CPU s FPGA)

sysfs file polje mmio 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 vrijedi za Acceleration Stack za Intel Xeon CPU s FPGA-ima)

sysfs file polje mmio tip pristup
čitanje_transakcije gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Samo za čitanje
pisati_transakciju 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 polje mmio 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_čitanje gperf.FAB_PCIE0_RD hex uint64_t Samo za čitanje
pcie0_pisati gperf.FAB_PCIE0_WR hex uint64_t Samo za čitanje
pcie1_čitanje gperf.FAB_PCIE1_RD hex uint64_t Samo za čitanje
pcie1_pisati gperf.FAB_PCIE1_WR hex uint64_t Samo za čitanje
upi_read gperf.FAB_UPI_RD hex uint64_t Samo za čitanje
upi_pisati gperf.FAB_UPI_WR hex uint64_t Samo za čitanje

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

sysfs file polje mmio tip pristup
pcie0_čitanje gperf.FAB_PCIE0_RD hex uint64_t Samo za čitanje
pcie0_pisati gperf.FAB_PCIE0_WR hex uint64_t Samo za čitanje
pcie1_čitanje gperf.FAB_PCIE1_RD hex uint64_t Samo za čitanje
pcie1_pisati gperf.FAB_PCIE1_WR hex uint64_t Samo za čitanje
upi_read gperf.FAB_UPI_RD hex uint64_t Samo za čitanje
upi_pisati gperf.FAB_UPI_WR hex uint64_t Samo za čitanje

Zaglavlje priključka sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file polje mmio 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 polje mmio tip pristup
afu_id afu_header.guid hex 16-bajt Samo za čitanje

Pogreška priključka sysfs files
intel-fpga-dev.i/intel-fpga-port.k/greške/

sysfs file polje mmio tip pristup
pogreške pogreška.pogreška_porta hex uint64_t Samo za čitanje
prva_pogreška pogreška.prvi_port_pogreška hex uint64_t Samo za čitanje
prvi_neispravno_zahtj pogreška.malreq hex 16-bajt Samo za čitanje
jasan pogreška. (sve pogreške) razne uint64_t Samo za pisanje

Bilješka:
Za brisanje pogrešaka porta, morate napisati točnu bitmasku trenutnih pogrešaka, nprample cat pogreške > jasno.

Povijest revizija

Verzija dokumenta Promjene
2017.10.02 Početno izdanje.

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

Dokumenti / Resursi

intel OPAE FPGA Linux arhitektura upravljačkog programa uređaja [pdf] Korisnički priručnik
OPAE FPGA Arhitektura upravljačkog programa Linux uređaja, OPAE FPGA, Arhitektura upravljačkog programa Linux uređaja, Arhitektura upravljačkog programa, Arhitektura

Reference

Ostavite komentar

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