intel-logo

Intel OPAE FPGA Linux Device Driver Architecture

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

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

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

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

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

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:

  1. Yehlisa umshayeli kusivakashi
  2. Khipha i-VF kusivakashi
  3. Khubaza i-SR-IOV
  4. Yenza ukulungisa kabusha ingxenye
  5. Nika amandla i-SR-IOV
  6. Xhuma i-VF kusivakashi
  7. 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:

  1. 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.
  2. 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
  3. Dlula ama-VF uye kuma-VM.
  4. 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

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

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

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

  • 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

Izithenjwa

Shiya amazwana

Ikheli lakho le-imeyili ngeke lishicilelwe. Izinkambu ezidingekayo zimakiwe *