intel-logo

Arhitektura gonilnikov naprav intel OPAE FPGA Linux

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

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

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

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

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

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:

  1. Odstranite gonilnik iz gosta
  2. Odklopite VF iz gosta
  3. Onemogoči SR-IOV
  4. Izvedite delno rekonfiguracijo
  5. Omogoči SR-IOV
  6. Priključite VF na gosta
  7. 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:

  1. 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.
  2. 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
  3. Prehod skozi VF do VM.
  4. 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

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

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.
  • 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 FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • 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 vratintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • 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

Reference

Pustite komentar

Vaš elektronski naslov ne bo objavljen. Obvezna polja so označena *