intel-logo

intel OPAE FPGA Linux Device Driver Architecture

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

OPAE Intel FPGA Linux Device Driver Architecture

Ajokarê OPAE Intel FPGA ji bo serîlêdanên cîhê bikarhêner ji bo mîhengkirin, hejmartin, vekirina û gihîştina bilezkerên FPGA-yê li ser platformên ku bi çareseriyên Intel FPGA-yê ve girêdayî ne navbeynkariyê peyda dike û fonksiyonên rêveberiya-asta pergalê yên wekî ji nû veavakirina FPGA, rêveberiya hêzê, û virtualîzekirinê çalak dike.

Hardware Architecture

Ji xala OS ya view, hardware FPGA wekî amûrek PCIe ya birêkûpêk xuya dike. Bîra cîhaza FPGA bi karanîna avahiyek daneya pêşbirkirî (Lîsteya Taybetmendiya Amûrê) tê organîze kirin. Taybetmendiyên ku ji hêla cîhaza FPGA ve têne piştgirî kirin bi van strukturên daneyê têne xuyang kirin, wekî ku li jêr di jimareya jêrîn de têne destnîşan kirin:

Amûra FPGA PCIe

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

Ajokar PCIe SR-IOV piştgirî dike da ku Fonksiyonên Virtual (VF) biafirîne ku dikare were bikar anîn da ku bilezkerên kesane li makîneyên virtual veqetîne.

Pargîdaniya Intel. Hemû maf parastî ne. Intel, logoya Intel, û nîşaneyên din ên Intel marqeyên Intel Corporation an pargîdaniyên wê ne. Intel garantiya performansa FPGA û hilberên xwe yên nîvconductor li gorî taybetmendiyên heyî li gorî gerantiya standard a Intel digire, lê mafê guheztina hilber û karûbaran di her kêliyê de bêyî agahdarkirinê parastî ye. Intel ti berpirsiyarî an berpirsiyariya ku ji serîlêdan an karanîna ti agahdarî, hilber, an karûbarê ku li vir hatî diyar kirin çêdibe, ji bilî ku bi eşkere bi nivîskî ji hêla Intel ve hatî pejirandin. Ji xerîdarên Intel re tê şîret kirin ku berî ku xwe bispêrin agahdariya hatî weşandin û berî ku emrê hilber an karûbaran bidin, guhertoya herî dawî ya taybetmendiyên cîhazê bistînin.

Dibe ku nav û marqeyên din wekî milkê yên din werin îdîakirin.

Amûra FPGA PCIe ya Virtualized

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

Engine Management FPGA (FME)
Motora Rêvebiriya FPGA rêveberiya hêz û termal, raporkirina xeletiyê, veavakirin, raporkirina performansê, û fonksiyonên din ên binesaziyê pêk tîne. Her FPGA yek FME heye, ku her gav bi Fonksiyona Fîzîkî (PF) ve tê gihîştin. Serlêdanên cîhê bikarhêner dikarin bi karanîna vekirî () gihandina taybetî ya FME-yê bistînin û wê bi karanîna close() wekî bikarhênerek jêhatî (root) berdin.

Bender
Portek navbeynkariya di navbera tevna FPGA ya statîk ("Rêveberê Navbera FPGA (FIM)") û herêmek qismî vesazkirî ku fonksiyonek Lezker (AF) vedihewîne, temsîl dike. Port pêwendiya ji nermalavê heya bilezkerê kontrol dike û taybetmendiyên wekî reset û debug eşkere dike. Dibe ku cîhazek PCIe xwedan çend Portan be, û her Portek dikare bi navgîniya VF-ê ve were xuyang kirin bi karanîna FPGA_FME_PORT_ASSIGN ioctl li ser cîhaza FME.

Yekîneya Fonksiyona Lezkerê (AF).

  • Yekîneyek Fonksiyona Lezkerê (AF) bi Portek ve girêdayî ye û herêmek 256K MMIO radigihîne ku ji bo tomarên kontrolê yên taybetî-lezker were bikar anîn.
  • Serlêdanên cîhê bikarhêner dikarin bi karanîna vekirî() li ser cîhaza Portê ve gihîştina taybetî ya AFU-ya ku bi Portek ve girêdayî ye bistînin, û wê bi karanîna nêzê(yê) berdin.
  • Serlêdanên cîhê bikarhêner dikarin her weha herêmên MMIO bilezker mmap() bikin.

Veavakirina Qismî
Wekî ku li jor behs kir, lezker dikarin bi veavakirina qismî ya Fonksîyonek Lezker (AF) ji nû ve werin mîheng kirin. file. Pêdivî ye ku Fonksiyona Lezker (AF) ji bo FIM-a rastîn û devera statîk a armanckirî (Port) ya FPGA-yê hatî çêkirin; Wekî din, dê operasyona ji nû veavakirinê têk biçe û dibe ku bibe sedema bêîstiqrariya pergalê. Ev lihevhatî dikare bi berhevdana nasnama navberê ya ku di sernavê AF-ê de hatî destnîşan kirin li hember nasnama navberê ya ku ji hêla FME ve bi navgîniya sysfs ve hatî eşkere kirin were kontrol kirin. Berî ku gazî veavakirina IOCTL bike, bi gelemperî ev kontrol ji hêla cîhê bikarhêner ve tê kirin.

Not:
Heya nuha, her bernameyek nermalava ku xwe bigihîne FPGA-yê, tevî yên ku di mêvandarek virtualkirî de dixebitin jî, divê berî ku meriv ji nû veavakirinek qismî hewl bide were girtin. Gavên wê ev bin:

  1. Şofêr ji mêhvan dakêşin
  2. VF-ê ji mêvanê veqetînin
  3. SR-IOV neçalak bike
  4. Veavakirina qismî pêk bînin
  5. SR-IOV çalak bike
  6. Plug VF bi mêvan
  7. Şofêr li mêvan bar bike

FPGA Virtualization
Ji bo çalakkirina gihîştina bilezkerek ji serîlêdanên ku di VM-ê de têne xebitandin, pêdivî ye ku porta AFU ya têkildar bi karanîna gavên jêrîn ji VF re were veqetandin:

  1. PF ji hêla xwerû ve xwediyê hemî portên AFU ye. Her portek ku pêdivî ye ku ji nû ve ji VF-ê re were veqetandin divê pêşî ji PF-ê bi riya FPGA_FME_PORT_RELEASE ioctl-ya li ser cîhaza FME-yê were berdan.
  2. Gava ku portên N ji PF-ê têne berdan, emrê jêrîn dikare were bikar anîn da ku SRIOV û VF-ê çalak bike. Her VF bi AFU re xwedan yek portek e. echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. Di nav VF-yan re derbasî VM-yê bibin.
  4. AFU di bin VF de ji serîlêdanên di VM-ê de tê gihîştin (bi karanîna heman ajokerê di hundurê VF de).

Not:
FME nikare ji VF re were veqetandin, ji ber vê yekê PR û fonksiyonên din ên rêveberiyê tenê bi PF-ê ve têne peyda kirin.

Rêxistina Şofêr

PCIe Module Device Driver

Rêxistina Şofêr

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

Amûrên FPGA wekî amûrên PCIe yên birêkûpêk xuya dikin; Bi vî rengî, ajokera cîhaza FPGA PCIe (intel-FPGA-PCI.ko) her gav gava ku FPGA PCIe PF an VF were tespît kirin yekem car tê barkirin. Ev ajokar di mîmariya ajokerê de rolek binesaziyê dilîze. Ew:

  • Wekî dêûbavê cîhazên taybetmendiyê amûrek konteynerê FPGA diafirîne.
  • Di nav Lîsteya Taybetmendiya Amûrê de, ya ku di bîranîna BAR a cîhaza PCIe de tête bicîh kirin, dimeşe, da ku cîhazên taybetmendiyê û jêr-taybetmendiyên wan kifş bike û ji bo wan di binê cîhaza konteynerê de amûrên platformê biafirîne.
  • SR-IOV piştgirî dike.
  • Binesaziya cîhaza taybetmendiyê destnîşan dike, ku operasyonan ji bo jêr-taybetmendiyan berhev dike û fonksiyonên hevpar ji ajokarên cîhazê re diyar dike.

PCIe Module Device Fonksiyonên Driver

  • Vedîtina PCIe, hejmartina cîhazê, û vedîtina taybetmendiyê vedihewîne.
  • Ji bo cîhaza dêûbav, Motora Rêvebiriya FPGA (FME) û Portê pelrêtrên sysfs diafirîne.
  • Mînakên ajokera platformê diafirîne, dibe sedem ku kernel Linux ajokarên modula platforma xwe ya têkildar bar bike.

FME Platforma Module Device Driver

  • Rêvebiriya hêz û termal, raporkirina xeletiyê, raporkirina performansê, û fonksiyonên din ên binesaziyê. Hûn dikarin van fonksiyonan bi navgînên sysfs-ê yên ku ji hêla ajokera FME ve têne xuyang kirin bigihîjin.
  • Veavakirina Qismî. Ajokarê FME di dema destpêkirina jêr-taybetmendiya PR de Rêvebirek FPGA tomar dike; gava ku ew FPGA_FME_PORT_PR ioctl ji we werdigire, ew fonksiyona navbeynkariya hevpar ji Rêvebirê FPGA vedixwîne da ku veavakirina qismî ya bitstream-ê li Porta diyarkirî temam bike.
  • rêveberiya Port ji bo virtual. Ajokarê FME du ioctl destnîşan dike, FPGA_FME_PORT_RELEASE, ku Porta diyarkirî ji PF-ê derdixe; û FPGA_FME_PORT_ASSIGN, ku Portê vedigere PF. Dema ku Port ji PF-ê were berdan, ew dikare bi navgînên SR-IOV ve ku ji hêla ajokera PCIe ve hatî peyda kirin ve ji VF-ê re were veqetandin. Ji bo bêtir agahdarî, li "FPGA Virtualization" binihêrin.

FME Platforma Modula Fonksiyonên Ajokerê Amûrê

  • Girêka cîhaza karaktera FME diafirîne.
  • FME sysfs diafirîne files û FME sysfs pêk tîne file accessors.
  • Bin-ajokerên taybetmendiya taybet a FME pêk tîne.
  • Bin-ajokarên taybetmendiya taybet a FME:
    • Sernavê FME
    • Rêveberiya Termal
    • Management Power
    • Error Global
    • Veavakirina Qismî
    • Performansa Global

Porta Platforma Modula Device Driver
Mîna ajokera FME, ajokara Porta FPGA (û AFU) (intel-fpga-afu. ko) piştî ku cîhaza platforma Portê were afirandin tê lêkolîn kirin. Fonksiyona sereke ya vê modulê peydakirina navgînek ji bo serîlêdanên cîhê bikarhêner e ku bigihîjin bilezkerên kesane, di nav de kontrola vesazkirina bingehîn a li Port, hinardekirina herêma AFU MMIO, karûbarê nexşeya tampon DMA, agahdariya UMsg (1), û fonksiyonên debugkirina dûr ( li jor binêre).

UMsg tenê ji bo Pêvajoya Intel Xeon® bi FPGA-ya Yekgirtî ve bi Acceleration Stack ve tê piştgirî kirin.

Fonksiyonên ajokarê cîhaza Modula Port Platformê

  • Girêka cîhaza karaktera Portê diafirîne.
  • Port sysfs diafirîne files û Port sysfs pêk tîne file accessors.
  • Bin-ajokerên taybetmendiya Portê bicîh dike.
  • Bin-ajokerên taybetmendiya portê:
    • Port Header
    • AFU
    • Çewtiya Portê
    • UMsg(2)
    • Signal Tap

Serlêdana FPGA Device Enumeration
Ev beş destnîşan dike ka serîlêdan çawa amûrê FPGA ji hiyerarşiya sysfs di bin /sys/class/fpga de dihejmêre. Li exampLi jêr, du cîhazên Intel FPGA di mêvandarê de têne saz kirin. Her amûrek FPGA yek FME û du Port (AFU) heye. Ji bo her amûrek FPGA, pelrêçek amûrek di bin /sys/class/fpga de tê afirandin:

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

Her nodek wekî cîhazên zarokan yek FME û du Port (AFU) hene:
/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

Bi gelemperî, navbeynkarên FME / Port sysfs bi vî rengî têne nav kirin:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

bi min re li pey hev hemû cîhazên konteynerê jimartin, j li pey hev FME'yan jimartin û k li pey hev hemû Portan jimartin.

Girêkên cîhazê yên ku ji bo ioctl () û mmap () têne bikar anîn dikarin bi navgîniya:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

PCIe Driver Enumeration
Di vê beşê de serpêhatiyek heyeview ji herikîna kodê ya ji bo hejmartina cîhazê ku ji hêla intel-fpga-pci.ko ve hatî çêkirin. Struktur û fonksiyonên sereke yên daneyê têne ronî kirin. Dema ku ev beş çêtirîn tê şopandin viewkoda çavkaniyê ya pêvekirî (pcie.c).

Enumeration Structures Data

enum fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
avahiya statîk idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *name;
dev_t devt;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{ .name = FPGA_FEATURE_DEV_FME },
{ .name = FPGA_FEATURE_DEV_PORT },
};
class struct static *fpga_class;
avahiya statîk 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,}
};
avahiya statîk 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 release_port_num;
struct list_head herêmên;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __iomem *pfme_hdr;
struct device *parent_dev;
struct platform_device *feature_dev;
};

Enumeration Flow

  • ccidrv_init()
    • Fpga_ids bi karanîna idr_init() dest pê bikin.
    • Fpga_chrdevs[i].devt bi bikaranîna alloc_chrdev_region() dest pê bike.
    • Fpga_class bi karanîna class_create() dest pê bikin.
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Amûra PCI-ê çalak bikin, daxwaza gihîştina herêmên wê bikin, moda sereke ya PCI-ê saz bikin, û DMA-yê mîheng bikin.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Avahiyek build_feature_devs_info veqetînin, wê bidin destpêkirin.
      .parent_dev li pelrêça dêûbav sysfs (intel-fpga-dev.id) hatiye danîn ku pelrêça FME û Port sysfs dihewîne.
  • parse_feature_list()
    • Lîsteya Taybetmendiya Amûra BAR0 bimeşin da ku FME, Port, û taybetmendiyên wan ên taybet kifş bikin.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Dema ku FME tê dîtin:
  • build_info_create_dev()
    • Amûrek platformê ji bo FME veqetînin, di build_feature_devs_info.feature_dev de hilînin.
    • feature_dev.id ji bo encama idr_alloc (fpga_ids[FME_ID]) tê destpêkirin,
    • feature_dev.parent ji bo build_feature_devs_info.parent_dev hatiye danîn.
    • Di feature_dev.resource de komek çavkaniyên strukturê veqetînin.
  • Avahiyek feature_platform_data veqetînin, wê bidin destpêkirin, û nîşanek li feature_dev.dev.platform_data hilînin
    • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[FME_FEATURE_ID_HEADER] dest pê bike.
    • feature_platform_data_add()
    • Feature_platform_data.features[FME_FEATURE_ID_HEADER], her tişt ji bilî .fops dest pê bike.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Dema ku Portek tê dîtin:
  • build_info_create_dev()
    • Amûrek platformê ji bo Portê veqetînin, di build_feature_devs_info.feature_dev de hilînin.
    • feature_dev.id ji bo encama idr_alloc (fpga_ids[PORT_ID]) tê destpêkirin,
    • feature_dev.parent ji bo build_feature_devs_info.parent_dev hatiye danîn.
    • Di feature_dev.resource de komek çavkaniyek strukturê veqetînin.
    • Avahiyek feature_platform_data veqetînin, wê bidin destpêkirin, û nîşanek li feature_dev.dev.platform_data hilînin
  • build_info_commit_dev()
    • Di struct cci_drvdata.port_dev_list de struct feature_platform_data.node ji bo Portê têxe navnîşa Portan
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[PORT_FEATURE_ID_HEADER] dest pê bike.
  • feature_platform_data_add()
    • feature_platform_data.features[PORT_FEATURE_ID_HEADER], her tişt ji bilî .fops dest pê bike.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Dema ku AFU tê dîtin:
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[PORT_FEATURE_ID_UAFU] dest pê bike.
  • feature_platform_data_add()
    • feature_platform_data.features[PORT_FEATURE_ID_UAFU], her tişt ji bilî .fops dest pê bike.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Dema ku taybetmendiyek taybet a FME tê dîtin:
  • create_feature_instance() build_info_add_sub_feature()
    • feature_dev.resource[id] dest pê bike.
  • feature_platform_data_add()
    • feature_platform_data.features[id], her tişt lê .fops dest pê bike.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Dema ku taybetmendiyek taybet a Portê tê dîtin: * create_feature_instance() build_info_add_sub_feature() * Destpêkirina feature_dev.resource[id]. * feature_platform_data_add() feature_platform_data.features[id], her tiştî ji bilî .fops dest pê bike.
  • parse_ports_from_fme()
    • Ger ajoker li ser Fonksiyona Fîzîkî (PF) tê barkirin, wê hingê:
  • Herikîna parse_feature_list() li ser her portê ku di sernavê FME de hatî destnîşan kirin bimeşîne.
  • BAR-a ku di her têketina Portê de di serî de hatî destnîşan kirin bikar bînin.

Destpêkkirina Amûra Platforma FME
Di vê beşê de serpêhatiyek heyeview herikîna kodê ya ji bo destpêkirina cîhaza FME ku ji hêla intel-fpga-fme.ko ve hatî çêkirin. Struktur û fonksiyonên sereke yên daneyê têne destnîşan kirin. Dema ku ev beş çêtirîn tê şopandin viewkoda çavkaniyê ya pêvekirî (fme-main.c).

Structures Data Device Platforma FME

struct feature_ops {
int (* destpêk)(avakirina platform_device *pdev, taybetmendiya avahî * taybetmendî);
int (*uinit)(avakirina platform_device *pdev, struct taybetmendî * taybetmendî);
dirêj (* ioctl)(avakirina platform_device *pdev, taybetmendiya çêkirinê * taybetmendî,
unsigned int cmd, unsigned long arg);
int (* test) (avakirina platform_device *pdev, struct taybetmendî * taybetmendî);
};
taybetmendiya avahî {
const char *name;
int source_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
dev_status dirêj ne îmze;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
betal * taybet;
int num;
int (*config_port)(avakirina platform_device *, u32, bool);
struct platform_device *(*fpga_for_her_port)(device platform_device *,
betal *, int (*hevkirin)(avakirina platform_device *, vala *)); struct
taybetmendiyên taybetmendiyê[0];
};
struct perf_object {
int id;
const struct feature_group **attr_groups;
struct device *fme_dev;
struct list_head node;
struct list_head zarokan;
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;
};

FME Platforma Device Destpêkirina Herikîna

FME Destpêkirina Flowintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Strukturek fpga_fme bidin destpêkirin û wê di qada feature_platform_data.private de hilînin.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Ji bo her taybetmendiya niştecîh strukturek feature_ops hilîne nav feature_platform_data.features.
    • Banga fonksiyona testê, heke hebe, ji strukturê.
    • Banga fonksiyona destpêkê ji struct.
  • fme_probe() fpga_register_dev_ops()
    • Girêka cîhaza karaktera FME biafirînin, strukturek tomar bikin file_operasyonên.

Destpêkirina Device Platforma Port
Di vê beşê de serpêhatiyek heyeview herikîna kodê ya ji bo destpêkirina cîhaza portê ku ji hêla intel-fpga-afu.ko ve hatî çêkirin. Struktur û fonksiyonên sereke yên daneyê têne ronî kirin. Dema ku ev beş çêtirîn tê şopandin viewkoda çavkaniyê ya pêvekirî (afu.c).

Structures Data Device Platforma Port

struct feature_ops {
int (* destpêk)(avakirina platform_device *pdev, taybetmendiya avahî * taybetmendî);
int (*uinit)(avakirina platform_device *pdev, struct taybetmendî * taybetmendî);
dirêj (* ioctl)(avakirina platform_device *pdev, taybetmendiya çêkirinê * taybetmendî,
unsigned int cmd, unsigned long arg);
int (* test) (avakirina platform_device *pdev, struct taybetmendî * taybetmendî);
};
taybetmendiya avahî {
const char *name;
int source_index;
void __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head node;
struct mutex lock;
dev_status dirêj ne îmze;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
betal * taybet;
int num;
int (*config_port)(avakirina platform_device *, u32, bool);
struct platform_device *(*fpga_for_her_port)(device platform_device *,
betal *, int (*hevkirin)(avakirina platform_device *, vala *));
taybetmendiyên taybetmendiyê yên struct[0];
};
struct fpga_afu_region {
index u32;
alên u32;
u64 size;
u64 offset;
u64 physis;
struct list_head node;
};
struct fpga_afu_dma_region {
u64 user_addr;
u64 length;
u64 iova;
struct page **rûpel;
struct rb_node node;
bool in_use;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head herêmên;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Herikîna Destpêkirina Device Platforma Portê

Herikîna Destpêkirina Portêintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Strukturek fpga_afu bidin destpêkirin û wê di qada feature_platform_data.private de hilînin.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Ji bo her taybetmendiya niştecîh strukturek feature_ops hilîne nav feature_platform_data.features.
    • Banga fonksiyona testê, heke hebe, ji strukturê.
    • Banga fonksiyona destpêkê ji struct.
  • afu_probe() fpga_register_dev_ops()
    • Girêka cîhaza karaktera Portê biafirînin, strukturek tomar bikin file_operasyonên.

FME IOCTLs
IOCTL yên ku li ser vekirî têne gazî kirin file raveker ji bo /dev/intel-fpga-fme.j FPGA_GET_API_VERSION — guhertoya heyî wekî jimarek tevde vegerîne, ji 0 dest pê dike.

FPGA_CHECK_EXTENSION-niha nayê piştgirî kirin.

FPGA_FME_PORT_RELEASE-arg nîşanek ji bo a:

struct fpga_fme_port_release {
__u32 argsz; // di: sizeof (avakirina fpga_fme_port_release)
__u32 alên; // in: divê 0 be
__u32 port_id; // li: Nasnameya portê (ji 0) berdan.
};

FPGA_FME_PORT_ASSIGN-arg nîşanek ji bo a:

struct fpga_fme_port_assign {
__u32 argsz; // li: sizeof (avakirina fpga_fme_port_assign)
__u32 alên; // in: divê 0 be
__u32 port_id; // li: Nasnameya portê (ji 0) veqetandin. (divê bû
berê ji hêla FPGA_FME_PORT_RELEASE ve hatî berdan)
};

FPGA_FME_PORT_PR-arg nîşanek e:

struct fpga_fme_port_pr {
__u32 argsz; // di: sizeof (avakirina fpga_fme_port_pr)
__u32 alên; // in: divê 0 be
__u32 port_id; // li: ID portê (ji 0)
__u32 buffer_size; // in: mezinahiya tampona bitstream bi byte. Divê 4-byte be
li hev kirin.
__u64 buffer_address; // in: navnîşana pêvajoyê ya tampon bitstream
rewşa __u64; // der: rewşa çewtiyê (bitmask)
};

Port IOCTLs
IOCTL yên ku li ser vekirî têne gazî kirin file raveker ji bo /dev/intel-fpga-port.k FPGA_GET_API_VERSION — guhertoya heyî wekî jimareyek tevde vegerîne, ji 0-yê dest pê dike. FPGA_CHECK_EXTENSION — niha nayê piştgirî kirin.

FPGA_PORT_GET_INFO-arg nîşanek e ku:

struct fpga_port_info {
__u32 argsz; // di: sizeof (avakirina fpga_port_info)
__u32 alên; // der: 0 vedigere
__u32 num_regions; // der: hejmara herêmên MMIO, 2 (1 ji bo AFU û 1 ji bo
STP)
__u32 num_umsgs; // der: hejmara UMsg-ên ku ji hêla hardware ve têne piştgirî kirin
};

FPGA_PORT_GET_REGION_INFO-arg nîşanek e ku ji bo a:

struct fpga_port_region_info {
__u32 argsz; // di: sizeof(avakirina fpga_port_region_info)
__u32 alên; // der: (bitmask) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP }
__u32 index; // di: FPGA_PORT_INDEX_UAFU an FPGA_PORT_INDEX_STP
__u32 padding; // in: divê 0 be
__u64 size; // der: mezinahiya herêma MMIO bi byte
__u64 offset; // der: dûrxistina herêma MMIO ji destpêka cîhazê fd
};

FPGA_PORT_DMA_MAP-arg nîşanek ji bo a:
struct fpga_port_dma_map {
__u32 argsz; // di: sizeof (avakirina fpga_port_dma_map)
__u32 alên; // in: divê 0 __u64 user_addr be; // li: pêvajo virtual
navnîşan. Pêdivî ye ku rûpel were rêz kirin.
__u64 length; // in: dirêjahiya nexşeyê bi bîtan. Pêdivî ye ku pirjimarek rûpelê be
mezinayî.
__u64 iova; // der: IO navnîşana virtual };

FPGA_PORT_DMA_UNMAP-arg nîşanek ji bo a:
struct fpga_port_dma_unmap {
__u32 argsz; // di: sizeof (avakirina fpga_port_dma_unmap)
__u32 alên; // in: divê 0 be
__u64 iova; // in: IO navnîşana virtual ku ji hêla berê ve hatî vegerandin
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET-arg divê NULL be.
  • FPGA_PORT_UMSG_ENABLE — arg divê NULL be.
  • FPGA_PORT_UMSG_DISABLE — arguman divê NULL be.

FPGA_PORT_UMSG_SET_MODE-arg nîşanek e:

struct fpga_port_umsg_cfg {
__u32 argsz; // di: sizeof (avakirina fpga_port_umsg_cfg)
__u32 alên; // in: divê 0 be
__u32 hint_bitmap; // di: UMsg bitmap moda hint. Nîşan dide ku UMsg kîjan in
enabled.
};

FPGA_PORT_UMSG_SET_BASE_ADDR-

  • Berî ku ev ioctl were weşandin divê UMsg were neçalak kirin.
  • Qada iova divê ji bo tamponek bi têra xwe mezin ji bo hemî UMsg be (num_umsgs * PAGE_SIZE).
    • Tampon ji hêla rêveberiya tampon a ajokerê ve wekî "di karanîna" de tête nîşankirin.
    • Ger iova NULL be, her herêmek berê wekî "bikarhêner" nayê nîşankirin.
  • arg nîşanek e:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // li: sizeof (avakirina fpga_port_umsg_base_addr)
    • alên u32; // in: divê 0 be
    • u64 iova; // li: IO navnîşana virtual ji FPGA_PORT_DMA_MAP. };

Not:

  • Ji bo paqijkirina xeletiyên portê, divê hûn bitmaska ​​rastîn a xeletiyên heyî binivîsin, ji bo berêample, xeletiyên pisîkê > zelal
  • UMsg tenê bi Acceleration Stack-ê ji bo Pêvajoya Intel Xeon bi FPGA-ya Yekgirtî ve tê piştgirî kirin.

sysfs Files

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

sysfs file zeviya mmio awa navketin
ports_num fme_header.capability.num_ports dehan int Tenê xwendin
cache_size fme_header.capability.cache_size dehan int Tenê xwendin
awa fme_header.capability.fabric_verid dehan int Tenê xwendin
socket_id fme_header.capability.socket_id dehan int Tenê xwendin
bitstream_id fme_header.bitstream_id hex uint64_t Tenê xwendin
bitstream_metadata fme_header.bitstream_md hex uint64_t Tenê xwendin

FME Rêvebiriya Termal sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/thermal_mgmt/

sysfs file zeviya mmio awa navketin
tixûb1 thermal.threshold.tmp_thshold1 dehan int Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
tixûb2 thermal.threshold.tmp_thshold2 dehan int Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
threshold_trip thermal.threshold.therm_trip_thshold dehan int Tenê xwendin
threshold1_gehiştiye termal.threshold.thshold1_status dehan int Tenê xwendin
threshold2_gehiştiye termal.threshold.thshold2_status dehan int Tenê xwendin
threshold1_policy termal. threshold.thshold_policy dehan int Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
germî thermal.rdsensor_fm1.fpga_temp dehan int Tenê xwendin

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

sysfs file zeviya mmio awa navketin
xwar kirin power.status.pwr_consumed hex uint64_t Tenê xwendin
tixûb1 quwet.threshold.threshold1 hex uint64_t Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
tixûb2 quwet.threshold.threshold2 hex uint64_t Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
threshold1_status hêz.threshold.threshold1_status dehanî bê îmza Tenê xwendin
threshold2_status hêz.threshold.threshold2_status dehanî bê îmza Tenê xwendin
rtl power.status.fpga_latency_report dehanî bê îmza Tenê xwendin

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

sysfs file zeviya mmio awa navketin
pcie0_errors geror.pcie0_err hex uint64_t Xwendin-nivîsandin
pcie1_errors geror.pcie1_err hex uint64_t Xwendin-nivîsandin
inject_error geror.ras_error_inj hex uint64_t Xwendin-nivîsandin

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

sysfs file zeviya mmio awa navketin
errors geror.fme_err hex uint64_t Tenê xwendin
first_error gerror.fme_first_err.err_reg_status hex uint64_t Tenê xwendin
next_error gerror.fme_next_err.err_reg_status hex uint64_t Tenê xwendin
zelal Çewtiyên, yekem_çewtî, paş_çewtî paqij dike cuda uint64_t Tenê binivîse

Not:
Ji bo paqijkirina xeletiyên FME, divê hûn bitmaska ​​rastîn a xeletiyên heyî binivîsin, ji bo berêampxeletiyên pisîkê > zelal.

FME Pergal Veavakirina sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file zeviya mmio awa navketin
interface_id pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-byte Tenê xwendin

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

sysfs file zeviya mmio awa navketin
seet gperf.clk.afu_interf_clock hex uint64_t Tenê xwendin

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Ji bo Stack Acceleration ji bo Intel Xeon CPU bi FPGA ne derbasdar e)

sysfs file zeviya mmio awa navketin
qerisandin gperf.ch_ctl.freeze dehan int Xwendin-nivîsandin
xwendin_hit gperf.CACHE_RD_HIT hex uint64_t Tenê xwendin
xwendin_miss gperf.CACHE_RD_MISS hex uint64_t Tenê xwendin
binivîse_hit gperf.CACHE_WR_HIT hex uint64_t Tenê xwendin
binivîse_miss gperf.CACHE_WR_MISS hex uint64_t Tenê xwendin
hold_request gperf.CACHE_HOLD_REQ hex uint64_t Tenê xwendin
tx_req_stall gperf.CACHE_TX_REQ_STALL hex uint64_t Tenê xwendin
sysfs file zeviya mmio awa navketin
rx_req_stall gperf.CACHE_RX_REQ_STALL hex uint64_t Tenê xwendin
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN hex uint64_t Tenê xwendin
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN hex uint64_t Tenê xwendin

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Ji bo Stack Acceleration ji bo Intel Xeon CPU bi FPGA ne derbasdar e)

sysfs file zeviya mmio awa navketin
qerisandin gperf.vtd_ctl.freeze dehan int Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Ji bo Stack Acceleration ji bo Intel Xeon CPU bi FPGA ne derbasdar e)

sysfs file zeviya mmio awa navketin
read_transaction gperf.VTD_AFU0_MEM_RD_TRANS hex uint64_t Tenê xwendin
binivîse_transaction gperf.VTD_AFU0_MEM_WR_TRANS hex uint64_t Tenê xwendin
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT hex uint64_t Tenê xwendin
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT hex uint64_t Tenê xwendin

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

sysfs file zeviya mmio awa navketin
bikêrkirin gperf.fab_ctl.(çalakkirî) dehan int Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
qerisandin gperf.fab_ctl.freeze dehan int Bikarhêner: Root-tenê xwendin: Xwendin-nivîsandin
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Tenê xwendin
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Tenê xwendin
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Tenê xwendin
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Tenê xwendin
upi_xwendin gperf.FAB_UPI_RD hex uint64_t Tenê xwendin
upi_write gperf.FAB_UPI_WR hex uint64_t Tenê xwendin

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

sysfs file zeviya mmio awa navketin
pcie0_read gperf.FAB_PCIE0_RD hex uint64_t Tenê xwendin
pcie0_write gperf.FAB_PCIE0_WR hex uint64_t Tenê xwendin
pcie1_read gperf.FAB_PCIE1_RD hex uint64_t Tenê xwendin
pcie1_write gperf.FAB_PCIE1_WR hex uint64_t Tenê xwendin
upi_xwendin gperf.FAB_UPI_RD hex uint64_t Tenê xwendin
upi_write gperf.FAB_UPI_WR hex uint64_t Tenê xwendin

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

sysfs file zeviya mmio awa navketin
id port_header.capability.port_number dehan int Tenê xwendin
ltr port_header.control.latency_tolerance dehan int Tenê xwendin

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

sysfs file zeviya mmio awa navketin
afu_id afu_header.guid hex 16-byte Tenê xwendin

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

sysfs file zeviya mmio awa navketin
errors perror.port_error hex uint64_t Tenê xwendin
first_error perror.port_first_error hex uint64_t Tenê xwendin
first_malformed_req peror.malreq hex 16-byte Tenê xwendin
zelal xeletî. (hemû xeletî) cuda uint64_t Tenê binivîse

Not:
Ji bo paqijkirina xeletiyên Portê, divê hûn bitmaska ​​rastîn a xeletiyên heyî, ji bo nimûne, binivîsinampxeletiyên pisîkê > zelal.

Dîroka Revision

Guhertoya Belgeyê Changes
2017.10.02 Serbestberdana Destpêkê.

OPAE Intel FPGA Linux Rêbernameya Mîmarî ya Ajokarê Amûra

Belge / Çavkanî

intel OPAE FPGA Linux Device Driver Architecture [pdf] Rehbera bikaranînê
OPAE FPGA Mîmariya Şofêr Amûra Linux-ê, OPAE FPGA, Mîmariya ajokarê cîhaza Linux-ê, Mîmariya ajokar, Mîmarî

Çavkanî

Bihêle şîroveyek

Navnîşana e-nameya we nayê weşandin. Zeviyên pêwîst têne nîşankirin *