intel-logo

Intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

Ny mpamily OPAE Intel FPGA dia manome interface tsara ho an'ny rindranasan'ny habaka mpampiasa mba handrindrana, hanisa, hanokafana ary hidirana amin'ny accelerators FPGA amin'ny sehatra misy vahaolana Intel FPGA ary manome fahafahana ny asa fitantanana amin'ny sehatra toy ny fanavaozana ny FPGA, ny fitantanana herinaratra ary ny virtoaly.

Hardware Architecture

Avy amin'ny dikan'ny OS view, ny fitaovana FPGA dia miseho ho fitaovana PCIe mahazatra. Ny fitadidiana fitaovana FPGA dia voalamina amin'ny alàlan'ny firafitry ny angon-drakitra efa voafaritra mialoha (Lisitry ny fitaovana). Ireo endri-javatra tohanan'ny fitaovana FPGA dia miseho amin'ny alalan'ireto rafitra angon-drakitra ireto, araka ny aseho eto ambany amin'ity sary manaraka ity:

FPGA PCIe Device

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

Ny mpamily dia manohana ny PCIe SR-IOV mba hamoronana Virtual Functions (VFs) izay azo ampiasaina hanendrena ny accelerators tsirairay amin'ny milina virtoaly.

Intel Corporation. Zo rehetra voatokana. Ny Intel, ny logo Intel, ary ny marika Intel hafa dia marika famantarana ny Intel Corporation na ny sampany. Ny Intel dia manome antoka ny fanatanterahana ny vokatra FPGA sy ny semiconductor amin'ny fepetra ankehitriny mifanaraka amin'ny fiantohana manara-penitra an'ny Intel saingy manana zo hanova ny vokatra sy serivisy amin'ny fotoana rehetra tsy misy filazana. Tsy mandray andraikitra na andraikitra avy amin'ny fampiharana na fampiasana fampahalalana, vokatra na serivisy voalaza eto ny Intel afa-tsy izay neken'ny Intel an-tsoratra. Manoro hevitra ny mpanjifa Intel mba hahazo ny kinova farany momba ny fanondroana fitaovana alohan'ny hianteherana amin'ny fampahalalana navoaka sy alohan'ny hametrahana baiko ho an'ny vokatra na serivisy.

Ny anarana sy ny marika hafa dia azo lazaina ho fananan'ny hafa.

Fitaovana FPGA PCIe virtoaly

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

FPGA Management Engine (FME)
Ny motera Fitantanana FPGA dia manatanteraka ny fitantanana ny herinaratra sy ny hafanana, ny tatitra momba ny fahadisoana, ny fanavaozana, ny tatitra momba ny zava-bita ary ny asa fotodrafitrasa hafa. Ny FPGA tsirairay dia manana FME iray, izay idirana hatrany amin'ny alàlan'ny Fisiana ara-batana (PF). Ny rindranasa mpampiasa-space dia afaka mahazo fidirana manokana amin'ny FME amin'ny alàlan'ny open(), ary mamoaka azy amin'ny alàlan'ny close() ho mpampiasa manana tombontsoa (root).

Port
Ny seranana dia maneho ny fifandraisana misy eo amin'ny lamba FPGA static (ny “FPGA Interface Manager (FIM)”) sy ny faritra azo amboarina amin'ny ampahany misy ny Accelerator Function (AF). Ny Port dia mifehy ny fifandraisana avy amin'ny rindrambaiko mankany amin'ny accelerator ary mampiseho ireo endri-javatra toy ny famerenana sy ny debug. Ny fitaovana PCIe dia mety manana seranana maromaro, ary ny seranan-tsambo tsirairay dia azo aseho amin'ny alalan'ny VF amin'ny alàlan'ny fanendrena azy amin'ny fampiasana ny FPGA_FME_PORT_ASSIGN ioctl amin'ny fitaovana FME.

