intel-лагатып

Архітэктура драйвера прылады intel OPAE FPGA Linux

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

OPAE Архітэктура драйвера прылад Intel FPGA Linux

Драйвер OPAE Intel FPGA забяспечвае інтэрфейсы для карыстальніцкіх праграм для канфігурацыі, пераліку, адкрыцця і доступу да паскаральнікаў FPGA на платформах, абсталяваных рашэннямі Intel FPGA, і забяспечвае функцыі кіравання на сістэмным узроўні, такія як рэканфігурацыя FPGA, кіраванне харчаваннем і віртуалізацыя.

Апаратная архітэктура

З пункту гледжання АС view, абсталяванне FPGA выглядае як звычайная прылада PCIe. Памяць прылады FPGA арганізавана з выкарыстаннем загадзя вызначанай структуры даных (спіс функцый прылады). Функцыі, якія падтрымліваюцца прыладай FPGA, адкрываюцца праз гэтыя структуры даных, як паказана ніжэй на наступным малюнку:

Прылада FPGA PCIe

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

Драйвер падтрымлівае PCIe SR-IOV для стварэння віртуальных функцый (VF), якія можна выкарыстоўваць для прызначэння асобных паскаральнікаў віртуальным машынам.

Карпарацыя Intel. Усе правы ахоўваюцца. Intel, лагатып Intel і іншыя знакі Intel з'яўляюцца гандлёвымі маркамі карпарацыі Intel або яе даччыных кампаній. Intel гарантуе прадукцыйнасць сваёй FPGA і паўправадніковай прадукцыі ў адпаведнасці з бягучымі спецыфікацыямі ў адпаведнасці са стандартнай гарантыяй Intel, але пакідае за сабой права ўносіць змены ў любыя прадукты і паслугі ў любы час без папярэдняга паведамлення. Intel не нясе ніякай адказнасці або абавязацельстваў, якія вынікаюць з прымянення або выкарыстання любой інфармацыі, прадукту або паслугі, апісаных тут, за выключэннем выпадкаў, прама ўзгодненых Intel у пісьмовай форме. Кліентам Intel рэкамендуецца атрымаць апошнюю версію спецыфікацый прылады, перш чым спадзявацца на любую апублікаваную інфармацыю і перад размяшчэннем заказаў на прадукты ці паслугі.

Іншыя назвы і брэнды могуць быць заяўлены як уласнасць іншых.

Віртуалізаваная прылада FPGA PCIe

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

Механізм кіравання FPGA (FME)
Механізм кіравання FPGA выконвае кіраванне харчаваннем і цеплавым рэжымам, справаздачнасць аб памылках, рэканфігурацыю, справаздачнасць аб прадукцыйнасці і іншыя інфраструктурныя функцыі. Кожная FPGA мае адзін FME, доступ да якога заўсёды ажыццяўляецца праз фізічную функцыю (PF). Праграмы карыстальніцкай прасторы могуць атрымаць эксклюзіўны доступ да FME з дапамогай open() і вызваліць яго з дапамогай close() у якасці прывілеяванага карыстальніка (root).

Порт
Порт уяўляе сабой інтэрфейс паміж статычнай структурай FPGA ("Менеджар інтэрфейсу FPGA (FIM)") і часткова рэканфігураванай вобласцю, якая змяшчае функцыю паскаральніка (AF). Порт кантралюе сувязь ад праграмнага забеспячэння да паскаральніка і паказвае такія функцыі, як скід і адладка. Прылада PCIe можа мець некалькі партоў, і кожны порт можа быць адкрыты праз VF, прызначыўшы яго з дапамогай ioctl FPGA_FME_PORT_ASSIGN на прыладзе FME.

Блок функцыі паскаральніка (AF).

  • Блок функцыі паскаральніка (AF) далучаны да порта і адкрывае вобласць 256K MMIO для выкарыстання ў рэгістрах кіравання, характэрных для паскаральніка.
  • Праграмы карыстальніцкай прасторы могуць атрымаць эксклюзіўны доступ да AFU, далучанага да порта, з дапамогай open() на прыладзе Port і вызваліць яго з дапамогай close().
  • Праграмы карыстальніцкай прасторы таксама могуць паскараць рэгіёны MMIO mmap().

Частковая рэканфігурацыя
Як згадвалася вышэй, паскаральнікі можна пераналадзіць праз частковую пераналадку функцыі паскаральніка (AF) file. Функцыя паскаральніка (AF) павінна быць створана для дакладнага FIM і мэтавай статычнай вобласці (порта) FPGA; у адваротным выпадку аперацыя пераканфігурацыі будзе няўдалай і, магчыма, прывядзе да нестабільнасці сістэмы. Гэтую сумяшчальнасць можна праверыць шляхам параўнання ідэнтыфікатара інтэрфейсу, адзначанага ў загалоўку AF, з ідэнтыфікатарам інтэрфейсу, выстаўленым FME праз sysfs. Гэтая праверка звычайна выконваецца карыстальніцкай прасторай перад выклікам рэканфігурацыі IOCTL.

Заўвага:
У цяперашні час любое праграмнае забеспячэнне, якое мае доступ да FPGA, у тым ліку тыя, якія працуюць у віртуалізаваным хасце, павінна быць зачынена перад спробай частковай рэканфігурацыі. Крокі будуць:

  1. Выгрузка драйвера з госця
  2. Адключыце VF ад госця
  3. Адключыць SR-IOV
  4. Выканайце частковую рэканфігурацыю
  5. Уключыць SR-IOV
  6. Падключыце VF да госця
  7. Загрузіць драйвера ў госць

Віртуалізацыя FPGA
Каб атрымаць доступ да паскаральніка з прыкладанняў, запушчаных у віртуальнай машыне, адпаведны порт AFU павінен быць прызначаны VF з дапамогай наступных крокаў:

  1. PF валодае ўсімі партамі AFU па змаўчанні. Любы порт, які трэба пераназначыць для VF, павінен спачатку быць вызвалены з PF праз ioctl FPGA_FME_PORT_RELEASE на прыладзе FME.
  2. Пасля вызвалення N партоў ад PF каманда ніжэй можа выкарыстоўвацца для ўключэння SRIOV і VF. Кожны VF валодае толькі адным портам з AFU. рэха N > PCI_DEVICE_PATH/sriov_numvfs
  3. Пераход праз VF да VM.
  4. AFU пад VF даступны з прыкладанняў у VM (з выкарыстаннем таго ж драйвера ўнутры VF).

Заўвага:
FME не можа быць прызначаны VF, такім чынам, PR і іншыя функцыі кіравання даступныя толькі праз PF.

Арганізацыя кіроўцаў

Драйвер прылады для модуля pcie

Арганізацыя кіроўцаў

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

Прылады FPGA выглядаюць як звычайныя прылады PCIe; такім чынам, драйвер прылады FPGA PCIe (intel-FPGA-PCI.ko) заўсёды загружаецца першым, як толькі выяўляецца PF або VF FPGA PCIe. Гэты драйвер гуляе інфраструктурную ролю ў архітэктуры драйвера. Гэта:

  • Стварае кантэйнерную прыладу FPGA у якасці бацькоўскай для функцыянальных прылад.
  • Праглядае спіс функцый прылад, які рэалізаваны ў памяці прылады PCIe BAR, каб выявіць прылады з асаблівасцямі і іх падфункцыі і стварыць прылады платформы для іх у кантэйнернай прыладзе.
  • Падтрымлівае SR-IOV.
  • Прадстаўлена інфраструктура функцыянальных прылад, якая абстрагуе аперацыі для падфункцый і паказвае агульныя функцыі для драйвераў функцыйных прылад.

Функцыі драйвера прылады модуля PCIe

  • Змяшчае выяўленне PCIe, пералік прылад і выяўленне функцый.
  • Стварае каталогі sysfs для бацькоўскай прылады, механізму кіравання FPGA (FME) і порта.
  • Стварае асобнікі драйвераў платформы, прымушаючы ядро ​​Linux загружаць адпаведныя драйверы модуля платформы.

Драйвер прылады модуля платформы FME

  • Кіраванне энергазабеспячэннем і тэмпературай, справаздачнасць аб памылках, прадукцыйнасць і іншыя інфраструктурныя функцыі. Вы можаце атрымаць доступ да гэтых функцый праз інтэрфейсы sysfs, адкрытыя драйверам FME.
  • Частковая рэканфігурацыя. Драйвер FME рэгіструе дыспетчар FPGA падчас ініцыялізацыі падфункцыі PR; як толькі ён атрымлівае ад вас FPGA_FME_PORT_PR ioctl, ён выклікае функцыю агульнага інтэрфейсу з FPGA Manager для завяршэння частковай рэканфігурацыі бітавага патоку ў дадзены порт.
  • Кіраванне партамі для віртуалізацыі. Драйвер FME прадстаўляе два ioctl, FPGA_FME_PORT_RELEASE, які вызваляе дадзены порт з PF; і FPGA_FME_PORT_ASSIGN, які прызначае порт назад у PF. Пасля вызвалення порта ад PF яго можна прызначыць VF праз інтэрфейсы SR-IOV, прадастаўленыя драйверам PCIe. Для атрымання дадатковай інфармацыі звярніцеся да «Віртуалізацыя FPGA».

Функцыі драйвера прылады модуля платформы FME

  • Стварае вузел прылады знакаў FME.
  • Стварае FME sysfs files і рэалізуе FME sysfs file аксэсуары.
  • Рэалізуе паддрайверы прыватных функцый FME.
  • Паддрайверы прыватных функцый FME:
    • Загаловак FME
    • Тэрмакіраванне
    • Кіраванне харчаваннем
    • Глабальная памылка
    • Частковая рэканфігурацыя
    • Сусветная прадукцыйнасць

Драйвер прылады Port Platform Module
Падобна драйверу FME, драйвер порта FPGA (і AFU) (intel-fpga-afu. ko) правяраецца пасля стварэння прылады платформы Port. Асноўная функцыя гэтага модуля заключаецца ў прадастаўленні інтэрфейсу для карыстальніцкіх праграм для доступу да асобных паскаральнікаў, уключаючы базавы кантроль скіду на порце, экспарт рэгіёна AFU MMIO, службу адлюстравання буфера DMA, апавяшчэнне UMsg(1) і функцыі аддаленай адладкі ( гл. вышэй).

UMsg падтрымліваецца толькі праз стэк паскарэння для працэсара Intel Xeon® з убудаванай FPGA.

Функцыі драйвера прылады модуля платформы порта

  • Стварае вузел прылады сімвалаў Port.
  • Стварае порт sysfs files і рэалізуе Port sysfs file аксэсуары.
  • Рэалізуе паддрайверы прыватнай функцыі порта.
  • Паддрайверы прыватных функцый порта:
    • Загаловак порта
    • АФУ
    • Памылка порта
    • UMsg (2)
    • Сігнальны кран

Пералік прылад FPGA прыкладання
У гэтым раздзеле распавядаецца пра тое, як праграмы пералічваюць прыладу FPGA з іерархіі sysfs у /sys/class/fpga. У эксampніжэй, дзве прылады Intel FPGA усталяваны ў хасце. Кожная прылада FPGA мае адзін FME і два парты (AFU). Для кожнай прылады FPGA у /sys/class/fpga ствараецца каталог прылад:

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

Кожны вузел мае адзін FME і два парты (AFU) у якасці даччыных прылад:
/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

Увогуле, інтэрфейсы FME/Port sysfs называюцца наступным чынам:
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-fme.j/
/sys/class/fpga/intel-fpga-dev.i/intel-fpga-port.k/

з I паслядоўнай нумарацыяй усіх кантэйнерных прылад, j паслядоўнай нумарацыяй FME і k паслядоўнай нумарацыяй усіх партоў.

На вузлы прылад, якія выкарыстоўваюцца для ioctl() і mmap(), можна спасылацца праз:
/dev/intel-fpga-fme.j
/dev/intel-fpga-port.k

Пералік драйвераў pcie
У гэтым раздзеле даецца надview патоку кода для пераліку прылад, выкананага intel-fpga-pci.ko. Выдзелены асноўныя структуры даных і функцыі. Гэты раздзел лепш выконваць, калі viewing суправаджальны зыходны код (pcie.c).

Структуры дадзеных пераліку

пералік fpga_id_type {
PARENT_ID,
FME_ID,
PORT_ID,
FPGA_ID_MAX
};
статычная структура idr fpga_ids[FPGA_ID_MAX];
struct fpga_chardev_info {
const char *імя;
дэв_ць дэвт;
};
struct fpga_chardev_info fpga_chrdevs[] = {
{.name = FPGA_FEATURE_DEV_FME},
{.name = FPGA_FEATURE_DEV_PORT},
};
клас статычнай структуры *fpga_class;
статычная структура 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,}
};
статычная структура 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;
структура прылады *fme_dev;
struct mutex lock;
struct list_head port_dev_list;
int вызвалены_порт_нум;
struct list_head рэгіёны;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
несапраўдны __iomem *ioaddr;
несапраўдны __iomem *ioend;
int current_bar;
несапраўдны __iomem *pfme_hdr;
структура прылады *parent_dev;
struct platform_device *feature_dev;
};

Паток пералічэння

  • ccidrv_init()
    • Ініцыялізуйце fpga_ids з дапамогай idr_init().
    • Ініцыялізуйце fpga_chrdevs[i].devt з дапамогай alloc_chrdev_region().
    • Ініцыялізуйце fpga_class з дапамогай class_create().
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • Уключыце прыладу PCI, запытайце доступ да яе рэгіёнаў, усталюйце галоўны рэжым PCI і наладзьце DMA.
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • Вылучыце структуру build_feature_devs_info, ініцыялізуйце яе.
      .parent_dev усталяваны ў бацькоўскі каталог sysfs (intel-fpga-dev.id), які змяшчае каталогі FME і Port sysfs.
  • parse_feature_list()
    • Прайдзіцеся па спісе функцый прылады BAR0, каб даведацца пра FME, порт і іх прыватныя функцыі.
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • Калі сустракаецца FME:
  • build_info_create_dev()
    • Вылучыце прыладу платформы для FME, захаваўшы яе ў build_feature_devs_info.feature_dev.
    • feature_dev.id ініцыялізуецца вынікам idr_alloc(fpga_ids[FME_ID],
    • feature_dev.parent усталяваны ў build_feature_devs_info.parent_dev.
    • Вылучыце масіў структурных рэсурсаў у feature_dev.resource.
  • Вылучыце структуру feature_platform_data, ініцыялізуйце яе і захавайце паказальнік у feature_dev.dev.platform_data
    • create_feature_instance() build_info_add_sub_feature()
    • Ініцыялізаваць feature_dev.resource[FME_FEATURE_ID_HEADER].
    • feature_platform_data_add()
    • Ініцыялізаваць feature_platform_data.features[FME_FEATURE_ID_HEADER], усё, акрамя .fops.
  • parse_feature() parse_feature_afus() parse_feature_port()
    • Калі сустракаецца порт:
  • build_info_create_dev()
    • Вылучыце прыладу платформы для порта, захоўваючы ў build_feature_devs_info.feature_dev.
    • feature_dev.id ініцыялізуецца вынікам idr_alloc(fpga_ids[PORT_ID],
    • feature_dev.parent усталяваны ў build_feature_devs_info.parent_dev.
    • Вылучыце масіў структурных рэсурсаў у feature_dev.resource.
    • Вылучыце структуру feature_platform_data, ініцыялізуйце яе і захавайце паказальнік у feature_dev.dev.platform_data
  • build_info_commit_dev()
    • Дадайце struct feature_platform_data.node для порта ў спіс партоў у struct cci_drvdata.port_dev_list
  • create_feature_instance() build_info_add_sub_feature()
    • Ініцыялізаваць feature_dev.resource[PORT_FEATURE_ID_HEADER].
  • feature_platform_data_add()
    • Ініцыялізаваць feature_platform_data.features[PORT_FEATURE_ID_HEADER], усё, акрамя .fops.
  • parse_feature() parse_feature_afus() parse_feature_port_uafu()
    • Пры выяўленні AFU:
  • create_feature_instance() build_info_add_sub_feature()
    • Ініцыялізаваць feature_dev.resource[PORT_FEATURE_ID_UAFU].
  • feature_platform_data_add()
    • Ініцыялізаваць feature_platform_data.features[PORT_FEATURE_ID_UAFU], усё, акрамя .fops.
  • parse_feature() parse_feature_private() parse_feature_fme_private()
    • Калі выяўляецца прыватная функцыя FME:
  • create_feature_instance() build_info_add_sub_feature()
    • Ініцыялізаваць feature_dev.resource[id].
  • feature_platform_data_add()
    • Ініцыялізаваць feature_platform_data.features[id], усё, акрамя .fops.
  • parse_feature() parse_feature_private() parse_feature_port_private()
  • Калі выяўляецца прыватная функцыя порта: * create_feature_instance() build_info_add_sub_feature() * Ініцыялізаваць feature_dev.resource[id]. * feature_platform_data_add() Ініцыялізаваць feature_platform_data.features[id], усё, акрамя .fops.
  • parse_ports_from_fme()
    • Калі драйвер загружаны на Physical Function (PF), то:
  • Запусціце паток parse_feature_list() для кожнага порта, апісанага ў загалоўку FME.
  • Выкарыстоўвайце BAR, згаданы ў кожным запісе порта ў загалоўку.

Ініцыялізацыя прылады платформы FME
У гэтым раздзеле даецца надview патоку кода для ініцыялізацыі прылады FME, выкананай intel-fpga-fme.ko. Асноўныя структуры дадзеных і функцыі вылучаны. Гэты раздзел лепш выконваць, калі viewing суправаджальны зыходны код (fme-main.c).

Структуры дадзеных прылад платформы FME

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
доўгі (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
асаблівасць структуры {
const char *імя;
int resource_index;
несапраўдны __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head вузел;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
несапраўдны *прыватны;
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 *)); структур
характарыстыка асаблівасці[0];
};
struct perf_object {
ідэнтыфікатар int;
const struct attribute_group **attr_groups;
структура прылады *fme_dev;
struct list_head вузел;
struct list_head дзеці;
struct kobject kobj;
};
struct fpga_fme {
u8 ідэнтыфікатар_порта;
u64 pr_err;
структура прылады *dev_err;
struct perf_object *perf_dev;
struct feature_platform_data *pdata;
};

Паток ініцыялізацыі прылады платформы FME

Паток ініцыялізацыі FMEintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (4)

  • fme_probe() fme_dev_init()
    • Ініцыялізуйце структуру fpga_fme і захавайце яе ў полі feature_platform_data.private.
  • fme_probe() fpga_dev_feature_init() feature_instance_init()
    • Захавайце структуру feature_ops у feature_platform_data.features для кожнай запаўняемай функцыі.
    • Выклік тэставай функцыі, калі такая маецца, са структуры.
    • Выклік функцыі init са структуры.
  • fme_probe() fpga_register_dev_ops()
    • Стварыце вузел прылады знакаў FME, зарэгістраваўшы структуру file_аперацыі.

Ініцыялізацыя прылады портавай платформы
У гэтым раздзеле даецца надview патоку кода для ініцыялізацыі прылады порта, выкананай intel-fpga-afu.ko. Выдзелены асноўныя структуры даных і функцыі. Гэты раздзел лепш выконваць, калі viewing суправаджальны зыходны код (afu.c).

Структуры дадзеных прылады партовай платформы

struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
доўгі (*ioctl)(struct platform_device *pdev, struct feature *feature,
unsigned int cmd, unsigned long arg);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
асаблівасць структуры {
const char *імя;
int resource_index;
несапраўдны __iomem *ioaddr;
struct feature_ops *ops;
};
struct feature_platform_data {
struct list_head вузел;
struct mutex lock;
unsigned long dev_status;
struct cdev cdev;
struct platform_device *dev;
unsigned int disable_count;
несапраўдны *прыватны;
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 *));
асаблівасці структуры[0];
};
struct fpga_afu_region {
індэкс u32;
сцягі u32;
памер u64;
u64 зрушэнне;
u64 фіз;
struct list_head вузел;
};
struct fpga_afu_dma_region {
u64 user_addr;
даўжыня u64;
u64 iova;
struct page **старонкі;
struct rb_node вузел;
Bool у_выкарыстанні;
};
struct fpga_afu {
u64 region_cur_offset;
int num_regions;
u8 num_umsgs;
struct list_head рэгіёны;
struct rb_root dma_regions;
struct feature_platform_data *pdata;
};

Паток ініцыялізацыі прылады партовай платформы

Паток ініцыялізацыі портаintel-OPAE-FPGA-Linux-Device-Driver-Architecture-fig- (5)

  • afu_probe() afu_dev_init()
    • Ініцыялізуйце структуру fpga_afu і захавайце яе ў полі feature_platform_data.private.
  • afu_probe() fpga_dev_feature_init() feature_instance_init()
    • Захавайце структуру feature_ops у feature_platform_data.features для кожнай запаўняемай функцыі.
    • Выклік тэставай функцыі, калі такая маецца, са структуры.
    • Выклік функцыі init са структуры.
  • afu_probe() fpga_register_dev_ops()
    • Стварыце вузел сімвальнай прылады Port, зарэгістраваўшы структуру file_аперацыі.

FME IOCTL
IOCTL, якія выклікаюцца пры адкрыцці file дэскрыптар для /dev/intel-fpga-fme.j FPGA_GET_API_VERSION—вярнуць бягучую версію ў выглядзе цэлага ліку, пачынаючы з 0.

FPGA_CHECK_EXTENSION—у цяперашні час не падтрымліваецца.

FPGA_FME_PORT_RELEASE—arg з'яўляецца паказальнікам на:

struct fpga_fme_port_release {
__u32 argsz; // у: sizeof(struct fpga_fme_port_release)
__u32 сцягі; // у: павінна быць 0
__u32 ідэнтыфікатар_порта; // у: ID порта (ад 0) для вызвалення.
};

FPGA_FME_PORT_ASSIGN—arg з'яўляецца паказальнікам на:

struct fpga_fme_port_assign {
__u32 argsz; // у: sizeof(struct fpga_fme_port_assign)
__u32 сцягі; // у: павінна быць 0
__u32 ідэнтыфікатар_порта; // у: ідэнтыфікатар порта (ад 0) для прызначэння. (павінна быць
раней выпушчаны FPGA_FME_PORT_RELEASE)
};

FPGA_FME_PORT_PR—arg з'яўляецца паказальнікам на:

struct fpga_fme_port_pr {
__u32 argsz; // у: sizeof(struct fpga_fme_port_pr)
__u32 сцягі; // у: павінна быць 0
__u32 ідэнтыфікатар_порта; // у: ідэнтыфікатар порта (ад 0)
__u32 памер_буфера; // у: памер буфера бітавага патоку ў байтах. Павінен быць 4-байт
выраўнаваны.
__u64 буфер_адрас; // у: адрас працэсу буфера бітавага патоку
статус __u64; // out: статус памылкі (бітавая маска)
};

Порт IOCTL
IOCTL, якія выклікаюцца пры адкрыцці file дэскрыптар для /dev/intel-fpga-port.k FPGA_GET_API_VERSION—вярнуць бягучую версію ў выглядзе цэлага ліку, пачынаючы з 0. FPGA_CHECK_EXTENSION—у цяперашні час не падтрымліваецца.

FPGA_PORT_GET_INFO—arg з'яўляецца паказальнікам на:

struct fpga_port_info {
__u32 argsz; // у: sizeof(struct fpga_port_info)
__u32 сцягі; // выхад: вяртае 0
__u32 колькасць_рэгіёнаў; // выхад: колькасць рэгіёнаў MMIO, 2 (1 для AFU і 1 для
STP)
__u32 num_umsgs; // out: колькасць UMsg, якія падтрымліваюцца абсталяваннем
};

FPGA_PORT_GET_REGION_INFO—arg з'яўляецца паказальнікам на:

struct fpga_port_region_info {
__u32 argsz; // у: sizeof(struct fpga_port_region_info)
__u32 сцягі; // выхад: (бітавая маска) { FPGA_REGION_READ, FPGA_REGION_WRITE,
FPGA_REGION_MMAP}
__u32 індэкс; // у: FPGA_PORT_INDEX_UAFU або FPGA_PORT_INDEX_STP
__u32 абіўка; // у: павінна быць 0
памер __u64; // выхад: памер вобласці MMIO у байтах
__u64 зрушэнне; // выхад: зрушэнне вобласці MMIO ад пачатку fd прылады
};

FPGA_PORT_DMA_MAP—arg з'яўляецца паказальнікам на:
struct fpga_port_dma_map {
__u32 argsz; // у: sizeof(struct fpga_port_dma_map)
__u32 сцягі; // у: павінна быць 0 __u64 user_addr; // у: віртуальны працэс
адрас. Павінна быць выраўнавана па старонцы.
__u64 даўжыня; // у: даўжыня адлюстравання ў байтах. Павінен быць кратным старонцы
памер.
__u64 iova; // выхад: віртуальны адрас IO };

FPGA_PORT_DMA_UNMAP—arg з'яўляецца паказальнікам на:
struct fpga_port_dma_unmap {
__u32 argsz; // у: sizeof(struct fpga_port_dma_unmap)
__u32 сцягі; // у: павінна быць 0
__u64 iova; // у: віртуальны адрас уводу-выводу, вернуты папярэднім
FPGA_PORT_DMA_MAP};

  • FPGA_PORT_RESET—аргумент павінен мець значэнне NULL.
  • FPGA_PORT_UMSG_ENABLE—аргумент павінен мець значэнне NULL.
  • FPGA_PORT_UMSG_DISABLE—аргументы павінны мець значэнне NULL.

FPGA_PORT_UMSG_SET_MODE—arg з'яўляецца паказальнікам на:

struct fpga_port_umsg_cfg {
__u32 argsz; // у: sizeof(struct fpga_port_umsg_cfg)
__u32 сцягі; // у: павінна быць 0
__u32 растравая_падказка; // у: растравы рэжым падказкі UMsg. Пазначае, якія з'яўляюцца UMsg
уключаны.
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • UMsg павінен быць адключаны перад выдачай гэтага ioctl.
  • Поле iova павінна быць дастаткова вялікім для ўсіх UMsg (num_umsgs * PAGE_SIZE).
    • Буфер пазначаецца як «выкарыстоўваны» кіраваннем буферам драйвера.
    • Калі iova мае значэнне NULL, любы папярэдні рэгіён не будзе пазначаны як «выкарыстоўваны».
  • arg з'яўляецца паказальнікам на:
    struct fpga_port_umsg_base_addr {
    • u32 argsz; // у: sizeof(struct fpga_port_umsg_base_addr)
    • сцягі u32; // у: павінна быць 0
    • u64 iova; // у: віртуальны адрас IO з FPGA_PORT_DMA_MAP. };

Заўвага:

  • Каб выдаліць памылкі порта, вы павінны напісаць дакладную бітавую маску бягучых памылак, напрыкладample, cat памылкі > ясна
  • UMsg падтрымліваецца толькі праз стэк паскарэння для працэсара Intel Xeon з убудаванай FPGA.

sysfs Files

Загаловак FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/

sysfs file поле mmio тыпу доступ
нумар_порта fme_header.capability.num_ports дзесятковы міжнар Толькі для чытання
памер_кэша fme_header.capability.cache_size дзесятковы міжнар Толькі для чытання
версія fme_header.capability.fabric_verid дзесятковы міжнар Толькі для чытання
ідэнтыфікатар_сокета fme_header.capability.socket_id дзесятковы міжнар Толькі для чытання
ідэнтыфікатар_бітавага_патоку fme_header.bitstream_id шаснаццатковы uint64_t Толькі для чытання
бітавыя_метададзеныя fme_header.bitstream_md шаснаццатковы uint64_t Толькі для чытання

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

sysfs file поле mmio тыпу доступ
парог1 heat.threshold.tmp_thshold1 дзесятковы міжнар Карыстальнік: толькі для чытання Root: чытанне-запіс
парог2 heat.threshold.tmp_thshold2 дзесятковы міжнар Карыстальнік: толькі для чытання Root: чытанне-запіс
парог_паездкі heat.threshold.therm_trip_thshold дзесятковы міжнар Толькі для чытання
threshold1_reached heat.threshold.thshold1_status дзесятковы міжнар Толькі для чытання
threshold2_reached heat.threshold.thshold2_status дзесятковы міжнар Толькі для чытання
threshold1_policy тэрмічны. threshold.thshold_policy дзесятковы міжнар Карыстальнік: толькі для чытання Root: чытанне-запіс
тэмпература heat.rdsensor_fm1.fpga_temp дзесятковы міжнар Толькі для чытання

FME sysfs кіравання харчаваннем files
intel-fpga-dev.i/intel-fpga-fme.j/power_mgmt/

sysfs file поле mmio тыпу доступ
спажываецца power.status.pwr_consumed шаснаццатковы uint64_t Толькі для чытання
парог1 магутнасць.парог.парог1 шаснаццатковы uint64_t Карыстальнік: толькі для чытання Root: чытанне-запіс
парог2 магутнасць.парог.парог2 шаснаццатковы uint64_t Карыстальнік: толькі для чытання Root: чытанне-запіс
парог1_статус power.threshold.threshold1_status дзесятковы без знака Толькі для чытання
парог2_статус power.threshold.threshold2_status дзесятковы без знака Толькі для чытання
rtl power.status.fpga_latency_report дзесятковы без знака Толькі для чытання

FME Глабальная памылка sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/памылкі/

sysfs file поле mmio тыпу доступ
pcie0_памылкі gerror.pcie0_err шаснаццатковы uint64_t Чытаць-пісаць
pcie1_памылкі gerror.pcie1_err шаснаццатковы uint64_t Чытаць-пісаць
памылка_ўвядзення gerror.ras_error_inj шаснаццатковы uint64_t Чытаць-пісаць

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

sysfs file поле mmio тыпу доступ
памылкі gerror.fme_err шаснаццатковы uint64_t Толькі для чытання
першая_памылка gerror.fme_first_err.err_reg_status шаснаццатковы uint64_t Толькі для чытання
наступная_памылка gerror.fme_next_err.err_reg_status шаснаццатковы uint64_t Толькі для чытання
ясна Ачышчае памылкі, first_error, next_error розныя uint64_t Толькі для запісу

Заўвага:
Каб выдаліць памылкі FME, вы павінны напісаць дакладную бітавую маску бягучых памылак, напрыкладample cat памылкі > ясна.

Частковая рэканфігурацыя FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/

sysfs file поле mmio тыпу доступ
ідэнтыфікатар_інтэрфейсу pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l hex 16-байт Толькі для чытання

FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/гадзіны

sysfs file поле mmio тыпу доступ
гадзіннік gperf.clk.afu_interf_clock шаснаццатковы uint64_t Толькі для чытання

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/ (Не дзейнічае для стэка паскарэння для працэсара Intel Xeon з FPGA)

sysfs file поле mmio тыпу доступ
замарозіць gperf.ch_ctl.freeze дзесятковы міжнар Чытаць-пісаць
прачытанае_хіт gperf.CACHE_RD_HIT шаснаццатковы uint64_t Толькі для чытання
чытаць_прапусціць gperf.CACHE_RD_MISS шаснаццатковы uint64_t Толькі для чытання
напісаць_хіт gperf.CACHE_WR_HIT шаснаццатковы uint64_t Толькі для чытання
напісаць_прапусціць gperf.CACHE_WR_MISS шаснаццатковы uint64_t Толькі для чытання
трымаць_запыт gperf.CACHE_HOLD_REQ шаснаццатковы uint64_t Толькі для чытання
tx_req_stall gperf.CACHE_TX_REQ_STALL шаснаццатковы uint64_t Толькі для чытання
sysfs file поле mmio тыпу доступ
rx_req_stall gperf.CACHE_RX_REQ_STALL шаснаццатковы uint64_t Толькі для чытання
data_write_port_contention gperf.CACHE_DATA_WR_PORT_CONTEN шаснаццатковы uint64_t Толькі для чытання
tag_write_port_contention gperf.CACHE_TAG_WR_PORT_CONTEN шаснаццатковы uint64_t Толькі для чытання

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/ (Не дзейнічае для стэка паскарэння для працэсара Intel Xeon з FPGA)

sysfs file поле mmio тыпу доступ
замарозіць gperf.vtd_ctl.freeze дзесятковы міжнар Карыстальнік: толькі для чытання Root: чытанне-запіс

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (Не дзейнічае для стэка паскарэння для працэсара Intel Xeon з FPGA)

sysfs file поле mmio тыпу доступ
транзакцыя_чытання gperf.VTD_AFU0_MEM_RD_TRANS шаснаццатковы uint64_t Толькі для чытання
запіс_транзакцыі gperf.VTD_AFU0_MEM_WR_TRANS шаснаццатковы uint64_t Толькі для чытання
tlb_read_hit gperf.VTD_AFU0_TLB_RD_HIT шаснаццатковы uint64_t Толькі для чытання
tlb_write_hit gperf.VTD_AFU0_TLB_WR_HIT шаснаццатковы uint64_t Толькі для чытання

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

sysfs file поле mmio тыпу доступ
уключыць gperf.fab_ctl.(уключана) дзесятковы міжнар Карыстальнік: толькі для чытання Root: чытанне-запіс
замарозіць gperf.fab_ctl.freeze дзесятковы міжнар Карыстальнік: толькі для чытання Root: чытанне-запіс
pcie0_чытанне gperf.FAB_PCIE0_RD шаснаццатковы uint64_t Толькі для чытання
pcie0_запіс gperf.FAB_PCIE0_WR шаснаццатковы uint64_t Толькі для чытання
pcie1_чытанне gperf.FAB_PCIE1_RD шаснаццатковы uint64_t Толькі для чытання
pcie1_запіс gperf.FAB_PCIE1_WR шаснаццатковы uint64_t Толькі для чытання
upi_read gperf.FAB_UPI_RD шаснаццатковы uint64_t Толькі для чытання
upi_write gperf.FAB_UPI_WR шаснаццатковы uint64_t Толькі для чытання

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

sysfs file поле mmio тыпу доступ
pcie0_чытанне gperf.FAB_PCIE0_RD шаснаццатковы uint64_t Толькі для чытання
pcie0_запіс gperf.FAB_PCIE0_WR шаснаццатковы uint64_t Толькі для чытання
pcie1_чытанне gperf.FAB_PCIE1_RD шаснаццатковы uint64_t Толькі для чытання
pcie1_запіс gperf.FAB_PCIE1_WR шаснаццатковы uint64_t Толькі для чытання
upi_read gperf.FAB_UPI_RD шаснаццатковы uint64_t Толькі для чытання
upi_write gperf.FAB_UPI_WR шаснаццатковы uint64_t Толькі для чытання

Загаловак порта sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file поле mmio тыпу доступ
id port_header.capability.port_number дзесятковы міжнар Толькі для чытання
ltr port_header.control.latency_tolerance дзесятковы міжнар Толькі для чытання

Порт AFU Загаловак sysfs files
intel-fpga-dev.i/intel-fpga-port.k/

sysfs file поле mmio тыпу доступ
afu_id afu_header.guid hex 16-байт Толькі для чытання

Памылка порта sysfs files
intel-fpga-dev.i/intel-fpga-port.k/памылкі/

sysfs file поле mmio тыпу доступ
памылкі памылка.памылка_порта шаснаццатковы uint64_t Толькі для чытання
першая_памылка памылка.першая_порт_памылка шаснаццатковы uint64_t Толькі для чытання
першы_няправільны_патраб памылка.malreq hex 16-байт Толькі для чытання
ясна памылка. (усе памылкі) розныя uint64_t Толькі для запісу

Заўвага:
Каб выдаліць памылкі порта, вы павінны напісаць дакладную бітавую маску бягучых памылак, напрыкладample cat памылкі > ясна.

Гісторыя версій

Версія дакумента Змены
2017.10.02 Першапачатковы выпуск.

Кіраўніцтва па архітэктуры драйвераў прылад Intel FPGA Linux OPAE

Дакументы / Рэсурсы

Архітэктура драйвера прылады intel OPAE FPGA Linux [pdfКіраўніцтва карыстальніка
OPAE FPGA Архітэктура драйвера прылады Linux, OPAE FPGA, Архітэктура драйвера прылады Linux, Архітэктура драйвера, архітэктура

Спасылкі

Пакінуць каментар

Ваш электронны адрас не будзе апублікаваны. Абавязковыя для запаўнення палі пазначаны *