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 核心需要执行哪些操作,并确定驱动程序的配置。以下概述了用户应执行的流程

  • 确定配置

  • 设置顺序,如果尚未按需配置

  • 根据 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 完成的

只有在满足以下限制时才能设置顺序

添加 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

通过使用 ioctl XSDFEC_SET_BYPASS 来旁路 SD-FEC。

只有满足以下限制条件时才能旁路 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 将指示统计信息和/或状态是否已更新。
  • 通过使用 ioctl XSDFEC_GET_STATS 来获取统计信息。
  • 通过使用 ioctl XSDFEC_GET_STATUS 来获取状态。
    • 对于严重错误,xsdfec_statusstate 将指示需要重置。

  • 通过使用 ioctl XSDFEC_CLEAR_STATS 来清除统计信息。

如果检测到需要重置的严重错误。应用程序需要在重置后调用 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

描述

用于启动 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 表的大小