intel-logo

intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

OPAE Intel FPGA -ohjain tarjoaa käyttöliittymät käyttäjäavaruussovelluksille FPGA-kiihdyttimien määrittämiseen, luetteloimiseen, avaamiseen ja käyttämiseen Intel FPGA -ratkaisuilla varustetuilla alustoilla ja mahdollistaa järjestelmätason hallintatoiminnot, kuten FPGA-uudelleenmäärityksen, virranhallinnan ja virtualisoinnin.

Laitteistoarkkitehtuuri

Käyttöjärjestelmän näkökulmasta viewFPGA-laitteisto näkyy tavallisena PCIe-laitteena. FPGA-laitteen muisti on järjestetty käyttämällä ennalta määritettyä tietorakennetta (Device Feature List). FPGA-laitteen tukemat ominaisuudet näkyvät näiden tietorakenteiden kautta, kuten alla olevassa kuvassa näkyy:

FPGA PCIe laite

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

Ohjain tukee PCIe SR-IOV:ta virtuaalisten funktioiden (VF) luomiseen, joita voidaan käyttää yksittäisten kiihdyttimien määrittämiseen virtuaalikoneen.

Intel Corporation. Kaikki oikeudet pidätetään. Intel, Intel-logo ja muut Intel-merkit ovat Intel Corporationin tai sen tytäryhtiöiden tavaramerkkejä. Intel takaa FPGA- ja puolijohdetuotteidensa suorituskyvyn nykyisten vaatimusten mukaisesti Intelin vakiotakuun mukaisesti, mutta pidättää oikeuden tehdä muutoksia tuotteisiin ja palveluihin milloin tahansa ilman erillistä ilmoitusta. Intel ei ota minkään tässä kuvatun tiedon, tuotteen tai palvelun soveltamisesta tai käytöstä johtuvaa vastuuta tai vastuuta, ellei Intel ole nimenomaisesti kirjallisesti suostunut siihen. Intelin asiakkaita kehotetaan hankkimaan uusin versio laitteen teknisistä tiedoista ennen kuin he luottavat julkaistuihin tietoihin ja ennen kuin he tilaavat tuotteita tai palveluita.

Muita nimiä ja merkkejä voidaan väittää muiden omaisuudeksi.

Virtualisoitu FPGA PCIe -laite

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

FPGA Management Engine (FME)
FPGA Management Engine suorittaa tehon ja lämmön hallinnan, virheraportoinnin, uudelleenkonfiguroinnin, suorituskyvyn raportoinnin ja muita infrastruktuuritoimintoja. Jokaisessa FPGA:ssa on yksi FME, johon päästään aina fyysisen toiminnon (PF) kautta. Käyttäjätilasovellukset voivat hankkia yksinoikeudella pääsyn FME:hen käyttämällä open()-toimintoa ja vapauttaa sen käyttämällä close()-toimintoa etuoikeutettuna käyttäjänä (root).

Portti
Portti edustaa liitäntää staattisen FPGA-kudoksen ("FPGA Interface Manager (FIM)") ja kiihdytintoiminnon (AF) sisältävän osittain uudelleen konfiguroitavan alueen välillä. Portti ohjaa tietoliikennettä ohjelmistosta kiihdytin ja paljastaa ominaisuuksia, kuten nollauksen ja virheenkorjauksen. PCIe-laitteella voi olla useita portteja, ja jokainen portti voidaan paljastaa VF:n kautta määrittämällä se käyttämällä FME-laitteen FPGA_FME_PORT_ASSIGN ioctl:ää.

Kiihdytystoiminto (AF) -yksikkö

  • Kiihdytintoimintoyksikkö (AF) on liitetty porttiin ja se paljastaa 256K MMIO-alueen, jota käytetään kiihdytinkohtaisissa ohjausrekistereissä.
  • Käyttäjätilasovellukset voivat hankkia yksinoikeudella pääsyn porttiin liitetylle AFU:lle käyttämällä porttilaitteen open()-komentoa ja vapauttaa sen käyttämällä close().
  • Käyttäjätilasovellukset voivat myös mmap()-kiihdytin MMIO-alueita.

Osittainen uudelleenkonfigurointi
Kuten edellä mainittiin, kiihdytin voidaan konfiguroida uudelleen määrittämällä kiihdytintoiminto (AF) osittain uudelleen. file. Kiihdytystoiminnon (AF) on oltava luotu FPGA:n tarkalle FIM-alueelle ja kohdennetulle staattiselle alueelle (Portille); muuten uudelleenkonfigurointi epäonnistuu ja saattaa aiheuttaa järjestelmän epävakautta. Tämä yhteensopivuus voidaan tarkistaa vertaamalla AF-otsikossa mainittua liitäntätunnusta FME:n sysfs:n kautta paljastamaan liitäntätunnukseen. Tämän tarkistuksen tekee yleensä käyttäjäavaruus ennen uudelleenmäärityksen IOCTL:n kutsumista.

Huomautus:
Tällä hetkellä kaikki FPGA:ta käyttävät ohjelmistot, mukaan lukien virtualisoidussa isännässä toimivat, on suljettava ennen osittaisen uudelleenmäärityksen yrittämistä. Vaiheet olisivat:

  1. Pura kuljettaja vieraasta
  2. Irrota VF vieraslaitteesta
  3. Poista SR-IOV käytöstä
  4. Suorita osittainen uudelleenkonfigurointi
  5. Ota SR-IOV käyttöön
  6. Liitä VF vieraaseen
  7. Lataa kuljettaja vieraaseen

FPGA virtualisointi
Jotta kiihdytin voidaan käyttää virtuaalikoneessa toimivista sovelluksista, vastaava AFU:n portti on määritettävä VF:lle seuraavien vaiheiden avulla:

  1. PF omistaa oletuksena kaikki AFU-portit. Kaikki portit, jotka on määritettävä uudelleen VF:lle, on ensin vapautettava PF:stä FME-laitteen FPGA_FME_PORT_RELEASE ioctl:n kautta.
  2. Kun N porttia vapautetaan PF:stä, alla olevaa komentoa voidaan käyttää SRIOV:n ja VF:n käyttöönottoon. Jokaisella VF:llä on vain yksi AFU-portti. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Ohjaa VF:ien kautta virtuaalikoneille.
  4. VF:n alainen AFU on käytettävissä VM:n sovelluksista (käyttämällä samaa ohjainta VF:n sisällä).

Huomautus:
FME:tä ei voi määrittää VF:lle, joten PR ja muut hallintatoiminnot ovat käytettävissä vain PF:n kautta.

Kuljettajaorganisaatio

PCIe-moduulin laiteohjain

Kuljettajaorganisaatio

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

FPGA-laitteet näkyvät tavallisina PCIe-laitteina; näin ollen FPGA PCIe -laiteohjain (intel-FPGA-PCI.ko) ladataan aina ensin, kun FPGA PCIe PF tai VF havaitaan. Tällä ohjaimella on infrastruktuurin rooli ohjainarkkitehtuurissa. Se:

  • Luo FPGA-säilölaitteen ominaisuuslaitteiden yläpääksi.
  • Kävelee PCIe-laitteen BAR-muistiin toteutetun Device Feature List -luettelon läpi löytääkseen ominaisuuslaitteet ja niiden aliominaisuudet ja luodakseen niille alustalaitteita konttilaitteen alle.
  • Tukee SR-IOV:ta.
  • Esittelee ominaisuuslaiteinfrastruktuurin, joka tiivistää aliominaisuuksien toiminnot ja paljastaa yleiset toiminnot ominaisuuslaiteajureille.

PCIe-moduulin laiteohjaintoiminnot

  • Sisältää PCIe-etsinnän, laiteluettelon ja ominaisuushaun.
  • Luo sysfs-hakemistoja päälaitteelle, FPGA Management Enginelle (FME) ja portille.
  • Luo alustaohjaininstanssit, jolloin Linux-ydin lataa vastaavat alustamoduulin ohjaimet.

FME Platform Module -laiteohjain

  • Tehon ja lämmön hallinta, virheraportointi, suorituskykyraportointi ja muut infrastruktuuritoiminnot. Voit käyttää näitä toimintoja FME-ohjaimen paljastamien sysf-liitäntöjen kautta.
  • Osittainen uudelleenkonfigurointi. FME-ajuri rekisteröi FPGA Managerin PR-aliominaisuuksien alustuksen aikana; Kun se vastaanottaa sinulta FPGA_FME_PORT_PR ioctl:n, se kutsuu yhteisen rajapintatoiminnon FPGA Managerilta suorittaakseen bittivirran osittaisen uudelleenmäärityksen tiettyyn porttiin.
  • Porttien hallinta virtualisointia varten. FME-ajuri sisältää kaksi ioctl:ää, FPGA_FME_PORT_RELEASE, jotka vapauttavat annetun portin PF:stä; ja FPGA_FME_PORT_ASSIGN, joka määrittää portin takaisin PF:lle. Kun portti on vapautettu PF:stä, se voidaan määrittää VF:lle PCIe-ohjaimen tarjoamien SR-IOV-liitäntöjen kautta. Lisätietoja on kohdassa "FPGA-virtualisointi".

FME-alustamoduulin laiteohjaintoiminnot

  • Luo FME-merkin laitesolmun.
  • Luo FME sysfs files ja toteuttaa FME sysfs file lisävarusteita.
  • Toteuttaa FME:n yksityisen ominaisuuden aliohjaimet.
  • FME:n yksityisen ominaisuuden aliohjaimet:
    • FME-otsikko
    • Lämmönhallinta
    • Virranhallinta
    • Maailmanlaajuinen virhe
    • Osittainen uudelleenkonfigurointi
    • Globaali suorituskyky

Port Platform Module Device Driver
FME-ajurin tapaan FPGA-portin (ja AFU) -ohjain (intel-fpga-afu.ko) tutkitaan, kun porttialustan laite on luotu. Tämän moduulin päätehtävä on tarjota käyttöliittymä käyttäjäavaruussovelluksille yksittäisten kiihdyttimien käyttöön, mukaan lukien portin perusasetusten palautusohjaus, AFU MMIO -alueen vienti, DMA-puskurin kartoituspalvelu, UMsg(1)-ilmoitus ja etävirheenkorjaustoiminnot ( katso yllä).

UMsg:tä tukee vain Acceleration Stack for Intel Xeon® -prosessori, jossa on integroitu FPGA.

Porttialustan moduulin laiteohjaimen toiminnot

  • Luo porttimerkkilaitesolmun.
  • Luo portin sysfs files ja toteuttaa Port sysfs file lisävarusteita.
  • Toteuttaa Portin yksityisen ominaisuuden aliohjaimet.
  • Portti yksityisen ominaisuuden aliohjaimet:
    • Portin otsikko
    • AFU
    • Porttivirhe
    • UMsg(2)
    • Signaali Napauta

Sovellus FPGA Device Enumeration
Tämä osio esittelee, kuinka sovellukset luettelevat FPGA-laitteen sysfs-hierarkiassa hakemistossa /sys/class/fpga. ExampAlla on kaksi Intel FPGA -laitetta asennettuna isäntään. Jokaisessa FPGA-laitteessa on yksi FME ja kaksi porttia (AFU). Jokaiselle FPGA-laitteelle luodaan laitehakemisto /sys/class/fpga:

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

Jokaisella solmulla on yksi FME ja kaksi porttia (AFU) lapsilaitteina:
/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

Yleensä FME/Port sysfs -liitännät on nimetty seuraavasti:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

I numeroimalla peräkkäin kaikki konttilaitteet, j peräkkäin numeroimalla FME:t ja k peräkkäin numeroimalla kaikki portit.

Ioctl()- ja mmap():ille käytettyihin laitesolmuihin voidaan viitata komennolla:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe-ajurien luettelo
Tämä osio antaa yhteenvedonview intel-fpga-pci.ko:n suorittaman laiteluettelon koodivuosta. Tärkeimmät tietorakenteet ja -toiminnot on korostettu. Tätä osiota on parasta seurata, kun viewmukana tulevan lähdekoodin (pcie.c).

Luettelotietorakenteet

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
staattinen rakenne idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nimi;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
staattinen rakenneluokka *fpga_class;
staattinen rakenne 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,}
};
staattinen rakenne 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 laite_tunnus;
struct laite *fme_dev;
rakenne mutex lukita;
struct list_head port_dev_list;
int julkaistu_portin_numero;
struct lista_pääalueet;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int nykyinen_palkki;
void __iomem *pfme_hdr;
struct laite *parent_dev;
struct alusta_laite *ominaisuus_dev;
};

