Intel OPAE FPGA Linux Device Driver Architecture
OPAE Intel FPGA Linux Device Driver Architecture
U driver OPAE Intel FPGA furnisce interfacce per l'applicazioni di u spaziu di l'utilizatori per cunfigurà, enumerà, apre è accede à l'acceleratori FPGA in piattaforme dotate di soluzioni Intel FPGA è permette funzioni di gestione à livellu di sistema cum'è a ricunfigurazione FPGA, a gestione di l'energia è a virtualizazione.
Architettura di hardware
Da u puntu di l'OS view, u hardware FPGA appare cum'è un dispositivu PCIe regular. A memoria di u dispositivu FPGA hè urganizata cù una struttura di dati predefinita (Device Feature List). E caratteristiche supportate da u dispositivu FPGA sò esposti à traversu queste strutture di dati, cum'è illustratu quì sottu in a figura seguente:
Dispositivu FPGA PCIe
U driver supporta PCIe SR-IOV per creà Funzioni Virtuali (VF) chì ponu esse aduprati per assignà acceleratori individuali à e macchine virtuali.
Intel Corporation. Tutti i diritti riservati. Intel, u logu Intel è altri marchi Intel sò marchi di Intel Corporation o di e so filiali. Intel garantisce a prestazione di i so prudutti FPGA è semiconduttori à e specificazioni attuali in cunfurmità cù a garanzia standard di Intel, ma si riserva u dirittu di fà cambiamenti à qualsiasi prudutti è servizii in ogni mumentu senza avvisu. Intel ùn assume alcuna rispunsabilità o responsabilità derivante da l'applicazione o l'usu di qualsiasi informazione, pruduttu o serviziu descritti quì, salvu cum'è espressamente accunsentutu in scrittura da Intel. I clienti di Intel sò cunsigliati per ottene l'ultima versione di e specificazioni di u dispositivu prima di confià nantu à qualsiasi infurmazione publicata è prima di fà ordini per prudutti o servizii.
Altri nomi è marche ponu esse rivendicate cum'è a pruprietà di l'altri.
Dispositivu PCIe FPGA virtualizatu
Motore di gestione FPGA (FME)
U Motore di Gestione FPGA esegue a gestione di energia è termica, rapportu d'errore, ricunfigurazione, rapportu di rendiment, è altre funzioni di l'infrastruttura. Ogni FPGA hà un FME, chì hè sempre accessu attraversu a Funzione Fisica (PF). L'applicazioni di u spaziu di l'utilizatori ponu acquistà l'accessu esclusivu à l'FME usendu open(), è liberallu usendu close () cum'è un utilizatore privilegiatu (root).
Portu
Un Port rapprisenta l'interfaccia trà u fabricu FPGA staticu (u "FPGA Interface Manager (FIM)") è una regione parzialmente reconfigurable chì cuntene una Funzione Accelerator (AF). U Portu cuntrolla a cumunicazione da u software à l'acceleratore è espone funzioni cum'è reset è debug. Un dispositivu PCIe pò avè parechji Porti, è ogni Port pò esse esposta à traversu un VF assignendu cù u FPGA_FME_PORT_ASSIGN ioctl in u dispusitivu FME.
Unità di funzione di l'acceleratore (AF).
- Una Unità di Funzione Acceleratore (AF) hè attaccata à un Portu è espone una regione MMIO 256K per esse aduprata per i registri di cuntrollu specifichi di l'acceleratore.
- L'applicazioni di u spaziu di l'utilizatori ponu acquistà l'accessu esclusivu à una AFU attaccata à un Portu usendu open() in u dispositivu Portu, è liberallu cù close ().
- L'applicazioni di u spaziu di l'utilizatori ponu ancu mmap () acceleratore regioni MMIO.
Reconfigurazione Parziale
Cum'è l'esitatu sopra, l'acceleratori ponu esse ricunfigurati per via di a ricunfigurazione parziale di una Funzione Accelerator (AF) file. A Funzione Accelerator (AF) deve esse generata per a FIM esatta è a regione statica mirata (Portu) di u FPGA; altrimenti, l'operazione di ricunfigurazione fallarà è possibbilmente causarà inestabilità di u sistema. Questa cumpatibilità pò esse verificata paragunendu l'ID di l'interfaccia nutata in l'intestazione AF cù l'ID di l'interfaccia esposta da u FME attraversu sysfs. Questa verificazione hè generalmente fatta da u spaziu di l'utilizatori prima di chjamà a reconfigurazione IOCTL.
Nota:
Attualmente, qualsiasi prugramma di software chì accede à l'FPGA, cumpresi quelli chì funzionanu in un host virtualizatu, deve esse chjusu prima di pruvà una ricunfigurazione parziale. I passi seranu:
- Scaricate u driver da l'ospite
- Scollegate u VF da l'ospite
- Disattivà SR-IOV
- Eseguite a ricunfigurazione parziale
- Habilita SR-IOV
- Cunnette u VF à l'invitatu
- Caricà u driver in l'ospite
Virtualizazione FPGA
Per attivà l'accessu à un acceleratore da l'applicazioni in esecuzione in una VM, u portu di l'AFU rispettivu deve esse assignatu à un VF cù i seguenti passi:
- U PF pussede tutti i porti AFU per difettu. Qualchese portu chì deve esse riassignatu à un VF deve esse prima liberatu da u PF attraversu u FPGA_FME_PORT_RELEASE ioctl in u dispusitivu FME.
- Una volta chì i porti N sò liberati da u PF, u cumandimu sottu pò esse usatu per attivà SRIOV è VF. Ogni VF pussede un solu portu cù AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
- Passa da i VF à i VM.
- L'AFU sottu VF hè accessibile da l'applicazioni in VM (aduprendu u stessu driver in VF).
Nota:
Un FME ùn pò micca esse assignatu à un VF, cusì PR è altre funzioni di gestione sò dispunibuli solu attraversu u PF.
L'urganizazione di i cunduttori
Driver di Dispositivu di Modulu PCIe
L'urganizazione di i cunduttori
I dispusitivi FPGA appariscenu cum'è dispositi PCIe regulari; cusì, u driver di u dispositivu FPGA PCIe (intel-FPGA-PCI.ko) hè sempre caricatu prima una volta chì un FPGA PCIe PF o VF hè rilevatu. Stu driver ghjoca un rolu infrastrutturali in l'architettura di u driver. It:
- Crea un dispositivu cuntainer FPGA cum'è parent di i dispositi di funziunalità.
- Passa per a Lista di Funzioni di Dispositivi, chì hè implementata in a memoria BAR di u dispositivu PCIe, per scopre i dispositi di funziunalità è e so sub-funzioni è creanu dispositivi di piattaforma per elli sottu à u dispositivu di cuntainer.
- Supporta SR-IOV.
- Introduce l'infrastruttura di u dispositivu di funzioni, chì astrae l'operazioni per i subfunzioni è espone e funzioni cumuni à i driver di u dispositivu.
Funzioni di Driver di Dispositivi di Modulu PCIe
- Contene a scuperta PCIe, l'enumerazione di i dispositi è a scuperta di e funzioni.
- Crea repertorii sysfs per u dispositivu parent, FPGA Management Engine (FME) è Port.
- Crea l'istanze di u driver di a piattaforma, facendu chì u kernel Linux carricà i so rispettivi driver di moduli di piattaforma.
Driver di Dispositivu di Modulu di Piattaforma FME
- Gestione di energia è termica, rapportu d'errore, rapportu di rendiment, è altre funzioni infrastrutturali. Pudete accede à queste funzioni via interfacce sysfs esposti da u driver FME.
- Reconfigurazione Parziale. U driver FME registra un Manager FPGA durante l'inizializazione di sub-funzione PR; una volta riceve un FPGA_FME_PORT_PR ioctl da voi, invoca a funzione di l'interfaccia cumuni da FPGA Manager per compie a ricunfigurazione parziale di u bitstream à u portu datu.
- Gestione di u portu per a virtualizazione. U driver FME introduce dui ioctls, FPGA_FME_PORT_RELEASE, chì libera u portu datu da PF; è FPGA_FME_PORT_ASSIGN, chì assigna u Port torna à PF. Una volta chì u Portu hè liberatu da u PF, pò esse assignatu à u VF attraversu l'interfacce SR-IOV furnite da u driver PCIe. Per più infurmazione, riferite à "Virtualizazione FPGA".
Funzioni di Driver di Dispositivi di Modulu di Piattaforma FME
- Crea u node di u dispositivu di caratteri FME.
- Crea u sysfs FME files è implementa u FME sysfs file accessori.
- Implementa i sub-drivers privati FME.
- Sub-drivers di funzioni private FME:
- L'intestazione FME
- Gestione termale
- Gestione di l'energia
- Errore Globale
- Reconfigurazione Parziale
- Prestazione Globale
Driver di Dispositivu di Modulu di Piattaforma Portu
Simile à u driver FME, u cunduttore FPGA Port (è AFU) (intel-fpga-afu. ko) hè sondatu una volta chì u dispusitivu di a piattaforma Port hè creatu. A funzione principale di stu modulu hè di furnisce una interfaccia per l'applicazioni di u spaziu di l'utilizatori per accede à l'acceleratori individuali, cumpresu u cuntrollu di reset di basa in u Portu, l'esportazione di a regione AFU MMIO, u serviziu di mappatura di buffer DMA, notificazione UMsg (1) è funzioni di debug remota ( vede sopra).
UMsg hè supportatu solu per Acceleration Stack per Processor Intel Xeon® cù FPGA integrata.
Funzioni di Driver di Dispositivi di Modulu di Piattaforma Portu
- Crea u node di u dispositivu di u caratteru Port.
- Crea u Port sysfs files è implementa u Port sysfs file accessori.
- Implementa i sub-drivers privati di u portu.
- Sub-drivers di funzioni private di u portu:
- Capu di u portu
- AFU
- Errore portu
- UMsg (2)
- Signal Tap
Applicazione Enumerazione di Dispositivi FPGA
Questa sezione introduce cumu l'applicazioni enumeranu u dispositivu FPGA da a ghjerarchia sysfs sottu /sys/class/fpga. In l'example sottu, dui dispositi Intel FPGA sò stallati in l'ospite. Ogni dispusitivu FPGA hà un FME è dui Ports (AFU). Per ogni dispositivu FPGA, un repertoriu di u dispositivu hè creatu in /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Ogni nodu hà un FME è dui Porti (AFU) cum'è dispositi zitelli:
/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
In generale, l'interfacce FME / Port sysfs sò chjamati cusì:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
cun I consecutively numbering tutti i dispusitivi cuntainer, j consecutively numbering l'FME è k consecutively numbering tutti i Ports.
I nodi di u dispositivu utilizati per ioctl () è mmap () ponu esse riferiti attraversu:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
Enumerazione di driver PCIe
Questa sezzione dà un overview di u flussu di codice per l'enumerazione di u dispositivu realizatu da intel-fpga-pci.ko. I principali strutture di dati è funzioni sò evidenziati. Questa sezione hè megliu seguita quandu viewing u codice fonte accumpagnatu (pcie.c).
Strutture di dati di enumerazione
enumerazione fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
idr di struttura statica fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *nome;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
classa di struttura statica *fpga_class;
struttura statica 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,}
};
struttura statica 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 device * fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int released_port_num;
struct list_head regions;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
struct device *parent_dev;
struct platform_device * feature_dev;
};
Flussu di enumerazione
- ccidrv_init()
- Inizializzate fpga_ids cù idr_init().
- Inizializzate fpga_chrdevs[i].devt cù alloc_chrdev_region().
- Inizializzate fpga_class usendu class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Attivate u dispositivu PCI, dumandate l'accessu à e so regioni, stabilisce u modu maestru PCI, è cunfigurà DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Allocate una struttura build_feature_devs_info, inizializzala.
.parent_dev hè stallatu in un repertoriu sysfs parent (intel-fpga-dev.id) chì cuntene i repertorii FME è Port sysfs.
- Allocate una struttura build_feature_devs_info, inizializzala.
- parse_feature_list()
- Camminate u BAR0 Device Feature List per scopre u FME, u Portu è e so caratteristiche private.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Quandu si trova un FME:
- build_info_create_dev()
- Assignate un dispositivu di piattaforma per u FME, almacenendu in build_feature_devs_info.feature_dev.
- feature_dev.id hè inizializatu à u risultatu di idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent hè stallatu à build_feature_devs_info.parent_dev.
- Allocate un array di risorse struct in feature_dev.resource.
- Allocate una struttura feature_platform_data, inizializzala, è almacenà un puntatore in feature_dev.dev.platform_data
- create_feature_instance () build_info_add_sub_feature ()
- Inizializza feature_dev.resource[FME_FEATURE_ID_HEADER].
- feature_platform_data_add ()
- Initialize feature_platform_data.features[FME_FEATURE_ID_HEADER], tuttu ma .fops.
- parse_feature() parse_feature_afus() parse_feature_port()
- Quandu un Portu hè scontru:
- build_info_create_dev()
- Allocate un dispositivu di piattaforma per u Portu, almacenendu in build_feature_devs_info.feature_dev.
- feature_dev.id hè inizializatu à u risultatu di idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent hè stallatu à build_feature_devs_info.parent_dev.
- Allocate un array di risorse struct in feature_dev.resource.
- Allocate una struttura feature_platform_data, inizializzala, è almacenà un puntatore in feature_dev.dev.platform_data
- build_info_commit_dev()
- Aghjunghjite u struct feature_platform_data.node per u Port à a lista di Ports in struct cci_drvdata.port_dev_list
- create_feature_instance () build_info_add_sub_feature ()
- Inizializza feature_dev.resource[PORT_FEATURE_ID_HEADER].
- feature_platform_data_add ()
- Initialize feature_platform_data.features[PORT_FEATURE_ID_HEADER], tuttu ma .fops.
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Quandu si trova una AFU:
- create_feature_instance () build_info_add_sub_feature ()
- Inizializza feature_dev.resource[PORT_FEATURE_ID_UAFU].
- feature_platform_data_add ()
- Initialize feature_platform_data.features[PORT_FEATURE_ID_UAFU], tuttu ma .fops.
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Quandu si trova una funzione privata FME:
- create_feature_instance () build_info_add_sub_feature ()
- Inizializza feature_dev.resource[id].
- feature_platform_data_add ()
- Initialize feature_platform_data.features[id], tuttu ma .fops.
- parse_feature() parse_feature_private() parse_feature_port_private()
- Quandu si trova una funzione privata di Port: * create_feature_instance () build_info_add_sub_feature () * Initialize feature_dev.resource [id]. * feature_platform_data_add () Initialize feature_platform_data.features[id], tuttu ma .fops.
- parse_ports_from_fme()
- Se u driver hè caricatu nantu à a Funzione Fisica (PF), allora:
- Eseguite u flussu parse_feature_list() nantu à ogni portu descritta in l'intestazione FME.
- Aduprà u BAR mintuatu in ogni entrata Port in l'intestazione.
Inizializazione di u Dispositivu di Piattaforma FME
Questa sezzione dà un overview di u flussu di codice per l'inizializazione di u dispositivu FME realizatu da intel-fpga-fme.ko. I principali strutture di dati è funzioni sò highlited. Questa sezione hè megliu seguita quandu viewing u codice fonte accumpagnatu (fme-main.c).
Strutture di dati di u dispositivu di a piattaforma FME
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *caratteristica);
int (*uinit)(struct platform_device *pdev, struct feature *caratteristica);
long (* ioctl) (struct platform_device * pdev, struct feature * feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *caratteristica);
};
funzione di struttura {
const char *nome;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device * dev;
unsigned int disable_count;
vacu * privatu;
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 *)); struttu
caratteristiche caratteristiche [0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struct device * fme_dev;
struct list_head node;
struct list_head figlioli;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct device * dev_err;
struct perf_object *perf_dev;
struct feature_platform_data * pdata;
};
Flussu di inizializazione di u dispositivu di a piattaforma FME
Flussu di inizializazione FME
- fme_probe() fme_dev_init()
- Initialize a struct fpga_fme and store it in the feature_platform_data.private field.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Salvà una struttura feature_ops in feature_platform_data.features per ogni funzione populata.
- Chjamate a funzione di prova, s'ellu ci hè, da a struttura.
- Chjamate a funzione init da a struttura.
- fme_probe() fpga_register_dev_ops()
- Crea u node di u dispositivu di caratteri FME, registrendu una struttura file_operazioni.
Inizializazione di u Dispositivu di Piattaforma Portu
Questa sezzione dà un overview di u flussu di codice per l'inizializazione di u dispositivu portu realizatu da intel-fpga-afu.ko. I principali strutture di dati è funzioni sò evidenziati. Questa sezione hè megliu seguita quandu viewing u codice fonte accumpagnatu (afu.c).
Strutture di dati di u dispositivu di a piattaforma portu
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *caratteristica);
int (*uinit)(struct platform_device *pdev, struct feature *caratteristica);
long (* ioctl) (struct platform_device * pdev, struct feature * feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *caratteristica);
};
funzione di struttura {
const char *nome;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device * dev;
unsigned int disable_count;
vacu * privatu;
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 features features[0];
};
struct fpga_afu_region {
indice u32;
u32 bandiere;
taglia u64;
u64 offset;
u64 fisicu;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
lunghezza u64;
u64 iova;
struct page ** pagine;
struct rb_node node;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head regions;
struct rb_root dma_regions;
struct feature_platform_data * pdata;
};
Flussu di inizializazione di u dispositivu di a piattaforma portu
Flussu di Inizializazione Portu
- afu_probe() afu_dev_init()
- Initialize a struct fpga_afu and store it in the feature_platform_data.private field.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Salvà una struttura feature_ops in feature_platform_data.features per ogni funzione populata.
- Chjamate a funzione di prova, s'ellu ci hè, da a struttura.
- Chjamate a funzione init da a struttura.
- afu_probe() fpga_register_dev_ops()
- Crea u node di u dispositivu di u caratteru Port, registrendu una struttura file_operazioni.
IOCTL FME
IOCTL chì sò chjamati nantu à un apertu file descriptor per /dev/intel-fpga-fme.j FPGA_GET_API_VERSION - torna a versione attuale cum'è un interu, partendu da 0.
FPGA_CHECK_EXTENSION - micca supportatu attualmente.
FPGA_FME_PORT_RELEASE - arg hè un puntatore à a:
struct fpga_fme_port_release {
__u32 argsz; // in: sizeof (struct fpga_fme_port_release)
__u32 bandieri; // in: deve esse 0
__u32 port_id; // in: ID di portu (da 0) per liberà.
};
FPGA_FME_PORT_ASSIGN - arg hè un puntatore à a:
struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof (struct fpga_fme_port_assign)
__u32 bandieri; // in: deve esse 0
__u32 port_id; // in: ID di portu (da 0) per assignà. (deve esse statu
liberatu prima da FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR - arg hè un puntatore à a:
struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof (struct fpga_fme_port_pr)
__u32 bandieri; // in: deve esse 0
__u32 port_id; // in: ID di portu (da 0)
__u32 buffer_size; // in: dimensione di u buffer bitstream in byte. Deve esse 4-byte
allineatu.
__u64 indirizzu_buffer; // in: indirizzu di prucessu di u buffer di bitstream
__u64 statutu; // out: statu di errore (bitmask)
};
IOCTL portu
IOCTL chì sò chjamati nantu à un apertu file descriptor for /dev/intel-fpga-port.k FPGA_GET_API_VERSION-ritorna a versione attuale cum'è un integer, partendu da 0. FPGA_CHECK_EXTENSION-micca supportatu attualmente.
FPGA_PORT_GET_INFO - arg hè un puntatore à a:
struct fpga_port_info {
__u32 argsz; // in: sizeof (struct fpga_port_info)
__u32 bandieri; // out: torna 0
__u32 num_regions; // out: numeru di regioni MMIO, 2 (1 per AFU è 1 per
STP)
__u32 num_umsgs; // out: numeru di UMsg supportati da u hardware
};
FPGA_PORT_GET_REGION_INFO-arg hè un puntatore à a:
struct fpga_port_region_info {
__u32 argsz; // in: sizeof (struct fpga_port_region_info)
__u32 bandieri; // out: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indice; // in: FPGA_PORT_INDEX_UAFU o FPGA_PORT_INDEX_STP
__u32 padding; // in: deve esse 0
__u64 taglia; // out: dimensione di a regione MMIO in bytes
__u64 offset; // fora: offset di a regione MMIO da u principiu di u dispusitivu fd
};
FPGA_PORT_DMA_MAP - arg hè un puntatore à a:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof (struct fpga_port_dma_map)
__u32 bandieri; // in: deve esse 0 __u64 user_addr; // in: prucessu virtuale
indirizzu. Deve esse allineatu à a pagina.
__u64 lunghezza; // in: lunghezza di a mappatura in byte. Deve esse un multiplu di pagina
taglia.
__u64 iova; // fora: indirizzu virtuale IO };
FPGA_PORT_DMA_UNMAP - arg hè un puntatore à a:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof (struct fpga_port_dma_unmap)
__u32 bandieri; // in: deve esse 0
__u64 iova; // in: Indirizzu virtuale IO tornatu da un precedente
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET-arg deve esse NULL.
- FPGA_PORT_UMSG_ENABLE—arg deve esse NULL.
- FPGA_PORT_UMSG_DISABLE-args deve esse NULL.
FPGA_PORT_UMSG_SET_MODE—arg hè un puntatore à a:
struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof (struct fpga_port_umsg_cfg)
__u32 bandieri; // in: deve esse 0
__u32 hint_bitmap; // in: UMsg hint mode bitmap. Significa chì UMsg sò
attivatu.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg deve esse disattivatu prima di emette stu ioctl.
- U campu iova deve esse per un buffer abbastanza grande per tutti i UMsg (num_umsgs * PAGE_SIZE).
- U buffer hè marcatu cum'è "in usu" da a gestione di u buffer di u driver.
- Se iova hè NULL, ogni regione precedente ùn hè micca marcata cum'è "in usu".
- arg hè un puntatore à a:
struct fpga_port_umsg_base_addr {- u32 argsz; // in: sizeof (struct fpga_port_umsg_base_addr)
- u32 bandiere; // in: deve esse 0
- u64 iova; // in: indirizzu virtuale IO da FPGA_PORT_DMA_MAP. };
Nota:
- Per sguassà l'errori di u portu, avete da scrive u bitmask esatta di l'errori attuali, per esempiuample, cat errori > chjaru
- UMsg hè supportatu solu per Acceleration Stack per Processor Intel Xeon cù FPGA Integrata.
sysfs Files
FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | campu mmio | tipu | accessu |
ports_num | fme_header.capability.num_ports | decimale int | Lettura solu |
cache_size | fme_header.capability.cache_size | decimale int | Lettura solu |
versione | fme_header.capability.fabric_verid | decimale int | Lettura solu |
socket_id | fme_header.capability.socket_id | decimale int | Lettura solu |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Lettura solu |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Lettura solu |
Sistemi di gestione termica FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | campu mmio | tipu | accessu |
soglia 1 | thermal.threshold.tmp_thshold1 | decimale int | User: Read-only Root: Lettura-scrittura |
soglia 2 | thermal.threshold.tmp_thshold2 | decimale int | User: Read-only Root: Lettura-scrittura |
threshold_trip | thermal.threshold.therm_trip_thshold | decimale int | Lettura solu |
threshold1_reached | thermal.threshold.thshold1_status | decimale int | Lettura solu |
threshold2_reached | thermal.threshold.thshold2_status | decimale int | Lettura solu |
threshold1_policy | termale. threshold.thshold_policy | decimale int | User: Read-only Root: Lettura-scrittura |
temperatura | thermal.rdsensor_fm1.fpga_temp | decimale int | Lettura solu |
Sistemi di gestione di l'energia FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | campu mmio | tipu | accessu |
cunsumatu | power.status.pwr_consumed | hex uint64_t | Lettura solu |
soglia 1 | soglia di putenza1 | hex uint64_t | User: Read-only Root: Lettura-scrittura |
soglia 2 | soglia di putenza2 | hex uint64_t | User: Read-only Root: Lettura-scrittura |
threshold1_status | power.threshold.threshold1_status | decimale senza signu | Lettura solu |
threshold2_status | power.threshold.threshold2_status | decimale senza signu | Lettura solu |
rtl | power.status.fpga_latency_report | decimale senza signu | Lettura solu |
FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | campu mmio | tipu | accessu |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Leghjite-scritte |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Leghjite-scritte |
inject_error | gerror.ras_error_inj | hex uint64_t | Leghjite-scritte |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | campu mmio | tipu | accessu |
errori | gerror.fme_err | hex uint64_t | Lettura solu |
primu_errore | gerror.fme_first_err.err_reg_status | hex uint64_t | Lettura solu |
next_error | gerror.fme_next_err.err_reg_status | hex uint64_t | Lettura solu |
chjaru | Cancella l'errori, first_error, next_error | vari uint64_t | Scrive solu |
Nota:
Per sguassà l'errori FME, deve scrive u bitmask esatta di l'errori attuali, per esempiuample cat errori > chjaru.
FME Partial Reconfiguration sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | campu mmio | tipu | accessu |
interface_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16-byte | Lettura solu |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | campu mmio | tipu | accessu |
clock | gperf.clk.afu_interf_clock | hex uint64_t | Lettura solu |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Non validu per Acceleration Stack per CPU Intel Xeon cù FPGA)
sysfs file | campu mmio | tipu | accessu |
congelate | gperf.ch_ctl.freeze | decimale int | Leghjite-scritte |
leghje_hit | gperf.CACHE_RD_HIT | hex uint64_t | Lettura solu |
leghje_miss | gperf.CACHE_RD_MISS | hex uint64_t | Lettura solu |
scrive_hit | gperf.CACHE_WR_HIT | hex uint64_t | Lettura solu |
scrive_miss | gperf.CACHE_WR_MISS | hex uint64_t | Lettura solu |
hold_request | gperf.CACHE_HOLD_REQ | hex uint64_t | Lettura solu |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Lettura solu |
sysfs file | campu mmio | tipu | accessu |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Lettura solu |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Lettura solu |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Lettura solu |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Non validu per Acceleration Stack per CPU Intel Xeon cù FPGA)
sysfs file | campu mmio | tipu | accessu |
congelate | gperf.vtd_ctl.freeze | decimale int | User: Read-only Root: Lettura-scrittura |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Non valido per Acceleration Stack per CPU Intel Xeon con FPGA)
sysfs file | campu mmio | tipu | accessu |
read_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Lettura solu |
scrive_transazzione | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Lettura solu |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Lettura solu |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Lettura solu |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | campu mmio | tipu | accessu |
attivà | gperf.fab_ctl.(attivatu) | decimale int | User: Read-only Root: Lettura-scrittura |
congelate | gperf.fab_ctl.freeze | decimale int | User: Read-only Root: Lettura-scrittura |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Lettura solu |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Lettura solu |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Lettura solu |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Lettura solu |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Lettura solu |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Lettura solu |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | campu mmio | tipu | accessu |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Lettura solu |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Lettura solu |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Lettura solu |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Lettura solu |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Lettura solu |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Lettura solu |
Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | campu mmio | tipu | accessu |
id | port_header.capability.port_number | decimale int | Lettura solu |
ltr | port_header.control.latency_tolerance | decimale int | Lettura solu |
Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | campu mmio | tipu | accessu |
afu_id | afu_header.guid | hex 16-byte | Lettura solu |
Port Error sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | campu mmio | tipu | accessu |
errori | perror.port_error | hex uint64_t | Lettura solu |
primu_errore | perror.port_first_error | hex uint64_t | Lettura solu |
first_malformed_req | perror.malreq | hex 16-byte | Lettura solu |
chjaru | errore. (tutti l'errori) | vari uint64_t | Scrive solu |
Nota:
Per sguassà l'errori di u Portu, deve scrive u bitmask esatta di l'errori attuali, per esempiuample cat errori > chjaru.
Storia di rivisione
Versione di documentu | Cambiamenti |
2017.10.02 | Liberazione iniziale. |
OPAE Intel FPGA Linux Device Driver Architecture Guide
Documenti / Risorse
![]() |
Intel OPAE FPGA Linux Device Driver Architecture [pdfGuida di l'utente OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |