FPGA 区域

概述

本文档旨在简要概述 FPGA 区域 API 的用法。有关区域的更概念性的观察,请参见设备树绑定文档 [1]

为了本文档的目的,我们假设一个区域将 FPGA 管理器和一个或多个桥与 FPGA 的可重编程区域或整个 FPGA 相关联。该 API 提供了一种注册区域和编程区域的方法。

目前,内核中 fpga-region.c 之上的唯一层是 [1] 中描述的设备树支持 (of-fpga-region.c)。DT 支持层使用区域来编程 FPGA,然后使用 DT 来处理枚举。通用区域代码旨在被其他方案使用,这些方案在编程后有其他方式来实现枚举。

可以设置 fpga-region 以了解以下内容

  • 要使用哪个 FPGA 管理器进行编程

  • 在编程之前禁用哪些桥,之后启用哪些桥。

编程 FPGA 镜像所需的其他信息在 struct fpga_image_info 中传递,包括

  • 指向镜像的指针,可以是散点收集缓冲区、连续缓冲区或固件文件的名称

  • 指示特定信息的标志,例如镜像是否用于部分重新配置。

如何添加新的 FPGA 区域

用法的示例可以在 [2] 的 probe 函数中看到。

添加新 FPGA 区域的 API

辅助宏 fpga_region_register()fpga_region_register_full() 自动将注册 FPGA 区域的模块设置为所有者。

FPGA 区域的 probe 函数需要获取对其将用于进行编程的 FPGA 管理器的引用。这通常会在区域的 probe 函数期间发生。

FPGA 区域需要指定在编程 FPGA 时要控制的桥。区域驱动程序可以在 probe 时间构建桥列表(fpga_region->bridge_list),或者它可以具有一个函数,该函数在编程之前立即创建要编程的桥列表(fpga_region->get_bridges)。FPGA 桥框架提供以下 API 来处理构建或拆卸该列表。

struct fpga_region

FPGA 区域结构

定义:

struct fpga_region {
    struct device dev;
    struct mutex mutex;
    struct list_head bridge_list;
    struct fpga_manager *mgr;
    struct fpga_image_info *info;
    struct fpga_compat_id *compat_id;
    struct module *ops_owner;
    void *priv;
    int (*get_bridges)(struct fpga_region *region);
};

成员

dev

FPGA 区域设备

mutex

强制对区域的独占引用

bridge_list

区域中指定的 FPGA 桥列表

mgr

FPGA 管理器

info

FPGA 镜像信息

compat_id

用于兼容性检查的 FPGA 区域 ID。

ops_owner

包含 get_bridges 函数的模块

priv

私有数据

get_bridges

可选函数,用于获取桥的列表

struct fpga_region_info

FPGA 区域的参数集合

定义:

struct fpga_region_info {
    struct fpga_manager *mgr;
    struct fpga_compat_id *compat_id;
    void *priv;
    int (*get_bridges)(struct fpga_region *region);
};

成员

mgr

fpga 区域管理器

compat_id

用于兼容性检查的 FPGA 区域 ID。

priv

fpga 区域私有数据

get_bridges

可选函数,用于获取桥的列表

描述

fpga_region_info 包含 register_full 函数的参数。这些参数被分成一个 info 结构,因为它们中的一些是可选的,而另一些可以在将来添加。info 结构有助于维护稳定的 API。

struct fpga_region *__fpga_region_register_full(struct device *parent, const struct fpga_region_info *info, struct module *owner)

创建并注册 FPGA 区域设备

参数

struct device *parent

设备父对象

const struct fpga_region_info *info

FPGA 区域的参数

struct module *owner

包含 get_bridges 函数的模块

返回值

struct fpga_regionERR_PTR()

struct fpga_region *__fpga_region_register(struct device *parent, struct fpga_manager *mgr, int (*get_bridges)(struct fpga_region*), struct module *owner)

创建并注册 FPGA 区域设备

参数

struct device *parent

设备父对象

struct fpga_manager *mgr

编程此区域的管理器

int (*get_bridges)(struct fpga_region *)

可选函数,用于获取桥的列表

struct module *owner

包含 get_bridges 函数的模块

描述

对于大多数用户来说,此注册函数的简单版本应该足够了。fpga_region_register_full() 函数可用于需要传递额外的可选参数的用户。

返回值

struct fpga_regionERR_PTR()

void fpga_region_unregister(struct fpga_region *region)

注销 FPGA 区域

参数

struct fpga_region *region

FPGA 区域

描述

此函数旨在用于 FPGA 区域驱动程序的 remove 函数中。

struct fpga_manager *fpga_mgr_get(struct device *dev)

给定一个设备,获取对 fpga mgr 的引用。

参数

struct device *dev

注册 fpga mgr 的父设备

返回值

fpga 管理器结构或包含错误代码的 IS_ERR() 条件。

struct fpga_manager *of_fpga_mgr_get(struct device_node *node)

给定一个设备节点,获取对 fpga mgr 的引用。

参数

struct device_node *node

设备节点

返回值

fpga 管理器结构或包含错误代码的 IS_ERR() 条件。

void fpga_mgr_put(struct fpga_manager *mgr)

释放对 fpga 管理器的引用

参数

struct fpga_manager *mgr

fpga 管理器结构

int fpga_bridge_get_to_list(struct device *dev, struct fpga_image_info *info, struct list_head *bridge_list)

给定设备,获取一个桥,将其添加到列表中

参数

struct device *dev

FPGA 桥设备

struct fpga_image_info *info

fpga 镜像特定信息

struct list_head *bridge_list

FPGA 桥列表

描述

获取对桥的独占引用并将其添加到列表中。

返回值

成功返回 0,否则返回 fpga_bridge_get() 的错误代码。

int of_fpga_bridge_get_to_list(struct device_node *np, struct fpga_image_info *info, struct list_head *bridge_list)

获取一个桥,将其添加到列表中

参数

struct device_node *np

FPGA 桥的节点指针

struct fpga_image_info *info

fpga 镜像特定信息

struct list_head *bridge_list

FPGA 桥列表

描述

获取对桥的独占引用并将其添加到列表中。

返回值

成功返回 0,否则返回 of_fpga_bridge_get() 的错误代码。

void fpga_bridges_put(struct list_head *bridge_list)

放置桥

参数

struct list_head *bridge_list

FPGA 桥列表

描述

对于列表中的每个桥,放置该桥并从列表中删除它。如果列表为空,则不执行任何操作。