intel OPAE FPGA Linux Device Driver Architecture
OPAE Intel FPGA Linux Device Driver Architecture
De OPAE Intel FPGA-bestjoerder leveret ynterfaces foar applikaasjes foar brûkersromte om FPGA-versnellers te konfigurearjen, op te rekkenjen, te iepenjen en tagong te krijen op platfoarms foarsjoen fan Intel FPGA-oplossingen en makket systeembehearfunksjes mooglik, lykas FPGA-rekonfiguraasje, enerzjybehear, en virtualisaasje.
Hardware Architecture
Ut it OS syn punt fan view, de FPGA-hardware ferskynt as in gewoan PCIe-apparaat. It FPGA-apparaatûnthâld wurdt organisearre mei in foarôf definieare gegevensstruktuer (Device Feature List). Funksjes stipe troch it FPGA-apparaat wurde bleatsteld troch dizze gegevensstruktueren, lykas hjirûnder yllustrearre yn 'e folgjende figuer:
FPGA PCIe-apparaat
De bestjoerder stipet PCIe SR-IOV om Virtual Functions (VF's) te meitsjen dy't kinne wurde brûkt om yndividuele accelerators oan firtuele masines te jaan.
Intel Corporation. Alle rjochten foarbehâlden. Intel, it Intel-logo en oare Intel-merken binne hannelsmerken fan Intel Corporation of har dochterûndernimmingen. Intel garandearret de prestaasjes fan har FPGA- en semiconductorprodukten oan hjoeddeistige spesifikaasjes yn oerienstimming mei Intel's standert garânsje, mar behâldt it rjocht foar om op elk momint feroarings oan te bringen oan produkten en tsjinsten sûnder notice. Intel nimt gjin ferantwurdlikens of oanspraaklikens oan dy't fuortkomme út 'e applikaasje of gebrûk fan ynformaasje, produkt of tsjinst beskreaun hjiryn, útsein as útdruklik skriftlik ôfpraat troch Intel. Intel-klanten wurde advisearre om de lêste ferzje fan apparaatspesifikaasjes te krijen foardat se fertrouwe op alle publisearre ynformaasje en foardat se oarders pleatse foar produkten of tsjinsten.
Oare nammen en merken kinne wurde opeaske as eigendom fan oaren.
Virtualized FPGA PCIe Device
FPGA Management Engine (FME)
De FPGA Management Engine fiert macht en termyske behear, flaterrapportaazje, rekonfiguraasje, prestaasjesrapportaazje, en oare ynfrastruktuerfunksjes. Elke FPGA hat ien FME, dy't altyd tagonklik is fia de Physical Function (PF). Brûkerromteapplikaasjes kinne eksklusive tagong krije ta de FME mei iepen (), en loslitte mei close () as in befoarrjochte brûker (root).
Haven
In haven stiet foar de ynterface tusken de statyske FPGA-stof (de "FPGA Interface Manager (FIM)") en in foar in part reconfigurable regio mei dêryn in Accelerator Function (AF). De haven kontrolearret de kommunikaasje fan software nei de accelerator en bleatret funksjes lykas reset en debug. In PCIe-apparaat kin ferskate havens hawwe, en elke haven kin wurde bleatsteld fia in VF troch it tawizen fan it FPGA_FME_PORT_ASSIGN ioctl op it FME-apparaat.
Accelerator Funksje (AF) Unit
- In Accelerator Function (AF) Unit is hechte oan in haven en bleatstelt in 256K MMIO-regio om te brûken foar accelerator-spesifike kontrôleregisters.
- Brûkerromteapplikaasjes kinne eksklusive tagong krije ta in AFU ferbûn oan in haven troch iepen () op it Port-apparaat te brûken, en loslitte mei close ().
- Brûker-romte applikaasjes kinne ek mmap () accelerator MMIO regio.
Partial Rekonfiguraasje
Lykas hjirboppe neamd, kinne accelerators wurde opnij konfigureare troch in parsjele rekonfiguraasje fan in Accelerator Function (AF) file. De Accelerator Function (AF) moat wurde generearre foar de krekte FIM en doelstelde statyske regio (Port) fan 'e FPGA; oars, de rekonfiguraasje operaasje sil mislearje en mooglik feroarsaakje systeem ynstabiliteit. Dizze komptabiliteit kin wurde kontrolearre troch it fergelykjen fan de ynterface ID opmurken yn de AF koptekst mei de ynterface ID bleatsteld troch de FME fia sysfs. Dizze kontrôle wurdt normaal dien troch brûkersromte foardat jo de rekonfiguraasje IOCTL neame.
Noat:
Op it stuit moat alle softwareprogramma's dy't tagong krije ta de FPGA, ynklusyf dy dy't rinne yn in virtualisearre host, moatte wurde sluten foardat jo besykje in parsjele rekonfiguraasje. De stappen soene wêze:
- Unload de bestjoerder út de gast
- Skeakelje de VF út de gast
- SR-IOV útskeakelje
- Fier in part rekonfiguraasje
- SR-IOV ynskeakelje
- Plug de VF nei de gast
- Laad de bestjoerder yn 'e gast
FPGA Virtualization
Om tagong te krijen ta in accelerator fan applikaasjes dy't rinne yn in VM, moat de respektivelike AFU's poarte wurde tawiisd oan in VF mei de folgjende stappen:
- De PF hat standert alle AFU-poarten. Eltse haven dy't moat wurde opnij tawiisd oan in VF moat earst wurde frijlitten út de PF fia de FPGA_FME_PORT_RELEASE ioctl op de FME apparaat.
- Sadree't N-poarten binne frijjûn fan 'e PF, kin it kommando hjirûnder brûkt wurde om SRIOV en VF's yn te skeakeljen. Elke VF hat mar ien haven mei AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
- Gean troch de VF's nei VM's.
- De AFU ûnder VF is tagonklik fan applikaasjes yn VM (mei deselde bestjoerder binnen de VF).
Noat:
In FME kin net wurde tawiisd oan in VF, dus PR en oare behear funksjes binne allinnich beskikber fia de PF.
Driver Organisaasje
PCIe Module Device Driver
Driver Organisaasje
De FPGA-apparaten ferskine as gewoane PCIe-apparaten; sadwaande, de FPGA PCIe apparaat stjoerprogramma (intel-FPGA-PCI.ko) wurdt altyd laden earst ien kear in FPGA PCIe PF of VF wurdt ûntdutsen. Dizze bestjoerder spilet in ynfrastrukturele rol yn 'e bestjoerderarsjitektuer. It:
- Makket in FPGA container apparaat as in âlder fan de funksje apparaten.
- Rint troch de List fan apparaatfunksjes, dy't wurdt ymplementearre yn PCIe-apparaat BAR-ûnthâld, om funksje-apparaten en har subfunksjes te ûntdekken en platfoarmapparaten foar har te meitsjen ûnder it kontenerapparaat.
- Unterstützt SR-IOV.
- Yntrodusearret de ynfrastruktuer foar funksje-apparaat, dy't operaasjes abstrahert foar subfunksjes en mienskiplike funksjes bleatstelle oan funksje-apparaatbestjoerders.
PCIe Module Device Driver Funksjes
- Befettet PCIe-ûntdekking, apparaat-enumeraasje en funksje-ûntdekking.
- Makket sysfs-mappen foar it âlderapparaat, FPGA Management Engine (FME), en Port.
- Makket de platfoarmsjauffeursynstânsjes oan, wêrtroch't de Linux-kernel har respektivelike platfoarmmodule-bestjoerders laden.
FME Platfoarm Module Device Driver
- Macht- en termyske behear, flaterrapportaazje, prestaasjesrapportaazje, en oare ynfrastruktuerfunksjes. Jo kinne tagong krije ta dizze funksjes fia sysfs-ynterfaces bleatsteld troch de FME-bestjoerder.
- Partial Reconfiguration. De FME-bestjoerder registrearret in FPGA-behearder by inisjalisaasje fan PR-subfunksjes; ienris it ûntfangt in FPGA_FME_PORT_PR ioctl fan jo, ropt it de mienskiplike ynterfacefunksje fan FPGA Manager op om de parsjele rekonfiguraasje fan 'e bitstream nei de opjûne poarte te foltôgjen.
- Portbehear foar virtualisaasje. De FME-bestjoerder yntrodusearret twa ioctls, FPGA_FME_PORT_RELEASE, dy't de opjûne Port fan PF frijlit; en FPGA_FME_PORT_ASSIGN, dy't de haven weromkeart nei PF. Sadree't de poarte is frijlitten fan 'e PF, kin it wurde tawiisd oan' e VF fia de SR-IOV-ynterfaces levere troch de PCIe-bestjoerder. Foar mear ynformaasje, ferwize nei "FPGA Virtualization".
FME Platfoarm Module Device Driver Funksjes
- Makket it FME-karakterapparaatknooppunt oan.
- Makket de FME sysfs files en ymplemintearret de FME sysfs file accessors.
- Implementearret de FME partikuliere funksje sub-bestjoerders.
- FME partikuliere funksje subbestjoerders:
- FME Header
- Termyske behear
- Power Management
- Globale flater
- Partial Rekonfiguraasje
- Global Performance
Port Platform Module Device Driver
Fergelykber mei de FME-bestjoerder wurdt de FPGA-poarte (en AFU)-bestjoerder (intel-fpga-afu. ko) ûndersocht as it Port-platfoarmapparaat is makke. De haadfunksje fan dizze module is om in ynterface te leverjen foar applikaasjes foar brûkersromte om tagong te krijen ta de yndividuele accelerators, ynklusyf basisresetkontrôle op Port, AFU MMIO-regio-eksport, DMA-buffermappingtsjinst, UMsg(1)-notifikaasje, en debugfunksjes op ôfstân ( Sjoch hjir boppe).
UMsg wurdt allinnich stipe troch Acceleration Stack foar Intel Xeon® Prozessor mei yntegrearre FPGA.
Port Platform Module Device Driver Funksjes
- Makket it poarte-karakterapparaatknooppunt oan.
- Makket de Port sysfs files en ymplemintearret de Port sysfs file accessors.
- Implementearret de sub-bestjoerders fan 'e Port priveefunksje.
- Port privee funksje sub-bestjoerders:
- Port Header
- AFU
- Port flater
- UMsg(2)
- Signal Tap
Applikaasje FPGA Device Enumeration
Dizze seksje yntroduseart hoe't applikaasjes it FPGA-apparaat enumerearje fan 'e sysfs-hierarchy ûnder /sys/class/fpga. Yn de eksample hjirûnder, twa Intel FPGA apparaten wurde ynstallearre yn de host. Elts FPGA apparaat hat ien FME en twa havens (AFUs). Foar elk FPGA-apparaat wurdt in apparaatmap makke ûnder /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Elk knooppunt hat ien FME en twa havens (AFU's) as bernapparaten:
/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
Yn 't algemien wurde de FME/Port sysfs-ynterfaces as folget neamd:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
mei I opienfolgjende nûmering alle kontener apparaten, j opienfolgjende nûmering fan de FME's en k opienfolgjende nûmering fan alle Ports.
De apparaatknooppunten brûkt foar ioctl () en mmap () kinne wurde ferwiisd fia:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe Driver Enumeration
Dizze seksje jout in oerview fan de koade flow foar apparaat enumeration útfierd troch intel-fpga-pci.ko. De wichtichste gegevensstruktueren en funksjes wurde markearre. Dizze seksje is bêste folge wannear viewing de byhearrende boarnekoade (pcie.c).
Enumeration Data Struktueren
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statyske struktuer idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *namme;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statyske struktuerklasse *fpga_class;
statyske struktuer 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,}
};
statyske struct 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;
struct apparaat *fme_dev;
struct mutex slot;
struct list_head port_dev_list;
int released_port_num;
struct list_head regio's;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
struct apparaat *parent_dev;
struct platform_device *feature_dev;
};
Enumeration Flow
- ccidrv_init()
- Inisjalisearje fpga_ids mei idr_init ().
- Inisjalisearje fpga_chrdevs[i].devt mei help fan alloc_chrdev_region ().
- Inisjalisearje fpga_class mei class_create ().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Aktivearje it PCI-apparaat, freegje tagong ta har regio's, set PCI-mastermodus yn en konfigurearje DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Allocearje in struct build_feature_devs_info, inisjalisearje it.
.parent_dev is ynsteld op in âlder sysfs triemtafel (intel-fpga-dev.id) dat befettet de FME en Port sysfs triemtafels.
- Allocearje in struct build_feature_devs_info, inisjalisearje it.
- parse_feature_list()
- Rin troch de BAR0 Device Feature List om de FME, de haven en har privee funksjes te ûntdekken.
- parse_feature() parse_feature_afus() parse_feature_fme()
- As in FME tsjinkomt:
- build_info_create_dev()
- Tawize in platfoarm apparaat foar de FME, opslach yn build_feature_devs_info.feature_dev.
- feature_dev.id wurdt inisjalisearre nei it resultaat fan idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent is ynsteld op build_feature_devs_info.parent_dev.
- Allokearje in array fan struct-boarnen yn feature_dev.resource.
- Allokearje in struct feature_platform_data, inisjalisearje it en bewarje in oanwizer yn feature_dev.dev.platform_data
- create_feature_instance() build_info_add_sub_feature()
- Inisjalisearje feature_dev.resource[FME_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Inisjalisearje feature_platform_data.features[FME_FEATURE_ID_HEADER], alles behalve .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- As in poarte tsjinkomt:
- build_info_create_dev()
- Tawize in platfoarm apparaat foar de haven, opslaan yn build_feature_devs_info.feature_dev.
- feature_dev.id wurdt inisjalisearre nei it resultaat fan idr_alloc (fpga_ids[PORT_ID],
- feature_dev.parent is ynsteld op build_feature_devs_info.parent_dev.
- Allokearje in array fan struct-boarne yn feature_dev.resource.
- Allokearje in struct feature_platform_data, inisjalisearje it en bewarje in oanwizer yn feature_dev.dev.platform_data
- build_info_commit_dev()
- Foegje de struct feature_platform_data.node foar de poarte ta oan de list mei havens yn struct cci_drvdata.port_dev_list
- create_feature_instance() build_info_add_sub_feature()
- Inisjalisearje feature_dev.resource[PORT_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Inisjalisearje feature_platform_data.features[PORT_FEATURE_ID_HEADER], alles behalve .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- As in AFU tsjinkomt:
- create_feature_instance() build_info_add_sub_feature()
- Inisjalisearje feature_dev.resource[PORT_FEATURE_ID_UAFU].
- feature_platform_data_add()
- Inisjalisearje feature_platform_data.features[PORT_FEATURE_ID_UAFU], alles behalve .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- As in FME-priveefunksje tsjinkomt:
- create_feature_instance() build_info_add_sub_feature()
- Inisjalisearje feature_dev.resource[id].
- feature_platform_data_add()
- Inisjalisearje feature_platform_data.features[id], alles behalve .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Wannear't in Port privee funksje wurdt tsjinkaam: * create_feature_instance () build_info_add_sub_feature () * Inisjalisearje feature_dev.resource[id]. * feature_platform_data_add () Inisjalisearje feature_platform_data.features [id], alles mar .fops.
- parse_ports_from_fme()
- As de bestjoerder wurdt laden op de Physical Function (PF), dan:
- Run de parse_feature_list () stream op elke haven beskreaun yn de FME koptekst.
- Brûk de BAR neamd yn elke poarte-yngong yn 'e koptekst.
FME Platform Device Inisjalisaasje
Dizze seksje jout in oerview fan de koade flow foar FME apparaat inisjalisaasje útfierd troch intel-fpga-fme.ko. De wichtichste gegevensstruktueren en funksjes wurde markearre. Dizze seksje is bêste folge wannear viewing de byhearrende boarnekoade (fme-main.c).
FME Platfoarm Device Data Struktueren
struct feature_ops {
int (*init)(struct platform_device *pdev, struct funksje *funksje);
int (*unit) (struct platform_device *pdev, struct funksje *funksje);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test) (struct platform_device *pdev, struct funksje *funksje);
};
struct feature {
const char *namme;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex slot;
net ûndertekene lange dev_status;
struct cdev cdev;
struct platform_device *dev;
net ûndertekene int disable_count;
void *privee;
int num;
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
skaaimerken[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struct apparaat *fme_dev;
struct list_head node;
struct list_head bern;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct apparaat *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME Platform Device Inisjalisaasje Flow
FME Inisjalisaasje Flow
- fme_probe() fme_dev_init()
- Inisjalisearje in struct fpga_fme en bewarje it yn it fjild feature_platform_data.private.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Bewarje in struct feature_ops yn de feature_platform_data.features foar elke befolke funksje.
- Rop de testfunksje, as ien, út 'e struktuer.
- Rop de init-funksje út 'e struct.
- fme_probe() fpga_register_dev_ops()
- Meitsje it FME-karakterapparaatknooppunt, registrearje in struktuer file_operaasjes.
Port Platform Device Inisjalisaasje
Dizze seksje jout in oerview fan de koade flow foar haven apparaat inisjalisaasje útfierd troch intel-fpga-afu.ko. De wichtichste gegevensstruktueren en funksjes wurde markearre. Dizze seksje is bêste folge wannear viewing de byhearrende boarnekoade (afu.c).
Port Platform Device Data Struktueren
struct feature_ops {
int (*init)(struct platform_device *pdev, struct funksje *funksje);
int (*unit) (struct platform_device *pdev, struct funksje *funksje);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test) (struct platform_device *pdev, struct funksje *funksje);
};
struct feature {
const char *namme;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex slot;
net ûndertekene lange dev_status;
struct cdev cdev;
struct platform_device *dev;
net ûndertekene int disable_count;
void *privee;
int num;
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 *));
struktuerfunksjes[0];
};
struct fpga_afu_region {
u32 yndeks;
u32 flaggen;
u64 grutte;
u64 offset;
u64 fyk;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 lingte;
u64 iova;
struct side **siden;
struct rb_node node;
bool yn_gebrûk;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head regio's;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Port Platform Device Inisjalisaasje Flow
Port inisjalisaasje Flow
- afu_probe() afu_dev_init()
- Inisjalisearje in struct fpga_afu en bewarje it yn it fjild feature_platform_data.private.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Bewarje in struct feature_ops yn de feature_platform_data.features foar elke befolke funksje.
- Rop de testfunksje, as ien, út 'e struktuer.
- Rop de init-funksje út 'e struct.
- afu_probe() fpga_register_dev_ops()
- Meitsje de poarte-karakterapparaatknooppunt, registrearje in struktuer file_operaasjes.
FME IOCTLs
IOCTLs dy't wurde neamd op in iepen file beskriuwing foar /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—jout de aktuele ferzje werom as in hiel getal, begjinnend fan 0.
FPGA_CHECK_EXTENSION - op it stuit net stipe.
FPGA_FME_PORT_RELEASE—arg is in oanwizer nei in:
struct fpga_fme_port_release {
__u32 argsz; // yn: sizeof(struct fpga_fme_port_release)
__u32 flaggen; // yn: moat 0 wêze
__u32 port_id; // yn: poarte ID (fan 0) to release.
};
FPGA_FME_PORT_ASSIGN—arg is in oanwizer nei in:
struct fpga_fme_port_assign {
__u32 argsz; // yn: sizeof(struct fpga_fme_port_assign)
__u32 flaggen; // yn: moat 0 wêze
__u32 port_id; // yn: poarte ID (fan 0) te tawizen. (moat west hawwe
earder útbrocht troch FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg is in oanwizer nei in:
struct fpga_fme_port_pr {
__u32 argsz; // yn: sizeof(struct fpga_fme_port_pr)
__u32 flaggen; // yn: moat 0 wêze
__u32 port_id; // yn: poarte ID (fan 0)
__u32 buffer_grutte; // yn: grutte fan bitstream buffer yn bytes. Moat 4-byte wêze
ôfstimd.
__u64 buffer_adres; // yn: proses adres fan bitstream buffer
__u64 status; // út: flaterstatus (bitmask)
};
Port IOCTLs
IOCTLs dy't wurde neamd op in iepen file beskriuwing foar /dev/intel-fpga-port.k FPGA_GET_API_VERSION—jout de aktuele ferzje werom as in hiel getal, begjinnend fan 0. FPGA_CHECK_EXTENSION—net op it stuit stipe.
FPGA_PORT_GET_INFO—arg is in oanwizer nei in:
struct fpga_port_info {
__u32 argsz; // yn: sizeof(struct fpga_port_info)
__u32 flaggen; // út: jout 0
__u32 num_regions; // út: oantal MMIO regio, 2 (1 foar AFU en 1 foar
STP)
__u32 num_umsgs; // út: oantal UMsg's stipe troch de hardware
};
FPGA_PORT_GET_REGION_INFO—arg is in oanwizer nei in:
struct fpga_port_region_info {
__u32 argsz; // yn: sizeof(struct fpga_port_region_info)
__u32 flaggen; // út: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 yndeks; // yn: FPGA_PORT_INDEX_UAFU of FPGA_PORT_INDEX_STP
__u32 padding; // yn: moat 0 wêze
__u64 grutte; // út: grutte fan MMIO regio yn bytes
__u64 offset; // út: offset fan MMIO regio fan begjin fan apparaat fd
};
FPGA_PORT_DMA_MAP—arg is in oanwizer nei in:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 flaggen; // yn: moat 0 __u64 user_addr wêze; // yn: proses firtuele
adres. Moat side ôfstimd wêze.
__u64 lingte; // yn: lingte fan mapping yn bytes. Moat in meartal fan siden wêze
grutte.
__u64 iova; // út: IO firtuele adres };
FPGA_PORT_DMA_UNMAP—arg is in oanwizer nei in:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 flaggen; // yn: moat 0 wêze
__u64 iova; // yn: IO firtuele adres werom troch in foarige
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg moat NULL wêze.
- FPGA_PORT_UMSG_ENABLE—arg moat NULL wêze.
- FPGA_PORT_UMSG_DISABLE—args moatte NULL wêze.
FPGA_PORT_UMSG_SET_MODE—arg is in oanwizer nei in:
struct fpga_port_umsg_cfg {
__u32 argsz; // yn: sizeof(struct fpga_port_umsg_cfg)
__u32 flaggen; // yn: moat 0 wêze
__u32 hint_bitmap; // yn: UMsg hint modus bitmap. Jout oan hokker UMsg's binne
ynskeakele.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg moat útskeakele wurde foardat dizze ioctl útjûn wurdt.
- It iova-fjild moat wêze foar in buffer grut genôch foar alle UMsg's (num_umsgs * PAGE_SIZE).
- De buffer wurdt markearre as "yn gebrûk" troch it bufferbehear fan de bestjoerder.
- As iova NULL is, is elke foarige regio net markearre as "yn gebrûk".
- arg is in oanwizer nei in:
struct fpga_port_umsg_base_addr {- u32 argsz; // yn: sizeof(struct fpga_port_umsg_base_addr)
- u32 flaggen; // yn: moat 0 wêze
- u64 iova; // yn: IO firtuele adres fan FPGA_PORT_DMA_MAP. };
Noat:
- Om de poartefouten te wiskjen, moatte jo de krekte bitmasker fan 'e hjoeddeistige flaters skriuwe, bygelyksample, cat flaters> dúdlik
- UMsg wurdt allinnich stipe troch Acceleration Stack foar Intel Xeon Prozessor mei Integrated FPGA.
sysfs Files
FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio fjild | type | tagong |
ports_num | fme_header.capability.num_ports | desimaal int | Allinnich lêzen |
cache_grutte | fme_header.capability.cache_size | desimaal int | Allinnich lêzen |
ferzje | fme_header.capability.fabric_verid | desimaal int | Allinnich lêzen |
socket_id | fme_header.capability.socket_id | desimaal int | Allinnich lêzen |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Allinnich lêzen |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Allinnich lêzen |
FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio fjild | type | tagong |
drompel 1 | thermal.threshold.tmp_thshold1 | desimaal int | Brûker: Allinnich lêze Root: Lêze-skriuwe |
drompel 2 | thermal.threshold.tmp_thshold2 | desimaal int | Brûker: Allinnich lêze Root: Lêze-skriuwe |
threshold_trip | thermal.threshold.therm_trip_thshold | desimaal int | Allinnich lêzen |
threshold1_reached | thermal.threshold.thshold1_status | desimaal int | Allinnich lêzen |
threshold2_reached | thermal.threshold.thshold2_status | desimaal int | Allinnich lêzen |
threshold1_belied | termyske. threshold.thshold_policy | desimaal int | Brûker: Allinnich lêze Root: Lêze-skriuwe |
temperatuer | thermal.rdsensor_fm1.fpga_temp | desimaal int | Allinnich lêzen |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio fjild | type | tagong |
konsumearre | power.status.pwr_consumed | hex uint64_t | Allinnich lêzen |
drompel 1 | power.threshold.threshold1 | hex uint64_t | Brûker: Allinnich lêze Root: Lêze-skriuwe |
drompel 2 | power.threshold.threshold2 | hex uint64_t | Brûker: Allinnich lêze Root: Lêze-skriuwe |
threshold1_status | power.threshold.threshold1_status | desimaal net ûndertekene | Allinnich lêzen |
threshold2_status | power.threshold.threshold2_status | desimaal net ûndertekene | Allinnich lêzen |
rtl | power.status.fpga_latency_report | desimaal net ûndertekene | Allinnich lêzen |
FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio fjild | type | tagong |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Lêze skriuwe |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Lêze skriuwe |
inject_error | gerror.ras_error_inj | hex uint64_t | Lêze skriuwe |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio fjild | type | tagong |
flaters | gerror.fme_err | hex uint64_t | Allinnich lêzen |
first_error | gerror.fme_first_err.err_reg_status | hex uint64_t | Allinnich lêzen |
folgjende_flater | gerror.fme_next_err.err_reg_status | hex uint64_t | Allinnich lêzen |
klear | Wiist flaters, first_error, next_error | ferskate uint64_t | Allinnich skriuwe |
Noat:
Om de FME-flaters te wiskjen, moatte jo de krekte bitmasker fan 'e hjoeddeistige flaters skriuwe, bygelyksample kat flaters > dúdlik.
FME Partial Reconfiguration sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio fjild | type | tagong |
ynterface_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16-byte | Allinnich lêzen |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio fjild | type | tagong |
klok | gperf.clk.afu_interf_clock | hex uint64_t | Allinnich lêzen |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Net jildich foar Acceleration Stack foar Intel Xeon CPU mei FPGA's)
sysfs file | mmio fjild | type | tagong |
frieze | gperf.ch_ctl.freeze | desimaal int | Lêze skriuwe |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Allinnich lêzen |
read_miss | gperf.CACHE_RD_MISS | hex uint64_t | Allinnich lêzen |
skriuwe_hit | gperf.CACHE_WR_HIT | hex uint64_t | Allinnich lêzen |
skriuwe_mis | gperf.CACHE_WR_MISS | hex uint64_t | Allinnich lêzen |
hold_request | gperf.CACHE_HOLD_REQ | hex uint64_t | Allinnich lêzen |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Allinnich lêzen |
sysfs file | mmio fjild | type | tagong |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Allinnich lêzen |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Allinnich lêzen |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Allinnich lêzen |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Net jildich foar Acceleration Stack foar Intel Xeon CPU mei FPGA's)
sysfs file | mmio fjild | type | tagong |
frieze | gperf.vtd_ctl.freeze | desimaal int | Brûker: Allinnich lêze Root: Lêze-skriuwe |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Net jildich foar Acceleration Stack foar Intel Xeon CPU mei FPGA's)
sysfs file | mmio fjild | type | tagong |
read_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Allinnich lêzen |
write_transaction | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Allinnich lêzen |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Allinnich lêzen |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Allinnich lêzen |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio fjild | type | tagong |
ynskeakelje | gperf.fab_ctl.(ynskeakele) | desimaal int | Brûker: Allinnich lêze Root: Lêze-skriuwe |
frieze | gperf.fab_ctl.freeze | desimaal int | Brûker: Allinnich lêze Root: Lêze-skriuwe |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Allinnich lêzen |
pcie0_skriuwe | gperf.FAB_PCIE0_WR | hex uint64_t | Allinnich lêzen |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Allinnich lêzen |
pcie1_skriuwe | gperf.FAB_PCIE1_WR | hex uint64_t | Allinnich lêzen |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Allinnich lêzen |
upi_skriuwe | gperf.FAB_UPI_WR | hex uint64_t | Allinnich lêzen |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio fjild | type | tagong |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Allinnich lêzen |
pcie0_skriuwe | gperf.FAB_PCIE0_WR | hex uint64_t | Allinnich lêzen |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Allinnich lêzen |
pcie1_skriuwe | gperf.FAB_PCIE1_WR | hex uint64_t | Allinnich lêzen |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Allinnich lêzen |
upi_skriuwe | gperf.FAB_UPI_WR | hex uint64_t | Allinnich lêzen |
Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio fjild | type | tagong |
id | port_header.capability.port_number | desimaal int | Allinnich lêzen |
ltr | port_header.control.latency_tolerance | desimaal int | Allinnich lêzen |
Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio fjild | type | tagong |
afu_id | afu_header.guid | hex 16-byte | Allinnich lêzen |
Port Flater sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio fjild | type | tagong |
flaters | perror.port_error | hex uint64_t | Allinnich lêzen |
first_error | perror.port_first_error | hex uint64_t | Allinnich lêzen |
first_malformed_req | perror.malreq | hex 16-byte | Allinnich lêzen |
klear | perror. (alle flaters) | ferskate uint64_t | Allinnich skriuwe |
Noat:
Om de Port-flaters te wiskjen, moatte jo de krekte bitmasker fan 'e hjoeddeistige flaters skriuwe, bygelyksample kat flaters > dúdlik.
Revision Skiednis
Dokumint Ferzje | Feroarings |
2017.10.02 | Inisjele Release. |
OPAE Intel FPGA Linux Device Driver Architecture Guide
Dokuminten / Resources
![]() |
intel OPAE FPGA Linux Device Driver Architecture [pdf] Brûkersgids OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |