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 核心需要执行哪些操作,并确定驱动程序的配置。以下概述了用户应执行的流程
确定配置
设置顺序,如果尚未按需配置
根据 SD-FEC 核心的配置方式以及 SD-FEC 是否已为 PL 初始化配置,设置 Turbo 解码、LPDC 编码或解码参数
启用中断(如果尚未启用)
如果需要,旁路 SD-FEC 核心
启动 SD-FEC 核心(如果尚未启动)
获取 SD-FEC 核心状态
监控中断
停止 SD-FEC 核心
注意:在监控中断时,如果检测到需要重置的严重错误,则需要驱动程序加载默认配置。
确定配置¶
使用 ioctl XSDFEC_GET_CONFIG
确定 SD-FEC 核心的配置。
设置顺序¶
设置顺序决定了模块的顺序如何从输入更改为输出。
设置顺序是通过使用 ioctl XSDFEC_SET_ORDER
完成的
只有在满足以下限制时才能设置顺序
ioctl
XSDFEC_GET_STATUS
填充的结构体xsdfec_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
填充的结构体xsdfec_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
填充的结构体xsdfec_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¶
通过使用 ioctl XSDFEC_SET_BYPASS
来旁路 SD-FEC。
只有满足以下限制条件时才能旁路 SD-FEC
通过 ioctl
XSDFEC_GET_STATUS
填充的struct xsdfec_status
的state
成员指示 SD-FEC 核尚未启动 (STARTED)。
启动 SD-FEC 核¶
通过使用 ioctl XSDFEC_START_DEV
来启动 SD-FEC 核。
获取 SD-FEC 状态¶
通过使用 ioctl XSDFEC_GET_STATUS
获取设备的 SD-FEC 状态,这将填充 struct xsdfec_status
。
监视中断¶
使用 poll 系统调用来监视中断。poll 系统调用会等待中断唤醒它,如果没有发生中断则会超时。
- 返回时,Poll 的
revents
将指示统计信息和/或状态是否已更新。
POLLPRI
表示发生了严重错误,用户应使用XSDFEC_GET_STATUS
和XSDFEC_GET_STATS
来确认。
POLLRDNORM
表示发生了非严重错误,用户应使用XSDFEC_GET_STATS
来确认。
- 通过使用 ioctl
XSDFEC_GET_STATS
来获取统计信息。
对于严重错误,
struct xsdfec_stats
的isr_err_count
或uecc_count
成员为非零值。对于非严重错误,
struct xsdfec_stats
的cecc_count
成员为非零值。
- 通过使用 ioctl
XSDFEC_GET_STATUS
来获取状态。
对于严重错误,
xsdfec_status
的state
将指示需要重置。通过使用 ioctl
XSDFEC_CLEAR_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¶
描述
用于启动 SD-FEC 核的 ioctl
如果之前没有调用 XSDFEC_SET_ORDER ioctl,则此操作会失败
-
XSDFEC_STOP_DEV¶
描述
用于停止 SD-FEC 核的 ioctl
-
XSDFEC_GET_STATUS¶
描述
返回 SD-FEC 核状态的 ioctl
-
XSDFEC_SET_IRQ¶
参数
- struct xsdfec_irq *
指向
struct xsdfec_irq
的指针,其中包含 SD-FEC 核的中断设置
描述
用于启用或禁用 irq 的 ioctl
-
XSDFEC_SET_TURBO¶
参数
- struct xsdfec_turbo *
指向
struct xsdfec_turbo
的指针,其中包含 SD-FEC 核的 Turbo 解码设置
描述
设置 SD-FEC Turbo 参数值的 ioctl
只有在驱动程序处于 XSDFEC_STOPPED 状态时才能使用此操作
-
XSDFEC_ADD_LDPC_CODE_PARAMS¶
参数
- struct xsdfec_ldpc_params *
指向
struct xsdfec_ldpc_params
的指针,其中包含要添加到 SD-FEC 块的 LDPC 代码参数
描述 用于将 LDPC 代码添加到 SD-FEC LDPC 代码的 ioctl
只有在以下情况下才能使用此操作
驱动程序处于 XSDFEC_STOPPED 状态
SD-FEC 核配置为 LPDC
SD-FEC 代码写入保护已禁用
-
XSDFEC_GET_CONFIG¶
参数
- struct xsdfec_config *
指向
struct xsdfec_config
的指针,其中包含 SD-FEC 块的当前配置设置
描述
返回 SD-FEC 核配置的 ioctl
-
XSDFEC_SET_ORDER¶
参数
- struct unsigned long *
指向 unsigned long 的指针,其中包含来自 enum xsdfec_order 的值
描述
用于设置顺序的 ioctl,如果块的顺序可以从输入更改为输出
只有在驱动程序处于 XSDFEC_STOPPED 状态时才能使用此操作
-
XSDFEC_SET_BYPASS¶
参数
- struct bool *
指向布尔值的指针,用于设置旁路值,其中 false 导致正常操作,而 true 导致 SD-FEC 执行配置的操作(相同的周期数),但输出数据与输入数据匹配
描述
用于设置旁路的 ioctl。
只有在驱动程序处于 XSDFEC_STOPPED 状态时才能使用此操作
-
XSDFEC_IS_ACTIVE¶
参数
- struct bool *
指向布尔值的指针,如果 SD-FEC 正在处理数据,则返回 true
描述
用于确定 SD-FEC 是否正在处理数据的 ioctl
-
XSDFEC_CLEAR_STATS¶
描述
用于清除中断期间收集的错误统计信息的 ioctl
-
XSDFEC_GET_STATS¶
参数
- struct xsdfec_stats *
指向
struct xsdfec_stats
的指针,其中将包含更新的统计信息值
描述
返回 SD-FEC 核统计信息的 ioctl
只有在驱动程序处于 XSDFEC_STOPPED 状态时才能使用此操作
-
XSDFEC_SET_DEFAULT_CONFIG¶
描述
用于将 SD-FEC 核恢复为默认配置的 ioctl,在重置后使用
只有在驱动程序处于 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
具有外在缩放的最大 Log-Map 算法。当缩放设置为此时,等同于最大 Log-Map 算法。
XSDFEC_MAX_STAR
Log-Map 算法。
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。128 位宽的 DIN 设置。
常量
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
循环权重 > 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 检索的统计信息。用于缓冲结构 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 表的大小