Архітектура драйвера пристрою intel OPAE FPGA Linux
Архітектура драйвера пристрою Intel FPGA Linux OPAE
Драйвер OPAE Intel FPGA надає інтерфейси для додатків у просторі користувача для конфігурації, нумерації, відкриття та доступу до прискорювачів FPGA на платформах, оснащених рішеннями Intel FPGA, і забезпечує функції керування на системному рівні, такі як реконфігурація FPGA, керування живленням і віртуалізація.
Апаратна архітектура
З точки зору ОС viewапаратне забезпечення FPGA виглядає як звичайний пристрій PCIe. Пам'ять пристрою FPGA організована за допомогою попередньо визначеної структури даних (Device Feature List). Функції, які підтримуються пристроєм 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) під’єднується до порту та відкриває область 256 КБ MMIO для використання для регістрів керування, специфічних для прискорювача.
- Програми простору користувача можуть отримати ексклюзивний доступ до AFU, підключеного до порту, за допомогою open() на пристрої порту та звільнити його за допомогою close().
- Програми користувацького простору також можуть прискорювати mmap() регіони MMIO.
Часткова реконфігурація
Як згадувалося вище, прискорювачі можна переналаштувати шляхом часткової переналаштування функції прискорювача (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. echo 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 Management Engine (FME) і порту.
- Створює екземпляри драйвера платформи, змушуючи ядро Linux завантажувати відповідні драйвери модуля платформи.
Драйвер пристрою модуля платформи FME
- Управління живленням і теплом, повідомлення про помилки, звіти про продуктивність та інші інфраструктурні функції. Ви можете отримати доступ до цих функцій через інтерфейси sysfs, надані драйвером FME.
- Часткова реконфігурація. Драйвер FME реєструє менеджер FPGA під час ініціалізації підфункції PR; як тільки він отримує від вас ioctl FPGA_FME_PORT_PR, він викликає функцію загального інтерфейсу від менеджера FPGA, щоб завершити часткову реконфігурацію бітового потоку для заданого порту.
- Керування портами для віртуалізації. Драйвер 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
- Тепловий менеджмент
- Управління живленням
- Глобальна помилка
- Часткова реконфігурація
- Глобальна ефективність
Драйвер пристрою модуля платформи порту
Подібно до драйвера FME, драйвер порту FPGA (і AFU) (intel-fpga-afu. ko) перевіряється після створення пристрою платформи порту. Основною функцією цього модуля є надання інтерфейсу для додатків простору користувача для доступу до окремих прискорювачів, включаючи базове керування скиданням на порту, експорт регіону AFU MMIO, службу відображення буфера DMA, сповіщення UMsg(1) і функції віддаленого налагодження ( Дивись вище).
UMsg підтримується лише стеком прискорення для процесора Intel Xeon® із вбудованою FPGA.
Функції драйвера пристрою модуля платформи порту
- Створює вузол символьного пристрою Port.
- Створює порт sysfs files і реалізує порт 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. Виділено основні структури даних і функції. Цей розділ найкраще дотримуватися, коли viewсупровідний вихідний код (pcie.c).
Структури даних перерахування
enum 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 released_port_num;
struct list_head регіони;
};
struct build_feature_devs_info {
struct pci_dev *pdev;
void __iomem *ioaddr;
void __iomem *ioend;
int current_bar;
void __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.
- Виділіть масив ресурсу struct у 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. Виділено основні структури даних і функції. Цей розділ найкраще дотримуватися, коли viewвикористовуючи супровідний вихідний код (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);
long (*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;
void __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 id;
const struct attribute_group **attr_groups;
структура пристрою *fme_dev;
вузол struct list_head;
struct list_head діти;
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
Потік ініціалізації 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. Виділено основні структури даних і функції. Цей розділ найкраще дотримуватися, коли viewсупровідний вихідний код (afu.c).
Структури даних пристроїв платформи портів
struct feature_ops {
int (*init)(struct platform_device *pdev, struct feature *feature);
int (*uinit)(struct platform_device *pdev, struct feature *feature);
long (*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;
void __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 **pages;
struct rb_node вузол;
bool in_use;
};
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; // in: sizeof(struct fpga_fme_port_release)
__u32 прапори; // in: має бути 0
__u32 port_id; // in: ідентифікатор порту (від 0) для випуску.
};
FPGA_FME_PORT_ASSIGN—arg є вказівником на:
struct fpga_fme_port_assign {
__u32 argsz; // in: sizeof(struct fpga_fme_port_assign)
__u32 прапори; // in: має бути 0
__u32 port_id; // in: ідентифікатор порту (від 0) для призначення. (мабуть
раніше випущений FPGA_FME_PORT_RELEASE)
};
FPGA_FME_PORT_PR—arg є вказівником на:
struct fpga_fme_port_pr {
__u32 argsz; // in: sizeof(struct fpga_fme_port_pr)
__u32 прапори; // in: має бути 0
__u32 port_id; // in: ідентифікатор порту (з 0)
__u32 buffer_size; // in: розмір буфера бітового потоку в байтах. Має бути 4-байтним
вирівняні.
__u64 buffer_address; // in: адреса процесу буфера бітового потоку
статус __u64; // вихід: статус помилки (бітова маска)
};
Порт 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; // in: 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; // in: 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 доповнення; // in: має бути 0
__u64 розмір; // вихід: розмір області MMIO в байтах
__u64 зміщення; // вихід: зміщення області MMIO від початку fd пристрою
};
FPGA_PORT_DMA_MAP—arg є вказівником на:
struct fpga_port_dma_map {
__u32 argsz; // in: sizeof(struct fpga_port_dma_map)
__u32 прапори; // in: має бути 0 __u64 user_addr; // in: віртуальний процес
адресу. Має бути вирівняно по сторінці.
__u64 довжина; // in: довжина відображення в байтах. Має бути кратним сторінці
розмір.
__u64 iova; // вихід: віртуальна адреса IO };
FPGA_PORT_DMA_UNMAP—arg є вказівником на:
struct fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 прапори; // in: має бути 0
__u64 iova; // in: віртуальна адреса IO, повернута попереднім
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; // in: sizeof(struct fpga_port_umsg_cfg)
__u32 прапори; // in: має бути 0
__u32 hint_bitmap; // в: растрове зображення режиму підказки 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; // in: sizeof(struct fpga_port_umsg_base_addr)
- u32 прапори; // in: має бути 0
- u64 iova; // in: віртуальна адреса IO з FPGA_PORT_DMA_MAP. };
Примітка:
- Щоб очистити помилки порту, вам потрібно написати точну бітову маску поточних помилок, наприкладample, cat errors > clear
- UMsg підтримується лише стеком прискорення для процесора Intel Xeon із вбудованою FPGA.
sysfs Files
Заголовок FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/
sysfs file | поле mmio | типу | доступу |
ports_num | fme_header.capability.num_ports | decimal int | Тільки для читання |
розмір_кешу | fme_header.capability.cache_size | decimal int | Тільки для читання |
версія | fme_header.capability.fabric_verid | decimal int | Тільки для читання |
socket_id | fme_header.capability.socket_id | decimal int | Тільки для читання |
bitstream_id | fme_header.bitstream_id | шістнадцятковий uint64_t | Тільки для читання |
bitstream_metadata | 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 | decimal int | Користувач: лише читання Корінь: читання-запис |
поріг2 | heat.threshold.tmp_thshold2 | decimal int | Користувач: лише читання Корінь: читання-запис |
threshold_trip | heat.threshold.therm_trip_thshold | decimal int | Тільки для читання |
threshold1_reached | heat.threshold.thshold1_status | decimal int | Тільки для читання |
threshold2_reached | heat.threshold.thshold2_status | decimal int | Тільки для читання |
threshold1_policy | теплові. threshold.thshold_policy | decimal int | Користувач: лише читання Корінь: читання-запис |
температура | heat.rdsensor_fm1.fpga_temp | decimal int | Тільки для читання |
FME Power Management 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 | Користувач: лише читання Корінь: читання-запис |
поріг2 | потужність.поріг.поріг2 | шістнадцятковий uint64_t | Користувач: лише читання Корінь: читання-запис |
threshold1_status | power.threshold.threshold1_status | десяткова беззнакова | Тільки для читання |
threshold2_status | power.threshold.threshold2_status | десяткова беззнакова | Тільки для читання |
rtl | power.status.fpga_latency_report | десяткова беззнакова | Тільки для читання |
Глобальна помилка FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/errors/
sysfs file | поле mmio | типу | доступу |
pcie0_errors | gerror.pcie0_err | шістнадцятковий uint64_t | Читати писати |
pcie1_errors | gerror.pcie1_err | шістнадцятковий uint64_t | Читати писати |
inject_error | 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 errors > clear.
Часткова реконфігурація FME sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/pr/
sysfs file | поле mmio | типу | доступу |
інтерфейс_id | pr.fme_pr_intfc_id0_h, pr.fme_pre_intfc_id0_l | шістнадцятковий 16-байт | Тільки для читання |
FME Global Performance sysfs files
intel-fpga-dev.i/intel-fpga-fme.j/dperf/clock
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 | decimal int | Читати писати |
read_hit | gperf.CACHE_RD_HIT | шістнадцятковий uint64_t | Тільки для читання |
read_miss | gperf.CACHE_RD_MISS | шістнадцятковий uint64_t | Тільки для читання |
write_hit | gperf.CACHE_WR_HIT | шістнадцятковий uint64_t | Тільки для читання |
write_miss | gperf.CACHE_WR_MISS | шістнадцятковий uint64_t | Тільки для читання |
hold_request | 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 | decimal int | Користувач: лише читання Корінь: читання-запис |
intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/ (недійсно для стека прискорення для ЦП Intel Xeon із FPGA)
sysfs file | поле mmio | типу | доступу |
read_transaction | 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.(увімкнено) | decimal int | Користувач: лише читання Корінь: читання-запис |
замерзнути | gperf.fab_ctl.freeze | decimal int | Користувач: лише читання Корінь: читання-запис |
pcie0_read | gperf.FAB_PCIE0_RD | шістнадцятковий uint64_t | Тільки для читання |
pcie0_write | gperf.FAB_PCIE0_WR | шістнадцятковий uint64_t | Тільки для читання |
pcie1_read | gperf.FAB_PCIE1_RD | шістнадцятковий uint64_t | Тільки для читання |
pcie1_write | 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_read | gperf.FAB_PCIE0_RD | шістнадцятковий uint64_t | Тільки для читання |
pcie0_write | gperf.FAB_PCIE0_WR | шістнадцятковий uint64_t | Тільки для читання |
pcie1_read | gperf.FAB_PCIE1_RD | шістнадцятковий uint64_t | Тільки для читання |
pcie1_write | 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 | decimal int | Тільки для читання |
ltr | port_header.control.latency_tolerance | decimal int | Тільки для читання |
Порт AFU Заголовок sysfs files
intel-fpga-dev.i/intel-fpga-port.k/
sysfs file | поле mmio | типу | доступу |
afu_id | afu_header.guid | шістнадцятковий 16-байт | Тільки для читання |
Помилка порту sysfs files
intel-fpga-dev.i/intel-fpga-port.k/errors/
sysfs file | поле mmio | типу | доступу |
помилки | помилка.порт_помилка | шістнадцятковий uint64_t | Тільки для читання |
перша_помилка | pererror.port_first_error | шістнадцятковий uint64_t | Тільки для читання |
first_malformed_req | помилка.malreq | шістнадцятковий 16-байт | Тільки для читання |
ясно | помилка (усі помилки) | різні uint64_t | Лише для запису |
Примітка:
Щоб очистити помилки порту, ви повинні написати точну бітову маску поточних помилок, наприкладample cat errors > clear.
Історія версій
Версія документа | Зміни |
2017.10.02 | Початковий випуск. |
Посібник з архітектури драйверів пристроїв OPAE Intel FPGA Linux
Документи / Ресурси
![]() |
Архітектура драйвера пристрою intel OPAE FPGA Linux [pdfПосібник користувача OPAE FPGA Linux Device Driver Architecture, OPAE FPGA, Linux Device Driver Architecture, Driver Architecture, Architecture |