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);
};
成員
devFPGA 區域裝置
mutex強制對區域的獨佔引用
bridge_list區域中指定的 FPGA 橋列表
mgrFPGA 管理器
infoFPGA 映象資訊
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);
};
成員
mgrfpga 區域管理器
compat_id用於相容性檢查的 FPGA 區域 ID。
privfpga 區域私有資料
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 *infoFPGA 區域的引數
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 *regionFPGA 區域
描述
此函式旨在用於 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 *mgrfpga 管理器結構
-
int fpga_bridge_get_to_list(struct device *dev, struct fpga_image_info *info, struct list_head *bridge_list)¶
給定裝置,獲取一個橋,將其新增到列表中
引數
struct device *devFPGA 橋裝置
struct fpga_image_info *infofpga 映象特定資訊
struct list_head *bridge_listFPGA 橋列表
描述
獲取對橋的獨佔引用並將其新增到列表中。
返回值
成功返回 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 *npFPGA 橋的節點指標
struct fpga_image_info *infofpga 映象特定資訊
struct list_head *bridge_listFPGA 橋列表
描述
獲取對橋的獨佔引用並將其新增到列表中。
返回值
成功返回 0,否則返回 of_fpga_bridge_get() 的錯誤程式碼。
-
void fpga_bridges_put(struct list_head *bridge_list)¶
放置橋
引數
struct list_head *bridge_listFPGA 橋列表
描述
對於列表中的每個橋,放置該橋並從列表中刪除它。如果列表為空,則不執行任何操作。