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 区域的探测函数需要获取对其将用于编程的 FPGA 管理器的引用。这通常会在区域的探测函数期间发生。

FPGA 区域将需要指定在编程 FPGA 时要控制哪些桥接器。区域驱动程序可以在探测期间构建桥接器列表(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 桥接列表

描述

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