英特尔徽标

英特尔 OPAE FPGA Linux 设备驱动架构

intel-OPAE-FPGA-Linux-设备驱动程序-架构-产品

OPAE 英特尔 FPGA Linux 设备驱动架构

OPAE 英特尔 FPGA 驱动程序为用户空间应用程序提供接口,以在配备英特尔 FPGA 解决方案的平台上配置、枚举、打开和访问 FPGA 加速器,并支持系统级管理功能,例如 FPGA 重新配置、电源管理和虚拟化。

硬件架构

从操作系统的角度 view, FPGA 硬件显示为常规 PCIe 设备。 FPGA 设备内存使用预定义的数据结构(设备功能列表)进行组织。 FPGA器件支持的特性通过这些数据结构暴露出来,如下图所示:

FPGA PCIe 设备

intel-OPAE-FPGA-Linux-设备驱动程序-架构-图- (1)

该驱动程序支持 PCIe SR-IOV 创建虚拟功能 (VF),可用于将单个加速器分配给虚拟机。

英特尔公司。 版权所有。 英特尔、英特尔标识和其他英特尔标志是英特尔公司或其子公司的商标。 英特尔根据英特尔的标准保证保证其 FPGA 和半导体产品的性能符合当前规格,但保留随时更改任何产品和服务的权利,恕不另行通知。 除非英特尔明确书面同意,否则英特尔不承担因应用或使用此处描述的任何信息、产品或服务而产生的任何责任或义务。 建议英特尔客户在依赖任何已发布的信息以及下订单购买产品或服务之前获取最新版本的设备规格。

其他名称和品牌可能属于他人财产。

虚拟化 FPGA PCIe 设备

intel-OPAE-FPGA-Linux-设备驱动程序-架构-图- (2)

FPGA 管理引擎 (FME)
FPGA 管理引擎执行电源和热管理、错误报告、重新配置、性能报告和其他基础设施功能。 每个 FPGA 都有一个 FME,始终通过物理功能 (PF) 访问。 用户空间应用程序可以使用 open() 获取对 FME 的独占访问权,并使用 close() 作为特权用户(root)释放它。

港口
端口表示静态 FPGA 架构(“FPGA 接口管理器 (FIM)”)与包含加速器功能 (AF) 的部分可重配置区域之间的接口。 端口控制从软件到加速器的通信,并提供复位和调试等功能。 一个 PCIe 设备可能有多个端口,每个端口都可以通过 VF 公开,方法是使用 FME 设备上的 FPGA_FME_PORT_ASSIGN ioctl 分配它。

加速器功能 (AF) 单元

  • 加速器功能 (AF) 单元连接到端口并公开一个 256K MMIO 区域以用于加速器特定的控制寄存器。
  • 用户空间应用程序可以通过在端口设备上使用 open() 来获取对附加到端口的 AFU 的独占访问权,并使用 close() 释放它。
  • 用户空间应用程序也可以 mmap() 加速 MMIO 区域。

部分重构
如上所述,可以通过加速器功能 (AF) 的部分重新配置来重新配置加速器 file. 加速器功能 (AF) 必须已针对 FPGA 的确切 FIM 和目标静态区域(端口)生成; 否则,重新配置操作将失败并可能导致系统不稳定。 这种兼容性可以通过将 AF 标头中记录的接口 ID 与 FME 通过 sysfs 公开的接口 ID 进行比较来检查。 这种检查通常由用户空间在调用重新配置 IOCTL 之前完成。

笔记:
目前,任何访问 FPGA 的软件程序,包括在虚拟化主机中运行的软件程序,都必须在尝试部分重新配置之前关闭。 步骤是:

  1. 从来宾卸载驱动程序
  2. 从客户机上拔下 VF
  3. 禁用 SR-IOV
  4. 执行部分重新配置
  5. 启用 SR-IOV
  6. 将 VF 插入客户机
  7. 在来宾中加载驱动程序

FPGA虚拟化
要允许从 VM 中运行的应用程序访问加速器,需要使用以下步骤将相应的 AFU 端口分配给 VF:

  1. PF默认拥有所有AFU端口。 任何需要重新分配给 VF 的端口必须首先通过 FME 设备上的 FPGA_FME_PORT_RELEASE ioctl 从 PF 释放。
  2. 一旦 N 端口从 PF 中释放,可以使用以下命令启用 SRIOV 和 VF。 每个 VF 仅拥有一个带 AFU 的端口。 echo N > PCI_DEVICE_PATH/sriov_numvfs
  3. 通过 VF 传递给 VM。
  4. VF 下的 AFU 可从 VM 中的应用程序访问(使用 VF 内的相同驱动程序)。

笔记:
不能将 FME 分配给 VF,因此 PR 和其他管理功能只能通过 PF 使用。

司机组织

PCIe 模块设备驱动程序

司机组织

intel-OPAE-FPGA-Linux-设备驱动程序-架构-图- (3)

FPGA 设备显示为常规 PCIe 设备; 因此,一旦检测到 FPGA PCIe PF 或 VF,FPGA PCIe 设备驱动程序 (intel-FPGA-PCI.ko) 总是首先加载。 该驱动程序在驱动程序体系结构中起着基础结构的作用。 它:

  • 创建一个 FPGA 容器设备作为功能设备的父级。
  • 遍历在 PCIe 设备 BAR 内存中实现的设备功能列表,以发现功能设备及其子功能,并在容器设备下为它们创建平台设备。
  • 支持SR-IOV。
  • 引入了特征设备基础设施,它抽象了子特征的操作,并将公共功能暴露给特征设备驱动程序。

PCIe 模块设备驱动函数

  • 包含 PCIe 发现、设备枚举和功能发现。
  • 为父设备、FPGA 管理引擎 (FME) 和端口创建 sysfs 目录。
  • 创建平台驱动程序实例,使 Linux 内核加载它们各自的平台模块驱动程序。

FME 平台模块设备驱动程序

  • 电源和热管理、错误报告、性能报告和其他基础设施功能。 您可以通过 FME 驱动程序公开的 sysfs 接口访问这些功能。
  • 部分重新配置。 FME 驱动程序在 PR 子功能初始化期间注册一个 FPGA Manager; 一旦它收到您的 FPGA_FME_PORT_PR ioctl,它就会从 FPGA Manager 调用公共接口函数来完成比特流到给定端口的部分重配置。
  • 用于虚拟化的端口管理。 FME 驱动程序引入了两个 ioctl,FPGA_FME_PORT_RELEASE,它从 PF 中释放给定的端口; 和 FPGA_FME_PORT_ASSIGN,它将端口分配回 PF。 一旦Port从PF中释放出来,就可以通过PCIe驱动提供的SR-IOV接口分配给VF。 有关详细信息,请参阅“FPGA 虚拟化”。

FME 平台模块设备驱动函数

  • 创建 FME 字符设备节点。
  • 创建 FME 系统文件 files 并实现 FME sysfs file 存取器。
  • 实现 FME 专用功能子驱动程序。
  • FME 私有功能子驱动程序:
    • FME头
    • 热管理
    • 电源管理
    • 全局错误
    • 部分重构
    • 全球业绩

端口平台模块设备驱动程序
与 FME 驱动程序类似,一旦创建了端口平台设备,就会探测 FPGA 端口(和 AFU)驱动程序(intel-fpga-afu.ko)。 该模块的主要功能是为用户空间应用程序提供访问各个加速器的接口,包括端口上的基本重置控制、AFU MMIO 区域导出、DMA 缓冲区映射服务、UMsg(1) 通知和远程调试功能(往上看)。

UMsg 仅通过具有集成 FPGA 的英特尔至强® 处理器的加速堆栈受支持。

端口平台模块设备驱动函数

  • 创建端口字符设备节点。
  • 创建端口 sysfs files 并实现端口 sysfs file 存取器。
  • 实现端口专用功能子驱动程序。
  • 端口专用功能子驱动程序:
    • 端口头
    • 安福
    • 端口错误
    • UMsg(2)
    • 信号分路器

应用程序 FPGA 设备枚举
本节介绍应用程序如何从 /sys/class/fpga 下的 sysfs 层次结构中枚举 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)。

枚举数据结构

枚举 fpga_id_type {
父母身份,
FME_ID,
端口号,
FPGA_ID_MAX
};
静态结构 idr fpga_ids[FPGA_ID_MAX];
结构 fpga_chardev_info {
常量字符*名称;
dev_t 开发;
};
结构 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
};
结构 cci_drvdata {
int 设备标识;
结构设备*fme_dev;
结构互斥锁;
struct list_head port_dev_list;
intreleased_port_num;
结构 list_head 区域;
};
结构 build_feature_devs_info {
结构 pci_dev *pdev;
无效 __iomem *ioaddr;
无效 __iomem *ioend;
int 当前栏;
无效 __iomem *pfme_hdr;
结构设备 *parent_dev;
结构平台设备 *feature_dev;
};

枚举流程

  • ccidrv_init()
    • 使用 idr_init() 初始化 fpga_ids。
    • 使用 alloc_chrdev_region() 初始化 fpga_chrdevs[i].devt。
    • 使用 class_create() 初始化 fpga_class。
    • pci_register_driver(&cci_pci_driver);
  • cci_pci_probe()
    • 启用 PCI 设备,请求访问其区域,设置 PCI 主模式,并配置 DMA。
  • cci_pci_create_feature_devs() build_info_alloc_and_init()
    • 分配一个 struct build_feature_devs_info,初始化它。
      .parent_dev 设置为包含 FME 和端口 sysfs 目录的父 sysfs 目录 (intel-fpga-dev.id)。
  • 解析特征列表()
    • 浏览 BAR0 设备功能列表以发现 FME、端口及其私有功能。
  • parse_feature() parse_feature_afus() parse_feature_fme()
    • 当遇到 FME 时:
  • 构建信息创建_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 中分配一个结构资源数组。
  • 分配一个struct feature_platform_data,初始化它,并在feature_dev.dev.platform_data中存储一个指针
    • 创建_feature_instance() 构建_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()
    • 遇到端口时:
  • 构建信息创建_dev()
    • 为Port分配一个平台设备,存放在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 中分配一个 struct resource 数组。
    • 分配一个struct feature_platform_data,初始化它,并在feature_dev.dev.platform_data中存储一个指针
  • 构建信息提交_dev()
    • 将端口的结构 feature_platform_data.node 添加到结构 cci_drvdata.port_dev_list 中的端口列表
  • 创建_feature_instance() 构建_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 时:
  • 创建_feature_instance() 构建_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 私有特征时:
  • 创建_feature_instance() 构建_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()
    • 如果驱动程序加载到物理功能 (PF) 上,则:
  • 在 FME 标头中描述的每个端口上运行 parse_feature_list() 流。
  • 使用标头中每个端口条目中提到的 BAR。

FME 平台设备初始化
本节给出了view 由 intel-fpga-fme.ko 执行的 FME 设备初始化的代码流。 重点介绍了主要的数据结构和功能。 最好遵循本节 view阅读随附的源代码 (fme-main.c)。

FME 平台设备数据结构

结构 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,
无符号整数命令,无符号长参数);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
结构特征{
常量字符*名称;
int 资源索引;
无效 __iomem *ioaddr;
结构 feature_ops *ops;
};
结构 feature_platform_data {
结构列表头节点;
结构互斥锁;
无符号长 dev_status;
结构 cdev cdev;
结构平台设备*开发;
无符号整数禁用计数;
无效*私有;
int 数字;
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];
};
结构性能对象{
内部标识;
const struct attribute_group **attr_groups;
结构设备*fme_dev;
结构列表头节点;
结构 list_head 孩子;
结构对象 kobj;
};
结构 fpga_fme {
u8 端口号;
u64 pr_err;
结构设备 *dev_err;
结构 perf_object *perf_dev;
结构 feature_platform_data *pdata;
};

FME 平台设备初始化流程

FME 初始化流程intel-OPAE-FPGA-Linux-设备驱动程序-架构-图- (4)

  • fme_probe() fme_dev_init()
    • 初始化一个 struct 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)。

端口平台设备数据结构

结构 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,
无符号整数命令,无符号长参数);
int (*test)(struct platform_device *pdev, struct feature *feature);
};
结构特征{
常量字符*名称;
int 资源索引;
无效 __iomem *ioaddr;
结构 feature_ops *ops;
};
结构 feature_platform_data {
结构列表头节点;
结构互斥锁;
无符号长 dev_status;
结构 cdev cdev;
结构平台设备*开发;
无符号整数禁用计数;
无效*私有;
int 数字;
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];
};
结构 fpga_afu_region {
u32指数;
u32 标志;
u64尺寸;
u64偏移量;
u64物理;
结构列表头节点;
};
结构 fpga_afu_dma_region {
u64 用户地址;
u64长度;
u64 约瓦;
结构页面**页面;
结构 rb_node 节点;
布尔使用中;
};
结构 fpga_afu {
u64region_cur_offset;
int num_regions;
u8 num_umsgs;
结构 list_head 区域;
结构 rb_root dma_regions;
结构 feature_platform_data *pdata;
};

端口平台设备初始化流程

端口初始化流程intel-OPAE-FPGA-Linux-设备驱动程序-架构-图- (5)

  • afu_probe() afu_dev_init()
    • 初始化一个 struct 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()
    • 创建端口字符设备节点,注册一个结构体 file_操作。

FME IOCTL
在打开时调用的 IOCTL file /dev/intel-fpga-fme.j FPGA_GET_API_VERSION 的描述符——以整数形式返回当前版本,从 0 开始。

FPGA_CHECK_EXTENSION——目前不支持。

FPGA_FME_PORT_RELEASE—arg 是指向以下内容的指针:

结构 fpga_fme_port_release {
__u32 argsz; // in: sizeof(struct fpga_fme_port_release)
__u32 标志; // in: 必须为 0
__u32 端口号; // in: 要释放的端口 ID(从 0 开始)。
};

FPGA_FME_PORT_ASSIGN—arg 是指向以下内容的指针:

结构 fpga_fme_port_assign {
__u32 argsz; // 输入:sizeof(struct fpga_fme_port_assign)
__u32 标志; // in: 必须为 0
__u32 端口号; // in: 要分配的端口 ID(从 0 开始)。 (一定是
之前由 FPGA_FME_PORT_RELEASE 发布)
};

FPGA_FME_PORT_PR—arg 是指向以下内容的指针:

结构 fpga_fme_port_pr {
__u32 argsz; // 输入:sizeof(struct fpga_fme_port_pr)
__u32 标志; // in: 必须为 0
__u32 端口号; // 输入:端口 ID(从 0 开始)
__u32 缓冲区大小; // in:比特流缓冲区的大小(以字节为单位)。 必须是 4 字节
对齐。
__u64 缓冲区地址; // in: 比特流缓冲区的进程地址
__u64 状态; // 输出:错误状态(位掩码)
};

端口 IOCTL
在打开时调用的 IOCTL file /dev/intel-fpga-port.k 的描述符 FPGA_GET_API_VERSION——以整数形式返回当前版本,从 0 开始。 FPGA_CHECK_EXTENSION——目前不支持。

FPGA_PORT_GET_INFO—arg 是指向以下内容的指针:

结构 fpga_port_info {
__u32 argsz; // 输入:sizeof(struct fpga_port_info)
__u32 标志; // 输出:返回 0
__u32 num_regions; // out: MMIO 区域数,2(1 个用于 AFU,1 个用于
STP)
__u32 num_umsgs; // out: 硬件支持的 UMsg 数量
};

FPGA_PORT_GET_REGION_INFO—arg 是指向以下内容的指针:

结构 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 填充; // in: 必须为 0
__u64 尺寸; // out: MMIO 区域的字节大小
__u64 偏移量; // out: MMIO 区域从设备 fd 开始的偏移量
};

FPGA_PORT_DMA_MAP—arg 是一个指针:
结构 fpga_port_dma_map {
__u32 argsz; // 输入:sizeof(struct fpga_port_dma_map)
__u32 标志; // in: 必须是 0 __u64 user_addr; // in: 虚拟进程
地址。 必须页面对齐。
__u64 长度; // in: 以字节为单位的映射长度。 必须是页数的倍数
尺寸。
__u64 约瓦; // out: IO 虚拟地址 };

FPGA_PORT_DMA_UNMAP—arg 是指向以下内容的指针:
结构 fpga_port_dma_unmap {
__u32 argsz; // in: sizeof(struct fpga_port_dma_unmap)
__u32 标志; // in: 必须为 0
__u64 约瓦; // in: 之前返回的IO虚拟地址
FPGA_PORT_DMA_MAP };

  • FPGA_PORT_RESET—arg 必须为 NULL。
  • FPGA_PORT_UMSG_ENABLE—arg 必须为 NULL。
  • FPGA_PORT_UMSG_DISABLE—args 必须为 NULL。

FPGA_PORT_UMSG_SET_MODE—arg 是指向以下内容的指针:

结构 fpga_port_umsg_cfg {
__u32 argsz; // 输入:sizeof(struct fpga_port_umsg_cfg)
__u32 标志; // in: 必须为 0
__u32 提示位图; // in: UMsg 提示模式位图。 表示哪些 UMsg 是
已启用。
};

FPGA_PORT_UMSG_SET_BASE_ADDR—

  • 发出此 ioctl 之前必须禁用 UMsg。
  • iova 字段必须是一个足够大的缓冲区以容纳所有 UMsg (num_umsgs * PAGE_SIZE)。
    • 缓冲区被驱动程序的缓冲区管理标记为“正在使用”。
    • 如果 iova 为 NULL,则任何先前的区域都不会标记为“正在使用”。
  • arg 是指向 a 的指针:
    结构 fpga_port_umsg_base_addr {
    • u32 argsz; // 输入:sizeof(struct fpga_port_umsg_base_addr)
    • u32 标志; // in: 必须为 0
    • u64 约瓦; // 输入:来自 FPGA_PORT_DMA_MAP 的 IO 虚拟地址。 };

笔记:

  • 要清除端口错误,您必须写入当前错误的确切位掩码,例如ample, cat 错误 > 清除
  • UMsg 仅通过具有集成 FPGA 的英特尔至强处理器的加速堆栈支持。

系统文件系统 Files

FME 标题 sysfs files
英特尔-fpga-dev.i/intel-fpga-fme.j/

系统文件系统 file mmio字段 类型 使用权
端口号 fme_header.capability.num_ports 十进制整数 只读
缓存大小 fme_header.capability.cache_size 十进制整数 只读
版本 fme_header.capability.fabric_verid 十进制整数 只读
套接字编号 fme_header.capability.socket_id 十进制整数 只读
比特流_id fme_header.bitstream_id 十六进制 uint64_t 只读
比特流元数据 fme_header.bitstream_md 十六进制 uint64_t 只读

FME 热管理系统 files
英特尔-fpga-dev.i/英特尔-fpga-fme.j/ Thermal_mgmt/

系统文件系统 file mmio字段 类型 使用权
阈值1 热阈值.tmp_thshold1 十进制整数 用户:只读根:读写
阈值2 热阈值.tmp_thshold2 十进制整数 用户:只读根:读写
阈值_trip 热阈值.therm_trip_thshold 十进制整数 只读
达到阈值 1_reached 热阈值 thshold1_status 十进制整数 只读
达到阈值 2_reached 热阈值 thshold2_status 十进制整数 只读
阈值1_策略 热的。 阈值.thshold_policy 十进制整数 用户:只读根:读写
温度 热.rdsensor_fm1.fpga_temp 十进制整数 只读

FME 电源管理系统 files
英特尔-fpga-dev.i/英特尔-fpga-fme.j/power_mgmt/

系统文件系统 file mmio字段 类型 使用权
消耗 power.status.pwr_consumed 十六进制 uint64_t 只读
阈值1 功率.threshold.threshold1 十六进制 uint64_t 用户:只读根:读写
阈值2 功率.threshold.threshold2 十六进制 uint64_t 用户:只读根:读写
阈值1_状态 power.threshold.threshold1_status 十进制无符号 只读
阈值2_状态 power.threshold.threshold2_status 十进制无符号 只读
右边界 电源状态.fpga_latency_report 十进制无符号 只读

FME 全局错误 sysfs files
英特尔-fpga-dev.i/英特尔-fpga-fme.j/错误/

系统文件系统 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/

系统文件系统 file mmio字段 类型 使用权
错误 错误.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 错误,您必须写入当前错误的确切位掩码,例如amp猫错误 > 清除。

FME 部分重配置 sysfs files
英特尔-fpga-dev.i/intel-fpga-fme.j/pr/

系统文件系统 file mmio字段 类型 使用权
接口ID pr.fme_pr_intfc_id0_h、pr.fme_pre_intfc_id0_l 十六进制 16 字节 只读

FME 全球绩效系统 files
英特尔-fpga-dev.i/英特尔-fpga-fme.j/dperf/时钟

系统文件系统 file mmio字段 类型 使用权
gperf.clk.afu_interf_clock 十六进制 uint64_t 只读

intel-fpga-dev.i/intel-fpga-fme.j/dperf/cache/(对带 FPGA 的英特尔至强 CPU 的加速堆栈无效)

系统文件系统 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 只读
系统文件系统 file mmio字段 类型 使用权
rx_req_stall gperf.CACHE_RX_REQ_STALL 十六进制 uint64_t 只读
数据写入端口争用 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/(对带 FPGA 的英特尔至强 CPU 的加速堆栈无效)

系统文件系统 file mmio字段 类型 使用权
冻结 gperf.vtd_ctl.freeze 十进制整数 用户:只读根:读写

intel-fpga-dev.i/intel-fpga-fme.j/dperf/iommu/afuk/(对带 FPGA 的英特尔至强 CPU 的加速堆栈无效)

系统文件系统 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 只读

英特尔-fpga-dev.i/intel-fpga-fme.j/dperf/fabric/

系统文件系统 file mmio字段 类型 使用权
使能够 gperf.fab_ctl.(启用) 十进制整数 用户:只读根:读写
冻结 gperf.fab_ctl.freeze 十进制整数 用户:只读根:读写
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 只读

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

系统文件系统 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
英特尔-fpga-dev.i/intel-fpga-port.k/

系统文件系统 file mmio字段 类型 使用权
id port_header.capability.port_number 十进制整数 只读
port_header.control.latency_tolerance 十进制整数 只读

端口 AFU 标头 sysfs files
英特尔-fpga-dev.i/intel-fpga-port.k/

系统文件系统 file mmio字段 类型 使用权
afu_id afu_header.guid 十六进制 16 字节 只读

端口错误 sysfs files
英特尔-fpga-dev.i/英特尔-fpga-port.k/错误/

系统文件系统 file mmio字段 类型 使用权
错误 错误.port_error 十六进制 uint64_t 只读
第一个错误 perror.port_first_error 十六进制 uint64_t 只读
第一个格式错误的请求 错误.malreq 十六进制 16 字节 只读
清除 错误。(所有错误) 各种 uint64_t 只写

笔记:
要清除端口错误,您必须写入当前错误的确切位掩码,例如amp猫错误 > 清除。

修订历史

文档版本 更改
2017.10.02 初始版本。

OPAE 英特尔 FPGA Linux 设备驱动架构指南

文件/资源

英特尔 OPAE FPGA Linux 设备驱动架构 [pdf] 用户指南
OPAE FPGA Linux 设备驱动架构, OPAE FPGA, Linux 设备驱动架构, 驱动架构, 架构

参考

发表评论

您的电子邮件地址不会被公开。 必填字段已标记 *