intel-լոգոն

intel OPAE FPGA Linux սարքի վարորդի ճարտարապետություն

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

OPAE Intel FPGA Linux սարքի վարորդի ճարտարապետություն

OPAE Intel FPGA դրայվերը ինտերֆեյսներ է տրամադրում օգտագործողի տարածության հավելվածների համար՝ կարգավորելու, թվարկելու, բացելու և մուտք գործելու FPGA արագացուցիչներ Intel FPGA լուծումներով հագեցած հարթակներում և հնարավորություն է տալիս համակարգի մակարդակի կառավարման գործառույթները, ինչպիսիք են FPGA-ի վերակազմավորումը, էներգիայի կառավարումը և վիրտուալացումը:

Սարքավորումների ճարտարապետություն

ՕՀ-ի տեսանկյունից view, FPGA սարքավորումը հայտնվում է որպես սովորական PCIe սարք։ FPGA սարքի հիշողությունը կազմակերպվում է՝ օգտագործելով կանխորոշված ​​տվյալների կառուցվածքը (Device Feature List): FPGA սարքի կողմից աջակցվող առանձնահատկությունները բացահայտվում են այս տվյալների կառուցվածքների միջոցով, ինչպես ցույց է տրված ստորև՝ հետևյալ նկարում.

FPGA PCIe սարք

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

Վարորդն աջակցում է PCIe SR-IOV-ին՝ ստեղծելու Վիրտուալ գործառույթներ (VF), որոնք կարող են օգտագործվել վիրտուալ մեքենաներին անհատական ​​արագացուցիչներ նշանակելու համար:

Intel կորպորացիա. Բոլոր իրավունքները պաշտպանված են: Intel-ը, Intel-ի պատկերանշանը և Intel այլ նշանները Intel Corporation-ի կամ նրա դուստր ձեռնարկությունների ապրանքանիշերն են: Intel-ը երաշխավորում է իր FPGA-ի և կիսահաղորդչային արտադրանքների կատարումը ընթացիկ բնութագրերին համապատասխան՝ Intel-ի ստանդարտ երաշխիքին համապատասխան, սակայն իրեն իրավունք է վերապահում փոփոխություններ կատարել ցանկացած ապրանքի և ծառայությունների մեջ ցանկացած պահի առանց նախազգուշացման: Intel-ը չի ստանձնում ոչ մի պատասխանատվություն կամ պատասխանատվություն, որը բխում է սույն հոդվածում նկարագրված որևէ տեղեկատվության, արտադրանքի կամ ծառայության կիրառումից կամ օգտագործումից, բացառությամբ այն դեպքերի, որոնց մասին հստակ գրավոր համաձայնեցված է Intel-ի կողմից: Intel-ի հաճախորդներին խորհուրդ է տրվում ձեռք բերել սարքի տեխնիկական բնութագրերի վերջին տարբերակը՝ նախքան որևէ հրապարակված տեղեկատվության վրա հիմնվելը և ապրանքների կամ ծառայությունների պատվերներ կատարելը:

Այլ անուններ և ապրանքանիշեր կարող են պահանջվել որպես ուրիշների սեփականություն:

Վիրտուալացված FPGA PCIe սարք

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

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 մուտք գործող ցանկացած ծրագրային ծրագիր, ներառյալ վիրտուալացված հոսթինգում աշխատող ծրագրերը, պետք է փակվեն՝ նախքան մասնակի վերակազմավորումը փորձելը: Քայլերը կլինեն.

  1. Վարորդին բեռնաթափել հյուրից
  2. Անջատեք VF-ը հյուրից
  3. Անջատել SR-IOV-ը
  4. Կատարեք մասնակի վերակազմավորում
  5. Միացնել SR-IOV-ը
  6. Միացրեք VF-ը հյուրին
  7. Վարորդին բեռնեք հյուրի մեջ

FPGA վիրտուալացում
VM-ում աշխատող հավելվածներից արագացուցիչ մուտք գործելու համար անհրաժեշտ է, որ համապատասխան AFU-ի պորտը վերագրվի VF-ին՝ օգտագործելով հետևյալ քայլերը.

  1. PF-ին են պատկանում բոլոր AFU նավահանգիստները լռելյայնորեն: Ցանկացած նավահանգիստ, որը պետք է վերանշանակվի VF-ին, նախ պետք է ազատվի PF-ից FME սարքի FPGA_FME_PORT_RELEASE ioctl-ի միջոցով:
  2. Երբ N նավահանգիստները ազատվեն PF-ից, ստորև նշված հրամանը կարող է օգտագործվել SRIOV-ը և VF-ները միացնելու համար: Յուրաքանչյուր VF-ն ունի միայն մեկ նավահանգիստ AFU-ի հետ: echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Անցնել VF-ների միջոցով VM-ներին:
  4. VF-ի տակ գտնվող AFU-ն հասանելի է VM-ի հավելվածներից (օգտագործելով նույն դրայվերը VF-ի ներսում):

Նշում.
FME-ը չի կարող վերագրվել VF-ին, հետևաբար PR-ը և կառավարման այլ գործառույթները հասանելի են միայն PF-ի միջոցով:

Վարորդների կազմակերպություն

PCIe Module Device Driver

Վարորդների կազմակերպություն

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

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 դիրեկտորիաները:
  • 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 սկզբնավորման հոսքintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • 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

Նավահանգստի սկզբնավորման հոսքintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • 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

Հղումներ

Թողնել մեկնաբանություն

Ձեր էլփոստի հասցեն չի հրապարակվի: Պարտադիր դաշտերը նշված են *