Intel OPAE FPGA Linux Device Driver Architecture
I-OPAE Intel FPGA Linux Device Driver Architecture
Umshayeli we-OPAE Intel FPGA uhlinzeka ngezindawo zokusebenzelana zezinhlelo zokusebenza zesikhala somsebenzisi ukuze zilungiselele, zibale, zivuleke, futhi zifinyelele izisheshisi ze-FPGA ezisekelweni ezifakwe izixazululo ze-Intel FPGA futhi zenza imisebenzi yokuphatha yezinga lesistimu efana nokumiswa kabusha kwe-FPGA, ukuphathwa kwamandla, nokwenza izinto ezibonakalayo.
Hardware Architecture
Kusuka endaweni ye-OS ye view, ihadiwe ye-FPGA ibonakala njengedivayisi evamile ye-PCIe. Imemori yedivayisi ye-FPGA ihlelwa kusetshenziswa ukwakheka kwedatha echazwe ngaphambilini (Uhlu Lwezici Zedivayisi). Izici ezisekelwa idivayisi ye-FPGA zivezwa ngalezi zakhiwo zedatha, njengoba kuboniswe ngezansi emfanekisweni olandelayo:
Idivayisi ye-FPGA PCIe
Umshayeli usekela i-PCIe SR-IOV ukuze kwakhe i-Virtual Functions (VFs) engasetshenziswa ukwabela ama-accelerator ngamanye emishinini ebonakalayo.
Inkampani ye-Intel Wonke Amalungelo Agodliwe. I-Intel, ilogo ye-Intel, nezinye izimpawu ze-Intel yizimpawu zokuthengisa ze-Intel Corporation noma izinkampani ezingaphansi kwayo. I-Intel iqinisekisa ukusebenza kwe-FPGA yayo kanye nemikhiqizo ye-semiconductor ezicacisweni zamanje ngokuhambisana newaranti evamile ye-Intel kodwa igodla ilungelo lokwenza izinguquko kunoma imiphi imikhiqizo namasevisi nganoma yisiphi isikhathi ngaphandle kwesaziso. I-Intel ayithathi mthwalo noma isikweletu esivele ngenxa yesicelo noma ukusetshenziswa kwanoma yiluphi ulwazi, umkhiqizo, noma isevisi echazwe lapha ngaphandle kwalapho okuvunyelwene ngakho ngokubhaliwe yi-Intel. Amakhasimende e-Intel ayelulekwa ukuthi athole inguqulo yakamuva yokucaciswa kwedivayisi ngaphambi kokuthembela kunoma yiluphi ulwazi olushicilelwe nangaphambi kokufaka ama-oda emikhiqizo noma amasevisi.
Amanye amagama namabhrendi angafunwa njengempahla yabanye.
I-Virtualized FPGA PCIe Device
I-FPGA Management Engine (FME)
I-FPGA Management Engine yenza amandla nokuphatha okushisayo, ukubika amaphutha, ukulungisa kabusha, ukubika ukusebenza, neminye imisebenzi yengqalasizinda. I-FPGA ngayinye ine-FME eyodwa, etholakala njalo nge-Physical Function (PF). Izinhlelo zokusebenza zesikhala somsebenzisi zingathola ukufinyelela okukhethekile ku-FME zisebenzisa i-open(), futhi ziyikhulule zisebenzisa i-close() njengomsebenzisi onelungelo (impande).
Itheku
Imbobo imele ukuxhumana phakathi kwendwangu ye-FPGA emile (“I-FPGA Interface Manager (FIM)”) kanye nesifunda esingalungiseka kancane esiqukethe Umsebenzi We-Accelerator (AF). Imbobo ilawula ukuxhumana kusukela kusofthiwe kuya kusisheshisi futhi iveze izici ezifana nokusetha kabusha nokususa iphutha. Idivayisi ye-PCIe ingaba nezimbobo ezimbalwa, futhi Imbobo ngayinye ingavezwa nge-VF ngokuyinika kusetshenziswa i-FPGA_FME_PORT_ASSIGN ioctl kudivayisi ye-FME.
Iyunithi Yomsebenzi We-Accelerator (AF).
- Iyunithi Yomsebenzi We-Accelerator (AF) inamathiselwe Embobeni futhi iveza isifunda esingu-256K MMIO esizosetshenziselwa amarejista okulawula aqondene ne-accelerator.
- Izinhlelo zokusebenza zesikhala somsebenzisi zingathola ukufinyelela okukhethekile ku-AFU enamathiselwe Embobeni ngokusebenzisa i-open() kudivayisi Yembobo, futhi ziyikhulule zisebenzisa i-close().
- Izinhlelo zokusebenza zesikhala somsebenzisi zingakwazi futhi izifunda ze-MMIO zokusheshisa i-mmap().
Ukumisa Kabusha Ingxenye
Njengoba kushiwo ngenhla, ama-accelerator angahlelwa kabusha ngokuhlelwa kabusha kwengxenye ye-Accelerator Function (AF) file. Umsebenzi we-Accelerator (AF) kufanele ngabe ukhiqizelwe i-FIM ngqo kanye nesifunda esigxilile esihlosiwe (Port) se-FPGA; uma kungenjalo, ukusebenza kokuhlela kabusha kuzohluleka futhi ngokunokwenzeka kubangele ukungazinzi kwesistimu. Lokhu kuhambisana kungahlolwa ngokuqhathanisa i-ID yesixhumi esibonakalayo esiphawulwe kunhlokweni ye-AF ngokumelene ne-ID yesixhumi esibonakalayo esivezwe yi-FME ngama-sysfs. Lokhu kuhlola kuvamise ukwenziwa yisikhala somsebenzisi ngaphambi kokubiza i-IOCTL yokumisa kabusha.
Qaphela:
Okwamanje, noma yiluphi uhlelo lwesofthiwe olufinyelela ku-FPGA, okuhlanganisa nalezo ezisebenza kumsingathi obonakele, kufanele luvalwe ngaphambi kokuzama ukulungisa kabusha ingxenye. Izinyathelo zizoba:
- Yehlisa umshayeli kusivakashi
- Khipha i-VF kusivakashi
- Khubaza i-SR-IOV
- Yenza ukulungisa kabusha ingxenye
- Nika amandla i-SR-IOV
- Xhuma i-VF kusivakashi
- Layisha umshayeli kusivakashi
I-FPGA Virtualization
Ukuze unike amandla ukufinyelela isisheshisi ezinhlelweni ezisebenza ku-VM, imbobo ye-AFU efanele idinga ukunikezwa i-VF kusetshenziswa lezi zinyathelo ezilandelayo:
- I-PF iphethe zonke izimbobo ze-AFU ngokuzenzakalelayo. Noma iyiphi imbobo edinga ukunikezwa kabusha i-VF kufanele iqale ikhishwe ku-PF nge-FPGA_FME_PORT_RELEASE ioctl kudivayisi ye-FME.
- Uma izimbobo ezingu-N sezikhishiwe ku-PF, umyalo ongezansi ungasetshenziswa ukunika amandla ama-SRIOV nama-VF. I-VF ngayinye inechweba elilodwa kuphela eline-AFU. echo N > PCI_DEVICE_PATH/sriov_nuMVfs
- Dlula ama-VF uye kuma-VM.
- I-AFU ngaphansi kwe-VF ifinyeleleka ezinhlelweni eziku-VM (kusetshenziswa umshayeli ofanayo ngaphakathi kwe-VF).
Qaphela:
I-FME ayikwazi ukunikezwa i-VF, ngakho-ke i-PR kanye neminye imisebenzi yokuphatha itholakala kuphela nge-PF.
Inhlangano Yabashayeli
PCIe Module Device Driver
Inhlangano Yabashayeli
Amadivayisi e-FPGA avela njengamadivayisi ajwayelekile e-PCIe; ngakho, umshayeli wedivayisi ye-FPGA PCIe (intel-FPGA-PCI.ko) uhlala elayishwa kuqala uma i-FPGA PCIe PF noma i-VF isitholakele. Lo mshayeli udlala indima yengqalasizinda ekwakhiweni komshayeli. Yona:
- Idala idivayisi yesiqukathi se-FPGA njengomzali wesici samadivayisi.
- Ihamba Kuhlu Lwesici Sedivayisi, olusetshenziswa kumemori ye-PCIe ye-BAR yedivayisi, ukuze kutholwe izici zedivayisi nezici zazo ezingaphansi futhi kudalwe amadivayisi wenkundla yawo ngaphansi kwedivayisi yesiqukathi.
- Isekela i-SR-IOV.
- Sethula ingqalasizinda yedivayisi yesici, esifingqa ukusebenza kwezici ezingaphansi futhi siveze imisebenzi evamile ukuze kufakwe izishayeli zedivayisi.
PCIe Module Device Driver Functions
- Iqukethe ukutholwa kwe-PCIe, ukubalwa kwedivayisi, nokutholwa kwesici.
- Idala izinkomba ze-sysfs zedivayisi engumzali, i-FPGA Management Engine (FME), kanye Nembobo.
- Idala izimo zomshayeli weplatifomu, ibangele i-Linux kernel ukuthi ilayishe abashayeli bemojula yesikhulumi abafanele.
I-FME Platform Module Device Driver
- Ukuphathwa kwamandla nokushisa, ukubika amaphutha, ukubika ukusebenza, neminye imisebenzi yengqalasizinda. Ungakwazi ukufinyelela le misebenzi ngokusebenzisa izixhumanisi ze-sysfs ezivezwe umshayeli we-FME.
- Ukumisa Kabusha Ingxenye. Umshayeli we-FME ubhalisa Umphathi we-FPGA ngesikhathi sokuqaliswa kwesici esincane se-PR; uma ithola i-FPGA_FME_PORT_PR ioctl evela kuwe, icela umsebenzi wokusebenzelana ovamile kuMphathi we-FPGA ukuze kuqedelwe ukumiswa kabusha kwengxenye ye-bitstream Embotsheni enikiwe.
- Ukuphathwa kwechweba lokwenza izinto ezibonakalayo. Umshayeli we-FME wethula ama-ioctl amabili, i-FPGA_FME_PORT_RELEASE, ekhulula Imbobo enikeziwe ku-PF; kanye ne-FPGA_FME_PORT_ASSIGN, enikeza Imbobo emuva ku-PF. Uma Ichweba selikhishiwe ku-PF, linganikezwa i-VF ngokusebenzisa izixhumanisi ze-SR-IOV ezihlinzekwa umshayeli we-PCIe. Ukuze uthole ulwazi olwengeziwe, bheka ku-“FPGA Virtualization”.
I-FME Platform Module Device Driver Functions
- Idala inodi yedivayisi yezinhlamvu ze-FME.
- Idala ama-sysfs e-FME files futhi isebenzise ama-sysfs e-FME file izisekeli.
- Isebenzisa izici eziyimfihlo ze-FME abashayeli abangaphansi.
- Abashayeli abancane besici se-FME:
- Isihloko se-FME
- Ukuphathwa Kwezishisayo
- Ukuphathwa kwamandla
- Iphutha Lomhlaba Wonke
- Ukumisa Kabusha Ingxenye
- Ukusebenza Kwembulunga yonke
I-Port Platform Module Device Driver
Ngokufanayo nomshayeli we-FME, umshayeli we-FPGA Port (kanye ne-AFU) (intel-fpga-afu. ko) iyaphenywa uma idivayisi yesikhulumi se-Port senziwe. Umsebenzi oyinhloko wale mojula ukunikeza isixhumi esibonakalayo sezinhlelo zokusebenza zesikhala somsebenzisi ukufinyelela izisheshisi ngazinye, okuhlanganisa ukulawula okuyisisekelo kokusetha kabusha ku-Port, ukuthekelisa kwesifunda se-AFU MMIO, isevisi yebhafa ye-DMA, isaziso se-UMsg(1), kanye nemisebenzi yokususa iphutha ( bheka ngenhla).
I-UMsg isekelwa kuphela nge-Acceleration Stack ye-Intel Xeon® Processor ene-FPGA edidiyelwe.
I-Port Platform Module yedivayisi ye-Driver Functions
- Idala inodi yedivayisi yezinhlamvu Zembobo.
- Idala i-Port sysfs files futhi isebenzise ama-Port sysfs file izisekeli.
- Isebenzisa izici eziyimfihlo ze-Port sub-drivers.
- Abashayeli abancane besici sechweba:
- Iheda Yechweba
- AFU
- Iphutha Lembobo
- UMsg(2)
- I-Signal Tap
Isicelo FPGA Kudivayisi Ukubala
Lesi sigaba sethula ukuthi izinhlelo zokusebenza zilubala kanjani idivayisi ye-FPGA kusukela kuhlelo lwe-sysfs ngaphansi kwe-/sys/class/fpga. Ku-exampngaphansi, amadivayisi amabili e-Intel FPGA afakiwe kumsingathi. Idivayisi ngayinye ye-FPGA ine-FME eyodwa kanye namachweba amabili (AFUs). Kudivayisi ngayinye ye-FPGA, uhla lwemibhalo lwedivayisi lwenziwa ngaphansi kwe-/sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Indawo ngayinye ine-FME eyodwa kanye namachweba amabili (ama-AFU) njengamadivayisi ezingane:
/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
Ngokuvamile, izixhumanisi ze-FME/Port sysfs ziqanjwe kanje:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
ngifaka izinombolo ngokulandelana kwazo zonke izisetshenziswa zamabhokisi, j ngibala izinombolo ngokulandelana kwama-FME kanye no-k ngokufaka izinombolo kuwo wonke amachweba.
Amanodi wedivayisi asetshenziselwa ioctl() kanye ne-mmap() angabhekiselwa ku-:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
Ukubalwa komshayeli we-PCIe
Lesi sigaba sinikeza i-overview yokugeleza kwekhodi yokubala kwedivayisi okwenziwa yi-intel-fpga-pci.ko. Izakhiwo zedatha eyinhloko nemisebenzi igqanyisiwe. Lesi sigaba silandelwa kangcono uma viewukufaka ikhodi yomthombo ehambisanayo (pcie.c).
Izakhiwo Zedatha Yokubala
enum fpga_id_type {
PARENT_ID,
I-FME_ID,
PORT_ID,
FPGA_ID_MAX
};
i-static struct idr fpga_ids[FPGA_ID_MAX];
hlela i-fpga_chardev_info {
const char *igama;
dev_t devt;
};
yakha i-fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
isigaba se-static *fpga_class;
i-static struct 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,}
};
i-static struct pci_driver cci_pci_driver = {
.igama = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.susa = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int device_id;
idivayisi yesakhiwo *fme_dev;
hlela i-mutex lock;
struct list_head port_dev_list;
inombolo_yembobo_ekhishiwe;
struct list_head izifunda;
};
struct build_feature_devs_info {
hlela pci_dev *pdev;
ngenalutho __iomem *ioaddr;
ngenalutho __iomem *ioend;
int current_bar;
ngenalutho __iomem *pfme_hdr;
idivayisi yesakhiwo *parent_dev;
struct platform_device *feature_dev;
};
Ukugeleza Kokubala
- ccidrv_init()
- Qalisa i-fpga_ids usebenzisa idr_init().
- Qalisa i-fpga_chrdevs[i].devt usebenzisa i-alloc_chrdev_region().
- Qalisa i-fpga_class usebenzisa i-class_create().
- pci_register_driver(&cci_pci_driver);
- cci_pci_probe()
- Nika amandla idivayisi ye-PCI, cela ukufinyelela ezifundeni zayo, setha imodi eyinhloko ye-PCI, futhi ulungiselele i-DMA.
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Nikeza i-struct build_feature_devs_info, yiqalise.
I-.parent_dev isethelwe kumkhombandlela womzali we-sysfs (intel-fpga-dev.id) oqukethe uhla lwemibhalo lwe-FME ne-Port sysfs.
- Nikeza i-struct build_feature_devs_info, yiqalise.
- hlaziya_uhlu_lwesici()
- Hamba Uhlu Lwesici Lwedivayisi ye-BAR0 ukuze uthole i-FME, Imbobo, nezici zakhona eziyimfihlo.
- parse_feature() parse_feature_afus() parse_feature_fme()
- Uma kuhlangatshezwana ne-FME:
- build_info_create_dev()
- Nikeza idivayisi yesikhulumi se-FME, ugcine kokuthi build_feature_devs_info.feature_dev.
- isici_dev.id siqaliswa kumphumela we-idr_alloc(fpga_ids[FME_ID],
- feature_dev.parent isethelwe ku-build_feature_devs_info.parent_dev.
- Nikeza uhlu lwezinsiza zesakhiwo kokuthi feature_dev.resource.
- Yabelana ngesakhiwo sedatha_yepulatifomu_, yiqalise, futhi ugcine isikhombi kudatha yesici_dev.dev.platform_
- create_feature_instance() build_info_add_sub_feature()
- Qalisa isici_dev.resource[FME_FEATURE_ID_HEADER].
- isici_senkundla_yedatha_engeza()
- Qalisa isici_platform_data.features[FME_FEATURE_ID_HEADER], yonke into ngaphandle kwe-.fops.
- i-parse_feature() i-parse_feature_afus() i-parse_feature_port()
- Lapho kutholwa Imbobo:
- build_info_create_dev()
- Nikeza idivayisi yenkundla Yembobo, igcine kokuthi build_feature_devs_info.feature_dev.
- isici_dev.id siqaliswe kumphumela we-idr_alloc(fpga_ids[PORT_ID],
- feature_dev.parent isethelwe ku-build_feature_devs_info.parent_dev.
- Nikeza uhlu lwensiza yesakhiwo kusici_dev.resource.
- Yabelana ngesakhiwo sedatha_yepulatifomu_, yiqalise, futhi ugcine isikhombi kudatha yesici_dev.dev.platform_
- build_info_commit_dev()
- Engeza i-struct feature_platform_data.node Yembobo ohlwini lwamachweba ngesakhiwo cci_drvdata.port_dev_list
- create_feature_instance() build_info_add_sub_feature()
- Qalisa isici_dev.resource[PORT_FEATURE_ID_HEADER].
- isici_senkundla_yedatha_engeza()
- Qalisa isici_platform_data.features[PORT_FEATURE_ID_HEADER], yonke into ngaphandle kwe-.fops.
- i-parse_feature() i-parse_feature_afus() i-parse_feature_port_uafu()
- Uma kuhlangatshezwana ne-AFU:
- create_feature_instance() build_info_add_sub_feature()
- Qalisa isici_dev.resource[PORT_FEATURE_ID_UAFU].
- isici_senkundla_yedatha_engeza()
- Qalisa isici_platform_data.features[PORT_FEATURE_ID_UAFU], yonke into ngaphandle kwe-.fops.
- i-parse_feature() i-parse_feature_private() i-parse_feature_fme_private()
- Uma kuhlangatshezwana nesici esiyimfihlo se-FME:
- create_feature_instance() build_info_add_sub_feature()
- Qalisa isici_dev.resource[id].
- isici_senkundla_yedatha_engeza()
- Qalisa isici_platform_data.features[id], yonke into ngaphandle kwe-.fops.
- cazulula_isici() cazulula_feature_private() cazulula_feature_port_private()
- Uma kuhlangatshezwana nesici esiyimfihlo se-Port: * create_feature_instance() build_info_add_sub_feature() * Qalisa isici_dev.resource[id]. * feature_platform_data_add() Qalisa isici_platform_data.features[id], yonke into ngaphandle kwe-.fops.
- hlaziya_izimbobo_kusuka_fme()
- Uma umshayeli elayishwe ku-Physical Function (PF), khona-ke:
- Qalisa ukugeleza kwe-parse_feature_list() embobeni ngayinye echazwe kunhlokweni ye-FME.
- Sebenzisa IBHA eshiwo ekufakweni Kwembobo ngakunye kunhlokweni.
Ukuqaliswa kwedivayisi ye-FME Platform
Lesi sigaba sinikeza i-overview yokugeleza kwekhodi yokuqaliswa kwedivayisi ye-FME okwenziwa yi-intel-fpga-fme.ko. Izakhiwo zedatha eyinhloko nemisebenzi igqanyisiwe. Lesi sigaba silandelwa kangcono uma viewngekhodi yomthombo ehambisanayo (fme-main.c).
I-FME Platform Device Data Structures
hlela isici_ama-ops {
int (*init)(struct platform_device *pdev, struct feature *isici);
int (*unit)(struct platform_device *pdev, struct feature *isici);
eside (*ioctl)(struct platform_device *pdev, struct feature *isici,
I-int cmd engabhalisiwe, i-arg ende engabhalisiwe);
int (*test)(struct platform_device *pdev, struct feature *isici);
};
isici sesakhiwo {
const char *igama;
inkomba_yensiza;
ngenalutho __iomem *ioaddr;
hlela isici_ama-ops;
};
hlela idatha_yepulatifomu_yesakhiwo {
struct list_head node;
hlela i-mutex lock;
isimo se-dev_eside esingabhalisiwe;
hlela i-cdev cdev;
struct platform_device *dev;
ungasayiniwe, disable_count;
okungenalutho *okuyimfihlo;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device*,
void *, int (*meshi)(struct platform_device *, void *)); isakhiwo
izici zesici[0];
};
struct perf_object {
i-id id;
const struct attribute_group **attr_groups;
idivayisi yesakhiwo *fme_dev;
struct list_head node;
struct list_head izingane;
struct kobject kobj;
};
yakha i-fpga_fme {
u8 port_id;
u64 pr_err;
idivayisi yesakhiwo *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *idatha;
};
Ukugeleza Kokuqala Kwedivayisi Yenkundla Ye-FME
Ukugeleza Kokuqala kwe-FME
- fme_probe() fme_dev_init()
- Qalisa i-struct fpga_fme futhi uyigcine kunkambu yangasese ye-feature_platform_data.private.
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Londoloza i-struct feature_ops kusici_platform_data.features isici ngasinye esinabantu.
- Shayela umsebenzi wokuhlola, uma ukhona, kusukela kusakhiwo.
- Shayela umsebenzi we-init kusuka kusakhiwo.
- fme_probe() fpga_register_dev_ops()
- Dala inodi yedivayisi yezinhlamvu ze-FME, ubhalise isakhiwo file_imisebenzi.
Ukuqaliswa Kwedivayisi Yenkundla Yembobo
Lesi sigaba sinikeza i-overview yokugeleza kwekhodi yokuqaliswa kwedivayisi yembobo okwenziwa yi-intel-fpga-afu.ko. Izakhiwo zedatha eyinhloko nemisebenzi igqanyisiwe. Lesi sigaba silandelwa kangcono uma viewngekhodi yomthombo ehambisanayo (afu.c).
Izakhiwo Zedatha Yedivayisi Yenkundla Yenkundla
hlela isici_ama-ops {
int (*init)(struct platform_device *pdev, struct feature *isici);
int (*unit)(struct platform_device *pdev, struct feature *isici);
eside (*ioctl)(struct platform_device *pdev, struct feature *isici,
I-int cmd engabhalisiwe, i-arg ende engabhalisiwe);
int (*test)(struct platform_device *pdev, struct feature *isici);
};
isici sesakhiwo {
const char *igama;
inkomba_yensiza;
ngenalutho __iomem *ioaddr;
hlela isici_ama-ops;
};
hlela idatha_yepulatifomu_yesakhiwo {
struct list_head node;
hlela i-mutex lock;
isimo se-dev_eside esingabhalisiwe;
hlela i-cdev cdev;
struct platform_device *dev;
ungasayiniwe, disable_count;
okungenalutho *okuyimfihlo;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device*,
void *, int (*meshi)(struct platform_device *, void *));
izici zesici sesakhiwo[0];
};
yakha i-fpga_afu_region {
u32 index;
amafulegi u32;
u64 usayizi;
u64 offset;
u64 phys;
struct list_head node;
};
yakha i-fpga_afu_dma_region {
u64 umsebenzisi_addr;
u64 ubude;
u64 iova;
ikhasi lesakhiwo **amakhasi;
hlela i-node ye-rb_node;
i-bool in_use;
};
yakha i-fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 inombolo_umsgs;
struct list_head izifunda;
hlela izifunda ze-rb_root dma_regions;
struct feature_platform_data *idatha;
};
Ukugeleza Kokuqala Kwedivayisi Yenkundla Yenkundla
Ukugeleza Kokuqalisa Kwembobo
- afu_probe() afu_dev_init()
- Qalisa i-struct fpga_afu futhi uyigcine ku- feature_platform_data.inkambu yangasese.
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Londoloza i-struct feature_ops kusici_platform_data.features isici ngasinye esinabantu.
- Shayela umsebenzi wokuhlola, uma ukhona, kusukela kusakhiwo.
- Shayela umsebenzi we-init kusuka kusakhiwo.
- afu_probe() fpga_register_dev_ops()
- Dala inodi yedivayisi yezinhlamvu Zembobo, ubhalise isakhiwo file_imisebenzi.
Ama-IOCTL e-FME
Ama-IOCTL abizwa ngokuvula file descriptor for /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—buyisela inguqulo yamanje njengenombolo, kusukela ku-0.
FPGA_CHECK_EXTENSION—ayisekelwe okwamanje.
I-FPGA_FME_PORT_RELEASE—i-arg iyisikhombi ku-:
hlela i-fpga_fme_port_release {
__u32 argsz; // ku: sizeof(yakha i-fpga_fme_port_release)
__u32 amafulegi; // ku: kufanele kube ngu-0
__u32 i-port_id; // ku: I-ID yembobo (kusuka ku-0) ukuze ikhishwe.
};
I-FPGA_FME_PORT_ASSIGN—i-arg iyisikhombi ku-:
yakha i-fpga_fme_port_assign {
__u32 argsz; // ku: sizeof(struct fpga_fme_port_assign)
__u32 amafulegi; // ku: kufanele kube ngu-0
__u32 i-port_id; // ku: I-ID yembobo (kusuka ku-0) ukuze unikeze. (kumele kube njalo
ikhishwe ngaphambilini yi-FPGA_FME_PORT_RELEASE)
};
I-FPGA_FME_PORT_PR—i-arg iyisikhombi ku-:
yakha i-fpga_fme_port_pr {
__u32 argsz; // ku: sizeof(struct fpga_fme_port_pr)
__u32 amafulegi; // ku: kufanele kube ngu-0
__u32 i-port_id; // ku: i-ID yembobo (kusuka ku-0)
__u32 buffer_size; // ku: usayizi webhafa ye-bitstream ngamabhayithi. Kufanele kube yi-4-byte
kuqondaniswe.
__u64 ibhafa_ikheli; // ku: ikheli lenqubo ye-bitstream buffer
__u64 isimo; // out: isimo sephutha (bitmask)
};
Amachweba we-IOCTL
Ama-IOCTL abizwa ngokuvula file descriptor for /dev/intel-fpga-port.k FPGA_GET_API_VERSION—buyisela inguqulo yamanje njengenombolo, kusukela ku-0. FPGA_CHECK_EXTENSION—ayisekelwe okwamanje.
I-FPGA_PORT_GET_INFO—i-arg iyisikhombi ku-:
yakha i-fpga_port_info {
__u32 argsz; // ku: sizeof(struct fpga_port_info)
__u32 amafulegi; // ukuphuma: buyisela 0
__u32 inombolo_yezifunda; // ukuphuma: inombolo yezifunda zeMMIO, 2 (1 ye-AFU kanye ne-1 ye
STP)
__u32 inombolo_umsgs; // out: inombolo ye-UMsg esekelwa ihadiwe
};
I-FPGA_PORT_GET_REGION_INFO—i-arg iyisikhombi ku-:
hlela i-fpga_port_region_info {
__u32 argsz; // ku: sizeof(struct fpga_port_region_info)
__u32 amafulegi; // phuma: (i-bitmask) {FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 inkomba; // ku: FPGA_PORT_INDEX_UAFU noma FPGA_PORT_INDEX_STP
__u32 ukupheda; // ku: kufanele kube ngu-0
__u64 usayizi; // ukuphuma: usayizi wesifunda se-MMIO ngamabhayithi
__u64 offset; // ukuphuma: i-offset yesifunda se-MMIO kusukela ekuqaleni kwedivayisi fd
};
I-FPGA_PORT_DMA_MAP—i-arg iyisikhombi ku-:
yakha i-fpga_port_dma_map {
__u32 argsz; // ku: sizeof(isakhiwo fpga_port_dma_map)
__u32 amafulegi; // ku: kufanele kube ngu-0 __u64 user_addr; // ku: inqubo ebonakalayo
ikheli. Kufanele iqondaniswe nekhasi.
__u64 ubude; // ku: ubude bemephu ngamabhayithi. Kufanele kube ukuphindaphinda kwekhasi
usayizi.
__u64 iova; // out: IO ikheli virtual };
I-FPGA_PORT_DMA_UNMAP—i-arg iyisikhombi ku-:
hlela i-fpga_port_dma_unmap {
__u32 argsz; // ku: sizeof(yakha i-fpga_port_dma_unmap)
__u32 amafulegi; // ku: kufanele kube ngu-0
__u64 iova; // ku: Ikheli elibonakalayo le-IO elibuyiswe okwedlule
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET—i-arg kufanele ibe NULL.
- FPGA_PORT_UMSG_ENABLE—i-arg kufanele ibe NULL.
- FPGA_PORT_UMSG_DISABLE—ama-args kufanele abe NULL.
I-FPGA_PORT_UMSG_SET_MODE—i-arg iyisikhombi ku-:
yakha i-fpga_port_umsg_cfg {
__u32 argsz; // ku: sizeof(struct fpga_port_umsg_cfg)
__u32 amafulegi; // ku: kufanele kube ngu-0
__u32 hint_bitmap; // ku: I-bitmap yemodi yokusikisela ye-UMsg. Ikhombisa ukuthi ayini ama-UMsg
inikwe amandla.
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- I-UMsg kufanele ivaliwe ngaphambi kokukhipha le ioctl.
- Inkambu ye-iova kufanele ibe yebhafa enkulu ngokwanele kuwo wonke ama-UMsg (num_umsgs * PAGE_SIZE).
- Ibhafa imakwe ngokuthi “iyasebenza” ukuphathwa kwebhafa yomshayeli.
- Uma i-iova INGULU, noma yisiphi isifunda sangaphambilini asiphawulwanga ngokuthi “siyasetshenziswa”.
- I-arg iyisikhombi ku-a:
hlela i-fpga_port_umsg_base_addr {- u32 argsz; // ku: sizeof(struct fpga_port_umsg_base_addr)
- amafulegi u32; // ku: kufanele kube ngu-0
- u64 iova; // ku: IO ikheli elibonakalayo kusuka ku-FPGA_PORT_DMA_MAP. };
Qaphela:
- Ukuze usule amaphutha echweba, kufanele ubhale i-bitmask eqondile yamaphutha amanje, isiboneloample, amaphutha ekati > cacile
- I-UMsg isekelwa kuphela nge-Acceleration Stack ye-Intel Xeon Processor ene-FPGA Edidiyelwe.
sysfs Files
FME Header sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
inombolo_yezimbobo | fme_header.capability.num_ports | Idesimali int | Funda kuphela |
usayizi_wenqolobane | fme_header.capability.cache_size | Idesimali int | Funda kuphela |
inguqulo | fme_header.capability.fabric_verid | Idesimali int | Funda kuphela |
isokhethi_id | fme_header.capability.socket_id | Idesimali int | Funda kuphela |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Funda kuphela |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Funda kuphela |
I-FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
umkhawulo1 | i-thermal.threshold.tmp_thshold1 | Idesimali int | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
umkhawulo2 | i-thermal.threshold.tmp_thshold2 | Idesimali int | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
ithreshold_trip | thermal.threshold.therm_trip_thshold | Idesimali int | Funda kuphela |
umkhawulo1_ufinyelelwe | thermal.threshold.thshold1_status | Idesimali int | Funda kuphela |
umkhawulo2_ufinyelelwe | thermal.threshold.thshold2_status | Idesimali int | Funda kuphela |
i-threshold1_policy | ezishisayo. threshold.thshold_policy | Idesimali int | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
izinga lokushisa | thermal.rdsensor_fm1.fpga_temp | Idesimali int | Funda kuphela |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
kudliwe | amandla.status.pwr_consumed | hex uint64_t | Funda kuphela |
umkhawulo1 | amandla.threshold.threshold1 | hex uint64_t | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
umkhawulo2 | amandla.threshold.threshold2 | hex uint64_t | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
i-threshold1_isimo | power.threshold.threshold1_status | Idesimali ayisayiniwe | Funda kuphela |
i-threshold2_isimo | power.threshold.threshold2_status | Idesimali ayisayiniwe | Funda kuphela |
rtl | power.status.fpga_latency_report | Idesimali ayisayiniwe | Funda kuphela |
I-FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
pcie0_amaphutha | gerror.pcie0_err | hex uint64_t | Bhala-ukubhala |
pcie1_amaphutha | gerror.pcie1_err | hex uint64_t | Bhala-ukubhala |
Iphutha_lokujova | gerror.ras_error_inj | hex uint64_t | Bhala-ukubhala |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
amaphutha | gerror.fme_err | hex uint64_t | Funda kuphela |
iphutha_lokuqala | gerror.fme_first_err.err_reg_status | hex uint64_t | Funda kuphela |
iphutha_elilandelayo | gerror.fme_next_err.err_reg_status | hex uint64_t | Funda kuphela |
cacile | Isula amaphutha, iphutha_lokuqala, iphutha_elilandelayo | i-uint64_t ehlukahlukene | Bhala kuphela |
Qaphela:
Ukuze usule amaphutha e-FME, kufanele ubhale i-bitmask ngqo yamaphutha amanje, isiboneloampamaphutha ekati > acacile.
I-FME Ingxenye yokucushwa kabusha kwama-sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
interface_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | hex 16-byte | Funda kuphela |
I-FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
iwashi | gperf.clk.afu_interf_clock | hex uint64_t | Funda kuphela |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ayivumelekile ku-Acceleration Stack ye-Intel Xeon CPU enama-FPGAs)
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
qhwa | gperf.ch_ctl.freeze | Idesimali int | Bhala-ukubhala |
funda_shaya | gperf.CACHE_RD_HIT | hex uint64_t | Funda kuphela |
funda_khumbula | gperf.CACHE_RD_MISS | hex uint64_t | Funda kuphela |
bhala_shaya | gperf.CACHE_WR_HIT | hex uint64_t | Funda kuphela |
bhala_khumbula | gperf.CACHE_WR_MISS | hex uint64_t | Funda kuphela |
bamba_isicelo | gperf.CACHE_HOLD_REQ | hex uint64_t | Funda kuphela |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Funda kuphela |
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Funda kuphela |
idatha_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Funda kuphela |
tag_bhala_imbobo_ukuphikisana | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Funda kuphela |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ayivumelekile ku-Acceleration Stack ye-Intel Xeon CPU enama-FPGAs)
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
qhwa | gperf.vtd_ctl.freeze | Idesimali int | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ayivumelekile ku-Acceleration Stack ye-Intel Xeon CPU ene-FPGAs)
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
funda_ukuthenga | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Funda kuphela |
bhala_ukuthenga | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Funda kuphela |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Funda kuphela |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Funda kuphela |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
vumela | gperf.fab_ctl.(inikwe amandla) | Idesimali int | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
qhwa | gperf.fab_ctl.freeze | Idesimali int | Umsebenzisi: Umsuka Wokufunda kuphela: Funda-bhala |
pcie0_funda | gperf.FAB_PCIE0_RD | hex uint64_t | Funda kuphela |
pcie0_bhala | gperf.FAB_PCIE0_WR | hex uint64_t | Funda kuphela |
pcie1_funda | gperf.FAB_PCIE1_RD | hex uint64_t | Funda kuphela |
pcie1_bhala | gperf.FAB_PCIE1_WR | hex uint64_t | Funda kuphela |
funda_funda | gperf.FAB_UPI_RD | hex uint64_t | Funda kuphela |
bhala_bhala | gperf.FAB_UPI_WR | hex uint64_t | Funda kuphela |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
pcie0_funda | gperf.FAB_PCIE0_RD | hex uint64_t | Funda kuphela |
pcie0_bhala | gperf.FAB_PCIE0_WR | hex uint64_t | Funda kuphela |
pcie1_funda | gperf.FAB_PCIE1_RD | hex uint64_t | Funda kuphela |
pcie1_bhala | gperf.FAB_PCIE1_WR | hex uint64_t | Funda kuphela |
funda_funda | gperf.FAB_UPI_RD | hex uint64_t | Funda kuphela |
bhala_bhala | gperf.FAB_UPI_WR | hex uint64_t | Funda kuphela |
I-Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
id | port_header.capability.port_number | Idesimali int | Funda kuphela |
ltr | port_header.control.latency_tolerance | Idesimali int | Funda kuphela |
I-Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
afu_id | afu_header.guid | hex 16-byte | Funda kuphela |
Iphutha lembobo sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | inkambu yemmio | uhlobo | ukufinyelela |
amaphutha | iphutha.port_error | hex uint64_t | Funda kuphela |
iphutha_lokuqala | iphutha.port_first_error | hex uint64_t | Funda kuphela |
first_malformed_req | i-perrror.malreq | hex 16-byte | Funda kuphela |
cacile | iphutha.(wonke amaphutha) | i-uint64_t ehlukahlukene | Bhala kuphela |
Qaphela:
Ukuze usule amaphutha Embobo, kufanele ubhale i-bitmask eqondile yamaphutha amanje, isiboneloampamaphutha ekati > acacile.
Umlando Wokubuyekeza
Inguqulo Yedokhumenti | Izinguquko |
2017.10.02 | Ukukhishwa Kwasekuqaleni. |
I-OPAE Intel FPGA Linux Device Driver Architecture Guide
Amadokhumenti / Izinsiza
![]() |
Intel OPAE FPGA Linux Device Driver Architecture [pdf] Umhlahlandlela Womsebenzisi OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |