intel OPAE FPGA Linux enhedsdriverarkitektur
OPAE Intel FPGA Linux enhedsdriverarkitektur
OPAE Intel FPGA-driveren leverer grænseflader til brugerrumsapplikationer til at konfigurere, opregne, åbne og få adgang til FPGA-acceleratorer på platforme udstyret med Intel FPGA-løsninger og muliggør administrationsfunktioner på systemniveau såsom FPGA-rekonfiguration, strømstyring og virtualisering.
Hardware arkitektur
Fra OS'ets synspunkt view, vises FPGA-hardwaren som en almindelig PCIe-enhed. FPGA-enhedens hukommelse er organiseret ved hjælp af en foruddefineret datastruktur (Device Feature List). Funktioner, der understøttes af FPGA-enheden, eksponeres gennem disse datastrukturer, som illustreret nedenfor i følgende figur:
FPGA PCIe-enhed
Driveren understøtter PCIe SR-IOV til at skabe virtuelle funktioner (VF'er), som kan bruges til at tildele individuelle acceleratorer til virtuelle maskiner.
Intel Corporation. Alle rettigheder forbeholdes. Intel, Intel-logoet og andre Intel-mærker er varemærker tilhørende Intel Corporation eller dets datterselskaber. Intel garanterer ydeevnen af sine FPGA- og halvlederprodukter i henhold til de aktuelle specifikationer i overensstemmelse med Intels standardgaranti, men forbeholder sig retten til at foretage ændringer af produkter og tjenester til enhver tid uden varsel. Intel påtager sig intet ansvar eller erstatningsansvar, der opstår som følge af applikationen eller brugen af nogen information, produkt eller service, der er beskrevet heri, undtagen som udtrykkeligt skriftligt aftalt af Intel. Intel-kunder rådes til at indhente den seneste version af enhedsspecifikationerne, før de stoler på nogen offentliggjort information, og før de afgiver ordrer på produkter eller tjenester.
Andre navne og mærker kan hævdes som andres ejendom.
Virtualiseret FPGA PCIe-enhed
FPGA Management Engine (FME)
FPGA Management Engine udfører strøm- og termisk styring, fejlrapportering, rekonfiguration, ydeevnerapportering og andre infrastrukturfunktioner. Hver FPGA har en FME, som altid er tilgået via den fysiske funktion (PF). Brugerrumsapplikationer kan erhverve eksklusiv adgang til FME ved hjælp af open(), og frigive den ved at bruge close() som en privilegeret bruger (root).
Havn
En port repræsenterer grænsefladen mellem den statiske FPGA-struktur ("FPGA Interface Manager (FIM)") og en delvis rekonfigurerbar region, der indeholder en acceleratorfunktion (AF). Porten styrer kommunikationen fra software til acceleratoren og afslører funktioner som nulstilling og fejlretning. En PCIe-enhed kan have flere porte, og hver port kan eksponeres gennem en VF ved at tildele den ved hjælp af FPGA_FME_PORT_ASSIGN ioctl på FME-enheden.
Accelerator funktion (AF) enhed
- En acceleratorfunktion (AF) enhed er tilsluttet en port og afslører et 256K MMIO-område, der skal bruges til acceleratorspecifikke kontrolregistre.
- Brugerpladsapplikationer kan erhverve eksklusiv adgang til en AFU, der er knyttet til en port, ved at bruge open() på portenheden og frigive den ved hjælp af close().
- User-space-applikationer kan også mmap() accelerator MMIO-regioner.
Delvis omkonfiguration
Som nævnt ovenfor kan acceleratorer omkonfigureres gennem delvis rekonfiguration af en acceleratorfunktion (AF) file. Acceleratorfunktionen (AF) skal være genereret for den nøjagtige FIM og den målrettede statiske region (Port) af FPGA'en; ellers vil rekonfigurationsoperationen mislykkes og muligvis forårsage systemustabilitet. Denne kompatibilitet kan kontrolleres ved at sammenligne grænseflade-id'et, der er noteret i AF-headeren, med grænseflade-id'et, som FME har eksponeret gennem sysfs. Denne kontrol udføres sædvanligvis af brugerpladsen, før rekonfigurationen kaldes IOCTL.
Note:
I øjeblikket skal ethvert softwareprogram, der får adgang til FPGA'en, inklusive dem, der kører i en virtualiseret vært, lukkes, før der forsøges en delvis omkonfiguration. Trinene ville være:
- Aflæs driveren fra gæsten
- Tag stikket til VF ud af gæsten
- Deaktiver SR-IOV
- Udfør delvis omkonfiguration
- Aktiver SR-IOV
- Tilslut VF til gæsten
- Indlæs driveren i gæsten
FPGA virtualisering
For at muliggøre adgang til en accelerator fra applikationer, der kører i en VM, skal den respektive AFU's port tildeles en VF ved at bruge følgende trin:
- PF ejer alle AFU-porte som standard. Enhver port, der skal omtildeles til en VF, skal først frigives fra PF gennem FPGA_FME_PORT_RELEASE ioctl på FME-enheden.
- Når N porte er frigivet fra PF'en, kan kommandoen nedenfor bruges til at aktivere SRIOV og VF'er. Hver VF ejer kun én port med AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
- Gå gennem VF'erne til VM'erne.
- AFU'en under VF er tilgængelig fra applikationer i VM (ved hjælp af den samme driver inde i VF).
Note:
En FME kan ikke tildeles en VF, derfor er PR og andre ledelsesfunktioner kun tilgængelige gennem PF.
Chauffør organisation
PCIe modul enhedsdriver
Chauffør organisation
FPGA-enhederne vises som almindelige PCIe-enheder; således indlæses FPGA PCIe-enhedsdriveren (intel-FPGA-PCI.ko) altid først, når en FPGA PCIe PF eller VF detekteres. Denne driver spiller en infrastrukturel rolle i driverarkitekturen. Det:
- Opretter en FPGA-beholderenhed som en forælder til funktionsenhederne.
- Går gennem Enhedsfunktionslisten, som er implementeret i PCIe-enhedens BAR-hukommelse, for at opdage funktionsenheder og deres underfunktioner og oprette platformsenheder til dem under containerenheden.
- Understøtter SR-IOV.
- Introducerer funktionsenhedsinfrastrukturen, som abstraherer operationer for underfunktioner og eksponerer almindelige funktioner for funktionsenhedsdrivere.
PCIe-modulets enhedsdriverfunktioner
- Indeholder PCIe-opdagelse, enhedsoptælling og funktionsopdagelse.
- Opretter sysfs-mapper til den overordnede enhed, FPGA Management Engine (FME) og port.
- Opretter platformsdriverforekomsterne, hvilket får Linux-kernen til at indlæse deres respektive platformmoduldrivere.
FME Platform Module Device Driver
- Strøm- og termisk styring, fejlrapportering, præstationsrapportering og andre infrastrukturfunktioner. Du kan få adgang til disse funktioner via sysfs-grænseflader, som FME-driveren viser.
- Delvis omkonfiguration. FME-driveren registrerer en FPGA Manager under PR-underfunktionsinitialisering; når den modtager en FPGA_FME_PORT_PR ioctl fra dig, kalder den den fælles grænsefladefunktion fra FPGA Manager for at fuldføre den delvise omkonfiguration af bitstrømmen til den givne port.
- Port management til virtualisering. FME-driveren introducerer to ioctls, FPGA_FME_PORT_RELEASE, som frigiver den givne port fra PF; og FPGA_FME_PORT_ASSIGN, som tildeler porten tilbage til PF. Når porten er frigivet fra PF'en, kan den tildeles til VF'en gennem SR-IOV-grænseflader, der leveres af PCIe-driveren. For mere information henvises til "FPGA Virtualization".
FME Platform Module Device Driver Funktioner
- Opretter FME-karakterenhedens node.
- Opretter FME sysfs files og implementerer FME sysfs file tilbehør.
- Implementerer FME private feature underdrivere.
- FME private feature underdrivere:
- FME Header
- Termisk styring
- Strømstyring
- Global fejl
- Delvis omkonfiguration
- Global ydeevne
Port Platform Module Device Driver
I lighed med FME-driveren undersøges FPGA-port- (og AFU)-driveren (intel-fpga-afu. ko), når portplatformsenheden er oprettet. Hovedfunktionen af dette modul er at give en grænseflade til brugerrumsapplikationer for at få adgang til de individuelle acceleratorer, inklusive grundlæggende nulstillingskontrol på port, AFU MMIO region eksport, DMA buffer mapping service, UMsg(1) notifikation og fjernfejlfindingsfunktioner ( se ovenfor).
UMsg understøttes kun gennem Acceleration Stack til Intel Xeon®-processor med integreret FPGA.
Port Platform Module Device Driver Funktioner
- Opretter portkarakterenhedens node.
- Opretter Port sysfs files og implementerer Port sysfs file tilbehør.
- Implementerer underdriverne til Port private feature.
- Port private funktion underdrivere:
- Porthoved
- AFU
- Portfejl
- UMsg(2)
- Signal Tap
Application FPGA Device Enumeration
Dette afsnit introducerer, hvordan applikationer opregner FPGA-enheden fra sysfs-hierarkiet under /sys/class/fpga. I exampnedenfor er to Intel FPGA-enheder installeret i værten. Hver FPGA-enhed har en FME og to porte (AFU'er). For hver FPGA-enhed oprettes en enhedsmappe under /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Hver node har en FME og to porte (AFU'er) som underordnede enheder:
/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
Generelt er FME/Port sysfs-grænseflader navngivet som følger:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
med I fortløbende nummerering af alle containerenheder, j fortløbende nummerering af FME'erne og k fortløbende nummerering af alle porte.
De enhedsknudepunkter, der bruges til ioctl() og mmap() kan refereres gennem:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe Driver Optælling
Dette afsnit giver en overview af kodeflowet for enhedsoptælling udført af intel-fpga-pci.ko. De vigtigste datastrukturer og funktioner er fremhævet. Dette afsnit følges bedst hvornår viewmed den medfølgende kildekode (pcie.c).
Optællingsdatastrukturer
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statisk struktur idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *navn;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statisk strukturklasse *fpga_class;
statisk struktur 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,}
};
statisk struktur 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 enhed *fme_dev;
struct mutex lås;
struct list_head port_dev_list;
int released_port_num;
struct list_head regioner;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int nuværende_bar;
void __iomem *pfme_hdr;
struct enhed *parent_dev;
struct platform_device *feature_dev;
};
Optællingsflow
- ccidrv_init()
- Initialiser fpga_ids ved hjælp af idr_init().
- Initialiser fpga_chrdevs[i].devt ved hjælp af alloc_chrdev_region().
- Initialiser fpga_class ved hjælp af class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Aktiver PCI-enheden, anmod om adgang til dens områder, indstil PCI-mastertilstand, og konfigurer DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Tildel en struct build_feature_devs_info, initialiser den.
.parent_dev er sat til en overordnet sysfs-mappe (intel-fpga-dev.id), der indeholder FME- og Port sysfs-mapperne.
- Tildel en struct build_feature_devs_info, initialiser den.
- parse_feature_list()
- Gå på BAR0 Device Feature List for at opdage FME, Porten og deres private funktioner.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Når en FME støder på:
- build_info_create_dev()
- Tildel en platformsenhed til FME, der gemmer i build_feature_devs_info.feature_dev.
- feature_dev.id initialiseres til resultatet af idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent er indstillet til build_feature_devs_info.parent_dev.
- Tildel en række strukturressourcer i feature_dev.resource.
- Tildel en struct feature_platform_data, initialiser den og gem en pointer i feature_dev.dev.platform_data
- create_feature_instance() build_info_add_sub_feature()
- Initialiser feature_dev.resource[FME_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Initialiser feature_platform_data.features[FME_FEATURE_ID_HEADER], alt undtagen .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- Når en havn stødes på:
- build_info_create_dev()
- Tildel en platformsenhed til porten, gem i build_feature_devs_info.feature_dev.
- feature_dev.id initialiseres til resultatet af idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent er indstillet til build_feature_devs_info.parent_dev.
- Tildel en matrix af strukturressourcer i feature_dev.resource.
- Tildel en struct feature_platform_data, initialiser den og gem en pointer i feature_dev.dev.platform_data
- build_info_commit_dev()
- Tilføj struct feature_platform_data.node for porten til listen over porte i struct cci_drvdata.port_dev_list
- create_feature_instance() build_info_add_sub_feature()
- Initialiser feature_dev.resource[PORT_FEATURE_ID_HEADER].
- feature_platform_data_add()
- Initialiser feature_platform_data.features[PORT_FEATURE_ID_HEADER], alt undtagen .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Når en AFU stødes på:
- create_feature_instance() build_info_add_sub_feature()
- Initialiser feature_dev.resource[PORT_FEATURE_ID_UAFU].
- feature_platform_data_add()
- Initialiser feature_platform_data.features[PORT_FEATURE_ID_UAFU], alt undtagen .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Når en FME privat funktion støder på:
- create_feature_instance() build_info_add_sub_feature()
- Initialiser feature_dev.resource[id].
- feature_platform_data_add()
- Initialiser feature_platform_data.features[id], alt undtagen .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Når en privat port-funktion stødes på: * create_feature_instance() build_info_add_sub_feature() * Initialiser feature_dev.resource[id]. * feature_platform_data_add() Initialiser feature_platform_data.features[id], alt undtagen .fops.
- parse_ports_from_fme()
- Hvis driveren er indlæst på den fysiske funktion (PF), så:
- Kør parse_feature_list() flowet på hver port beskrevet i FME-headeren.
- Brug den BAR, der er nævnt i hver portindgang i overskriften.
FME-platformenhedsinitialisering
Dette afsnit giver en overview af kodeflowet for initialisering af FME-enheder udført af intel-fpga-fme.ko. De vigtigste datastrukturer og funktioner er fremhævet. Dette afsnit følges bedst hvornår viewmed den medfølgende kildekode (fme-main.c).
FME Platform Device Data Structures
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*unit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struct feature {
const char *navn;
int ressourceindeks;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lås;
usigneret lang dev_status;
struct cdev cdev;
struct platform_enhed *dev;
usigneret int disable_count;
void *privat;
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 *)); struktur
feature features[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struct enhed *fme_dev;
struct list_head node;
struct list_head børn;
struktur kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct enhed *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME Platform Device Initialization Flow
FME initialiseringsflow
- fme_probe() fme_dev_init()
- Initialiser en struct fpga_fme og gem den i feltet feature_platform_data.private.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Gem en struct feature_ops i feature_platform_data.features for hver udfyldt feature.
- Kald testfunktionen, hvis nogen, fra strukturen.
- Kald init-funktionen fra struct.
- fme_probe() fpga_register_dev_ops()
- Opret FME-karakterenhedens node, og registrer en struktur file_operationer.
Initialisering af portplatformenhed
Dette afsnit giver en overview af kodeflowet for portenhedsinitiering udført af intel-fpga-afu.ko. De vigtigste datastrukturer og funktioner er fremhævet. Dette afsnit følges bedst hvornår viewmed den medfølgende kildekode (afu.c).
Port Platform Device Data Structures
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*unit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struct feature {
const char *navn;
int ressourceindeks;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lås;
usigneret lang dev_status;
struct cdev cdev;
struct platform_enhed *dev;
usigneret int disable_count;
void *privat;
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 feature features[0];
};
struct fpga_afu_region {
u32 indeks;
u32 flag;
u64 størrelse;
u64 offset;
u64 fysik;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 brugeradr;
u64 længde;
u64 iova;
struct side **sider;
struct rb_node node;
bool i_brug;
};
struct fpga_afu {
u64 region_cur_offset;
int antal_regioner;
u8 num_umsgs;
struct list_head regioner;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Port Platform Device Initialization Flow
Portinitialiseringsflow
- afu_probe() afu_dev_init()
- Initialiser en struct fpga_afu og gem den i feltet feature_platform_data.private.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Gem en struct feature_ops i feature_platform_data.features for hver udfyldt feature.
- Kald testfunktionen, hvis nogen, fra strukturen.
- Kald init-funktionen fra struct.
- afu_probe() fpga_register_dev_ops()
- Opret portkarakterenhedens node, og registrer en struct file_operationer.
FME IOCTL'er
IOCTL'er, der kaldes på en åben file deskriptor for /dev/intel-fpga-fme.j FPGA_GET_API_VERSION – returner den aktuelle version som et heltal, startende fra 0.
FPGA_CHECK_EXTENSION – understøttes ikke i øjeblikket.
FPGA_FME_PORT_RELEASE—arg er en pegepind til en:
struct fpga_fme_port_release {
__u32 argsz; // i: sizeof(struct fpga_fme_port_release)
__u32 flag; // in: skal være 0
__u32 port_id; // in: port ID (fra 0) til frigivelse.
};
FPGA_FME_PORT_ASSIGN—arg er en pegepind til en:
struct fpga_fme_port_assign {
__u32 argsz; // i: sizeof(struct fpga_fme_port_assign)
__u32 flag; // in: skal være 0
__u32 port_id; // in: port ID (fra 0) at tildele. (må have været
tidligere udgivet af FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg er en pegepind til en:
struct fpga_fme_port_pr {
__u32 argsz; // i: sizeof(struct fpga_fme_port_pr)
__u32 flag; // in: skal være 0
__u32 port_id; // i: port-id (fra 0)
__u32 buffer_size; // in: størrelsen af bitstream buffer i bytes. Skal være 4-byte
justeret.
__u64 buffer_adresse; // in: procesadresse på bitstream buffer
__u64 status; // ud: fejlstatus (bitmaske)
};
Port IOCTL'er
IOCTL'er, der kaldes på en åben file deskriptor for /dev/intel-fpga-port.k FPGA_GET_API_VERSION – returner den aktuelle version som et heltal, startende fra 0. FPGA_CHECK_EXTENSION – understøttes ikke i øjeblikket.
FPGA_PORT_GET_INFO—arg er en pegepind til en:
struct fpga_port_info {
__u32 argsz; // i: sizeof(struct fpga_port_info)
__u32 flag; // ud: returnerer 0
__u32 antal_regioner; // ud: antal MMIO-regioner, 2 (1 for AFU og 1 for
STP)
__u32 num_umsgs; // ud: antallet af UMsg'er understøttet af hardwaren
};
FPGA_PORT_GET_REGION_INFO—arg er en pegepind til en:
struct fpga_port_region_info {
__u32 argsz; // i: sizeof(struct fpga_port_region_info)
__u32 flag; // ud: (bitmaske) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indeks; // i: FPGA_PORT_INDEX_UAFU eller FPGA_PORT_INDEX_STP
__u32 polstring; // in: skal være 0
__u64 størrelse; // ud: størrelsen af MMIO-regionen i bytes
__u64 offset; // ud: forskydning af MMIO-region fra start af enhed fd
};
FPGA_PORT_DMA_MAP—arg er en pegepind til en:
struct fpga_port_dma_map {
__u32 argsz; // i: sizeof(struct fpga_port_dma_map)
__u32 flag; // in: skal være 0 __u64 user_addr; // i: proces virtuel
adresse. Skal sidejusteres.
__u64 længde; // in: længde af kortlægning i bytes. Skal være et multiplum af sider
størrelse.
__u64 iova; // ud: IO virtuel adresse };
FPGA_PORT_DMA_UNMAP—arg er en pegepind til en:
struct fpga_port_dma_unmap {
__u32 argsz; // i: sizeof(struct fpga_port_dma_unmap)
__u32 flag; // in: skal være 0
__u64 iova; // in: IO virtuel adresse returneret af en tidligere
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg skal være NULL.
- FPGA_PORT_UMSG_ENABLE—arg skal være NULL.
- FPGA_PORT_UMSG_DISABLE—args skal være NULL.
FPGA_PORT_UMSG_SET_MODE—arg er en pegepind til en:
struct fpga_port_umsg_cfg {
__u32 argsz; // i: sizeof(struct fpga_port_umsg_cfg)
__u32 flag; // in: skal være 0
__u32 hint_bitmap; // i: UMsg tiptilstand bitmap. Angiver hvilke UMsg'er
aktiveret.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg skal deaktiveres, før du udsteder denne ioctl.
- Iova-feltet skal være til en buffer, der er stor nok til alle UMsg'er (num_umsgs * PAGE_SIZE).
- Bufferen er markeret som "i brug" af førerens bufferstyring.
- Hvis iova er NULL, er enhver tidligere region ikke markeret som "i brug".
- arg er en pegepind til en:
struct fpga_port_umsg_base_addr {- u32 argsz; // i: sizeof(struct fpga_port_umsg_base_addr)
- u32 flag; // in: skal være 0
- u64 iova; // i: IO virtuel adresse fra FPGA_PORT_DMA_MAP. };
Note:
- For at rydde portfejlene skal du skrive den nøjagtige bitmask af de aktuelle fejl, f.eksample, kat fejl > clear
- UMsg understøttes kun gennem Acceleration Stack til Intel Xeon-processor med integreret FPGA.
sysfs Files
FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio felt | type | adgang |
ports_num | fme_header.capability.num_ports | decimal int | Skrivebeskyttet |
cache_størrelse | fme_header.capability.cache_size | decimal int | Skrivebeskyttet |
version | fme_header.capability.fabric_verid | decimal int | Skrivebeskyttet |
socket_id | fme_header.capability.socket_id | decimal int | Skrivebeskyttet |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Skrivebeskyttet |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Skrivebeskyttet |
FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio felt | type | adgang |
tærskel 1 | thermal.threshold.tmp_thshold1 | decimal int | Bruger: Skrivebeskyttet Root: Læs-skriv |
tærskel 2 | thermal.threshold.tmp_thshold2 | decimal int | Bruger: Skrivebeskyttet Root: Læs-skriv |
threshold_trip | thermal.threshold.therm_trip_thshold | decimal int | Skrivebeskyttet |
threshold1_reached | thermal.threshold.thshold1_status | decimal int | Skrivebeskyttet |
threshold2_reached | thermal.threshold.thshold2_status | decimal int | Skrivebeskyttet |
threshold1_policy | termisk. threshold.thshold_policy | decimal int | Bruger: Skrivebeskyttet Root: Læs-skriv |
temperatur | termisk.rdsensor_fm1.fpga_temp | decimal int | Skrivebeskyttet |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio felt | type | adgang |
forbruges | power.status.pwr_consumed | hex uint64_t | Skrivebeskyttet |
tærskel 1 | effekttærskel.tærskel1 | hex uint64_t | Bruger: Skrivebeskyttet Root: Læs-skriv |
tærskel 2 | effekttærskel.tærskel2 | hex uint64_t | Bruger: Skrivebeskyttet Root: Læs-skriv |
tærskel1_status | power.threshold.threshold1_status | decimal uden fortegn | Skrivebeskyttet |
tærskel2_status | power.threshold.threshold2_status | decimal uden fortegn | Skrivebeskyttet |
rtl | power.status.fpga_latency_report | decimal uden fortegn | Skrivebeskyttet |
FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio felt | type | adgang |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Læse skrive |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Læse skrive |
inject_error | gerror.ras_error_inj | hex uint64_t | Læse skrive |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio felt | type | adgang |
fejl | gerror.fme_err | hex uint64_t | Skrivebeskyttet |
første_fejl | gerror.fme_first_err.err_reg_status | hex uint64_t | Skrivebeskyttet |
næste_fejl | gerror.fme_next_err.err_reg_status | hex uint64_t | Skrivebeskyttet |
klar | Rydder fejl, first_error, next_error | forskellige uint64_t | Kun skrive |
Note:
For at slette FME-fejlene skal du skrive den nøjagtige bitmask af de aktuelle fejl, f.eksample cat fejl > clear.
FME Partial Reconfiguration sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio felt | type | adgang |
interface_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16-byte | Skrivebeskyttet |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio felt | type | adgang |
ur | gperf.clk.afu_interf_clock | hex uint64_t | Skrivebeskyttet |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ikke gyldig for Acceleration Stack for Intel Xeon CPU med FPGA'er)
sysfs file | mmio felt | type | adgang |
fryse | gperf.ch_ctl.freeze | decimal int | Læse skrive |
læs_hit | gperf.CACHE_RD_HIT | hex uint64_t | Skrivebeskyttet |
læs_miss | gperf.CACHE_RD_MISS | hex uint64_t | Skrivebeskyttet |
skrive_hit | gperf.CACHE_WR_HIT | hex uint64_t | Skrivebeskyttet |
skrive_miss | gperf.CACHE_WR_MISS | hex uint64_t | Skrivebeskyttet |
hold_anmodning | gperf.CACHE_HOLD_REQ | hex uint64_t | Skrivebeskyttet |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Skrivebeskyttet |
sysfs file | mmio felt | type | adgang |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Skrivebeskyttet |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Skrivebeskyttet |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Skrivebeskyttet |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ikke gyldig for Acceleration Stack for Intel Xeon CPU med FPGA'er)
sysfs file | mmio felt | type | adgang |
fryse | gperf.vtd_ctl.freeze | decimal int | Bruger: Skrivebeskyttet Root: Læs-skriv |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ikke gyldig for Acceleration Stack for Intel Xeon CPU med FPGA'er)
sysfs file | mmio felt | type | adgang |
læs_transaktion | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Skrivebeskyttet |
skrive_transaktion | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Skrivebeskyttet |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Skrivebeskyttet |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Skrivebeskyttet |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio felt | type | adgang |
aktivere | gperf.fab_ctl.(aktiveret) | decimal int | Bruger: Skrivebeskyttet Root: Læs-skriv |
fryse | gperf.fab_ctl.freeze | decimal int | Bruger: Skrivebeskyttet Root: Læs-skriv |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Skrivebeskyttet |
pcie0_skriv | gperf.FAB_PCIE0_WR | hex uint64_t | Skrivebeskyttet |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Skrivebeskyttet |
pcie1_skriv | gperf.FAB_PCIE1_WR | hex uint64_t | Skrivebeskyttet |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Skrivebeskyttet |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Skrivebeskyttet |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio felt | type | adgang |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Skrivebeskyttet |
pcie0_skriv | gperf.FAB_PCIE0_WR | hex uint64_t | Skrivebeskyttet |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Skrivebeskyttet |
pcie1_skriv | gperf.FAB_PCIE1_WR | hex uint64_t | Skrivebeskyttet |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Skrivebeskyttet |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Skrivebeskyttet |
Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio felt | type | adgang |
id | port_header.capability.port_number | decimal int | Skrivebeskyttet |
ltr | port_header.control.latency_tolerance | decimal int | Skrivebeskyttet |
Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio felt | type | adgang |
afu_id | afu_header.guid | hex 16-byte | Skrivebeskyttet |
Portfejl sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio felt | type | adgang |
fejl | perror.port_error | hex uint64_t | Skrivebeskyttet |
første_fejl | perror.port_first_error | hex uint64_t | Skrivebeskyttet |
first_malformed_req | perror.malreq | hex 16-byte | Skrivebeskyttet |
klar | fejl.(alle fejl) | forskellige uint64_t | Kun skrive |
Note:
For at rydde portfejlene skal du skrive den nøjagtige bitmask af de aktuelle fejl, f.eksample cat fejl > clear.
Revisionshistorie
Dokumentversion | Ændringer |
2017.10.02 | Første udgivelse. |
OPAE Intel FPGA Linux Device Driver Architecture Guide
Dokumenter/ressourcer
![]() |
intel OPAE FPGA Linux enhedsdriverarkitektur [pdfBrugervejledning OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |