Arhitektura gonilnikov naprav intel OPAE FPGA Linux
Arhitektura gonilnikov naprav Intel FPGA Linux OPAE
Gonilnik OPAE Intel FPGA zagotavlja vmesnike za aplikacije v uporabniškem prostoru za konfiguriranje, oštevilčenje, odpiranje in dostop do pospeševalnikov FPGA na platformah, opremljenih z rešitvami Intel FPGA, in omogoča funkcije upravljanja na ravni sistema, kot so rekonfiguracija FPGA, upravljanje porabe energije in virtualizacija.
Arhitektura strojne opreme
Z vidika OS view, se strojna oprema FPGA prikaže kot običajna naprava PCIe. Pomnilnik naprave FPGA je organiziran z vnaprej določeno strukturo podatkov (Device Feature List). Funkcije, ki jih podpira naprava FPGA, so izpostavljene prek teh podatkovnih struktur, kot je prikazano na spodnji sliki:
Naprava FPGA PCIe
Gonilnik podpira PCIe SR-IOV za ustvarjanje navideznih funkcij (VF), ki jih je mogoče uporabiti za dodelitev posameznih pospeševalnikov navideznim strojem.
Intel Corporation. Vse pravice pridržane. Intel, logotip Intel in druge znamke Intel so blagovne znamke družbe Intel Corporation ali njenih podružnic. Intel jamči za delovanje svojih izdelkov FPGA in polprevodnikov v skladu s trenutnimi specifikacijami v skladu z Intelovo standardno garancijo, vendar si pridržuje pravico do sprememb katerega koli izdelka in storitve kadar koli brez predhodnega obvestila. Intel ne prevzema nobene odgovornosti ali obveznosti, ki izhaja iz uporabe ali uporabe katere koli informacije, izdelka ali storitve, opisanih tukaj, razen če je Intel izrecno pisno privolil v to. Intelovim strankam svetujemo, da pridobijo najnovejšo različico specifikacij naprave, preden se zanesejo na kakršne koli objavljene informacije in preden oddajo naročila za izdelke ali storitve.
Druga imena in blagovne znamke se lahko zahtevajo kot last drugih.
Virtualizirana naprava FPGA PCIe
Motor za upravljanje FPGA (FME)
FPGA Management Engine izvaja upravljanje napajanja in toplote, poročanje o napakah, ponovno konfiguracijo, poročanje o zmogljivosti in druge infrastrukturne funkcije. Vsaka FPGA ima en FME, do katerega se vedno dostopa prek fizične funkcije (PF). Aplikacije uporabniškega prostora lahko pridobijo ekskluzivni dostop do FME z uporabo open() in ga sprostijo z uporabo close() kot privilegiran uporabnik (root).
Pristanišče
Vrata predstavljajo vmesnik med statično strukturo FPGA (»FPGA Interface Manager (FIM)«) in delno rekonfigurabilno regijo, ki vsebuje funkcijo pospeševalnika (AF). Vrata nadzorujejo komunikacijo med programsko opremo in pospeševalnikom in izpostavljajo funkcije, kot sta ponastavitev in odpravljanje napak. Naprava PCIe ima lahko več vrat in vsaka vrata je mogoče izpostaviti prek VF, tako da jih dodelite z uporabo FPGA_FME_PORT_ASSIGN ioctl v napravi FME.
Enota za funkcijo pospeševanja (AF).
- Enota za funkcijo pospeševalnika (AF) je priključena na vrata in izpostavlja območje 256K MMIO, ki se uporablja za nadzorne registre, specifične za pospeševalnik.
- Aplikacije uporabniškega prostora lahko pridobijo ekskluzivni dostop do AFU, priključenega na vrata, z uporabo open() na napravi Port in ga sprostijo z uporabo close().
- Aplikacije uporabniškega prostora lahko tudi mmap() pospešujejo regije MMIO.
Delna rekonfiguracija
Kot je navedeno zgoraj, je mogoče pospeševalnike ponovno konfigurirati z delno ponovno konfiguracijo funkcije pospeševalnika (AF). file. Funkcija pospeševalnika (AF) mora biti ustvarjena za natančno FIM in ciljno statično regijo (vrata) FPGA; sicer bo operacija ponovne konfiguracije neuspešna in lahko povzroči nestabilnost sistema. To združljivost je mogoče preveriti s primerjavo ID-ja vmesnika, zabeleženega v glavi AF, z ID-jem vmesnika, ki ga izpostavi FME prek sysfs. To preverjanje običajno opravi uporabniški prostor, preden pokliče rekonfiguracijo IOCTL.
Opomba:
Trenutno mora biti vsak program, ki dostopa do FPGA, vključno s tistimi, ki se izvajajo v virtualiziranem gostitelju, zaprt pred poskusom delne ponovne konfiguracije. Koraki bi bili:
- Odstranite gonilnik iz gosta
- Odklopite VF iz gosta
- Onemogoči SR-IOV
- Izvedite delno rekonfiguracijo
- Omogoči SR-IOV
- Priključite VF na gosta
- Naloži gonilnik v gostu
Virtualizacija FPGA
Če želite omogočiti dostop do pospeševalnika iz aplikacij, ki se izvajajo v VM, je treba ustrezna vrata AFU dodeliti VF z naslednjimi koraki:
- PF ima privzeto v lasti vsa vrata AFU. Vsa vrata, ki jih je treba znova dodeliti VF, je treba najprej sprostiti iz PF prek ioctl FPGA_FME_PORT_RELEASE v napravi FME.
- Ko je N vrat sproščenih iz PF, lahko uporabite spodnji ukaz za omogočanje SRIOV in VF. Vsak VF ima samo ena vrata z AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
- Prehod skozi VF do VM.
- AFU pod VF je dostopen iz aplikacij v VM (z uporabo istega gonilnika znotraj VF).
Opomba:
FME ni mogoče dodeliti VF, zato so PR in druge funkcije upravljanja na voljo samo prek PF.
Organizacija voznikov
Gonilnik naprave modula PCIe
Organizacija voznikov
Naprave FPGA so videti kot običajne naprave PCIe; tako se gonilnik naprave FPGA PCIe (intel-FPGA-PCI.ko) vedno najprej naloži, ko je zaznan FPGA PCIe PF ali VF. Ta gonilnik igra infrastrukturno vlogo v arhitekturi gonilnika. To:
- Ustvari vsebniško napravo FPGA kot nadrejeno napravo s funkcijami.
- Sprehodi se po seznamu funkcij naprave, ki je implementiran v pomnilnik BAR naprave PCIe, za odkrivanje funkcijskih naprav in njihovih podfunkcij ter ustvarjanje platformnih naprav zanje v vsebniški napravi.
- Podpira SR-IOV.
- Predstavlja infrastrukturo funkcijskih naprav, ki abstrahira operacije za podfunkcije in izpostavlja skupne funkcije gonilnikom funkcijskih naprav.
Funkcije gonilnika naprave modula PCIe
- Vsebuje odkrivanje PCIe, oštevilčenje naprav in odkrivanje funkcij.
- Ustvari imenike sysfs za nadrejeno napravo, mehanizem upravljanja FPGA (FME) in vrata.
- Ustvari primerke gonilnika platforme, zaradi česar jedro Linuxa naloži ustrezne gonilnike modulov platforme.
Gonilnik naprave modula platforme FME
- Upravljanje napajanja in toplote, poročanje o napakah, poročanje o zmogljivosti in druge infrastrukturne funkcije. Do teh funkcij lahko dostopate prek vmesnikov sysfs, ki jih razkrije gonilnik FME.
- Delna rekonfiguracija. Gonilnik FME registrira upravitelja FPGA med inicializacijo podfunkcije PR; ko od vas prejme ioctl FPGA_FME_PORT_PR, prikliče funkcijo skupnega vmesnika iz upravitelja FPGA, da dokonča delno rekonfiguracijo bitnega toka v danih vratih.
- Upravljanje vrat za virtualizacijo. Gonilnik FME uvaja dva ioctl, FPGA_FME_PORT_RELEASE, ki sprosti dana vrata iz PF; in FPGA_FME_PORT_ASSIGN, ki dodeli vrata nazaj PF. Ko se vrata sprostijo iz PF, jih je mogoče dodeliti VF prek vmesnikov SR-IOV, ki jih zagotavlja gonilnik PCIe. Za več informacij glejte »Virtualizacija FPGA«.
Funkcije gonilnika naprave modula platforme FME
- Ustvari vozlišče naprave znakov FME.
- Ustvari FME sysfs files in izvaja FME sysfs file dostopniki.
- Izvaja podgonilnike zasebnih funkcij FME.
- Podgonilniki zasebnih funkcij FME:
- Glava FME
- Toplotno upravljanje
- Upravljanje napajanja
- Globalna napaka
- Delna rekonfiguracija
- Globalna uspešnost
Gonilnik naprave Port Platform Module
Podobno kot gonilnik FME se gonilnik FPGA Port (in AFU) (intel-fpga-afu.ko) preizkusi, ko je naprava Port platform ustvarjena. Glavna funkcija tega modula je zagotoviti vmesnik za aplikacije uporabniškega prostora za dostop do posameznih pospeševalnikov, vključno z osnovnim nadzorom ponastavitve na vratih, izvozom regije AFU MMIO, storitvijo preslikave medpomnilnika DMA, obvestilom UMsg(1) in funkcijami oddaljenega odpravljanja napak ( glej zgoraj).
UMsg je podprt samo prek pospeševalnega sklada za procesor Intel Xeon® z integrirano FPGA.
Funkcije gonilnika naprave modula Port Platform
- Ustvari vozlišče naprave znakov Port.
- Ustvari port sysfs files in izvaja Port sysfs file dostopniki.
- Implementira zasebne podgonilnike funkcij Port.
- Podgonilniki za zasebne funkcije vrat:
- Glava vrat
- AFU
- Napaka vrat
- UMsg (2)
- Signalna pipa
Štetje aplikacijskih naprav FPGA
Ta razdelek predstavlja, kako aplikacije oštevilčijo napravo FPGA iz hierarhije sysfs pod /sys/class/fpga. V bivšemample spodaj sta v gostitelju nameščeni dve napravi Intel FPGA. Vsaka naprava FPGA ima en FME in dva priključka (AFU). Za vsako napravo FPGA je v /sys/class/fpga ustvarjen imenik naprave:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Vsako vozlišče ima en FME in dve vrati (AFU) kot podrejene naprave:
/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
Na splošno so vmesniki FME/Port sysfs poimenovani na naslednji način:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
z I zaporednim številčenjem vseh vsebniških naprav, j zaporednim številčenjem FME-jev in k zaporednim številčenjem vseh vrat.
Vozlišča naprave, ki se uporabljajo za ioctl() in mmap(), se lahko sklicujejo prek:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
Naštevanje gonilnikov PCIe
Ta razdelek podaja zaključekview toka kode za oštevilčenje naprav, ki ga izvaja intel-fpga-pci.ko. Poudarjene so glavne podatkovne strukture in funkcije. Temu razdelku je najbolje slediti, ko viewspremljanje priložene izvorne kode (pcie.c).
Podatkovne strukture naštevanja
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statična 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 },
};
statični strukturni razred *fpga_class;
statična 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čna struktura 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;
struktura naprave *fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int released_port_num;
struct list_head regij;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
praznina __iomem *ioend;
int trenutna vrstica;
void __iomem *pfme_hdr;
struktura naprave *parent_dev;
struct platform_device *feature_dev;
};
Tok naštevanja
- ccidrv_init()
- Inicializirajte fpga_ids z idr_init().
- Inicializirajte fpga_chrdevs[i].devt z uporabo alloc_chrdev_region().
- Inicializirajte fpga_class z uporabo class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Omogočite napravo PCI, zahtevajte dostop do njenih regij, nastavite glavni način PCI in konfigurirajte DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Dodelite strukturo build_feature_devs_info, jo inicializirajte.
.parent_dev je nastavljen na nadrejeni imenik sysfs (intel-fpga-dev.id), ki vsebuje imenika FME in Port sysfs.
- Dodelite strukturo build_feature_devs_info, jo inicializirajte.
- parse_feature_list()
- Sprehodite se po seznamu funkcij naprave BAR0, da odkrijete FME, vrata in njihove zasebne funkcije.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Ko naletite na FME:
- build_info_create_dev()
- Dodelite napravo platforme za FME, shranite v build_feature_devs_info.feature_dev.
- feature_dev.id je inicializiran na rezultat idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent je nastavljen na build_feature_devs_info.parent_dev.
- Dodelite matriko virov struct v feature_dev.resource.
- Dodelite strukturo feature_platform_data, jo inicializirajte in shranite kazalec v feature_dev.dev.platform_data
- create_feature_instance() build_info_add_sub_feature()
- Inicializiraj feature_dev.resource[FME_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Inicializirajte feature_platform_data.features[FME_FEATURE_ID_HEADER], vse razen .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- Ko naletite na vrata:
- build_info_create_dev()
- Dodelite napravo platforme za vrata, shranite v build_feature_devs_info.feature_dev.
- feature_dev.id je inicializiran na rezultat idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent je nastavljen na build_feature_devs_info.parent_dev.
- Dodelite niz sredstev struct v feature_dev.resource.
- Dodelite strukturo feature_platform_data, jo inicializirajte in shranite kazalec v feature_dev.dev.platform_data
- build_info_commit_dev()
- Dodajte strukturo feature_platform_data.node za vrata na seznam vrat v strukturi cci_drvdata.port_dev_list
- create_feature_instance() build_info_add_sub_feature()
- Inicializiraj feature_dev.resource[PORT_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Inicializirajte feature_platform_data.features[PORT_FEATURE_ID_HEADER], vse razen .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Ko se pojavi AFU:
- create_feature_instance() build_info_add_sub_feature()
- Inicializiraj feature_dev.resource[PORT_FEATURE_ID_UAFU].
- feature_platform_data_add()
- Inicializirajte feature_platform_data.features[PORT_FEATURE_ID_UAFU], vse razen .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Ko se pojavi zasebna funkcija FME:
- create_feature_instance() build_info_add_sub_feature()
- Inicializiraj feature_dev.resource[id].
- feature_platform_data_add()
- Inicializirajte feature_platform_data.features[id], vse razen .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Ko se odkrije zasebna funkcija vrat: * create_feature_instance() build_info_add_sub_feature() * Inicializacija feature_dev.resource[id]. * feature_platform_data_add() Inicializira feature_platform_data.features[id], vse razen .fops.
- parse_ports_from_fme()
- Če je gonilnik naložen na fizično funkcijo (PF), potem:
- Zaženite tok parse_feature_list() na vseh vratih, opisanih v glavi FME.
- Uporabite BAR, omenjen v vsakem vnosu vrat v glavi.
Inicializacija naprave platforme FME
Ta razdelek podaja zaključekview toka kode za inicializacijo naprave FME, ki jo izvaja intel-fpga-fme.ko. Glavne podatkovne strukture in funkcije so poudarjene. Temu razdelku je najbolje slediti, ko viewspremljanje priložene izvorne kode (fme-main.c).
Podatkovne strukture naprav platforme FME
struct feature_ops {
int (*init)(struct platform_device *pdev, struct funkcija *feature);
int (*uinit)(struct platform_device *pdev, struct funkcija *feature);
dolgo (*ioctl)(struct platform_device *pdev, struct funkcija *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct funkcija *feature);
};
funkcija strukture {
const char *ime;
int resource_index;
void __iomem *ioaddr;
struct funkcija_ops *ops;
};
struct feature_platform_data {
struct list_head vozlišče;
struct mutex lock;
nepodpisan dolg dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
praznina *zasebno;
int št.;
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 *)); struct
funkcija lastnosti[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struktura naprave *fme_dev;
struct list_head vozlišče;
struct list_head otroci;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_napaka;
struktura naprave *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
Potek inicializacije naprave platforme FME
Potek inicializacije FME
- fme_probe() fme_dev_init()
- Inicializirajte strukturo fpga_fme in jo shranite v polje feature_platform_data.private.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Shranite strukturo feature_ops v feature_platform_data.features za vsako poseljeno funkcijo.
- Pokličite testno funkcijo, če obstaja, iz strukture.
- Pokličite funkcijo init iz strukture.
- fme_probe() fpga_register_dev_ops()
- Ustvarite vozlišče naprave znakov FME in registrirajte strukturo file_operacije.
Inicializacija naprave vratne platforme
Ta razdelek podaja zaključekview toka kode za inicializacijo vratne naprave, ki jo izvaja intel-fpga-afu.ko. Poudarjene so glavne podatkovne strukture in funkcije. Temu razdelku je najbolje slediti, ko viewspremljanje priložene izvorne kode (afu.c).
Podatkovne strukture naprav pristaniške platforme
struct feature_ops {
int (*init)(struct platform_device *pdev, struct funkcija *feature);
int (*uinit)(struct platform_device *pdev, struct funkcija *feature);
dolgo (*ioctl)(struct platform_device *pdev, struct funkcija *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct funkcija *feature);
};
funkcija strukture {
const char *ime;
int resource_index;
void __iomem *ioaddr;
struct funkcija_ops *ops;
};
struct feature_platform_data {
struct list_head vozlišče;
struct mutex lock;
nepodpisan dolg dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
praznina *zasebno;
int št.;
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čilnosti strukturne funkcije [0];
};
struct fpga_afu_region {
indeks u32;
zastave u32;
velikost u64;
u64 odmik;
u64 fizika;
struct list_head vozlišče;
};
struct fpga_afu_dma_region {
u64 uporabniški_naslov;
dolžina u64;
u64 iova;
struct page **pages;
struct rb_node vozlišče;
bool v_uporabi;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head regij;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Potek inicializacije naprave vratne platforme
Tok inicializacije vrat
- afu_probe() afu_dev_init()
- Inicializirajte strukturo fpga_afu in jo shranite v polje feature_platform_data.private.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Shranite strukturo feature_ops v feature_platform_data.features za vsako poseljeno funkcijo.
- Pokličite testno funkcijo, če obstaja, iz strukture.
- Pokličite funkcijo init iz strukture.
- afu_probe() fpga_register_dev_ops()
- Ustvarite vozlišče naprave znakov Port in registrirajte strukturo file_operacije.
FME IOCTL
IOCTL-ji, ki so klicani ob odprtju file deskriptor za /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—vrne trenutno različico kot celo število, začenši z 0.
FPGA_CHECK_EXTENSION—trenutno ni podprto.
FPGA_FME_PORT_RELEASE—arg je kazalec na:
struct fpga_fme_port_release {
__u32 argsz; // v: sizeof(struct fpga_fme_port_release)
__u32 zastave; // v: mora biti 0
__u32 port_id; // v: ID vrat (od 0) za sprostitev.
};
FPGA_FME_PORT_ASSIGN—arg je kazalec na:
struct fpga_fme_port_assign {
__u32 argsz; // v: sizeof(struct fpga_fme_port_assign)
__u32 zastave; // v: mora biti 0
__u32 port_id; // v: ID vrat (od 0) za dodelitev. (moralo je biti
prej izdal FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg je kazalec na:
struct fpga_fme_port_pr {
__u32 argsz; // v: sizeof(struct fpga_fme_port_pr)
__u32 zastave; // v: mora biti 0
__u32 port_id; // v: ID vrat (od 0)
__u32 velikost_medpomnilnika; // in: velikost medpomnilnika bitnega toka v bajtih. Biti mora 4-bajtni
poravnana.
__u64 naslov_medpomnilnika; // v: naslov procesa medpomnilnika bitnega toka
__u64 stanje; // out: stanje napake (bitna maska)
};
Vrata IOCTL
IOCTL-ji, ki so klicani ob odprtju file deskriptor za /dev/intel-fpga-port.k FPGA_GET_API_VERSION—vrne trenutno različico kot celo število, začenši z 0. FPGA_CHECK_EXTENSION—trenutno ni podprto.
FPGA_PORT_GET_INFO—arg je kazalec na:
struct fpga_port_info {
__u32 argsz; // v: sizeof(struct fpga_port_info)
__u32 zastave; // ven: vrne 0
__u32 število_regij; // out: število regij MMIO, 2 (1 za AFU in 1 za
STP)
__u32 num_umsgs; // out: število UMsg-jev, ki jih podpira strojna oprema
};
FPGA_PORT_GET_REGION_INFO—arg je kazalec na:
struct fpga_port_region_info {
__u32 argsz; // v: sizeof(struct fpga_port_region_info)
__u32 zastave; // ven: (bitna maska) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // v: FPGA_PORT_INDEX_UAFU ali FPGA_PORT_INDEX_STP
__u32 oblazinjenje; // v: mora biti 0
velikost __u64; // out: velikost regije MMIO v bajtih
__u64 odmik; // out: odmik regije MMIO od začetka naprave fd
};
FPGA_PORT_DMA_MAP—arg je kazalec na:
struct fpga_port_dma_map {
__u32 argsz; // v: sizeof(struct fpga_port_dma_map)
__u32 zastave; // v: mora biti 0 __u64 user_addr; // v: virtualnem procesu
naslov. Mora biti poravnano s stranjo.
__u64 dolžina; // in: dolžina preslikave v bajtih. Biti mora večkratnik strani
velikost.
__u64 iova; // out: IO virtualni naslov };
FPGA_PORT_DMA_UNMAP—arg je kazalec na:
struct fpga_port_dma_unmap {
__u32 argsz; // v: sizeof(struct fpga_port_dma_unmap)
__u32 zastave; // v: mora biti 0
__u64 iova; // v: IO navidezni naslov, ki ga je vrnil prejšnji
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg mora biti NULL.
- FPGA_PORT_UMSG_ENABLE—arg mora biti NULL.
- FPGA_PORT_UMSG_DISABLE—argi morajo biti NULL.
FPGA_PORT_UMSG_SET_MODE—arg je kazalec na:
struct fpga_port_umsg_cfg {
__u32 argsz; // v: sizeof(struct fpga_port_umsg_cfg)
__u32 zastave; // v: mora biti 0
__u32 namig_bitna slika; // v: bitna slika načina namigovanja UMsg. Označuje, kateri UMsg so
omogočeno.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg mora biti onemogočen pred izdajo tega ioctl.
- Polje iova mora biti dovolj veliko za medpomnilnik za vse UMsg (num_umsgs * PAGE_SIZE).
- Voznikovo upravljanje medpomnilnika označi medpomnilnik kot »v uporabi«.
- Če je iova NULL, katera koli prejšnja regija ni označena kot »v uporabi«.
- arg je kazalec na:
struct fpga_port_umsg_base_addr {- u32 argsz; // v: sizeof(struct fpga_port_umsg_base_addr)
- zastave u32; // v: mora biti 0
- u64 iova; // v: IO virtualni naslov iz FPGA_PORT_DMA_MAP. };
Opomba:
- Če želite počistiti napake vrat, morate napisati natančno bitno masko trenutnih napak, nprample, mačje napake > jasno
- UMsg je podprt samo prek pospeševalnega sklada za procesor Intel Xeon z integrirano FPGA.
sysfs Files
FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | polje mmio | vrsta | dostop |
ports_num | fme_header.capability.num_ports | decimalno int | Samo za branje |
velikost_predpomnilnika | fme_header.capability.cache_size | decimalno int | Samo za branje |
različica | fme_header.capability.fabric_verid | decimalno int | Samo za branje |
socket_id | fme_header.capability.socket_id | decimalno int | Samo za branje |
bitni_id | fme_header.bitstream_id | hex uint64_t | Samo za branje |
bitni_metapodatki | fme_header.bitstream_md | hex uint64_t | Samo za branje |
FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | polje mmio | vrsta | dostop |
prag1 | termalni.prag.tmp_thshold1 | decimalno int | Uporabnik: samo za branje Root: branje-pisanje |
prag2 | termalni.prag.tmp_thshold2 | decimalno int | Uporabnik: samo za branje Root: branje-pisanje |
threshold_trip | termalni.prag.therm_trip_thshold | decimalno int | Samo za branje |
threshold1_reached | termalni.prag.thshold1_status | decimalno int | Samo za branje |
threshold2_reached | termalni.prag.thshold2_status | decimalno int | Samo za branje |
threshold1_policy | termični. threshold.thshold_policy | decimalno int | Uporabnik: samo za branje Root: branje-pisanje |
temperatura | termalni.rdsensor_fm1.fpga_temp | decimalno int | Samo za branje |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | polje mmio | vrsta | dostop |
zaužit | power.status.pwr_consumed | hex uint64_t | Samo za branje |
prag1 | moč.prag.prag1 | hex uint64_t | Uporabnik: samo za branje Root: branje-pisanje |
prag2 | moč.prag.prag2 | hex uint64_t | Uporabnik: samo za branje Root: branje-pisanje |
threshold1_status | power.threshold.threshold1_status | decimalno brez predznaka | Samo za branje |
threshold2_status | power.threshold.threshold2_status | decimalno brez predznaka | Samo za branje |
rtl | power.status.fpga_latency_report | decimalno brez predznaka | Samo za branje |
Globalna napaka FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | polje mmio | vrsta | dostop |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Brati, pisati |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Brati, pisati |
inject_error | gerror.ras_error_inj | hex uint64_t | Brati, pisati |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | polje mmio | vrsta | dostop |
napake | gerror.fme_err | hex uint64_t | Samo za branje |
prva_napaka | gerror.fme_first_err.err_reg_status | hex uint64_t | Samo za branje |
naslednja_napaka | gerror.fme_next_err.err_reg_status | hex uint64_t | Samo za branje |
jasno | Počisti napake, first_error, next_error | različne uint64_t | Samo za pisanje |
Opomba:
Če želite počistiti napake FME, morate napisati natančno bitno masko trenutnih napak, nprample cat napake > jasno.
FME Delna rekonfiguracija sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | polje mmio | vrsta | dostop |
vmesnik_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | šestnajstiški 16-bajtni | Samo za branje |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/ura
sysfs file | polje mmio | vrsta | dostop |
ura | gperf.clk.afu_interf_clock | hex uint64_t | Samo za branje |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ne velja za Acceleration Stack za CPU Intel Xeon s FPGA)
sysfs file | polje mmio | vrsta | dostop |
zamrzniti | gperf.ch_ctl.freeze | decimalno int | Brati, pisati |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Samo za branje |
read_miss | gperf.CACHE_RD_MISS | hex uint64_t | Samo za branje |
write_hit | gperf.CACHE_WR_HIT | hex uint64_t | Samo za branje |
napiši_pogreši | gperf.CACHE_WR_MISS | hex uint64_t | Samo za branje |
hold_request | gperf.CACHE_HOLD_REQ | hex uint64_t | Samo za branje |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Samo za branje |
sysfs file | polje mmio | vrsta | dostop |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Samo za branje |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Samo za branje |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Samo za branje |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ne velja za Acceleration Stack za CPE Intel Xeon s FPGA)
sysfs file | polje mmio | vrsta | dostop |
zamrzniti | gperf.vtd_ctl.freeze | decimalno int | Uporabnik: samo za branje Root: branje-pisanje |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ne velja za pospeševalni sklad za procesor Intel Xeon s FPGA)
sysfs file | polje mmio | vrsta | dostop |
read_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Samo za branje |
pisanje_transakcije | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Samo za branje |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Samo za branje |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Samo za branje |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | polje mmio | vrsta | dostop |
omogočiti | gperf.fab_ctl.(omogočeno) | decimalno int | Uporabnik: samo za branje Root: branje-pisanje |
zamrzniti | gperf.fab_ctl.freeze | decimalno int | Uporabnik: samo za branje Root: branje-pisanje |
pcie0_branje | gperf.FAB_PCIE0_RD | hex uint64_t | Samo za branje |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Samo za branje |
pcie1_branje | gperf.FAB_PCIE1_RD | hex uint64_t | Samo za branje |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Samo za branje |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Samo za branje |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Samo za branje |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | polje mmio | vrsta | dostop |
pcie0_branje | gperf.FAB_PCIE0_RD | hex uint64_t | Samo za branje |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Samo za branje |
pcie1_branje | gperf.FAB_PCIE1_RD | hex uint64_t | Samo za branje |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Samo za branje |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Samo za branje |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Samo za branje |
Glava vrat sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | polje mmio | vrsta | dostop |
id | glava_vrat.zmogljivost.številka_vrat | decimalno int | Samo za branje |
ltr | port_header.control.latency_tolerance | decimalno int | Samo za branje |
Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | polje mmio | vrsta | dostop |
afu_id | afu_header.guid | šestnajstiški 16-bajtni | Samo za branje |
Napaka vrat sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | polje mmio | vrsta | dostop |
napake | napaka.napaka_porta | hex uint64_t | Samo za branje |
prva_napaka | napaka.prva_port_napaka | hex uint64_t | Samo za branje |
prva_napačna_zahteva | napaka.malreq | šestnajstiški 16-bajtni | Samo za branje |
jasno | napaka. (vse napake) | različne uint64_t | Samo za pisanje |
Opomba:
Če želite počistiti napake vrat, morate napisati natančno bitno masko trenutnih napak, nprample cat napake > jasno.
Zgodovina revizij
Različica dokumenta | Spremembe |
2017.10.02 | Začetna izdaja. |
Priročnik za arhitekturo gonilnikov naprav Intel FPGA Linux OPAE
Dokumenti / Viri
![]() |
Arhitektura gonilnikov naprav intel OPAE FPGA Linux [pdf] Uporabniški priročnik OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |