intel-logo

intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux-toestelbestuurderargitektuur

Die OPAE Intel FPGA-bestuurder verskaf koppelvlakke vir gebruikersruimte-toepassings om FPGA-versnellers op te stel, op te som, oop te maak en toegang te verkry op platforms wat toegerus is met Intel FPGA-oplossings en stel stelselvlakbestuursfunksies soos FPGA-herkonfigurasie, kragbestuur en virtualisering moontlik.

Hardeware argitektuur

Van die OS se punt van view, verskyn die FPGA-hardeware as 'n gewone PCIe-toestel. Die FPGA-toestelgeheue word georganiseer met behulp van 'n voorafbepaalde datastruktuur (Device Feature List). Eienskappe wat deur die FPGA-toestel ondersteun word, word deur hierdie datastrukture blootgestel, soos hieronder in die volgende figuur geïllustreer:

FPGA PCIe-toestel

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

Die bestuurder ondersteun PCIe SR-IOV om virtuele funksies (VF's) te skep wat gebruik kan word om individuele versnellers aan virtuele masjiene toe te wys.

Intel Corporation. Alle regte voorbehou. Intel, die Intel-logo en ander Intel-merke is handelsmerke van Intel Corporation of sy filiale. Intel waarborg die werkverrigting van sy FPGA- en halfgeleierprodukte volgens huidige spesifikasies in ooreenstemming met Intel se standaardwaarborg, maar behou die reg voor om enige tyd sonder kennisgewing veranderinge aan enige produkte en dienste aan te bring. Intel aanvaar geen verantwoordelikheid of aanspreeklikheid wat voortspruit uit die toepassing of gebruik van enige inligting, produk of diens wat hierin beskryf word nie, behalwe soos uitdruklik skriftelik deur Intel ooreengekom. Intel-kliënte word aangeraai om die nuutste weergawe van toestelspesifikasies te bekom voordat hulle op enige gepubliseerde inligting staatmaak en voordat bestellings vir produkte of dienste geplaas word.

Ander name en handelsmerke kan as die eiendom van ander geëis word.

Gevirtualiseerde FPGA PCIe-toestel

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

FPGA Management Engine (FME)
Die FPGA Management Engine voer krag- en termiese bestuur, foutrapportering, herkonfigurasie, prestasieverslaggewing en ander infrastruktuurfunksies uit. Elke FPGA het een FME, wat altyd deur die Fisiese Funksie (PF) verkry word. Gebruikersruimte-toepassings kan eksklusiewe toegang tot die FME verkry deur gebruik te maak van open(), en dit vry te stel met close() as 'n bevoorregte gebruiker (wortel).

Port
'n Poort verteenwoordig die koppelvlak tussen die statiese FPGA-stof (die "FPGA Interface Manager (FIM)") en 'n gedeeltelik herkonfigureerbare streek wat 'n versnellerfunksie (AF) bevat. Die Port beheer die kommunikasie van sagteware na die versneller en stel kenmerke soos herstel en ontfout bloot. 'n PCIe-toestel kan verskeie poorte hê, en elke poort kan deur 'n VF blootgestel word deur dit toe te wys deur die FPGA_FME_PORT_ASSIGN ioctl op die FME-toestel te gebruik.

Versnellerfunksie (AF) Eenheid

  • 'n Versnellerfunksie (AF) Eenheid is aan 'n poort gekoppel en stel 'n 256K MMIO-gebied bloot wat gebruik kan word vir versneller-spesifieke beheerregisters.
  • Gebruikersruimte-toepassings kan eksklusiewe toegang verkry tot 'n AFU wat aan 'n poort gekoppel is deur oop() op die poorttoestel te gebruik, en dit vrystel met close().
  • Gebruikersruimte-toepassings kan ook mmap () versneller MMIO streke.

Gedeeltelike herkonfigurasie
Soos hierbo genoem, kan versnellers herkonfigureer word deur gedeeltelike herkonfigurasie van 'n versnellerfunksie (AF) file. Die versnellerfunksie (AF) moes gegenereer gewees het vir die presiese FIM en geteikende statiese streek (poort) van die FPGA; anders sal die herkonfigurasie-operasie misluk en moontlik stelselonstabiliteit veroorsaak. Hierdie verenigbaarheid kan nagegaan word deur die koppelvlak-ID wat in die AF-opskrif aangeteken is, te vergelyk met die koppelvlak-ID wat deur die FME deur sysfs blootgestel is. Hierdie kontrole word gewoonlik deur gebruikersspasie gedoen voordat die herkonfigurasie IOCTL geroep word.

Let wel:
Tans moet enige sagtewareprogram wat toegang tot die FPGA verkry, insluitend dié wat in 'n gevirtualiseerde gasheer loop, gesluit word voordat 'n gedeeltelike herkonfigurasie probeer word. Die stappe sou wees:

  1. Laai die bestuurder van die gas af
  2. Ontkoppel die VF van die gas
  3. Deaktiveer SR-IOV
  4. Voer gedeeltelike herkonfigurasie uit
  5. Aktiveer SR-IOV
  6. Prop die VF aan die gas
  7. Laai die bestuurder in die gas

FPGA-virtualisering
Om toegang tot 'n versneller moontlik te maak vanaf toepassings wat in 'n VM loop, moet die onderskeie AFU se poort aan 'n VF toegewys word deur die volgende stappe te gebruik:

  1. Die PF besit by verstek alle AFU-poorte. Enige poort wat aan 'n VF hertoegewys moet word, moet eers van die PF vrygestel word deur die FPGA_FME_PORT_RELEASE ioctl op die FME-toestel.
  2. Sodra N poorte van die PF vrygestel is, kan die opdrag hieronder gebruik word om SRIOV en VF's te aktiveer. Elke VF besit slegs een hawe met AFU. eggo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Gaan deur die VF's na VM's.
  4. Die AFU onder VF is toeganklik vanaf toepassings in VM (met dieselfde bestuurder binne die VF).

Let wel:
'n FME kan nie aan 'n VF toegewys word nie, dus is PR en ander bestuursfunksies slegs deur die PF beskikbaar.

Bestuurder organisasie

PCIe-module-toestelbestuurder

Bestuurder organisasie

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

Die FPGA-toestelle verskyn as gewone PCIe-toestelle; dus word die FPGA PCIe-toestelbestuurder (intel-FPGA-PCI.ko) altyd eerste gelaai sodra 'n FPGA PCIe PF of VF opgespoor word. Hierdie bestuurder speel 'n infrastruktuurrol in die bestuurderargitektuur. Dit:

  • Skep 'n FPGA-houertoestel as 'n ouer van die kenmerktoestelle.
  • Loop deur die Toestelkenmerklys, wat in PCIe-toestel BAR-geheue geïmplementeer is, om kenmerktoestelle en hul subkenmerke te ontdek en platformtoestelle daarvoor onder die houertoestel te skep.
  • Ondersteun SR-IOV.
  • Stel die kenmerktoestelinfrastruktuur bekend, wat bedrywighede vir subkenmerke abstraheer en algemene funksies aan kenmerktoestelbestuurders blootstel.

PCIe-module-toestelbestuurderfunksies

  • Bevat PCIe-ontdekking, toestelopsomming en kenmerkontdekking.
  • Skep sysfs-gidse vir die ouertoestel, FPGA Management Engine (FME) en Port.
  • Skep die platformbestuurdergevalle, wat veroorsaak dat die Linux-kern hul onderskeie platformmodulebestuurders laai.

FME Platform Module Toestelbestuurder

  • Krag- en termiese bestuur, foutverslaggewing, prestasieverslaggewing en ander infrastruktuurfunksies. Jy kan toegang tot hierdie funksies kry via sysfs-koppelvlakke wat deur die FME-bestuurder blootgestel word.
  • Gedeeltelike herkonfigurasie. Die FME-bestuurder registreer 'n FPGA-bestuurder tydens PR-subfunksie-inisialisering; sodra dit 'n FPGA_FME_PORT_PR ioctl van jou ontvang, roep dit die gemeenskaplike koppelvlakfunksie van FPGA Bestuurder aan om die gedeeltelike herkonfigurasie van die bitstroom na die gegewe poort te voltooi.
  • Portbestuur vir virtualisering. Die FME-bestuurder stel twee ioctls bekend, FPGA_FME_PORT_RELEASE, wat die gegewe Port van PF vrystel; en FPGA_FME_PORT_ASSIGN, wat die poort terug aan PF toeken. Sodra die poort van die PF vrygestel is, kan dit aan die VF toegewys word deur die SR-IOV-koppelvlakke wat deur die PCIe-bestuurder verskaf word. Vir meer inligting, verwys na "FPGA Virtualization".

FME Platform Module Toestelbestuurder Funksies

  • Skep die FME karakter toestel nodus.
  • Skep die FME sysfs files en implementeer die FME sysfs file bykomstighede.
  • Implementeer die FME-privaatfunksie-subbestuurders.
  • FME privaat kenmerk subbestuurders:
    • FME-opskrif
    • Termiese Bestuur
    • Kragbestuur
    • Globale fout
    • Gedeeltelike herkonfigurasie
    • Wêreldwye prestasie

Port Platform Module Toestelbestuurder
Soortgelyk aan die FME-bestuurder, word die FPGA Port (en AFU) drywer (intel-fpga-afu. ko) ondersoek sodra die Port platform toestel geskep is. Die hooffunksie van hierdie module is om 'n koppelvlak te verskaf vir gebruikersruimte-toepassings om toegang tot die individuele versnellers te verkry, insluitend basiese herstelbeheer op Port, AFU MMIO streek-uitvoer, DMA buffer kartering diens, UMsg(1) kennisgewing, en afgeleë ontfout funksies ( sien hierbo).

UMsg word slegs ondersteun deur Acceleration Stack vir Intel Xeon®-verwerker met geïntegreerde FPGA.

Port Platform Module Toestelbestuurder funksies

  • Skep die poortkaraktertoestelnodus.
  • Skep die Port sysfs files en implementeer die Port sysfs file bykomstighede.
  • Implementeer die Port private kenmerk subbestuurders.
  • Port privaat kenmerk subbestuurders:
    • Poortkop
    • AFU
    • Poortfout
    • UMsg(2)
    • Sein Tik

Toepassing FPGA Toestel Opsomming
Hierdie afdeling stel bekend hoe toepassings die FPGA-toestel opsom vanaf die sysfs-hiërargie onder /sys/class/fpga. In die examphieronder is twee Intel FPGA-toestelle in die gasheer geïnstalleer. Elke FPGA-toestel het een FME en twee poorte (AFU's). Vir elke FPGA-toestel word 'n toestelgids geskep onder /sys/class/fpga:

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

Elke nodus het een FME en twee poorte (AFU's) as kindertoestelle:
/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

Oor die algemeen word die FME/Port sysfs-koppelvlakke soos volg genoem:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

met I wat al die houertoestelle agtereenvolgens nommer, j die FME's agtereenvolgens nommer en k alle poorte agtereenvolgens nommer.

Die toestel nodusse wat gebruik word vir ioctl() en mmap() kan verwys word deur:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe-bestuurder-opsomming
Hierdie afdeling gee 'n oorview van die kodevloei vir toesteloptelling uitgevoer deur intel-fpga-pci.ko. Die hoofdatastrukture en -funksies word uitgelig. Hierdie afdeling word die beste gevolg wanneer viewing die meegaande bronkode (pcie.c).

Opsommingsdatastrukture

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statiese struktuur idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
konst char *naam;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statiese struktuurklas *fpga_klas;
statiese struktuur 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,}
};
statiese struktuur pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.verwyder = cci_pci_verwyder,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int device_id;
struct toestel *fme_dev;
struct mutex slot;
struct list_head port_dev_list;
int vrygestel_poort_nommer;
struct lys_kop streke;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
nietig __iomem *ioaddr;
nietig __iomem *ioend;
int huidige_balk;
nietig __iomem *pfme_hdr;
struct toestel *parent_dev;
struct platform_device *feature_dev;
};

Opsommingsvloei

  • ccidrv_init()
    • Inisialiseer fpga_ids met idr_init().
    • Inisialiseer fpga_chrdevs[i].devt deur alloc_chrdev_region() te gebruik.
    • Inisialiseer fpga_class met behulp van class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Aktiveer die PCI-toestel, versoek toegang tot sy streke, stel PCI-meestermodus in en stel DMA in.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Ken 'n struktuur toe build_feature_devs_info, inisialiseer dit.
      .parent_dev is ingestel op 'n ouer sysfs-gids (intel-fpga-dev.id) wat die FME- en Port sysfs-gidse bevat.
  • ontleed_kenmerklys()
    • Loop die BAR0-toestelkenmerklys om die FME, die hawe en hul private kenmerke te ontdek.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Wanneer 'n FME teëgekom word:
  • build_info_create_dev()
    • Ken 'n platformtoestel vir die FME toe, stoor in build_feature_devs_info.feature_dev.
    • feature_dev.id is geïnisialiseer na die resultaat van idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent is ingestel op build_feature_devs_info.parent_dev.
    • Ken 'n verskeidenheid struktuurhulpbronne toe in feature_dev.resource.
  • Ken 'n struct feature_platform_data toe, inisialiseer dit en stoor 'n wyser in feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Inisialiseer feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Inisialiseer feature_platform_data.features[FME_FEATURE_ID_HEADER], alles behalwe .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Wanneer 'n hawe teëgekom word:
  • build_info_create_dev()
    • Ken 'n platformtoestel vir die Port toe, stoor in build_feature_devs_info.feature_dev.
    • feature_dev.id is geïnisialiseer na die resultaat van idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent is ingestel op build_feature_devs_info.parent_dev.
    • Ken 'n verskeidenheid struktuurhulpbron toe in feature_dev.resource.
    • Ken 'n struct feature_platform_data toe, inisialiseer dit en stoor 'n wyser in feature_dev.dev.platform_data
  • bou_info_commit_dev()
    • Voeg die struct feature_platform_data.node vir die poort by die lys poorte in struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Inisialiseer feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Inisialiseer feature_platform_data.features[PORT_FEATURE_ID_HEADER], alles behalwe .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Wanneer 'n AFU teëgekom word:
  • create_feature_instance() build_info_add_sub_feature()
    • Inisialiseer feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Inisialiseer feature_platform_data.features[PORT_FEATURE_ID_UAFU], alles behalwe .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Wanneer 'n FME-privaatkenmerk teëgekom word:
  • create_feature_instance() build_info_add_sub_feature()
    • Inisialiseer feature_dev.resource[id].
  • feature_platform_data_add()
    • Inisialiseer feature_platform_data.features[id], alles behalwe .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Wanneer 'n Port private kenmerk teëgekom word: * create_feature_instance() build_info_add_sub_feature() * Initialiseer feature_dev.resource[id]. * feature_platform_data_add() Inisialiseer feature_platform_data.features[id], alles behalwe .fops.
  • ontleed_poorte_van_fme()
    • As die bestuurder op die Fisiese Funksie (PF) gelaai is, dan:
  • Begin die parse_feature_list()-vloei op elke poort wat in die FME-kopskrif beskryf word.
  • Gebruik die BAR genoem in elke Port-inskrywing in die kopskrif.

FME Platform Toestel Inisialisering
Hierdie afdeling gee 'n oorview van die kodevloei vir FME-toestel-inisialisering uitgevoer deur intel-fpga-fme.ko. Die hoofdatastrukture en -funksies word uitgelig. Hierdie afdeling word die beste gevolg wanneer viewing die meegaande bronkode (fme-main.c).

FME-platformtoesteldatastrukture

struct feature_ops {
int (*init)(struct platform_device *pdev, struct funksie *kenmerk);
int (*unit)(struct platform_device *pdev, struct funksie *kenmerk);
lank (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*toets) (struct platform_device *pdev, struct feature *feature);
};
struktuurkenmerk {
konst char *naam;
int hulpbronindeks;
nietig __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex slot;
ongetekende lang dev_status;
struct cdev cdev;
struct platform_device *dev;
ongetekende int disable_count;
nietig *privaat;
int getal;
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 *)); struktuur
kenmerk kenmerke[0];
};
struct perf_object {
int id;
const struct attribuut_group **attr_groups;
struct toestel *fme_dev;
struct list_head node;
struct lys_hoof kinders;
struktuur kobject kobj;
};
struct fpga_fme {
u8 poort_id;
u64 pr_err;
struktureer toestel *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME Platform Toestel Inisialisering Flow

FME Inisialisering Flowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Inisialiseer 'n struktuur fpga_fme en stoor dit in die feature_platform_data.private veld.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Stoor 'n struct feature_ops in die feature_platform_data.features vir elke ingevulde kenmerk.
    • Roep die toetsfunksie, indien enige, uit die struktuur.
    • Roep die init-funksie uit die struct.
  • fme_probe() fpga_register_dev_ops()
    • Skep die FME karakter toestel node, registreer 'n struktuur file_operasies.

Inisialisering van poortplatformtoestel
Hierdie afdeling gee 'n oorview van die kodevloei vir inisialisering van poorttoestelle wat deur intel-fpga-afu.ko uitgevoer word. Die hoofdatastrukture en -funksies word uitgelig. Hierdie afdeling word die beste gevolg wanneer viewing die meegaande bronkode (afu.c).

Port Platform Toestel Data Strukture

struct feature_ops {
int (*init)(struct platform_device *pdev, struct funksie *kenmerk);
int (*unit)(struct platform_device *pdev, struct funksie *kenmerk);
lank (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*toets) (struct platform_device *pdev, struct feature *feature);
};
struktuurkenmerk {
konst char *naam;
int hulpbronindeks;
nietig __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex slot;
ongetekende lang dev_status;
struct cdev cdev;
struct platform_device *dev;
ongetekende int disable_count;
nietig *privaat;
int getal;
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 *));
struktuurkenmerke[0];
};
struct fpga_afu_region {
u32 indeks;
u32 vlae;
u64 grootte;
u64 verreken;
u64 fisies;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 gebruiker_addr;
u64 lengte;
u64 iova;
struct bladsy **bladsye;
struct rb_node node;
bool in_gebruik;
};
struct fpga_afu {
u64 area_cur_offset;
int getal_streke;
u8 num_umsgs;
struct lys_kop streke;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Port Platform Toestel Inisialisering Flow

Port-inisialiseringsvloeiintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Inisialiseer 'n struktuur fpga_afu en stoor dit in die feature_platform_data.private veld.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Stoor 'n struct feature_ops in die feature_platform_data.features vir elke ingevulde kenmerk.
    • Roep die toetsfunksie, indien enige, uit die struktuur.
    • Roep die init-funksie uit die struct.
  • afu_probe() fpga_register_dev_ops()
    • Skep die poortkaraktertoestelnodus en registreer 'n struktuur file_operasies.

FME IOCTL's
IOCTL's wat op 'n oop geroep word file beskrywing vir /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—gee die huidige weergawe terug as 'n heelgetal, vanaf 0.

FPGA_CHECK_EXTENSION—nie tans gesteun nie.

FPGA_FME_PORT_RELEASE—arg is 'n wyser na 'n:

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 vlae; // in: moet 0 wees
__u32 poort_id; // in: poort ID (vanaf 0) om vry te stel.
};

FPGA_FME_PORT_ASSIGN—arg is 'n wyser na 'n:

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 vlae; // in: moet 0 wees
__u32 poort_id; // in: poort ID (vanaf 0) om toe te ken. (moes gewees het
voorheen vrygestel deur FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg is 'n wyser na 'n:

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 vlae; // in: moet 0 wees
__u32 poort_id; // in: poort ID (vanaf 0)
__u32 buffer_grootte; // in: grootte van bitstroom buffer in grepe. Moet 4-grepe wees
belyn.
__u64 buffer_adres; // in: verwerk adres van bitstroom buffer
__u64 status; // uit: foutstatus (bismasker)
};

Port IOCTL's
IOCTL's wat op 'n oop geroep word file beskrywing vir /dev/intel-fpga-port.k FPGA_GET_API_VERSION—gee die huidige weergawe terug as 'n heelgetal, vanaf 0. FPGA_CHECK_EXTENSION—nie tans ondersteun nie.

FPGA_PORT_GET_INFO—arg is 'n wyser na 'n:

struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 vlae; // uit: gee 0 terug
__u32 aantal_streke; // uit: aantal MMIO streke, 2 (1 vir AFU en 1 vir
STP)
__u32 num_umsgs; // uit: aantal UMsg's wat deur die hardeware ondersteun word
};

FPGA_PORT_GET_REGION_INFO—arg is 'n wyser na 'n:

struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 vlae; // uit: (bismasker) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // in: FPGA_PORT_INDEX_UAFU of FPGA_PORT_INDEX_STP
__u32 vulling; // in: moet 0 wees
__u64 grootte; // uit: grootte van MMIO-streek in grepe
__u64 verreken; // uit: verreken van MMIO-streek vanaf begin van toestel fd
};

FPGA_PORT_DMA_MAP—arg is 'n wyser na 'n:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 vlae; // in: moet 0 __u64 user_addr wees; // in: verwerk virtueel
adres. Moet bladsybelyn wees.
__u64 lengte; // in: lengte van kartering in grepe. Moet 'n veelvoud van bladsy wees
grootte.
__u64 iova; // uit: IO virtuele adres };

FPGA_PORT_DMA_UNMAP—arg is 'n wyser na 'n:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 vlae; // in: moet 0 wees
__u64 iova; // in: IO virtuele adres teruggestuur deur 'n vorige
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg moet NULL wees.
  • FPGA_PORT_UMSG_ENABLE—arg moet NULL wees.
  • FPGA_PORT_UMSG_DISABLE—args moet NULL wees.

FPGA_PORT_UMSG_SET_MODE—arg is 'n wyser na 'n:

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 vlae; // in: moet 0 wees
__u32 wenk_bitmap; // in: UMsg-wenkmodus bitmap. Dui aan watter UMsg's is
aangeskakel.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg moet gedeaktiveer word voordat hierdie ioctl uitgereik word.
  • Die iova-veld moet vir 'n buffer wees wat groot genoeg is vir alle UMsg's (num_umsgs * PAGE_SIZE).
    • Die buffer word deur die bestuurder se bufferbestuur as “in gebruik” gemerk.
    • As iova NULL is, is enige vorige streek ongemerk as "in gebruik".
  • arg is 'n wyser na 'n:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • u32 vlae; // in: moet 0 wees
    • u64 iova; // in: IO virtuele adres vanaf FPGA_PORT_DMA_MAP. };

Let wel:

  • Om die poortfoute uit te vee, moet u die presiese bitmasker van die huidige foute skryf, bvample, katfoute > duidelik
  • UMsg word slegs ondersteun deur Acceleration Stack vir Intel Xeon-verwerker met geïntegreerde FPGA.

sysfs Files

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

sysfs file mmio veld tipe toegang
poorte_nommer fme_header.capability.num_ports desimale int Leesalleen
kas_grootte fme_header.capability.cache_size desimale int Leesalleen
weergawe fme_header.capability.fabric_verid desimale int Leesalleen
socket_id fme_header.capability.socket_id desimale int Leesalleen
bitstroom_id fme_header.bitstream_id heks uint64_t Leesalleen
bitstroom_metadata fme_header.bitstream_md heks uint64_t Leesalleen

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

sysfs file mmio veld tipe toegang
drempel 1 termiese.drempel.tmp_thshold1 desimale int Gebruiker: Lees-alleen-wortel: Lees-skryf
drempel 2 termiese.drempel.tmp_thshold2 desimale int Gebruiker: Lees-alleen-wortel: Lees-skryf
drempel_reis termiese.drempel.therm_trip_thshold desimale int Leesalleen
drempel1_bereik termiese.drempel.thshold1_status desimale int Leesalleen
drempel2_bereik termiese.drempel.thshold2_status desimale int Leesalleen
drempel1_beleid termiese. threshold.thshold_policy desimale int Gebruiker: Lees-alleen-wortel: Lees-skryf
temperatuur termiese.rdsensor_fm1.fpga_temp desimale int Leesalleen

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

sysfs file mmio veld tipe toegang
verteer krag.status.pwr_verbruik heks uint64_t Leesalleen
drempel 1 kragdrumpel.drempel1 heks uint64_t Gebruiker: Lees-alleen-wortel: Lees-skryf
drempel 2 kragdrumpel.drempel2 heks uint64_t Gebruiker: Lees-alleen-wortel: Lees-skryf
drempel1_status power.threshold.threshold1_status desimale ongeteken Leesalleen
drempel2_status power.threshold.threshold2_status desimale ongeteken Leesalleen
rtl power.status.fpga_latency_report desimale ongeteken Leesalleen

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

sysfs file mmio veld tipe toegang
pcie0_errors gerror.pcie0_err heks uint64_t Lees skryf
pcie1_errors gerror.pcie1_err heks uint64_t Lees skryf
inspuit_fout gerror.ras_error_inj heks uint64_t Lees skryf

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

sysfs file mmio veld tipe toegang
foute gerror.fme_err heks uint64_t Leesalleen
eerste_fout gerror.fme_first_err.err_reg_status heks uint64_t Leesalleen
volgende_fout gerror.fme_next_err.err_reg_status heks uint64_t Leesalleen
duidelik Vee foute uit, first_error, next_error verskeie uint64_t Slegs skryf

Let wel:
Om die FME-foute uit te vee, moet jy die presiese bitmasker van die huidige foute skryf, bvample kat foute > duidelik.

FME Gedeeltelike Herkonfigurasie sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio veld tipe toegang
koppelvlak_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-grepe Leesalleen

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

sysfs file mmio veld tipe toegang
horlosie gperf.clk.afu_interf_klok heks uint64_t Leesalleen

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Nie geldig vir Acceleration Stack vir Intel Xeon CPU met FPGA's nie)

sysfs file mmio veld tipe toegang
vries gperf.ch_ctl.freeze desimale int Lees skryf
lees_treffer gperf.CACHE_RD_HIT heks uint64_t Leesalleen
lees_mis gperf.CACHE_RD_MISS heks uint64_t Leesalleen
skryf_treffer gperf.CACHE_WR_HIT heks uint64_t Leesalleen
skryf_mis gperf.CACHE_WR_MISS heks uint64_t Leesalleen
hou_versoek gperf.CACHE_HOLD_REQ heks uint64_t Leesalleen
tx_req_stall gperf.CACHE_TX_REQ_STALL heks uint64_t Leesalleen
sysfs file mmio veld tipe toegang
rx_req_stall gperf.CACHE_RX_REQ_STALL heks uint64_t Leesalleen
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN heks uint64_t Leesalleen
tag_skryf_port_kontensie gperf.CACHE_TAG_WR_PORT_CONTEN heks uint64_t Leesalleen

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Nie geldig vir Acceleration Stack vir Intel Xeon CPU met FPGA's nie)

sysfs file mmio veld tipe toegang
vries gperf.vtd_ctl.freeze desimale int Gebruiker: Lees-alleen-wortel: Lees-skryf

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Nie geldig vir Acceleration Stack vir Intel Xeon CPU met FPGA's nie)

sysfs file mmio veld tipe toegang
lees_transaksie gperf.VTD_AFU0_MEM_RD_TRANS heks uint64_t Leesalleen
skryf_transaksie gperf.VTD_AFU0_MEM_WR_TRANS heks uint64_t Leesalleen
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT heks uint64_t Leesalleen
tlb_skryf_treffer gperf.VTD_AFU0_TLB_WR_HIT heks uint64_t Leesalleen

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

sysfs file mmio veld tipe toegang
aktiveer gperf.fab_ctl.(aangeskakel) desimale int Gebruiker: Lees-alleen-wortel: Lees-skryf
vries gperf.fab_ctl.freeze desimale int Gebruiker: Lees-alleen-wortel: Lees-skryf
pcie0_lees gperf.FAB_PCIE0_RD heks uint64_t Leesalleen
pcie0_skryf gperf.FAB_PCIE0_WR heks uint64_t Leesalleen
pcie1_lees gperf.FAB_PCIE1_RD heks uint64_t Leesalleen
pcie1_skryf gperf.FAB_PCIE1_WR heks uint64_t Leesalleen
upi_lees gperf.FAB_UPI_RD heks uint64_t Leesalleen
upi_skryf gperf.FAB_UPI_WR heks uint64_t Leesalleen

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

sysfs file mmio veld tipe toegang
pcie0_lees gperf.FAB_PCIE0_RD heks uint64_t Leesalleen
pcie0_skryf gperf.FAB_PCIE0_WR heks uint64_t Leesalleen
pcie1_lees gperf.FAB_PCIE1_RD heks uint64_t Leesalleen
pcie1_skryf gperf.FAB_PCIE1_WR heks uint64_t Leesalleen
upi_lees gperf.FAB_UPI_RD heks uint64_t Leesalleen
upi_skryf gperf.FAB_UPI_WR heks uint64_t Leesalleen

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

sysfs file mmio veld tipe toegang
id port_header.capability.port_number desimale int Leesalleen
ltr port_header.control.latency_tolerance desimale int Leesalleen

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

sysfs file mmio veld tipe toegang
afu_id afu_header.guid hex 16-grepe Leesalleen

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

sysfs file mmio veld tipe toegang
foute perror.port_error heks uint64_t Leesalleen
eerste_fout perror.port_first_error heks uint64_t Leesalleen
first_misformed_req perror.malreq hex 16-grepe Leesalleen
duidelik fout.(alle foute) verskeie uint64_t Slegs skryf

Let wel:
Om die poortfoute uit te vee, moet u die presiese bitmasker van die huidige foute skryf, bvample kat foute > duidelik.

Hersieningsgeskiedenis

Dokument weergawe Veranderinge
2017.10.02 Aanvanklike vrystelling.

OPAE Intel FPGA Linux-toestelbestuurderargitektuurgids

Dokumente / Hulpbronne

intel OPAE FPGA Linux Device Driver Architecture [pdf] Gebruikersgids
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Verwysings

Los 'n opmerking

Jou e-posadres sal nie gepubliseer word nie. Vereiste velde is gemerk *