intel OPAE FPGA Linux enhetsdriverarkitektur
OPAE Intel FPGA Linux enhetsdriverarkitektur
OPAE Intel FPGA-driveren gir grensesnitt for brukerromsapplikasjoner for å konfigurere, telle, åpne og få tilgang til FPGA-akseleratorer på plattformer utstyrt med Intel FPGA-løsninger og muliggjør administrasjonsfunksjoner på systemnivå som FPGA-rekonfigurering, strømstyring og virtualisering.
Maskinvarearkitektur
Fra operativsystemets synspunkt view, vises FPGA-maskinvaren som en vanlig PCIe-enhet. FPGA-enhetsminnet er organisert ved hjelp av en forhåndsdefinert datastruktur (Device Feature List). Funksjoner som støttes av FPGA-enheten blir eksponert gjennom disse datastrukturene, som illustrert nedenfor i følgende figur:
FPGA PCIe-enhet
Driveren støtter PCIe SR-IOV for å lage virtuelle funksjoner (VF) som kan brukes til å tilordne individuelle akseleratorer til virtuelle maskiner.
Intel Corporation. Alle rettigheter forbeholdt. Intel, Intel-logoen og andre Intel-merker er varemerker for Intel Corporation eller dets datterselskaper. Intel garanterer ytelsen til sine FPGA- og halvlederprodukter i henhold til gjeldende spesifikasjoner i henhold til Intels standardgaranti, men forbeholder seg retten til å gjøre endringer i produkter og tjenester når som helst uten varsel. Intel påtar seg intet ansvar eller ansvar som oppstår som følge av applikasjonen eller bruken av informasjon, produkter eller tjenester som er beskrevet her, med mindre det er uttrykkelig skriftlig avtalt med Intel. Intel-kunder anbefales å få tak i den nyeste versjonen av enhetsspesifikasjonene før de stoler på publisert informasjon og før de bestiller produkter eller tjenester.
Andre navn og merker kan gjøres krav på som andres eiendom.
Virtualisert FPGA PCIe-enhet
FPGA Management Engine (FME)
FPGA Management Engine utfører strøm- og termisk styring, feilrapportering, rekonfigurering, ytelsesrapportering og andre infrastrukturfunksjoner. Hver FPGA har én FME, som alltid er tilgjengelig via Physical Function (PF). Brukerplassapplikasjoner kan få eksklusiv tilgang til FME ved å bruke open(), og frigi den ved å bruke close() som en privilegert bruker (root).
Havn
En port representerer grensesnittet mellom det statiske FPGA-stoffet ("FPGA Interface Manager (FIM)") og en delvis rekonfigurerbar region som inneholder en akseleratorfunksjon (AF). Porten kontrollerer kommunikasjonen fra programvare til akseleratoren og avslører funksjoner som tilbakestilling og feilsøking. En PCIe-enhet kan ha flere porter, og hver port kan eksponeres gjennom en VF ved å tilordne den ved å bruke FPGA_FME_PORT_ASSIGN ioctl på FME-enheten.
Akseleratorfunksjon (AF) enhet
- En akseleratorfunksjon (AF)-enhet er koblet til en port og avslører et 256K MMIO-område som skal brukes for akseleratorspesifikke kontrollregistre.
- Brukerplassapplikasjoner kan få eksklusiv tilgang til en AFU koblet til en port ved å bruke open() på portenheten, og frigi den ved å bruke close().
- Brukerplassapplikasjoner kan også mmap()-akselerator MMIO-regioner.
Delvis rekonfigurering
Som nevnt ovenfor kan akseleratorer rekonfigureres gjennom delvis rekonfigurering av en akseleratorfunksjon (AF) file. Akseleratorfunksjonen (AF) må ha blitt generert for nøyaktig FIM og målrettet statisk region (Port) til FPGA; ellers vil rekonfigureringsoperasjonen mislykkes og muligens forårsake systemustabilitet. Denne kompatibiliteten kan kontrolleres ved å sammenligne grensesnitt-IDen notert i AF-overskriften med grensesnitt-IDen som er eksponert av FME gjennom sysfs. Denne kontrollen gjøres vanligvis av brukerplass før du kaller rekonfigurasjonen IOCTL.
Note:
Foreløpig må ethvert program som har tilgang til FPGA, inkludert de som kjører i en virtualisert vert, lukkes før du forsøker en delvis rekonfigurering. Trinnene vil være:
- Last ut sjåføren fra gjesten
- Koble VF fra gjesten
- Deaktiver SR-IOV
- Utfør delvis rekonfigurering
- Aktiver SR-IOV
- Koble VF til gjesten
- Last sjåføren i gjesten
FPGA-virtualisering
For å aktivere tilgang til en akselerator fra applikasjoner som kjører i en VM, må den respektive AFU-porten tildeles en VF ved å bruke følgende trinn:
- PF eier alle AFU-porter som standard. Enhver port som må tilordnes på nytt til en VF må først frigjøres fra PF gjennom FPGA_FME_PORT_RELEASE ioctl på FME-enheten.
- Når N porter er frigjort fra PF, kan kommandoen nedenfor brukes til å aktivere SRIOV og VF. Hver VF eier bare én port med AFU. ekko N > PCI_DEVICE_PATH/sriov_numvfs
- Gå gjennom VF-ene til VM-ene.
- AFU under VF er tilgjengelig fra applikasjoner i VM (med samme driver inne i VF).
Note:
En FME kan ikke tilordnes en VF, derfor er PR og andre administrasjonsfunksjoner kun tilgjengelige gjennom PF.
Sjåførorganisasjon
PCIe-modulenhetsdriver
Sjåførorganisasjon
FPGA-enhetene vises som vanlige PCIe-enheter; dermed blir FPGA PCIe-enhetsdriveren (intel-FPGA-PCI.ko) alltid lastet først når en FPGA PCIe PF eller VF oppdages. Denne driveren spiller en infrastrukturell rolle i driverarkitekturen. Den:
- Oppretter en FPGA-beholderenhet som en forelder for funksjonsenhetene.
- Går gjennom enhetsfunksjonslisten, som er implementert i PCIe-enhetens BAR-minne, for å oppdage funksjonsenheter og deres underfunksjoner og lage plattformenheter for dem under containerenheten.
- Støtter SR-IOV.
- Introduserer funksjonsenhetsinfrastrukturen, som abstraherer operasjoner for underfunksjoner og eksponerer vanlige funksjoner for funksjonsenhetsdrivere.
PCIe-modulens enhetsdriverfunksjoner
- Inneholder PCIe-oppdagelse, enhetsopptelling og funksjonsoppdagelse.
- Oppretter sysfs-kataloger for overordnet enhet, FPGA Management Engine (FME) og port.
- Oppretter plattformdriverforekomstene, noe som får Linux-kjernen til å laste deres respektive plattformmoduldrivere.
FME Platform Module Device Driver
- Strøm- og termisk styring, feilrapportering, ytelsesrapportering og andre infrastrukturfunksjoner. Du kan få tilgang til disse funksjonene via sysfs-grensesnitt som er eksponert av FME-driveren.
- Delvis rekonfigurering. FME-driveren registrerer en FPGA Manager under initialisering av PR-delfunksjoner; når den mottar en FPGA_FME_PORT_PR ioctl fra deg, påkaller den felles grensesnittfunksjonen fra FPGA Manager for å fullføre den delvise rekonfigureringen av bitstrømmen til den gitte porten.
- Portadministrasjon for virtualisering. FME-driveren introduserer to ioctls, FPGA_FME_PORT_RELEASE, som frigjør den gitte porten fra PF; og FPGA_FME_PORT_ASSIGN, som tildeler porten tilbake til PF. Når porten er frigjort fra PF, kan den tilordnes til VF gjennom SR-IOV-grensesnittene som leveres av PCIe-driveren. For mer informasjon, se "FPGA Virtualization".
FME-plattformmodulens enhetsdriverfunksjoner
- Oppretter enhetsnoden for FME-tegn.
- Oppretter FME sysfs files og implementerer FME sysfs file tilbehør.
- Implementerer FMEs private funksjons underdrivere.
- FME private funksjons underdrivere:
- FME Header
- Termisk styring
- Strømstyring
- Global feil
- Delvis rekonfigurering
- Global ytelse
Port Platform Module Device Driver
I likhet med FME-driveren undersøkes FPGA-port- (og AFU)-driveren (intel-fpga-afu. ko) når portplattformenheten er opprettet. Hovedfunksjonen til denne modulen er å gi et grensesnitt for brukerromsapplikasjoner for å få tilgang til de individuelle akseleratorene, inkludert grunnleggende tilbakestillingskontroll på port, AFU MMIO-regioneksport, DMA-bufferkartleggingstjeneste, UMsg(1)-varsling og eksterne debug-funksjoner ( se ovenfor).
UMsg støttes kun gjennom Acceleration Stack for Intel Xeon®-prosessor med integrert FPGA.
Port Platform Module enhetsdriverfunksjoner
- Oppretter enhetsnoden for portkarakter.
- Oppretter Port sysfs files og implementerer Port sysfs file tilbehør.
- Implementerer underdriverne for port private funksjonen.
- Port private funksjon underdrivere:
- Porthode
- AFU
- Portfeil
- UMsg(2)
- Signaltrykk
Applikasjons-FPGA-enhetsoppregning
Denne delen introduserer hvordan applikasjoner teller opp FPGA-enheten fra sysfs-hierarkiet under /sys/class/fpga. I eksamplen nedenfor er to Intel FPGA-enheter installert i verten. Hver FPGA-enhet har én FME og to porter (AFUer). For hver FPGA-enhet opprettes en enhetskatalog 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 porter (AFUer) som underordnede enheter:
/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-grensesnittene navngitt 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øpende nummerering av alle containerenhetene, j fortløpende nummerering av FME-ene og k fortløpende nummerering av alle porter.
Enhetsnodene som brukes for ioctl() og mmap() kan refereres gjennom:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe-driveroppregning
Denne delen gir en overview av kodeflyten for enhetsoppregning utført av intel-fpga-pci.ko. De viktigste datastrukturene og funksjonene er uthevet. Denne delen følges best når viewmed den medfølgende kildekoden (pcie.c).
Oppregningsdatastrukturer
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 enhet *fme_dev;
struktur 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 gjeldende_bar;
void __iomem *pfme_hdr;
struct enhet *parent_dev;
struct platform_device *feature_dev;
};
Oppregningsflyt
- ccidrv_init()
- Initialiser fpga_ids ved å bruke idr_init().
- Initialiser fpga_chrdevs[i].devt ved å bruke alloc_chrdev_region().
- Initialiser fpga_class ved å bruke class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Aktiver PCI-enheten, be om tilgang til regionene, angi PCI-mastermodus og konfigurer DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Tildel en struktur build_feature_devs_info, initialiser den.
.parent_dev er satt til en overordnet sysfs-katalog (intel-fpga-dev.id) som inneholder FME- og Port sysfs-katalogene.
- Tildel en struktur build_feature_devs_info, initialiser den.
- parse_feature_list()
- Gå gjennom BAR0 Device Feature List for å oppdage FME, porten og deres private funksjoner.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Når en FME støter på:
- build_info_create_dev()
- Tildel en plattformenhet for FME, lagre i build_feature_devs_info.feature_dev.
- feature_dev.id initialiseres til resultatet av idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent er satt til build_feature_devs_info.parent_dev.
- Tildel en rekke strukturressurser i feature_dev.resource.
- Tildel en struktur feature_platform_data, initialiser den og lagre en peker 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 annet enn .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- Når en port oppdages:
- build_info_create_dev()
- Tildel en plattformenhet for porten, lagre i build_feature_devs_info.feature_dev.
- feature_dev.id initialiseres til resultatet av idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent er satt til build_feature_devs_info.parent_dev.
- Tildel en matrise med strukturressurs i feature_dev.resource.
- Tildel en struktur feature_platform_data, initialiser den og lagre en peker i feature_dev.dev.platform_data
- build_info_commit_dev()
- Legg til struct feature_platform_data.node for porten til listen over porter 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 annet enn .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Når en AFU oppdages:
- 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 annet enn .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Når en FME-privat funksjon oppdages:
- create_feature_instance() build_info_add_sub_feature()
- Initialiser feature_dev.resource[id].
- feature_platform_data_add()
- Initialiser feature_platform_data.features[id], alt annet enn .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Når en privat port-funksjon oppstår: * create_feature_instance() build_info_add_sub_feature() * Initialiser feature_dev.resource[id]. * feature_platform_data_add() Initialiser feature_platform_data.features[id], alt annet enn .fops.
- parse_ports_from_fme()
- Hvis driveren er lastet på Physical Function (PF), så:
- Kjør parse_feature_list()-flyten på hver port beskrevet i FME-overskriften.
- Bruk BAR nevnt i hver portoppføring i overskriften.
FME-plattformenhetsinitialisering
Denne delen gir en overview av kodeflyten for initialisering av FME-enhet utført av intel-fpga-fme.ko. De viktigste datastrukturene og funksjonene er fremhevet. Denne delen følges best når viewmed den medfølgende kildekoden (fme-main.c).
FME Platform Device Data Structures
struct feature_ops {
int (*init)(struct platform_device *pdev, struct funksjon *funksjon);
int (*unit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
usignert int cmd, usignert lang arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struktur funksjon {
const char *navn;
int ressursindeks;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struktur mutex lås;
usignert lang dev_status;
struct cdev cdev;
struct platform_device *dev;
usignert 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
funksjoner[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struct enhet *fme_dev;
struct list_head node;
struct list_head barn;
struktur kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_feil;
struktur enhet *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME-plattformenhetsinitialiseringsflyt
FME initialiseringsflyt
- fme_probe() fme_dev_init()
- Initialiser en struktur fpga_fme og lagre den i feature_platform_data.private-feltet.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Lagre en struct feature_ops i feature_platform_data.features for hver fylte funksjon.
- Kalle opp testfunksjonen, hvis noen, fra strukturen.
- Kalle init-funksjonen fra strukturen.
- fme_probe() fpga_register_dev_ops()
- Opprett enhetsnoden for FME-tegn ved å registrere en struktur file_operasjoner.
Initialisering av portplattformenhet
Denne delen gir en overview av kodeflyten for initialisering av portenhet utført av intel-fpga-afu.ko. De viktigste datastrukturene og funksjonene er uthevet. Denne delen følges best når viewmed den medfølgende kildekoden (afu.c).
Port Platform Device Data Structures
struct feature_ops {
int (*init)(struct platform_device *pdev, struct funksjon *funksjon);
int (*unit)(struct platform_device *pdev, struct feature *feature);
long (*ioctl)(struct platform_device *pdev, struct feature *feature,
usignert int cmd, usignert lang arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
struktur funksjon {
const char *navn;
int ressursindeks;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struktur mutex lås;
usignert lang dev_status;
struct cdev cdev;
struct platform_device *dev;
usignert 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 flagg;
u64 størrelse;
u64 offset;
u64 fysikk;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 lengde;
u64 iova;
struktur side **sider;
struct rb_node node;
bool i_bruk;
};
struct fpga_afu {
u64 region_cur_offset;
int antall_regioner;
u8 num_umsgs;
struct list_head regioner;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Flyt for initialisering av portplattformenhet
Portinitialiseringsflyt
- afu_probe() afu_dev_init()
- Initialiser en struktur fpga_afu og lagre den i feature_platform_data.private-feltet.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Lagre en struct feature_ops i feature_platform_data.features for hver fylte funksjon.
- Kalle opp testfunksjonen, hvis noen, fra strukturen.
- Kalle init-funksjonen fra strukturen.
- afu_probe() fpga_register_dev_ops()
- Opprett portkarakterenhetsnoden, og registrer en struktur file_operasjoner.
FME IOCTLs
IOCTL-er som kalles på en åpen file deskriptor for /dev/intel-fpga-fme.j FPGA_GET_API_VERSION – returner gjeldende versjon som et heltall, fra 0.
FPGA_CHECK_EXTENSION – støttes ikke for øyeblikket.
FPGA_FME_PORT_RELEASE—arg er en peker til en:
struct fpga_fme_port_release {
__u32 argsz; // i: sizeof(struct fpga_fme_port_release)
__u32 flagg; // in: må være 0
__u32 port_id; // i: port-ID (fra 0) for å frigi.
};
FPGA_FME_PORT_ASSIGN—arg er en peker til en:
struct fpga_fme_port_assign {
__u32 argsz; // i: sizeof(struct fpga_fme_port_assign)
__u32 flagg; // in: må være 0
__u32 port_id; // i: port-ID (fra 0) å tildele. (må ha vært
tidligere utgitt av FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg er en peker til en:
struct fpga_fme_port_pr {
__u32 argsz; // i: sizeof(struct fpga_fme_port_pr)
__u32 flagg; // in: må være 0
__u32 port_id; // i: port-ID (fra 0)
__u32 buffer_size; // in: størrelsen på bitstrømbufferen i byte. Må være 4-byte
justert.
__u64 buffer_adresse; // in: prosessadresse til bitstrømbuffer
__u64 status; // ut: feilstatus (bitmaske)
};
Port IOCTL-er
IOCTL-er som kalles på en åpen file deskriptor for /dev/intel-fpga-port.k FPGA_GET_API_VERSION – returner gjeldende versjon som et heltall, fra 0. FPGA_CHECK_EXTENSION – støttes ikke for øyeblikket.
FPGA_PORT_GET_INFO—arg er en peker til en:
struct fpga_port_info {
__u32 argsz; // i: sizeof(struct fpga_port_info)
__u32 flagg; // ut: returnerer 0
__u32 antall_regioner; // ut: antall MMIO-regioner, 2 (1 for AFU og 1 for
STP)
__u32 num_umsgs; // ut: antall UMsg-er som støttes av maskinvaren
};
FPGA_PORT_GET_REGION_INFO—arg er en peker til en:
struct fpga_port_region_info {
__u32 argsz; // i: sizeof(struct fpga_port_region_info)
__u32 flagg; // ut: (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: må være 0
__u64 størrelse; // ut: størrelsen på MMIO-regionen i byte
__u64 offset; // ut: forskyvning av MMIO-regionen fra starten av enheten fd
};
FPGA_PORT_DMA_MAP—arg er en peker til en:
struct fpga_port_dma_map {
__u32 argsz; // i: sizeof(struct fpga_port_dma_map)
__u32 flagg; // in: må være 0 __u64 user_addr; // i: prosess virtuell
adresse. Må sidejusteres.
__u64 lengde; // in: lengden på tilordningen i byte. Må være flere sider
størrelse.
__u64 iova; // ut: IO virtuell adresse };
FPGA_PORT_DMA_UNMAP—arg er en peker til en:
struct fpga_port_dma_unmap {
__u32 argsz; // i: sizeof(struct fpga_port_dma_unmap)
__u32 flagg; // in: må være 0
__u64 iova; // in: IO virtuell adresse returnert av en tidligere
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—arg må være NULL.
- FPGA_PORT_UMSG_ENABLE—arg må være NULL.
- FPGA_PORT_UMSG_DISABLE—args må være NULL.
FPGA_PORT_UMSG_SET_MODE—arg er en peker til en:
struct fpga_port_umsg_cfg {
__u32 argsz; // i: sizeof(struct fpga_port_umsg_cfg)
__u32 flagg; // in: må være 0
__u32 hint_bitmap; // i: UMsg hint-modus punktgrafikk. Angir hvilke UMsg-er
aktivert.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg må deaktiveres før utstedelse av denne ioctl.
- Iova-feltet må være for en buffer som er stor nok for alle UMsg (num_umsgs * PAGE_SIZE).
- Bufferen er merket som "i bruk" av sjåførens bufferadministrasjon.
- Hvis iova er NULL, er enhver tidligere region umerket som "i bruk".
- arg er en peker til en:
struct fpga_port_umsg_base_addr {- u32 argsz; // i: sizeof(struct fpga_port_umsg_base_addr)
- u32 flagg; // in: må være 0
- u64 iova; // i: IO virtuell adresse fra FPGA_PORT_DMA_MAP. };
Note:
- For å fjerne portfeilene må du skrive den nøyaktige bitmasken for gjeldende feil, for eksempelample, cat errors > clear
- UMsg støttes kun gjennom Acceleration Stack for Intel Xeon-prosessor med integrert 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 | desimal int | Skrivebeskyttet |
cache_size | fme_header.capability.cache_size | desimal int | Skrivebeskyttet |
versjon | fme_header.capability.fabric_verid | desimal int | Skrivebeskyttet |
socket_id | fme_header.capability.socket_id | desimal 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 |
terskel1 | termisk.terskel.tmp_thshold1 | desimal int | Bruker: Skrivebeskyttet Root: Les-skriv |
terskel2 | termisk.terskel.tmp_thshold2 | desimal int | Bruker: Skrivebeskyttet Root: Les-skriv |
threshold_trip | thermal.threshold.therm_trip_thshold | desimal int | Skrivebeskyttet |
terskel1_nådd | thermal.threshold.thshold1_status | desimal int | Skrivebeskyttet |
terskel2_nådd | thermal.threshold.thshold2_status | desimal int | Skrivebeskyttet |
threshold1_policy | termisk. threshold.thshold_policy | desimal int | Bruker: Skrivebeskyttet Root: Les-skriv |
temperatur | termisk.rdsensor_fm1.fpga_temp | desimal int | Skrivebeskyttet |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio felt | type | adgang |
konsumert | power.status.pwr_consumed | hex uint64_t | Skrivebeskyttet |
terskel1 | effektterskel.terskel1 | hex uint64_t | Bruker: Skrivebeskyttet Root: Les-skriv |
terskel2 | effektterskel.terskel2 | hex uint64_t | Bruker: Skrivebeskyttet Root: Les-skriv |
terskel1_status | power.threshold.threshold1_status | desimal uten fortegn | Skrivebeskyttet |
terskel2_status | power.threshold.threshold2_status | desimal uten fortegn | Skrivebeskyttet |
rtl | power.status.fpga_latency_report | desimal uten 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 | Les Skriv |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Les Skriv |
inject_error | gerror.ras_error_inj | hex uint64_t | Les Skriv |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio felt | type | adgang |
feil | gerror.fme_err | hex uint64_t | Skrivebeskyttet |
first_error | gerror.fme_first_err.err_reg_status | hex uint64_t | Skrivebeskyttet |
neste_feil | gerror.fme_next_err.err_reg_status | hex uint64_t | Skrivebeskyttet |
klar | Fjerner feil, first_error, next_error | ulike uint64_t | Kun skrive |
Note:
For å fjerne FME-feilene må du skrive den nøyaktige bitmasken til gjeldende feil, f.eksample cat errors > 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 |
klokke | 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 FPGAer)
sysfs file | mmio felt | type | adgang |
fryse | gperf.ch_ctl.freeze | desimal int | Les Skriv |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Skrivebeskyttet |
lese_miss | gperf.CACHE_RD_MISS | hex uint64_t | Skrivebeskyttet |
skrive_treff | gperf.CACHE_WR_HIT | hex uint64_t | Skrivebeskyttet |
skrive_miss | gperf.CACHE_WR_MISS | hex uint64_t | Skrivebeskyttet |
hold_request | 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 akselerasjonsstabel for Intel Xeon CPU med FPGAer)
sysfs file | mmio felt | type | adgang |
fryse | gperf.vtd_ctl.freeze | desimal int | Bruker: Skrivebeskyttet Root: Les-skriv |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ikke gyldig for Acceleration Stack for Intel Xeon CPU med FPGAer)
sysfs file | mmio felt | type | adgang |
lese_transaksjon | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Skrivebeskyttet |
skrivetransaksjon | 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.(aktivert) | desimal int | Bruker: Skrivebeskyttet Root: Les-skriv |
fryse | gperf.fab_ctl.freeze | desimal int | Bruker: Skrivebeskyttet Root: Les-skriv |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Skrivebeskyttet |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Skrivebeskyttet |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Skrivebeskyttet |
pcie1_write | 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_write | gperf.FAB_PCIE0_WR | hex uint64_t | Skrivebeskyttet |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Skrivebeskyttet |
pcie1_write | 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 | desimal int | Skrivebeskyttet |
ltr | port_header.control.latency_tolerance | desimal 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 |
Portfeil sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio felt | type | adgang |
feil | perror.port_error | hex uint64_t | Skrivebeskyttet |
first_error | perror.port_first_error | hex uint64_t | Skrivebeskyttet |
first_malformed_req | perror.malreq | hex 16-byte | Skrivebeskyttet |
klar | feil.(alle feil) | ulike uint64_t | Kun skrive |
Note:
For å fjerne portfeilene må du skrive den nøyaktige bitmasken for gjeldende feil, for eksempelample cat errors > clear.
Revisjonshistorie
Dokumentversjon | Endringer |
2017.10.02 | Første utgivelse. |
OPAE Intel FPGA Linux-enhetsdriverarkitekturveiledning
Dokumenter / Ressurser
![]() |
intel OPAE FPGA Linux enhetsdriverarkitektur [pdfBrukerhåndbok OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |