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 {
    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

每畫素位數

返回值

當前鏈路配置支援的最大畫素時鐘 (KHz)。

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)

啟用 vblank

引數

struct zynqmp_dp *dp

DisplayPort IP 核結構

描述

啟用 vblank 中斷

void zynqmp_dp_disable_vblank(struct zynqmp_dp *dp)

停用 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 中斷處理程式呼叫。