Intel OPAE FPGA Linux Device Driver Architecture
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
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
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:
- Ħatt is-sewwieq mill-mistieden
- Aqla 'l-VF mill-mistieden
- Iddiżattiva SR-IOV
- Wettaq rikonfigurazzjoni parzjali
- Ippermetti SR-IOV
- Ipplaggja l-VF lill-mistieden
- 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:
- 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.
- 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
- Għaddi mill-VFs għal VMs.
- 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
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.
- Alloka struct build_feature_devs_info, inizjalizzaha.
- 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 FME
- 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-Port
- 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 |