intel OPAE FPGA Linux սարքի վարորդի ճարտարապետություն
OPAE Intel FPGA Linux սարքի վարորդի ճարտարապետություն
OPAE Intel FPGA դրայվերը ինտերֆեյսներ է տրամադրում օգտագործողի տարածության հավելվածների համար՝ կարգավորելու, թվարկելու, բացելու և մուտք գործելու FPGA արագացուցիչներ Intel FPGA լուծումներով հագեցած հարթակներում և հնարավորություն է տալիս համակարգի մակարդակի կառավարման գործառույթները, ինչպիսիք են FPGA-ի վերակազմավորումը, էներգիայի կառավարումը և վիրտուալացումը:
Սարքավորումների ճարտարապետություն
ՕՀ-ի տեսանկյունից view, FPGA սարքավորումը հայտնվում է որպես սովորական PCIe սարք։ FPGA սարքի հիշողությունը կազմակերպվում է՝ օգտագործելով կանխորոշված տվյալների կառուցվածքը (Device Feature List): FPGA սարքի կողմից աջակցվող առանձնահատկությունները բացահայտվում են այս տվյալների կառուցվածքների միջոցով, ինչպես ցույց է տրված ստորև՝ հետևյալ նկարում.
FPGA PCIe սարք
Վարորդն աջակցում է PCIe SR-IOV-ին՝ ստեղծելու Վիրտուալ գործառույթներ (VF), որոնք կարող են օգտագործվել վիրտուալ մեքենաներին անհատական արագացուցիչներ նշանակելու համար:
Intel կորպորացիա. Բոլոր իրավունքները պաշտպանված են: Intel-ը, Intel-ի պատկերանշանը և Intel այլ նշանները Intel Corporation-ի կամ նրա դուստր ձեռնարկությունների ապրանքանիշերն են: Intel-ը երաշխավորում է իր FPGA-ի և կիսահաղորդչային արտադրանքների կատարումը ընթացիկ բնութագրերին համապատասխան՝ Intel-ի ստանդարտ երաշխիքին համապատասխան, սակայն իրեն իրավունք է վերապահում փոփոխություններ կատարել ցանկացած ապրանքի և ծառայությունների մեջ ցանկացած պահի առանց նախազգուշացման: Intel-ը չի ստանձնում ոչ մի պատասխանատվություն կամ պատասխանատվություն, որը բխում է սույն հոդվածում նկարագրված որևէ տեղեկատվության, արտադրանքի կամ ծառայության կիրառումից կամ օգտագործումից, բացառությամբ այն դեպքերի, որոնց մասին հստակ գրավոր համաձայնեցված է Intel-ի կողմից: Intel-ի հաճախորդներին խորհուրդ է տրվում ձեռք բերել սարքի տեխնիկական բնութագրերի վերջին տարբերակը՝ նախքան որևէ հրապարակված տեղեկատվության վրա հիմնվելը և ապրանքների կամ ծառայությունների պատվերներ կատարելը:
Այլ անուններ և ապրանքանիշեր կարող են պահանջվել որպես ուրիշների սեփականություն:
Վիրտուալացված FPGA PCIe սարք
FPGA կառավարման շարժիչ (FME)
FPGA կառավարման շարժիչը կատարում է էներգիայի և ջերմային կառավարում, սխալների մասին հաշվետվություն, վերակազմավորում, կատարողականի հաշվետվություն և այլ ենթակառուցվածքային գործառույթներ: Յուրաքանչյուր FPGA ունի մեկ FME, որը միշտ հասանելի է Ֆիզիկական ֆունկցիայի (PF) միջոցով: Օգտատերերի տարածության հավելվածները կարող են ստանալ բացառիկ մուտք դեպի FME՝ օգտագործելով open(), և թողարկել այն՝ օգտագործելով close() որպես արտոնյալ օգտվող (root):
Պորտ
Պորտը ներկայացնում է ստատիկ FPGA գործվածքի («FPGA ինտերֆեյսի կառավարիչ (FIM)») և արագացուցիչի ֆունկցիա (AF) պարունակող մասամբ վերակազմավորվող շրջանի միջերեսը: Նավահանգիստը վերահսկում է հաղորդակցությունը ծրագրաշարից դեպի արագացուցիչ և բացահայտում է այնպիսի գործառույթներ, ինչպիսիք են վերակայումը և վրիպազերծումը: PCIe սարքը կարող է ունենալ մի քանի պորտ, և յուրաքանչյուր նավահանգիստ կարող է ցուցադրվել VF-ի միջոցով՝ այն վերագրելով FME սարքի FPGA_FME_PORT_ASSIGN ioctl-ի միջոցով:
Արագացուցիչի ֆունկցիայի (AF) միավոր
- Արագացուցիչի ֆունկցիայի (AF) միավորը կցված է նավահանգիստին և բացահայտում է 256K MMIO տարածքը, որն օգտագործվելու է արագացուցչի հատուկ կառավարման ռեգիստրների համար:
- Օգտատերերի տարածքի հավելվածները կարող են բացառիկ մուտք ունենալ AFU-ին, որը կցված է Port-ին, օգտագործելով open() Port սարքի վրա, և թողարկել այն՝ օգտագործելով close():
- Օգտագործողի տարածքի հավելվածները կարող են նաև mmap() արագացնել MMIO շրջանները:
Մասնակի վերակազմավորում
Ինչպես նշվեց վերևում, արագացուցիչները կարող են վերակազմավորվել արագացուցիչի ֆունկցիայի (AF) մասնակի վերակազմավորման միջոցով: file. Արագացուցիչի գործառույթը (AF) պետք է ստեղծված լինի FPGA-ի ճշգրիտ FIM-ի և նպատակային ստատիկ շրջանի (Port) համար. Հակառակ դեպքում, վերակազմավորման գործողությունը կձախողվի և, հնարավոր է, առաջացնի համակարգի անկայունություն: Այս համատեղելիությունը կարելի է ստուգել՝ համեմատելով AF վերնագրում նշված ինտերֆեյսի ID-ն FME-ի կողմից sysfs-ի միջոցով բացահայտված ինտերֆեյսի ID-ի հետ: Այս ստուգումը սովորաբար կատարվում է օգտագործողի տարածքի կողմից՝ նախքան IOCTL վերակազմավորումը կանչելը:
Նշում.
Ներկայումս FPGA մուտք գործող ցանկացած ծրագրային ծրագիր, ներառյալ վիրտուալացված հոսթինգում աշխատող ծրագրերը, պետք է փակվեն՝ նախքան մասնակի վերակազմավորումը փորձելը: Քայլերը կլինեն.
- Վարորդին բեռնաթափել հյուրից
- Անջատեք VF-ը հյուրից
- Անջատել SR-IOV-ը
- Կատարեք մասնակի վերակազմավորում
- Միացնել SR-IOV-ը
- Միացրեք VF-ը հյուրին
- Վարորդին բեռնեք հյուրի մեջ
FPGA վիրտուալացում
VM-ում աշխատող հավելվածներից արագացուցիչ մուտք գործելու համար անհրաժեշտ է, որ համապատասխան AFU-ի պորտը վերագրվի VF-ին՝ օգտագործելով հետևյալ քայլերը.
- PF-ին են պատկանում բոլոր AFU նավահանգիստները լռելյայնորեն: Ցանկացած նավահանգիստ, որը պետք է վերանշանակվի VF-ին, նախ պետք է ազատվի PF-ից FME սարքի FPGA_FME_PORT_RELEASE ioctl-ի միջոցով:
- Երբ N նավահանգիստները ազատվեն PF-ից, ստորև նշված հրամանը կարող է օգտագործվել SRIOV-ը և VF-ները միացնելու համար: Յուրաքանչյուր VF-ն ունի միայն մեկ նավահանգիստ AFU-ի հետ: echo N > PCI_DEVICE_PATH/sriov_numvfs
- Անցնել VF-ների միջոցով VM-ներին:
- VF-ի տակ գտնվող AFU-ն հասանելի է VM-ի հավելվածներից (օգտագործելով նույն դրայվերը VF-ի ներսում):
Նշում.
FME-ը չի կարող վերագրվել VF-ին, հետևաբար PR-ը և կառավարման այլ գործառույթները հասանելի են միայն PF-ի միջոցով:
Վարորդների կազմակերպություն
PCIe Module Device Driver
Վարորդների կազմակերպություն
FPGA սարքերը հայտնվում են որպես սովորական PCIe սարքեր; Այսպիսով, FPGA PCIe սարքի դրայվերը (intel-FPGA-PCI.ko) միշտ առաջինը բեռնվում է FPGA PCIe PF կամ VF հայտնաբերելուց հետո: Այս դրայվերը ենթակառուցվածքային դեր է խաղում վարորդի ճարտարապետության մեջ: Այն:
- Ստեղծում է FPGA կոնտեյներային սարք՝ որպես առանձնահատկություն սարքերի ծնող:
- Քայլում է Սարքի առանձնահատկությունների ցանկի միջով, որն ներդրված է PCIe սարքի BAR հիշողության մեջ՝ հայտնաբերելու առանձնահատկություն սարքերը և դրանց ենթահողերը և ստեղծել պլատֆորմային սարքեր նրանց համար կոնտեյների սարքի տակ:
- Աջակցում է SR-IOV-ին:
- Ներկայացնում է առանձնահատկությունների սարքի ենթակառուցվածքը, որը վերացականում է ենթաառանձնահատկությունների գործողությունները և ցուցադրում է ընդհանուր գործառույթները գործառույթների սարքերի դրայվերների համար:
PCIe Module Device Driver-ի գործառույթները
- Պարունակում է PCIe հայտնաբերում, սարքի թվարկում և առանձնահատկությունների հայտնաբերում:
- Ստեղծում է sysfs դիրեկտորիաներ մայր սարքի, FPGA կառավարման շարժիչի (FME) և պորտի համար:
- Ստեղծում է պլատֆորմի դրայվերների օրինակներ՝ ստիպելով Linux միջուկը բեռնել իրենց համապատասխան հարթակի մոդուլի դրայվերները:
FME պլատֆորմի մոդուլի սարքի վարորդ
- Էլեկտրաէներգիայի և ջերմային կառավարում, սխալների մասին հաշվետվություն, կատարողականի հաշվետվություն և այլ ենթակառուցվածքային գործառույթներ: Դուք կարող եք մուտք գործել այս գործառույթները sysfs ինտերֆեյսների միջոցով, որոնք ենթարկվում են FME վարորդի կողմից:
- Մասնակի վերակազմավորում: FME դրայվերը գրանցում է FPGA մենեջեր PR ենթահատկանիշի սկզբնավորման ժամանակ; երբ այն ստանում է FPGA_FME_PORT_PR ioctl ձեր կողմից, այն կանչում է ընդհանուր ինտերֆեյսի ֆունկցիան FPGA Manager-ից՝ ավարտելու բիթհոսքի մասնակի վերակազմավորումը դեպի տվյալ նավահանգիստ:
- Նավահանգիստների կառավարում վիրտուալացման համար: FME դրայվերը ներկայացնում է երկու ioctls՝ FPGA_FME_PORT_RELEASE, որոնք ազատում են տվյալ նավահանգիստը PF-ից; և FPGA_FME_PORT_ASSIGN, որը նավահանգիստը վերադարձնում է PF-ին: Երբ նավահանգիստը ազատվում է PF-ից, այն կարող է վերագրվել VF-ին PCIe վարորդի կողմից տրամադրված SR-IOV միջերեսների միջոցով: Լրացուցիչ տեղեկությունների համար տես «FPGA վիրտուալացում»:
FME պլատֆորմի մոդուլի սարքի վարորդի գործառույթները
- Ստեղծում է FME նիշերի սարքի հանգույցը:
- Ստեղծում է FME sysfs files և իրականացնում է FME sysfs file աքսեսուարներ.
- Իրականացնում է FME մասնավոր հատկանիշների ենթավարորդները:
- FME մասնավոր առանձնահատկությունների ենթավարորդներ.
- FME վերնագիր
- Ջերմային կառավարում
- Էլեկտրաէներգիայի կառավարում
- Համաշխարհային սխալ
- Մասնակի վերակազմավորում
- Համաշխարհային կատարում
Port Platform Module Device Driver
FME դրայվերի նման, FPGA Port (և AFU) դրայվերը (intel-fpga-afu. ko) զոնդավորվում է Port պլատֆորմի սարքը ստեղծելուց հետո: Այս մոդուլի հիմնական գործառույթն է ինտերֆեյս տրամադրել օգտատերերի տարածության հավելվածների համար՝ անհատական արագացուցիչներին մուտք գործելու համար, ներառյալ Port-ի հիմնական վերակայման կառավարումը, AFU MMIO տարածաշրջանի արտահանումը, DMA բուֆերային քարտեզագրման ծառայությունը, UMsg(1) ծանուցումը և հեռահար կարգաբերման գործառույթները ( տես վերևում):
UMsg-ն աջակցվում է միայն Acceleration Stack-ի միջոցով Intel Xeon® պրոցեսորի համար՝ ինտեգրված FPGA-ով:
Port Platform Module Device Driver-ի գործառույթները
- Ստեղծում է Port նիշերի սարքի հանգույցը:
- Ստեղծում է Port sysfs-ը files և իրականացնում է Port sysfs-ը file աքսեսուարներ.
- Իրականացնում է Port private feature sub-drivers-ը:
- Նավահանգստի մասնավոր առանձնահատկությունների ենթավարորդներ.
- Նավահանգստի վերնագիր
- AFU
- Պորտի սխալ
- UMsg (2)
- Ազդանշանի թակել
Դիմում FPGA Սարքի թվարկում
Այս բաժինը ներկայացնում է, թե ինչպես են հավելվածները թվարկում FPGA սարքը sysfs հիերարխիայից /sys/class/fpga: Նախկինումampներքևում երկու Intel FPGA սարքեր տեղադրված են հոսթում: Յուրաքանչյուր FPGA սարք ունի մեկ FME և երկու պորտ (AFU): Յուրաքանչյուր FPGA սարքի համար սարքի գրացուցակ է ստեղծվում /sys/class/fpga:
/sys/class/fpga/intel-fpga-dev.0
/sys/class/fpga/intel-fpga-dev.1
Յուրաքանչյուր հանգույց ունի մեկ FME և երկու Ports (AFUs) որպես մանկական սարքեր.
/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
Ընդհանուր առմամբ, FME/Port sysfs միջերեսները կոչվում են հետևյալ կերպ.
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/
հետ ես հաջորդաբար համարակալում եմ բոլոր կոնտեյներային սարքերը, j հաջորդաբար համարակալում եմ FME-ները և k հաջորդաբար համարակալում բոլոր նավահանգիստները:
ioctl()-ի և mmap()-ի համար օգտագործվող սարքի հանգույցները կարող են հղում կատարել հետևյալի միջոցով.
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k
PCIe վարորդների թվարկում
Այս հատվածը տալիս է ավարտview intel-fpga-pci.ko-ի կողմից կատարված սարքերի թվարկման կոդի հոսքը: Նշվում են տվյալների հիմնական կառուցվածքները և գործառույթները: Այս բաժինը լավագույնս հետևվում է, երբ viewուղեկցող կոդով (pcie.c):
Թվարկման տվյալների կառուցվածքներ
enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
ստատիկ կառուցվածք idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *անուն;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
ստատիկ կառուցվածքի դաս *fpga_class;
ստատիկ կառուցվածք 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,}
};
ստատիկ կառուցվածք pci_driver cci_pci_driver = {
.name = DRV_NAME,
.id_table = cci_pcie_id_tbl,
.probe = cci_pci_probe,
.remove = cci_pci_remove,
.sriov_configure = cci_pci_sriov_configure
};
struct cci_drvdata {
int device_id;
struct սարքը *fme_dev;
struct mutex կողպեք;
struct list_head port_dev_list;
int release_port_num;
struct list_head տարածաշրջաններ;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
struct սարքը *parent_dev;
struct platform_device *feature_dev;
};
Թվարկման հոսք
- ccidrv_init ()
- Նախաձեռնեք fpga_ids-ը՝ օգտագործելով idr_init():
- Նախաձեռնեք fpga_chrdevs[i].devt՝ օգտագործելով alloc_chrdev_region():
- Նախաձեռնեք fpga_class-ը՝ օգտագործելով class_create():
- pci_register_driver (&cci_pci_driver);
- cci_pci_probe ()
- Միացրեք PCI սարքը, խնդրեք մուտք գործել նրա տարածաշրջաններ, սահմանեք PCI հիմնական ռեժիմը և կարգավորեք DMA-ն:
- cci_pci_create_feature_devs() build_info_alloc_and_init()
- Հատկացրեք struct build_feature_devs_info, սկզբնավորեք այն:
.parent_dev-ը դրված է որպես մայր sysfs գրացուցակ (intel-fpga-dev.id), որը պարունակում է FME և Port sysfs դիրեկտորիաները:
- Հատկացրեք struct build_feature_devs_info, սկզբնավորեք այն:
- parse_feature_list ()
- Քայլեք BAR0 սարքի առանձնահատկությունների ցանկով՝ բացահայտելու FME-ն, նավահանգիստը և դրանց անձնական հատկությունները:
- parse_feature() parse_feature_afus() parse_feature_fme()
- Երբ հանդիպում է FME.
- build_info_create_dev ()
- Հատկացրեք հարթակ սարքը FME-ի համար, որը պահվում է build_feature_devs_info.feature_dev-ում:
- feature_dev.id-ը սկզբնավորվում է idr_alloc(fpga_ids[FME_ID]) արդյունքի համար,
- feature_dev.parent-ը սահմանված է build_feature_devs_info.parent_dev:
- Կառուցվածքային ռեսուրսների զանգված հատկացրեք feature_dev.resource-ում:
- Հատկացրեք struct feature_platform_data, սկզբնավորեք այն և պահեք ցուցիչը feature_dev.dev.platform_data-ում
- create_feature_instance() build_info_add_sub_feature()
- Նախաձեռնել feature_dev.resource[FME_FEATURE_ID_HEADER]:
- feature_platform_data_add()
- Նախաձեռնել feature_platform_data.features[FME_FEATURE_ID_HEADER], ամեն ինչ, բացի .fops-ից:
- parse_feature() parse_feature_afus() parse_feature_port()
- Երբ նավահանգիստ է հանդիպում.
- build_info_create_dev ()
- Պորտի համար հատկացրեք պլատֆորմ սարք, որը պահվում է build_feature_devs_info.feature_dev-ում:
- feature_dev.id-ը սկզբնավորվում է idr_alloc(fpga_ids[PORT_ID]) արդյունքի համար,
- feature_dev.parent-ը սահմանված է build_feature_devs_info.parent_dev:
- Կառուցվածքային ռեսուրսի զանգված հատկացրեք feature_dev.resource-ում:
- Հատկացրեք struct feature_platform_data, սկզբնավորեք այն և պահեք ցուցիչը feature_dev.dev.platform_data-ում
- build_info_commit_dev ()
- Պորտի համար struct feature_platform_data.node ավելացրեք նավահանգիստների ցանկին cci_drvdata.port_dev_list-ում:
- create_feature_instance() build_info_add_sub_feature()
- Նախաձեռնել feature_dev.resource[PORT_FEATURE_ID_HEADER]:
- feature_platform_data_add()
- Նախաձեռնել feature_platform_data.features[PORT_FEATURE_ID_HEADER], ամեն ինչ, բացի .fops-ից:
- parse_feature() parse_feature_afus() parse_feature_port_uafu()
- Երբ հանդիպում է AFU.
- create_feature_instance() build_info_add_sub_feature()
- Նախաձեռնել feature_dev.resource[PORT_FEATURE_ID_UAFU]:
- feature_platform_data_add()
- Նախաձեռնել feature_platform_data.features[PORT_FEATURE_ID_UAFU], ամեն ինչ, բացի .fops-ից:
- parse_feature() parse_feature_private() parse_feature_fme_private()
- Երբ հանդիպում է FME մասնավոր հատկանիշ՝
- create_feature_instance() build_info_add_sub_feature()
- Նախաձեռնել feature_dev.resource[id]:
- feature_platform_data_add()
- Նախաձեռնել feature_platform_data.features[id], ամեն ինչ, բացի .fops-ից:
- parse_feature() parse_feature_private() parse_feature_port_private()
- Երբ հանդիպում է Պորտի մասնավոր հատկանիշ՝ * create_feature_instance() build_info_add_sub_feature() * Նախնականացնել feature_dev.resource[id]: * feature_platform_data_add() Initialize feature_platform_data.features[id], ամեն ինչ, բացի .fops-ից:
- parse_ports_from_fme()
- Եթե վարորդը բեռնված է Ֆիզիկական ֆունկցիայի (PF) վրա, ապա.
- Գործարկեք parse_feature_list() հոսքը FME վերնագրում նկարագրված յուրաքանչյուր պորտի վրա:
- Օգտագործեք վերնագրի յուրաքանչյուր Port մուտքագրում նշված BAR-ը:
FME պլատֆորմի սարքի սկզբնավորում
Այս հատվածը տալիս է ավարտview FME սարքի սկզբնավորման համար ծածկագրի հոսքը, որն իրականացվում է intel-fpga-fme.ko-ի կողմից: Նշվում են տվյալների հիմնական կառուցվածքները և գործառույթները: Այս բաժինը լավագույնս հետևվում է, երբ viewուղեկցող կոդով (fme-main.c):
FME պլատֆորմի սարքի տվյալների կառուցվածքները
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
երկար (*ioctl)(struct platform_device *pdev, struct feature *feature,
անստորագիր int cmd, անստորագիր երկար arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
կառուցվածքի հատկանիշ {
const char *անուն;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head հանգույց;
struct mutex կողպեք;
չստորագրված երկար dev_status;
struct cdev cdev;
struct platform_device *dev;
չստորագրված int disable_count;
անվավեր *մասնավոր;
միջակայք համար;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_her_port)(struct platform_device *,
void *, int (*match) (struct platform_device *, void *)); կառուցվածք
առանձնահատկությունների առանձնահատկությունները[0];
};
struct perf_object {
int id;
const struct հատկանիշ_խումբ **attr_groups;
struct սարքը *fme_dev;
struct list_head հանգույց;
struct list_head երեխաներ;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct սարքը *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};
FME պլատֆորմի սարքի սկզբնավորման հոսք
FME սկզբնավորման հոսք
- fme_probe() fme_dev_init()
- Նախաձեռնեք fpga_fme կառուցվածքը և պահեք այն feature_platform_data.private դաշտում:
- fme_probe() fpga_dev_feature_init() feature_instance_init()
- Պահպանեք struct feature_ops-ը feature_platform_data.features-ում յուրաքանչյուր բնակեցված հատկանիշի համար:
- Կանչեք փորձարկման գործառույթը, եթե այդպիսիք կան, կառուցվածքից:
- Կանչեք init ֆունկցիան struct-ից:
- fme_probe() fpga_register_dev_ops()
- Ստեղծեք FME նիշերի սարքի հանգույցը՝ գրանցելով կառուցվածք file_գործառնություններ.
Port Platform Device Initialization
Այս հատվածը տալիս է ավարտview intel-fpga-afu.ko-ի կողմից իրականացվող պորտային սարքի սկզբնավորման համար ծածկագրի հոսքը: Նշվում են տվյալների հիմնական կառուցվածքները և գործառույթները: Այս բաժինը լավագույնս հետևվում է, երբ viewուղեկցող կոդով (afu.c):
Port Platform Device Data Structures
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
երկար (*ioctl)(struct platform_device *pdev, struct feature *feature,
անստորագիր int cmd, անստորագիր երկար arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
կառուցվածքի հատկանիշ {
const char *անուն;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head հանգույց;
struct mutex կողպեք;
չստորագրված երկար dev_status;
struct cdev cdev;
struct platform_device *dev;
չստորագրված int disable_count;
անվավեր *մասնավոր;
միջակայք համար;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_her_port)(struct platform_device *,
void *, int (*match) (struct platform_device *, void *));
կառուցվածքի առանձնահատկությունները[0];
};
struct fpga_afu_region {
u32 ինդեքս;
u32 դրոշներ;
u64 չափը;
u64 օֆսեթ;
u64 ֆիզ;
struct list_head հանգույց;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 երկարություն;
u64 iova;
struct page **էջեր;
struct rb_node հանգույց;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head տարածաշրջաններ;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};
Port Platform Device Initialization Flow
Նավահանգստի սկզբնավորման հոսք
- afu_probe() afu_dev_init()
- Նախաձեռնեք fpga_afu կառուցվածքը և պահեք այն feature_platform_data.private դաշտում:
- afu_probe() fpga_dev_feature_init() feature_instance_init()
- Պահպանեք struct feature_ops-ը feature_platform_data.features-ում յուրաքանչյուր բնակեցված հատկանիշի համար:
- Կանչեք փորձարկման գործառույթը, եթե այդպիսիք կան, կառուցվածքից:
- Կանչեք init ֆունկցիան struct-ից:
- afu_probe() fpga_register_dev_ops()
- Ստեղծեք Port նիշերի սարքի հանգույցը՝ գրանցելով կառուցվածք file_գործառնություններ.
FME IOCTLs
IOCTL-ներ, որոնք կանչվում են բաց file /dev/intel-fpga-fme.j-ի նկարագրիչ FPGA_GET_API_VERSION-վերադարձրեք ընթացիկ տարբերակը որպես ամբողջ թիվ՝ սկսած 0-ից:
FPGA_CHECK_EXTENSION — ներկայումս չի աջակցվում:
FPGA_FME_PORT_RELEASE-arg-ը ցուցիչ է դեպի a.
struct fpga_fme_port_release {
__u32 argsz; // մեջ՝ sizeof (struct fpga_fme_port_release)
__u32 դրոշներ; // in: պետք է լինի 0
__u32 port_id; // մեջ՝ պորտի ID (0-ից) թողարկելու համար:
};
FPGA_FME_PORT_ASSIGN-arg-ը ցուցիչ է դեպի a.
struct fpga_fme_port_assign {
__u32 argsz; // մեջ՝ sizeof (struct fpga_fme_port_assign)
__u32 դրոշներ; // in: պետք է լինի 0
__u32 port_id; // մեջ՝ պորտի ID (0-ից) վերագրելու համար: (պետք է լինի
նախկինում թողարկվել է FPGA_FME_PORT_RELEASE-ի կողմից)
};
FPGA_FME_PORT_PR-arg-ը ցուցիչ է դեպի a.
struct fpga_fme_port_pr {
__u32 argsz; // մեջ՝ sizeof (struct fpga_fme_port_pr)
__u32 դրոշներ; // in: պետք է լինի 0
__u32 port_id; // մեջ՝ պորտի ID (0-ից)
__u32 բուֆեր_չափ; // in. բիթ հոսքի բուֆերի չափը բայթերով: Պետք է լինի 4 բայթ
հավասարեցված.
__u64 բուֆեր_հասցե; // in. բիթ հոսքի բուֆերի գործընթացի հասցեն
__u64 կարգավիճակ; // դուրս. սխալի կարգավիճակ (bitmask)
};
Պորտ IOCTLs
IOCTL-ներ, որոնք կանչվում են բաց file նկարագրիչ /dev/intel-fpga-port.k-ի համար FPGA_GET_API_VERSION—վերադարձրեք ընթացիկ տարբերակը որպես ամբողջ թիվ՝ սկսած 0-ից։ FPGA_CHECK_EXTENSION—ներկայումս չի աջակցվում։
FPGA_PORT_GET_INFO-arg-ը ցուցիչ է դեպի a.
struct fpga_port_info {
__u32 argsz; // մեջ՝ sizeof (struct fpga_port_info)
__u32 դրոշներ; // դուրս: վերադարձնում է 0
__u32 num_regions; // դուրս. MMIO շրջանների թիվը, 2 (1-ը AFU-ի և 1-ի համար):
STP)
__u32 num_umsgs; // դուրս. սարքաշարի կողմից աջակցվող UMsg-ների քանակը
};
FPGA_PORT_GET_REGION_INFO-arg-ը ցուցիչ է դեպի a.
struct fpga_port_region_info {
__u32 argsz; // մեջ՝ sizeof (struct fpga_port_region_info)
__u32 դրոշներ; // դուրս. (bitmask) {FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 ինդեքս; // մեջ՝ FPGA_PORT_INDEX_UAFU կամ FPGA_PORT_INDEX_STP
__u32 լիցք; // in: պետք է լինի 0
__u64 չափը; // դուրս. MMIO տարածաշրջանի չափը բայթերով
__u64 օֆսեթ; // դուրս. MMIO տարածաշրջանի օֆսեթ սարքի սկզբից fd
};
FPGA_PORT_DMA_MAP-arg-ը ցուցիչ է դեպի a.
struct fpga_port_dma_map {
__u32 argsz; // մեջ՝ sizeof (struct fpga_port_dma_map)
__u32 դրոշներ; // in: պետք է լինի 0 __u64 user_addr; // in: գործընթացի վիրտուալ
հասցեն։ Պետք է էջը հավասարեցված լինի:
__u64 երկարություն; // in. քարտեզագրման երկարությունը բայթերով: Պետք է լինի էջի բազմապատիկ
չափը։
__u64 iova; // դուրս՝ IO վիրտուալ հասցե };
FPGA_PORT_DMA_UNMAP-arg-ը ցուցիչ է դեպի a.
struct fpga_port_dma_unmap {
__u32 argsz; // մեջ՝ sizeof (struct fpga_port_dma_unmap)
__u32 դրոշներ; // in: պետք է լինի 0
__u64 iova; // in. IO վիրտուալ հասցե վերադարձված նախորդի կողմից
FPGA_PORT_DMA_MAP };
- FPGA_PORT_RESET-arg-ը պետք է լինի NULL:
- FPGA_PORT_UMSG_ENABLE-arg-ը պետք է լինի NULL:
- FPGA_PORT_UMSG_DISABLE-արգերը պետք է լինեն NULL:
FPGA_PORT_UMSG_SET_MODE-arg-ը ցուցիչ է դեպի a.
struct fpga_port_umsg_cfg {
__u32 argsz; // մեջ՝ sizeof (struct fpga_port_umsg_cfg)
__u32 դրոշներ; // in: պետք է լինի 0
__u32 hint_bitmap; // մեջ՝ UMsg ակնարկի ռեժիմի բիթքարտեզ: Նշանակում է, թե որոնք են UMsg-երը
միացված է:
};
FPGA_PORT_UMSG_SET_BASE_ADDR—
- UMsg-ը պետք է անջատված լինի այս ioctl-ի թողարկումից առաջ:
- Iova դաշտը պետք է լինի բոլոր UMsg-ների համար բավականաչափ մեծ բուֆերի համար (num_umsgs * PAGE_SIZE):
- Վարորդի բուֆերի ղեկավարության կողմից բուֆերը նշվում է որպես «օգտագործման մեջ»:
- Եթե iova-ն NULL-ն է, ապա ցանկացած նախկին շրջան չի նշվում որպես «օգտագործվող»:
- arg-ը ցուցիչ է a.
struct fpga_port_umsg_base_addr {- u32 argsz; // մեջ՝ sizeof (struct fpga_port_umsg_base_addr)
- u32 դրոշներ; // in: պետք է լինի 0
- u64 iova; // մեջ՝ IO վիրտուալ հասցե FPGA_PORT_DMA_MAP-ից: };
Նշում.
- Պորտի սխալները մաքրելու համար պետք է գրել ընթացիկ սխալների ճշգրիտ բիտդիմակը, օրինակ.ample, cat սխալներ > պարզ
- UMsg-ն աջակցվում է միայն Acceleration Stack-ի միջոցով Intel Xeon պրոցեսորի համար՝ ինտեգրված FPGA-ով:
sysfs Files
FME վերնագիր sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | mmio դաշտ | տեսակը | մուտք |
ports_num | fme_header.capability.num_ports | տասնորդական միջ | Միայն կարդալու համար |
քեշի_չափս | fme_header.capability.cache_size | տասնորդական միջ | Միայն կարդալու համար |
տարբերակը | fme_header.capability.fabric_verid | տասնորդական միջ | Միայն կարդալու համար |
socket_id | fme_header.capability.socket_id | տասնորդական միջ | Միայն կարդալու համար |
bitstream_id | fme_header.bitstream_id | hex uint64_t | Միայն կարդալու համար |
bitstream_metadata | fme_header.bitstream_md | hex uint64_t | Միայն կարդալու համար |
FME ջերմային կառավարման sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/
sysfs file | mmio դաշտ | տեսակը | մուտք |
շեմ 1 | thermal.threshold.tmp_thshold1 | տասնորդական միջ | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
շեմ 2 | thermal.threshold.tmp_thshold2 | տասնորդական միջ | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
շեմ_ուղևորություն | thermal.threshold.therm_trip_thshold | տասնորդական միջ | Միայն կարդալու համար |
threshold1_reached | thermal.threshold.thshold1_status | տասնորդական միջ | Միայն կարդալու համար |
threshold2_reached | thermal.threshold.thshold2_status | տասնորդական միջ | Միայն կարդալու համար |
threshold1_policy | ջերմային. threshold.thshold_policy | տասնորդական միջ | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
ջերմաստիճանը | thermal.rdsensor_fm1.fpga_temp | տասնորդական միջ | Միայն կարդալու համար |
FME Power Management sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/
sysfs file | mmio դաշտ | տեսակը | մուտք |
սպառված | power.status.pwr_consumed | hex uint64_t | Միայն կարդալու համար |
շեմ 1 | հզորություն.շեմ.շեմ1 | hex uint64_t | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
շեմ 2 | հզորություն.շեմ.շեմ2 | hex uint64_t | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
threshold1_status | power.threshold.threshold1_status | տասնորդական անստորագիր | Միայն կարդալու համար |
threshold2_status | power.threshold.threshold2_status | տասնորդական անստորագիր | Միայն կարդալու համար |
rtl | power.status.fpga_latency_report | տասնորդական անստորագիր | Միայն կարդալու համար |
FME Global Error sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | mmio դաշտ | տեսակը | մուտք |
pcie0_errors | gerror.pcie0_err | hex uint64_t | Կարդալ գրել |
pcie1_errors | gerror.pcie1_err | hex uint64_t | Կարդալ գրել |
inject_error | gerror.ras_error_inj | hex uint64_t | Կարդալ գրել |
intel-fpga-dev.i/intel-fpga-fme.j/errors/fme-errors/
sysfs file | mmio դաշտ | տեսակը | մուտք |
սխալներ | gerror.fme_err | hex uint64_t | Միայն կարդալու համար |
first_error | gerror.fme_first_err.err_reg_status | hex uint64_t | Միայն կարդալու համար |
հաջորդ_սխալ | gerror.fme_next_err.err_reg_status | hex uint64_t | Միայն կարդալու համար |
պարզ | Մաքրում է սխալները, first_error, next_error | տարբեր uint64_t | Միայն գրել |
Նշում.
FME սխալները մաքրելու համար դուք պետք է գրեք ընթացիկ սխալների ճշգրիտ բիտդիմակը, օրինակ.ample cat սխալներ > պարզ.
FME մասնակի վերակազմավորում sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | mmio դաշտ | տեսակը | մուտք |
interface_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | վեցանկյուն 16 բայթ | Միայն կարդալու համար |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
sysfs file | mmio դաշտ | տեսակը | մուտք |
ժամացույց | gperf.clk.afu_interf_clock | hex uint64_t | Միայն կարդալու համար |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Վավերական չէ Acceleration Stack-ի համար Intel Xeon պրոցեսորի համար FPGA-ներով)
sysfs file | mmio դաշտ | տեսակը | մուտք |
սառեցնել | gperf.ch_ctl.freeze | տասնորդական միջ | Կարդալ գրել |
read_hit | gperf.CACHE_RD_HIT | hex uint64_t | Միայն կարդալու համար |
read_miss | gperf.CACHE_RD_MISS | hex uint64_t | Միայն կարդալու համար |
գրել_հարվածել | gperf.CACHE_WR_HIT | hex uint64_t | Միայն կարդալու համար |
գրել_կարոտս | gperf.CACHE_WR_MISS | hex uint64_t | Միայն կարդալու համար |
hold_request | gperf.CACHE_HOLD_REQ | hex uint64_t | Միայն կարդալու համար |
tx_req_stall | gperf.CACHE_TX_REQ_STALL | hex uint64_t | Միայն կարդալու համար |
sysfs file | mmio դաշտ | տեսակը | մուտք |
rx_req_stall | gperf.CACHE_RX_REQ_STALL | hex uint64_t | Միայն կարդալու համար |
data_write_port_contention | gperf.CACHE_DATA_WR_PORT_CONTEN | hex uint64_t | Միայն կարդալու համար |
tag_write_port_contention | gperf.CACHE_TAG_WR_PORT_CONTEN | hex uint64_t | Միայն կարդալու համար |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Վավերական չէ Acceleration Stack-ի համար Intel Xeon CPU-ի համար FPGA-ներով)
sysfs file | mmio դաշտ | տեսակը | մուտք |
սառեցնել | gperf.vtd_ctl.freeze | տասնորդական միջ | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Վավերական չէ Acceleration Stack-ի համար Intel Xeon պրոցեսորի համար FPGA-ներով)
sysfs file | mmio դաշտ | տեսակը | մուտք |
read_transaction | gperf.VTD_AFU0_MEM_RD_TRANS | hex uint64_t | Միայն կարդալու համար |
գրել_գործարք | gperf.VTD_AFU0_MEM_WR_TRANS | hex uint64_t | Միայն կարդալու համար |
tlb_read_hit | gperf.VTD_AFU0_TLB_RD_HIT | hex uint64_t | Միայն կարդալու համար |
tlb_write_hit | gperf.VTD_AFU0_TLB_WR_HIT | hex uint64_t | Միայն կարդալու համար |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/
sysfs file | mmio դաշտ | տեսակը | մուտք |
միացնել | gperf.fab_ctl.(միացված) | տասնորդական միջ | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
սառեցնել | gperf.fab_ctl.freeze | տասնորդական միջ | Օգտվող՝ միայն կարդալու Root՝ կարդալ-գրել |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Միայն կարդալու համար |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Միայն կարդալու համար |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Միայն կարդալու համար |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Միայն կարդալու համար |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Միայն կարդալու համար |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Միայն կարդալու համար |
intel-fpga-ev.i/intel-fpga/fme.j/dperf/fabric/portk/
sysfs file | mmio դաշտ | տեսակը | մուտք |
pcie0_read | gperf.FAB_PCIE0_RD | hex uint64_t | Միայն կարդալու համար |
pcie0_write | gperf.FAB_PCIE0_WR | hex uint64_t | Միայն կարդալու համար |
pcie1_read | gperf.FAB_PCIE1_RD | hex uint64_t | Միայն կարդալու համար |
pcie1_write | gperf.FAB_PCIE1_WR | hex uint64_t | Միայն կարդալու համար |
upi_read | gperf.FAB_UPI_RD | hex uint64_t | Միայն կարդալու համար |
upi_write | gperf.FAB_UPI_WR | hex uint64_t | Միայն կարդալու համար |
Port Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio դաշտ | տեսակը | մուտք |
id | port_header.capability.port_number | տասնորդական միջ | Միայն կարդալու համար |
լտր | port_header.control.latency_tolerance | տասնորդական միջ | Միայն կարդալու համար |
Port AFU Header sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | mmio դաշտ | տեսակը | մուտք |
afu_id | afu_header.guid | վեցանկյուն 16 բայթ | Միայն կարդալու համար |
Պորտի սխալ sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | mmio դաշտ | տեսակը | մուտք |
սխալներ | perrror.port_error | hex uint64_t | Միայն կարդալու համար |
first_error | perrror.port_first_error | hex uint64_t | Միայն կարդալու համար |
first_malformed_req | սարսափ.malreq | վեցանկյուն 16 բայթ | Միայն կարդալու համար |
պարզ | սխալ (բոլոր սխալները) | տարբեր uint64_t | Միայն գրել |
Նշում.
Պորտի սխալները մաքրելու համար դուք պետք է գրեք ընթացիկ սխալների ճշգրիտ բիտդիմակը, օրինակample cat սխալներ > պարզ.
Վերանայման պատմություն
Փաստաթղթի տարբերակը | Փոփոխություններ |
2017.10.02 | Նախնական թողարկում. |
OPAE Intel FPGA Linux սարքի վարորդի ճարտարապետության ուղեցույց
Փաստաթղթեր / ռեսուրսներ
![]() |
intel OPAE FPGA Linux սարքի վարորդի ճարտարապետություն [pdf] Օգտագործողի ուղեցույց OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |