intel-logo

Intel OPAE FPGA Linux Device Driver Architecture

intel-OPAE-FPGA-Linux-Device-Driver-Arkitettura-prodott

OPAE Intel FPGA Linux Device Driver Architecture

Is-sewwieq OPAE Intel FPGA jipprovdi interfaces għal applikazzjonijiet tal-ispazju tal-utent biex jiġu kkonfigurati, enumerati, miftuħa u aċċessati aċċeleraturi FPGA fuq pjattaformi mgħammra b'soluzzjonijiet Intel FPGA u jippermetti funzjonijiet ta 'ġestjoni fil-livell tas-sistema bħal konfigurazzjoni mill-ġdid tal-FPGA, ġestjoni tal-enerġija u virtwalizzazzjoni.

Arkitettura tal-Hardware

Mill-punt tal-OS ta view, il-ħardwer FPGA jidher bħala apparat PCIe regolari. Il-memorja tal-apparat FPGA hija organizzata bl-użu ta 'struttura ta' data predefinita (Lista tal-Karatteristiċi tal-Apparat). Karatteristiċi appoġġjati mill-apparat FPGA huma esposti permezz ta 'dawn l-istrutturi tad-dejta, kif muri hawn taħt fil-figura li ġejja:

Apparat FPGA PCIe

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

Is-sewwieq jappoġġja PCIe SR-IOV biex joħloq Funzjonijiet Virtwali (VFs) li jistgħu jintużaw biex jassenjaw aċċeleraturi individwali għal magni virtwali.

Korporazzjoni Intel. Id-drittijiet kollha riżervati. Intel, il-logo Intel, u marki oħra Intel huma trademarks ta' Intel Corporation jew is-sussidjarji tagħha. Intel tiggarantixxi l-prestazzjoni tal-prodotti FPGA u semikondutturi tagħha għall-ispeċifikazzjonijiet attwali skont il-garanzija standard ta 'Intel iżda tirriżerva d-dritt li tagħmel bidliet fi kwalunkwe prodott u servizz fi kwalunkwe ħin mingħajr avviż. Intel ma tassumi l-ebda responsabbiltà jew responsabbiltà li tirriżulta mill-applikazzjoni jew l-użu ta' kwalunkwe informazzjoni, prodott jew servizz deskritt hawnhekk ħlief kif miftiehem espressament bil-miktub minn Intel. Il-klijenti Intel huma avżati biex jiksbu l-aħħar verżjoni tal-ispeċifikazzjonijiet tal-apparat qabel ma jiddependu fuq kwalunkwe informazzjoni ppubblikata u qabel ma jagħmlu ordnijiet għal prodotti jew servizzi.

Ismijiet u marki oħra jistgħu jiġu mitluba bħala l-proprjetà ta 'oħrajn.

Apparat FPGA PCIe virtwalizzat

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

Magna ta' Ġestjoni FPGA (FME)
Il-Magna ta 'Ġestjoni FPGA twettaq ġestjoni tal-enerġija u termali, rappurtar ta' żbalji, konfigurazzjoni mill-ġdid, rappurtar tal-prestazzjoni, u funzjonijiet oħra tal-infrastruttura. Kull FPGA għandha FME waħda, li hija dejjem aċċessata permezz tal-Funzjoni Fiżika (PF). L-applikazzjonijiet tal-ispazju tal-utent jistgħu jiksbu aċċess esklussiv għall-FME billi jużaw open(), u jirrilaxxawha billi jużaw close() bħala utent privileġġjat (root).

Port
Port jirrappreżenta l-interface bejn id-drapp statiku FPGA (il-"FPGA Interface Manager (FIM)") u reġjun parzjalment konfigurabbli mill-ġdid li fih Funzjoni Aċċeleratur (AF). Il-Port jikkontrolla l-komunikazzjoni mis-softwer għall-aċċeleratur u jesponi karatteristiċi bħal reset u debug. Apparat PCIe jista 'jkollu diversi Portijiet, u kull Port jista' jiġi espost permezz ta 'VF billi jassenjah bl-użu tal-FPGA_FME_PORT_ASSIGN ioctl fuq l-apparat FME.

Unità tal-Funzjoni tal-Aċċeleratur (AF).

  • Unità tal-Funzjoni tal-Aċċeleratur (AF) hija mwaħħla ma' Port u tesponi reġjun MMIO 256K biex jintuża għal reġistri ta' kontroll speċifiċi għall-aċċeleratur.
  • L-applikazzjonijiet tal-ispazju tal-utent jistgħu jiksbu aċċess esklussiv għal AFU mwaħħla ma' Port billi jużaw open() fuq it-tagħmir tal-Port, u jirrilaxxawh billi juża close().
  • L-applikazzjonijiet tal-ispazju tal-utent jistgħu wkoll mmap() accelerator reġjuni MMIO.

Rikonfigurazzjoni parzjali
Kif imsemmi hawn fuq, l-aċċeleraturi jistgħu jiġu kkonfigurati mill-ġdid permezz ta' konfigurazzjoni mill-ġdid parzjali ta' Funzjoni tal-Aċċeleratur (AF) file. Il-Funzjoni tal-Aċċeleratur (AF) trid tkun ġiet iġġenerata għall-FIM eżatt u r-reġjun statiku mmirat (Port) tal-FPGA; inkella, l-operazzjoni ta 'konfigurazzjoni mill-ġdid se tfalli u possibilment tikkawża instabbiltà tas-sistema. Din il-kompatibilità tista 'tiġi ċċekkjata billi titqabbel l-ID ta' l-interface innutat fl-intestatura AF ma 'l-ID ta' l-interface espost mill-FME permezz tas-sysfs. Din il-verifika normalment issir mill-ispazju tal-utent qabel ma tissejjaħ l-IOCTL tar-rikonfigurazzjoni.

Nota:
Bħalissa, kwalunkwe programm tas-softwer li jaċċessa l-FPGA, inklużi dawk li jaħdmu f'host virtwali, għandu jingħalaq qabel ma tipprova rikonfigurazzjoni parzjali. Il-passi jkunu:

  1. Ħatt is-sewwieq mill-mistieden
  2. Aqla 'l-VF mill-mistieden
  3. Iddiżattiva SR-IOV
  4. Wettaq rikonfigurazzjoni parzjali
  5. Ippermetti SR-IOV
  6. Ipplaggja l-VF lill-mistieden
  7. Tagħbija s-sewwieq fil-mistieden

Virtualization FPGA
Biex ikun hemm aċċess għal aċċeleratur minn applikazzjonijiet li jaħdmu f'VM, il-port tal-AFU rispettiv jeħtieġ li jiġi assenjat lil VF billi tuża l-passi li ġejjin:

  1. Il-PF jippossjedi l-portijiet AFU kollha awtomatikament. Kwalunkwe port li jeħtieġ li jiġi assenjat mill-ġdid għal VF għandu l-ewwel jiġi rilaxxat mill-PF permezz tal-FPGA_FME_PORT_RELEASE ioctl fuq l-apparat FME.
  2. Ladarba N portijiet jiġu rilaxxati mill-PF, il-kmand hawn taħt jista 'jintuża biex jippermetti SRIOV u VFs. Kull VF jippossjedi port wieħed biss b'AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Għaddi mill-VFs għal VMs.
  4. L-AFU taħt VF hija aċċessibbli minn applikazzjonijiet fil-VM (bl-użu tal-istess sewwieq ġewwa l-VF).

Nota:
FME ma jistax jiġi assenjat lil VF, għalhekk PR u funzjonijiet oħra ta' ġestjoni huma disponibbli biss permezz tal-PF.

Organizzazzjoni tas-sewwieqa

Driver tal-Apparat tal-Modulu PCIe

Organizzazzjoni tas-sewwieqa

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

L-apparati FPGA jidhru bħala apparati PCIe regolari; għalhekk, is-sewwieq tal-apparat FPGA PCIe (intel-FPGA-PCI.ko) huwa dejjem mgħobbi l-ewwel ladarba jinstab FPGA PCIe PF jew VF. Dan is-sewwieq għandu rwol infrastrutturali fl-arkitettura tas-sewwieq. Huwa:

  • Joħloq apparat kontenitur FPGA bħala ġenitur tal-apparati tal-karatteristiċi.
  • Jgħaddi mil-Lista tal-Karatteristiċi tal-Apparat, li hija implimentata fil-memorja BAR tal-apparat PCIe, biex jiskopri tagħmir tal-karatteristiċi u s-subkaratteristiċi tagħhom u joħloq tagħmir tal-pjattaforma għalihom taħt l-apparat tal-kontenitur.
  • Jappoġġja SR-IOV.
  • Tintroduċi l-infrastruttura tal-apparat tal-karatteristiċi, li tiġbed l-operazzjonijiet għas-sottokaratteristiċi u tesponi funzjonijiet komuni għal sewwieqa tal-apparat tal-karatteristiċi.

Funzjonijiet tas-Sewwieq tal-Apparat tal-Modulu PCIe

  • Fih skoperta PCIe, enumerazzjoni tal-apparat, u skoperta tal-karatteristiċi.
  • Joħloq direttorji sysfs għall-apparat prinċipali, FPGA Management Engine (FME), u Port.
  • Joħloq l-istanzi tas-sewwieq tal-pjattaforma, li jikkawża li l-kernel tal-Linux jgħabbi s-sewwieqa tal-modulu tal-pjattaforma rispettivi tagħhom.

Sewwieq tal-Apparat tal-Modulu tal-Pjattaforma FME

  • Ġestjoni tal-enerġija u termali, rappurtar tal-iżbalji, rappurtar tal-prestazzjoni, u funzjonijiet oħra tal-infrastruttura. Tista' taċċessa dawn il-funzjonijiet permezz ta' interfaces sysfs esposti mis-sewwieq FME.
  • Rikonfigurazzjoni parzjali. Is-sewwieq FME jirreġistra Maniġer FPGA waqt l-inizjalizzazzjoni tas-sub-karatteristika tal-PR; ladarba tirċievi FPGA_FME_PORT_PR ioctl mingħandek, tinvoka l-funzjoni tal-interface komuni minn FPGA Manager biex tlesti r-rikonfigurazzjoni parzjali tal-bitstream għall-Port mogħti.
  • Ġestjoni tal-port għall-virtwalizzazzjoni. Is-sewwieq FME jintroduċi żewġ ioctls, FPGA_FME_PORT_RELEASE, li jirrilaxxa l-Port mogħti minn PF; u FPGA_FME_PORT_ASSIGN, li jassenja l-Port lura lil PF. Ladarba l-Port jiġi rilaxxat mill-PF, jista 'jiġi assenjat lill-VF permezz tal-interfaces SR-IOV ipprovduti mis-sewwieq PCIe. Għal aktar informazzjoni, irreferi għal "FPGA Virtualization".

Funzjonijiet tas-Sewwieq tal-Apparat tal-Modulu tal-Pjattaforma FME

  • Joħloq in-nodu tat-tagħmir tal-karattru FME.
  • Joħloq is-sysfs FME files u timplimenta l-FME sysfs file aċċessorji.
  • Jimplimenta s-sub-drivers tal-karatteristika privata tal-FME.
  • Sub-sewwieqa tal-karatteristiċi privati ​​tal-FME:
    • Header FME
    • Ġestjoni Termali
    • Ġestjoni tal-Enerġija
    • Żball Globali
    • Rikonfigurazzjoni parzjali
    • Prestazzjoni Globali

Sewwieq tal-Apparat tal-Modulu tal-Pjattaforma tal-Port
Simili għas-sewwieq FME, is-sewwieq tal-Port FPGA (u l-AFU) (intel-fpga-afu. ko) jiġi sondat ladarba jinħoloq l-apparat tal-pjattaforma tal-Port. Il-funzjoni ewlenija ta 'dan il-modulu hija li tipprovdi interface għall-applikazzjonijiet tal-ispazju tal-utent biex jaċċessaw l-aċċeleraturi individwali, inkluż il-kontroll bażiku ta' reset fuq il-Port, l-esportazzjoni tar-reġjun AFU MMIO, servizz ta 'mapping tal-buffer DMA, notifika UMsg(1) u funzjonijiet ta' debug mill-bogħod ( ara hawn fuq).

UMsg huwa appoġġjat biss permezz ta' Acceleration Stack għal Intel Xeon® Processor b'FPGA Integrat.

Funzjonijiet tas-Sewwieq tal-Apparat tal-Pjattaforma tal-Port

  • Joħloq in-nodu tat-tagħmir tal-karattru tal-Port.
  • Joħloq is-sysfs tal-Port files u timplimenta s-sysfs tal-Port file aċċessorji.
  • Jimplimenta s-sub-sewwieqa tal-karatteristika privata tal-Port.
  • Sub-sewwieqa tal-karatteristiċi privati ​​tal-port:
    • Header tal-Port
    • AFU
    • Żball tal-Port
    • UMsg(2)
    • Tektek tas-Sinjal

Applikazzjoni FPGA Apparat Enumerazzjoni
Din it-taqsima tintroduċi kif l-applikazzjonijiet jelenkaw l-apparat FPGA mill-ġerarkija sysfs taħt /sys/class/fpga. Fl-example hawn taħt, żewġ apparati Intel FPGA huma installati fl-ospitanti. Kull apparat FPGA għandu FME wieħed u żewġ Portijiet (AFUs). Għal kull apparat FPGA, jinħoloq direttorju tat-tagħmir taħt /sys/class/fpga:

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

Kull nodu għandu FME wieħed u żewġ Ports (AFUs) bħala apparat tifel:
/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

B'mod ġenerali, l-interfaces FME/Port sysfs jissemmew kif ġej:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

b'I konsekuttivament innumera l-apparati tal-kontejners kollha, j innumera l-FME's konsekuttivament u k konsekuttivament innumera l-Portijiet kollha.

In-nodi tal-apparat użati għal ioctl() u mmap() jistgħu jiġu referenzjati permezz ta’:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Enumerazzjoni tas-Sewwieq PCIe
Din it-taqsima tagħti overview tal-fluss tal-kodiċi għall-enumerazzjoni tal-apparat imwettaq minn intel-fpga-pci.ko. L-istrutturi u l-funzjonijiet ewlenin tad-dejta huma enfasizzati. Din it-taqsima hija segwita aħjar meta viewil-kodiċi tas-sors li jakkumpanja (pcie.c).

Strutturi ta' Dejta ta' Enumerazzjoni

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
struct idr statiku fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *isem;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
klassi struct statika * fpga_class;
struct statiku 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,}
};
struct statiku 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;
apparat struct * fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int released_port_num;
struct list_head reġjuni;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
null __iomem *ioaddr;
null __iomem *ioend;
int current_bar;
null __iomem *pfme_hdr;
apparat struct *parent_dev;
struct platform_device * feature_dev;
};

Fluss ta' Enumerazzjoni

  • ccidrv_init()
    • Inizjalizza fpga_ids billi tuża idr_init().
    • Inizjalizza fpga_chrdevs[i].devt billi tuża alloc_chrdev_region().
    • Inizjalizza fpga_class billi tuża class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Ippermetti l-apparat PCI, itlob aċċess għar-reġjuni tiegħu, issettja l-modalità master PCI, u kkonfigura DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Alloka struct build_feature_devs_info, inizjalizzaha.
      .parent_dev huwa ssettjat għal direttorju parent sysfs (intel-fpga-dev.id) li fih id-direttorji FME u Port sysfs.
  • parse_feature_list()
    • Imxi fil-Lista tal-Karatteristiċi tal-Apparat BAR0 biex tiskopri l-FME, il-Port, u l-karatteristiċi privati ​​tagħhom.
  • parse_feature () parse_feature_afus () parse_feature_fme ()
    • Meta tiltaqa' ma' FME:
  • build_info_create_dev()
    • Alloka apparat ta' pjattaforma għall-FME, li jaħżen f'build_feature_devs_info.feature_dev.
    • feature_dev.id huwa inizjalizzat għar-riżultat ta' idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent huwa ssettjat għal build_feature_devs_info.parent_dev.
    • Alloka firxa ta' riżorsi struct f' feature_dev.resource.
  • Alloka struct feature_platform_data, inizjalizzaha, u aħżen pointer f' feature_dev.dev.platform_data
    • create_feature_instance () build_info_add_sub_feature ()
    • Inizjalizza feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add ()
    • Inizjalizza feature_platform_data.features[FME_FEATURE_ID_HEADER], kollox ħlief .fops.
  • parse_feature () parse_feature_afus () parse_feature_port ()
    • Meta tiltaqa' ma' Port:
  • build_info_create_dev()
    • Alloka apparat ta' pjattaforma għall-Port, li jaħżen f'build_feature_devs_info.feature_dev.
    • feature_dev.id huwa inizjalizzat għar-riżultat ta' idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent huwa ssettjat għal build_feature_devs_info.parent_dev.
    • Alloka firxa ta 'riżorsi struct f' feature_dev.resource.
    • Alloka struct feature_platform_data, inizjalizzaha, u aħżen pointer f' feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Żid l-istruttura feature_platform_data.node għall-Port mal-lista tal-Portijiet fl-istruttura cci_drvdata.port_dev_list
  • create_feature_instance () build_info_add_sub_feature ()
    • Inizjalizza feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add ()
    • Inizjalizza feature_platform_data.features[PORT_FEATURE_ID_HEADER], kollox ħlief .fops.
  • parse_feature () parse_feature_afus () parse_feature_port_uafu ()
    • Meta tiltaqa' ma' AFU:
  • create_feature_instance () build_info_add_sub_feature ()
    • Inizjalizza feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add ()
    • Inizjalizza feature_platform_data.features[PORT_FEATURE_ID_UAFU], kollox ħlief .fops.
  • parse_feature () parse_feature_private () parse_feature_fme_private ()
    • Meta tiltaqa' ma' karatteristika privata FME:
  • create_feature_instance () build_info_add_sub_feature ()
    • Inizjalizza feature_dev.resource[id].
  • feature_platform_data_add ()
    • Inizjalizza feature_platform_data.features[id], kollox ħlief .fops.
  • parse_feature () parse_feature_private () parse_feature_port_private ()
  • Meta tiltaqa' ma' karatteristika privata tal-Port: * create_feature_instance() build_info_add_sub_feature() * Inizjalizza feature_dev.resource[id]. * feature_platform_data_add () Inizjalizza feature_platform_data.features[id], kollox ħlief .fops.
  • parse_ports_from_fme()
    • Jekk is-sewwieq ikun mgħobbi fuq il-Funzjoni Fiżika (PF), allura:
  • Mexxi l-fluss parse_feature_list() fuq kull port deskritt fl-intestatura FME.
  • Uża l-Bar imsemmi f'kull dħul tal-Port fl-intestatura.

Inizjalizzazzjoni tal-Apparat tal-Pjattaforma FME
Din it-taqsima tagħti overview tal-fluss tal-kodiċi għall-inizjalizzazzjoni tal-apparat FME mwettqa minn intel-fpga-fme.ko. L-istrutturi u l-funzjonijiet tad-dejta ewlenin huma enfasizzati. Din it-taqsima hija segwita aħjar meta viewil-kodiċi tas-sors li jakkumpanja (fme-main.c).

Strutturi tad-Data tal-Apparat tal-Pjattaforma tal-FME

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *karatteristika);
int (*uinit)(struct platform_device *pdev, struct feature *karatteristika);
twil (*ioctl)(struct platform_device *pdev, struct feature *karatteristika,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *karatteristika);
};
karatteristika tal-istruttura {
const char *isem;
int resource_index;
null __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
dev_status twil mhux iffirmat;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
null *privat;
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
karatteristiċi tal-karatteristika[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
apparat struct * fme_dev;
struct list_head node;
struct list_head tfal;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
apparat struct * dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME Pjattaforma Apparat Inizjalizzazzjoni Fluss

Fluss ta' Inizjalizzazzjoni FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Inizjalizza struct fpga_fme u aħżinha fil-qasam feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Issejvja struct feature_ops fil- feature_platform_data.features għal kull karatteristika popolata.
    • Sejħa l-funzjoni tat-test, jekk hemm, mill-istruttura.
    • Sejħa l-funzjoni init mill-istruttura.
  • fme_probe() fpga_register_dev_ops()
    • Oħloq in-nodu tal-apparat tal-karattru FME, tirreġistra struct file_operazzjonijiet.

Inizjalizzazzjoni tal-Apparat tal-Pjattaforma tal-Port
Din it-taqsima tagħti overview tal-fluss tal-kodiċi għall-inizjalizzazzjoni tal-apparat tal-port imwettaq minn intel-fpga-afu.ko. L-istrutturi u l-funzjonijiet ewlenin tad-dejta huma enfasizzati. Din it-taqsima hija segwita aħjar meta viewil-kodiċi tas-sors li jakkumpanja (afu.c).

Strutturi tad-Dejta tal-Apparat tal-Pjattaforma tal-Port

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *karatteristika);
int (*uinit)(struct platform_device *pdev, struct feature *karatteristika);
twil (*ioctl)(struct platform_device *pdev, struct feature *karatteristika,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *karatteristika);
};
karatteristika tal-istruttura {
const char *isem;
int resource_index;
null __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
dev_status twil mhux iffirmat;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
null *privat;
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 *));
karatteristiċi tal-karatteristika tal-istruttura[0];
};
struct fpga_afu_region {
indiċi u32;
bnadar u32;
daqs u64;
u64 offset;
u64 phys;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_add;
tul u64;
u64 iova;
struct page **paġni;
struct rb_node node;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head reġjuni;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Fluss tal-Inizjalizzazzjoni tal-Apparat tal-Pjattaforma tal-Port

Fluss ta' Inizjalizzazzjoni tal-Portintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Inizjalizza struct fpga_afu u aħżinha fil-qasam feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Issejvja struct feature_ops fil- feature_platform_data.features għal kull karatteristika popolata.
    • Sejħa l-funzjoni tat-test, jekk hemm, mill-istruttura.
    • Sejħa l-funzjoni init mill-istruttura.
  • afu_probe() fpga_register_dev_ops()
    • Oħloq in-node tat-tagħmir tal-karattru tal-Port, u tirreġistra struct file_operazzjonijiet.

FME IOCTLs
IOCTLs li jissejħu fuq open file deskrittur għal /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—irritorna l-verżjoni attwali bħala numru sħiħ, li jibda minn 0.

FPGA_CHECK_EXTENSION—mhux appoġġjat bħalissa.

FPGA_FME_PORT_RELEASE—arg huwa punter għal:

struct fpga_fme_port_release {
__u32 argsz; // fi: sizeof(struct fpga_fme_port_release)
__u32 bnadar; // fi: irid ikun 0
__u32 port_id; // fi: ID tal-port (minn 0) għar-rilaxx.
};

FPGA_FME_PORT_ASSIGN—arg huwa punter għal:

struct fpga_fme_port_assign {
__u32 argsz; // fi: sizeof(struct fpga_fme_port_assign)
__u32 bnadar; // fi: irid ikun 0
__u32 port_id; // fi: port ID (minn 0) biex jassenja. (irid ikun
maħruġa qabel minn FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg huwa punter għal:

struct fpga_fme_port_pr {
__u32 argsz; // fi: sizeof(struct fpga_fme_port_pr)
__u32 bnadar; // fi: irid ikun 0
__u32 port_id; // fi: ID tal-port (minn 0)
__u32 buffer_size; // fi: daqs tal-buffer bitstream f'bytes. Għandu jkun ta' 4 byte
allinjati.
__u64 buffer_address; // fi: indirizz tal-proċess tal-buffer tal-bitstream
__u64 status; // barra: stat ta' żball (bitmask)
};

Port IOCTLs
IOCTLs li jissejħu fuq open file deskrittur għal /dev/intel-fpga-port.k FPGA_GET_API_VERSION—irritorna l-verżjoni attwali bħala numru sħiħ, li jibda minn 0. FPGA_CHECK_EXTENSION—mhux appoġġjat bħalissa.

FPGA_PORT_GET_INFO—arg huwa punter għal:

struct fpga_port_info {
__u32 argsz; // fi: sizeof(struct fpga_port_info)
__u32 bnadar; // barra: jirritorna 0
__u32 num_regions; // barra: numru ta' reġjuni MMIO, 2 (1 għal AFU u 1 għal
STP)
__u32 num_umsgs; // barra: numru ta' UMsg's appoġġjati mill-ħardwer
};

FPGA_PORT_GET_REGION_INFO—arg huwa punter għal:

struct fpga_port_region_info {
__u32 argsz; // fi: sizeof(struct fpga_port_region_info)
__u32 bnadar; // barra: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 indiċi; // fi: FPGA_PORT_INDEX_UAFU jew FPGA_PORT_INDEX_STP
__u32 padding; // fi: irid ikun 0
__u64 daqs; // barra: daqs tar-reġjun MMIO f'bytes
__u64 offset; // barra: offset tar-reġjun MMIO mill-bidu tal-apparat fd
};

FPGA_PORT_DMA_MAP—arg huwa punter għal:
struct fpga_port_dma_map {
__u32 argsz; // fi: sizeof(struct fpga_port_dma_map)
__u32 bnadar; // fi: għandu jkun 0 __u64 user_addr; // fi: proċess virtwali
indirizz. Għandu jkun allinjat mal-paġna.
__u64 tul; // fi: tul tal-mapping f'bytes. Għandu jkun multiplu tal-paġna
daqs.
__u64 iova; // barra: IO virtwali indirizz };

FPGA_PORT_DMA_UNMAP—arg huwa punter għal:
struct fpga_port_dma_unmap {
__u32 argsz; // fi: sizeof(struct fpga_port_dma_unmap)
__u32 bnadar; // fi: irid ikun 0
__u64 iova; // fi: indirizz virtwali IO ritornat minn preċedenti
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg irid ikun NULL.
  • FPGA_PORT_UMSG_ENABLE—arg għandu jkun NULL.
  • FPGA_PORT_UMSG_DISABLE—args iridu jkunu NULL.

FPGA_PORT_UMSG_SET_MODE—arg huwa punter għal:

struct fpga_port_umsg_cfg {
__u32 argsz; // fi: sizeof(struct fpga_port_umsg_cfg)
__u32 bnadar; // fi: irid ikun 0
__u32 hint_bitmap; // fi: bitmap tal-modalità ħjiel UMsg. Jindika liema huma l-UMsg's
ppermettiet.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg għandu jiġi diżattivat qabel ma jinħareġ dan ioctl.
  • Il-field iova għandu jkun għal buffer kbir biżżejjed għall-UMsg kollha (num_umsgs * PAGE_SIZE).
    • Il-buffer huwa mmarkat bħala “fil-użu” mill-ġestjoni tal-buffer tas-sewwieq.
    • Jekk iova hija NULL, kwalunkwe reġjun preċedenti mhux immarkat bħala "fl-użu".
  • arg huwa pointer għal:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // fi: sizeof(struct fpga_port_umsg_base_addr)
    • bnadar u32; // fi: irid ikun 0
    • u64 iova; // fi: IO indirizz virtwali minn FPGA_PORT_DMA_MAP. };

Nota:

  • Biex tnaddaf l-iżbalji tal-port, trid tikteb il-bitmask eżatt tal-iżbalji attwali, pereżempjuample, qtates żbalji > ċari
  • UMsg huwa appoġġjat biss permezz ta' Acceleration Stack għal Intel Xeon Processor b'FPGA Integrat.

sysfs Files

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

sysfs file qasam mmio tip aċċess
ports_num fme_header.capability.num_ports deċimali int Qari biss
cache_size fme_header.capability.cache_size deċimali int Qari biss
verżjoni fme_header.capability.fabric_verid deċimali int Qari biss
socket_id fme_header.capability.socket_id deċimali int Qari biss
bitstream_id fme_header.bitstream_id hex uint64_t Qari biss
bitstream_metadata fme_header.bitstream_md hex uint64_t Qari biss

Sysfs ta' Ġestjoni Termali FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file qasam mmio tip aċċess
limitu1 thermal.threshold.tmp_thshold1 deċimali int Utent: Qari biss Għerq: Aqra-kitba
limitu2 thermal.threshold.tmp_thshold2 deċimali int Utent: Qari biss Għerq: Aqra-kitba
threshold_trip thermal.threshold.therm_trip_thshold deċimali int Qari biss
threshold1_reached thermal.threshold.thshold1_status deċimali int Qari biss
threshold2_reached thermal.threshold.thshold2_status deċimali int Qari biss
threshold1_policy termali. threshold.thshold_policy deċimali int Utent: Qari biss Għerq: Aqra-kitba
temperatura thermal.rdsensor_fm1.fpga_temp deċimali int Qari biss

Sysfs tal-Ġestjoni tal-Enerġija FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file qasam mmio tip aċċess
ikkunsmat power.status.pwr_consumed hex uint64_t Qari biss
limitu1 limitu.qawwa.għatba1 hex uint64_t Utent: Qari biss Għerq: Aqra-kitba
limitu2 limitu.qawwa.għatba2 hex uint64_t Utent: Qari biss Għerq: Aqra-kitba
threshold1_status power.threshold.threshold1_status deċimali mhux iffirmat Qari biss
threshold2_status power.threshold.threshold2_status deċimali mhux iffirmat Qari biss
rtl power.status.fpga_latency_report deċimali mhux iffirmat Qari biss

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

sysfs file qasam mmio tip aċċess
pcie0_errors gerror.pcie0_err hex uint64_t Aqra-kitba
pcie1_errors gerror.pcie1_err hex uint64_t Aqra-kitba
inject_error gerror.ras_error_inj hex uint64_t Aqra-kitba

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

sysfs file qasam mmio tip aċċess
żbalji gerror.fme_err hex uint64_t Qari biss
l-ewwel_żball gerror.fme_first_err.err_reg_status hex uint64_t Qari biss
next_error gerror.fme_next_err.err_reg_status hex uint64_t Qari biss
ċara Tneħħi l-iżbalji, first_error, next_error diversi uint64_t Kitba biss

Nota:
Biex tneħħi l-iżbalji tal-FME, trid tikteb il-bitmask eżatt tal-iżbalji attwali, pereżempjuample cat żbalji > ċari.

Sysfs ta' Rikonfigurazzjoni Parzjali FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file qasam mmio tip aċċess
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte Qari biss

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

sysfs file qasam mmio tip aċċess
arloġġ gperf.clk.afu_interf_clock hex uint64_t Qari biss

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Mhux validu għal Acceleration Stack għal Intel Xeon CPU b'FPGAs)

sysfs file qasam mmio tip aċċess
friża gperf.ch_ctl.freeze deċimali int Aqra-kitba
read_hit gperf.CACHE_RD_HIT hex uint64_t Qari biss
read_miss gperf.CACHE_RD_MISS hex uint64_t Qari biss
write_hit gperf.CACHE_WR_HIT hex uint64_t Qari biss
write_miss gperf.CACHE_WR_MISS hex uint64_t Qari biss
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Qari biss
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Qari biss
sysfs file qasam mmio tip aċċess
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Qari biss
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Qari biss
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Qari biss

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Mhux validu għal Acceleration Stack għal Intel Xeon CPU b'FPGAs)

sysfs file qasam mmio tip aċċess
friża gperf.vtd_ctl.freeze deċimali int Utent: Qari biss Għerq: Aqra-kitba

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Mhux validu għal Acceleration Stack għal Intel Xeon CPU b'FPGAs)

sysfs file qasam mmio tip aċċess
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Qari biss
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Qari biss
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Qari biss
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Qari biss

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

sysfs file qasam mmio tip aċċess
jippermettu gperf.fab_ctl.(attivat) deċimali int Utent: Qari biss Għerq: Aqra-kitba
friża gperf.fab_ctl.freeze deċimali int Utent: Qari biss Għerq: Aqra-kitba
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Qari biss
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Qari biss
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Qari biss
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Qari biss
upi_read gperf.FAB_UPI_RD hex uint64_t Qari biss
upi_write gperf.FAB_UPI_WR hex uint64_t Qari biss

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

sysfs file qasam mmio tip aċċess
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Qari biss
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Qari biss
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Qari biss
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Qari biss
upi_read gperf.FAB_UPI_RD hex uint64_t Qari biss
upi_write gperf.FAB_UPI_WR hex uint64_t Qari biss

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

sysfs file qasam mmio tip aċċess
id port_header.capability.port_number deċimali int Qari biss
ltr port_header.control.latency_tolerance deċimali int Qari biss

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

sysfs file qasam mmio tip aċċess
afu_id afu_header.guid hex 16-byte Qari biss

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

sysfs file qasam mmio tip aċċess
żbalji perror.port_error hex uint64_t Qari biss
l-ewwel_żball perror.port_first_error hex uint64_t Qari biss
first_malformed_req perror.malreq hex 16-byte Qari biss
ċara perror.(żbalji kollha) diversi uint64_t Kitba biss

Nota:
Biex tnaddaf l-iżbalji tal-Port, trid tikteb il-bitmask eżatt tal-iżbalji attwali, pereżempjuample cat żbalji > ċari.

Storja tar-Reviżjoni

Verżjoni tad-Dokument Bidliet
2017.10.02 Rilaxx Inizjali.

OPAE Intel FPGA Linux Device Driver Architettura Gwida

Dokumenti / Riżorsi

Intel OPAE FPGA Linux Device Driver Architecture [pdfGwida għall-Utent
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Referenzi

Ħalli kumment

L-indirizz elettroniku tiegħek mhux se jiġi ppubblikat. L-oqsma meħtieġa huma mmarkati *