intel-logo

Intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

Umqhubi we-OPAE Intel FPGA unikezela ngokujongana kwezicelo zesithuba somsebenzisi ukulungiselela, ukubala, ukuvula, kunye nokufikelela kwi-FPGA i-accelerators kumaqonga axhotyiswe ngezisombululo ze-Intel FPGA kwaye yenza imisebenzi yolawulo lwenqanaba lenkqubo efana nokuhlengahlengiswa kweFPGA, ulawulo lwamandla, kunye nokubonakala.

Hardware Architecture

Ukusuka kwindawo ye-OS ye view, ihardware yeFPGA ibonakala njengesixhobo esiqhelekileyo sePCIe. Imemori yesixhobo seFPGA ilungelelaniswe kusetyenziswa ulwakhiwo lwedatha oluchaziweyo (uLuhlu lweSixhobo). Iimpawu ezixhaswa sisixhobo seFPGA ziyavezwa ngolu lwakhiwo lwedatha, njengoko kubonisiwe ngezantsi kulo mfanekiso ulandelayo:

Isixhobo se-FPGA PCIe

intel-OPAE-FPGA-Linux-Isixhobo-Umqhubi-Ulwakhiwo-umzobo- (1)

Umqhubi uxhasa i-PCIe SR-IOV ukwenza iMisebenzi yeVirtual (VFs) enokuthi isetyenziswe ukwabela i-accelerators nganye koomatshini benyani.

Intel Corporation. Onke Amalungelo Agciniwe. I-Intel, ilogo ye-Intel, kunye nezinye iimpawu ze-Intel ziimpawu zorhwebo ze-Intel Corporation okanye iinkampani eziphantsi kwayo. I-Intel iqinisekisa ukusebenza kweFPGA yayo kunye neemveliso zesemiconductor kwiinkcukacha zangoku ngokuhambelana newaranti esemgangathweni ye-Intel kodwa inelungelo lokwenza utshintsho kuzo naziphi na iimveliso kunye neenkonzo nangaliphi na ixesha ngaphandle kwesaziso. I-Intel ayithathi xanduva okanye ityala elivela kwisicelo okanye ukusetyenziswa kwalo naluphi na ulwazi, imveliso, okanye inkonzo echazwe apha ngaphandle kokuba kuvunyelwene ngokubhaliweyo yi-Intel. Abathengi be-Intel bayacetyiswa ukuba bafumane inguqulelo yamva nje yeenkcazo zesixhobo ngaphambi kokuba baxhomekeke kulo naluphi na ulwazi olupapashiweyo naphambi kokubeka iiodolo zeemveliso okanye iinkonzo.

Amanye amagama kunye neempawu zingabangwa njengempahla yabanye.

Isixhobo se-FPGA PCIe esenziwe ngokubonakalayo

intel-OPAE-FPGA-Linux-Isixhobo-Umqhubi-Ulwakhiwo-umzobo- (2)

Injini yoLawulo yeFPGA (FME)
Injini yoLawulo yeFPGA yenza amandla kunye nolawulo lobushushu, ingxelo yempazamo, uhlengahlengiso, ingxelo yokusebenza, kunye neminye imisebenzi yeziseko. I-FPGA nganye ine-FME enye, ehlala ifikeleleka nge-Physical Function (PF). Usetyenziso lwendawo yomsebenzisi lunokufumana ufikelelo olukhethekileyo kwi-FME usebenzisa i-open(), kwaye uyikhulule usebenzisa i-close() njengomsebenzisi onelungelo (ingcambu).

Izibuko
Izibuko limele ujongano phakathi kwelaphu leFPGA elingatshintshiyo (“iFPGA Interface Manager (FIM)”) kunye nommandla olungiselelwa kancinane oqulathe uMsebenzi weAccelerator (AF). ISibuko silawula unxibelelwano olusuka kwisoftware ukuya kwiaccelerator kwaye luveze iimpawu ezinjengokusetha ngokutsha kunye nolungiso. Isixhobo sePCIe sinokuba namaZibuko amaninzi, kwaye iZibuko ngalinye lingavezwa ngeVF ngokulinikezela kusetyenziswa iFPGA_FME_PORT_ASSIGN ioctl kwisixhobo seFME.

IYunithi ye-Accelerator Function (AF).

  • IYunithi ye-Accelerator Function (AF) incanyathiselwe kwiZibuko kwaye iveza ummandla we-256K MMIO oza kusetyenziselwa iirejista zolawulo ezikhethekileyo.
  • Izicelo zesithuba somsebenzisi zinokufumana ufikelelo olukhethekileyo kwi-AFU encanyathiselwe kwiZibuko ngokusebenzisa i-open() kwisixhobo seZibuko, kwaye uyikhulule ngokuvala ().
  • Usetyenziso lwesithuba somsebenzisi lungenza kwakhona immap() i-accelerator yemimandla yeMMIO.

