Архітэктура драйвера прылады intel OPAE FPGA Linux
OPAE Архітэктура драйвера прылад Intel FPGA Linux
Драйвер OPAE Intel FPGA забяспечвае інтэрфейсы для карыстальніцкіх праграм для канфігурацыі, пераліку, адкрыцця і доступу да паскаральнікаў FPGA на платформах, абсталяваных рашэннямі Intel FPGA, і забяспечвае функцыі кіравання на сістэмным узроўні, такія як рэканфігурацыя FPGA, кіраванне харчаваннем і віртуалізацыя.
Апаратная архітэктура
З пункту гледжання АС view, абсталяванне FPGA выглядае як звычайная прылада PCIe. Памяць прылады FPGA арганізавана з выкарыстаннем загадзя вызначанай структуры даных (спіс функцый прылады). Функцыі, якія падтрымліваюцца прыладай FPGA, адкрываюцца праз гэтыя структуры даных, як паказана ніжэй на наступным малюнку:
Прылада FPGA PCIe
Драйвер падтрымлівае PCIe SR-IOV для стварэння віртуальных функцый (VF), якія можна выкарыстоўваць для прызначэння асобных паскаральнікаў віртуальным машынам.
Карпарацыя Intel. Усе правы ахоўваюцца. Intel, лагатып Intel і іншыя знакі Intel з'яўляюцца гандлёвымі маркамі карпарацыі Intel або яе даччыных кампаній. Intel гарантуе прадукцыйнасць сваёй FPGA і паўправадніковай прадукцыі ў адпаведнасці з бягучымі спецыфікацыямі ў адпаведнасці са стандартнай гарантыяй Intel, але пакідае за сабой права ўносіць змены ў любыя прадукты і паслугі ў любы час без папярэдняга паведамлення. Intel не нясе ніякай адказнасці або абавязацельстваў, якія вынікаюць з прымянення або выкарыстання любой інфармацыі, прадукту або паслугі, апісаных тут, за выключэннем выпадкаў, прама ўзгодненых Intel у пісьмовай форме. Кліентам Intel рэкамендуецца атрымаць апошнюю версію спецыфікацый прылады, перш чым спадзявацца на любую апублікаваную інфармацыю і перад размяшчэннем заказаў на прадукты ці паслугі.
Іншыя назвы і брэнды могуць быць заяўлены як уласнасць іншых.
Віртуалізаваная прылада FPGA PCIe
Механізм кіравання 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, у тым ліку тыя, якія працуюць у віртуалізаваным хасце, павінна быць зачынена перад спробай частковай рэканфігурацыі. Крокі будуць:
- Выгрузка драйвера з госця
- Адключыце VF ад госця
- Адключыць SR-IOV
- Выканайце частковую рэканфігурацыю
- Уключыць SR-IOV
- Падключыце VF да госця
- Загрузіць драйвера ў госць
Віртуалізацыя FPGA
Каб атрымаць доступ да паскаральніка з прыкладанняў, запушчаных у віртуальнай машыне, адпаведны порт AFU павінен быць прызначаны VF з дапамогай наступных крокаў:
- PF валодае ўсімі партамі AFU па змаўчанні. Любы порт, які трэба пераназначыць для VF, павінен спачатку быць вызвалены з PF праз ioctl FPGA_FME_PORT_RELEASE на прыладзе FME.
- Пасля вызвалення N партоў ад PF каманда ніжэй можа выкарыстоўвацца для ўключэння SRIOV і VF. Кожны VF валодае толькі адным портам з AFU. рэха N > PCI_DEVICE_PATH/sriov_numvfs
- Пераход праз VF да VM.
- AFU пад VF даступны з прыкладанняў у VM (з выкарыстаннем таго ж драйвера ўнутры VF).
Заўвага:
FME не можа быць прызначаны VF, такім чынам, PR і іншыя функцыі кіравання даступныя толькі праз PF.
Арганізацыя кіроўцаў
Драйвер прылады для модуля pcie
Арганізацыя кіроўцаў
Прылады 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.
- Вылучыце структуру build_feature_devs_info, ініцыялізуйце яе.
- 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
Паток ініцыялізацыі FME
- 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;
};
Паток ініцыялізацыі прылады партовай платформы
Паток ініцыялізацыі порта
- 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, Архітэктура драйвера, архітэктура |