intel OPAE FPGA Linux arhitektura upravljačkog programa uređaja
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
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
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:
- Iskrcaj vozača od gosta
- Isključite VF iz gosta
- Onemogući SR-IOV
- Izvršite djelomičnu rekonfiguraciju
- Omogući SR-IOV
- Priključite VF na gosta
- 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:
- 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.
- 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
- Prođite kroz VF-ove do VM-ova.
- 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
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.
- Dodijelite strukturu build_feature_devs_info, inicijalizirajte je.
- 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 FME
- 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 porta
- 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 |