intel-suaicheantas

Intel OPAE FPGA Linux Ailtireachd Dràibhear Inneal

intel-OPAE-FPGA-Linux-Device-Driver-Ailtireachd-toradh

Ailtireachd draibhear inneal OPAE Intel FPGA Linux

Bidh draibhear OPAE Intel FPGA a’ toirt seachad eadar-aghaidh airson tagraidhean àite-cleachdaidh gus luathadairean FPGA a rèiteachadh, a àireamhachadh, fhosgladh agus faighinn a-steach air àrd-ùrlaran uidheamaichte le fuasglaidhean Intel FPGA agus a ’comasachadh gnìomhan riaghlaidh ìre siostam leithid ath-dhealbhadh FPGA, riaghladh cumhachd, agus mas-fhìor.

Ailtireachd bathar-cruaidh

Bho thaobh an OS de view, tha bathar-cruaidh FPGA a’ nochdadh mar inneal PCIe àbhaisteach. Tha cuimhne inneal FPGA air a chuir air dòigh a’ cleachdadh structar dàta ro-mhìnichte (Liosta Feart Inneal). Tha feartan le taic bho inneal FPGA air am faicinn tro na structaran dàta sin, mar a chithear gu h-ìosal san fhigear a leanas:

Inneal FPGA PCIe

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

Bidh an draibhear a’ toirt taic do PCIe SR-IOV gus Gnìomhan Brìgheil (VFn) a chruthachadh a dh’ fhaodar a chleachdadh gus luathadairean fa leth a shònrachadh gu innealan brìgheil.

Intel Corporation. Còraichean uile glèidhte. Tha Intel, suaicheantas Intel, agus comharran Intel eile nan comharran-malairt aig Intel Corporation no na fo-chompanaidhean aige. Tha Intel airidh air coileanadh a thoraidhean FPGA agus semiconductor a rèir mion-chomharrachadh gnàthach a rèir barantas àbhaisteach Intel ach tha e a’ gleidheadh ​​​​na còrach atharrachaidhean a dhèanamh air toraidhean is seirbheisean sam bith aig àm sam bith gun rabhadh. Chan eil Intel a’ gabhail uallach no uallach sam bith ag èirigh bho bhith a’ cleachdadh no a’ cleachdadh fiosrachadh, toradh no seirbheis sam bith a tha air a mhìneachadh an seo ach a-mhàin mar a chaidh aontachadh gu soilleir ann an sgrìobhadh le Intel. Thathas a’ moladh do luchd-ceannach Intel an dreach as ùire de shònrachaidhean inneal fhaighinn mus cuir iad earbsa ann am fiosrachadh foillsichte sam bith agus mus cuir iad òrdughan airson toraidhean no seirbheisean.

Faodar ainmean is suaicheantasan eile a thagradh mar sheilbh chàich.

Inneal FPGA PCIe mas-fhìor

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

Einnsean riaghlaidh FPGA (FME)
Bidh Einnsean Riaghlaidh FPGA a’ coileanadh riaghladh cumhachd is teirmeach, aithris mhearachdan, ath-dhealbhadh, aithris dèanadais, agus gnìomhan bun-structair eile. Tha aon FME aig gach FPGA, a gheibhear an-còmhnaidh tron ​​​​ghnìomh corporra (PF). Faodaidh tagraidhean àite-cleachdaidh faighinn a-steach don FME le bhith a’ cleachdadh fosgailte (), agus a leigeil ma sgaoil le bhith a’ cleachdadh dlùth () mar neach-cleachdaidh sochair (freumh).

Port
Tha Port a’ riochdachadh an eadar-aghaidh eadar aodach FPGA statach (am “Manaidsear Eadar-aghaidh FPGA (FIM)”) agus sgìre a tha air ath-dhealbhadh gu ìre anns a bheil Gnìomh Luathaiche (AF). Bidh am Port a’ cumail smachd air a’ chonaltradh bho bhathar-bog chun luathadair agus a’ nochdadh feartan leithid ath-shuidheachadh agus deasbaid. Faodaidh grunn phuirt a bhith aig inneal PCIe, agus faodar gach Port a nochdadh tro VF le bhith ga shònrachadh a’ cleachdadh an FPGA_FME_PORT_ASSIGN ioctl air an inneal FME.

Aonad gnìomh luathadair (AF).

  • Tha Aonad Gnìomh Luathaiche (AF) ceangailte ri Port agus a’ nochdadh sgìre 256K MMIO airson a chleachdadh airson clàran smachd luathadair-sònraichte.
  • Faodaidh tagraidhean àite-cleachdaidh faighinn a-steach gu AFU ceangailte ri Port le bhith a’ cleachdadh Open() air an inneal Port, agus a leigeil ma sgaoil le bhith a’ cleachdadh dlùth ().
  • Faodaidh tagraidhean àite-cleachdaidh cuideachd mmap () roinnean luathachaidh MMIO.

Ath-dhealbhadh Pàirteach
Mar a chaidh ainmeachadh gu h-àrd, faodar luathaichean ath-dhealbhadh tro ath-dhealbhadh pàirt de Ghnìomh Luathaiche (AF) file. Feumaidh an gnìomh luathachaidh (AF) a bhith air a chruthachadh airson an dearbh FIM agus sgìre statach cuimsichte (Port) den FPGA; air dhòigh eile, fàillidh an obair ath-rèiteachaidh agus dh’ fhaodadh sin neo-sheasmhachd an t-siostaim adhbhrachadh. Faodar an co-chòrdalachd seo a sgrùdadh le bhith a’ dèanamh coimeas eadar an ID eadar-aghaidh a chaidh a chomharrachadh ann am bann-cinn AF agus an ID eadar-aghaidh a nochd an FME tro sysfs. Mar as trice bidh an sgrùdadh seo air a dhèanamh le àite luchd-cleachdaidh mus cuir thu fios chun ath-dhealbhadh IOCTL.

Thoir an aire:
An-dràsta, feumar prògram bathar-bog sam bith a gheibh cothrom air an FPGA, a’ gabhail a-steach an fheadhainn a tha a’ ruith ann an aoigheachd mas-fhìor, a dhùnadh mus feuch thu ri pàirt ath-dhealbhadh. Bhiodh na ceumannan:

  1. Thoir air falbh an dràibhear bhon aoigh
  2. Unplug an VF bhon aoigh
  3. Cuir à comas SR-IOV
  4. Dèan ath-dhealbhadh pàirt
  5. Dèan comas air SR-IOV
  6. Plug an VF chun an aoigh
  7. Luchdaich an draibhear san aoigh

Mas-fhìorachadh FPGA
Gus cothrom fhaighinn air luathadair bho thagraidhean a tha a’ ruith ann an VM, feumar am port AFU fa leth a shònrachadh do VF a’ cleachdadh nan ceumannan a leanas:

  1. Tha sealbh aig an PF air a h-uile port AFU gu bunaiteach. Feumaidh port sam bith a dh’ fheumar a bhith air ath-shònrachadh gu VF a bhith air a leigeil ma sgaoil bhon PF tron ​​FPGA_FME_PORT_RELEASE ioctl air an inneal FME.
  2. Cho luath ‘s a thèid puirt N a leigeil ma sgaoil bhon PF, faodar an àithne gu h-ìosal a chleachdadh gus SRIOV agus VFs a chomasachadh. Chan eil ach aon phort aig gach VF le AFU. mac-talla N> PCI_DEVICE_PATH/sriov_numvfs
  3. Gabh tro na VFn gu VMs.
  4. Tha an AFU fo VF ruigsinneach bho thagraidhean ann an VM (a’ cleachdadh an aon dhràibhear taobh a-staigh an VF).

Thoir an aire:
Chan urrainnear FME a shònrachadh do VF, mar sin chan fhaighear gnìomhan PR agus gnìomhan riaghlaidh eile ach tron ​​PF.

Buidheann driver

Dràibhear inneal modal PCIe

Buidheann driver

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

Bidh na h-innealan FPGA a’ nochdadh mar innealan PCIe cunbhalach; mar sin, bidh an draibhear inneal FPGA PCIe (intel-FPGA-PCI.ko) an-còmhnaidh air a luchdachadh an toiseach aon uair ‘s gun lorgar FPGA PCIe PF no VF. Tha àite bun-structair aig an draibhear seo ann an ailtireachd an draibhear. Tha:

  • A 'cruthachadh inneal container FPGA mar phàrant de na h-innealan feart.
  • A’ coiseachd tron ​​​​Liosta Feart Innealan, a tha air a chuir an gnìomh ann an cuimhne BAR inneal PCIe, gus innealan feart agus na fo-fheartan aca a lorg agus innealan àrd-ùrlar a chruthachadh dhaibh fon inneal container.
  • A’ toirt taic do SR-IOV.
  • A’ toirt a-steach bun-structar inneal feart, a bhios a’ toirt geàrr-chunntas air gnìomhachd airson fo-fheartan agus a’ nochdadh gnìomhan cumanta gu draibhearan innealan sònraichte.

Gnìomhan draibhear inneal modal PCIe

  • A’ toirt a-steach lorg PCIe, àireamhachd innealan, agus lorg feart.
  • Cruthaich clàran sysfs airson an inneal phàrant, Einnsean Riaghlaidh FPGA (FME), agus Port.
  • A’ cruthachadh na h-eisimpleirean de dhràibhearan àrd-ùrlair, a’ toirt air an kernel Linux na draibhearan modal àrd-ùrlair aca a luchdachadh.

Dràibhear inneal modal àrd-ùrlar FME

  • Riaghladh cumhachd is teirmeach, aithris mhearachdan, aithris dèanadais, agus gnìomhan bun-structair eile. Gheibh thu cothrom air na gnìomhan sin tro eadar-aghaidh sysfs fosgailte leis an draibhear FME.
  • Ath-dhealbhadh Pàirteach. Bidh an draibhear FME a’ clàradh Manaidsear FPGA aig àm tòiseachaidh fo-fheart PR; aon uair ‘s gum faigh e FPGA_FME_PORT_PR ioctl bhuat, bidh e a’ toirt a-steach gnìomh eadar-aghaidh cumanta bho Mhanaidsear FPGA gus crìoch a chuir air ath-dhealbhadh pàirt den bitstream chun phort a chaidh a thoirt seachad.
  • Stiùireadh port airson virtualization. Bidh an draibhear FME a’ toirt a-steach dà ioctls, FPGA_FME_PORT_RELEASE, a sgaoileas am Port a chaidh a thoirt seachad bho PF; agus FPGA_FME_PORT_ASSIGN, a shònraicheas am Port air ais gu PF. Aon uair ‘s gu bheil am Port air a leigeil ma sgaoil bhon PF, faodar a shònrachadh don VF tro eadar-aghaidh SR-IOV a bheir an draibhear PCIe seachad. Airson tuilleadh fiosrachaidh, thoir sùil air “FPGA Virtualization”.

Gnìomhan draibhear inneal modal àrd-ùrlar FME

  • A’ cruthachadh nód inneal caractar FME.
  • A’ cruthachadh sysfs FME files agus a’ cur an sàs an sysfs FME file accessors.
  • A’ cur an gnìomh fo-dràibhearan feart prìobhaideach FME.
  • Fo-dràibhearan feart prìobhaideach FME:
    • Ceann-cinnidh FME
    • Riaghladh Teirmeach
    • Stiùireadh cumhachd
    • Mearachd chruinneil
    • Ath-dhealbhadh Pàirteach
    • Coileanadh Cruinneil

Dràibhear inneal modal àrd-ùrlar port
Coltach ris an draibhear FME, thèid an draibhear FPGA Port (agus AFU) (intel-fpga-afu. ko) a sgrùdadh aon uair ‘s gu bheil an inneal àrd-ùrlar Port air a chruthachadh. Is e prìomh obair a’ mhodail seo eadar-aghaidh a thoirt seachad airson tagraidhean àite-cleachdaidh gus faighinn gu na luathadairean fa leth, a ’toirt a-steach smachd ath-shuidheachadh bunaiteach air Port, às-mhalairt sgìre AFU MMIO, seirbheis mapaidh bufair DMA, fios UMsg (1), agus gnìomhan deasbaid iomallach ( faic gu h-àrd).

Chan eil UMsg a’ faighinn taic ach tro Acceleration Stack airson Intel Xeon® Processor le FPGA Amalaichte.

Gnìomhan draibhear inneal modal àrd-ùrlar port

  • A’ cruthachadh nód inneal caractar Port.
  • A 'cruthachadh sysfs Port files agus a’ cur an gnìomh sysfs Port file accessors.
  • A’ cur an gnìomh fo-dràibhearan feart prìobhaideach Port.
  • Fo-dràibhearan feart prìobhaideach port:
    • Ceann-puirt
    • AFU
    • Mearachd port
    • UMsg(2)
    • Tap comharra

Àireamhachd inneal FPGA Iarrtas
Tha an earrann seo a’ toirt a-steach mar a bhios tagraidhean ag àireamhachadh inneal FPGA bhon rangachd sysfs fo / sys/class/fpga. Anns an t-seannampgu h-ìosal, tha dà inneal Intel FPGA air an stàladh san òstair. Tha aon FME agus dà phort (AFUn) aig gach inneal FPGA. Airson gach inneal FPGA, thèid eòlaire inneal a chruthachadh fo / sys/class/fpga:

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

Tha aon FME agus dà phort (AFU) aig gach nód mar innealan cloinne:
/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

San fharsaingeachd, tha eadar-aghaidh FME / Port sysfs air an ainmeachadh mar a leanas:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

agus mi an dèidh a chèile ag àireamh a h-uile inneal soithich, j ag àireamh an FME an dèidh a chèile agus k ag àireamhachadh a h-uile Port.

Faodar iomradh a thoirt air na nodan inneal a thathar a’ cleachdadh airson ioctl() agus mmap() tro:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Àireamhachd PCIe Driver
Tha an earrann seo a ’toirt seachad cusview den t-sruth còd airson àireamhachd innealan air a dhèanamh le intel-fpga-pci.ko. Tha na prìomh structaran dàta agus gnìomhan air an comharrachadh. Is fheàrr an earrann seo a leantainn nuair a viewleis a’ chòd stòr na chois (pcie.c).

Structaran Dàta Àireamhachd

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
structar statach idr fpga_ids[FPGA_ID_MAX];
structar fpga_chardev_info {
const char * ainm;
dev_t devt;
};
structar fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
clas structar statach * fpga_class;
structar statach 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,}
};
structar statach 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
};
structar cci_drvdata {
in inneal_id;
inneal structar * fme_dev;
struct mutex glas;
structar list_head port_dev_list;
int released_port_num;
structar list_head roinnean;
};
structar build_feature_devs_info {
structar pci_dev *pdev;
falamh __iomem *ioaddr;
falamh __iomem *ioend;
anns an t-sruth_bar;
falamh __iomem *pfme_hdr;
inneal structar * parent_dev;
structar platform_device *feature_dev;
};

Sruth àireamhachd

  • ccidrv_init()
    • Tòisich fpga_ids a’ cleachdadh idr_init().
    • Tòisich fpga_chrdevs[i].devt a’ cleachdadh alloc_chrdev_region().
    • Tòisich fpga_class a’ cleachdadh class_create().
    • pci_register_driver (&cci_pci_driver);
  • cci_pci_probe()
    • Dèan comas air an inneal PCI, iarr ruigsinneachd air na roinnean aige, suidhich prìomh mhodh PCI, agus rèitich DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Sònraich struct build_feature_devs_info, tòisich e.
      Tha .parent_dev suidhichte ann an eòlaire sysfs phàrant (intel-fpga-dev.id) anns a bheil eòlairean FME agus Port sysfs.
  • parse_feature_list()
    • Coisich air Liosta Feartan Innealan BAR0 gus faighinn a-mach am FME, am Port, agus na feartan prìobhaideach aca.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Nuair a thachras FME:
  • build_info_create_dev()
    • Riaraich inneal àrd-ùrlair airson an FME, a 'stòradh a-steach build_feature_devs_info.feature_dev.
    • tha feature_dev.id air a thòiseachadh gu toradh idr_alloc(fpga_ids[FME_ID],
    • tha feature_dev.parent deiseil airson build_feature_devs_info.parent_dev.
    • Roinn raon de ghoireasan structarail ann am feature_dev.resource.
  • Roinn struct feature_platform_data, tòisich e, agus stòraich puing ann am feart_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Tòisich feart_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Tòisich feart_platform_data.features[FME_FEATURE_ID_HEADER], a h-uile càil ach .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Nuair a thachras port:
  • build_info_create_dev()
    • Riaraich inneal àrd-ùrlar airson a 'Phort, a' stòradh ann an build_feature_devs_info.feature_dev.
    • tha feature_dev.id air a thòiseachadh gu toradh idr_alloc(fpga_ids[PORT_ID],
    • tha feature_dev.parent deiseil airson build_feature_devs_info.parent_dev.
    • Roinn raon de ghoireas structarail ann am feature_dev.resource.
    • Roinn struct feature_platform_data, tòisich e, agus stòraich puing ann am feart_dev.dev.platform_data
  • build_info_commit_dev()
    • Cuir am feart struct_platform_data.node airson a’ phort ris an liosta de phuirt ann an struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Tòisich feart_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Tòisich feart_platform_data.features[PORT_FEATURE_ID_HEADER], a h-uile càil ach .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Nuair a thachras tu air AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Tòisich feart_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Tòiseachadh feature_platform_data.features[PORT_FEATURE_ID_UAFU], a h-uile càil ach .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Nuair a lorgar feart prìobhaideach FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Tòisich feart_dev.resource[id].
  • feature_platform_data_add()
    • Tòiseachadh feature_platform_data.features[id], a h-uile càil ach .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Nuair a thachras tu ri feart prìobhaideach Port: * create_feature_instance() build_info_add_sub_feature() * Tòisich feature_dev.resource[id]. * feature_platform_data_add() Tòisich feature_platform_data.features[id], a h-uile càil ach .fops.
  • parse_ports_from_fme()
    • Ma tha an draibhear air a luchdachadh air a’ ghnìomh corporra (PF), an uairsin:
  • Ruith an sruth parse_feature_list() air gach port a tha air a mhìneachadh ann am bann-cinn FME.
  • Cleachd am BAR air a bheil iomradh anns gach inntrigeadh Port anns a’ cheann-cinn.

Tòiseachadh inneal àrd-ùrlar FME
Tha an earrann seo a ’toirt seachad cusview den t-sruthadh còd airson tòiseachadh inneal FME air a dhèanamh le intel-fpga-fme.ko. Tha na prìomh structaran dàta agus gnìomhan air an comharrachadh. Is fheàrr an earrann seo a leantainn nuair a viewanns a’ chòd stòr na chois (fme-main.c).

Structaran Dàta Inneal Àrd-ùrlar FME

structar feart_ops {
int (* init)(struct platform_device * pdev, feart structar * feart);
int (* uinit)(struct platform_device * pdev, feart structar * feart);
fada (* ioctl)(struct platform_device * pdev, feart structar * feart,
int cmd gun ainm, arg fada gun ainm);
int (* deuchainn) (struct platform_device * pdev, feart structar * feart);
};
feart structar {
const char * ainm;
int resource_index;
falamh __iomem *ioaddr;
structar feart_ops * ops;
};
structar feart_platform_data {
structar list_head nód;
struct mutex glas;
dev_status fada gun ainm;
structar cdev cdev;
structar platform_device * dev;
gun ainm-sgrìobhte int disable_count;
falamh *prìobhaideach;
int àireamh;
int (* config_port)(struct platform_device *, u32, bool);
structar platform_device * (* fpga_for_each_port)(struct platform_device *,
falamh *, int (* maids) (struct platform_device *, falamh *)); structar
feartan feart[0];
};
structar perf_object {
int id;
const struct attribute_group **attr_groups;
inneal structar * fme_dev;
structar list_head nód;
struct list_head clann;
struct kobject kobj;
};
structar fpga_fme {
u8 port_id;
u64 pr_err;
inneal structar * dev_err;
structar perf_object *perf_dev;
structar feart_platform_data *pdata;
};

Sruth tòiseachaidh inneal àrd-ùrlar FME

Sruth tòiseachaidh FMEintel-OPAE-FPGA-Linux-Device-Driver-Ailtireachd-fig- (4)

  • fme_probe() fme_dev_init()
    • Tòisich struct fpga_fme agus stòraich e san raon feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Sàbhail struct feature_ops a-steach don feature_platform_data.features airson gach feart sluaigh.
    • Cuir fòn gu gnìomh deuchainn, ma tha gin ann, bhon structar.
    • Cuir fòn gu gnìomh init bhon structar.
  • fme_probe() fpga_register_dev_ops()
    • Cruthaich an inneal caractar FME nód, a 'clàradh struct file_ obrachaidhean.

Tòiseachadh inneal àrd-ùrlar port
Tha an earrann seo a ’toirt seachad cusview den t-sruthadh còd airson tòiseachadh inneal puirt air a dhèanamh le intel-fpga-afu.ko. Tha na prìomh structaran dàta agus gnìomhan air an comharrachadh. Is fheàrr an earrann seo a leantainn nuair a viewanns a’ chòd stòr a tha na chois (afu.c).

Structaran Dàta Inneal Àrd-ùrlar Port

structar feart_ops {
int (* init)(struct platform_device * pdev, feart structar * feart);
int (* uinit)(struct platform_device * pdev, feart structar * feart);
fada (* ioctl)(struct platform_device * pdev, feart structar * feart,
int cmd gun ainm, arg fada gun ainm);
int (* deuchainn) (struct platform_device * pdev, feart structar * feart);
};
feart structar {
const char * ainm;
int resource_index;
falamh __iomem *ioaddr;
structar feart_ops * ops;
};
structar feart_platform_data {
structar list_head nód;
struct mutex glas;
dev_status fada gun ainm;
structar cdev cdev;
structar platform_device * dev;
gun ainm-sgrìobhte int disable_count;
falamh *prìobhaideach;
int àireamh;
int (* config_port)(struct platform_device *, u32, bool);
structar platform_device * (* fpga_for_each_port)(struct platform_device *,
falamh *, int (* maids) (struct platform_device *, falamh *));
feartan feart structar [0];
};
structar fpga_afu_region {
clàr-amais u32;
u32 brataichean;
meud u64;
u64 dheth ;
u64 fis;
structar list_head nód;
};
structar fpga_afu_dma_region {
u64 cleachdaiche_addr;
u64 fad;
u64 uibhe;
duilleag structar ** duilleagan;
structar rb_node nód;
bool in_use;
};
structar fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
structar list_head roinnean;
structar rb_root dma_regions;
structar feart_platform_data *pdata;
};

Sruth tòiseachaidh inneal àrd-ùrlar port

Sruth tòiseachaidh portintel-OPAE-FPGA-Linux-Device-Driver-Ailtireachd-fig- (5)

  • afu_probe() afu_dev_init()
    • Tòisich struct fpga_afu agus stòraich e san raon feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Sàbhail struct feature_ops a-steach don feature_platform_data.features airson gach feart sluaigh.
    • Cuir fòn gu gnìomh deuchainn, ma tha gin ann, bhon structar.
    • Cuir fòn gu gnìomh init bhon structar.
  • afu_probe() fpga_register_dev_ops()
    • Cruthaich nód inneal caractar Port, a’ clàradh struct file_ obrachaidhean.

IOCTLan FME
IOCTLs a tha air an gairm air fosgailte file tuairisgeul airson /dev/intel-fpga-fme.j FPGA_GET_API_VERSION - till an dreach làithreach mar shlànaighear, a’ tòiseachadh bho 0.

FPGA_CHECK_EXTENSION — chan eil taic ann an-dràsta.

FPGA_FME_PORT_RELEASE — tha arg na chomharradh air:

structar fpga_fme_port_release {
__u32 argsz; // ann an: sizeof (structar fpga_fme_port_release)
__u32 brataichean; // a-steach: feumaidh 0 a bhith ann
__u32 port_id; // ann an: ID port (bho 0) ri leigeil ma sgaoil.
};

FPGA_FME_PORT_ASSIGN — tha arg na chomharradh air:

structar fpga_fme_port_assign {
__u32 argsz; // ann an: sizeof (structar fpga_fme_port_assign)
__u32 brataichean; // a-steach: feumaidh 0 a bhith ann
__u32 port_id; // ann an: ID port (bho 0) airson a shònrachadh. (feumaidh gun robh
air fhoillseachadh roimhe le FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR — tha arg na chomharradh air:

structar fpga_fme_port_pr {
__u32 argsz; // ann an: sizeof (structar fpga_fme_port_pr)
__u32 brataichean; // a-steach: feumaidh 0 a bhith ann
__u32 port_id; // ann an: ID port (bho 0)
__u32 bufair_size; // ann an: meud bufair bitstream ann am bytes. Feumaidh a bhith 4-byte
co-thaobhadh.
__u64 bufair_seòladh; // ann an: seòladh pròiseas bufair bitstream
inbhe __u64; // a-mach: inbhe mearachd (bitmask)
};

Port IOCTLs
IOCTLs a tha air an gairm air fosgailte file tuairisgeul airson /dev/intel-fpga-port.k FPGA_GET_API_VERSION—till an tionndadh làithreach mar shlànaighear, a' tòiseachadh bho 0. FPGA_CHECK_EXTENSION — chan eil taic ann an-dràsta.

FPGA_PORT_GET_INFO — tha arg na chomharradh air:

structar fpga_port_info {
__u32 argsz; // ann an: sizeof (structar fpga_port_info)
__u32 brataichean; // a-mach: tilleadh 0
__u32 àireamh_regions; // a-mach: àireamh de roinnean MMIO, 2 (1 airson AFU agus 1 airson
STP)
__u32 àireamh_umsgs; // a-mach: an àireamh de UMsg le taic bhon bhathar-cruaidh
};

FPGA_PORT_GET_REGION_INFO — tha arg na chomharradh air:

structar fpga_port_region_info {
__u32 argsz; // ann an: sizeof (structar fpga_port_region_info)
__u32 brataichean; // a-mach: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
clàr-amais __u32; // ann an: FPGA_PORT_INDEX_UAFU no FPGA_PORT_INDEX_STP
__u32 padding; // a-steach: feumaidh 0 a bhith ann
meud __u64; // a-mach: meud sgìre MMIO ann am bytes
__u64 dheth ; // a-mach: cuir dheth roinn MMIO bho thoiseach an uidheim fd
};

FPGA_PORT_DMA_MAP — tha arg na chomharradh air:
structar fpga_port_dma_map {
__u32 argsz; // ann an: sizeof (structar fpga_port_dma_map)
__u32 brataichean; // a-steach: feumaidh a bhith 0 __u64 user_addr; // ann an: pròiseas mas-fhìor
seòladh. Feumaidh a bhith co-thaobhadh duilleag.
__u64 fad; // ann an: fad mapadh ann am bytes. Feumaidh a bhith ioma-dhuilleag
meud.
__u64 uibhe; // a-mach: seòladh mas-fhìor IO };

FPGA_PORT_DMA_UNMAP — tha arg na chomharradh air:
structar fpga_port_dma_unmap {
__u32 argsz; // ann an: sizeof (structar fpga_port_dma_unmap)
__u32 brataichean; // a-steach: feumaidh 0 a bhith ann
__u64 uibhe; // ann an: seòladh brìgheil IO air a thilleadh le fear roimhe
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET — feumaidh arg a bhith NULL.
  • FPGA_PORT_UMSG_ENABLE — feumaidh seo a bhith NULL.
  • FPGA_PORT_UMSG_DISABLE — feumaidh args a bhith NULL.

FPGA_PORT_UMSG_SET_MODE — tha arg na chomharradh air:

structar fpga_port_umsg_cfg {
__u32 argsz; // ann an: sizeof (structar fpga_port_umsg_cfg)
__u32 brataichean; // a-steach: feumaidh 0 a bhith ann
__u32 hint_bitmap; // ann an: mapa bit modh leid UMsg. A’ comharrachadh dè na UMsg a th’ ann
air a chomasachadh.
};

FPGA_PORT_UMSG_SET_BASE_ADDR —

  • Feumaidh UMsg a bhith à comas mus cuir thu a-mach an ioctl seo.
  • Feumaidh an raon iova a bhith airson bufair mòr gu leòr airson a h-uile UMsg (num_umsgs * PAGE_SIZE).
    • Tha am bufair air a chomharrachadh mar “ga chleachdadh” le stiùireadh bufair an draibhear.
    • Ma tha iova NULL, tha roinn sam bith roimhe seo gun chomharradh mar “ann an cleachdadh”.
  • tha arg na chomharradh air:
    structar fpga_port_umsg_base_addr {
    • u32 argsz; // ann an: sizeof (structar fpga_port_umsg_base_addr)
    • u32 brataichean; // a-steach: feumaidh 0 a bhith ann
    • u64 uibhe; // ann an: seòladh brìgheil IO bho FPGA_PORT_DMA_MAP. };

Thoir an aire:

  • Gus na mearachdan puirt a ghlanadh, feumaidh tu an dearbh bitmask de na mearachdan gnàthach a sgrìobhadh, airson example, mearachdan cat > soilleir
  • Chan eil UMsg a’ faighinn taic ach tro Acceleration Stack airson Intel Xeon Processor le FPGA Amalaichte.

sysfs Files

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

sysfs file mmio achadh seòrsa ruigsinneachd
puirt_num fme_header.capability.num_ports int deicheach Leughadh a-mhàin
tasgadan_meud fme_header.capability.cache_size int deicheach Leughadh a-mhàin
dreach fme_header.capability.fabric_verid int deicheach Leughadh a-mhàin
socaid_id fme_header.capability.socket_id int deicheach Leughadh a-mhàin
bitstream_id fme_header.bitstream_id heics uint64_t Leughadh a-mhàin
bitstream_meata-dàta fme_header.bitstream_md heics uint64_t Leughadh a-mhàin

sysfs Stiùireadh Teirmeach FME files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file mmio achadh seòrsa ruigsinneachd
stairsnich1 teirmeach.threshold.tmp_thshold1 int deicheach Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
stairsnich2 teirmeach.threshold.tmp_thshold2 int deicheach Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
stairsneach_turas teirmeach.threshold.therm_trip_thshold int deicheach Leughadh a-mhàin
stairsnich1_air a ruighinn teirmeach.threshold.thshold1_status int deicheach Leughadh a-mhàin
stairsnich2_air a ruighinn teirmeach.threshold.thshold2_status int deicheach Leughadh a-mhàin
stairsnich1_poileasaidh teirmeach. stairsnich.thshold_poileasaidh int deicheach Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
teòthachd thermal.rdsensor_fm1.fpga_temp int deicheach Leughadh a-mhàin

sysfs Stiùireadh Cumhachd FME files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file mmio achadh seòrsa ruigsinneachd
ga chaitheamh cumhachd.status.pwr_consumed heics uint64_t Leughadh a-mhàin
stairsnich1 cumhachd.stairsneach.stairsnich1 heics uint64_t Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
stairsnich2 cumhachd.stairsneach.stairsnich2 heics uint64_t Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
stairsnich1_inbhe cumhachd.threshold.threshold1_status deicheach gun ainm Leughadh a-mhàin
stairsnich2_inbhe cumhachd.threshold.threshold2_status deicheach gun ainm Leughadh a-mhàin
rtl power.status.fpga_latency_report deicheach gun ainm Leughadh a-mhàin

sysfs Mearachd Cruinne FME files
intel-fpga-dev.i/intel-fpga-fme.j/errors/

sysfs file mmio achadh seòrsa ruigsinneachd
pcie0_mearachdan mearachd.pcie0_err heics uint64_t Leugh-sgrìobhadh
pcie1_mearachdan mearachd.pcie1_err heics uint64_t Leugh-sgrìobhadh
inject_error gerror.ras_error_inj heics uint64_t Leugh-sgrìobhadh

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

sysfs file mmio achadh seòrsa ruigsinneachd
mearachdan mearachd.fme_err heics uint64_t Leughadh a-mhàin
ciad_mearachd gerror.fme_first_err.err_reg_status heics uint64_t Leughadh a-mhàin
ath-mhearachd gerror.fme_next_err.err_reg_status heics uint64_t Leughadh a-mhàin
soilleir Fuadach mhearachdan, first_error, next_error diofar uint64_t Sgrìobhadh a-mhàin

Thoir an aire:
Gus na mearachdan FME a ghlanadh, feumaidh tu an dearbh bitmask de na mearachdan gnàthach a sgrìobhadh, airson example mearachdan cat > soilleir.

sysfs Ath-dhealbhadh Pàirteach FME files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio achadh seòrsa ruigsinneachd
eadar-aghaidh_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte Leughadh a-mhàin

sysfs Coileanadh Cruinne FME files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock

sysfs file mmio achadh seòrsa ruigsinneachd
uaireadair gperf.clk.afu_interf_clock heics uint64_t Leughadh a-mhàin

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Gun a bhith dligheach airson Luathachadh Stack airson Intel Xeon CPU le FPGAn)

sysfs file mmio achadh seòrsa ruigsinneachd
reothadh gperf.ch_ctl.reothadh int deicheach Leugh-sgrìobhadh
leugh_buail gperf.CACHE_RD_HIT heics uint64_t Leughadh a-mhàin
leugh_ ionndrainn gperf.CACHE_RD_MISS heics uint64_t Leughadh a-mhàin
sgrìobh_buail gperf.CACHE_WR_HIT heics uint64_t Leughadh a-mhàin
sgrìobh_call gperf.CACHE_WR_MISS heics uint64_t Leughadh a-mhàin
cùm_iarrtas gperf.CACHE_HOLD_REQ heics uint64_t Leughadh a-mhàin
tx_req_stall gperf.CACHE_TX_REQ_STALL heics uint64_t Leughadh a-mhàin
sysfs file mmio achadh seòrsa ruigsinneachd
rx_req_stall gperf.CACHE_RX_REQ_STALL heics uint64_t Leughadh a-mhàin
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN heics uint64_t Leughadh a-mhàin
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN heics uint64_t Leughadh a-mhàin

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Gun dligheach airson Luathachadh Stack airson Intel Xeon CPU le FPGAn)

sysfs file mmio achadh seòrsa ruigsinneachd
reothadh gperf.vtd_ctl.freeze int deicheach Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Gun a bhith dligheach airson Luathachadh Stack airson Intel Xeon CPU le FPGAn)

sysfs file mmio achadh seòrsa ruigsinneachd
leughadh_ malairt gperf.VTD_AFU0_MEM_RD_TRANS heics uint64_t Leughadh a-mhàin
sgrìobhadh_ malairt gperf.VTD_AFU0_MEM_WR_TRANS heics uint64_t Leughadh a-mhàin
tlb_read_buail gperf.VTD_AFU0_TLB_RD_HIT heics uint64_t Leughadh a-mhàin
tlb_write_buail gperf.VTD_AFU0_TLB_WR_HIT heics uint64_t Leughadh a-mhàin

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

sysfs file mmio achadh seòrsa ruigsinneachd
comas a thoirt gperf.fab_ctl.(comas) int deicheach Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
reothadh gperf.fab_ctl.reothadh int deicheach Cleachdaiche: Leughadh a-mhàin Root: Leugh-sgrìobh
pcie0_leugh gperf.FAB_PCIE0_RD heics uint64_t Leughadh a-mhàin
pcie0_sgrìobh gperf.FAB_PCIE0_WR heics uint64_t Leughadh a-mhàin
pcie1_leugh gperf.FAB_PCIE1_RD heics uint64_t Leughadh a-mhàin
pcie1_sgrìobh gperf.FAB_PCIE1_WR heics uint64_t Leughadh a-mhàin
upi_leugh gperf.FAB_UPI_RD heics uint64_t Leughadh a-mhàin
sgrìobhadh_ gperf.FAB_UPI_WR heics uint64_t Leughadh a-mhàin

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

sysfs file mmio achadh seòrsa ruigsinneachd
pcie0_leugh gperf.FAB_PCIE0_RD heics uint64_t Leughadh a-mhàin
pcie0_sgrìobh gperf.FAB_PCIE0_WR heics uint64_t Leughadh a-mhàin
pcie1_leugh gperf.FAB_PCIE1_RD heics uint64_t Leughadh a-mhàin
pcie1_sgrìobh gperf.FAB_PCIE1_WR heics uint64_t Leughadh a-mhàin
upi_leugh gperf.FAB_UPI_RD heics uint64_t Leughadh a-mhàin
sgrìobhadh_ gperf.FAB_UPI_WR heics uint64_t Leughadh a-mhàin

sysfs port header files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file mmio achadh seòrsa ruigsinneachd
id port_header.capability.port_number int deicheach Leughadh a-mhàin
ltr port_header.control.latency_fulangas int deicheach Leughadh a-mhàin

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

sysfs file mmio achadh seòrsa ruigsinneachd
afu_id afu_header.guid hex 16-byte Leughadh a-mhàin

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

sysfs file mmio achadh seòrsa ruigsinneachd
mearachdan mearachd.port_error heics uint64_t Leughadh a-mhàin
ciad_mearachd mearachd.port_first_error heics uint64_t Leughadh a-mhàin
ciad_malformed_req uamhas.malreq hex 16-byte Leughadh a-mhàin
soilleir mearachd. (a h-uile mearachd) diofar uint64_t Sgrìobhadh a-mhàin

Thoir an aire:
Gus na mearachdan Port a ghlanadh, feumaidh tu an dearbh bitmask de na mearachdan gnàthach a sgrìobhadh, airson example mearachdan cat > soilleir.

Eachdraidh Ath-sgrùdaidh

Tionndadh Sgrìobhainn Atharrachaidhean
2017.10.02 Sgaoileadh tùsail.

Iùl ailtireachd draibhear inneal OPAE Intel FPGA Linux

Sgrìobhainnean/Goireasan

Intel OPAE FPGA Linux Ailtireachd Dràibhear Inneal [pdfStiùireadh Cleachdaiche
Ailtireachd Dràibhear Inneal OPAE FPGA Linux, OPAE FPGA, Ailtireachd Dràibhear Inneal Linux, Ailtireachd Dràibhear, Ailtireachd

Iomraidhean

Fàg beachd

Cha tèid do sheòladh puist-d fhoillseachadh. Tha raointean riatanach air an comharrachadh *