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 橋列表

描述

對於列表中的每個橋,放置該橋並從列表中刪除它。如果列表為空,則不執行任何操作。