intel-logo

Intel OPAE FPGA Linukso Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

La OPAE Intel FPGA-ŝoforo disponigas interfacojn por uzantspacaj aplikoj por agordi, listigi, malfermi kaj aliri FPGA-akceliloj sur platformoj ekipitaj per Intel FPGA-solvoj kaj ebligas sistem-nivelajn administradfunkciojn kiel ekzemple FPGA-reagordo, potenco-administrado kaj virtualigo.

Aparataro Arkitekturo

De la punkto de la OS de view, la FPGA-hardvaro aperas kiel regula PCIe-aparato. La FPGA-aparatmemoro estas organizita uzante antaŭdifinitan datumstrukturon (Device Feature List). Trajtoj subtenataj de la FPGA-aparato estas elmontritaj tra ĉi tiuj datumstrukturoj, kiel ilustrite malsupre en la sekva figuro:

FPGA PCIe Aparato

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

La ŝoforo apogas PCIe SR-IOV por krei Virtualajn Funkciojn (VFoj) kiuj povas esti uzitaj por asigni individuajn akceliloj al virtualaj maŝinoj.

Intel Corporation. Ĉiuj rajtoj rezervitaj. Intel, la Intel-emblemo kaj aliaj Intel-markoj estas varmarkoj de Intel Corporation aŭ ĝiaj filioj. Intel garantias la agadon de siaj FPGA kaj duonkonduktaĵproduktoj laŭ nunaj specifoj konforme al la norma garantio de Intel sed rezervas la rajton fari ŝanĝojn al ajnaj produktoj kaj servoj iam ajn sen avizo. Intel supozas neniun respondecon aŭ respondecon de la apliko aŭ uzo de ajna informo, produkto aŭ servo priskribita ĉi tie krom kiel eksplicite konsentite skribe de Intel. Intel-klientoj estas konsilitaj akiri la lastan version de aparato-specifoj antaŭ ol fidi iun ajn publikigitan informon kaj antaŭ ol fari mendojn por produktoj aŭ servoj.

Aliaj nomoj kaj markoj povas esti postulitaj kiel posedaĵo de aliaj.

Virtualigita FPGA PCIe Aparato

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

FPGA Administra Motoro (FME)
La FPGA-Administra Motoro plenumas potencon kaj termikan administradon, erarraportadon, reagordon, rendimentan raportadon kaj aliajn infrastrukturajn funkciojn. Ĉiu FPGA havas unu FME, kiu ĉiam estas alirita per la Fizika Funkcio (PF). Uzant-spacaj aplikaĵoj povas akiri ekskluzivan aliron al la FME uzante open(), kaj liberigi ĝin uzante close() kiel privilegiita uzanto (radiko).

Haveno
Haveno reprezentas la interfacon inter la senmova FPGA-ŝtofo (la "FPGA Interface Manager (FIM)") kaj parte reagordebla regiono enhavanta Akcelilo-Funkcion (AF). La Haveno kontrolas la komunikadon de programaro al la akcelilo kaj elmontras funkciojn kiel restarigi kaj sencimigi. PCIe-aparato povas havi plurajn Havenojn, kaj ĉiu Haveno povas esti elmontrita per VF asignante ĝin uzante la FPGA_FME_PORT_ASSIGN ioctl sur la FME-aparato.

Akcelila Funkcio (AF) Unuo

  • Akcelila Funkcio (AF) Unuo estas alkroĉita al Haveno kaj elmontras 256K MMIO-regionon por esti uzita por akcel-specifaj kontrolregistroj.
  • Uzant-spacaj aplikaĵoj povas akiri ekskluzivan aliron al AFU alkroĉita al Haveno uzante open() sur la Port-aparato, kaj liberigi ĝin per close().
  • Uzant-spacaj aplikoj ankaŭ povas mmap () akcelilon MMIO-regionojn.

Parta Rekonfiguracio
Kiel menciite supre, akceliloj povas esti reagorditaj per parta reagordo de Akcelila Funkcio (AF) file. La Akcelila Funkcio (AF) devas esti generita por la preciza FIM kaj celita senmova regiono (Haveno) de la FPGA; alie, la reagorda operacio malsukcesos kaj eble kaŭzos sisteman malstabilecon. Ĉi tiu kongrueco povas esti kontrolita komparante la interfaco-ID notitan en la AF-kapo kontraŭ la interfaco-ID elmontrita de la FME per sysfs. Ĉi tiu kontrolo estas kutime farita per uzantspaco antaŭ vokado de la reagordo IOCTL.

Notu:
Nuntempe, ajna programaro aliranta la FPGA, inkluzive de tiuj kurantaj en virtualigita gastiganto, devas esti fermita antaŭ provi partan reagordon. La paŝoj estus:

  1. Malŝarĝu la ŝoforon de la gasto
  2. Malŝaltu la VF de la gasto
  3. Malebligu SR-IOV
  4. Faru partan reagordon
  5. Ebligu SR-IOV
  6. Konektu la VF al la gasto
  7. Ŝarĝu la ŝoforon en la gasto

FPGA Virtualigo
Por ebligi aliron al akcelilo de aplikaĵoj kurantaj en VM, la haveno de la respektiva AFU devas esti asignita al VF uzante la sekvajn paŝojn:

  1. La PF posedas ĉiujn AFU-havenojn defaŭlte. Ĉiu haveno, kiu devas esti reasignita al VF, devas unue esti liberigita de la PF per la FPGA_FME_PORT_RELEASE ioctl sur la FME-aparato.
  2. Post kiam N-havenoj estas liberigitaj de la PF, la suba komando povas esti uzata por ebligi SRIOV kaj VFs. Ĉiu VF posedas nur unu havenon kun AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Trapasu la VF-ojn al VM-oj.
  4. La AFU sub VF estas alirebla de aplikoj en VM (uzante la saman ŝoforon ene de la VF).

Notu:
FME ne povas esti asignita al VF, tiel PR kaj aliaj administradfunkcioj estas nur haveblaj tra la PF.

Ŝofor-Organizo

PCIe Modula Aparato-Piloilo

Ŝofor-Organizo

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

La FPGA-aparatoj aperas kiel regulaj PCIe-aparatoj; tiel, la FPGA PCIe-aparatoŝoforo (intel-FPGA-PCI.ko) ĉiam estas ŝarĝita unue post kiam FPGA PCIe PF aŭ VF estas detektita. Ĉi tiu ŝoforo ludas infrastrukturan rolon en la ŝoforarkitekturo. Ĝi:

  • Kreas FPGA-ujo-aparaton kiel gepatro de la trajto-aparatoj.
  • Promenas tra la Aparato-Listo, kiu estas efektivigita en PCIe-aparato BAR-memoro, por malkovri karakterizajn aparatojn kaj iliajn sub-funkciojn kaj krei platformajn aparatojn por ili sub la ujo-aparato.
  • Elportas SR-IOV.
  • Lanĉas la karakterizan aparatinfrastrukturon, kiu abstraktas operaciojn por sub-funkcioj kaj elmontras oftajn funkciojn al prezentaj aparato-ŝoforoj.

PCIe Module Device Driver Funkcioj

  • Enhavas PCIe-malkovron, aparaton-nombradon kaj funkcio-malkovron.
  • Kreas sysfs-dosierujojn por la gepatra aparato, FPGA Management Engine (FME) kaj Haveno.
  • Kreas la platformajn ŝoforinstancojn, igante la Linuksan kernon ŝarĝi siajn respektivajn platformmodulajn ŝoforojn.

FME Platform Module Device Driver

  • Potenca kaj termika administrado, erara raportado, agado-raportado kaj aliaj infrastrukturaj funkcioj. Vi povas aliri ĉi tiujn funkciojn per sysfs-interfacoj elmontritaj de la FME-ŝoforo.
  • Parta Rekonfiguracio. La FME-ŝoforo registras FPGA-Manaĝeron dum PR-sub-funkcia inicialigo; post kiam ĝi ricevas FPGA_FME_PORT_PR ioctl de vi, ĝi alvokas la komunan interfacan funkcion de FPGA-Manaĝero por kompletigi la partan reagordon de la bitfluo al la donita Haveno.
  • Portadministrado por virtualigo. La FME-ŝoforo enkondukas du ioctls, FPGA_FME_PORT_RELEASE, kiu liberigas la donitan Havenon de PF; kaj FPGA_FME_PORT_ASSIGN, kiu asignas la Havenon reen al PF. Post kiam la Haveno estas liberigita de la PF, ĝi povas esti asignita al la VF per la SR-IOV-interfacoj disponigitaj fare de la PCIe-ŝoforo. Por pliaj informoj, raportu al "FPGA Virtualization".

FME Platform Module Device Driver Funkcioj

  • Kreas la FME-karaktera aparato-nodon.
  • Kreas la FME-sysfs files kaj efektivigas la FME-sysfs file akcesoraĵoj.
  • Realigas la FME-privatajn funkciojn sub-ŝoforojn.
  • FME-privataj trajtosub-ŝoforoj:
    • FME-kapo
    • Termika Administrado
    • Potenca Administrado
    • Tutmonda Eraro
    • Parta Rekonfiguracio
    • Tutmonda Agado

Port Platform Module Device Driver
Simila al la FME-ŝoforo, la FPGA Port (kaj AFU) ŝoforo (intel-fpga-afu. ko) estas sondita post kiam la Port-platformaparato estas kreita. La ĉefa funkcio de ĉi tiu modulo estas disponigi interfacon por uzant-spacaj aplikoj por aliri la individuajn akcelilon, inkluzive de baza rekomencigita kontrolo sur Haveno, AFU MMIO-regioneksporto, DMA-bufrmapa servo, UMsg(1) sciigo kaj foraj sencimigaj funkcioj ( Vidu supre).

UMsg estas nur subtenata per Akcela Stako por Procesoro Intel Xeon® kun Integra FPGA.

Port Platform Module Aparato Ŝoforo Funkcioj

  • Kreas la Port-karakteran aparaton nodon.
  • Kreas la Port sysfs files kaj efektivigas la Port sysfs file akcesoraĵoj.
  • Realigas la Port-privatajn funkciojn sub-ŝoforojn.
  • Sub-ŝoforoj por privataj funkcioj:
    • Haveno Kapo
    • AFU
    • Havena Eraro
    • UMsg(2)
    • Signalo Frapeto

Apliko FPGA Aparato Enumerado
Ĉi tiu sekcio prezentas kiel aplikaĵoj listigas la FPGA-aparaton de la sysfs-hierarkio sub /sys/class/fpga. En la eksample sube, du Intel FPGA-aparatoj estas instalitaj en la gastiganto. Ĉiu FPGA-aparato havas unu FME kaj du Havenojn (AFUoj). Por ĉiu FPGA-aparato, aparata dosierujo estas kreita sub /sys/class/fpga:

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

Ĉiu nodo havas unu FME kaj du Havenojn (AFUoj) kiel infanaparatoj:
/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

Ĝenerale, la FME/Port sysfs-interfacoj estas nomitaj jene:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

kun I sinsekve nombranta ĉiujn ujajn aparatojn, j sinsekve nombrante la FME-ojn kaj k sinsekve nombrante ĉiujn Havenojn.

La aparatnodoj uzitaj por ioctl () kaj mmap () povas esti referencitaj tra:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Nombrado de PCIe Driver
Ĉi tiu sekcio donas finonview de la kodfluo por aparata nombrado farita de intel-fpga-pci.ko. La ĉefaj datumstrukturoj kaj funkcioj estas elstarigitaj. Ĉi tiu sekcio estas plej bone sekvita kiam viewing la akompanan fontkodon (pcie.c).

Nombraj Datumaj Strukturoj

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
statika struct idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nomo;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs [] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
statika struct-klaso *fpga_class;
statika strukturo 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,}
};
statika strukturo 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-aparato *fme_dev;
struct-mutex-seruro;
struct list_head port_dev_list;
int liberigita_port_num;
struct list_head regionoj;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int aktuala_baro;
malplena __iomem *pfme_hdr;
struct-aparato *parent_dev;
struct platformo_aparato *funkcio_dev;
};

Nombra Fluo

  • ccidrv_init()
    • Komencu fpga_ids uzante idr_init().
    • Komencu fpga_chrdevs[i].devt uzante alloc_chrdev_region().
    • Komencu fpga_class uzante class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Ebligu la PCI-aparaton, petu aliron al ĝiaj regionoj, agordu PCI-majstran reĝimon kaj agordu DMA.
  • cci_pci_create_feature_devs () build_info_alloc_and_init ()
    • Asignu struct build_feature_devs_info, pravalorigu ĝin.
      .parent_dev estas agordita al gepatra sysfs dosierujo (intel-fpga-dev.id) kiu enhavas la FME kaj Port sysfs dosierujoj.
  • parse_feature_list ()
    • Promenu la BAR0-Aparatajn Karakterizaĵojn por malkovri la FME, la Havenon kaj iliajn privatajn funkciojn.
  • parse_feature () parse_feature_afus () parse_feature_fme ()
    • Kiam FME estas renkontita:
  • build_info_create_dev()
    • Asignu platforman aparaton por la FME, stokanta en build_feature_devs_info.feature_dev.
    • feature_dev.id estas pravigita al la rezulto de idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent estas agordita al build_feature_devs_info.parent_dev.
    • Asignu tabelon da structresursoj en feature_dev.resource.
  • Asignu struct feature_platform_data, pravalorigu ĝin kaj konservu montrilon en feature_dev.dev.platform_data
    • create_feature_instance () build_info_add_sub_feature ()
    • Inicialigu feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add ()
    • Inicialigu feature_platform_data.features[FME_FEATURE_ID_HEADER], ĉio krom .fops.
  • parse_feature () parse_feature_afus () parse_feature_port ()
    • Kiam Haveno estas renkontita:
  • build_info_create_dev()
    • Asignu platforman aparaton por la Haveno, stokanta en build_feature_devs_info.feature_dev.
    • feature_dev.id estas pravigita al la rezulto de idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent estas agordita al build_feature_devs_info.parent_dev.
    • Asignu tabelon de struct-rimedo en feature_dev.resource.
    • Asignu struct feature_platform_data, pravalorigu ĝin kaj konservu montrilon en feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Aldonu la struct feature_platform_data.node por la Haveno al la listo de Havenoj en struct cci_drvdata.port_dev_list
  • create_feature_instance () build_info_add_sub_feature ()
    • Inicialigu feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add ()
    • Inicialigu feature_platform_data.features[PORT_FEATURE_ID_HEADER], ĉio krom .fops.
  • parse_feature () parse_feature_afus () parse_feature_port_uafu ()
    • Kiam AFU estas renkontita:
  • create_feature_instance () build_info_add_sub_feature ()
    • Inicialigu feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add ()
    • Inicialigu feature_platform_data.features[PORT_FEATURE_ID_UAFU], ĉio krom .fops.
  • parse_feature () parse_feature_private () parse_feature_fme_private ()
    • Kiam FME-privata funkcio estas renkontita:
  • create_feature_instance () build_info_add_sub_feature ()
    • Inicialigu feature_dev.resource[id].
  • feature_platform_data_add ()
    • Inicialigu feature_platform_data.features[id], ĉio krom .fops.
  • parse_feature () parse_feature_private () parse_feature_port_private ()
  • Kiam Port-privata funkcio estas renkontita: * create_feature_instance() build_info_add_sub_feature() * Inicialigu feature_dev.resource[id]. * feature_platform_data_add () Inicialigu feature_platform_data.features[id], ĉio krom .fops.
  • parse_ports_from_fme()
    • Se la ŝoforo estas ŝarĝita sur la Fizika Funkcio (PF), tiam:
  • Rulu la parse_feature_list() fluon sur ĉiu haveno priskribita en la FME-kapo.
  • Uzu la BAR menciitan en ĉiu Haveno eniro en la kaplinio.

Inicialigo de Aparato de FME-Platformo
Ĉi tiu sekcio donas finonview de la kodfluo por FME-apara inicialigo farita de intel-fpga-fme.ko. La ĉefaj datumstrukturoj kaj funkcioj estas reliefigitaj. Ĉi tiu sekcio estas plej bone sekvita kiam viewing la akompanan fontkodon (fme-main.c).

FME Platform Device Data Structures

struct feature_ops {
int (*init)(struct platformo_aparato *pdev, struct trajto *trajto);
int (*uinit)(struct platformo_aparato *pdev, struct trajto *trajto);
longa (*ioctl)(struct platform_device *pdev, struct-trajto *trajto,
unsigned int cmd, unsigned long arg);
int (*testo)(struct platformo_aparato *pdev, struct trajto *trajto);
};
struktura trajto {
const char *nomo;
int rimedo_indekso;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head nodo;
struct-mutex-seruro;
nesubskribita longa dev_status;
struct cdev cdev;
struct platformo_aparato *dev;
unsigned int malebligi_kalkuli;
malplena *privata;
int num;
int (*config_port)(struct platformo_aparato *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); struct
karakterizaj trajtoj[0];
};
struktur perf_objekto {
int id;
const struct grupo_atributo **attr_grupoj;
struct-aparato *fme_dev;
struct list_head nodo;
struct list_head infanoj;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct-aparato *dev_err;
struct perf_objekto *perf_dev;
struct feature_platform_data *pdata;
};

FME Platforma Aparato Inicialiga Fluo

FME Inicialiga Fluointel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Komencu struct fpga_fme kaj konservu ĝin en la kampo feature_platform_data.private.
  • fme_probe () fpga_dev_feature_init () feature_instance_init ()
    • Konservu struct feature_ops en la feature_platform_data.features por ĉiu plenigita funkcio.
    • Voku la testfunkcion, se ekzistas, de la strukturo.
    • Voku la init funkcion de la struct.
  • fme_probe() fpga_register_dev_ops()
    • Kreu la FME-karaktera aparato-nodon, registrante strukturon file_operacioj.

Port Platforma Aparato Inicialigo
Ĉi tiu sekcio donas finonview de la kodfluo por havena aparato inicialigo farita de intel-fpga-afu.ko. La ĉefaj datumstrukturoj kaj funkcioj estas elstarigitaj. Ĉi tiu sekcio estas plej bone sekvita kiam viewing la akompanan fontkodon (afu.c).

Port Platform Device Data Structures

struct feature_ops {
int (*init)(struct platformo_aparato *pdev, struct trajto *trajto);
int (*uinit)(struct platformo_aparato *pdev, struct trajto *trajto);
longa (*ioctl)(struct platform_device *pdev, struct-trajto *trajto,
unsigned int cmd, unsigned long arg);
int (*testo)(struct platformo_aparato *pdev, struct trajto *trajto);
};
struktura trajto {
const char *nomo;
int rimedo_indekso;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head nodo;
struct-mutex-seruro;
nesubskribita longa dev_status;
struct cdev cdev;
struct platformo_aparato *dev;
unsigned int malebligi_kalkuli;
malplena *privata;
int num;
int (*config_port)(struct platformo_aparato *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
struct-trajtoj[0];
};
struct fpga_afu_region {
u32 indekso;
u32 flagoj;
u64 grandeco;
u64 ofseto;
u64 phys;
struct list_head nodo;
};
struct fpga_afu_dma_region {
u64 uzanto_aldono;
u64 longo;
u64 iova;
struct page **paĝoj;
struct rb_node nodo;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int nombro_regionoj;
u8 num_umsgs;
struct list_head regionoj;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Port Platforma Aparato Inicialiga Fluo

Havena Inicialiga Fluointel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Komencu struct fpga_afu kaj konservu ĝin en la kampo feature_platform_data.private.
  • afu_probe () fpga_dev_feature_init () feature_instance_init ()
    • Konservu struct feature_ops en la feature_platform_data.features por ĉiu plenigita funkcio.
    • Voku la testfunkcion, se ekzistas, de la strukturo.
    • Voku la init funkcion de la struct.
  • afu_probe() fpga_register_dev_ops()
    • Kreu la Port-karakteran aparaton nodon, registrante strukturon file_operacioj.

FME IOCTL-oj
IOCTL-oj kiuj estas vokitaj sur malferma file priskribilo por /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—redonas la nunan version kiel entjero, komencante de 0.

FPGA_CHECK_EXTENSION—ne subtenata nuntempe.

FPGA_FME_PORT_RELEASE—arg estas montrilo al a:

struct fpga_fme_port_release {
__u32 argsz; // en: sizeof(struct fpga_fme_port_release)
__u32 flagoj; // en: devas esti 0
__u32 port_id; // en: haveno ID (de 0) por liberigi.
};

FPGA_FME_PORT_ASSIGN—arg estas montrilo al a:

struct fpga_fme_port_assign {
__u32 argsz; // en: sizeof(struct fpga_fme_port_assign)
__u32 flagoj; // en: devas esti 0
__u32 port_id; // en: haveno ID (de 0) por asigni. (devas esti
antaŭe liberigita de FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg estas montrilo al a:

struct fpga_fme_port_pr {
__u32 argsz; // en: sizeof(struct fpga_fme_port_pr)
__u32 flagoj; // en: devas esti 0
__u32 port_id; // en: ID de haveno (de 0)
__u32 bufro_grandeco; // en: grandeco de bitflua bufro en bajtoj. Devas esti 4-bajta
vicigitaj.
__u64 bufro_adreso; // en: proceza adreso de bitflua bufro
__u64 statuso; // el: erara stato (bitmasko)
};

Havenaj IOCTLoj
IOCTL-oj kiuj estas vokitaj sur malferma file priskribilo por /dev/intel-fpga-port.k FPGA_GET_API_VERSION—redonas la aktualan version kiel entjero, komencante de 0. FPGA_CHECK_EXTENSION—ne subtenata nuntempe.

FPGA_PORT_GET_INFO—arg estas montrilo al a:

struct fpga_port_info {
__u32 argsz; // en: sizeof(struct fpga_port_info)
__u32 flagoj; // ekstere: redonas 0
__u32 num_regionoj; // eksteren: nombro da MMIO-regionoj, 2 (1 por AFU kaj 1 por
STP)
__u32 num_umsgs; // el: nombro da UMsg subtenataj de la aparataro
};

FPGA_PORT_GET_REGION_INFO—arg estas montrilo al a:

struct fpga_port_region_info {
__u32 argsz; // en: sizeof(struct fpga_port_region_info)
__u32 flagoj; // eksteren: (bitmasko) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indekso; // en: FPGA_PORT_INDEX_UAFU aŭ FPGA_PORT_INDEX_STP
__u32 kompletigo; // en: devas esti 0
__u64 grandeco; // ekstere: grandeco de MMIO-regiono en bajtoj
__u64 ofseto; // ekstere: ofseto de MMIO-regiono de komenco de aparato fd
};

FPGA_PORT_DMA_MAP—arg estas montrilo al a:
struct fpga_port_dma_map {
__u32 argsz; // en: sizeof(struct fpga_port_dma_map)
__u32 flagoj; // en: devas esti 0 __u64 uzanto_addr; // en: proces virtuala
adreso. Devas esti paĝo vicigita.
__u64 longo; // in: longeco de mapado en bajtoj. Devas esti oblo de paĝo
grandeco.
__u64 iova; // eksteren: IO virtuala adreso };

FPGA_PORT_DMA_UNMAP—arg estas montrilo al a:
struct fpga_port_dma_unmap {
__u32 argsz; // en: sizeof(struct fpga_port_dma_unmap)
__u32 flagoj; // en: devas esti 0
__u64 iova; // en: IO virtuala adreso resendita de antaŭa
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg devas esti NULL.
  • FPGA_PORT_UMSG_ENABLE—arg devas esti NULL.
  • FPGA_PORT_UMSG_DISABLE—argoj devas esti NULL.

FPGA_PORT_UMSG_SET_MODE—arg estas montrilo al a:

struct fpga_port_umsg_cfg {
__u32 argsz; // en: sizeof(struct fpga_port_umsg_cfg)
__u32 flagoj; // en: devas esti 0
__u32 sugesto_bitmapo; // en: UMsg sugesta modo bitmapo. Signifas kiuj UMsg estas
ebligita.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg devas esti malŝaltita antaŭ eldonado de ĉi tiu ioctl.
  • La iova kampo devas esti por bufro sufiĉe granda por ĉiuj UMsg-oj (num_umsgs * PAGE_SIZE).
    • La bufro estas markita kiel "uzanta" fare de la bufroadministrado de la ŝoforo.
    • Se iova estas NULL, ajna antaŭa regiono estas nemarkita kiel "uzata".
  • arg estas montrilo al a:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // en: sizeof(struct fpga_port_umsg_base_addr)
    • u32 flagoj; // en: devas esti 0
    • u64 iova; // en: IO virtuala adreso de FPGA_PORT_DMA_MAP. };

Notu:

  • Por forigi la porterarojn, vi devas skribi la precizan bitmaskon de la nunaj eraroj, ekzample, kataj eraroj > klaras
  • UMsg estas nur subtenata per Acceleration Stack por Intel Xeon Processor kun Integra FPGA.

sysfs Files

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

sysfs file mmio kampo tajpu aliro
ports_num fme_header.capability.num_ports decimala int Nurlegebla
kaŝmemoro fme_header.capability.cache_size decimala int Nurlegebla
versio fme_header.capability.fabric_verid decimala int Nurlegebla
socket_id fme_header.capability.socket_id decimala int Nurlegebla
bitstream_id fme_header.bitstream_id hex uint64_t Nurlegebla
bitfluaj_metadatumoj fme_header.bitstream_md hex uint64_t Nurlegebla

FME Termika Administrado sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio kampo tajpu aliro
sojlo1 termika.sojlo.tmp_thshold1 decimala int Uzanto: Nurlegebla Radiko: Leg-skribi
sojlo2 termika.sojlo.tmp_thshold2 decimala int Uzanto: Nurlegebla Radiko: Leg-skribi
sojlo_vojaĝo termika.sojlo.termo_vojaĝo_thshold decimala int Nurlegebla
sojlo1_atingita termika.sojlo.thshold1_stato decimala int Nurlegebla
sojlo2_atingita termika.sojlo.thshold2_stato decimala int Nurlegebla
sojlo1_politiko termika. sojlo.thshold_policy decimala int Uzanto: Nurlegebla Radiko: Leg-skribi
temperaturo termika.rdsensor_fm1.fpga_temp decimala int Nurlegebla

FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio kampo tajpu aliro
konsumita potenco.status.pwr_konsumita hex uint64_t Nurlegebla
sojlo1 potenco.sojlo.sojlo1 hex uint64_t Uzanto: Nurlegebla Radiko: Leg-skribi
sojlo2 potenco.sojlo.sojlo2 hex uint64_t Uzanto: Nurlegebla Radiko: Leg-skribi
sojlo1_stato potenco.sojlo.sojlo1_stato decimala sensigna Nurlegebla
sojlo2_stato potenco.sojlo.sojlo2_stato decimala sensigna Nurlegebla
rtl power.status.fpga_latency_report decimala sensigna Nurlegebla

FME Tutmonda Eraro sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio kampo tajpu aliro
pcie0_eraroj gerror.pcie0_err hex uint64_t Legu-skribi
pcie1_eraroj gerror.pcie1_err hex uint64_t Legu-skribi
injekt_eraro gerror.ras_error_inj hex uint64_t Legu-skribi

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

sysfs file mmio kampo tajpu aliro
eraroj gerror.fme_err hex uint64_t Nurlegebla
unua_eraro gerror.fme_first_err.err_reg_status hex uint64_t Nurlegebla
sekva_eraro gerror.fme_next_err.err_reg_status hex uint64_t Nurlegebla
klara Forigas erarojn, first_error, next_error diversaj uint64_t Nur skribo

Notu:
Por forigi la FME-erarojn, vi devas skribi la precizan bitmaskon de la nunaj eraroj, ekzample cat eraroj > klara.

FME Parta Reagordo sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio kampo tajpu aliro
interfaco_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l deksesa 16-bajto Nurlegebla

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

sysfs file mmio kampo tajpu aliro
horloĝo gperf.clk.afu_interf_clock hex uint64_t Nurlegebla

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ne valida por Acceleration Stack por Intel Xeon CPU kun FPGAoj)

sysfs file mmio kampo tajpu aliro
frosti gperf.ch_ctl.freeze decimala int Legu-skribi
read_hit gperf.CACHE_RD_HIT hex uint64_t Nurlegebla
read_miss gperf.CACHE_RD_MISS hex uint64_t Nurlegebla
write_hit gperf.CACHE_WR_HIT hex uint64_t Nurlegebla
skribi_fraŭlino gperf.CACHE_WR_MISS hex uint64_t Nurlegebla
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Nurlegebla
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Nurlegebla
sysfs file mmio kampo tajpu aliro
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Nurlegebla
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Nurlegebla
tag_skribi_porton_disputon gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Nurlegebla

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ne valida por Akcela Stako por Intel Xeon CPU kun FPGAoj)

sysfs file mmio kampo tajpu aliro
frosti gperf.vtd_ctl.freeze decimala int Uzanto: Nurlegebla Radiko: Leg-skribi

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ne valida por Akcela Stako por Intel Xeon CPU kun FPGAoj)

sysfs file mmio kampo tajpu aliro
legi_transakcio gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Nurlegebla
skrib_transakcio gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Nurlegebla
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Nurlegebla
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Nurlegebla

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

sysfs file mmio kampo tajpu aliro
ebligi gperf.fab_ctl.(ebligita) decimala int Uzanto: Nurlegebla Radiko: Leg-skribi
frosti gperf.fab_ctl.freeze decimala int Uzanto: Nurlegebla Radiko: Leg-skribi
pcie0_legu gperf.FAB_PCIE0_RD hex uint64_t Nurlegebla
pcie0_skribi gperf.FAB_PCIE0_WR hex uint64_t Nurlegebla
pcie1_legu gperf.FAB_PCIE1_RD hex uint64_t Nurlegebla
pcie1_skribi gperf.FAB_PCIE1_WR hex uint64_t Nurlegebla
upi_read gperf.FAB_UPI_RD hex uint64_t Nurlegebla
upi_skribi gperf.FAB_UPI_WR hex uint64_t Nurlegebla

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

sysfs file mmio kampo tajpu aliro
pcie0_legu gperf.FAB_PCIE0_RD hex uint64_t Nurlegebla
pcie0_skribi gperf.FAB_PCIE0_WR hex uint64_t Nurlegebla
pcie1_legu gperf.FAB_PCIE1_RD hex uint64_t Nurlegebla
pcie1_skribi gperf.FAB_PCIE1_WR hex uint64_t Nurlegebla
upi_read gperf.FAB_UPI_RD hex uint64_t Nurlegebla
upi_skribi gperf.FAB_UPI_WR hex uint64_t Nurlegebla

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

sysfs file mmio kampo tajpu aliro
id port_header.capability.port_number decimala int Nurlegebla
ltr port_header.control.latency_tolerance decimala int Nurlegebla

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

sysfs file mmio kampo tajpu aliro
afu_id afu_header.guid deksesa 16-bajto Nurlegebla

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

sysfs file mmio kampo tajpu aliro
eraroj perror.port_error hex uint64_t Nurlegebla
unua_eraro perror.port_first_error hex uint64_t Nurlegebla
unua_misformita_peto perror.malreq deksesa 16-bajto Nurlegebla
klara eraro.(ĉiuj eraroj) diversaj uint64_t Nur skribo

Notu:
Por forigi la Port-erarojn, vi devas skribi la precizan bitmaskon de la nunaj eraroj, ekzample cat eraroj > klara.

Historio de Revizio

Dokumenta Versio Ŝanĝoj
2017.10.02 Komenca Eldono.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Dokumentoj/Rimedoj

Intel OPAE FPGA Linukso Device Driver Architecture [pdf] Uzantogvidilo
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Arkitekturo

Referencoj

Lasu komenton

Via retadreso ne estos publikigita. Bezonataj kampoj estas markitaj *