Fiarahan'ny Accelerator (AF).

  • Ny singa Accelerator Function (AF) dia mifatotra amin'ny seranana ary mampiseho faritra 256K MMIO ampiasaina amin'ny rejisitra fanaraha-maso manokana amin'ny accelerator.
  • Afaka mahazo fidirana manokana amin'ny AFU mipetaka amin'ny seranana ny rindranasan'ny habaka mpampiasa amin'ny alàlan'ny fampiasana open() amin'ny fitaovana Port, ary mamoaka izany amin'ny alalan'ny close().
  • Ny fampiharana habaka mpampiasa dia afaka koa mmap() accelerator faritra MMIO.

Reconfiguration ampahany
Araka ny voalaza etsy ambony, ny accelerators dia azo amboarina amin'ny alàlan'ny fanavaozana ampahany amin'ny Accelerator Function (AF) file. Tsy maintsy noforonina ho an'ny FIM marina sy faritra static (Port) an'ny FPGA ny Accelerator Function (AF); raha tsy izany dia tsy hahomby ny asa fanamboarana ary mety hiteraka tsy fandriam-pahalemana ny rafitra. Ity fifanarahana ity dia azo jerena amin'ny fampitahana ny ID interface voamarika ao amin'ny lohatenin'ny AF amin'ny ID interface izay asehon'ny FME amin'ny alàlan'ny sysfs. Ity fisavana ity dia matetika ataon'ny habaka mpampiasa alohan'ny hiantsoana ny fanavaozana IOCTL.

Fanamarihana:
Amin'izao fotoana izao, izay programa rindrambaiko miditra amin'ny FPGA, anisan'izany ireo mandeha amin'ny mpampiantrano virtoaly, dia tsy maintsy mikatona alohan'ny hanandrana fanavaozana ampahany. Ny dingana dia ho:

  1. Esory ny mpamily amin'ny vahiny
  2. Esory ny VF amin'ny vahiny
  3. Atsaharo ny SR-IOV
  4. Manaova fanamboarana ampahany
  5. Alefaso ny SR-IOV
  6. Ampidiro amin'ny vahiny ny VF
  7. Ampidiro ao amin'ny vahiny ny mpamily

FPGA Virtualization
Mba ahafahana miditra amin'ny accelerator avy amin'ny rindranasa mandeha amin'ny VM, ny seranan-tsambon'ny AFU tsirairay dia mila apetraka amin'ny VF amin'ny fampiasana ireto dingana manaraka ireto:

  1. Ny PF dia manana ny seranana AFU rehetra amin'ny alàlan'ny default. Izay seranan-tsambo mila afindra amin'ny VF dia tsy maintsy avoaka amin'ny PF aloha amin'ny alalan'ny FPGA_FME_PORT_RELEASE ioctl amin'ny fitaovana FME.
  2. Raha vao mivoaka ny port N avy amin'ny PF, dia azo ampiasaina ny baiko etsy ambany mba ahafahan'ny SRIOV sy VFs. Ny VF tsirairay dia tsy manana afa-tsy seranana iray misy AFU. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Mandehana amin'ny VF mankany VM.
  4. Ny AFU eo ambanin'ny VF dia azo idirana amin'ny fampiharana ao amin'ny VM (mampiasa mpamily iray ao anatin'ny VF).

Fanamarihana:
Ny FME dia tsy azo tendrena amin'ny VF, noho izany ny PR sy ny asa fitantanana hafa dia tsy misy afa-tsy amin'ny PF.

Fandaminana mpamily

PCIe Module Device Driver

Fandaminana mpamily

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

Ny fitaovana FPGA dia miseho ho fitaovana PCIe mahazatra; noho izany, ny mpamily fitaovana FPGA PCIe (intel-FPGA-PCI.ko) dia alefa aloha foana rehefa hita ny FPGA PCIe PF na VF. Ity mpamily ity dia mitana anjara toerana ara-drafitra amin'ny rafitry ny mpamily. izany:

  • Mamorona fitaovana fitahirizana FPGA ho toy ny ray aman-drenin'ireo fitaovana manasongadina.
  • Mandeha amin'ny lisitry ny endri-javatra amin'ny fitaovana, izay ampiharina amin'ny fitadidiana BAR fitaovana PCIe, mba hahitana ireo fitaovana manasongadina sy ny sub-endriny ary mamorona fitaovana amin'ny sehatra ho azy ireo eo ambanin'ny fitaovana fitahirizana.
  • Manohana ny SR-IOV.
  • Mampiditra ny fotodrafitrasa fitaovan-tsarimihetsika, izay manaisotra ny asa ho an'ny zana-tsarimihetsika ary mampiseho ny fiasa mahazatra amin'ny mpamily fitaovana.

PCIe Module Device Driver Functions

  • Ahitana fikarohana PCIe, fanisana fitaovana ary fahitana endri-javatra.
  • Mamorona lahatahiry sysfs ho an'ny fitaovan'ny ray aman-dreny, FPGA Management Engine (FME), ary Port.
  • Mamorona ohatry ny mpamily amin'ny sehatra, ka mahatonga ny kernel Linux hampiditra ny mpamily modely amin'ny sehatra tsirairay.

FME Platform Module Device Driver

  • Fitantanana herinaratra sy hafanana, tatitra lesoka, tatitra momba ny zava-bita ary asa fotodrafitrasa hafa. Azonao atao ny miditra amin'ireo fiasa ireo amin'ny alàlan'ny interface sysfs asehon'ny mpamily FME.
  • Reconfiguration ampahany. Ny mpamily FME dia manoratra Mpitantana FPGA mandritra ny fanombohana sub-feature PR; raha vao mahazo FPGA_FME_PORT_PR ioctl avy aminao izy dia miantso ny fonction interface mahazatra avy amin'ny FPGA Manager hamita ny fanamboarana ampahany amin'ny bitstream mankany amin'ny Port nomena.
  • Fitantanana seranan-tsambo ho an'ny virtoaly. Ny mpamily FME dia mampiditra ioctls roa, FPGA_FME_PORT_RELEASE, izay mamoaka ny Port nomena avy amin'ny PF; ary FPGA_FME_PORT_ASSIGN, izay mamerina ny Port ho PF. Raha vao mivoaka avy ao amin'ny PF ny Port, dia azo apetraka amin'ny VF amin'ny alàlan'ny interface SR-IOV nomen'ny mpamily PCIe. Raha mila fanazavana fanampiny dia jereo ny “FGA Virtualization”.

FME Platform Module Device Driver Functions

  • Mamorona ny node fitaovana toetran'ny FME.
  • Mamorona ny FME sysfs files ary mampihatra ny FME sysfs file accessors.
  • Mampihatra ny sub-driver FME manokana.
  • Ireo sub-driver FME manokana:
    • Lohatenin'ny FME
    • Fitantanana mafana
    • Fitantanana herinaratra
    • Global Error
    • Reconfiguration ampahany
    • Global Performance

Port Platform Module Device Driver
Mitovitovy amin'ny mpamily FME, ny mpamily FPGA Port (sy AFU) (intel-fpga-afu. ko) dia voazaha toetra rehefa noforonina ny fitaovana Port platform. Ny tena asa an'ity môdely ity dia ny manome interface tsara ho an'ny rindranasan'ny habaka mpampiasa mba hidirana amin'ny accelerators tsirairay, ao anatin'izany ny fanaraha-maso famerenana fototra amin'ny Port, fanondranana faritra AFU MMIO, serivisy fametahana sariitatra DMA, fampahafantarana UMsg(1), ary fiasa debug lavitra ( jereo etsy ambony).

UMsg dia tohanana amin'ny alàlan'ny Acceleration Stack ho an'ny Intel Xeon® Processor miaraka amin'ny FPGA Integrated.

Port Platform Module Device Driver Functions

  • Mamorona ny node fitaovana Port character.
  • Mamorona ny Port sysfs files ary mampihatra ny Port sysfs file accessors.
  • Mampihatra ny sub-drivers amin'ny Port private feature.
  • Port private feature sub-drivers:
    • Port Header
    • AFU
    • Error Port
    • UMsg(2)
    • Signal Tap

Fanisana fitaovana FPGA
Ity fizarana ity dia mampiditra ny fomba fanisan'ny fampiharana ny fitaovana FPGA avy amin'ny ambaratonga sysfs eo ambanin'ny /sys/class/fpga. Ao amin'ny exampeo ambany, fitaovana Intel FPGA roa no napetraka ao amin'ny mpampiantrano. Ny fitaovana FPGA tsirairay dia manana FME iray sy seranan-tsambo roa (AFU). Ho an'ny fitaovana FPGA tsirairay dia misy lahatahiry fitaovana noforonina eo ambanin'ny /sys/class/fpga:

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

Ny node tsirairay dia manana FME iray sy seranan-tsambo roa (AFU) ho fitaovana ankizy:
/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

Amin'ny ankapobeny, ny FME/Port sysfs interfaces dia nomena anarana toy izao:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

miaraka amin'ny fanisàko ny laharan'ny fitaovan'ny kaontenera rehetra, j fanisana isa ny FME sy ny k misesy ny Seranana rehetra.

Ny node fitaovana ampiasaina amin'ny ioctl() sy mmap() dia azo lazaina amin'ny alalan'ny:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Fanisana mpamily PCIe
Ity fizarana ity dia manome mihoatraview ny fikorianan'ny kaody ho an'ny fanisana fitaovana ataon'ny intel-fpga-pci.ko. Asongadina ireo rafitra sy fiasa fototra. Ity fizarana ity no tsara arahina rehefa viewamin'ny kaody loharano miaraka aminy (pcie.c).

Rafitra angona fanisana

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
static struct idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char * anarana;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
kilasy struct static * fpga_class;
static 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;
fitaovana struct *fme_dev;
struct mutex hidin-trano;
struct list_head port_dev_list;
int released_port_num;
struct list_head faritra;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
fitaovana struct * parent_dev;
struct platform_device *feature_dev;
};

Fikoriana fanisana

  • ccidrv_init()
    • Atombohy ny fpga_ids mampiasa idr_init().
    • Atombohy ny fpga_chrdevs[i].devt mampiasa alloc_chrdev_region().
    • Atombohy ny fpga_class mampiasa class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Alefaso ny fitaovana PCI, mangataha fidirana amin'ny faritra misy azy, apetraho ny maodely master PCI, ary amboary ny DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Manomeza struct build_feature_devs_info, atombohy izany.
      .parent_dev dia napetraka amin'ny lahatahiry sysfs ray aman-dreny (intel-fpga-dev.id) misy ny lahatahiry FME sy Port sysfs.
  • parse_feature_list()
    • Mandehana amin'ny lisitry ny endri-javatra fitaovana BAR0 hahitana ny FME, ny seranan-tsambo ary ny endri-javatra manokana.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Rehefa sendra ny FME:
  • build_info_create_dev()
    • Manomeza fitaovana sehatra ho an'ny FME, mitahiry ao amin'ny build_feature_devs_info.feature_dev.
    • feature_dev.id dia natomboka tamin'ny vokatry ny idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent dia napetraka amin'ny build_feature_devs_info.parent_dev.
    • Mametraha karazana loharanon-drafitra ao amin'ny feature_dev.resource.
  • Manomeza struct feature_platform_data, atombohy izany, ary tehirizo tondro ao amin'ny feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Atombohy ny feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Atombohy ny feature_platform_data.features[FME_FEATURE_ID_HEADER], afa-tsy .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Rehefa sendra misy Port:
  • build_info_create_dev()
    • Mametraha fitaovana amin'ny sehatra ho an'ny Port, mitahiry ao amin'ny build_feature_devs_info.feature_dev.
    • feature_dev.id dia natomboka tamin'ny vokatry ny idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent dia napetraka amin'ny build_feature_devs_info.parent_dev.
    • Mametraha karazana loharanon-drafitra ao amin'ny feature_dev.resource.
    • Manomeza struct feature_platform_data, atombohy izany, ary tehirizo tondro ao amin'ny feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Ampio ny struct feature_platform_data.node ho an'ny Port amin'ny lisitry ny Ports ao amin'ny struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Atombohy ny feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Atombohy ny feature_platform_data.features[PORT_FEATURE_ID_HEADER], afa-tsy .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Rehefa sendra ny AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Atombohy ny feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Atombohy ny feature_platform_data.features[PORT_FEATURE_ID_UAFU], afa-tsy .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Rehefa sendra ny endri-javatra manokana FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Atombohy ny feature_dev.resource[id].
  • feature_platform_data_add()
    • Atombohy ny feature_platform_data.features[id], afa-tsy ny .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Rehefa sendra misy endri-javatra manokana Port: * create_feature_instance() build_info_add_sub_feature() * Initialize feature_dev.resource[id]. * feature_platform_data_add() Atombohy ny feature_platform_data.features[id], afa-tsy .fops.
  • parse_ports_from_fme()
    • Raha toa ka tafiditra ao amin'ny Physical Function (PF) ny mpamily, dia:
  • Alefaso ny fikorianan'ny parse_feature_list() isaky ny seranana voalaza ao amin'ny lohatenin'ny FME.
  • Ampiasao ny BAR voalaza ao amin'ny fidirana Port tsirairay ao amin'ny lohateny.

FME Platform Device Initialization
Ity fizarana ity dia manome mihoatraview ny fikorianan'ny kaody ho an'ny fanombohana fitaovana FME nataon'i intel-fpga-fme.ko. Ny rafitra sy ny fiasa fototra dia asongadina. Ity fizarana ity no tsara arahina rehefa viewamin'ny kaody loharano miaraka aminy (fme-main.c).

FME Platform Device Data Structures

struct feature_ops {
int (* init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
lava (* ioctl)(struct platform_device * pdev, endri-javatra struct * endri-javatra,
tsy misy sonia int cmd, arg tsy misy sonia);
int (* fitsapana)(struct platform_device *pdev, struct feature *feature);
};
endri-javatra struct {
const char * anarana;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex hidin-trano;
dev_status lava tsy misy sonia;
struct cdev cdev;
struct platform_device * dev;
unsigned int disable_count;
void * tsy miankina;
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
endri-javatra [0];
};
struct perf_object {
int id;
const struct attribute_group **attr_groups;
fitaovana struct *fme_dev;
struct list_head node;
struct list_head ankizy;
struct kobject kobj;
};
struct fpga_fme {
u8 port_id;
u64 pr_err;
fitaovana struct * dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

FME Platform Device Fikoriana fanombohana

FME Initialization Flowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Atombohy ny struct fpga_fme ary tehirizo ao amin'ny saha feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Tehirizo struct feature_ops ao amin'ny feature_platform_data.features ho an'ny endri-javatra misy mponina tsirairay.
    • Antsoy ny asa fitsapana, raha misy, avy amin'ny struct.
    • Antsoy ny asa init avy amin'ny struct.
  • fme_probe() fpga_register_dev_ops()
    • Mamorona ny node fitaovana toetran'ny FME, misoratra anarana struct file_operations.

Fanombohana fitaovana amin'ny Port Platform
Ity fizarana ity dia manome mihoatraview ny fikorianan'ny kaody ho an'ny fanombohana ny fitaovana seranan-tsambo nataon'i intel-fpga-afu.ko. Asongadina ireo rafitra sy fiasa fototra. Ity fizarana ity no tsara arahina rehefa viewmiaraka amin'ny code source (afu.c).

Firafitry ny angona fitaovana amin'ny seranan-tsambo

struct feature_ops {
int (* init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
lava (* ioctl)(struct platform_device * pdev, endri-javatra struct * endri-javatra,
tsy misy sonia int cmd, arg tsy misy sonia);
int (* fitsapana)(struct platform_device *pdev, struct feature *feature);
};
endri-javatra struct {
const char * anarana;
int resource_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex hidin-trano;
dev_status lava tsy misy sonia;
struct cdev cdev;
struct platform_device * dev;
unsigned int disable_count;
void * tsy miankina;
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 *));
endri-javatra struct [0];
};
struct fpga_afu_region {
fanondroana u32;
saina u32;
u64 habe;
u64 offset;
u64 fy;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 ny halavany;
u64 iova;
pejy struct **pejy;
struct rb_node node;
bool in_use;
};
struct fpga_afu {
u64 faritra_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head faritra;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Fikoriana fanombohana fitaovana amin'ny seranan-tsambo

Port Initialization Fikorianaintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Atombohy ny struct fpga_afu ary tehirizo ao amin'ny saha feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Tehirizo struct feature_ops ao amin'ny feature_platform_data.features ho an'ny endri-javatra misy mponina tsirairay.
    • Antsoy ny asa fitsapana, raha misy, avy amin'ny struct.
    • Antsoy ny asa init avy amin'ny struct.
  • afu_probe() fpga_register_dev_ops()
    • Mamorona ny node fitaovana Port character, misoratra anarana struct file_operations.

FME IOCTLs
IOCTLs antsoina hoe misokatra file mpamoritra ho an'ny /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—avereno ho integer ny kinova ankehitriny, manomboka amin'ny 0.

FPGA_CHECK_EXTENSION—tsy tohana amin'izao fotoana izao.

FPGA_FME_PORT_RELEASE—arg dia tondro ho an'ny:

struct fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 saina; // in: tokony ho 0
__u32 port_id; // in: port ID (avy amin'ny 0) havoaka.
};

FPGA_FME_PORT_ASSIGN—arg dia tondro mankany amin'ny:

struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 saina; // in: tokony ho 0
__u32 port_id; // amin'ny: port ID (avy amin'ny 0) hanendry. (tsy maintsy nisy
navoakan'ny FPGA_FME_PORT_RELEASE teo aloha)
};

FPGA_FME_PORT_PR—arg dia tondro ho an'ny:

struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 saina; // in: tokony ho 0
__u32 port_id; // in: port ID (avy amin'ny 0)
__u32 buffer_size; // in: haben'ny buffer bitstream amin'ny bytes. Tokony ho 4-byte
mirindra.
__u64 buffer_address; // in: adiresin'ny fizotry ny buffer bitstream
__u64 sata; // mivoaka: sata diso (bitmask)
};

Port IOCTLs
IOCTLs antsoina hoe misokatra file mpamoritra ho an'ny /dev/intel-fpga-port.k FPGA_GET_API_VERSION—avereno ho integer ny kinova ankehitriny, manomboka amin'ny 0. FPGA_CHECK_EXTENSION—tsy tohana amin'izao fotoana izao.

FPGA_PORT_GET_INFO—arg dia tondro ho:

struct fpga_port_info {
__u32 argsz; // in: sizeof(struct fpga_port_info)
__u32 saina; // mivoaka: miverina 0
__u32 num_faritra; // mivoaka: isan'ny faritra MMIO, 2 (1 ho an'ny AFU ary 1 ho an'ny
STP)
__u32 num_umsgs; // mivoaka: isan'ny UMsg tohanan'ny fitaovana
};

FPGA_PORT_GET_REGION_INFO—arg dia tondro ho:

struct fpga_port_region_info {
__u32 argsz; // in: sizeof(struct fpga_port_region_info)
__u32 saina; // mivoaka: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 fanondro; // amin'ny: FPGA_PORT_INDEX_UAFU na FPGA_PORT_INDEX_STP
__u32 padding; // in: tokony ho 0
__u64 habe; // mivoaka: haben'ny faritra MMIO amin'ny bytes
__u64 offset; // mivoaka: offset ny faritra MMIO hatramin'ny fanombohan'ny fitaovana fd
};

FPGA_PORT_DMA_MAP—arg dia tondro mankany amin'ny:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 saina; // in: tsy maintsy 0 __u64 user_addr; // in: process virtoaly
adiresy. Tsy maintsy mifanaraka amin'ny pejy.
__u64 halavany; // in: halavan'ny sarintany amin'ny bytes. Tsy maintsy pejy maromaro
habe.
__u64 iova; // mivoaka: adiresy virtoaly IO };

FPGA_PORT_DMA_UNMAP—arg dia tondro mankany amin'ny:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 saina; // in: tokony ho 0
__u64 iova; // in: adiresy virtoaly IO naverin'ny teo aloha
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—tsy maintsy NULL ny arg.
  • FPGA_PORT_UMSG_ENABLE—tsy maintsy NULL ny arg.
  • FPGA_PORT_UMSG_DISABLE—tsy maintsy NULL ny args.

FPGA_PORT_UMSG_SET_MODE—arg dia tondro mankany amin'ny:

struct fpga_port_umsg_cfg {
__u32 argsz; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 saina; // in: tokony ho 0
__u32 hint_bitmap; // amin'ny: UMsg mode bitmap. Midika hoe iza ny UMsg
afaka.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • Tsy maintsy vonoina ny UMsg alohan'ny hamoahana ity ioctl ity.
  • Ny saha iova dia tokony ho an'ny buffer ampy ho an'ny UMsg rehetra (num_umsgs * PAGE_SIZE).
    • Ny buffer dia voamariky ny "ampiasaina" amin'ny fitantanana ny buffer an'ny mpamily.
    • Raha NULL iova, ny faritra teo aloha dia tsy voamarika ho "ampiasaina".
  • arg dia manondro a:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // in: sizeof(struct fpga_port_umsg_base_addr)
    • saina u32; // in: tokony ho 0
    • u64 iova; // in: adiresy virtoaly IO avy amin'ny FPGA_PORT_DMA_MAP. };

Fanamarihana:

  • Mba hanesorana ny lesoka amin'ny seranana dia tsy maintsy manoratra ny bitmask marina amin'ny lesoka ankehitriny ianao, ohatraample, fahadisoana saka > mazava
  • UMsg dia tohanana amin'ny alàlan'ny Acceleration Stack ho an'ny Intel Xeon Processor miaraka amin'ny FPGA Integrated.

sysfs Files

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

sysfs file saha mmio karazana fidirana
ports_num fme_header.capability.num_ports decimal int Mamaky fotsiny
cache_size fme_header.capability.cache_size decimal int Mamaky fotsiny
Malagasy Bible fme_header.capability.fabric_verid decimal int Mamaky fotsiny
socket_id fme_header.capability.socket_id decimal int Mamaky fotsiny
bitstream_id fme_header.bitstream_id hex uint64_t Mamaky fotsiny
bitstream_metadata fme_header.bitstream_md hex uint64_t Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
tokonana1 thermal.threshold.tmp_thshold1 decimal int Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
tokonana2 thermal.threshold.tmp_thshold2 decimal int Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
tokona_dia thermal.threshold.therm_trip_thshold decimal int Mamaky fotsiny
tokonana1_reached thermal.threshold.thshold1_status decimal int Mamaky fotsiny
tokonana2_reached thermal.threshold.thshold2_status decimal int Mamaky fotsiny
tokonana1_politika mafana. threshold.thshold_policy decimal int Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
hafanana thermal.rdsensor_fm1.fpga_temp decimal int Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
lany ritra power.status.pwr_consumed hex uint64_t Mamaky fotsiny
tokonana1 hery.tokonana.tokonana1 hex uint64_t Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
tokonana2 hery.tokonana.tokonana2 hex uint64_t Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
tokonam-baravarana1_status power.threshold.threshold1_status decimal tsy misy sonia Mamaky fotsiny
tokonam-baravarana2_status power.threshold.threshold2_status decimal tsy misy sonia Mamaky fotsiny
rtl power.status.fpga_latency_report decimal tsy misy sonia Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
pcie0_errors gerror.pcie0_err hex uint64_t Mamaky-manoratra
pcie1_errors gerror.pcie1_err hex uint64_t Mamaky-manoratra
tsindrona_error gerror.ras_error_inj hex uint64_t Mamaky-manoratra

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

sysfs file saha mmio karazana fidirana
fahadisoana gerror.fme_err hex uint64_t Mamaky fotsiny
first_error gerror.fme_first_err.err_reg_status hex uint64_t Mamaky fotsiny
next_error gerror.fme_next_err.err_reg_status hex uint64_t Mamaky fotsiny
mazava Manadio lesoka, first_error, next_error isan-karazany uint64_t Soraty fotsiny

Fanamarihana:
Mba hanesorana ny lesoka FME dia tsy maintsy manoratra ny bitmask marina amin'ny lesoka ankehitriny ianao, ohatraample fahadisoana saka > mazava.

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

sysfs file saha mmio karazana fidirana
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
famantaranandro gperf.clk.afu_interf_clock hex uint64_t Mamaky fotsiny

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Tsy mety amin'ny Acceleration Stack ho an'ny Intel Xeon CPU misy FPGA)

sysfs file saha mmio karazana fidirana
mandry gperf.ch_ctl.freeze decimal int Mamaky-manoratra
mamaky_hit gperf.CACHE_RD_HIT hex uint64_t Mamaky fotsiny
read_miss gperf.CACHE_RD_MISS hex uint64_t Mamaky fotsiny
write_hit gperf.CACHE_WR_HIT hex uint64_t Mamaky fotsiny
write_miss gperf.CACHE_WR_MISS hex uint64_t Mamaky fotsiny
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Mamaky fotsiny
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Mamaky fotsiny
sysfs file saha mmio karazana fidirana
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Mamaky fotsiny
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Mamaky fotsiny
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Mamaky fotsiny

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Tsy mety amin'ny Acceleration Stack ho an'ny Intel Xeon CPU misy FPGA)

sysfs file saha mmio karazana fidirana
mandry gperf.vtd_ctl.freeze decimal int Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Tsy mety amin'ny Acceleration Stack ho an'ny Intel Xeon CPU misy FPGA)

sysfs file saha mmio karazana fidirana
mamaky_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Mamaky fotsiny
write_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Mamaky fotsiny
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Mamaky fotsiny
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
Tadiavo gpperf.fab_ctl.(azo atao) decimal int Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
mandry gpperf.fab_ctl.freeze decimal int Mpampiasa: Mamaky fotsiny Root: Mamaky-manoratra
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Mamaky fotsiny
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Mamaky fotsiny
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Mamaky fotsiny
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Mamaky fotsiny
upi_read gperf.FAB_UPI_RD hex uint64_t Mamaky fotsiny
upi_write gperf.FAB_UPI_WR hex uint64_t Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Mamaky fotsiny
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Mamaky fotsiny
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Mamaky fotsiny
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Mamaky fotsiny
upi_read gperf.FAB_UPI_RD hex uint64_t Mamaky fotsiny
upi_write gperf.FAB_UPI_WR hex uint64_t Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
id port_header.capability.port_number decimal int Mamaky fotsiny
ltr port_header.control.latency_tolerance decimal int Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
afu_id afu_header.guid hex 16-byte Mamaky fotsiny

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

sysfs file saha mmio karazana fidirana
fahadisoana perror.port_error hex uint64_t Mamaky fotsiny
first_error perror.port_first_error hex uint64_t Mamaky fotsiny
first_malformed_req perror.malreq hex 16-byte Mamaky fotsiny
mazava fahadisoam-panantenana.(diso rehetra) isan-karazany uint64_t Soraty fotsiny

Fanamarihana:
Mba hanesorana ny lesoka Port dia tsy maintsy manoratra ny bitmask marina amin'ny lesoka ankehitriny ianao, ohatraample fahadisoana saka > mazava.

Tantara fanavaozana

Document Version FIOVANA
2017.10.02 Famoahana voalohany.

OPAE Intel FPGA Linux Device Driver Architecture Guide

Documents / Loharano

Intel OPAE FPGA Linux Device Driver Architecture [pdf] Torolàlana ho an'ny mpampiasa
OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture

References

Mametraha hevitra

Tsy havoaka ny adiresy mailakao. Voamarika ireo saha ilaina *