Uhlengahlengiso olungaphelelanga
Njengoko kukhankanyiwe ngasentla, ii-accelerators zinokuphinda ziqwalaselwe ngohlengahlengiso oluyinxenye lwe-Accelerator Function (AF) file. I-Accelerator Function (AF) kufuneka ibe yenzelwe eyona FIM kunye nendawo ekujoliswe kuyo engashukumiyo (Port) yeFPGA; kungenjalo, umsebenzi woqwalaselo ngokutsha uya kusilela kwaye mhlawumbi ubangele ukungazinzi kwenkqubo. Oku kuhambelana kunokutshekishwa ngokuthelekisa i-ID yojongano oluphawulwe kwi-header ye-AF ngokuchasene ne-ID yojongano oluvezwe yi-FME nge-sysfs. Olu qwalaselo luqhele ukwenziwa sisithuba somsebenzisi phambi kokufowunela uqwalaselo ngokutsha lwe-IOCTL.

Phawula:
Okwangoku, nayiphi na inkqubo yesoftware efikelela kwiFPGA, kuquka nezo zisebenza kwinginginya ebonakalayo, kufuneka ivalwe phambi kokuzama uqwalaselo ngokutsha olungaphelelanga. Amanyathelo ayakuba:

  1. Yothula umqhubi kundwendwe
  2. Khupha i-VF kundwendwe
  3. Khubaza i-SR-IOV
  4. Yenza uhlengahlengiso olungaphelelanga
  5. Yenza i-SR-IOV isebenze
  6. Xhuma iVF kundwendwe
  7. Layisha umqhubi kwindwendwe

FPGA Virtualization
Ukuvumela ukufikelela kwi-accelerator evela kwizicelo ezisebenza kwi-VM, izibuko le-AFU ngokufanelekileyo kufuneka labelwe i-VF kusetyenziswa la manyathelo alandelayo:

  1. I-PF iphethe onke amazibuko e-AFU ngokungagqibekanga. Naliphi na izibuko elifuna ukwabelwa ngokutsha kwi-VF kufuneka liqale likhutshwe kwi-PF nge-FPGA_FME_PORT_RELEASE ioctl kwisixhobo se-FME.
  2. Nje ukuba amazibuko e-N akhululwe kwi-PF, lo myalelo ungezantsi ungasetyenziselwa ukwenza i-SRIOV kunye nee-VFs zisebenze. I-VF nganye inezibuko elinye kuphela eline-AFU. echo N > PCI_DEVICE_PATH/sriov_nuMVfs
  3. Dlula kwii-VF ukuya kwii-VM.
  4. I-AFU phantsi kwe-VF ifumaneka kwizicelo kwi-VM (usebenzisa umqhubi ofanayo ngaphakathi kwe-VF).

Phawula:
I-FME ayinakwabelwa i-VF, ngoko ke iPR kunye neminye imisebenzi yolawulo ifumaneka kuphela ngePF.

Umbutho womqhubi

PCIe Module Device Driver

Umbutho womqhubi

intel-OPAE-FPGA-Linux-Isixhobo-Umqhubi-Ulwakhiwo-umzobo- (3)

Izixhobo zeFPGA zivela njengezixhobo eziqhelekileyo zePCIe; ngoko, umqhubi wesixhobo seFPGA PCIe (intel-FPGA-PCI.ko) uhlala elayishiwe kuqala kanye xa kufunyaniswe iFPGA PCIe PF okanye VF. Lo mqhubi udlala indima yeziseko zophuhliso kuyilo lomqhubi. Yona:

  • Yenza isixhobo se-FPGA yesikhongozeli njengomzali wesixhobo esibonakalayo.
  • Uhamba ngoLuhlu lweSixhobo, oluphunyezwa kwimemori ye-PCIe yesixhobo se-BAR, ukufumanisa izixhobo ezinophawu kunye neempawu zazo ezisezantsi kunye nokudala izixhobo zeqonga kubo phantsi kwesixhobo sesikhongozeli.
  • Ixhasa i-SR-IOV.
  • Yazisa ulwakhiwo lwesixhobo esibonakalayo, esitsala ukusebenza kweempawu ezisezantsi kwaye iveze imisebenzi eqhelekileyo ukubonisa abaqhubi besixhobo.

PCIe Isixhobo Driver Imisebenzi

  • Iqulethe ukufunyanwa kwe-PCIe, ubalo lwesixhobo, kunye nokufunyanwa kwezinto.
  • Yenza abalawuli be-sysfs kwisixhobo esingumzali, i-FPGA yoLawulo lweNjini (FME), kunye ne-Port.
  • Yenza imizekelo yomqhubi weqonga, ibangela ukuba i-Linux kernel ilayishe abaqhubi bemodyuli yeqonga.

I-FME Platform yeModyuli Umqhubi weSixhobo

  • Ulawulo lwamandla kunye ne-thermal, ingxelo yempazamo, ingxelo yokusebenza, kunye neminye imisebenzi yeziseko. Ungafikelela kule misebenzi ngokusebenzisa ujongano lwesysfs oluvezwe ngumqhubi weFME.
  • Uhlengahlengiso olungaphelelanga. Umqhubi we-FME ubhalisa uMphathi weFPGA ngexesha lokuqaliswa kwecandelo elisezantsi le-PR; xa sele ifumene i FPGA_FME_PORT_PR ioctl esuka kuwe, yenza ujongano oluqhelekileyo umsebenzi oluvela kuMphathi we FPGA ukugqibezela uqwalaselo ngokutsha olungaphelelanga lwebitstream kwiZibuko elinikiweyo.
  • Ulawulo lwezibuko ukwenzela ukubona. Umqhubi weFME wazisa iioctls ezimbini, FPGA_FME_PORT_RELEASE, ekhupha iZibuko elinikiweyo kwiPF; kunye neFPGA_FME_PORT_ASSIGN, eyabela iZibuko emva kwi-PF. Emva kokuba i-Port ikhutshwe kwi-PF, inokwabelwa kwi-VF ngokusebenzisa i-SR-IOV interfaces enikezelwa ngumqhubi we-PCIe. Ngolwazi oluthe vetshe, bhekisa ku "FPGA Virtualization".

I-FME Platform yeModyuli yeMisebenzi yoMqhubi weSixhobo

  • Yenza inodi yesixhobo soonobumba be-FME.
  • Yenza iisysfs zeFME files kwaye iphumeze iisysfs zeFME file abancedisi.
  • Iphumeza i-FME yabucala abaqhubi abancinci.
  • I-FME yabucala abaqhubi abancinci:
    • Isihloko se-FME
    • Ulawulo lweThermal
    • Ulawulo lwamandla
    • Imposiso yehlabathi
    • Uhlengahlengiso olungaphelelanga
    • Intsebenzo yeHlabathi

I-Port Platform yeModyuli yoMqhubi weSixhobo
Ngokufana nomqhubi we-FME, i-FPGA Port (kunye ne-AFU) umqhubi (intel-fpga-afu. ko) iphononongwa kanye xa isixhobo seSizithi seqonga senziwe. Umsebenzi ophambili walo mnqongo kukubonelela ngojongano lwezicelo zesithuba somsebenzisi ukufikelela kwi-accelerators nganye, ukuquka ulawulo lokuseta ngokutsha olusisiseko kwi-Port, ukuthunyelwa ngaphandle kwengingqi ye-AFU MMIO, inkonzo ye-DMA buffer mapping, UMsg (1) isaziso, kunye ne-remote debug imisebenzi ( bona ngasentla).

I-UMsg ixhaswa kuphela nge-Acceleration Stack ye-Intel Xeon® Processor ene-FPGA eDityanisiweyo.

I-Port Platform yeModyuli yeSixhobo seMisebenzi yoMqhubi

  • Yenza inodi yesixhobo soonobumba beSiqhagamshelo.
  • Yenza iPort sysfs files kunye nokusebenzisa iZibuko sysfs file abancedisi.
  • Iphumeza iPort yabucala abaqhubi abancinci.
  • Izibuko labucala abaqhubi abancinci:
    • Port Header
    • AFU
    • Impazamo yePort
    • UMsg(2)
    • Uphawu lweTephu

Isicelo FPGA Device Ubalo
Eli candelo lazisa ukuba izicelo zisibala njani isixhobo seFPGA ukusuka kuluhlu lwesysfs phantsi /sys/class/fpga. Kwi-exampLe ngezantsi, izixhobo ezimbini ze-Intel FPGA zifakwe kwinginginya. Isixhobo ngasinye se-FPGA sine-FME enye kunye namazibuko amabini (AFUs). Kwisixhobo ngasinye seFPGA, ulawulo lwesixhobo lwenziwa phantsi kwe/sys/class/fpga:

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

Indawo nganye ineFME enye kunye namazibuko amabini (AFUs) njengezixhobo zabantwana:
/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

Ngokubanzi, ujongano lweFME/Port sysfs luthiywe ngolu hlobo lulandelayo:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

ndifaka iinombolo ngokulandelelanayo zonke izixhobo zemigqomo, j ngokulandelelanayo ndinika iinombolo kwii-FME kwaye k ngokulandelelanayo ndinike iinombolo kuzo zonke iiZibuko.

Iinowudi zesixhobo ezisetyenziselwa ioctl() kunye ne mmap() zinokubhekiswa ngale:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe Driver Ubalo
Eli candelo linika ngaphezuluview Ukuhamba kwekhowudi yobalo lwesixhobo olwenziwa yi-intel-fpga-pci.ko. Izakhiwo zedatha eziphambili kunye nemisebenzi ibonakaliswe. Eli candelo lilandelwa kakuhle xa viewngekhowudi yomthombo ehamba nayo (pcie.c).

Ulwakhiwo lweDatha yoBalo

enum fpga_id_uhlobo {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
i-static struct idr fpga_ids[FPGA_ID_MAX];
yakha fpga_chardev_info {
const char *igama;
dev_t devt;
};
yakha fpga_chardev_info fpga_chrdevs[] = {
{ .igama = FPGA_FEATURE_DEV_FME},
{ .igama = FPGA_FEATURE_DEV_PORT},
};
iklasi yesakhiwo esimileyo *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
};
yakha cci_drvdata {
int device_id;
isixhobo sokwakheka *fme_dev;
cwangcisa isitshixo se-mutex;
uluhlu lolwakhiwo_intloko port_dev_list;
int released_port_num;
imimandla yoluhlu_yentloko;
};
i-struct build_feature_devs_info {
yakha pci_dev *pdev;
akukho __iomem *ioaddr;
akukho __iomem *ioend;
int current_bar;
akukho __iomem *pfme_hdr;
isixhobo sokwakheka *umzali_dev;
cwangcisa iqonga_isixhobo *feature_dev;
};

UkuHamba koBalo

  • ccidrv_init()
    • Qalisa i-fpga_ids usebenzisa idr_init ().
    • Qalisa fpga_chrdevs[i].devt usebenzisa alloc_chrdev_region().
    • Qalisa i-fpga_class usebenzisa i-class_create ().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Yenza isixhobo sePCI sisebenze, cela ukufikelela kwimimandla yayo, seta imowudi ye-PCI, kwaye uqwalasele i-DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Yabela i-struct build_feature_devs_info, yiqalise.
      .parent_dev imiselwe kulawulo lwesysfs yomzali (intel-fpga-dev.id) equlathe oovimba beefayili zeFME kunye nePort sysfs.
  • Uluhlu_lweempawu_ zokwahlula ()
    • Hamba i-BAR0 Uluhlu lweSixhobo ukuze ufumane i-FME, i-Port, kunye neempawu zabo zabucala.
  • ucazululo_uphawu() cazulula_feature_afus() cazulula_feature_fme()
    • Xa i-FME idibene:
  • build_info_create_dev()
    • Yabela isixhobo seqonga seFME, sigcine kwi-build_feature_devs_info.feature_dev.
    • feature_dev.id iqaliswe kwisiphumo se-idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent isetelwe ku-build_feature_devs_info.parent_dev.
    • Nikela uluhlu lwemithombo yolwakhiwo kwisici_dev.resource.
  • Yabela i-struct feature_platform_data, yiqalise, kwaye ugcine isalathisi kwi-fiction_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Qalisa isici_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_yongeza ()
    • Qalisa isici_platform_data.features[FME_FEATURE_ID_HEADER], yonke into kodwa .fops.
  • ucazululo_uphawu() cazulula_feature_afus() cazulula_isici_izibuko()
    • Xa iZibuko lidibene:
  • build_info_create_dev()
    • Yabela isixhobo seqonga seZibuko, sigcina kwi-build_feature_devs_info.feature_dev.
    • feature_dev.id iqaliswe kwisiphumo se-idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent isetelwe ku-build_feature_devs_info.parent_dev.
    • Nikela uluhlu lwemithombo yolwakhiwo kwisici_dev.resource.
    • Yabela i-struct feature_platform_data, yiqalise, kwaye ugcine isalathisi kwi-fiction_dev.dev.platform_data
  • build_info_commit_dev()
    • Yongeza i-struct feature_platform_data.node yeZibuko kuluhlu lwamaZibuko kulwakhiwo cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Qalisa isici_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_yongeza ()
    • Qalisa isici_platform_data.features[PORT_FEATURE_ID_HEADER], yonke into kodwa .fops.
  • ucazululo_uphawu() cazulula_ifeature_afus() cazulula_isici_iport_uafu()
    • Xa kufunyenwe i-AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Qalisa isici_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_yongeza ()
    • Qalisa isici_platform_data.features[PORT_FEATURE_ID_UAFU], yonke into kodwa .fops.
  • ucazululo_isici () cahlula_imeko_yabucala () cazulula_ifeature_fme_yabucala ()
    • Xa iFME yabucala ifunyenwe:
  • create_feature_instance() build_info_add_sub_feature()
    • Qalisa isici_dev.resource[id].
  • feature_platform_data_yongeza ()
    • Qalisa feature_platform_data.features[id], yonke into kodwa .fops.
  • ucazululo_isici () cahlula_isici_esibucala
  • Xa iZibuko labucala kuqubisana nalo: * 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 kodwa .fops.
  • calula_iizibuko_ukusuka_fme()
    • Ukuba umqhubi ulayishwe kwiPhysical Function (PF), ngoko:
  • Qhuba i- parse_feature_list() flow kwizibuko ngalinye elichazwe kwi-header ye-FME.
  • Sebenzisa i-BAR ekhankanywe kwiNgeniso yeSibuko ngasinye kwiheda.

Ukuqaliswa kweSixhobo se-FME Platform
Eli candelo linika ngaphezuluview Ukuhamba kwekhowudi yokuqaliswa kwesixhobo se-FME okwenziwa yi-intel-fpga-fme.ko. Izakhiwo zedatha eziphambili kunye nemisebenzi iphakanyisiwe. Eli candelo lilandelwa kakuhle xa viewngekhowudi yomthombo ekhaphayo (fme-main.c).

Ulwakhiwo lweDatha yePlatform yeFME

isakhi isici_iindlela {
int (* init)(struct platform_device *pdev, struct feature *feature);
int (* iyunithi) (iqonga leqonga_isixhobo * pdev, isakhi isici *uphawu);
ixesha elide (* ioctl) (iqonga leqonga_isixhobo * pdev, isakhi senqaku * inqaku,
engatyikitywanga int cmd, engatyikitywanga arg ende);
int (* uvavanyo) (iqonga lolwakhiwo_isixhobo *pdev, isakhi isici *uphawu);
};
isakhiwo isici {
const char *igama;
int resource_index;
akukho __iomem *ioaddr;
i-structure feature_ops *ii-ops;
};
isakhi isici_idatha_yeqonga {
i-struct list_head node;
cwangcisa isitshixo se-mutex;
dev_status_engatyikitywanga;
yakha cdev cdev;
cwangcisa iqonga_isixhobo *dev;
ungasayinwanga disable_count;
akukho nto *yabucala;
int num;
int (* i-config_port) (isixhobo seqonga_sakhiwe *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device*,
ukungabikho *, int (*umdlalo)(isixhobo seqonga_sakhiwe *, akukho *)); ulwakhiwo
iimpawu[0];
};
into_yolwakhiwo {
int id;
const struct attribute_group **attr_amaqela;
isixhobo sokwakheka *fme_dev;
i-struct list_head node;
uluhlu lolwakhiwo_abantwana bentloko;
struct kobject kobj;
};
yakha i-fpga_fme {
u8 port_id;
u64 pr_err;
isixhobo sokwakheka *dev_err;
struct perf_object *perf_dev;
cwangcisa isici_kwiqonga_idatha *idatha;
};

IQonga le-FME leSixhobo sokuQalisa ukuhamba

Ukuqukuqela kokuQaliswa kwe-FMEintel-OPAE-FPGA-Linux-Isixhobo-Umqhubi-Ulwakhiwo-umzobo- (4)

  • fme_probe() fme_dev_init()
    • Qalisa i-struct fpga_fme kwaye uyigcine kwindawo ye-feature_platform_data.yabucala.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Gcina i-struct feature_ops kwi-feature_platform_data.features yenqaku ngalinye elinabantu.
    • Biza umsebenzi wovavanyo, ukuba ukhona, ukusuka kwisakhiwo.
    • Biza umsebenzi we-init kwisakhiwo.
  • fme_probe() fpga_register_dev_ops()
    • Yenza i-node yesixhobo soonobumba be-FME, ubhalisa ulwakhiwo file_imisebenzi.

Ukuqaliswa kweSixhobo seSixhobo sePortform
Eli candelo linika ngaphezuluview Ukuhamba kwekhowudi yokuqaliswa kwesixhobo sezibuko okwenziwa yi-intel-fpga-afu.ko. Izakhiwo zedatha eziphambili kunye nemisebenzi ibonakaliswe. Eli candelo lilandelwa kakuhle xa viewngekhowudi yomthombo ekhaphayo (afu.c).

Ulwakhiwo lweDatha yeSixhobo sePortform

isakhi isici_iindlela {
int (* init)(struct platform_device *pdev, struct feature *feature);
int (* iyunithi) (iqonga leqonga_isixhobo * pdev, isakhi isici *uphawu);
ixesha elide (* ioctl) (iqonga leqonga_isixhobo * pdev, isakhi senqaku * inqaku,
engatyikitywanga int cmd, engatyikitywanga arg ende);
int (* uvavanyo) (iqonga lolwakhiwo_isixhobo *pdev, isakhi isici *uphawu);
};
isakhiwo isici {
const char *igama;
int resource_index;
akukho __iomem *ioaddr;
i-structure feature_ops *ii-ops;
};
isakhi isici_idatha_yeqonga {
i-struct list_head node;
cwangcisa isitshixo se-mutex;
dev_status_engatyikitywanga;
yakha cdev cdev;
cwangcisa iqonga_isixhobo *dev;
ungasayinwanga disable_count;
akukho nto *yabucala;
int num;
int (* i-config_port) (isixhobo seqonga_sakhiwe *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device*,
ukungabikho *, int (*umdlalo)(isixhobo seqonga_sakhiwe *, akukho *));
iimpawu zesakhiwo[0];
};
yakha fpga_afu_region {
u32 index;
iiflegi ze-u32;
u64 ubukhulu;
u64 offset;
U64 phys;
i-struct list_head node;
};
yakha fpga_afu_dma_region {
u64 umsebenzisi_addr;
u64 ubude;
u64 iova;
iphepha lolwakhiwo **amaphepha;
yakha i-rb_node ye-node;
i-bool in_use;
};
yakha fpga_afu {
u64 ummandla_cur_offset;
int num_imimandla;
u8 num_umsgs;
imimandla yoluhlu_yentloko;
yakha i-rb_root dma_regions;
cwangcisa isici_kwiqonga_idatha *idatha;
};

UkuQala kweSixhobo seSixhobo sePortform

UkuHamba kokuqaliswa kwePortintel-OPAE-FPGA-Linux-Isixhobo-Umqhubi-Ulwakhiwo-umzobo- (5)

  • afu_probe() afu_dev_init()
    • Qalisa i-struct fpga_afu kwaye uyigcine kwindawo ye-feature_platform_data.yabucala.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Gcina i-struct feature_ops kwi-feature_platform_data.features yenqaku ngalinye elinabantu.
    • Biza umsebenzi wovavanyo, ukuba ukhona, ukusuka kwisakhiwo.
    • Biza umsebenzi we-init kwisakhiwo.
  • afu_probe() fpga_register_dev_ops()
    • Yenza iNode yesixhobo somlinganiswa wePort, ubhalisa ulwakhiwo file_imisebenzi.

Ii-FME IOCTLs
Ii-IOCTL ezibizwa ngokuvula file descriptor for /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—buyisela inguqulelo yangoku njengenani elipheleleyo, ukuqala ku-0.

FPGA_CHECK_EXTENSION-ayixhaswa okwangoku.

FPGA_FME_PORT_RELEASE-i-arg sisalathiso kwi:

yakha i-fpga_fme_port_release {
__u32 argsz; // nge: ubungakanani be(isakhiwo fpga_fme_port_release)
__u32 iiflegi; // ngaphakathi: kufuneka ibe ngu-0
__u32 isazisi sezibuko; // kwi: i-ID ye-port (ukusuka kwi-0) ukukhulula.
};

FPGA_FME_PORT_ASSIGN-arg sisalathiso kwi:

yakha i-fpga_fme_port_assign {
__u32 argsz; // nge: ubungakanani be(isakhiwo fpga_fme_port_assign)
__u32 iiflegi; // ngaphakathi: kufuneka ibe ngu-0
__u32 isazisi sezibuko; // kwi: i-ID yezibuko (ukusuka kwi-0) ukuya kwabela. (kufuneka kube njalo
Ikhutshwe ngaphambili ngu FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR-i-arg sisalatha kwi:

yakha i-fpga_fme_port_pr {
__u32 argsz; // nge: ubungakanani be(isakhiwo fpga_fme_port_pr)
__u32 iiflegi; // ngaphakathi: kufuneka ibe ngu-0
__u32 isazisi sezibuko; // nge: i-ID yezibuko (ukusuka ku-0)
__u32 buffer_ubungakanani; // kwi: ubungakanani be-bitstream buffer kwii-bytes. Kufuneka ibe yi-4-byte
ilungelelanisiwe.
__u64 idilesi_yesithintelo; // ngaphakathi: idilesi yenkqubo ye-bitstream buffer
__u64 ubume; // ngaphandle: imeko yempazamo (i-bitmask)
};

IiPort IOCTLs
Ii-IOCTL ezibizwa ngokuvula file descriptor for /dev/intel-fpga-port.k FPGA_GET_API_VERSION-buyisela inguqulelo yangoku njengenani elipheleleyo, ukuqala ku-0. FPGA_CHECK_EXTENSION-ayixhaswanga okwangoku.

FPGA_PORT_GET_INFO-i-arg sisalathiso kwi:

yakha i-fpga_port_info {
__u32 argsz; // kwi: ubungakanani (isakhiwo fpga_port_info)
__u32 iiflegi; // ngaphandle: ibuyisela i-0
__u32 inani_lemimandla; // ngaphandle: inani lemimandla yeMMIO, i-2 (1 ye-AFU kunye ne-1 ye
STP)
__u32 inani_umsgs; // ngaphandle: inani le-UMsg elixhaswa yi-hardware
};

FPGA_PORT_GET_REGION_INFO-arg sisalathiso kwi:

yakha fpga_port_region_info {
__u32 argsz; // kwi: ubungakanani (isakhiwo fpga_port_region_info)
__u32 iiflegi; // ngaphandle: (bitmask) {FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 isalathisi; // nge: FPGA_PORT_INDEX_UAFU okanye FPGA_PORT_INDEX_STP
__u32 padding; // ngaphakathi: kufuneka ibe ngu-0
__u64 ubukhulu; // ngaphandle: ubungakanani bengingqi yeMMIO kwiibhayithi
__u64 offset; // ngaphandle: i-offset yengingqi yeMMIO ukusuka ekuqaleni kwesixhobo fd
};

FPGA_PORT_DMA_MAP-i-arg sisalatha kwi:
yakha i-fpga_port_dma_map {
__u32 argsz; // nge: ubungakanani be(isakhiwo fpga_port_dma_map)
__u32 iiflegi; // kwi: kufuneka ibe ngu-0 __u64 umsebenzisi_addr; // kwi: inkqubo yenyani
idilesi. Kufuneka iphepha lilungelelaniswe.
__u64 ubude; // ngo: ubude bemephu ngeebhayithi. Kufuneka ibe luphinda-phindo lwamaphepha
ubukhulu.
__u64 iova; // ngaphandle: IO idilesi yenyani };

FPGA_PORT_DMA_UNMAP-i-arg sisalatha kwi:
yakha i-fpga_port_dma_unmap {
__u32 argsz; // nge: ubungakanani be(isakhiwo fpga_port_dma_unmap)
__u32 iiflegi; // ngaphakathi: kufuneka ibe ngu-0
__u64 iova; // kwi: IO idilesi yenyani ebuyiselwe yeyangaphambili
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—i-arg mayibe NULL.
  • FPGA_PORT_UMSG_ENABLE-i-arg mayibe NULL.
  • FPGA_PORT_UMSG_DISABLE-i-args kufuneka i-NULL.

FPGA_PORT_UMSG_SET_MODE-i-arg sisalatha kwi:

yakha fpga_port_umsg_cfg {
__u32 argsz; // nge: ubungakanani be(isakhiwo fpga_port_umsg_cfg)
__u32 iiflegi; // ngaphakathi: kufuneka ibe ngu-0
__u32 hint_bitmap; // kwi: UMsg imowudi yengcebiso yebitmap. Ichaza ukuba zeziphi ii-UMsg's
yenziwe yasebenza.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg kufuneka ivaliwe phambi kokukhupha le ioctl.
  • Umhlaba we-iova kufuneka ube ngowesithinteli esikhulu ngokwaneleyo kuzo zonke ii-UMsg's (num_umsgs * PAGE_SIZE).
    • Isithinteli siphawulwa “njengesasetyenziswa” lulawulo lwesithinteli somqhubi.
    • Ukuba iova YI-NULL, nawuphi na ummandla wangaphambili awuphawulwanga “njengesetyenziswayo”.
  • I-arg sisalathi soku:
    yakha fpga_port_umsg_base_addr {
    • u32 argsz; // nge: ubungakanani be(struct fpga_port_umsg_base_addr)
    • iiflegi ze-u32; // ngaphakathi: kufuneka ibe ngu-0
    • u64 iova; // kwi: IO idilesi yenyani ukusuka FPGA_PORT_DMA_MAP. };

Phawula:

  • Ukucima iimpazamo zezibuko, kufuneka ubhale eyona bitmask yeemposiso zangoku, umzekeloample, iimpazamo zekati > zicacile
  • I-UMsg ixhaswa kuphela nge-Acceleration Stack ye-Intel Xeon Processor ene-FPGA eDityanisiweyo.

sysfs Files

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

sysfs file intsimi yemmio uhlobo ukufikelela
inombolo_yezibuko fme_header.capability.num_ports Idecimali int Funda uqhubeleke
cache_size fme_header.capability.cache_size Idecimali int Funda uqhubeleke
inguqulelo fme_header.capability.fabric_verid Idecimali int Funda uqhubeleke
socket_id fme_header.capability.socket_id Idecimali int Funda uqhubeleke
bitstream_id fme_header.bitstream_id hex uint64_t Funda uqhubeleke
bitstream_metadata fme_header.bitstream_md hex uint64_t Funda uqhubeleke

FME Thermal Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file intsimi yemmio uhlobo ukufikelela
umda1 thermal.threshold.tmp_thshold1 Idecimali int Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
umda2 thermal.threshold.tmp_thshold2 Idecimali int Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
threshold_trip thermal.threshold.therm_trip_thshold Idecimali int Funda uqhubeleke
ithreshold1_ifikelelwe thermal.threshold.thshold1_status Idecimali int Funda uqhubeleke
ithreshold2_ifikelelwe thermal.threshold.thshold2_status Idecimali int Funda uqhubeleke
threshold1_ policy thermal. threshold.threshold_policy Idecimali int Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
ubushushu thermal.rdsensor_fm1.fpga_temp Idecimali int Funda uqhubeleke

FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file intsimi yemmio uhlobo ukufikelela
idliwe amandla.status.pwr_consumed hex uint64_t Funda uqhubeleke
umda1 amandla.umqobo.umqobo1 hex uint64_t Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
umda2 amandla.umqobo.umqobo2 hex uint64_t Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
threshold1_status amandla.umqobo.umqobo1_imo Idesimali ayityikitywanga Funda uqhubeleke
threshold2_status amandla.umqobo.umqobo2_imo Idesimali ayityikitywanga Funda uqhubeleke
rtl amandla.status.fpga_latency_report Idesimali ayityikitywanga Funda uqhubeleke

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

sysfs file intsimi yemmio uhlobo ukufikelela
pcie0_iimpazamo gerror.pcie0_err hex uint64_t Funda-bhala
pcie1_iimpazamo gerror.pcie1_err hex uint64_t Funda-bhala
tofa_impazamo gerror.ras_error_inj hex uint64_t Funda-bhala

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

sysfs file intsimi yemmio uhlobo ukufikelela
iimpazamo gerror.fme_err hex uint64_t Funda uqhubeleke
impazamo_yokuqala gerror.fme_first_err.err_reg_status hex uint64_t Funda uqhubeleke
impazamo_elandelayo gerror.fme_next_err.err_reg_status hex uint64_t Funda uqhubeleke
icacile Icoca iimpazamo, first_error, next_error ezahlukeneyo uint64_t Bhala kuphela

Phawula:
Ukucima iimpazamo zeFME, kufuneka ubhale eyona bitmask yeemposiso zangoku, umzekeloample iimpazamo zekati > zicacile.

Ii-sysfs ze-FME zoLungiselelo oluyinxenye files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file intsimi yemmio uhlobo ukufikelela
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte Funda uqhubeleke

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

sysfs file intsimi yemmio uhlobo ukufikelela
iwotshi gperf.clk.afu_interf_clock hex uint64_t Funda uqhubeleke

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ayisebenzi kwi-Acceleration Stack ye-Intel Xeon CPU eneFPGAs)

sysfs file intsimi yemmio uhlobo ukufikelela
ngumkhenkce gperf.ch_ctl.freeze Idecimali int Funda-bhala
funda_betha gperf.CACHE_RD_HIT hex uint64_t Funda uqhubeleke
funda_phosa gperf.CACHE_RD_MISS hex uint64_t Funda uqhubeleke
bhala_betha gperf.CACHE_WR_HIT hex uint64_t Funda uqhubeleke
bhala_khumbula gperf.CACHE_WR_MISS hex uint64_t Funda uqhubeleke
bamba_sicelo gperf.CACHE_HOLD_REQ hex uint64_t Funda uqhubeleke
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Funda uqhubeleke
sysfs file intsimi yemmio uhlobo ukufikelela
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Funda uqhubeleke
data_write_port_contetion gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Funda uqhubeleke
tag_bhala_izibuko_ingxoxo gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Funda uqhubeleke

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ayisebenzi kwi-Acceleration Stack ye-Intel Xeon CPU eneFPGAs)

sysfs file intsimi yemmio uhlobo ukufikelela
ngumkhenkce gperf.vtd_ctl.freeze Idecimali int Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ayisebenzi kwi-Acceleration Stack ye-Intel Xeon CPU eneFPGAs)

sysfs file intsimi yemmio uhlobo ukufikelela
funda_intengiselwano gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Funda uqhubeleke
bhala_intengiselwano gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Funda uqhubeleke
tlb_funda_betha gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Funda uqhubeleke
tlb_bhala_betha gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Funda uqhubeleke

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

sysfs file intsimi yemmio uhlobo ukufikelela
yenza gperf.fab_ctl.(yenziwe isebenze) Idecimali int Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
ngumkhenkce gperf.fab_ctl.freeze Idecimali int Umsebenzisi: Ingcambu yokufunda kuphela: Funda-bhala
pcie0_funda gperf.FAB_PCIE0_RD hex uint64_t Funda uqhubeleke
pcie0_bhala gperf.FAB_PCIE0_WR hex uint64_t Funda uqhubeleke
pcie1_funda gperf.FAB_PCIE1_RD hex uint64_t Funda uqhubeleke
pcie1_bhala gperf.FAB_PCIE1_WR hex uint64_t Funda uqhubeleke
Upi_funda gperf.FAB_UPI_RD hex uint64_t Funda uqhubeleke
upi_bhala gperf.FAB_UPI_WR hex uint64_t Funda uqhubeleke

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

sysfs file intsimi yemmio uhlobo ukufikelela
pcie0_funda gperf.FAB_PCIE0_RD hex uint64_t Funda uqhubeleke
pcie0_bhala gperf.FAB_PCIE0_WR hex uint64_t Funda uqhubeleke
pcie1_funda gperf.FAB_PCIE1_RD hex uint64_t Funda uqhubeleke
pcie1_bhala gperf.FAB_PCIE1_WR hex uint64_t Funda uqhubeleke
Upi_funda gperf.FAB_UPI_RD hex uint64_t Funda uqhubeleke
upi_bhala gperf.FAB_UPI_WR hex uint64_t Funda uqhubeleke

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

sysfs file intsimi yemmio uhlobo ukufikelela
id port_header.capability.port_number Idecimali int Funda uqhubeleke
ltr port_header.control.latency_tolerance Idecimali int Funda uqhubeleke

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

sysfs file intsimi yemmio uhlobo ukufikelela
afu_id afu_header.guid hex 16-byte Funda uqhubeleke

Imposiso yePort sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file intsimi yemmio uhlobo ukufikelela
iimpazamo perrror.port_error hex uint64_t Funda uqhubeleke
impazamo_yokuqala perrror.port_first_error hex uint64_t Funda uqhubeleke
first_malformed_req iperrror.malreq hex 16-byte Funda uqhubeleke
icacile impazamo.(zonke iimpazamo) ezahlukeneyo uint64_t Bhala kuphela

Phawula:
Ukucima iimpazamo zePort, kufuneka ubhale eyona bitmask yeemposiso zangoku, umzekeloample iimpazamo zekati > zicacile.

Imbali yohlaziyo

Inguqulelo yoXwebhu Iinguqu
2017.10.02 Ukukhutshwa kokuqala.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Amaxwebhu / Izibonelelo

Intel OPAE FPGA Linux Device Driver Architecture [pdf] Isikhokelo somsebenzisi
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Iimbekiselo

Shiya uluvo

Idilesi yakho ye-imeyile ayizupapashwa. Iindawo ezifunekayo ziphawulwe *