Xilinx SD-FEC 驅動程式¶
概述¶
此驅動程式支援 Zynq Ultrascale+™ RFSoC 的 SD-FEC 整合模組。
有關 SD-FEC 核心功能的完整描述,請參閱SD-FEC 產品指南 (PG256)
此驅動程式支援以下功能
檢索整合模組配置和狀態資訊
LDPC 程式碼配置
Turbo 解碼配置
錯誤監控
SD-FEC 驅動程式的缺失功能、已知問題和限制如下
在任何時候只允許一個開啟的檔案控制代碼指向驅動程式的任何例項
SD-FEC 整合模組的重置不由該驅動程式控制
不支援共享 LDPC 程式碼表迴繞
裝置樹條目描述在:linux-xlnx/Documentation/devicetree/bindings/misc/xlnx,sd-fec.yaml
操作模式¶
該驅動程式在兩種操作模式下與 SD-FEC 核心一起工作
執行時配置
可程式設計邏輯 (PL) 初始化
執行時配置¶
對於執行時配置,驅動程式的作用是允許軟體應用程式執行以下操作
載入 Turbo 解碼或 LDPC 編碼或解碼的配置引數
啟用 SD-FEC 核心
監控 SD-FEC 核心的錯誤
檢索 SD-FEC 核心的狀態和配置
可程式設計邏輯 (PL) 初始化¶
對於 PL 初始化,支援邏輯載入 Turbo 解碼或 LDPC 編碼或解碼的配置引數。 驅動程式的作用是允許軟體應用程式執行以下操作
啟用 SD-FEC 核心
監控 SD-FEC 核心的錯誤
檢索 SD-FEC 核心的狀態和配置
驅動程式結構¶
該驅動程式提供了一個平臺裝置,其中提供了probe和remove操作。
probe:使用裝置樹條目更新配置暫存器,並確定核心的當前啟用狀態,例如,核心是否被旁路或核心是否已啟動。
驅動程式定義了以下驅動程式檔案操作以提供使用者應用程式介面
open:實現了任何時候每個 SD-FEC 例項只能開啟一個檔案描述符的限制
release:允許開啟另一個檔案描述符,即在當前檔案描述符關閉之後
poll:提供了一種監視 SD-FEC 錯誤事件的方法
unlocked_ioctl:提供了以下 ioctl 命令,允許應用程式配置 SD-FEC 核心
驅動程式使用¶
概述¶
開啟驅動程式後,使用者應找出需要執行哪些操作來配置和啟用 SD-FEC 核心,並確定驅動程式的配置。 以下概述了使用者應執行的流程
確定配置
如果尚未按所需方式配置,則設定順序
設定 Turbo 解碼、LPDC 編碼或解碼引數,具體取決於 SD-FEC 核心的配置方式,以及 SD-FEC 是否已配置為 PL 初始化
如果尚未啟用,則啟用中斷
如果需要,旁路 SD-FEC 核心
如果尚未啟動,則啟動 SD-FEC 核心
獲取 SD-FEC 核心狀態
監視中斷
停止 SD-FEC 核心
注意:在監視中斷時,如果檢測到需要重置的嚴重錯誤,則需要驅動程式載入預設配置。
確定配置¶
透過使用 ioctl XSDFEC_GET_CONFIG確定 SD-FEC 核心的配置。
設定順序¶
設定順序決定了塊的順序如何從輸入更改為輸出。
設定順序是透過使用 ioctl XSDFEC_SET_ORDER完成的
只有在滿足以下限制的情況下才能設定順序
ioctl
XSDFEC_GET_STATUS填充的 structxsdfec_status的state成員指示 SD-FEC 核心尚未啟動
新增 LDPC 程式碼¶
以下步驟指示如何將 LDPC 程式碼新增到 SD-FEC 核心
使用自動生成的引數填充所需 LDPC 程式碼的
struct xsdfec_ldpc_params。為 LPDC 引數和結構
struct xsdfec_ldpc_params中的引數設定 SC、QA 和 LA 表偏移量在結構
struct xsdfec_ldpc_params中設定所需的程式碼 ID 值使用 ioctl
XSDFEC_ADD_LDPC_CODE_PARAMS新增 LPDC 程式碼引數對於應用的 LPDC 程式碼引數,使用函式
xsdfec_calculate_shared_ldpc_table_entry_size()計算共享 LPDC 程式碼表的大小。 這允許使用者確定共享表的使用情況,以便在為下一個 LDPC 程式碼引數選擇表偏移量時可以選擇未使用的表區域。為每個 LDPC 程式碼引數重複。
只有在滿足以下限制的情況下才能新增 LDPC 程式碼
ioctl
XSDFEC_GET_CONFIG填充的struct xsdfec_config的code成員指示 SD-FEC 核心配置為 LDPCioctl
XSDFEC_GET_CONFIG填充的struct xsdfec_config的code_wr_protect指示未啟用寫入保護ioctl
XSDFEC_GET_STATUS填充的 structxsdfec_status的state成員指示 SD-FEC 核心尚未啟動
設定 Turbo 解碼¶
配置 Turbo 解碼引數是透過使用 ioctl XSDFEC_SET_TURBO,並使用自動生成的引數填充所需 Turbo 程式碼的struct xsdfec_turbo來完成的。
只有在滿足以下限制的情況下才能新增 Turbo 解碼
ioctl
XSDFEC_GET_CONFIG填充的struct xsdfec_config的code成員指示 SD-FEC 核心配置為 TURBOioctl
XSDFEC_GET_STATUS填充的 structxsdfec_status的state成員指示 SD-FEC 核心尚未啟動
啟用中斷¶
啟用或停用中斷是透過使用 ioctl XSDFEC_SET_IRQ完成的。 傳遞給 ioctl 的引數struct xsdfec_irq的成員用於設定和清除不同類別的中斷。 中斷類別控制如下
enable_isr控制tlast中斷
enable_ecc_isr控制 ECC 中斷
如果 ioctl XSDFEC_GET_CONFIG填充的struct xsdfec_config的code成員指示 SD-FEC 核心配置為 TURBO,則不需要啟用 ECC 錯誤。
旁路 SD-FEC¶
旁路 SD-FEC 是透過使用 ioctl XSDFEC_SET_BYPASS完成的
只有在滿足以下限制的情況下才能旁路 SD-FEC
ioctl
XSDFEC_GET_STATUS填充的struct xsdfec_status的state成員指示 SD-FEC 核心尚未啟動
啟動 SD-FEC 核心¶
透過使用 ioctl XSDFEC_START_DEV啟動 SD-FEC 核心
獲取 SD-FEC 狀態¶
透過使用 ioctl XSDFEC_GET_STATUS獲取裝置 SD-FEC 狀態,這將填充struct xsdfec_status
監視中斷¶
使用 poll 系統呼叫來監視中斷。 poll 系統呼叫等待中斷喚醒它,或者如果沒有發生中斷則超時。
- 返回時,Poll
revents將指示 stats 和/或 state 是否已更新
POLLPRI指示嚴重錯誤,使用者應使用XSDFEC_GET_STATUS和XSDFEC_GET_STATS進行確認
POLLRDNORM指示發生了非嚴重錯誤,使用者應使用XSDFEC_GET_STATS進行確認
- 透過使用 ioctl
XSDFEC_GET_STATS獲取 stats
對於嚴重錯誤,
struct xsdfec_stats的isr_err_count或uecc_count成員不為零對於非嚴重錯誤,
struct xsdfec_stats的cecc_count成員不為零
- 透過使用 ioctl
XSDFEC_GET_STATUS獲取 state
對於嚴重錯誤,
xsdfec_status的state將指示需要重置透過使用 ioctl
XSDFEC_CLEAR_STATS清除 stats
如果檢測到需要重置的嚴重錯誤。 應用程式需要在重置後呼叫 ioctl XSDFEC_SET_DEFAULT_CONFIG,並且不需要呼叫 ioctl XSDFEC_STOP_DEV
注意:使用 poll 系統呼叫可以防止使用XSDFEC_GET_STATS和XSDFEC_GET_STATUS進行繁忙迴圈
停止 SD-FEC 核心¶
透過使用 ioctl XSDFEC_STOP_DEV停止裝置
設定預設配置¶
透過使用 ioctl XSDFEC_SET_DEFAULT_CONFIG載入預設配置以恢復驅動程式。
限制¶
使用者不應重複 SD-FEC 裝置檔案控制代碼,例如 fork() 或 dup() 具有已建立 SD-FEC 檔案控制代碼的程序。
驅動程式 IOCTL¶
-
XSDFEC_START_DEV¶
描述
ioctl 以啟動 SD-FEC 核心
如果之前未呼叫 XSDFEC_SET_ORDER ioctl,則此操作將失敗
-
XSDFEC_STOP_DEV¶
描述
ioctl 以停止 SD-FEC 核心
-
XSDFEC_GET_STATUS¶
描述
ioctl,返回 SD-FEC 核心的狀態
-
XSDFEC_SET_IRQ¶
引數
- struct xsdfec_irq *
指向
struct xsdfec_irq的指標,其中包含 SD-FEC 核心的中斷設定
描述
ioctl 以啟用或停用 irq
-
XSDFEC_SET_TURBO¶
引數
- struct xsdfec_turbo *
指向
struct xsdfec_turbo的指標,其中包含 SD-FEC 核心的 Turbo 解碼設定
描述
ioctl,設定 SD-FEC Turbo 引數值
這隻能在驅動程式處於 XSDFEC_STOPPED 狀態時使用
-
XSDFEC_ADD_LDPC_CODE_PARAMS¶
引數
- struct xsdfec_ldpc_params *
指向
struct xsdfec_ldpc_params的指標,其中包含要新增到 SD-FEC 塊的 LDPC 程式碼引數
描述 ioctl,用於將 LDPC 程式碼新增到 SD-FEC LDPC 程式碼
這隻能在以下情況下使用
驅動程式處於 XSDFEC_STOPPED 狀態
SD-FEC 核心配置為 LPDC
SD-FEC 程式碼寫入保護已停用
-
XSDFEC_GET_CONFIG¶
引數
- struct xsdfec_config *
指向
struct xsdfec_config的指標,其中包含 SD-FEC 塊的當前配置設定
描述
ioctl,返回 SD-FEC 核心配置
-
XSDFEC_SET_ORDER¶
引數
- struct unsigned long *
指向 unsigned long 的指標,其中包含來自 enum xsdfec_order 的值
描述
ioctl,用於設定順序,如果塊的順序可以從輸入更改為輸出
這隻能在驅動程式處於 XSDFEC_STOPPED 狀態時使用
-
XSDFEC_SET_BYPASS¶
引數
- struct bool *
指向 bool 的指標,用於設定旁路值,其中 false 會導致正常操作,而 false 會導致 SD-FEC 執行配置的操作(相同數量的週期),但輸出資料與輸入資料匹配
描述
ioctl,用於設定旁路。
這隻能在驅動程式處於 XSDFEC_STOPPED 狀態時使用
-
XSDFEC_IS_ACTIVE¶
引數
- struct bool *
指向 bool 的指標,如果 SD-FEC 正在處理資料,則返回 true
描述
ioctl,用於確定 SD-FEC 是否正在處理資料
-
XSDFEC_CLEAR_STATS¶
描述
ioctl,用於清除中斷期間收集的錯誤統計資訊
-
XSDFEC_GET_STATS¶
引數
- struct xsdfec_stats *
指向
struct xsdfec_stats的指標,其中將包含更新的 stats 值
描述
ioctl,返回 SD-FEC 核心 stats
這隻能在驅動程式處於 XSDFEC_STOPPED 狀態時使用
-
XSDFEC_SET_DEFAULT_CONFIG¶
描述
ioctl,用於將 SD-FEC 核心返回到預設配置,在重置後使用
這隻能在驅動程式處於 XSDFEC_STOPPED 狀態時使用
驅動程式型別定義¶
-
enum xsdfec_code¶
程式碼型別。
常量
XSDFEC_TURBO_CODE驅動程式配置為 Turbo 模式。
XSDFEC_LDPC_CODE驅動程式配置為 LDPC 模式。
描述
此列舉用於指示驅動程式的模式。 該模式透過檢查驅動程式中設定了哪些程式碼來確定。 請注意,模式無法由驅動程式更改。
-
enum xsdfec_order¶
順序
常量
XSDFEC_MAINTAIN_ORDER保持塊的順序執行。
XSDFEC_OUT_OF_ORDER塊的亂序執行。
描述
此列舉用於指示塊的順序是否可以從輸入更改為輸出。
-
enum xsdfec_turbo_alg¶
Turbo 演算法型別。
常量
XSDFEC_MAX_SCALE具有外在縮放的最大對數對映演算法。 當縮放設定為此值時,等效於最大對數對映演算法。
XSDFEC_MAX_STAR對數對映演算法。
XSDFEC_TURBO_ALG_MAX用於指示越界 Turbo 演算法。
描述
此列舉指定正在使用的 Turbo 解碼演算法。
-
enum xsdfec_state¶
狀態。
常量
XSDFEC_INIT驅動程式已初始化。
XSDFEC_STARTED驅動程式已啟動。
XSDFEC_STOPPED驅動程式已停止。
XSDFEC_NEEDS_RESET驅動程式需要重置。
XSDFEC_PL_RECONFIGURE可程式設計邏輯需要重新配置。
描述
此列舉用於指示驅動程式的狀態。
-
enum xsdfec_axis_width¶
AXIS_WIDTH.DIN 128 位寬度的設定。
常量
XSDFEC_1x128bDIN 資料輸入流由 128 位通道組成
XSDFEC_2x128bDIN 資料輸入流由兩個 128 位通道組成
XSDFEC_4x128bDIN 資料輸入流由四個 128 位通道組成
描述
此列舉用於指示 128 位寬度的 AXIS_WIDTH.DIN 設定。 DIN 資料輸入流的通道數取決於 AXIS_WIDTH.DIN 引數。
-
enum xsdfec_axis_word_include¶
字配置。
常量
XSDFEC_FIXED_VALUE固定,DIN_WORDS AXI4-Stream 介面從 IP 例項中刪除,並由指定的字數驅動。
XSDFEC_IN_BLOCK在塊中,將 IP 例項配置為期望每個輸入程式碼塊一個 DIN_WORDS 值。 DIN_WORDS 介面存在。
XSDFEC_PER_AXI_TRANSACTION每個事務,將 IP 例項配置為期望每個 DIN 介面上的輸入事務一個 DIN_WORDS 值。 DIN_WORDS 介面存在。
XSDFEC_AXIS_WORDS_INCLUDE_MAX用於指示越界字配置。
描述
此列舉用於指定 DIN_WORDS 配置。
-
struct xsdfec_turbo¶
Turbo 程式碼的使用者資料。
定義:
struct xsdfec_turbo {
__u32 alg;
__u8 scale;
};
成員
alg指定要使用的 Turbo 解碼演算法
scale指定在選擇最大比例演算法時要應用的外在縮放
描述
Turbo 程式碼結構,用於將引數傳遞到 XSDFEC 驅動程式。
-
struct xsdfec_ldpc_params¶
LDPC 程式碼的使用者資料。
定義:
struct xsdfec_ldpc_params {
__u32 n;
__u32 k;
__u32 psize;
__u32 nlayers;
__u32 nqc;
__u32 nmqc;
__u32 nm;
__u32 norm_type;
__u32 no_packing;
__u32 special_qc;
__u32 no_final_parity;
__u32 max_schedule;
__u32 sc_off;
__u32 la_off;
__u32 qc_off;
__u32 *sc_table;
__u32 *la_table;
__u32 *qc_table;
__u16 code_id;
};
成員
n程式碼字位數
k資訊位數
psize子矩陣的大小
nlayers程式碼中的層數
nqc準迴圈數
nmqc奇偶校驗矩陣中 M 大小的 QC 運算元
nmN 中 M 大小向量的數量
norm_type是否需要規範化
no_packing確定是否應執行多個 QC 操作
special_qcCirculant 權重 > 0 的子矩陣屬性
no_final_parity確定是否需要執行最終奇偶校驗
max_schedule實驗程式碼字排程限制
sc_offSC 偏移量
la_offLA 偏移量
qc_offQC 偏移量
sc_table指向 SC 表的指標,該指標必須頁對齊
la_table指向 LA 表的指標,該指標必須頁對齊
qc_table指向 QC 表的指標,該指標必須頁對齊
code_idLDPC 程式碼
描述
此結構描述了應用程式傳遞給驅動程式的 LDPC 程式碼。
-
struct xsdfec_status¶
SD-FEC 核心的狀態。
定義:
struct xsdfec_status {
__u32 state;
__s8 activity;
};
成員
stateSD-FEC 核心的狀態
activity描述 SD-FEC 例項是否處於活動狀態
-
struct xsdfec_irq¶
啟用或停用中斷。
定義:
struct xsdfec_irq {
__s8 enable_isr;
__s8 enable_ecc_isr;
};
成員
enable_isr如果為 true,則啟用 ISR
enable_ecc_isr如果為 true,則啟用 ECC ISR
-
struct xsdfec_config¶
SD-FEC 核心的配置。
定義:
struct xsdfec_config {
__u32 code;
__u32 order;
__u32 din_width;
__u32 din_word_include;
__u32 dout_width;
__u32 dout_word_include;
struct xsdfec_irq irq;
__s8 bypass;
__s8 code_wr_protect;
};
成員
codeSD-FEC 例項使用的程式碼
order操作順序
din_widthDIN AXI4-Stream 的寬度
din_word_include如何輸入 DIN_WORDS
dout_widthDOUT AXI4-Stream 的寬度
dout_word_include如何輸出 DOUT_WORDS
irq啟用或停用中斷
bypass核心是否被旁路
code_wr_protect是否啟用了 LDPC 程式碼的寫入保護
-
struct xsdfec_stats¶
由 ioctl XSDFEC_GET_STATS 檢索的 Stats。 用於緩衝來自 struct xsdfec_dev 的 atomic_t 變數。 計數會累積,直到使用者清除它們。
定義:
struct xsdfec_stats {
__u32 isr_err_count;
__u32 cecc_count;
__u32 uecc_count;
};
成員
isr_err_countISR 錯誤計數
cecc_count可糾正 ECC 錯誤 (SBE) 計數
uecc_count不可糾正 ECC 錯誤 (MBE) 計數
-
struct xsdfec_ldpc_param_table_sizes¶
用於儲存單個 LPDC 程式碼引數的 SD-FEC 表條目的大小。
定義:
struct xsdfec_ldpc_param_table_sizes {
__u32 sc_size;
__u32 la_size;
__u32 qc_size;
};
成員
sc_size使用的 SC 表大小
la_size使用的 LA 表大小
qc_size使用的 QC 表大小