Intel OPAE FPGA Linux Device Driver Arhitektura
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
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
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:
- Iskrcaj vozača iz gosta
- Isključite VF od gosta
- Onemogućite SR-IOV
- Izvršite djelomičnu rekonfiguraciju
- Omogućite SR-IOV
- Priključite VF na gosta
- 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:
- 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.
- 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
- Prođite kroz VF do VM.
- 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
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.
- Dodijelite strukturu build_feature_devs_info, inicijalizirajte je.
- 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 tok
- 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 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()
- 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 |