intel-logo

Intel OPAE FPGA Linux Device Driver Arkitecture

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

Arkitektura e drejtuesve të pajisjes OPAE Intel FPGA Linux

Drejtuesi OPAE Intel FPGA ofron ndërfaqe për aplikacionet e hapësirës së përdoruesit për të konfiguruar, numëruar, hapur dhe aksesuar përshpejtuesit FPGA në platformat e pajisura me zgjidhje Intel FPGA dhe mundëson funksione të menaxhimit të nivelit të sistemit si rikonfigurimi i FPGA, menaxhimi i energjisë dhe virtualizimi.

Arkitektura e Hardware

Nga pikëpamja e OS-së view, pajisja FPGA shfaqet si një pajisje e rregullt PCIe. Kujtesa e pajisjes FPGA organizohet duke përdorur një strukturë të dhënash të paracaktuar (Lista e veçorive të pajisjes). Karakteristikat e mbështetura nga pajisja FPGA ekspozohen përmes këtyre strukturave të të dhënave, siç ilustrohet më poshtë në figurën e mëposhtme:

Pajisja FPGA PCIe

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

Drejtuesi mbështet PCIe SR-IOV për të krijuar funksione virtuale (VF) të cilat mund të përdoren për të caktuar përshpejtuesit individualë në makinat virtuale.

Korporata Intel. Të gjitha të drejtat e rezervuara. Intel, logoja e Intel dhe markat e tjera Intel janë marka tregtare të Intel Corporation ose filialeve të saj. Intel garanton performancën e produkteve të saj FPGA dhe gjysmëpërçuese sipas specifikimeve aktuale në përputhje me garancinë standarde të Intel, por rezervon të drejtën të bëjë ndryshime në çdo produkt dhe shërbim në çdo kohë pa paralajmërim. Intel nuk merr përsipër asnjë përgjegjësi ose përgjegjësi që rrjedh nga aplikimi ose përdorimi i ndonjë informacioni, produkti ose shërbimi të përshkruar këtu, përveçse kur është rënë dakord shprehimisht me shkrim nga Intel. Klientët e Intel këshillohen të marrin versionin më të fundit të specifikimeve të pajisjes përpara se të mbështeten në çdo informacion të publikuar dhe përpara se të bëjnë porosi për produkte ose shërbime.

Emra dhe marka të tjera mund të pretendohen si pronë e të tjerëve.

Pajisja e virtualizuar FPGA PCIe

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

Motori i Menaxhimit FPGA (FME)
Motori i Menaxhimit FPGA kryen menaxhimin e energjisë dhe termike, raportimin e gabimeve, rikonfigurimin, raportimin e performancës dhe funksione të tjera të infrastrukturës. Çdo FPGA ka një FME, e cila aksesohet gjithmonë përmes Funksionit Fizik (PF). Aplikacionet e hapësirës së përdoruesit mund të marrin qasje ekskluzive në FME duke përdorur open() dhe ta lëshojnë atë duke përdorur close() si një përdorues të privilegjuar (root).

Port
Një Port përfaqëson ndërfaqen midis strukturës statike FPGA (“Menaxheri i Ndërfaqes FPGA (FIM)”) dhe një rajoni pjesërisht të rikonfigurueshëm që përmban një Funksion Përshpejtuesi (AF). Porti kontrollon komunikimin nga softueri te përshpejtuesi dhe ekspozon veçori të tilla si rivendosja dhe korrigjimi. Një pajisje PCIe mund të ketë disa porte dhe çdo port mund të ekspozohet përmes një VF duke e caktuar duke përdorur ioctl FPGA_FME_PORT_ASSIGN në pajisjen FME.

Njësia e funksionit të përshpejtuesit (AF).

  • Një njësi e funksionit të përshpejtuesit (AF) është bashkangjitur në një port dhe ekspozon një rajon MMIO 256K që do të përdoret për regjistrat e kontrollit specifik për përshpejtuesin.
  • Aplikacionet e hapësirës së përdoruesit mund të marrin akses ekskluziv në një AFU të bashkangjitur në një Port duke përdorur open() në pajisjen Port, dhe ta lëshojnë atë duke përdorur close().
  • Aplikacionet e hapësirës së përdoruesit gjithashtu mund të përshpejtojnë rajonet MMIO mmap().

Rikonfigurim i pjesshëm
Siç u përmend më lart, përshpejtuesit mund të rikonfigurohen përmes rikonfigurimit të pjesshëm të një funksioni përshpejtues (AF) file. Funksioni i Përshpejtuesit (AF) duhet të jetë krijuar për FIM-in e saktë dhe rajonin statik të synuar (Port) të FPGA-së; përndryshe, operacioni i rikonfigurimit do të dështojë dhe ndoshta do të shkaktojë paqëndrueshmëri të sistemit. Kjo përputhshmëri mund të kontrollohet duke krahasuar ID-në e ndërfaqes të shënuar në kokën AF me ID-në e ndërfaqes të ekspozuar nga FME përmes sysfs. Ky kontroll zakonisht bëhet nga hapësira e përdoruesit përpara se të telefononi rikonfigurimin IOCTL.

Shënim:
Aktualisht, çdo program softuerik që hyn në FPGA, duke përfshirë ato që funksionojnë në një host të virtualizuar, duhet të mbyllet përpara se të provohet një rikonfigurim i pjesshëm. Hapat do të ishin:

  1. Shkarkoni shoferin nga mysafiri
  2. Hiqeni VF-në nga mysafiri
  3. Çaktivizo SR-IOV
  4. Kryeni rikonfigurimin e pjesshëm
  5. Aktivizo SR-IOV
  6. Lidheni VF-në tek mysafiri
  7. Ngarkoni shoferin në mysafir

Virtualizimi FPGA
Për të mundësuar aksesin në një përshpejtues nga aplikacionet që ekzekutohen në një VM, porti përkatës i AFU-së duhet t'i caktohet një VF duke përdorur hapat e mëposhtëm:

  1. PF zotëron të gjitha portet AFU si parazgjedhje. Çdo port që duhet t'i ricaktohet një VF duhet së pari të lirohet nga PF përmes ioctl FPGA_FME_PORT_RELEASE në pajisjen FME.
  2. Pasi të lëshohen portat N nga PF, komanda e mëposhtme mund të përdoret për të aktivizuar SRIOV dhe VF. Çdo VF zotëron vetëm një port me AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Kaloni përmes VF-ve te VM-të.
  4. AFU nën VF është i aksesueshëm nga aplikacionet në VM (duke përdorur të njëjtin drejtues brenda VF).

Shënim:
Një FME nuk mund t'i caktohet një VF, kështu që PR dhe funksionet e tjera të menaxhimit janë të disponueshme vetëm përmes PF.

Organizata e Shoferit

Drejtuesi i pajisjes së modulit PCIe

Organizata e Shoferit

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

Pajisjet FPGA shfaqen si pajisje të rregullta PCIe; Kështu, drejtuesi i pajisjes FPGA PCIe (intel-FPGA-PCI.ko) ngarkohet gjithmonë i pari sapo të zbulohet një FPGA PCIe PF ose VF. Ky drejtues luan një rol infrastrukturor në arkitekturën e drejtuesit. Ajo:

  • Krijon një pajisje të kontejnerit FPGA si prind i pajisjeve të veçorive.
  • Kalon nëpër listën e veçorive të pajisjes, e cila zbatohet në kujtesën BAR të pajisjes PCIe, për të zbuluar pajisjet e veçorive dhe nën-veçoritë e tyre dhe për të krijuar pajisje platformash për to nën pajisjen e kontejnerit.
  • Mbështet SR-IOV.
  • Prezanton infrastrukturën e pajisjes së veçorive, e cila abstrakton operacionet për nën-veçoritë dhe ekspozon funksionet e zakonshme për drejtuesit e pajisjeve të veçorive.

Funksionet e drejtuesit të pajisjes së modulit PCIe

  • Përmban zbulimin PCIe, numërimin e pajisjes dhe zbulimin e veçorive.
  • Krijon direktori sysfs për pajisjen mëmë, Motorin e Menaxhimit FPGA (FME) dhe Portin.
  • Krijon instancat e drejtuesve të platformës, duke bërë që kerneli Linux të ngarkojë drejtuesit e modulit të tyre përkatës të platformës.

Drejtuesi i pajisjes së modulit të platformës FME

  • Menaxhimi i energjisë dhe termik, raportimi i gabimeve, raportimi i performancës dhe funksione të tjera të infrastrukturës. Ju mund t'i përdorni këto funksione nëpërmjet ndërfaqeve sysfs të ekspozuara nga drejtuesi FME.
  • Rikonfigurim i pjesshëm. Drejtuesi FME regjistron një Menaxher FPGA gjatë inicializimit të nën-funksionit PR; sapo të marrë një FPGA_FME_PORT_PR ioctl nga ju, ai thërret funksionin e përbashkët të ndërfaqes nga FPGA Manager për të përfunduar rikonfigurimin e pjesshëm të bitstream-it në portin e dhënë.
  • Menaxhimi i portit për virtualizim. Drejtuesi FME prezanton dy ioctls, FPGA_FME_PORT_RELEASE, i cili lëshon Portin e dhënë nga PF; dhe FPGA_FME_PORT_ASSIGN, e cila ia cakton Portin përsëri PF. Pasi porti të lirohet nga PF, ai mund t'i caktohet VF përmes ndërfaqeve SR-IOV të ofruara nga drejtuesi PCIe. Për më shumë informacion, referojuni "Virtualizimi FPGA".

Funksionet e drejtuesit të pajisjes së modulit të platformës FME

  • Krijon nyjen e pajisjes me karakter FME.
  • Krijon sistemin FME files dhe implementon FME sysfs file aksesorë.
  • Zbaton nën-drejtuesit e veçorive private FME.
  • Nën-drejtuesit e veçorive private FME:
    • Kreu FME
    • Menaxhimi termik
    • Menaxhimi i Energjisë
    • Gabim global
    • Rikonfigurim i pjesshëm
    • Performanca Globale

Drejtuesi i pajisjes së modulit të platformës së portit
Ngjashëm me drejtuesin FME, drejtuesi i Portit FPGA (dhe AFU) (intel-fpga-afu. ko) hetohet pasi të krijohet pajisja e platformës Port. Funksioni kryesor i këtij moduli është të sigurojë një ndërfaqe për aplikacionet e hapësirës së përdoruesit për të hyrë në përshpejtuesit individualë, duke përfshirë kontrollin bazë të rivendosjes në Port, eksportin e rajonit AFU MMIO, shërbimin e hartës së tamponit DMA, njoftimin UMsg(1) dhe funksionet e korrigjimit në distancë ( Shiko lart).

UMsg mbështetet vetëm përmes Acceleration Stack për procesorin Intel Xeon® me FPGA të integruar.

Funksionet e drejtuesit të pajisjes së modulit të platformës së portit

  • Krijon nyjen e pajisjes me karakter Port.
  • Krijon portin sysfs files dhe implementon Port sysfs file aksesorë.
  • Zbaton nëndrejtuesit e veçorisë private të Portit.
  • Nën-drejtuesit e veçorive private të portit:
    • Kreu i portit
    • AFU
    • Gabim porti
    • UMsg (2)
    • Prek sinjali

Aplikimi FPGA Device Numeration
Ky seksion prezanton se si aplikacionet numërojnë pajisjen FPGA nga hierarkia sysfs nën /sys/class/fpga. Në ishampmë poshtë, dy pajisje Intel FPGA janë instaluar në host. Çdo pajisje FPGA ka një FME dhe dy porte (AFU). Për çdo pajisje FPGA, një direktori pajisjesh krijohet nën /sys/class/fpga:

/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1

Çdo nyje ka një FME dhe dy porte (AFU) si pajisje fëmijë:
/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

Në përgjithësi, ndërfaqet FME/Port sysfs emërtohen si më poshtë:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

me I duke numëruar në mënyrë të njëpasnjëshme të gjitha pajisjet e kontejnerëve, j duke numëruar radhazi FME-të dhe k duke numëruar rresht të gjitha Portet.

Nyjet e pajisjes të përdorura për ioctl() dhe mmap() mund të referohen përmes:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Regjistrimi i drejtuesve PCIe
Ky seksion jep një fundview i rrjedhës së kodit për numërimin e pajisjeve të kryera nga intel-fpga-pci.ko. Strukturat dhe funksionet kryesore të të dhënave janë theksuar. Ky seksion ndiqet më së miri kur viewduke përdorur kodin burimor shoqërues (pcie.c).

Strukturat e të dhënave të numërimit

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
struktura statike idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *emri;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
klasa statike e strukturës *fpga_class;
struktura statike 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,}
};
struktura statike pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.sondë = cci_pci_sondë,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
struktura cci_drvdata {
int pajisje_id;
struct pajisje *fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int lëshuar_port_num;
struct list_head regjionet;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
i pavlefshëm __iomem *ioend;
int aktuale_bar;
void __iomem *pfme_hdr;
struct pajisje *parent_dev;
struct platform_device *feature_dev;
};

Rrjedha e numërimit

  • ccidrv_init()
    • Inicializoni fpga_ids duke përdorur idr_init().
    • Inicializoni fpga_chrdevs[i].devt duke përdorur alloc_chrdev_region().
    • Inicializoni fpga_class duke përdorur class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_sondë ()
    • Aktivizo pajisjen PCI, kërko qasje në rajonet e saj, cakto modalitetin master PCI dhe konfiguro DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Alokoni një strukturë build_feature_devs_info, inicializoni atë.
      .parent_dev është vendosur në një direktori sysfs mëmë (intel-fpga-dev.id) që përmban drejtoritë FME dhe Port sysfs.
  • parse_feature_list()
    • Ecni në listën e veçorive të pajisjes BAR0 për të zbuluar FME, Portin dhe veçoritë e tyre private.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Kur haset një FME:
  • build_info_create_dev()
    • Alokoni një pajisje platformë për FME, duke e ruajtur në build_feature_devs_info.feature_dev.
    • feature_dev.id është inicializuar në rezultatin e idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent është caktuar në build_feature_devs_info.parent_dev.
    • Alokoni një grup burimesh strukturore në feature_dev.resource.
  • Alokoni një strukture feature_platform_data, inicializoni atë dhe ruani një tregues në feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Inicializoni burimin feature_dev.[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Inicializoni feature_platform_data.features[FME_FEATURE_ID_HEADER], gjithçka përveç .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Kur haset në një port:
  • build_info_create_dev()
    • Alokoni një pajisje platformë për Portin, duke e ruajtur në build_feature_devs_info.feature_dev.
    • feature_dev.id është inicializuar në rezultatin e idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent është caktuar në build_feature_devs_info.parent_dev.
    • Alokoni një grup të burimeve të strukturës në feature_dev.resource.
    • Alokoni një strukture feature_platform_data, inicializoni atë dhe ruani një tregues në feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Shtoni strukturën feature_platform_data.node për Portin në listën e Porteve në struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Inicializoni burimin feature_dev.[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Inicializoni feature_platform_data.features[PORT_FEATURE_ID_HEADER], gjithçka përveç .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Kur haset një AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicializoni burimin feature_dev.[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Inicializoni feature_platform_data.features[PORT_FEATURE_ID_UAFU], gjithçka përveç .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Kur hasni një veçori private FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Inicializoni feature_dev.resource[id].
  • feature_platform_data_add()
    • Inicializoni feature_platform_data.features[id], gjithçka përveç .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Kur haset një veçori private e Portit: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Inicializoni feature_platform_data.features[id], gjithçka përveç .fops.
  • parse_ports_from_fme()
    • Nëse drejtuesi është i ngarkuar në funksionin fizik (PF), atëherë:
  • Ekzekutoni rrjedhën parse_feature_list() në çdo port të përshkruar në kokën FME.
  • Përdorni BAR-in e përmendur në secilën hyrje të Portit në kokë.

Inicializimi i pajisjes së platformës FME
Ky seksion jep një fundview të rrjedhës së kodit për inicializimin e pajisjes FME të kryer nga intel-fpga-fme.ko. Strukturat dhe funksionet kryesore të të dhënave janë theksuar. Ky seksion ndiqet më së miri kur viewduke përdorur kodin burimor shoqërues (fme-main.c).

Strukturat e të dhënave të pajisjes së platformës FME

strukturo funksion_ops {
int (*init)(struct platform_device *pdev, struct tipar *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
i gjatë (*ioctl)(strukturë platformë_pajisje *pdev, veçori strukture *veçori,
i panënshkruar int cmd, i panënshkruar arg i gjatë);
int (*test)(struct platform_device *pdev, struct tipar *feature);
};
tipar i strukturës {
const char *emri;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
strukturo të dhënat e funksionit_platformës {
struct list_head nyje;
struct mutex lock;
dev_status i gjatë i panënshkruar;
struct cdev cdev;
struct platform_device *dev;
int i panënshkruar disable_count;
i pavlefshëm *privat;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_seach_port)(struct platform_device *,
void *, int (*përputhje)(strukture platformë_pajisje *, void *)); struktura
veçoritë e veçorive[0];
};
struktur perf_objekt {
int id;
const struct atribut_grup **attr_grupet;
struct pajisje *fme_dev;
struct list_head nyje;
struct list_head fëmijët;
struct kobject kobj;
};
struktura fpga_fme {
u8 port_id;
u64 pr_err;
struct pajisje *dev_err;
struct perf_object *perf_dev;
struct tipar_platforma_data *pdata;
};

Rrjedha e inicializimit të pajisjes së platformës FME

Rrjedha e Inicializimit FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Inicializoni një strukturë fpga_fme dhe ruajeni në fushën feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Ruani një struktur feature_ops në funksionin_platform_data.features për çdo veçori të mbushur.
    • Thirrni funksionin e testimit, nëse ka, nga struktura.
    • Thirrni funksionin init nga struktura.
  • fme_probe() fpga_register_dev_ops()
    • Krijoni nyjen e pajisjes me karakter FME, duke regjistruar një strukturë file_operacionet.

Inicializimi i pajisjes së platformës së portit
Ky seksion jep një fundview i rrjedhës së kodit për inicializimin e pajisjes portuale të kryer nga intel-fpga-afu.ko. Strukturat dhe funksionet kryesore të të dhënave janë theksuar. Ky seksion ndiqet më së miri kur viewduke përdorur kodin burimor shoqërues (afu.c).

Strukturat e të dhënave të pajisjes së platformës portuale

strukturo funksion_ops {
int (*init)(struct platform_device *pdev, struct tipar *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
i gjatë (*ioctl)(strukturë platformë_pajisje *pdev, veçori strukture *veçori,
i panënshkruar int cmd, i panënshkruar arg i gjatë);
int (*test)(struct platform_device *pdev, struct tipar *feature);
};
tipar i strukturës {
const char *emri;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
strukturo të dhënat e funksionit_platformës {
struct list_head nyje;
struct mutex lock;
dev_status i gjatë i panënshkruar;
struct cdev cdev;
struct platform_device *dev;
int i panënshkruar disable_count;
i pavlefshëm *privat;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_seach_port)(struct platform_device *,
void *, int (*përputhje)(strukture platformë_pajisje *, void *));
veçoritë e veçorive të strukturës[0];
};
struktura fpga_afu_region {
indeksi u32;
flamuj u32;
madhësia u64;
kompensimi u64;
u64 fiz;
struct list_head nyje;
};
struct fpga_afu_dma_region {
u64 user_addr;
gjatësia u64;
u64 iova;
struct faqe **faqe;
struct rb_nyja nyje;
bool in_use;
};
struktura fpga_afu {
u64 region_cur_offset;
int numri_rajoneve;
u8 num_umsgs;
struct list_head regjionet;
struct rb_root dma_regions;
struct tipar_platforma_data *pdata;
};

Rrjedha e inicializimit të pajisjes së platformës së portit

Rrjedha e inicializimit të portitintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Inicializoni një strukturë fpga_afu dhe ruajeni në fushën feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Ruani një struktur feature_ops në funksionin_platform_data.features për çdo veçori të mbushur.
    • Thirrni funksionin e testimit, nëse ka, nga struktura.
    • Thirrni funksionin init nga struktura.
  • afu_probe() fpga_register_dev_ops()
    • Krijo nyjen e pajisjes me karakter Port, duke regjistruar një strukturë file_operacionet.

FME IOCTLs
IOCTL-të që thirren në një hapje file përshkrues për /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—kthejeni versionin aktual si numër të plotë, duke filluar nga 0.

FPGA_CHECK_EXTENSION—nuk mbështetet aktualisht.

FPGA_FME_PORT_RELEASE—arg është një tregues për një:

struct fpga_fme_port_release {
__u32 argsz; // në: sizeof (struktura fpga_fme_port_release)
__u32 flamuj; // në: duhet të jetë 0
__u32 port_id; // në: ID-ja e portit (nga 0) për të lëshuar.
};

FPGA_FME_PORT_ASSIGN—arg është një tregues për një:

struct fpga_fme_port_assign {
__u32 argsz; // në: sizeof (struktura fpga_fme_port_assign)
__u32 flamuj; // në: duhet të jetë 0
__u32 port_id; // në: ID e portit (nga 0) për të caktuar. (duhet te jete
lëshuar më parë nga FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg është një tregues për një:

struct fpga_fme_port_pr {
__u32 argsz; // në: sizeof(struktura fpga_fme_port_pr)
__u32 flamuj; // në: duhet të jetë 0
__u32 port_id; // në: ID e portit (nga 0)
__u32 madhësia e tamponit; // në: madhësia e buferit të bitstream në bajt. Duhet të jetë 4-bajtë
të përafruar.
__u64 buffer_adresa; // në: adresën e procesit të bufferit të bitstream
statusi __u64; // jashtë: statusi i gabimit (bitmask)
};

Porti IOCTLs
IOCTL-të që thirren në një hapje file përshkruesi për /dev/intel-fpga-port.k FPGA_GET_API_VERSION—kthejeni versionin aktual si numër të plotë, duke filluar nga 0. FPGA_CHECK_EXTENSION—nuk mbështetet aktualisht.

FPGA_PORT_GET_INFO-arg është një tregues për një:

struktura fpga_port_info {
__u32 argsz; // në: sizeof(struct fpga_port_info)
__u32 flamuj; // jashtë: kthen 0
__u32 numër_rajonesh; // jashtë: numri i rajoneve MMIO, 2 (1 për AFU dhe 1 për
STP)
__u32 num_umsgs; // jashtë: numri i UMsg-ve të mbështetur nga hardueri
};

FPGA_PORT_GET_REGION_INFO—arg është një tregues për një:

struct fpga_port_region_info {
__u32 argsz; // në: sizeof(struct fpga_port_region_info)
__u32 flamuj; // jashtë: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
indeksi __u32; // në: FPGA_PORT_INDEX_UAFU ose FPGA_PORT_INDEX_STP
__u32 mbushje; // në: duhet të jetë 0
madhësia __u64; // jashtë: madhësia e rajonit MMIO në bajt
kompensimi __u64; // jashtë: kompensimi i rajonit MMIO nga fillimi i pajisjes fd
};

FPGA_PORT_DMA_MAP—arg është një tregues për një:
struct fpga_port_dma_map {
__u32 argsz; // në: sizeof(struktura fpga_port_dma_map)
__u32 flamuj; // në: duhet të jetë 0 __u64 user_addr; // në: proces virtual
adresë. Duhet të përafrohet me faqe.
__u64 gjatësia; // në: gjatësia e hartës në bajt. Duhet të jetë një shumëfish i faqes
madhësia.
__u64 iova; // jashtë: adresa virtuale IO };

FPGA_PORT_DMA_UNMAP—arg është një tregues për një:
struct fpga_port_dma_unmap {
__u32 argsz; // në: sizeof(struktura fpga_port_dma_unmap)
__u32 flamuj; // në: duhet të jetë 0
__u64 iova; // në: IO adresa virtuale e kthyer nga një e mëparshme
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg duhet të jetë NULL.
  • FPGA_PORT_UMSG_ENABLE—arg duhet të jetë NULL.
  • FPGA_PORT_UMSG_DISABLE—argumentet duhet të jenë NULL.

FPGA_PORT_UMSG_SET_MODE—arg është një tregues për një:

struct fpga_port_umsg_cfg {
__u32 argsz; // në: sizeof(struktura fpga_port_umsg_cfg)
__u32 flamuj; // në: duhet të jetë 0
__u32 hint_bitmap; // në: UMsg modaliteti i bitmap. Tregon cilat janë UMsg-të
aktivizuar.
};

FPGA_PORT_UMSG_SET_BASE_ADDR-

  • UMsg duhet të çaktivizohet përpara se të lëshohet ky ioctl.
  • Fusha iova duhet të jetë për një bufer mjaftueshëm të madh për të gjitha UMsg-të (num_umsgs * PAGE_SIZE).
    • Buferi është shënuar si "në përdorim" nga menaxhmenti i tamponit të drejtuesit.
    • Nëse iova është NULL, çdo rajon i mëparshëm nuk shënohet si "në përdorim".
  • arg është një tregues për një:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // në: sizeof(struktura fpga_port_umsg_base_addr)
    • flamuj u32; // në: duhet të jetë 0
    • u64 iova; // në: IO adresë virtuale nga FPGA_PORT_DMA_MAP. };

Shënim:

  • Për të pastruar gabimet e portit, duhet të shkruani bitmask të saktë të gabimeve aktuale, p.sh.ample, gabimet e maceve > qartë
  • UMsg mbështetet vetëm përmes Acceleration Stack për procesorin Intel Xeon me FPGA të integruar.

sysfs Files

FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file fushë mmio lloji akses
portet_num fme_header.apability.num_ports dhjetor int Vetëm për lexim
cache_size fme_header.aftësi.cache_size dhjetor int Vetëm për lexim
version fme_header.aftësi.fabric_verid dhjetor int Vetëm për lexim
foleja_id fme_header.apability.socket_id dhjetor int Vetëm për lexim
bitstream_id fme_header.bitstream_id heks uint64_t Vetëm për lexim
bitstream_metadata fme_header.bitstream_md heks uint64_t Vetëm për lexim

Sistemi i Menaxhimit Termik FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file fushë mmio lloji akses
pragu 1 termike.prag.tmp_thshold1 dhjetor int Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
pragu 2 termike.prag.tmp_thshold2 dhjetor int Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
prag_udhëtim termik.prag.term_udhëtim_thshold dhjetor int Vetëm për lexim
pragu1_arritur termike.pragu.thshold1_status dhjetor int Vetëm për lexim
pragu2_arritur termike.pragu.thshold2_status dhjetor int Vetëm për lexim
pragu1_politika termike. pragu.thshold_policy dhjetor int Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
temperatura termike.rdsensor_fm1.fpga_temp dhjetor int Vetëm për lexim

Sistemi i Menaxhimit të Energjisë FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file fushë mmio lloji akses
konsumuar fuqia.statusi.pwr_konsumuar heks uint64_t Vetëm për lexim
pragu 1 fuqi.prag.prag1 heks uint64_t Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
pragu 2 fuqi.prag.prag2 heks uint64_t Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
pragu1_status fuqi.prag.prag1_status dhjetore e panënshkruar Vetëm për lexim
pragu2_status fuqi.prag.prag2_status dhjetore e panënshkruar Vetëm për lexim
rtl power.status.fpga_latency_report dhjetore e panënshkruar Vetëm për lexim

FME Global Gabim sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file fushë mmio lloji akses
pcie0_errors gjerror.pcie0_err heks uint64_t Lexo-shkruaj
pcie1_errors gjerror.pcie1_err heks uint64_t Lexo-shkruaj
injektoj_gabim gjerror.ras_error_inj heks uint64_t Lexo-shkruaj

intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/

sysfs file fushë mmio lloji akses
gabimet gjerror.fme_err heks uint64_t Vetëm për lexim
i pari_gabim gerror.fme_first_err.err_reg_status heks uint64_t Vetëm për lexim
tjetër_gabim gerror.fme_next_err.err_reg_status heks uint64_t Vetëm për lexim
qartë Pastron gabimet, first_error, next_error uint64_t të ndryshme Vetëm për të shkruar

Shënim:
Për të pastruar gabimet FME, duhet të shkruani bitmaskën e saktë të gabimeve aktuale, p.sh.ampgabimet e maceve > qartë.

Sistemi i rikonfigurimit të pjesshëm të FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file fushë mmio lloji akses
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l heks 16-bajtë Vetëm për lexim

FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file fushë mmio lloji akses
ora gperf.clk.afu_interf_clock heks uint64_t Vetëm për lexim

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Jo i vlefshëm për Acceleration Stack për Intel Xeon CPU me FPGA)

sysfs file fushë mmio lloji akses
ngrijë gperf.ch_ctl.freeze dhjetor int Lexo-shkruaj
lexo_hit gperf.CACHE_RD_HIT heks uint64_t Vetëm për lexim
lexo_miss gperf.CACHE_RD_MISS heks uint64_t Vetëm për lexim
shkruaj_godit gperf.CACHE_WR_HIT heks uint64_t Vetëm për lexim
shkruaj_miss gperf.CACHE_WR_MISS heks uint64_t Vetëm për lexim
mbaj_kërkesë gperf.CACHE_HOLD_REQ heks uint64_t Vetëm për lexim
tx_req_stall gperf.CACHE_TX_REQ_STALL heks uint64_t Vetëm për lexim
sysfs file fushë mmio lloji akses
rx_req_stall gperf.CACHE_RX_REQ_STALL heks uint64_t Vetëm për lexim
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN heks uint64_t Vetëm për lexim
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN heks uint64_t Vetëm për lexim

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Jo i vlefshëm për Acceleration Stack për Intel Xeon CPU me FPGA)

sysfs file fushë mmio lloji akses
ngrijë gperf.vtd_ctl.freeze dhjetor int Përdoruesi: Root vetëm për lexim: Lexo-shkruaj

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Jo i vlefshëm për Acceleration Stack për Intel Xeon CPU me FPGA)

sysfs file fushë mmio lloji akses
lexo_transaksionin gperf.VTD_AFU0_MEM_RD_TRANS heks uint64_t Vetëm për lexim
shkrim_transaksioni gperf.VTD_AFU0_MEM_WR_TRANS heks uint64_t Vetëm për lexim
tlb_lexo_hit gperf.VTD_AFU0_TLB_RD_HIT heks uint64_t Vetëm për lexim
tlb_shkruaj_hit gperf.VTD_AFU0_TLB_WR_HIT heks uint64_t Vetëm për lexim

intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

sysfs file fushë mmio lloji akses
mundësojnë gperf.fab_ctl.(e aktivizuar) dhjetor int Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
ngrijë gperf.fab_ctl.freeze dhjetor int Përdoruesi: Root vetëm për lexim: Lexo-shkruaj
pcie0_lexuar gperf.FAB_PCIE0_RD heks uint64_t Vetëm për lexim
pcie0_write gperf.FAB_PCIE0_WR heks uint64_t Vetëm për lexim
pcie1_lexuar gperf.FAB_PCIE1_RD heks uint64_t Vetëm për lexim
pcie1_write gperf.FAB_PCIE1_WR heks uint64_t Vetëm për lexim
upi_lexuar gperf.FAB_UPI_RD heks uint64_t Vetëm për lexim
upi_shkruaj gperf.FAB_UPI_WR heks uint64_t Vetëm për lexim

intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/

sysfs file fushë mmio lloji akses
pcie0_lexuar gperf.FAB_PCIE0_RD heks uint64_t Vetëm për lexim
pcie0_write gperf.FAB_PCIE0_WR heks uint64_t Vetëm për lexim
pcie1_lexuar gperf.FAB_PCIE1_RD heks uint64_t Vetëm për lexim
pcie1_write gperf.FAB_PCIE1_WR heks uint64_t Vetëm për lexim
upi_lexuar gperf.FAB_UPI_RD heks uint64_t Vetëm për lexim
upi_shkruaj gperf.FAB_UPI_WR heks uint64_t Vetëm për lexim

Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file fushë mmio lloji akses
id port_header.aftësia.port_numri dhjetor int Vetëm për lexim
ltr port_header.kontroll.latency_tolerance dhjetor int Vetëm për lexim

Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file fushë mmio lloji akses
afu_id afu_header.udhëzues heks 16-bajtë Vetëm për lexim

Gabim porti sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file fushë mmio lloji akses
gabimet gabim.port_gabim heks uint64_t Vetëm për lexim
i pari_gabim gabim.port_i pari_gabim heks uint64_t Vetëm për lexim
i pari_keqformuar_req gabim.malreq heks 16-bajtë Vetëm për lexim
qartë gabim. (të gjitha gabimet) uint64_t të ndryshme Vetëm për të shkruar

Shënim:
Për të pastruar gabimet e Portit, duhet të shkruani bitmaskun e saktë të gabimeve aktuale, për shembullampgabimet e maceve > qartë.

Historia e rishikimit

Versioni i dokumentit Ndryshimet
2017.10.02 Publikimi fillestar.

Udhëzues për arkitekturën e drejtuesit të pajisjes OPAE Intel FPGA Linux

Dokumentet / Burimet

Intel OPAE FPGA Linux Device Driver Arkitecture [pdfUdhëzuesi i përdoruesit
Arkitekturë e drejtuesve të pajisjes Linux OPAE FPGA, Arkitekturë e drejtuesve të pajisjes Linux OPAE FPGA, Arkitekturë e drejtuesve të pajisjes Linux, arkitekturë drejtuese, arkitekturë

Referencat

Lini një koment

Adresa juaj e emailit nuk do të publikohet. Fushat e kërkuara janë shënuar *