intel-логотип

Архітектура драйвера пристрою intel OPAE FPGA Linux

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

Архітектура драйвера пристрою Intel FPGA Linux OPAE

Драйвер OPAE Intel FPGA надає інтерфейси для додатків у просторі користувача для конфігурації, нумерації, відкриття та доступу до прискорювачів FPGA на платформах, оснащених рішеннями Intel FPGA, і забезпечує функції керування на системному рівні, такі як реконфігурація FPGA, керування живленням і віртуалізація.

Апаратна архітектура

З точки зору ОС viewапаратне забезпечення FPGA виглядає як звичайний пристрій PCIe. Пам'ять пристрою FPGA організована за допомогою попередньо визначеної структури даних (Device Feature List). Функції, які підтримуються пристроєм 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) під’єднується до порту та відкриває область 256 КБ MMIO для використання для регістрів керування, специфічних для прискорювача.
  • Програми простору користувача можуть отримати ексклюзивний доступ до AFU, підключеного до порту, за допомогою open() на пристрої порту та звільнити його за допомогою close().
  • Програми користувацького простору також можуть прискорювати mmap() регіони MMIO.

Часткова реконфігурація
Як згадувалося вище, прискорювачі можна переналаштувати шляхом часткової переналаштування функції прискорювача (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. echo 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 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.
  • 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

Потік ініціалізації 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. Виділено основні структури даних і функції. Цей розділ найкраще дотримуватися, коли 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;
};

Потік ініціалізації пристрою портової платформи

Потік ініціалізації порту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; // 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

Список літератури

Залиште коментар

Ваша електронна адреса не буде опублікована. Обов'язкові поля позначені *