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 核心的狀態和配置

驅動程式結構

該驅動程式提供了一個平臺裝置,其中提供了proberemove操作。

  • probe:使用裝置樹條目更新配置暫存器,並確定核心的當前啟用狀態,例如,核心是否被旁路或核心是否已啟動。

驅動程式定義了以下驅動程式檔案操作以提供使用者應用程式介面

驅動程式使用

概述

開啟驅動程式後,使用者應找出需要執行哪些操作來配置和啟用 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完成的

只有在滿足以下限制的情況下才能設定順序

新增 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 程式碼

設定 Turbo 解碼

配置 Turbo 解碼引數是透過使用 ioctl XSDFEC_SET_TURBO,並使用自動生成的引數填充所需 Turbo 程式碼的struct xsdfec_turbo來完成的。

只有在滿足以下限制的情況下才能新增 Turbo 解碼

啟用中斷

啟用或停用中斷是透過使用 ioctl XSDFEC_SET_IRQ完成的。 傳遞給 ioctl 的引數struct xsdfec_irq的成員用於設定和清除不同類別的中斷。 中斷類別控制如下

  • enable_isr控制tlast中斷

  • enable_ecc_isr控制 ECC 中斷

如果 ioctl XSDFEC_GET_CONFIG填充的struct xsdfec_configcode成員指示 SD-FEC 核心配置為 TURBO,則不需要啟用 ECC 錯誤。

旁路 SD-FEC

旁路 SD-FEC 是透過使用 ioctl XSDFEC_SET_BYPASS完成的

只有在滿足以下限制的情況下才能旁路 SD-FEC

啟動 SD-FEC 核心

透過使用 ioctl XSDFEC_START_DEV啟動 SD-FEC 核心

獲取 SD-FEC 狀態

透過使用 ioctl XSDFEC_GET_STATUS獲取裝置 SD-FEC 狀態,這將填充struct xsdfec_status

監視中斷

如果檢測到需要重置的嚴重錯誤。 應用程式需要在重置後呼叫 ioctl XSDFEC_SET_DEFAULT_CONFIG,並且不需要呼叫 ioctl XSDFEC_STOP_DEV

注意:使用 poll 系統呼叫可以防止使用XSDFEC_GET_STATSXSDFEC_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_1x128b

DIN 資料輸入流由 128 位通道組成

XSDFEC_2x128b

DIN 資料輸入流由兩個 128 位通道組成

XSDFEC_4x128b

DIN 資料輸入流由四個 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 運算元

nm

N 中 M 大小向量的數量

norm_type

是否需要規範化

no_packing

確定是否應執行多個 QC 操作

special_qc

Circulant 權重 > 0 的子矩陣屬性

no_final_parity

確定是否需要執行最終奇偶校驗

max_schedule

實驗程式碼字排程限制

sc_off

SC 偏移量

la_off

LA 偏移量

qc_off

QC 偏移量

sc_table

指向 SC 表的指標,該指標必須頁對齊

la_table

指向 LA 表的指標,該指標必須頁對齊

qc_table

指向 QC 表的指標,該指標必須頁對齊

code_id

LDPC 程式碼

描述

此結構描述了應用程式傳遞給驅動程式的 LDPC 程式碼。

struct xsdfec_status

SD-FEC 核心的狀態。

定義:

struct xsdfec_status {
    __u32 state;
    __s8 activity;
};

成員

state

SD-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;
};

成員

code

SD-FEC 例項使用的程式碼

order

操作順序

din_width

DIN AXI4-Stream 的寬度

din_word_include

如何輸入 DIN_WORDS

dout_width

DOUT 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_count

ISR 錯誤計數

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 表大小