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¶
struct fpga_region
- FPGA 区域结构struct fpga_region_info
-__fpga_region_register_full()
的参数结构__fpga_region_register_full()
- 使用 fpga_region_info 结构创建和注册 FPGA 区域,以提供选项的完整灵活性__fpga_region_register()
- 使用标准参数创建和注册 FPGA 区域fpga_region_unregister()
- 注销 FPGA 区域
辅助宏 fpga_region_register()
和 fpga_region_register_full()
自动将注册 FPGA 区域的模块设置为所有者。
FPGA 区域的 probe 函数需要获取对其将用于进行编程的 FPGA 管理器的引用。这通常会在区域的 probe 函数期间发生。
fpga_mgr_get()
- 获取对 FPGA 管理器的引用,提高引用计数of_fpga_mgr_get()
- 给定设备节点,获取对 FPGA 管理器的引用,提高引用计数。fpga_mgr_put()
- 放置 FPGA 管理器
FPGA 区域需要指定在编程 FPGA 时要控制的桥。区域驱动程序可以在 probe 时间构建桥列表(fpga_region->bridge_list),或者它可以具有一个函数,该函数在编程之前立即创建要编程的桥列表(fpga_region->get_bridges)。FPGA 桥框架提供以下 API 来处理构建或拆卸该列表。
fpga_bridge_get_to_list()
- 获取 FPGA 桥的引用,将其添加到列表中of_fpga_bridge_get_to_list()
- 给定设备节点,获取 FPGA 桥的引用,将其添加到列表中fpga_bridges_put()
- 给定桥列表,放置它们
-
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_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() 函数可用于需要传递额外的可选参数的用户。
返回值
-
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 fpga_manager *of_fpga_mgr_get(struct device_node *node)¶
给定一个设备节点,获取对 fpga mgr 的引用。
-
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 桥列表
描述
对于列表中的每个桥,放置该桥并从列表中删除它。如果列表为空,则不执行任何操作。