Luettelovirta

  • ccidrv_init()
    • Alusta fpga_ids komennolla idr_init().
    • Alusta fpga_chrdevs[i].devt komennolla alloc_chrdev_region().
    • Alusta fpga_class komennolla class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Ota PCI-laite käyttöön, pyydä pääsyä sen alueille, aseta PCI-isäntätila ja määritä DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Varaa rakenne build_feature_devs_info, alusta se.
      .parent_dev asetetaan ylätason sysfs-hakemistoon (intel-fpga-dev.id), joka sisältää FME- ja Port sysfs -hakemistot.
  • parse_feature_list()
    • Kävele BAR0 Device Feature List löytääksesi FME:n, portin ja niiden yksityiset ominaisuudet.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Kun FME kohdataan:
  • build_info_create_dev()
    • Varaa FME:lle alustalaite, joka tallennetaan osoitteeseen build_feature_devs_info.feature_dev.
    • feature_dev.id alustetaan idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent -asetuksena on build_feature_devs_info.parent_dev.
    • Varaa joukko struct-resursseja tiedostossa feature_dev.resource.
  • Varaa struct feature_platform_data, alusta se ja tallenna osoitin hakemistoon feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Alusta feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Alusta feature_platform_data.features[FME_FEATURE_ID_HEADER], kaikki paitsi .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Kun portti havaitaan:
  • build_info_create_dev()
    • Varaa portille alustalaite, joka tallennetaan osoitteeseen build_feature_devs_info.feature_dev.
    • feature_dev.id alustetaan idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent -asetuksena on build_feature_devs_info.parent_dev.
    • Varaa joukko struct-resursseja tiedostossa feature_dev.resource.
    • Varaa struct feature_platform_data, alusta se ja tallenna osoitin hakemistoon feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Lisää portin struct feature_platform_data.node porttiluetteloon struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Alusta feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Alusta feature_platform_data.features[PORT_FEATURE_ID_HEADER], kaikki paitsi .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Kun AFU kohdataan:
  • create_feature_instance() build_info_add_sub_feature()
    • Alusta feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Alusta feature_platform_data.features[PORT_FEATURE_ID_UAFU], kaikki paitsi .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Kun FME:n yksityinen ominaisuus havaitaan:
  • create_feature_instance() build_info_add_sub_feature()
    • Alusta feature_dev.resource[id].
  • feature_platform_data_add()
    • Alusta feature_platform_data.features[id], kaikki paitsi .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Kun portin yksityinen ominaisuus havaitaan: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Alusta feature_platform_data.features[id], kaikki paitsi .fops.
  • parse_ports_from_fme()
    • Jos ohjain on ladattu fyysiseen toimintoon (PF), niin:
  • Suorita parse_feature_list()-kulku jokaisessa FME-otsikossa kuvatussa portissa.
  • Käytä otsikon jokaisessa porttimerkinnässä mainittua palkkia.

FME-alustan laitteen alustus
Tämä osio antaa yhteenvedonview intel-fpga-fme.ko:n suorittaman FME-laitteen alustuksen koodivuosta. Tärkeimmät tietorakenteet ja -toiminnot on korostettu. Tätä osiota on parasta seurata, kun viewmukana tulevan lähdekoodin (fme-main.c).

FME-alustan laitetietorakenteet

struct feature_ops {
int (*init)(struct platform_device *pdev, struct-ominaisuus *ominaisuus);
int (*uinit)(struct platform_device *pdev, struct-ominaisuus *ominaisuus);
pitkä (*ioctl)(struct platform_device *pdev, struct-ominaisuus *ominaisuus,
unsigned int cmd, unsigned long arg);
int (*testi)(struct platform_device *pdev, struct-ominaisuus *ominaisuus);
};
struct ominaisuus {
const char *nimi;
int resurssihakemisto;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
rakenne mutex lukita;
allekirjoittamaton pitkä dev_status;
struct cdev cdev;
struct alusta_laite *dev;
allekirjoittamaton int disable_count;
mitätön *yksityinen;
int num;
int (*config_port)(rakenne alusta_laite *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); struct
ominaisuusominaisuudet[0];
};
struct perf_object {
int id;
const struct attribuuttiryhmä **attr_groups;
struct laite *fme_dev;
struct list_head node;
struct list_head lapset;
struct kobject kobj;
};
struct fpga_fme {
u8 portin_id;
u64 pr_err;
struct laite *dev_err;
struct perf_object *perf_dev;
struct ominaisuus_platform_data *pdata;
};

FME Platform Device Initialization Flow

FME:n alustuskulkuintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Alusta struct fpga_fme ja tallenna se feature_platform_data.private-kenttään.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Tallenna struct feature_ops jokaisen täytetyn ominaisuuden kohtaan feature_platform_data.features.
    • Kutsu testifunktio, jos sellainen on, structista.
    • Kutsu init-funktio structista.
  • fme_probe() fpga_register_dev_ops()
    • Luo FME-merkkilaitesolmu ja rekisteröi rakenteen file_toiminnot.

Porttialustan laitteen alustus
Tämä osio antaa yhteenvedonview porttilaitteen alustuksen koodikulusta, jonka suorittaa intel-fpga-afu.ko. Tärkeimmät tietorakenteet ja -toiminnot on korostettu. Tätä osiota on parasta seurata, kun viewmukana tulevan lähdekoodin (afu.c).

Porttialustan laitetietorakenteet

struct feature_ops {
int (*init)(struct platform_device *pdev, struct-ominaisuus *ominaisuus);
int (*uinit)(struct platform_device *pdev, struct-ominaisuus *ominaisuus);
pitkä (*ioctl)(struct platform_device *pdev, struct-ominaisuus *ominaisuus,
unsigned int cmd, unsigned long arg);
int (*testi)(struct platform_device *pdev, struct-ominaisuus *ominaisuus);
};
struct ominaisuus {
const char *nimi;
int resurssihakemisto;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
rakenne mutex lukita;
allekirjoittamaton pitkä dev_status;
struct cdev cdev;
struct alusta_laite *dev;
allekirjoittamaton int disable_count;
mitätön *yksityinen;
int num;
int (*config_port)(rakenne alusta_laite *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
struct ominaisuuden ominaisuudet[0];
};
struct fpga_afu_region {
u32-indeksi;
u32-liput;
koko u64;
u64 offset;
u64 phys;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 pituus;
u64 iova;
struct sivu **sivut;
struct rb_node solmu;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int alueiden_määrä;
u8 num_umsgs;
struct lista_pääalueet;
struct rb_root dma_regions;
struct ominaisuus_platform_data *pdata;
};

Porttialustan laitteen alustuskulku

Portin alustusvirtaintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Alusta fpga_afu-rakenne ja tallenna se feature_platform_data.private-kenttään.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Tallenna struct feature_ops jokaisen täytetyn ominaisuuden kohtaan feature_platform_data.features.
    • Kutsu testifunktio, jos sellainen on, structista.
    • Kutsu init-funktio structista.
  • afu_probe() fpga_register_dev_ops()
    • Luo porttimerkkilaitesolmu ja rekisteröi rakenteen file_toiminnot.

FME IOCTLs
IOCTL:t, joita kutsutaan auki file descriptor for /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—palauta nykyinen versio kokonaislukuna, alkaen 0.

FPGA_CHECK_EXTENSION — ei tällä hetkellä tuettu.

FPGA_FME_PORT_RELEASE — arg on osoitin:

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32-liput; // in: täytyy olla 0
__u32 portin_id; // sisään: portin ID (0:sta) julkaisuun.
};

FPGA_FME_PORT_ASSIGN — arg on osoitin:

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32-liput; // in: täytyy olla 0
__u32 portin_id; // in: portin tunnus (0:sta) määritettäväksi. (täytyi olla
aiemmin julkaissut FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR — arg on osoitin:

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32-liput; // in: täytyy olla 0
__u32 portin_id; // sisään: portin tunnus (0:sta)
__u32 puskurin_koko; // in: bittivirtapuskurin koko tavuina. Täytyy olla 4-tavuinen
kohdistettu.
__u64 puskurin_osoite; // sisään: bittivirtapuskurin prosessiosoite
__u64-tila; // ulos: virhetila (bittimaski)
};

Portti IOCTLs
IOCTL:t, joita kutsutaan auki file descriptor for /dev/intel-fpga-port.k FPGA_GET_API_VERSION—palauta nykyinen versio kokonaislukuna, alkaen 0. FPGA_CHECK_EXTENSION—ei tällä hetkellä tuettu.

FPGA_PORT_GET_INFO — arg on osoitin:

struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32-liput; // ulos: palauttaa 0
__u32 num_regions; // ulos: MMIO-alueiden lukumäärä, 2 (1 AFU:lle ja 1
STP)
__u32 num_umsgs; // ulos: laitteiston tukemien UMsg-viestien lukumäärä
};

FPGA_PORT_GET_REGION_INFO — arg on osoitin:

struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 liput; // ulos: (bittipeite) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32-indeksi; // kohteessa: FPGA_PORT_INDEX_UAFU tai FPGA_PORT_INDEX_STP
__u32 täyte; // in: täytyy olla 0
__u64 koko; // ulos: MMIO-alueen koko tavuina
__u64 offset; // ulos: MMIO-alueen siirtymä laitteen alusta fd
};

FPGA_PORT_DMA_MAP — arg on osoitin:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32-liput; // in: täytyy olla 0 __u64 user_addr; // in: Process virtual
osoite. On oltava tasattu sivulle.
__u64 pituus; // in: kartoituksen pituus tavuina. On oltava monisivuinen
koko.
__u64 iova; // ulos: IO-virtuaaliosoite };

FPGA_PORT_DMA_UNMAP — arg on osoitin:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32-liput; // in: täytyy olla 0
__u64 iova; // in: Edellisen palauttama IO-virtuaalinen osoite
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET — argin on oltava NULL.
  • FPGA_PORT_UMSG_ENABLE — arg:n on oltava NULL.
  • FPGA_PORT_UMSG_DISABLE — argin on oltava NULL.

FPGA_PORT_UMSG_SET_MODE — arg on osoitin:

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32-liput; // in: täytyy olla 0
__u32 vihje_bittikartta; // in: UMsg-vihjetilan bittikartta. Ilmaisee mitkä UMsg:t ovat
käytössä.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg on poistettava käytöstä ennen tämän ioctl:n antamista.
  • Iova-kentän on oltava riittävän suuri puskurille kaikille UMsg:ille (num_umsgs * PAGE_SIZE).
    • Kuljettajan puskurinhallinta merkitsee puskurin "käytössä".
    • Jos iova on NULL, kaikki aikaisemmat alueet ovat pois käytöstä "käytössä".
  • arg on osoitin:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • u32-liput; // in: täytyy olla 0
    • u64 iova; // sisään: IO-virtuaalinen osoite FPGA_PORT_DMA_MAP:sta. };

Huomautus:

  • Porttivirheiden poistamiseksi sinun on kirjoitettava nykyisten virheiden tarkka bittimaski, esimample, cat errors > selvä
  • UMsg:tä tukee vain Acceleration Stack for Intel Xeon -prosessori, jossa on integroitu FPGA.

sysfs Files

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

sysfs file mmio kenttä tyyppi pääsy
porttien_numero fme_header.capability.num_ports desimaali int Vain luku
välimuistin_koko fme_header.capability.cache_size desimaali int Vain luku
versio fme_header.capability.fabric_verid desimaali int Vain luku
socket_id fme_header.capability.socket_id desimaali int Vain luku
bitstream_id fme_header.bitstream_id hex uint64_t Vain luku
bitstream_metadata fme_header.bitstream_md hex uint64_t Vain luku

FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio kenttä tyyppi pääsy
kynnys1 thermo.threshold.tmp_thshold1 desimaali int Käyttäjä: Vain luku Root: luku-kirjoitus
kynnys2 thermo.threshold.tmp_thshold2 desimaali int Käyttäjä: Vain luku Root: luku-kirjoitus
threshold_trip thermo.threshold.therm_trip_thshold desimaali int Vain luku
threshold1_reached thermo.threshold.thshold1_status desimaali int Vain luku
threshold2_reached thermo.threshold.thshold2_status desimaali int Vain luku
kynnys1_käytäntö lämpö. threshold.thshold_policy desimaali int Käyttäjä: Vain luku Root: luku-kirjoitus
lämpötila thermo.rdsensor_fm1.fpga_temp desimaali int Vain luku

FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio kenttä tyyppi pääsy
kulutettu power.status.pwr_consumed hex uint64_t Vain luku
kynnys1 teho.kynnys.kynnys1 hex uint64_t Käyttäjä: Vain luku Root: luku-kirjoitus
kynnys2 teho.kynnys.kynnys2 hex uint64_t Käyttäjä: Vain luku Root: luku-kirjoitus
kynnys1_tila power.threshold.threshold1_status desimaali allekirjoittamaton Vain luku
kynnys2_tila power.threshold.threshold2_status desimaali allekirjoittamaton Vain luku
rtl power.status.fpga_latency_report desimaali allekirjoittamaton Vain luku

FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio kenttä tyyppi pääsy
pcie0_errors gerror.pcie0_err hex uint64_t Lukea kirjoittaa
pcie1_errors gerror.pcie1_err hex uint64_t Lukea kirjoittaa
inject_error gerror.ras_error_inj hex uint64_t Lukea kirjoittaa

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

sysfs file mmio kenttä tyyppi pääsy
virheitä gerror.fme_err hex uint64_t Vain luku
ensimmäinen_virhe gerror.fme_first_err.err_reg_status hex uint64_t Vain luku
seuraava_virhe gerror.fme_next_err.err_reg_status hex uint64_t Vain luku
selkeä Poistaa virheet, first_error, next_error erilaisia ​​uint64_t Vain kirjoitus

Huomautus:
FME-virheiden poistamiseksi sinun on kirjoitettava nykyisten virheiden tarkka bittimaski, esimample cat errors > selvä.

FME Partial Reconfiguration sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio kenttä tyyppi pääsy
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l heksadesimaali 16 tavua Vain luku

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

sysfs file mmio kenttä tyyppi pääsy
kello gperf.clk.afu_interf_clock hex uint64_t Vain luku

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ei kelpaa kiihdytyspinoon Intel Xeon -suorittimelle, jossa on FPGA)

sysfs file mmio kenttä tyyppi pääsy
jäädyttää gperf.ch_ctl.freeze desimaali int Lukea kirjoittaa
lue_osuma gperf.CACHE_RD_HIT hex uint64_t Vain luku
read_miss gperf.CACHE_RD_MISS hex uint64_t Vain luku
write_hit gperf.CACHE_WR_HIT hex uint64_t Vain luku
write_miss gperf.CACHE_WR_MISS hex uint64_t Vain luku
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Vain luku
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Vain luku
sysfs file mmio kenttä tyyppi pääsy
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Vain luku
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Vain luku
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Vain luku

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ei kelpaa kiihdytyspinoon Intel Xeon -suorittimelle, jossa on FPGA)

sysfs file mmio kenttä tyyppi pääsy
jäädyttää gperf.vtd_ctl.freeze desimaali int Käyttäjä: Vain luku Root: luku-kirjoitus

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ei kelpaa kiihdytyspinoon Intel Xeon -suorittimelle, jossa on FPGA)

sysfs file mmio kenttä tyyppi pääsy
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Vain luku
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Vain luku
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Vain luku
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Vain luku

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

sysfs file mmio kenttä tyyppi pääsy
ota käyttöön gperf.fab_ctl.(käytössä) desimaali int Käyttäjä: Vain luku Root: luku-kirjoitus
jäädyttää gperf.fab_ctl.freeze desimaali int Käyttäjä: Vain luku Root: luku-kirjoitus
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Vain luku
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Vain luku
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Vain luku
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Vain luku
upi_read gperf.FAB_UPI_RD hex uint64_t Vain luku
upi_write gperf.FAB_UPI_WR hex uint64_t Vain luku

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

sysfs file mmio kenttä tyyppi pääsy
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Vain luku
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Vain luku
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Vain luku
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Vain luku
upi_read gperf.FAB_UPI_RD hex uint64_t Vain luku
upi_write gperf.FAB_UPI_WR hex uint64_t Vain luku

Portin otsikko sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio kenttä tyyppi pääsy
id port_header.capability.port_number desimaali int Vain luku
ltr port_header.control.latency_tolerance desimaali int Vain luku

Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio kenttä tyyppi pääsy
afu_id afu_header.guid heksadesimaali 16 tavua Vain luku

Porttivirhe sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio kenttä tyyppi pääsy
virheitä perror.port_error hex uint64_t Vain luku
ensimmäinen_virhe perror.port_first_error hex uint64_t Vain luku
ensimmäinen_virheellisesti muotoiltu_vaatimus perror.malreq heksadesimaali 16 tavua Vain luku
selkeä virhe. (kaikki virheet) erilaisia ​​uint64_t Vain kirjoitus

Huomautus:
Porttivirheiden poistamiseksi sinun on kirjoitettava nykyisten virheiden tarkka bittimaski, esimample cat errors > selvä.

Versiohistoria

Asiakirjan versio Muutokset
2017.10.02 Ensimmäinen julkaisu.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Asiakirjat / Resurssit

intel OPAE FPGA Linux Device Driver Architecture [pdfKäyttöopas
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Viitteet

Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *