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 区域的探测函数需要获取对其将用于编程的 FPGA 管理器的引用。这通常会在区域的探测函数期间发生。
fpga_mgr_get()
- 获取 FPGA 管理器的引用,增加引用计数of_fpga_mgr_get()
- 获取 FPGA 管理器的引用,增加引用计数,给定设备节点。fpga_mgr_put()
- 释放 FPGA 管理器
FPGA 区域将需要指定在编程 FPGA 时要控制哪些桥接器。区域驱动程序可以在探测期间构建桥接器列表(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 桥接列表
描述
对于列表中的每个桥,释放桥并将其从列表中删除。如果列表为空,则不执行任何操作。