intel-logo

intel OPAE FPGA Linux enhedsdriverarkitektur

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

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

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

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

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

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:

  1. Aflæs driveren fra gæsten
  2. Tag stikket til VF ud af gæsten
  3. Deaktiver SR-IOV
  4. Udfør delvis omkonfiguration
  5. Aktiver SR-IOV
  6. Tilslut VF til gæsten
  7. 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:

  1. 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.
  2. 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
  3. Gå gennem VF'erne til VM'erne.
  4. 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

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

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.
  • 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 initialiseringsflowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • 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

Portinitialiseringsflowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • 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

Referencer

Efterlad en kommentar

Din e-mailadresse vil ikke blive offentliggjort. Påkrævede felter er markeret *