intel OPAE FPGA Linux Device Driver Architecture
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
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
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:
- Laai die bestuurder van die gas af
- Ontkoppel die VF van die gas
- Deaktiveer SR-IOV
- Voer gedeeltelike herkonfigurasie uit
- Aktiveer SR-IOV
- Prop die VF aan die gas
- 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:
- 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.
- 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
- Gaan deur die VF's na VM's.
- 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
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.
- Ken 'n struktuur toe build_feature_devs_info, inisialiseer dit.
- 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 Flow
- 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-inisialiseringsvloei
- 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 |