Intel OPAE FPGA Linukso Device Driver Architecture
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
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
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:
- Malŝarĝu la ŝoforon de la gasto
- Malŝaltu la VF de la gasto
- Malebligu SR-IOV
- Faru partan reagordon
- Ebligu SR-IOV
- Konektu la VF al la gasto
- Ŝ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:
- 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.
- 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
- Trapasu la VF-ojn al VM-oj.
- 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
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.
- Asignu struct build_feature_devs_info, pravalorigu ĝin.
- 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 Fluo
- 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 Fluo
- 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 |