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;
struct zynqmp_dpsub_audio *audio;
};
成员
dev
物理设备
apb_clk
APB 时钟
vid_clk
视频时钟
vid_clk_from_ps
如果视频时钟来自 PS,则为 True;如果来自 PL,则为 false
aud_clk
音频时钟
aud_clk_from_ps
如果音频时钟来自 PS,则为 True;如果来自 PL,则为 false
connected_ports
设备树中已连接端口的位掩码
dma_enabled
如果启用了 DMA 接口,则为 True;如果 DPSUB 由实时输入驱动,则为 false
drm
DRM/KMS 设备数据
bridge
DP 编码器桥
disp
显示控制器
layers
视频和图形图层
dp
DisplayPort 控制器
dma_align
DMA 对齐约束(必须是 2 的幂)
audio
DP 音频数据
-
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;
struct zynqmp_disp_layer layers[ZYNQMP_DPSUB_NUM_LAYERS];
};
成员
dev
设备结构
dpsub
显示子系统
blend
混合器的寄存器 I/O 基地址
avbuf
音频/视频缓冲区管理器的寄存器 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
如果启用全局 alpha 混合,则为 True
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
图层
-
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 格式
描述
搜索与 layer 的给定 DRM 格式 drm_fmt 对应的显示子系统格式信息,并返回指向格式描述符的指针。
返回值
如果找到,则返回指向格式描述符的指针;否则返回 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
要搜索的媒体总线格式
描述
搜索与 layer 的给定媒体总线格式 media_bus_format 对应的显示子系统格式信息,并返回指向格式描述符的指针。
返回值
如果找到,则返回指向格式描述符的指针;否则返回 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¶
源和接收器之间的公共链路配置
定义:
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 涵盖此结构和设备的寄存器中的链路配置。 它不涵盖 aux 或 ignore_aux_errors。 对于仅在探测/移除时修改的任何成员(例如 dev),它不是严格必需的。
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
初始化 phy。
返回值
如果正确初始化 phy 实例,则返回 0,否则返回被调用函数返回的错误代码。
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
退出 phy。
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
探测所有通道的 PHY。 可用的 PHY 可能少于通道数,只要找到至少一个 PHY,就不被视为错误。 调用方可以检查 dp->num_lanes 以检查找到的 PHY 数量。
返回值
0 - 成功
- -ENXIO
未找到 PHY
- -EPROBE_DEFER
请求了探测延迟
其他负值 - 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
每像素位数
返回值
当前链路配置支持的最大像素时钟 (KHz)。
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
int pclock
请求的显示模式的像素时钟
u8 current_bw
当前链路速率
描述
查找请求的像素时钟 pclock 的链路配置值、速率和通道计数。 pclock 存储在模式中,以供稍后在其他函数中使用。 返回的速率从当前速率 current_bw 中降低。
返回值
当前链路速率代码,或 -EINVAL。
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
u8 link_status[DP_LINK_STATUS_SIZE]
来自接收器的链路状态,其中包含请求的训练值
参数
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
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
返回值
如果所有训练都成功完成,则返回 0,否则返回相应的错误代码。
参数
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(如果接收到的字节数少于请求的字节数)
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
对 AUX 时钟分频器和过滤器进行编程,并注册 DP AUX 适配器。
返回值
成功时返回 0,否则返回错误值
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
注销 DP AUX 适配器。
参数
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
每分量位数
描述
根据输入 format 和 bpc 更新 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
如果 pattern 为
TEST_80BIT_CUSTOM
,则要使用的自定义模式
返回值
成功时返回 0,失败时返回负 errno (DPCD)
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
启用 vblank 中断
参数
struct zynqmp_dp *dp
DisplayPort IP 核结构
描述
禁用 vblank 中断
-
void zynqmp_dpsub_drm_handle_vblank(struct zynqmp_dpsub *dpsub)¶
处理 vblank 事件
参数
struct zynqmp_dpsub *dpsub
DisplayPort 子系统
描述
此函数处理 vblank 中断,并将事件发送到 CRTC 对象。 这将由 DP vblank 中断处理程序调用。