intel-logo

Intel Pensaernïaeth Gyrrwr Dyfais Linux OPAE FPGA

intel-OPAE-FPGA-Linux-Device-Driver-Pensaernïaeth-cynnyrch

Pensaernïaeth Gyrrwr Dyfais Linux OPAE Intel FPGA

Mae gyrrwr OPAE Intel FPGA yn darparu rhyngwynebau ar gyfer cymwysiadau gofod defnyddiwr i ffurfweddu, rhifo, agor, a chael mynediad at gyflymwyr FPGA ar lwyfannau sydd â datrysiadau Intel FPGA ac yn galluogi swyddogaethau rheoli lefel system fel ad-drefnu FPGA, rheoli pŵer, a rhithwiroli.

Pensaernïaeth Caledwedd

O bwynt yr OS o view, mae caledwedd FPGA yn ymddangos fel dyfais PCIe rheolaidd. Trefnir cof dyfais FPGA gan ddefnyddio strwythur data wedi'i ddiffinio ymlaen llaw (Rhestr Nodweddion Dyfais). Mae nodweddion a gefnogir gan ddyfais FPGA yn cael eu hamlygu trwy'r strwythurau data hyn, fel y dangosir isod yn y ffigur canlynol:

Dyfais PCIe FPGA

intel-OPAE-FPGA-Linux-Device-Driver-Pensaernïaeth-ffig- (1)

Mae'r gyrrwr yn cefnogi PCIe SR-IOV i greu Swyddogaethau Rhithwir (VFs) y gellir eu defnyddio i aseinio cyflymyddion unigol i beiriannau rhithwir.

Intel Gorfforaeth. Cedwir pob hawl. Mae Intel, logo Intel, a nodau Intel eraill yn nodau masnach Intel Corporation neu ei is-gwmnïau. Mae Intel yn gwarantu perfformiad ei gynhyrchion FPGA a lled-ddargludyddion i fanylebau cyfredol yn unol â gwarant safonol Intel ond mae'n cadw'r hawl i wneud newidiadau i unrhyw gynhyrchion a gwasanaethau ar unrhyw adeg heb rybudd. Nid yw Intel yn cymryd unrhyw gyfrifoldeb nac atebolrwydd sy'n deillio o gymhwyso neu ddefnyddio unrhyw wybodaeth, cynnyrch neu wasanaeth a ddisgrifir yma ac eithrio fel y cytunwyd yn benodol yn ysgrifenedig gan Intel. Cynghorir cwsmeriaid Intel i gael y fersiwn ddiweddaraf o fanylebau dyfeisiau cyn dibynnu ar unrhyw wybodaeth gyhoeddedig a chyn archebu cynhyrchion neu wasanaethau.

Gellir hawlio enwau a brandiau eraill fel eiddo eraill.

Dyfais PCIe FPGA rhithwir

intel-OPAE-FPGA-Linux-Device-Driver-Pensaernïaeth-ffig- (2)

Peiriant Rheoli FPGA (FME)
Mae Peiriant Rheoli FPGA yn cyflawni rheolaeth pŵer a thermol, adrodd ar gamgymeriadau, ailgyflunio, adrodd ar berfformiad, a swyddogaethau seilwaith eraill. Mae gan bob FPGA un FME, y gellir ei gyrchu bob amser trwy'r Swyddogaeth Gorfforol (PF). Gall cymwysiadau gofod defnyddiwr gael mynediad unigryw i'r FME gan ddefnyddio Open(), a'i ryddhau gan ddefnyddio Close() fel defnyddiwr breintiedig (gwraidd).

Porthladd
Mae Porthladd yn cynrychioli'r rhyngwyneb rhwng y ffabrig FPGA statig (y “Rheolwr Rhyngwyneb FPGA (FIM)”) a rhanbarth y gellir ei ailgyflunio'n rhannol sy'n cynnwys Swyddogaeth Cyflymydd (AF). Mae'r Porthladd yn rheoli'r cyfathrebu o feddalwedd i'r cyflymydd ac yn datgelu nodweddion fel ailosod a dadfygio. Efallai y bydd gan ddyfais PCIe sawl Porthladd, a gall pob Porthladd gael ei amlygu trwy VF trwy ei aseinio gan ddefnyddio'r FPGA_FME_PORT_ASSIGN ioctl ar y ddyfais FME.

Uned Swyddogaeth Cyflymydd (FfG).

  • Mae Uned Swyddogaeth Cyflymydd (AF) ynghlwm wrth Borthladd ac yn datgelu rhanbarth MMIO 256K i'w ddefnyddio ar gyfer cofrestrau rheoli cyflymydd-benodol.
  • Gall cymwysiadau gofod defnyddiwr gael mynediad unigryw i AFU sydd ynghlwm wrth Borthladd trwy ddefnyddio Open() ar y ddyfais Port, a'i ryddhau gan ddefnyddio close().
  • Gall cymwysiadau gofod defnyddiwr hefyd mmap() cyflymydd rhanbarthau MMIO.

Ailgyflunio Rhannol
Fel y soniwyd uchod, gellir ad-drefnu cyflymyddion trwy ail-gyflunio swyddogaeth Cyflymydd (FfG) yn rhannol. file. Mae'n rhaid bod y Swyddogaeth Cyflymydd (FfG) wedi'i chynhyrchu ar gyfer union FIM a rhanbarth sefydlog wedi'i dargedu (Porthladd) y FPGA; fel arall, bydd y gweithrediad ailgyflunio yn methu ac o bosibl yn achosi ansefydlogrwydd system. Gellir gwirio'r cydweddoldeb hwn trwy gymharu'r ID rhyngwyneb a nodir ym mhennyn y FfG â'r ID rhyngwyneb a ddatgelwyd gan yr FME trwy sysfs. Mae'r gwiriad hwn fel arfer yn cael ei wneud gan ofod defnyddiwr cyn galw'r ailgyfluniad IOCTL.

Nodyn:
Ar hyn o bryd, rhaid cau unrhyw raglen feddalwedd sy'n cyrchu'r FPGA, gan gynnwys y rhai sy'n rhedeg mewn gwesteiwr rhithwir, cyn ceisio ailgyflunio rhannol. Y camau fyddai:

  1. Dadlwythwch y gyrrwr o'r gwestai
  2. Tynnwch y plwg o'r VF o'r gwestai
  3. Analluogi SR-IOV
  4. Perfformio ad-drefnu rhannol
  5. Galluogi SR-IOV
  6. Plygiwch y VF i'r gwestai
  7. Llwythwch y gyrrwr yn y gwestai

Rhithwiroli FPGA
Er mwyn galluogi cyrchu cyflymydd o gymwysiadau sy'n rhedeg mewn VM, mae angen neilltuo porthladd yr AFU priodol i VF gan ddefnyddio'r camau canlynol:

  1. Mae'r PF yn berchen ar holl borthladdoedd AFU yn ddiofyn. Rhaid i unrhyw borth y mae angen ei ailbennu i VF gael ei ryddhau yn gyntaf o'r PF trwy'r ioctl FPGA_FME_PORT_RELEASE ar y ddyfais FME.
  2. Unwaith y bydd porthladdoedd N yn cael eu rhyddhau o'r PF, gellir defnyddio'r gorchymyn isod i alluogi SRIOV a VFs. Mae pob VF yn berchen ar un porthladd yn unig gydag AFU. adlais N > PCI_DEVICE_PATH/sriov_numvfs
  3. Ewch drwy'r VFs i VMs.
  4. Mae'r AFU o dan VF ar gael o gymwysiadau yn VM (gan ddefnyddio'r un gyrrwr y tu mewn i'r VF).

Nodyn:
Ni ellir neilltuo FME i VF, felly dim ond drwy'r PF y mae swyddogaethau cysylltiadau cyhoeddus a rheoli eraill ar gael.

Sefydliad Gyrwyr

Gyrrwr Dyfais Modiwl PCIe

Sefydliad Gyrwyr

intel-OPAE-FPGA-Linux-Device-Driver-Pensaernïaeth-ffig- (3)

Mae'r dyfeisiau FPGA yn ymddangos fel dyfeisiau PCIe rheolaidd; felly, mae gyrrwr dyfais FPGA PCIe (intel-FPGA-PCI.ko) bob amser yn cael ei lwytho'n gyntaf unwaith y canfyddir FPGA PCIe PF neu VF. Mae'r gyrrwr hwn yn chwarae rhan seilwaith ym mhensaernïaeth y gyrrwr. Mae'n:

  • Yn creu dyfais cynhwysydd FPGA fel rhiant y dyfeisiau nodwedd.
  • Yn cerdded trwy'r Rhestr Nodweddion Dyfais, sy'n cael ei weithredu mewn cof BAR dyfais PCIe, i ddarganfod dyfeisiau nodwedd a'u his-nodweddion a chreu dyfeisiau platfform ar eu cyfer o dan y ddyfais cynhwysydd.
  • Yn cefnogi SR-IOV.
  • Yn cyflwyno'r seilwaith dyfais nodwedd, sy'n crynhoi gweithrediadau ar gyfer is-nodweddion ac yn datgelu swyddogaethau cyffredin i yrwyr dyfais nodwedd.

Swyddogaethau Gyrrwr Dyfais Modiwl PCIe

  • Yn cynnwys darganfyddiad PCIe, cyfrif dyfais, a darganfod nodwedd.
  • Yn creu cyfeiriaduron sysfs ar gyfer y ddyfais rhiant, FPGA Management Engine (FME), a Port.
  • Yn creu'r achosion gyrrwr platfform, gan achosi i'r cnewyllyn Linux lwytho eu gyrwyr modiwl platfform priodol.

Gyrrwr Dyfais Modiwl Llwyfan FME

  • Rheoli pŵer a thermol, adrodd ar gamgymeriadau, adrodd ar berfformiad, a swyddogaethau seilwaith eraill. Gallwch gael mynediad at y swyddogaethau hyn trwy ryngwynebau sysfs a ddatgelir gan y gyrrwr FME.
  • Ailgyflunio Rhannol. Mae'r gyrrwr FME yn cofrestru Rheolwr FPGA yn ystod cychwyniad is-nodwedd PR; unwaith y bydd yn derbyn ioctl FPGA_FME_PORT_PR gennych chi, mae'n galw ar y swyddogaeth rhyngwyneb cyffredin gan Reolwr FPGA i gwblhau'r ad-drefnu rhannol o'r llif did i'r Porth a roddir.
  • Rheoli porthladdoedd ar gyfer rhithwiroli. Mae'r gyrrwr FME yn cyflwyno dau ioctls, FPGA_FME_PORT_RELEASE, sy'n rhyddhau'r Porth a roddir o PF; a FPGA_FME_PORT_ASSIGN, sy'n aseinio'r Porth yn ôl i PF. Unwaith y bydd y Porthladd yn cael ei ryddhau o'r PF, gellir ei neilltuo i'r VF trwy'r rhyngwynebau SR-IOV a ddarperir gan y gyrrwr PCIe. Am ragor o wybodaeth, cyfeiriwch at “FPGA Virtualization”.

Swyddogaethau Gyrrwr Dyfais Modiwl Llwyfan FME

  • Yn creu nod dyfais nodau FME.
  • Yn creu'r sysfs FME files ac yn gweithredu'r sysfs FME file mynediadwyr.
  • Yn gweithredu'r is-yrwyr nodwedd breifat FME.
  • Is-yrwyr nodwedd breifat FME:
    • Pennawd FME
    • Rheolaeth Thermol
    • Rheoli Pŵer
    • Gwall Byd-eang
    • Ailgyflunio Rhannol
    • Perfformiad Byd-eang

Gyrrwr Dyfais Modiwl Llwyfan Porthladd
Yn debyg i'r gyrrwr FME, caiff gyrrwr FPGA Port (ac AFU) (intel-fpga-afu. ko) ei archwilio unwaith y bydd dyfais platfform Port yn cael ei chreu. Prif swyddogaeth y modiwl hwn yw darparu rhyngwyneb ar gyfer cymwysiadau gofod defnyddiwr i gael mynediad at y cyflymyddion unigol, gan gynnwys rheolaeth ailosod sylfaenol ar Port, allforio rhanbarth AFU MMIO, gwasanaeth mapio byffer DMA, hysbysiad UMsg(1), a swyddogaethau dadfygio o bell ( gweler uchod).

Dim ond trwy Acceleration Stack ar gyfer Prosesydd Intel Xeon® gyda FPGA Integredig y cefnogir UMsg.

Swyddogaethau Gyrrwr Dyfais Modiwl Llwyfan Porthladd

  • Yn creu nod dyfais cymeriad Port.
  • Yn creu'r sysfs Port files ac yn gweithredu'r sysfs Port file mynediadwyr.
  • Yn gweithredu is-yrwyr nodwedd breifat Port.
  • Porthladd is-yrwyr nodwedd breifat:
    • Pennawd Porthladd
    • AFU
    • Gwall Porth
    • UMsg(2)
    • Tap Signal

Cais Rhif Dyfais FPGA
Mae'r adran hon yn cyflwyno sut mae cymwysiadau'n rhifo'r ddyfais FPGA o'r hierarchaeth sysfs o dan /sys/class/fpga. Yn y cynampIsod, mae dau ddyfais Intel FPGA wedi'u gosod yn y gwesteiwr. Mae gan bob dyfais FPGA un FME a dau Borthladd (AFU). Ar gyfer pob dyfais FPGA, crëir cyfeiriadur dyfais o dan / sys/class/fpga:

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

Mae gan bob nod un FME a dau Borthladd (AFUs) fel dyfeisiau plant:
/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

Yn gyffredinol, enwir y rhyngwynebau FME/Port sysfs fel a ganlyn:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

ac yr wyf yn rhifo'r holl ddyfeisiau cynwysyddion yn olynol, j yn rhifo'r FME's yn olynol ac k yn rhifo'r holl Borthladdoedd yn olynol.

Gellir cyfeirio at y nodau dyfais a ddefnyddir ar gyfer ioctl () a mmap () trwy:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Rhif Gyrwyr PCIe
Mae'r adran hon yn rhoi gormodview o'r llif cod ar gyfer cyfrifo dyfeisiau a berfformir gan intel-fpga-pci.ko. Amlygir y prif strwythurau data a swyddogaethau. Mae'n well dilyn yr adran hon pryd viewing y cod ffynhonnell sy'n cyd-fynd (pcie.c).

Strwythurau Data Rhif

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
strwythur statig idr fpga_ids[FPGA_ID_MAX];
strwythur fpga_chardev_info {
torgoch const *enw;
dev_t devt;
};
strwythur fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME } ,
{ .name = FPGA_FEATURE_DEV_PORT } ,
};
dosbarth strwythur statig *fpga_class;
strwythur statig 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,}
};
strwythur statig 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
};
strwythur cci_drvdata {
int device_id;
dyfais strwythur *fme_dev;
struct clo mutex;
struct list_head port_dev_list;
int released_port_num;
strwythuro rhanbarthau list_head;
};
strwythuro build_feature_devs_info {
strwythur pci_dev *pdev;
gwag __iomem *ioaddr;
gwag __iomem *ioend;
int current_bar;
gwag __iomem *pfme_hdr;
dyfais strwythur *parent_dev;
strwythuro platform_device *feature_dev;
};

Llif Rhif

  • ccidrv_init()
    • Cychwyn fpga_ids gan ddefnyddio idr_init().
    • Cychwyn fpga_chrdevs[i].devt gan ddefnyddio alloc_chrdev_region().
    • Cychwyn fpga_class gan ddefnyddio class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Galluogi'r ddyfais PCI, gofyn am fynediad i'w ranbarthau, gosod prif fodd PCI, a ffurfweddu DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Dyrannu struct build_feature_devs_info, ei gychwyn.
      Mae .parent_dev wedi'i osod i gyfeiriadur sysfs rhiant (intel-fpga-dev.id) sy'n cynnwys y cyfeiriaduron FME a Port sysfs.
  • dosrannu_nodwedd_rhestr()
    • Cerddwch ar Restr Nodweddion Dyfeisiau BAR0 i ddarganfod y FME, y Porthladd, a'u nodweddion preifat.
  • dosrannu_feature() dosrannu_feature_afus() parse_feature_fme()
    • Pan deuir ar draws FME:
  • adeiladu_info_creu_dev()
    • Neilltuo dyfais platfform ar gyfer y FME, gan storio build_feature_devs_info.feature_dev.
    • nodwedd_dev.id wedi'i gychwyn i ganlyniad idr_alloc(fpga_ids[FME_ID],
    • Mae feature_dev.parent wedi'i osod i build_feature_devs_info.parent_dev.
    • Neilltuo amrywiaeth o adnoddau strwythur yn feature_dev.resource.
  • Dyrannu nodwedd_platform_data struct, ei gychwyn, a storio pwyntydd yn nodwedd_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Cychwyn nodwedd_dev.resource[FME_FEATURE_ID_HEADER].
    • nodwedd_platform_data_ychwanegu()
    • Cychwyn nodwedd_platform_data.features[FME_FEATURE_ID_HEADER], popeth ond .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Pan deuir ar draws Porthladd:
  • adeiladu_info_creu_dev()
    • Neilltuo dyfais llwyfan ar gyfer y Porth, storio yn build_feature_devs_info.feature_dev.
    • nodwedd_dev.id wedi'i gychwyn i ganlyniad idr_alloc(fpga_ids[PORT_ID],
    • Mae feature_dev.parent wedi'i osod i build_feature_devs_info.parent_dev.
    • Neilltuo amrywiaeth o adnoddau strwythur yn feature_dev.resource.
    • Dyrannu nodwedd_platform_data struct, ei gychwyn, a storio pwyntydd yn nodwedd_dev.dev.platform_data
  • adeiladu_info_commit_dev()
    • Ychwanegwch y nodwedd struct_platform_data.node ar gyfer y Porth i'r rhestr o Borthladdoedd yn struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Cychwyn nodwedd_dev.resource[PORT_FEATURE_ID_HEADER].
  • nodwedd_platform_data_ychwanegu()
    • Cychwyn nodwedd_platform_data.features[PORT_FEATURE_ID_HEADER], popeth ond .fops.
  • dosrannu_feature() dosrannu_feature_afus() parse_feature_port_uafu()
    • Pan deuir ar draws AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Cychwyn nodwedd_dev.resource[PORT_FEATURE_ID_UAFU].
  • nodwedd_platform_data_ychwanegu()
    • Cychwyn nodwedd_platform_data.features[PORT_FEATURE_ID_UAFU], popeth ond .fops.
  • dosrannu_feature() dosrannu_feature_private() parse_feature_fme_private()
    • Pan deuir ar draws nodwedd breifat FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Cychwyn nodwedd_dev.resource[id].
  • nodwedd_platform_data_ychwanegu()
    • Cychwyn nodwedd_platform_data.features[id], popeth ond .fops.
  • parse_feature() dosrannu_feature_private() parse_feature_port_private()
  • Pan deuir ar draws nodwedd breifat Port: * create_feature_instance() build_info_add_sub_feature() * Cychwyn nodwedd_dev.resource[id]. * feature_platform_data_add() Cychwyn nodwedd_platform_data.features[id], popeth ond .fops.
  • dosrannu_porthoedd_o_fme()
    • Os yw'r gyrrwr wedi'i lwytho ar y Swyddogaeth Gorfforol (PF), yna:
  • Rhedeg y llif parse_feature_list() ar bob porth a ddisgrifir yn y pennyn FME.
  • Defnyddiwch y BAR a grybwyllir ym mhob cofnod Porthladd yn y pennyn.

Cychwyn Dyfais Llwyfan FME
Mae'r adran hon yn rhoi gormodview o'r llif cod ar gyfer cychwyn dyfais FME a gyflawnir gan intel-fpga-fme.ko. Mae'r prif strwythurau data a swyddogaethau wedi'u hamlygu. Mae'n well dilyn yr adran hon pryd viewy cod ffynhonnell sy'n cyd-fynd (fme-main.c).

Strwythurau Data Dyfais Llwyfan FME

strwythuro nodwedd_ops {
int (*init)(struct platform_device *pdev, struct nodwedd * nodwedd);
int (* uinit)(struct platform_device *pdev, struct nodwedd * nodwedd);
hir (* ioctl) (struct platform_device *pdev, nodwedd strwythur * nodwedd,
int cmd heb ei arwyddo, arg hir heb ei arwyddo);
int (*prawf)(struct platform_device *pdev, nodwedd strwythur * nodwedd);
};
nodwedd strwythur {
torgoch const *enw;
int resource_index;
gwag __iomem *ioaddr;
strwythuro feature_ops *ops;
};
strwythuro nodwedd_platform_data {
struct nod list_head;
struct clo mutex;
dev_status hir heb ei lofnodi;
struct cdev cdev;
struct platform_device *dev;
int disable_count heb ei lofnodi;
gwag *preifat;
int num;
int (*config_port)(struct platform_device *, u32, bool);
strwythuro platform_device *(* fpga_for_each_port)(struct platform_device *,
gwagle *, int (*match)(struct platform_device *, gwag *)); strwythur
nodweddion nodwedd[0];
};
strwythuro perf_object {
id id;
const struct attribute_group **attr_groups;
dyfais strwythur *fme_dev;
struct nod list_head;
struct list_head plant;
struct kobject kobj;
};
strwythur fpga_fme {
u8 porth_id;
u64 pr_err;
dyfais strwythur *dev_err;
strwythuro perf_object *perf_dev;
strwythuro nodwedd_platform_data *pdata;
};

Llif Cychwyn Dyfais Llwyfan FME

Llif Cychwynnol FMEintel-OPAE-FPGA-Linux-Device-Driver-Pensaernïaeth-ffig- (4)

  • fme_probe() fme_dev_init()
    • Cychwynnwch strwythur fpga_fme a'i storio yn y maes feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Cadwch nodwedd_ops struct yn y feature_platform_data.features ar gyfer pob nodwedd boblog.
    • Ffoniwch y swyddogaeth prawf, os o gwbl, o'r strwythur.
    • Ffoniwch y swyddogaeth init o'r strwythur.
  • fme_probe() fpga_register_dev_ops()
    • Creu nod dyfais nodau FME, gan gofrestru strwythur file_gweithrediadau.

Cychwyn Dyfais Llwyfan Porthladd
Mae'r adran hon yn rhoi gormodview o'r llif cod ar gyfer cychwyn dyfais porthladd a berfformir gan intel-fpga-afu.ko. Amlygir y prif strwythurau data a swyddogaethau. Mae'n well dilyn yr adran hon pryd viewing y cod ffynhonnell sy'n cyd-fynd (afu.c).

Strwythurau Data Dyfais Llwyfan Porthladd

strwythuro nodwedd_ops {
int (*init)(struct platform_device *pdev, struct nodwedd * nodwedd);
int (* uinit)(struct platform_device *pdev, struct nodwedd * nodwedd);
hir (* ioctl) (struct platform_device *pdev, nodwedd strwythur * nodwedd,
int cmd heb ei arwyddo, arg hir heb ei arwyddo);
int (*prawf)(struct platform_device *pdev, nodwedd strwythur * nodwedd);
};
nodwedd strwythur {
torgoch const *enw;
int resource_index;
gwag __iomem *ioaddr;
strwythuro feature_ops *ops;
};
strwythuro nodwedd_platform_data {
struct nod list_head;
struct clo mutex;
dev_status hir heb ei lofnodi;
struct cdev cdev;
struct platform_device *dev;
int disable_count heb ei lofnodi;
gwag *preifat;
int num;
int (*config_port)(struct platform_device *, u32, bool);
strwythuro platform_device *(* fpga_for_each_port)(struct platform_device *,
gwagle *, int (*match)(struct platform_device *, gwag *));
strwythuro nodweddion nodwedd[0];
};
strwythur fpga_afu_region {
mynegai u32;
u32 baneri;
maint u64;
gwrthbwyso u64;
u64 phys;
struct nod list_head;
};
strwythur fpga_afu_dma_region {
u64 defnyddiwr_addr;
u64 hyd;
u64 iova;
strwythuro tudalen **tudalennau;
strwythur rb_node nod;
bool in_use;
};
strwythur fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
strwythuro rhanbarthau list_head;
strwythuro rb_root dma_regions;
strwythuro nodwedd_platform_data *pdata;
};

Llif Cychwyn Dyfais Llwyfan Porthladd

Llif Cychwyn Porthladdintel-OPAE-FPGA-Linux-Device-Driver-Pensaernïaeth-ffig- (5)

  • afu_probe() afu_dev_init()
    • Cychwynnwch strwythur fpga_afu a'i storio yn y maes feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Cadwch nodwedd_ops struct yn y feature_platform_data.features ar gyfer pob nodwedd boblog.
    • Ffoniwch y swyddogaeth prawf, os o gwbl, o'r strwythur.
    • Ffoniwch y swyddogaeth init o'r strwythur.
  • afu_probe() fpga_register_dev_ops()
    • Creu nod dyfais cymeriad Port, gan gofrestru strwythur file_gweithrediadau.

IOCTLs FME
IOCTLs sy'n cael eu galw ar agor file disgrifydd ar gyfer /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—dychwelwch y fersiwn gyfredol fel cyfanrif, gan ddechrau o 0.

FPGA_CHECK_EXTENSION - heb ei gefnogi ar hyn o bryd.

FPGA_FME_PORT_RELEASE—mae arg yn bwyntydd i:

strwythuro fpga_fme_port_release {
__u32 argsz; // yn: sizeof (strwythur fpga_fme_port_release)
__u32 baneri; // mewn : rhaid fod 0
__u32 porthladd_id; // yn: ID porthladd (o 0) i ryddhau.
};

FPGA_FME_PORT_ASSIGN — mae arg yn bwyntydd i:

strwythuro fpga_fme_port_assign {
__u32 argsz; // yn: sizeof (strwythur fpga_fme_port_assign)
__u32 baneri; // mewn : rhaid fod 0
__u32 porthladd_id; // yn: ID porthladd (o 0) i neilltuo. (rhaid bod
a ryddhawyd yn flaenorol gan FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR — mae arg yn bwyntydd i:

strwythur fpga_fme_port_pr {
__u32 argsz; // yn: sizeof (strwythur fpga_fme_port_pr)
__u32 baneri; // mewn : rhaid fod 0
__u32 porthladd_id; // yn: ID porthladd (o 0)
__u32 byffer_size; // in: maint byffer bitstream mewn bytes. Rhaid bod yn 4-beit
alinio.
__u64 cyfeiriad byffer; // yn: cyfeiriad proses y byffer bitstream
statws __u64; // allan: statws gwall (bitmask)
};

Porthladd IOCTLs
IOCTLs sy'n cael eu galw ar agor file disgrifydd ar gyfer /dev/intel-fpga-port.k FPGA_GET_API_VERSION—dychwelwch y fersiwn gyfredol fel cyfanrif, gan ddechrau o 0. FPGA_CHECK_EXTENSION - heb ei gynnal ar hyn o bryd.

FPGA_PORT_GET_INFO — mae arg yn bwyntydd i:

strwythur fpga_port_info {
__u32 argsz; // yn: sizeof (strwythur fpga_port_info)
__u32 baneri; // allan: yn dychwelyd 0
__u32 num_rhanbarthau; // allan: nifer y rhanbarthau MMIO, 2 (1 ar gyfer AFU ac 1 ar gyfer
STP)
__u32 num_umsgs; // allan: nifer y UMsg's a gefnogir gan y caledwedd
};

FPGA_PORT_GET_REGION_INFO — mae arg yn bwyntydd i:

strwythuro fpga_port_region_info {
__u32 argsz; // yn: sizeof (strwythur fpga_port_region_info)
__u32 baneri; // allan: (masg did) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
mynegai __u32; // yn: FPGA_PORT_INDEX_UAFU neu FPGA_PORT_INDEX_STP
padin __u32; // mewn : rhaid fod 0
maint __u64; // allan: maint y rhanbarth MMIO mewn bytes
__u64 gwrthbwys; // allan: gwrthbwyso rhanbarth MMIO o ddechrau'r ddyfais fd
};

FPGA_PORT_DMA_MAP — mae arg yn bwyntydd i:
strwythur fpga_port_dma_map {
__u32 argsz; // yn: sizeof (strwythur fpga_port_dma_map)
__u32 baneri; // mewn: rhaid bod yn 0 __u64 user_addr; // in: proses rhithwir
cyfeiriad. Rhaid alinio tudalen.
__u64 hyd; // in: hyd y mapio mewn bytes. Rhaid bod yn lluosrif o dudalen
maint.
__u64 iova; // allan: IO cyfeiriad rhithwir };

FPGA_PORT_DMA_UNMAP — mae arg yn bwyntydd i:
strwythur fpga_port_dma_unmap {
__u32 argsz; // yn: sizeof (strwythur fpga_port_dma_unmap)
__u32 baneri; // mewn : rhaid fod 0
__u64 iova; // in: IO cyfeiriad rhithwir wedi'i ddychwelyd gan un blaenorol
FPGA_PORT_DMA_MAP } ;

  • FPGA_PORT_RESET—Rhaid i arg fod yn NULL.
  • FPGA_PORT_UMSG_ENABLE—rhaid bod yn NULL.
  • FPGA_PORT_UMSG_DISABLE — rhaid i argiau fod yn NULL.

FPGA_PORT_UMSG_SET_MODE — mae arg yn bwyntydd i:

strwythur fpga_port_umsg_cfg {
__u32 argsz; // yn: sizeof (strwythur fpga_port_umsg_cfg)
__u32 baneri; // mewn : rhaid fod 0
__u32 awgrym_bitmap; // in: UMsg hint mode bitmap. Yn dynodi pa rai yw UMsg
galluogi.
};

FPGA_PORT_UMSG_SET_BASE_ADDR —

  • Rhaid analluogi UMsg cyn cyhoeddi'r ioctl hwn.
  • Rhaid i'r cae iova fod ar gyfer byffer sy'n ddigon mawr i holl UMsg (num_umsgs *PAGE_SIZE).
    • Mae'r byffer wedi'i farcio fel un “yn cael ei ddefnyddio” gan reolwyr byffer y gyrrwr.
    • Os yw iova yn NULL, mae unrhyw ranbarth blaenorol heb ei farcio fel un “mewn defnydd”.
  • Mae arg yn bwyntydd i:
    strwythur fpga_port_umsg_base_addr {
    • u32 argsz; // yn: sizeof (strwythur fpga_port_umsg_base_addr)
    • u32 baneri; // mewn : rhaid fod 0
    • u64 iova; // yn: cyfeiriad rhithwir IO o FPGA_PORT_DMA_MAP. };

Nodyn:

  • I glirio'r gwallau porthladd, mae'n rhaid i chi ysgrifennu'r union fasg did o'r gwallau cyfredol, ar gyfer example, gwallau cath > clir
  • Dim ond trwy Acceleration Stack ar gyfer Prosesydd Intel Xeon gyda FPGA Integredig y cefnogir UMsg.

sysfs Files

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

sysfs file maes mmio math mynediad
porthladd_num fme_header.capability.num_ports int degol Darllen-yn-unig
maint_celc fme_header.capability.cache_size int degol Darllen-yn-unig
fersiwn fme_header.capability.fabric_verid int degol Darllen-yn-unig
soced_id fme_header.capability.socket_id int degol Darllen-yn-unig
bitstream_id fme_header.bitstream_id hecs uint64_t Darllen-yn-unig
bitstream_metadata fme_header.bitstream_md hecs uint64_t Darllen-yn-unig

sysfs Rheolaeth Thermol FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file maes mmio math mynediad
trothwy1 thermol.trothwy.tmp_thshold1 int degol Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
trothwy2 thermol.trothwy.tmp_thshold2 int degol Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
trothwy_trip thermal.threshold.therm_trip_thshold int degol Darllen-yn-unig
trothwy1_cyrraedd thermol.trothwy.thshold1_status int degol Darllen-yn-unig
trothwy2_cyrraedd thermol.trothwy.thshold2_status int degol Darllen-yn-unig
trothwy1_polisi thermol. trothwy.thshold_policy int degol Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
tymheredd thermal.rdsensor_fm1.fpga_temp int degol Darllen-yn-unig

sysfs Rheoli Pŵer FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file maes mmio math mynediad
bwyta pwer.status.pwr_consumed hecs uint64_t Darllen-yn-unig
trothwy1 grym.trothwy.trothwy1 hecs uint64_t Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
trothwy2 grym.trothwy.trothwy2 hecs uint64_t Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
trothwy1_statws pwer.trothwy.trothwy1_statws degol heb ei lofnodi Darllen-yn-unig
trothwy2_statws pwer.trothwy.trothwy2_statws degol heb ei lofnodi Darllen-yn-unig
rtl power.status.fpga_latency_report degol heb ei lofnodi Darllen-yn-unig

sysfs Gwall Byd-eang FME files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file maes mmio math mynediad
pcie0_gwallau gerror.pcie0_err hecs uint64_t Darllen-ysgrifennu
pcie1_gwallau gerror.pcie1_err hecs uint64_t Darllen-ysgrifennu
chwistrell_gwall gerror.ras_error_inj hecs uint64_t Darllen-ysgrifennu

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

sysfs file maes mmio math mynediad
gwallau gerror.fme_err hecs uint64_t Darllen-yn-unig
gwall_cyntaf gerror.fme_first_err.err_reg_status hecs uint64_t Darllen-yn-unig
gwall_nesaf gerror.fme_next_err.err_reg_status hecs uint64_t Darllen-yn-unig
clir Yn clirio gwallau, first_error, next_error amrywiol uint64_t Ysgrifennu yn unig

Nodyn:
I glirio'r gwallau FME, rhaid i chi ysgrifennu'r union fasg did o'r gwallau cyfredol, ar gyfer example cat gwallau > clir.

sysfs Ailgyflunio Rhannol FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file maes mmio math mynediad
rhyngwyneb_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hecs 16-beit Darllen-yn-unig

sysfs Perfformiad Byd-eang FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file maes mmio math mynediad
cloc gperf.clk.afu_interf_clock hecs uint64_t Darllen-yn-unig

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ddim yn ddilys ar gyfer Acceleration Stack ar gyfer CPU Intel Xeon gyda FPGAs)

sysfs file maes mmio math mynediad
rhewi gperf.ch_ctl.rhewi int degol Darllen-ysgrifennu
darllen_taro gperf.CACHE_RD_HIT hecs uint64_t Darllen-yn-unig
darllen_colli gperf.CACHE_RD_MISS hecs uint64_t Darllen-yn-unig
ysgrifennu_taro gperf.CACHE_WR_HIT hecs uint64_t Darllen-yn-unig
ysgrifennu_colli gperf.CACHE_WR_MISS hecs uint64_t Darllen-yn-unig
dal_cais gperf.CACHE_HOLD_REQ hecs uint64_t Darllen-yn-unig
tx_req_stall gperf.CACHE_TX_REQ_STALL hecs uint64_t Darllen-yn-unig
sysfs file maes mmio math mynediad
rx_req_stall gperf.CACHE_RX_REQ_STALL hecs uint64_t Darllen-yn-unig
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hecs uint64_t Darllen-yn-unig
tag_ysgrifennu_port_cynnwys gperf.CACHE_TAG_WR_PORT_CONTEN hecs uint64_t Darllen-yn-unig

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ddim yn ddilys ar gyfer Cyflymiad Stack ar gyfer CPU Intel Xeon gyda FPGAs)

sysfs file maes mmio math mynediad
rhewi gperf.vtd_ctl.freeze int degol Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ddim yn ddilys ar gyfer Cyflymiad Stack ar gyfer CPU Intel Xeon gyda FPGAs)

sysfs file maes mmio math mynediad
darllen_trafodiad gperf.VTD_AFU0_MEM_RD_TRANS hecs uint64_t Darllen-yn-unig
ysgrifennu_trafodiad gperf.VTD_AFU0_MEM_WR_TRANS hecs uint64_t Darllen-yn-unig
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hecs uint64_t Darllen-yn-unig
tlb_write_taro gperf.VTD_AFU0_TLB_WR_HIT hecs uint64_t Darllen-yn-unig

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

sysfs file maes mmio math mynediad
galluogi gperf.fab_ctl.(galluogi) int degol Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
rhewi gperf.fab_ctl.freeze int degol Defnyddiwr: Darllen-yn-unig Gwraidd: Darllen-ysgrifennu
pcie0_darllen gperf.FAB_PCIE0_RD hecs uint64_t Darllen-yn-unig
pcie0_ysgrifennu gperf.FAB_PCIE0_WR hecs uint64_t Darllen-yn-unig
pcie1_darllen gperf.FAB_PCIE1_RD hecs uint64_t Darllen-yn-unig
pcie1_ysgrifennu gperf.FAB_PCIE1_WR hecs uint64_t Darllen-yn-unig
upi_darllen gperf.FAB_UPI_RD hecs uint64_t Darllen-yn-unig
upi_ysgrifennu gperf.FAB_UPI_WR hecs uint64_t Darllen-yn-unig

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

sysfs file maes mmio math mynediad
pcie0_darllen gperf.FAB_PCIE0_RD hecs uint64_t Darllen-yn-unig
pcie0_ysgrifennu gperf.FAB_PCIE0_WR hecs uint64_t Darllen-yn-unig
pcie1_darllen gperf.FAB_PCIE1_RD hecs uint64_t Darllen-yn-unig
pcie1_ysgrifennu gperf.FAB_PCIE1_WR hecs uint64_t Darllen-yn-unig
upi_darllen gperf.FAB_UPI_RD hecs uint64_t Darllen-yn-unig
upi_ysgrifennu gperf.FAB_UPI_WR hecs uint64_t Darllen-yn-unig

sysfs Pennawd Porth files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file maes mmio math mynediad
id port_header.capability.port_number int degol Darllen-yn-unig
ltr port_header.control.latency_goddefgarwch int degol Darllen-yn-unig

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

sysfs file maes mmio math mynediad
afu_id afu_header.guid hecs 16-beit Darllen-yn-unig

sysfs Gwall Porth files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file maes mmio math mynediad
gwallau gwall.port_error hecs uint64_t Darllen-yn-unig
gwall_cyntaf perror.port_first_error hecs uint64_t Darllen-yn-unig
cyntaf_camffurf_req perer.malreq hecs 16-beit Darllen-yn-unig
clir gwall. (pob gwall) amrywiol uint64_t Ysgrifennu yn unig

Nodyn:
I glirio'r gwallau Port, rhaid i chi ysgrifennu'r mysg didau union y gwallau presennol, ar gyfer example cat gwallau > clir.

Hanes Adolygu

Fersiwn y Ddogfen Newidiadau
2017.10.02 Rhyddhad Cychwynnol.

Canllaw Pensaernïaeth Gyrwyr Dyfais OPAE Intel FPGA Linux

Dogfennau / Adnoddau

Intel Pensaernïaeth Gyrrwr Dyfais Linux OPAE FPGA [pdfCanllaw Defnyddiwr
Pensaernïaeth Gyrrwr Dyfais Linux OPAE FPGA, OPAE FPGA, Pensaernïaeth Gyrrwr Dyfais Linux, Pensaernïaeth Gyrwyr, Pensaernïaeth

Cyfeiriadau

Gadael sylw

Ni fydd eich cyfeiriad e-bost yn cael ei gyhoeddi. Mae meysydd gofynnol wedi'u marcio *