Xilinx ZynqMP Ultrascale+ DisplayPort 子系统

此子系统处理 ZynqMP 上的 DisplayPort 视频和音频输出。它支持使用 DisplayPort DMA 控制器 (xilinx-dpdma) 的内存帧缓冲区,以及来自可编程逻辑 (PL) 的“实时”视频和音频。此子系统可以执行多种转换,包括颜色空间转换、Alpha 混合和音频混合,但并非所有功能当前都受支持。

debugfs

为了支持调试和合规性测试,可以通过 debugfs 启用多种测试模式。以下位于 /sys/kernel/debug/dri/X/DP-1/test/ 中的文件控制 DisplayPort 测试模式

active

向此文件写入 1 将激活测试模式,写入 0 将停用测试模式。当测试模式已激活/停用时写入 1 或 0 将重新激活/重新停用测试模式。当测试模式处于非活动状态时,对其他文件所做的更改将不会有(立即)影响,但这些设置将保存起来,以便在激活测试模式时使用。当测试模式处于活动状态时,对其他文件所做的更改将立即生效。

custom

自定义测试图案值

downspread

通过写入 1/0 启用/禁用时钟降频(扩频时钟)

enhanced

启用/禁用增强帧

ignore_aux_errors

设置为 1 时忽略 AUX 错误。写入此文件会立即生效(无论测试模式是否处于活动状态),并影响所有 AUX 传输。

ignore_hpd

设置为 1 时忽略热插拔事件(例如电缆移除或显示器链路重新训练请求)。写入此文件会立即生效(无论测试模式是否处于活动状态)。

laneX_preemphasis

通道 X 的预加重,从 0(最低)到 2(最高)

laneX_swing

通道 X 的电压摆幅,从 0(最低)到 3(最高)

lanes

要使用的通道数(1、2 或 4)

pattern

测试图案。可以是以下之一

video

使用常规视频输入

symbol-error

符号错误测量图案

prbs7

PRBS7 (x^7 + x^6 + 1) 多项式的输出

80bit-custom

一个自定义的 80 位图案

cp2520

HBR2 合规眼图

tps1

链路训练符号图案 TPS1 (/D10.2/)

tps2

链路训练符号图案 TPS2

tps3

链路训练符号图案 TPS3(用于 HBR2)

rate

速率,以赫兹为单位。以下之一

  • 5400000000 (HBR2)

  • 2700000000 (HBR)

  • 1620000000 (RBR)

您可以使用以下命令转储 displayport 测试设置

for prop in /sys/kernel/debug/dri/1/DP-1/test/*; do
        printf '%-17s ' ${prop##*/}
        if [ ${prop##*/} = custom ]; then
                hexdump -C $prop | head -1
        else
                cat $prop
        fi
done

输出可能如下所示

active            1
custom            00000000  00 00 00 00 00 00 00 00  00 00                    |..........|
downspread        0
enhanced          1
ignore_aux_errors 1
ignore_hpd        1
lane0_preemphasis 0
lane0_swing       3
lane1_preemphasis 0
lane1_swing       3
lanes             2
pattern           prbs7
rate              1620000000

建议的测试步骤是将电路板连接到显示器,配置测试模式,激活测试模式,然后断开电缆并将其连接到您选择的测试设备。例如,一个命令序列可以是

echo 1 > /sys/kernel/debug/dri/1/DP-1/test/enhanced
echo tps1 > /sys/kernel/debug/dri/1/DP-1/test/pattern
echo 1620000000 > /sys/kernel/debug/dri/1/DP-1/test/rate
echo 1 > /sys/kernel/debug/dri/1/DP-1/test/ignore_aux_errors
echo 1 > /sys/kernel/debug/dri/1/DP-1/test/ignore_hpd
echo 1 > /sys/kernel/debug/dri/1/DP-1/test/active

此时可以将电缆从显示器上断开。

内部结构

enum zynqmp_dpsub_layer_id

图层标识符

常量

ZYNQMP_DPSUB_LAYER_VID

视频层

ZYNQMP_DPSUB_LAYER_GFX

图形层

struct zynqmp_dpsub

ZynqMP DisplayPort 子系统

定义:

struct zynqmp_dpsub {
    struct device *dev;
    struct clk *apb_clk;
    struct clk *vid_clk;
    bool vid_clk_from_ps;
    struct clk *aud_clk;
    bool aud_clk_from_ps;
    unsigned int connected_ports;
    bool dma_enabled;
    struct zynqmp_dpsub_drm *drm;
    struct drm_bridge *bridge;
    struct zynqmp_disp *disp;
    struct zynqmp_disp_layer *layers[ZYNQMP_DPSUB_NUM_LAYERS];
    struct zynqmp_dp *dp;
    unsigned int dma_align;
};

成员

dev

物理设备

apb_clk

APB 时钟

vid_clk

视频时钟

vid_clk_from_ps

如果视频时钟来自 PS,则为真,如果来自 PL,则为假

aud_clk

音频时钟

aud_clk_from_ps

如果音频时钟来自 PS,则为真,如果来自 PL,则为假

connected_ports

设备树中连接的端口的位掩码

dma_enabled

如果启用了 DMA 接口,则为真,如果 DPSUB 由实时输入驱动,则为假

drm

DRM/KMS 设备数据

bridge

DP 编码器桥

disp

显示控制器

layers

视频和图形层

dp

DisplayPort 控制器

dma_align

DMA 对齐约束(必须是 2 的幂)

struct zynqmp_dpsub_drm

ZynqMP DisplayPort 子系统 DRM/KMS 数据

定义:

struct zynqmp_dpsub_drm {
    struct zynqmp_dpsub *dpsub;
    struct drm_device dev;
    struct drm_plane planes[ZYNQMP_DPSUB_NUM_LAYERS];
    struct drm_crtc crtc;
    struct drm_encoder encoder;
};

成员

dpsub

指向 DisplayPort 子系统的反向指针

dev

DRM/KMS 设备

planes

DRM 平面

crtc

DRM CRTC

encoder

虚拟 DRM 编码器

enum zynqmp_dpsub_layer_mode

图层模式

常量

ZYNQMP_DPSUB_LAYER_NONLIVE

非实时(内存)模式

ZYNQMP_DPSUB_LAYER_LIVE

实时(流)模式

struct zynqmp_disp_format

显示子系统格式信息

定义:

struct zynqmp_disp_format {
    u32 drm_fmt;
    u32 bus_fmt;
    u32 buf_fmt;
    bool swap;
    const u32 *sf;
};

成员

drm_fmt

DRM 格式 (4CC)

bus_fmt

媒体总线格式

buf_fmt

AV 缓冲区格式

swap

用于交换 RGB 格式的 R & B 以及 YUV 格式的 U & V 的标志

sf

颜色分量的缩放因子

struct zynqmp_disp_layer_dma

图层的一个数据平面的 DMA 通道

定义:

struct zynqmp_disp_layer_dma {
    struct dma_chan *chan;
    struct dma_interleaved_template xt;
    struct data_chunk sgl;
};

成员

chan

DMA 通道

xt

交错 DMA 描述符模板

sgl

dma_interleaved_template 的数据块

struct zynqmp_disp_layer_info

静态图层信息

定义:

struct zynqmp_disp_layer_info {
    const struct zynqmp_disp_format *formats;
    unsigned int num_formats;
    unsigned int num_channels;
};

成员

formats

支持的格式数组

num_formats

formats 数组中的格式数量

num_channels

DMA 通道数

struct zynqmp_disp_layer

显示层

定义:

struct zynqmp_disp_layer {
    enum zynqmp_dpsub_layer_id id;
    struct zynqmp_disp *disp;
    const struct zynqmp_disp_layer_info *info;
    struct zynqmp_disp_layer_dma dmas[ZYNQMP_DISP_MAX_NUM_SUB_PLANES];
    const struct zynqmp_disp_format *disp_fmt;
    const struct drm_format_info *drm_fmt;
    enum zynqmp_dpsub_layer_mode mode;
};

成员

id

图层 ID

disp

指向 struct zynqmp_disp 的反向指针

info

静态图层信息

dmas

DMA 通道

disp_fmt

当前格式信息

drm_fmt

当前 DRM 格式信息

mode

当前操作模式

struct zynqmp_disp

显示控制器

定义:

struct zynqmp_disp {
    struct device *dev;
    struct zynqmp_dpsub *dpsub;
    void __iomem *blend;
    void __iomem *avbuf;
    void __iomem *audio;
    struct zynqmp_disp_layer layers[ZYNQMP_DPSUB_NUM_LAYERS];
};

成员

dev

设备结构

dpsub

显示子系统

blend

混合器的寄存器 I/O 基址

avbuf

音频/视频缓冲区管理器的寄存器 I/O 基址

audio

音频混合器的寄存器 I/O 基址

layers

图层(平面)

void zynqmp_disp_avbuf_set_format(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer, const struct zynqmp_disp_format *fmt)

设置图层的输入格式

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

const struct zynqmp_disp_format *fmt

格式信息

描述

layer 的视频缓冲区管理器格式设置为 fmt

void zynqmp_disp_avbuf_set_clocks_sources(struct zynqmp_disp *disp, bool video_from_ps, bool audio_from_ps, bool timings_internal)

设置时钟源

参数

struct zynqmp_disp *disp

显示控制器

bool video_from_ps

如果视频时钟源自 PS,则为 True

bool audio_from_ps

如果音频时钟源自 PS,则为 True

bool timings_internal

如果视频时序在内部生成,则为 True

描述

设置视频和音频时钟以及视频时序的来源。时钟可以源自 PS 或 PL,时序可以在内部或外部生成。

void zynqmp_disp_avbuf_enable_channels(struct zynqmp_disp *disp)

启用缓冲区通道

参数

struct zynqmp_disp *disp

显示控制器

描述

启用所有(视频和音频)缓冲区通道。

void zynqmp_disp_avbuf_disable_channels(struct zynqmp_disp *disp)

禁用缓冲区通道

参数

struct zynqmp_disp *disp

显示控制器

描述

禁用所有(视频和音频)缓冲区通道。

void zynqmp_disp_avbuf_enable_audio(struct zynqmp_disp *disp)

启用音频

参数

struct zynqmp_disp *disp

显示控制器

描述

启用所有具有非实时(内存)源的音频缓冲区。

void zynqmp_disp_avbuf_disable_audio(struct zynqmp_disp *disp)

禁用音频

参数

struct zynqmp_disp *disp

显示控制器

描述

禁用所有音频缓冲区。

void zynqmp_disp_avbuf_enable_video(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer)

启用视频层

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

描述

layer 启用视频/图形缓冲区。

void zynqmp_disp_avbuf_disable_video(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer)

禁用视频层

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

描述

禁用 layer 的视频/图形缓冲区。

void zynqmp_disp_avbuf_enable(struct zynqmp_disp *disp)

启用视频管道

参数

struct zynqmp_disp *disp

显示控制器

描述

取消置位视频管道复位。

void zynqmp_disp_avbuf_disable(struct zynqmp_disp *disp)

禁用视频管道

参数

struct zynqmp_disp *disp

显示控制器

描述

置位视频管道复位。

void zynqmp_disp_blend_set_output_format(struct zynqmp_disp *disp, enum zynqmp_dpsub_format format)

设置混合器的输出格式

参数

struct zynqmp_disp *disp

显示控制器

enum zynqmp_dpsub_format format

输出格式

描述

将混合器的输出格式设置为 format

void zynqmp_disp_blend_set_bg_color(struct zynqmp_disp *disp, u32 rcr, u32 gy, u32 bcb)

设置背景颜色

参数

struct zynqmp_disp *disp

显示控制器

u32 rcr

红色/Cr 颜色分量

u32 gy

绿色/Y 颜色分量

u32 bcb

蓝色/Cb 颜色分量

描述

将背景颜色设置为 (rcr, gy, bcb),分别对应于所选输出格式的 R、G 和 B 或 Cr、Y 和 Cb 分量。

void zynqmp_disp_blend_set_global_alpha(struct zynqmp_disp *disp, bool enable, u32 alpha)

配置全局 Alpha 混合

参数

struct zynqmp_disp *disp

显示控制器

bool enable

True 以启用全局 Alpha 混合

u32 alpha

全局 Alpha 值(如果 enabled 为 false,则忽略)

void zynqmp_disp_blend_layer_set_csc(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer, const u16 *coeffs, const u32 *offsets)

配置图层的色彩空间转换

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

const u16 *coeffs

色彩空间转换矩阵

const u32 *offsets

色彩空间转换偏移

描述

layer 配置输入色彩空间转换矩阵和偏移。矩阵的列根据输入格式自动交换,以处理 RGB 和 YCrCb 分量的排列。

void zynqmp_disp_blend_layer_enable(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer)

启用图层

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

void zynqmp_disp_blend_layer_disable(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer)

禁用图层

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

void zynqmp_disp_audio_enable(struct zynqmp_disp *disp)

启用音频混音器

参数

struct zynqmp_disp *disp

显示控制器

描述

通过取消软复位来启用音频混音器。音频状态由复位设置为默认值,显式设置默认混音器音量。

void zynqmp_disp_audio_disable(struct zynqmp_disp *disp)

禁用音频混音器

参数

struct zynqmp_disp *disp

显示控制器

描述

通过断言其软复位来禁用音频混音器。

const struct zynqmp_disp_format *zynqmp_disp_layer_find_format(struct zynqmp_disp_layer *layer, u32 drm_fmt)

查找 DRM 格式的格式信息

参数

struct zynqmp_disp_layer *layer

该图层

u32 drm_fmt

要搜索的 DRM 格式

描述

搜索与给定 DRM 格式 drm_fmt 对应的显示子系统格式信息,用于 layer,并返回指向格式描述符的指针。

返回

如果找到,则返回指向格式描述符的指针,否则返回 NULL

const struct zynqmp_disp_format *zynqmp_disp_layer_find_live_format(struct zynqmp_disp_layer *layer, u32 media_bus_format)

查找给定媒体总线格式的格式信息

参数

struct zynqmp_disp_layer *layer

该图层

u32 media_bus_format

要搜索的媒体总线格式

描述

搜索与给定媒体总线格式 media_bus_format 对应的显示子系统格式信息,用于 layer,并返回指向格式描述符的指针。

返回

如果找到,则返回指向格式描述符的指针,否则返回 NULL

u32 *zynqmp_disp_layer_drm_formats(struct zynqmp_disp_layer *layer, unsigned int *num_formats)

返回图层支持的 DRM 格式

参数

struct zynqmp_disp_layer *layer

该图层

unsigned int *num_formats

指向返回的格式数量的指针

注意

此函数对于实时视频图层没有意义,在这些情况下将始终返回空列表。应使用 zynqmp_disp_live_layer_formats() 查询实时视频输入图层支持的媒体总线格式列表。

返回

新分配的 u32 数组,用于存储该图层支持的所有 DRM 格式。数组中的格式数量通过 num_formats 参数返回。

u32 *zynqmp_disp_live_layer_formats(struct zynqmp_disp_layer *layer, unsigned int *num_formats)

返回实时视频图层支持的媒体总线格式

参数

struct zynqmp_disp_layer *layer

该图层

unsigned int *num_formats

指向返回的格式数量的指针

注意

此函数仅应用于实时视频输入图层。

返回

新分配的 u32 数组,其中包含该图层支持的媒体总线格式。数组中的格式数量通过 num_formats 参数返回。

void zynqmp_disp_layer_enable(struct zynqmp_disp_layer *layer)

启用图层

参数

struct zynqmp_disp_layer *layer

该图层

描述

在音频/视频缓冲区管理器和混合器中启用 layer。DMA 通道由 zynqmp_disp_layer_update() 单独启动。

void zynqmp_disp_layer_disable(struct zynqmp_disp_layer *layer)

禁用图层

参数

struct zynqmp_disp_layer *layer

该图层

描述

通过停止其 DMA 通道并在音频/视频缓冲区管理器和混合器中禁用该图层来禁用该图层。

void zynqmp_disp_layer_set_format(struct zynqmp_disp_layer *layer, const struct drm_format_info *info)

设置图层格式

参数

struct zynqmp_disp_layer *layer

该图层

const struct drm_format_info *info

格式信息

注意

使用 zynqmp_disp_layer_set_live_format() 为实时视频图层设置媒体总线格式。

描述

layer 的格式设置为 info。必须禁用该图层。

void zynqmp_disp_layer_set_live_format(struct zynqmp_disp_layer *layer, u32 media_bus_format)

设置实时视频图层格式

参数

struct zynqmp_disp_layer *layer

该图层

u32 media_bus_format

要设置的媒体总线格式

注意

此函数不应用于设置非实时视频图层的格式。请改用 zynqmp_disp_layer_set_format()

描述

设置实时 layer 的显示格式。必须禁用该图层。

int zynqmp_disp_layer_update(struct zynqmp_disp_layer *layer, struct drm_plane_state *state)

更新图层帧缓冲

参数

struct zynqmp_disp_layer *layer

该图层

struct drm_plane_state *state

平面状态

描述

通过为新的帧缓冲发出新的 DMA 引擎事务来更新图层的帧缓冲。

返回

成功时返回 0,否则返回 DMA 描述符失败错误

void zynqmp_disp_layer_release_dma(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer)

释放图层的 DMA 通道

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

描述

释放与 layer 关联的 DMA 通道。

void zynqmp_disp_destroy_layers(struct zynqmp_disp *disp)

销毁所有图层

参数

struct zynqmp_disp *disp

显示控制器

int zynqmp_disp_layer_request_dma(struct zynqmp_disp *disp, struct zynqmp_disp_layer *layer)

为图层请求 DMA 通道

参数

struct zynqmp_disp *disp

显示控制器

struct zynqmp_disp_layer *layer

该图层

描述

请求 layer 所需的所有 DMA 引擎通道。

返回

成功返回 0,否则返回 DMA 通道请求错误

int zynqmp_disp_create_layers(struct zynqmp_disp *disp)

创建并初始化所有图层

参数

struct zynqmp_disp *disp

显示控制器

返回

成功返回 0,否则返回 DMA 通道请求错误

void zynqmp_disp_enable(struct zynqmp_disp *disp)

启用显示控制器

参数

struct zynqmp_disp *disp

显示控制器

void zynqmp_disp_disable(struct zynqmp_disp *disp)

禁用显示控制器

参数

struct zynqmp_disp *disp

显示控制器

int zynqmp_disp_setup_clock(struct zynqmp_disp *disp, unsigned long mode_clock)

配置显示控制器像素时钟速率

参数

struct zynqmp_disp *disp

显示控制器

unsigned long mode_clock

像素时钟速率,单位为 Hz

返回

成功返回 0,否则返回负的时钟错误

源和接收器之间的公共链路配置

定义:

struct zynqmp_dp_link_config {
    int max_rate;
    u8 max_lanes;
};

成员

max_rate

最大链路速率

max_lanes

最大通道数

struct zynqmp_dp_mode

DisplayPort 的配置模式

定义:

struct zynqmp_dp_mode {
    const char *fmt;
    int pclock;
    u8 bw_code;
    u8 lane_cnt;
};

成员

fmt

格式标识符字符串

pclock

当前模式的像素时钟频率

bw_code

带宽(链路速率)代码

lane_cnt

通道数

struct zynqmp_dp_config

来自 DTS 的 DisplayPort 配置

定义:

struct zynqmp_dp_config {
    u8 misc0;
    u8 misc1;
    u8 bpp;
};

成员

misc0

misc0 配置(每个 DP v1.2 规范)

misc1

misc1 配置(每个 DP v1.2 规范)

bpp

每像素位数

enum test_pattern

用于测试的测试模式

常量

TEST_VIDEO

使用常规视频输入

TEST_TPS1

链路训练符号图案 TPS1 (/D10.2/)

TEST_TPS2

链路训练符号图案 TPS2

TEST_TPS3

链路训练符号图案 TPS3(用于 HBR2)

TEST_SYMBOL_ERROR

符号错误测量图案

TEST_PRBS7

PRBS7 (x^7 + x^6 + 1) 多项式的输出

TEST_80BIT_CUSTOM

一个自定义的 80 位图案

TEST_CP2520

HBR2 合规眼图

struct zynqmp_dp_test

测试模式配置

定义:

struct zynqmp_dp_test {
    enum test_pattern pattern;
    bool enhanced, downspread, active;
    u8 custom[10];
    u8 train_set[ZYNQMP_DP_MAX_LANES];
    u8 bw_code;
    u8 link_cnt;
};

成员

pattern

测试模式

enhanced

使用增强的成帧

downspread

使用 SSC

active

测试模式是否处于活动状态

custom

用于 TEST_80BIT_CUSTOM 的自定义模式

train_set

电压/预加重设置

bw_code

链路的带宽代码

link_cnt

通道数

struct zynqmp_dp_train_set_priv

train_set debugfs 文件的私有数据

定义:

struct zynqmp_dp_train_set_priv {
    struct zynqmp_dp *dp;
    int lane;
};

成员

dp

DisplayPort IP 核结构

lane

此文件的通道

struct zynqmp_dp

Xilinx DisplayPort 核

定义:

struct zynqmp_dp {
    struct drm_dp_aux aux;
    struct drm_bridge bridge;
    struct work_struct hpd_work;
    struct work_struct hpd_irq_work;
    struct completion aux_done;
    struct mutex lock;
    struct drm_bridge *next_bridge;
    struct device *dev;
    struct zynqmp_dpsub *dpsub;
    void __iomem *iomem;
    struct reset_control *reset;
    struct phy *phy[ZYNQMP_DP_MAX_LANES];
    enum drm_connector_status status;
    int irq;
    bool enabled;
    bool ignore_aux_errors;
    bool ignore_hpd;
    struct zynqmp_dp_train_set_priv debugfs_train_set[ZYNQMP_DP_MAX_LANES];
    struct zynqmp_dp_mode mode;
    struct zynqmp_dp_link_config link_config;
    struct zynqmp_dp_test test;
    struct zynqmp_dp_config config;
    u8 dpcd[DP_RECEIVER_CAP_SIZE];
    u8 train_set[ZYNQMP_DP_MAX_LANES];
    u8 num_lanes;
};

成员

aux

辅助通道

bridge

DP 编码器的 DRM 桥

hpd_work

热插拔检测工作线程

hpd_irq_work

热插拔检测 IRQ 工作线程

aux_done

当我们收到 AUX 回复或超时时完成

lock

保护此结构和寄存器访问的互斥锁(但不包括 AUX)

next_bridge

下游桥

dev

设备结构

dpsub

显示子系统

iomem

用于寄存器访问的设备 I/O 内存

reset

复位控制器

phy

DP 通道的 PHY 句柄

status

连接状态

irq

irq

enabled

指示设备是否已启用的标志

ignore_aux_errors

如果设置,则会禁止 AUX 错误

ignore_hpd

如果设置,则会忽略 HPD 事件和 IRQ

debugfs_train_set

train_set 的 Debugfs 私有数据

mode

IP 核和接收器设备之间的当前模式

link_config

IP 核和接收器设备之间的公共链路配置

test

测试模式配置

config

来自 DTS 的 IP 核配置

dpcd

来自当前连接的接收器设备的 DP 配置数据

train_set

训练数据组

num_lanes

启用的 PHY 通道数

描述

lock 涵盖此结构中的链路配置和设备的寄存器。它不涵盖 auxignore_aux_errors。对于仅在探测/删除时修改的任何成员(例如 dev),它不是严格要求的。

int zynqmp_dp_phy_init(struct zynqmp_dp *dp)

初始化 PHY

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

初始化 PHY。

返回

如果正确初始化 PHY 实例,则返回 0,否则返回被调用函数返回的错误代码。

void zynqmp_dp_phy_exit(struct zynqmp_dp *dp)

退出 PHY

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

退出 PHY。

int zynqmp_dp_phy_probe(struct zynqmp_dp *dp)

探测 PHY

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

探测所有通道的 PHY。可用的 PHY 可能少于通道数,只要找到至少一个 PHY,就不认为这是一个错误。调用者可以检查 dp->num_lanes 来检查找到了多少个 PHY。

返回

  • 0 - 成功

  • -ENXIO
    • 未找到 PHY

  • -EPROBE_DEFER
    • 请求探测延迟

  • 其他负值 - PHY 检索失败

int zynqmp_dp_phy_ready(struct zynqmp_dp *dp)

检查 PHY 是否就绪

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

检查 PHY 是否就绪。如果 PHY 未就绪,请等待 1 毫秒,检查 100 次。IP 设计人员建议使用此延迟量。

返回

如果 PHY 就绪,则返回 0,如果 PHY 未就绪,则返回 -ENODEV。

int zynqmp_dp_max_rate(int link_rate, u8 lane_num, u8 bpp)

计算并返回可用的最大像素时钟频率。

参数

int link_rate

链路速率(千字节/秒)

u8 lane_num

通道数

u8 bpp

每像素位数

返回

当前链路配置支持的最大像素时钟频率(千赫兹)。

int zynqmp_dp_mode_configure(struct zynqmp_dp *dp, int pclock, u8 current_bw)

配置链路值。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

int pclock

所请求的显示模式的像素时钟频率。

u8 current_bw

当前链路速率。

描述

查找所请求的像素时钟频率 **pclock** 的链路配置值、速率和通道数。 **pclock** 存储在模式中,以便在以后的其他函数中使用。 返回的速率是从当前速率 **current_bw** 降低后的速率。

返回

当前链路速率代码,或 -EINVAL。

void zynqmp_dp_adjust_train(struct zynqmp_dp *dp, u8 link_status[DP_LINK_STATUS_SIZE])

调整训练值。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

u8 link_status[DP_LINK_STATUS_SIZE]

来自接收器的链路状态,其中包含请求的训练值。

int zynqmp_dp_update_vs_emph(struct zynqmp_dp *dp, u8 *train_set)

更新训练值。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

u8 *train_set

一组训练值。

描述

根据接收器的请求更新训练值。映射值是预定义的,并且值(vs、pe、pc)来自设备手册。

返回

如果 vs 和 emph 更新成功,则返回 0,否则返回 drm_dp_dpcd_write() 返回的错误代码。

训练时钟恢复。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

返回

如果时钟恢复训练成功完成,则返回 0,否则返回相应的错误代码。

训练通道均衡。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

返回

如果通道均衡训练成功完成,则返回 0,否则返回相应的错误代码。

int zynqmp_dp_setup(struct zynqmp_dp *dp, u8 bw_code, u8 lane_cnt, bool enhanced, bool downspread)

设置主要的链路参数。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

u8 bw_code

链路带宽,以 270 MHz 的倍数表示。

u8 lane_cnt

要使用的通道数。

bool enhanced

使用增强的成帧

bool downspread

启用扩频时钟。

返回

成功时返回 0,失败时返回 -errno。

int zynqmp_dp_train(struct zynqmp_dp *dp)

训练链路。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

返回

如果所有训练都成功完成,则返回 0,否则返回相应的错误代码。

void zynqmp_dp_train_loop(struct zynqmp_dp *dp)

在训练期间降低链路速率。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

如果训练不成功,则通过降低链路速率来训练链路。

int zynqmp_dp_aux_cmd_submit(struct zynqmp_dp *dp, u32 cmd, u16 addr, u8 *buf, u8 bytes, u8 *reply)

提交 AUX 命令。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

u32 cmd

AUX 命令。

u16 addr

AUX 地址。

u8 *buf

命令数据缓冲区。

u8 bytes

**buf** 的字节数。

u8 *reply

要返回的回复代码。

描述

提交 AUX 命令。所有 AUX 相关命令,无论是本机命令还是 I2C AUX 读取/写入命令,都通过此函数提交。此函数映射到 struct drm_dp_aux 的传输函数。此函数涉及多次寄存器读取/写入,因此需要同步,它由 drm_dp_helper 使用 **hw_mutex** 完成。如果命令提交后没有立即回复,则调用线程将进入睡眠状态。如果 **reply** != NULL,则回复代码将返回到 **reply**。

返回

如果命令提交正确,则返回 0;否则返回相应的错误代码:-EBUSY 表示已经有请求正在处理,-ETIMEDOUT 表示接收回复超时,-EIO 表示接收到的字节数少于请求的字节数。

int zynqmp_dp_aux_init(struct zynqmp_dp *dp)

初始化并注册 DP AUX。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

对 AUX 时钟分频器和滤波器进行编程,并注册 DP AUX 适配器。

返回

成功时返回 0,否则返回错误值。

void zynqmp_dp_aux_cleanup(struct zynqmp_dp *dp)

清理 DP AUX。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

注销 DP AUX 适配器。

void zynqmp_dp_update_misc(struct zynqmp_dp *dp)

写入 misc 寄存器。

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

misc 寄存器值存储在结构中,此函数将这些值应用到寄存器中。

int zynqmp_dp_set_format(struct zynqmp_dp *dp, const struct drm_display_info *info, enum zynqmp_dpsub_format format, unsigned int bpc)

设置输入格式

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

const struct drm_display_info *info

显示信息

enum zynqmp_dpsub_format format

输入格式

unsigned int bpc

每个分量的位数

描述

根据输入的 formatbpc 更新 misc 寄存器值。

返回

成功返回 0,失败返回 -EINVAL。

void zynqmp_dp_encoder_mode_set_transfer_unit(struct zynqmp_dp *dp, const struct drm_display_mode *mode)

设置传输单元值

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

const struct drm_display_mode *mode

请求的显示模式

描述

设置传输单元,并计算所有与传输单元大小相关的值。计算基于 DP 和 IP 核规范。

void zynqmp_dp_encoder_mode_set_stream(struct zynqmp_dp *dp, const struct drm_display_mode *mode)

配置主数据流

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

const struct drm_display_mode *mode

请求的显示模式

描述

根据请求的模式 mode 配置主数据流。计算基于 IP 核规范。

struct zynqmp_disp_layer *zynqmp_dp_disp_connected_live_layer(struct zynqmp_dp *dp)

返回第一个连接的活动图层

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

返回

第一个连接的活动显示图层,如果没有连接的活动图层,则返回 NULL。

int zynqmp_dp_set_test_pattern(struct zynqmp_dp *dp, enum test_pattern pattern, u8 *const custom)

配置用于测试模式的链路

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

enum test_pattern pattern

要配置的测试模式

u8 *const custom

如果 patternTEST_80BIT_CUSTOM,则使用自定义模式

返回

成功返回 0,失败返回负 errno (DPCD) 值

void zynqmp_dp_enable_vblank(struct zynqmp_dp *dp)

启用垂直消隐

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

启用垂直消隐中断

void zynqmp_dp_disable_vblank(struct zynqmp_dp *dp)

禁用垂直消隐

参数

struct zynqmp_dp *dp

DisplayPort IP 核结构

描述

禁用垂直消隐中断

bool zynqmp_dpsub_audio_enabled(struct zynqmp_dpsub *dpsub)

如果音频已启用

参数

struct zynqmp_dpsub *dpsub

DisplayPort 子系统

描述

根据音频时钟返回音频是否已启用。

返回

如果音频已启用则返回 true,否则返回 false。

unsigned int zynqmp_dpsub_get_audio_clk_rate(struct zynqmp_dpsub *dpsub)

获取当前音频时钟频率

参数

struct zynqmp_dpsub *dpsub

DisplayPort 子系统

返回

当前音频时钟频率。

void zynqmp_dpsub_drm_handle_vblank(struct zynqmp_dpsub *dpsub)

处理垂直消隐事件

参数

struct zynqmp_dpsub *dpsub

DisplayPort 子系统

描述

此函数处理垂直消隐中断,并向 CRTC 对象发送一个事件。这将由 DP 垂直消隐中断处理程序调用。