intel-logo

intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

Ang driver ng OPAE Intel FPGA ay nagbibigay ng mga interface para sa mga application ng user-space upang i-configure, ibilang, buksan, at i-access ang mga accelerator ng FPGA sa mga platform na nilagyan ng mga solusyon sa Intel FPGA at nagbibigay-daan sa mga function ng pamamahala sa antas ng system tulad ng reconfiguration ng FPGA, pamamahala ng kapangyarihan, at virtualization.

Arkitektura ng Hardware

Mula sa punto ng OS ng view, lumilitaw ang FPGA hardware bilang isang regular na PCIe device. Ang memorya ng FPGA device ay inayos gamit ang isang paunang natukoy na istraktura ng data (Listahan ng Tampok ng Device). Ang mga feature na sinusuportahan ng FPGA device ay nakalantad sa pamamagitan ng mga istruktura ng data na ito, gaya ng inilalarawan sa ibaba sa sumusunod na figure:

FPGA PCIe Device

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

Sinusuportahan ng driver ang PCIe SR-IOV upang lumikha ng mga Virtual Function (VFs) na maaaring magamit upang magtalaga ng mga indibidwal na accelerator sa mga virtual machine.

Intel Corporation. Lahat ng karapatan ay nakalaan. Ang Intel, ang logo ng Intel, at iba pang mga marka ng Intel ay mga trademark ng Intel Corporation o mga subsidiary nito. Ginagarantiyahan ng Intel ang pagganap ng mga produktong FPGA at semiconductor nito sa kasalukuyang mga detalye alinsunod sa karaniwang warranty ng Intel ngunit inilalaan ang karapatang gumawa ng mga pagbabago sa anumang produkto at serbisyo anumang oras nang walang abiso. Walang pananagutan o pananagutan ang Intel na nagmumula sa aplikasyon o paggamit ng anumang impormasyon, produkto, o serbisyong inilarawan dito maliban kung hayagang sinang-ayunan ng Intel. Pinapayuhan ang mga customer ng Intel na kunin ang pinakabagong bersyon ng mga detalye ng device bago umasa sa anumang nai-publish na impormasyon at bago mag-order para sa mga produkto o serbisyo.

Maaaring i-claim ang ibang mga pangalan at brand bilang pag-aari ng iba.

Virtualized na FPGA PCIe Device

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

FPGA Management Engine (FME)
Ang FPGA Management Engine ay gumaganap ng kapangyarihan at thermal management, pag-uulat ng error, muling pagsasaayos, pag-uulat ng pagganap, at iba pang mga pag-andar sa imprastraktura. Ang bawat FPGA ay may isang FME, na palaging ina-access sa pamamagitan ng Physical Function (PF). Ang mga application ng user-space ay maaaring makakuha ng eksklusibong access sa FME gamit ang open(), at i-release ito gamit ang close() bilang isang privileged user (root).

Port
Kinakatawan ng Port ang interface sa pagitan ng static na FPGA fabric (ang “FPGA Interface Manager (FIM)”) at isang bahagyang nare-configure na rehiyon na naglalaman ng Accelerator Function (AF). Kinokontrol ng Port ang komunikasyon mula sa software hanggang sa accelerator at inilalantad ang mga tampok tulad ng pag-reset at pag-debug. Maaaring may ilang Port ang isang PCIe device, at maaaring malantad ang bawat Port sa pamamagitan ng VF sa pamamagitan ng pagtatalaga nito gamit ang FPGA_FME_PORT_ASSIGN ioctl sa FME device.

Yunit ng Accelerator Function (AF).

  • Ang isang Accelerator Function (AF) Unit ay nakakabit sa isang Port at inilalantad ang isang 256K MMIO na rehiyon na gagamitin para sa mga register ng kontrol na partikular sa accelerator.
  • Ang mga application ng user-space ay maaaring makakuha ng eksklusibong access sa isang AFU na naka-attach sa isang Port sa pamamagitan ng paggamit ng open() sa Port device, at i-release ito gamit ang close().
  • Ang mga application ng user-space ay maaari ding mmap() accelerator MMIO na mga rehiyon.

Bahagyang Reconfiguration
Tulad ng nabanggit sa itaas, ang mga accelerator ay maaaring muling i-configure sa pamamagitan ng bahagyang muling pagsasaayos ng isang Accelerator Function (AF) file. Ang Accelerator Function (AF) ay dapat na nabuo para sa eksaktong FIM at naka-target na static na rehiyon (Port) ng FPGA; kung hindi, ang pagpapatakbo ng muling pagsasaayos ay mabibigo at posibleng magdulot ng kawalang-tatag ng system. Maaaring suriin ang compatibility na ito sa pamamagitan ng paghahambing ng interface ID na nabanggit sa AF header laban sa interface ID na na-expose ng FME sa pamamagitan ng sysfs. Ang pagsusuring ito ay karaniwang ginagawa ng espasyo ng gumagamit bago tawagan ang reconfiguration na IOCTL.

Tandaan:
Sa kasalukuyan, ang anumang software program na nag-a-access sa FPGA, kabilang ang mga tumatakbo sa isang virtualized na host, ay dapat na sarado bago subukan ang isang bahagyang reconfiguration. Ang mga hakbang ay magiging:

  1. I-unload ang driver mula sa bisita
  2. Tanggalin sa saksakan ang VF mula sa bisita
  3. Huwag paganahin ang SR-IOV
  4. Magsagawa ng bahagyang muling pagsasaayos
  5. Paganahin ang SR-IOV
  6. Isaksak ang VF sa bisita
  7. Ikarga ang driver sa bisita

Virtualization ng FPGA
Upang paganahin ang pag-access sa isang accelerator mula sa mga application na tumatakbo sa isang VM, ang kaukulang port ng AFU ay kailangang italaga sa isang VF gamit ang mga sumusunod na hakbang:

  1. Ang PF ay nagmamay-ari ng lahat ng AFU port bilang default. Ang anumang port na kailangang italaga sa isang VF ay dapat munang ilabas mula sa PF sa pamamagitan ng FPGA_FME_PORT_RELEASE ioctl sa FME device.
  2. Kapag na-release ang N port mula sa PF, magagamit ang command sa ibaba para paganahin ang mga SRIOV at VF. Ang bawat VF ay nagmamay-ari lamang ng isang port na may AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Dumaan sa mga VF sa mga VM.
  4. Ang AFU sa ilalim ng VF ay naa-access mula sa mga application sa VM (gamit ang parehong driver sa loob ng VF).

Tandaan:
Ang isang FME ay hindi maaaring italaga sa isang VF, kaya ang PR at iba pang mga function ng pamamahala ay magagamit lamang sa pamamagitan ng PF.

Organisasyon ng Driver

Driver ng PCIe Module Device

Organisasyon ng Driver

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

Lumilitaw ang mga FPGA device bilang regular na PCIe device; kaya, ang driver ng device ng FPGA PCIe (intel-FPGA-PCI.ko) ay laging unang nilo-load kapag may nakitang FPGA PCIe PF o VF. Ang driver na ito ay gumaganap ng isang imprastraktura na papel sa arkitektura ng driver. ito:

  • Gumagawa ng FPGA container device bilang magulang ng mga feature device.
  • Naglalakad sa Listahan ng Feature ng Device, na ipinapatupad sa memorya ng BAR ng PCIe device, upang matuklasan ang mga feature na device at ang kanilang mga sub-feature at gumawa ng mga platform device para sa kanila sa ilalim ng container device.
  • Sinusuportahan ang SR-IOV.
  • Ipinapakilala ang imprastraktura ng feature na device, na kumukuha ng mga operasyon para sa mga sub-feature at inilalantad ang mga karaniwang function sa mga feature driver ng device.

Mga Function ng Driver ng Device ng PCIe Module

  • Naglalaman ng PCIe discovery, device enumeration, at feature discovery.
  • Lumilikha ng mga direktoryo ng sysfs para sa pangunahing device, FPGA Management Engine (FME), at Port.
  • Lumilikha ng mga instance ng driver ng platform, na nagiging sanhi ng pag-load ng kernel ng Linux ng kani-kanilang mga driver ng module ng platform.

Driver ng FME Platform Module Device

  • Power at thermal management, pag-uulat ng error, pag-uulat ng pagganap, at iba pang mga function ng imprastraktura. Maa-access mo ang mga function na ito sa pamamagitan ng mga interface ng sysfs na inilantad ng driver ng FME.
  • Bahagyang Reconfiguration. Ang driver ng FME ay nagrerehistro ng isang FPGA Manager sa panahon ng pagsisimula ng sub-feature ng PR; sa sandaling makatanggap ito ng FPGA_FME_PORT_PR ioctl mula sa iyo, hinihiling nito ang karaniwang function ng interface mula sa FPGA Manager upang makumpleto ang bahagyang muling pagsasaayos ng bitstream sa ibinigay na Port.
  • Pamamahala ng port para sa virtualization. Ang driver ng FME ay nagpapakilala ng dalawang ioctls, FPGA_FME_PORT_RELEASE, na naglalabas ng ibinigay na Port mula sa PF; at FPGA_FME_PORT_ASSIGN, na nagtatalaga ng Port pabalik sa PF. Kapag ang Port ay inilabas mula sa PF, maaari itong italaga sa VF sa pamamagitan ng mga interface ng SR-IOV na ibinigay ng driver ng PCIe. Para sa karagdagang impormasyon, sumangguni sa “FPGA Virtualization”.

Mga Function ng Driver ng Device ng FME Platform Module

  • Lumilikha ng node ng device ng character na FME.
  • Lumilikha ng FME sysfs files at nagpapatupad ng FME sysfs file mga accessor.
  • Ipinapatupad ang mga sub-driver ng pribadong tampok ng FME.
  • Mga sub-driver ng pribadong tampok ng FME:
    • Header ng FME
    • Pamamahala ng Thermal
    • Pamamahala ng Kapangyarihan
    • Pandaigdigang Error
    • Bahagyang Reconfiguration
    • Pandaigdigang Pagganap

Driver ng Device ng Port Platform Module
Katulad ng FME driver, ang FPGA Port (at AFU) driver (intel-fpga-afu. ko) ay sinusuri kapag ang Port platform device ay ginawa. Ang pangunahing function ng module na ito ay magbigay ng interface para sa mga application ng user-space upang ma-access ang mga indibidwal na accelerators, kabilang ang basic reset control sa Port, AFU MMIO region export, DMA buffer mapping service, UMsg(1) notification, at remote debug functions ( tingnan sa itaas).

Ang UMsg ay sinusuportahan lamang sa pamamagitan ng Acceleration Stack para sa Intel Xeon® Processor na may Integrated FPGA.

Mga Function ng Driver ng Device ng Port Platform Module

  • Lumilikha ng node ng Port character na device.
  • Lumilikha ng Port sysfs files at ipinapatupad ang Port sysfs file mga accessor.
  • Ipinapatupad ang mga sub-driver na pribadong tampok ng Port.
  • Mga sub-driver ng pribadong tampok na port:
    • Header ng Port
    • AFU
    • Error sa Port
    • UMsg(2)
    • Pag-tap ng Signal

Application FPGA Device Enumeration
Ipinapakilala ng seksyong ito kung paano binibilang ng mga application ang FPGA device mula sa sysfs hierarchy sa ilalim ng /sys/class/fpga. Sa exampsa ibaba, dalawang Intel FPGA device ang naka-install sa host. Ang bawat FPGA device ay may isang FME at dalawang Port (AFU). Para sa bawat FPGA device, isang direktoryo ng device ang ginawa sa ilalim ng /sys/class/fpga:

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

Ang bawat node ay may isang FME at dalawang Port (AFU) bilang mga child device:
/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

Sa pangkalahatan, ang mga interface ng FME/Port sysfs ay pinangalanan bilang mga sumusunod:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

na sunud-sunod kong binibilang ang lahat ng container device, j na sunud-sunod na binibilang ang FME at k na magkakasunod na binibilang ang lahat ng Port.

Ang mga node ng device na ginagamit para sa ioctl() at mmap() ay maaaring i-reference sa pamamagitan ng:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Enumeration ng PCIe Driver
Ang seksyon na ito ay nagbibigay ng isang higit saview ng daloy ng code para sa enumeration ng device na isinagawa ng intel-fpga-pci.ko. Ang mga pangunahing istruktura at pag-andar ng data ay naka-highlight. Ang seksyong ito ay pinakamahusay na sinusunod kung kailan viewsa kasamang source code (pcie.c).

Enumeration Data Structures

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
static na struct idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *pangalan;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
static na struct class *fpga_class;
static na struct pci_device_id cci_pcie_id_tbl[] = {
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_MCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_SKX_P),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_RCiEP0_DCP),},
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIe_DEVICE_ID_VF_DCP),},
{0,}
};
static struct 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 device *fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int released_port_num;
struct list_head na mga rehiyon;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
walang bisa __iomem *ioaddr;
walang bisa __iomem *ioend;
int current_bar;
walang bisa __iomem *pfme_hdr;
struct device *parent_dev;
struct platform_device *feature_dev;
};

Daloy ng Enumeration

  • ccidrv_init()
    • Magsimula fpga_ids gamit ang idr_init().
    • Simulan ang fpga_chrdevs[i].devt gamit ang alloc_chrdev_region().
    • Simulan ang fpga_class gamit ang class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Paganahin ang PCI device, humiling ng access sa mga rehiyon nito, itakda ang PCI master mode, at i-configure ang DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Maglaan ng struct build_feature_devs_info, simulan ito.
      Nakatakda ang .parent_dev sa isang parent sysfs directory (intel-fpga-dev.id) na naglalaman ng mga direktoryo ng FME at Port sysfs.
  • parse_feature_list()
    • Maglakad sa BAR0 Device Feature List upang matuklasan ang FME, ang Port, at ang kanilang mga pribadong feature.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Kapag nakatagpo ng FME:
  • build_info_create_dev()
    • Maglaan ng platform device para sa FME, na nag-iimbak sa build_feature_devs_info.feature_dev.
    • Ang feature_dev.id ay pinasimulan sa resulta ng idr_alloc(fpga_ids[FME_ID],
    • Ang feature_dev.parent ay nakatakda sa build_feature_devs_info.parent_dev.
    • Maglaan ng hanay ng mga mapagkukunan ng istruktura sa feature_dev.resource.
  • Maglaan ng struct feature_platform_data, simulan ito, at mag-imbak ng pointer sa feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Simulan ang feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Magsimula ng feature_platform_data.features[FME_FEATURE_ID_HEADER], lahat maliban sa .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Kapag nakatagpo ang isang Port:
  • build_info_create_dev()
    • Maglaan ng platform device para sa Port, na nag-iimbak sa build_feature_devs_info.feature_dev.
    • Ang feature_dev.id ay pinasimulan sa resulta ng idr_alloc(fpga_ids[PORT_ID],
    • Ang feature_dev.parent ay nakatakda sa build_feature_devs_info.parent_dev.
    • Maglaan ng array ng struct resource sa feature_dev.resource.
    • Maglaan ng struct feature_platform_data, simulan ito, at mag-imbak ng pointer sa feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Idagdag ang struct feature_platform_data.node para sa Port sa listahan ng Mga Port sa struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Simulan ang feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Magsimula ng feature_platform_data.features[PORT_FEATURE_ID_HEADER], lahat maliban sa .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Kapag nakatagpo ng AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Magsimula ng feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Magsimula ng feature_platform_data.features[PORT_FEATURE_ID_UAFU], lahat maliban sa .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Kapag nakatagpo ang isang pribadong feature ng FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Magsimula feature_dev.resource[id].
  • feature_platform_data_add()
    • Magsimula ng feature_platform_data.features[id], lahat maliban sa .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Kapag nakatagpo ang isang Port private feature: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Simulan ang feature_platform_data.features[id], lahat maliban sa .fops.
  • parse_ports_from_fme()
    • Kung ang driver ay na-load sa Physical Function (PF), kung gayon:
  • Patakbuhin ang daloy ng parse_feature_list() sa bawat port na inilarawan sa header ng FME.
  • Gamitin ang BAR na binanggit sa bawat Port entry sa header.

Pagsisimula ng FME Platform Device
Ang seksyon na ito ay nagbibigay ng isang higit saview ng daloy ng code para sa pagsisimula ng FME device na isinagawa ng intel-fpga-fme.ko. Ang mga pangunahing istruktura at function ng data ay naka-highlight. Ang seksyong ito ay pinakamahusay na sinusunod kung kailan viewsa kasamang source code (fme-main.c).

Mga Structure ng Data ng Device ng FME Platform

struct feature_ops {
int (* init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
mahaba (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (* pagsubok)(struct platform_device *pdev, struct feature *feature);
};
tampok na istruktura {
const char *pangalan;
int resource_index;
walang bisa __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
walang bisa *pribado;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *)); struct
tampok na mga tampok[0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
struct device *fme_dev;
struct list_head node;
struct list_head mga bata;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
struct device *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

Daloy ng Pagsisimula ng FME Platform Device

Daloy ng Pagsisimula ng FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Magsimula ng isang struct fpga_fme at iimbak ito sa feature_platform_data.private na field.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Mag-save ng struct feature_ops sa feature_platform_data.features para sa bawat populated na feature.
    • Tawagan ang test function, kung mayroon man, mula sa struct.
    • Tawagan ang init function mula sa struct.
  • fme_probe() fpga_register_dev_ops()
    • Gumawa ng FME character device node, na nagrerehistro ng isang struct file_operasyon.

Pagsisimula ng Port Platform Device
Ang seksyon na ito ay nagbibigay ng isang higit saview ng daloy ng code para sa pagsisimula ng port device na isinagawa ng intel-fpga-afu.ko. Ang mga pangunahing istruktura at pag-andar ng data ay naka-highlight. Ang seksyong ito ay pinakamahusay na sinusunod kung kailan viewsa kasamang source code (afu.c).

Mga Structure ng Data ng Port Platform ng Device

struct feature_ops {
int (* init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
mahaba (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (* pagsubok)(struct platform_device *pdev, struct feature *feature);
};
tampok na istruktura {
const char *pangalan;
int resource_index;
walang bisa __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
walang bisa *pribado;
int num;
int (*config_port)(struct platform_device *, u32, bool);
struct platform_device *(*fpga_for_each_port)(struct platform_device *,
void *, int (*match)(struct platform_device *, void *));
struct feature features[0];
};
struct fpga_afu_region {
u32 index;
mga flag ng u32;
u64 laki;
u64 offset;
u64 pisikal;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 haba;
u64 iova;
pahina ng istruktura **mga pahina;
struct rb_node node;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head na mga rehiyon;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Daloy ng Pagsisimula ng Port Platform Device

Daloy ng Pagsisimula ng Portintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Magsimula ng isang struct fpga_afu at iimbak ito sa feature_platform_data.private na field.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Mag-save ng struct feature_ops sa feature_platform_data.features para sa bawat populated na feature.
    • Tawagan ang test function, kung mayroon man, mula sa struct.
    • Tawagan ang init function mula sa struct.
  • afu_probe() fpga_register_dev_ops()
    • Lumikha ng Port character na device node, na nagrerehistro ng isang struct file_operasyon.

Mga FME IOCTL
Mga IOCTL na tinatawag na bukas file descriptor para sa /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—ibalik ang kasalukuyang bersyon bilang integer, simula sa 0.

FPGA_CHECK_EXTENSION—kasalukuyang hindi suportado.

FPGA_FME_PORT_RELEASE—ang arg ay isang pointer sa isang:

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 mga flag; // sa: dapat ay 0
__u32 port_id; // sa: port ID (mula 0) para ilabas.
};

FPGA_FME_PORT_ASSIGN—ang arg ay isang pointer sa isang:

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 mga flag; // sa: dapat ay 0
__u32 port_id; // sa: port ID (mula sa 0) upang italaga. (dapat naging
naunang inilabas ng FPGA_FME_PORT_RELEASE)
};

Ang FPGA_FME_PORT_PR—arg ay isang pointer sa isang:

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 mga flag; // sa: dapat ay 0
__u32 port_id; // sa: port ID (mula sa 0)
__u32 buffer_size; // in: laki ng bitstream buffer sa bytes. Dapat ay 4-byte
nakahanay.
__u64 buffer_address; // in: process address ng bitstream buffer
__u64 katayuan; // out: status ng error (bitmask)
};

Port IOCTLs
Mga IOCTL na tinatawag na bukas file descriptor para sa /dev/intel-fpga-port.k FPGA_GET_API_VERSION—ibalik ang kasalukuyang bersyon bilang integer, simula sa 0. FPGA_CHECK_EXTENSION—hindi sinusuportahan sa kasalukuyan.

FPGA_PORT_GET_INFO—ang arg ay isang pointer sa isang:

struct fpga_port_info {
__u32 argsz; // sa: sizeof(struct fpga_port_info)
__u32 mga flag; // out: nagbabalik ng 0
__u32 num_regions; // out: bilang ng mga rehiyon ng MMIO, 2 (1 para sa AFU at 1 para sa
STP)
__u32 num_umsgs; // out: bilang ng mga UMsg na sinusuportahan ng hardware
};

FPGA_PORT_GET_REGION_INFO—ang arg ay isang pointer sa isang:

struct fpga_port_region_info {
__u32 argsz; // sa: sizeof(struct fpga_port_region_info)
__u32 mga flag; // out: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 index; // sa: FPGA_PORT_INDEX_UAFU o FPGA_PORT_INDEX_STP
__u32 padding; // sa: dapat ay 0
__u64 laki; // out: laki ng MMIO region sa bytes
__u64 offset; // out: offset ng MMIO region mula sa simula ng device fd
};

FPGA_PORT_DMA_MAP—ang arg ay isang pointer sa isang:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 mga flag; // in: dapat ay 0 __u64 user_addr; // sa: proseso ng virtual
address. Dapat na nakahanay sa pahina.
__u64 haba; // sa: haba ng pagmamapa sa bytes. Dapat ay maramihang pahina
laki.
__u64 iova; // out: IO virtual address };

FPGA_PORT_DMA_UNMAP—ang arg ay isang pointer sa isang:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 mga flag; // sa: dapat ay 0
__u64 iova; // sa: IO virtual address na ibinalik ng isang nakaraan
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—ang arg ay dapat NULL.
  • FPGA_PORT_UMSG_ENABLE—ang arg ay dapat NULL.
  • FPGA_PORT_UMSG_DISABLE—ang mga arg ay dapat NULL.

FPGA_PORT_UMSG_SET_MODE—ang arg ay isang pointer sa isang:

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 mga flag; // sa: dapat ay 0
__u32 hint_bitmap; // sa: UMsg hint mode bitmap. Nagsasaad kung alin ang mga UMsg
pinagana.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • Dapat na hindi pinagana ang UMsg bago ibigay ang ioctl na ito.
  • Ang field ng iova ay dapat para sa isang buffer na sapat na malaki para sa lahat ng UMsg's (num_umsgs * PAGE_SIZE).
    • Ang buffer ay minarkahan bilang "ginagamit" ng pamamahala ng buffer ng driver.
    • Kung ang iova ay NULL, ang anumang nakaraang rehiyon ay hindi minarkahan bilang "ginagamit".
  • Ang arg ay isang pointer sa isang:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • mga flag ng u32; // sa: dapat ay 0
    • u64 iova; // sa: IO virtual address mula sa FPGA_PORT_DMA_MAP. };

Tandaan:

  • Upang i-clear ang mga error sa port, kailangan mong isulat ang eksaktong bitmask ng mga kasalukuyang error, halimbawaample, cat errors > clear
  • Ang UMsg ay sinusuportahan lamang sa pamamagitan ng Acceleration Stack para sa Intel Xeon Processor na may Integrated FPGA.

sysfs Files

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

sysfs file mmio field uri access
ports_num fme_header.capability.num_ports decimal int Read-only
cache_size fme_header.capability.cache_size decimal int Read-only
bersyon fme_header.capability.fabric_verid decimal int Read-only
socket_id fme_header.capability.socket_id decimal int Read-only
bitstream_id fme_header.bitstream_id hex uint64_t Read-only
bitstream_metadata fme_header.bitstream_md hex uint64_t Read-only

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

sysfs file mmio field uri access
threshold1 thermal.threshold.tmp_thshold1 decimal int User: Read-only Root: Read-write
threshold2 thermal.threshold.tmp_thshold2 decimal int User: Read-only Root: Read-write
threshold_trip thermal.threshold.therm_trip_thshold decimal int Read-only
threshold1_reached thermal.threshold.thshold1_status decimal int Read-only
threshold2_reached thermal.threshold.thshold2_status decimal int Read-only
threshold1_patakaran thermal. threshold.thshold_policy decimal int User: Read-only Root: Read-write
temperatura thermal.rdsensor_fm1.fpga_temp decimal int Read-only

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

sysfs file mmio field uri access
natupok kapangyarihan.status.pwr_consumed hex uint64_t Read-only
threshold1 kapangyarihan.threshold.threshold1 hex uint64_t User: Read-only Root: Read-write
threshold2 kapangyarihan.threshold.threshold2 hex uint64_t User: Read-only Root: Read-write
threshold1_status power.threshold.threshold1_status decimal na hindi nalagdaan Read-only
threshold2_status power.threshold.threshold2_status decimal na hindi nalagdaan Read-only
rtl power.status.fpga_latency_report decimal na hindi nalagdaan Read-only

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

sysfs file mmio field uri access
pcie0_errors gerror.pcie0_err hex uint64_t Basa sulat
pcie1_errors gerror.pcie1_err hex uint64_t Basa sulat
inject_error gerror.ras_error_inj hex uint64_t Basa sulat

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

sysfs file mmio field uri access
mga pagkakamali gerror.fme_err hex uint64_t Read-only
first_error gerror.fme_first_err.err_reg_status hex uint64_t Read-only
next_error gerror.fme_next_err.err_reg_status hex uint64_t Read-only
malinaw Tinatanggal ang mga error, first_error, next_error iba't ibang uint64_t Isulat-lamang

Tandaan:
Upang i-clear ang mga error sa FME, dapat mong isulat ang eksaktong bitmask ng mga kasalukuyang error, halimbawaample cat errors > clear.

FME Bahagyang Reconfiguration sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file mmio field uri access
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte Read-only

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

sysfs file mmio field uri access
orasan gperf.clk.afu_interf_clock hex uint64_t Read-only

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Hindi valid para sa Acceleration Stack para sa Intel Xeon CPU na may mga FPGA)

sysfs file mmio field uri access
mag-freeze gperf.ch_ctl.freeze decimal int Basa sulat
read_hit gperf.CACHE_RD_HIT hex uint64_t Read-only
read_miss gperf.CACHE_RD_MISS hex uint64_t Read-only
write_hit gperf.CACHE_WR_HIT hex uint64_t Read-only
write_miss gperf.CACHE_WR_MISS hex uint64_t Read-only
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Read-only
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Read-only
sysfs file mmio field uri access
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Read-only
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Read-only
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Read-only

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Hindi valid para sa Acceleration Stack para sa Intel Xeon CPU na may mga FPGA)

sysfs file mmio field uri access
mag-freeze gperf.vtd_ctl.freeze decimal int User: Read-only Root: Read-write

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Hindi valid para sa Acceleration Stack para sa Intel Xeon CPU na may mga FPGA)

sysfs file mmio field uri access
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Read-only
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Read-only
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Read-only
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Read-only

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

sysfs file mmio field uri access
paganahin gperf.fab_ctl.(enabled) decimal int User: Read-only Root: Read-write
mag-freeze gperf.fab_ctl.freeze decimal int User: Read-only Root: Read-write
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Read-only
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Read-only
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Read-only
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Read-only
upi_read gperf.FAB_UPI_RD hex uint64_t Read-only
upi_write gperf.FAB_UPI_WR hex uint64_t Read-only

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

sysfs file mmio field uri access
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Read-only
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Read-only
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Read-only
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Read-only
upi_read gperf.FAB_UPI_RD hex uint64_t Read-only
upi_write gperf.FAB_UPI_WR hex uint64_t Read-only

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

sysfs file mmio field uri access
id port_header.capability.port_number decimal int Read-only
Ltr port_header.control.latency_tolerance decimal int Read-only

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

sysfs file mmio field uri access
afu_id afu_header.guid hex 16-byte Read-only

Mga sysfs ng Error sa Port files
intel-fpga-dev.i/intel-fpga-port.k/errors/

sysfs file mmio field uri access
mga pagkakamali perror.port_error hex uint64_t Read-only
first_error perror.port_first_error hex uint64_t Read-only
first_malformed_req perror.malreq hex 16-byte Read-only
malinaw perror.(lahat ng error) iba't ibang uint64_t Isulat-lamang

Tandaan:
Upang i-clear ang mga error sa Port, dapat mong isulat ang eksaktong bitmask ng mga kasalukuyang error, halimbawaample cat errors > clear.

Kasaysayan ng Pagbabago

Bersyon ng Dokumento Mga pagbabago
2017.10.02 Paunang Paglabas.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Mga Dokumento / Mga Mapagkukunan

intel OPAE FPGA Linux Device Driver Architecture [pdf] Gabay sa Gumagamit
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

Mga sanggunian

Mag-iwan ng komento

Ang iyong email address ay hindi maipa-publish. Ang mga kinakailangang field ay minarkahan *