intel-logo

Intel OPAE FPGA Linux Device Driver Architecture

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

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

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

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

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

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:

  1. Scaricate u driver da l'ospite
  2. Scollegate u VF da l'ospite
  3. Disattivà SR-IOV
  4. Eseguite a ricunfigurazione parziale
  5. Habilita SR-IOV
  6. Cunnette u VF à l'invitatu
  7. 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:

  1. 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.
  2. 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
  3. Passa da i VF à i VM.
  4. 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

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

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

  • 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 Portuintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • 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

Referenze

Lascia un cumentu

U vostru indirizzu email ùn serà micca publicatu. I campi obbligatori sò marcati *