DCN 模組

在本節中,您將找到一些關於 DCN 模組的額外細節,以及自動生成的程式碼文件。

DCHUBBUB

只有一個通用的 DCHUBBUB。它包含資料結構介面的通用請求和返回模組,這些模組不是時鐘/電源門控的。

HUBP

顯示控制器Hub(DCHUB)是可擴充套件資料埠(SDP)和DCN之間的閘道器。 此元件具有多種功能,例如儲存器仲裁、旋轉和游標操作。

每個管道分配一個 HUBP,它提取資料並將不同的畫素格式(即 ARGB8888、NV12 等)轉換為畫素資料的線性、交錯和固定深度流。

DPP

DPP(顯示管道和平面)塊是 DCN 中統一的顯示資料處理引擎,用於處理每個 DPP 矩形上的圖形或影片資料。 這個矩形可以是 SLS(單個大表面)的一部分,也可以是要與其他 DPP 混合的圖層,也可以是與顯示瓦片關聯的矩形。

它提供各種功能,包括:- 圖形顏色鍵控器 - 圖形游標合成 - 圖形或影片影像源到目標縮放 - 影像銳化 - 影片格式轉換(從 4:2:0 或 4:2:2 到 4:4:4)- 色彩空間轉換 - 主機 LUT 伽馬調整 - 色域重對映 - 亮度和對比度調整。

DPP 管道由轉換器和游標 (CNVC)、縮放器 (DSCL)、顏色管理 (CM)、輸出緩衝區 (OBUF) 和數字旁路 (DPB) 模組組成,這些模組以影片/圖形管道連線。

struct cnv_alpha_2bit_lut

基於 2 位 alpha 設定 8 位 alpha 值

定義:

struct cnv_alpha_2bit_lut {
    int lut0;
    int lut1;
    int lut2;
    int lut3;
};

成員

lut0

ALPHA_2BIT_LUT. ALPHA_2BIT_LUT0. 預設值: 0b00000000

lut1

ALPHA_2BIT_LUT. ALPHA_2BIT_LUT1. 預設值: 0b01010101

lut2

ALPHA_2BIT_LUT. ALPHA_2BIT_LUT2. 預設值: 0b10101010

lut3

ALPHA_2BIT_LUT. ALPHA_2BIT_LUT3. 預設值: 0b11111111

MPC

多管道/平面組合器 (MPC) 是硬體管道中的一個元件,它使用全域性和逐畫素 alpha 執行多個平面的混合。 它還根據硬體功能執行混合後顏色校正操作,例如顏色轉換矩陣以及伽馬 1D 和 3D LUT。

MPC 接收來自所有 DPP 管道的輸出,並將它們組合成多個輸出,支援 “M MPC 輸入 -> N MPC 輸出” 的靈活組合架構。 它的特點是

  • 可程式設計混合結構,允許軟體控制的混合和級聯;

  • 每個 DPP 在顯示活動區域中的可程式設計視窗位置;

  • 當單個 DPP 管道無法處理非常大的表面時,將多個 DPP 管道組合在一個活動區域中;

  • 混合來自不同 SLS 的多個 DPP;

  • 來自單個 DPP 的自上而下或並排模式的立體格式;

  • 來自 2 個 DPP 的立體格式;

  • 來自不同 DPP 管道的多個圖層的 Alpha 混合;

  • 可程式設計背景顏色;

struct mpcc

單個 MPCC 例項的 MPCC 連線和混合配置。

定義:

struct mpcc {
    int mpcc_id;
    int dpp_id;
    struct mpcc *mpcc_bot;
    struct mpcc_blnd_cfg blnd_cfg;
    struct mpcc_sm_cfg sm_cfg;
    bool shared_bottom;
};

成員

mpcc_id

MPCC 物理例項。

dpp_id

此 MPCC 的 DPP 輸入

mpcc_bot

指向底層 MPCC 的指標。未連線時為 NULL。

blnd_cfg

此 MPCC 的混合配置。

sm_cfg

此 MPCC 的立體混合設定

shared_bottom

如果 MPCC 輸出到 OPP 和 DWB 端點,則為 true。 否則為 false。

描述

此結構用作 MPC 樹中的節點。

struct mpc_tree

MPC 樹表示管道的所有 MPCC 連線。

定義:

struct mpc_tree {
    int opp_id;
    struct mpcc *opp_list;
};

成員

opp_id

擁有此 MPC 樹的 OPP 例項。

opp_list

輸出到 OPP 端點的 MPC 樹的頂層 MPCC

struct mpc_funcs

funcs

定義:

struct mpc_funcs {
    void (*read_mpcc_state)(struct mpc *mpc,int mpcc_inst, struct mpcc_state *s);
    struct mpcc* (*insert_plane)(struct mpc *mpc,struct mpc_tree *tree,struct mpcc_blnd_cfg *blnd_cfg,struct mpcc_sm_cfg *sm_cfg,struct mpcc *insert_above_mpcc,int dpp_id, int mpcc_id);
    void (*remove_mpcc)(struct mpc *mpc,struct mpc_tree *tree, struct mpcc *mpcc);
    void (*mpc_init)(struct mpc *mpc);
    void (*mpc_init_single_inst)(struct mpc *mpc, unsigned int mpcc_id);
    void (*update_blending)(struct mpc *mpc,struct mpcc_blnd_cfg *blnd_cfg, int mpcc_id);
    void (*cursor_lock)(struct mpc *mpc,int opp_id, bool lock);
    struct mpcc* (*insert_plane_to_secondary)(struct mpc *mpc,struct mpc_tree *tree,struct mpcc_blnd_cfg *blnd_cfg,struct mpcc_sm_cfg *sm_cfg,struct mpcc *insert_above_mpcc,int dpp_id, int mpcc_id);
    void (*remove_mpcc_from_secondary)(struct mpc *mpc,struct mpc_tree *tree, struct mpcc *mpcc);
    struct mpcc* (*get_mpcc_for_dpp_from_secondary)(struct mpc_tree *tree, int dpp_id);
    struct mpcc* (*get_mpcc_for_dpp)(struct mpc_tree *tree, int dpp_id);
    void (*wait_for_idle)(struct mpc *mpc, int id);
    void (*assert_mpcc_idle_before_connect)(struct mpc *mpc, int mpcc_id);
    void (*init_mpcc_list_from_hw)(struct mpc *mpc, struct mpc_tree *tree);
    void (*set_denorm)(struct mpc *mpc,int opp_id, enum dc_color_depth output_depth);
    void (*set_denorm_clamp)(struct mpc *mpc,int opp_id, struct mpc_denorm_clamp denorm_clamp);
    void (*set_output_csc)(struct mpc *mpc,int opp_id,const uint16_t *regval, enum mpc_output_csc_mode ocsc_mode);
    void (*set_ocsc_default)(struct mpc *mpc,int opp_id,enum dc_color_space color_space, enum mpc_output_csc_mode ocsc_mode);
    void (*set_output_gamma)(struct mpc *mpc,int mpcc_id, const struct pwl_params *params);
    void (*power_on_mpc_mem_pwr)(struct mpc *mpc,int mpcc_id, bool power_on);
    void (*set_dwb_mux)(struct mpc *mpc,int dwb_id, int mpcc_id);
    void (*disable_dwb_mux)(struct mpc *mpc, int dwb_id);
    bool (*is_dwb_idle)(struct mpc *mpc, int dwb_id);
    void (*set_out_rate_control)(struct mpc *mpc,int opp_id,bool enable,bool rate_2x_mode, struct mpc_dwb_flow_control *flow_control);
    void (*set_gamut_remap)(struct mpc *mpc,int mpcc_id, const struct mpc_grph_gamut_adjustment *adjust);
    bool (*program_1dlut)(struct mpc *mpc,const struct pwl_params *params, uint32_t rmu_idx);
    bool (*program_shaper)(struct mpc *mpc,const struct pwl_params *params, uint32_t rmu_idx);
    uint32_t (*acquire_rmu)(struct mpc *mpc, int mpcc_id, int rmu_idx);
    bool (*program_3dlut)(struct mpc *mpc,const struct tetrahedral_params *params, int rmu_idx);
    int (*release_rmu)(struct mpc *mpc, int mpcc_id);
    unsigned int (*get_mpc_out_mux)(struct mpc *mpc, int opp_id);
    void (*set_bg_color)(struct mpc *mpc,struct tg_color *bg_color, int mpcc_id);
    void (*set_mpc_mem_lp_mode)(struct mpc *mpc);
    void (*set_movable_cm_location)(struct mpc *mpc, enum mpcc_movable_cm_location location, int mpcc_id);
    void (*update_3dlut_fast_load_select)(struct mpc *mpc, int mpcc_id, int hubp_idx);
    void (*populate_lut)(struct mpc *mpc, const enum MCM_LUT_ID id, const union mcm_lut_params params, bool lut_bank_a, int mpcc_id);
    void (*program_lut_read_write_control)(struct mpc *mpc, const enum MCM_LUT_ID id, bool lut_bank_a, int mpcc_id);
    void (*program_lut_mode)(struct mpc *mpc, const enum MCM_LUT_ID id, const enum MCM_LUT_XABLE xable, bool lut_bank_a, int mpcc_id);
    void (*program_3dlut_size)(struct mpc *mpc, bool is_17x17x17, int mpcc_id);
    struct {
        void (*program_3dlut_size)(struct mpc *mpc, uint32_t width, int mpcc_id);
        void (*program_bias_scale)(struct mpc *mpc, uint16_t bias, uint16_t scale, int mpcc_id);
        void (*program_bit_depth)(struct mpc *mpc, uint16_t bit_depth, int mpcc_id);
        bool (*is_config_supported)(uint32_t width);
        void (*program_lut_read_write_control)(struct mpc *mpc, const enum MCM_LUT_ID id, bool lut_bank_a, bool enabled, int mpcc_id);
        void (*populate_lut)(struct mpc *mpc, const union mcm_lut_params params, bool lut_bank_a, int mpcc_id);
    } mcm;
    struct {
        void (*enable_3dlut_fl)(struct mpc *mpc, bool enable, int mpcc_id);
        void (*update_3dlut_fast_load_select)(struct mpc *mpc, int mpcc_id, int hubp_idx);
        void (*program_lut_read_write_control)(struct mpc *mpc, const enum MCM_LUT_ID id, bool lut_bank_a, bool enabled, int mpcc_id);
        void (*program_lut_mode)(struct mpc *mpc, const enum MCM_LUT_XABLE xable, bool lut_bank_a, int mpcc_id);
        void (*program_3dlut_size)(struct mpc *mpc, uint32_t width, int mpcc_id);
        void (*program_bias_scale)(struct mpc *mpc, uint16_t bias, uint16_t scale, int mpcc_id);
        void (*program_bit_depth)(struct mpc *mpc, uint16_t bit_depth, int mpcc_id);
        bool (*is_config_supported)(uint32_t width);
        void (*power_on_shaper_3dlut)(struct mpc *mpc, uint32_t mpcc_id, bool power_on);
        void (*populate_lut)(struct mpc *mpc, const union mcm_lut_params params, bool lut_bank_a, int mpcc_id);
    } rmcm;
};

成員

read_mpcc_state

從給定的 MPCC 物理例項讀取暫存器內容。

引數

  • [輸入/輸出] mpc - MPC 上下文

  • [輸入] mpcc_instance - MPC 上下文例項

  • [輸入] mpcc_state - MPC 上下文狀態

返回

void

insert_plane

根據指定的混合位置將 DPP 插入到 MPC 樹中。 僅用於作為 OPP 輸出的混合鏈的一部分的平面

引數

  • [輸入/輸出] mpc - MPC 上下文。

  • [輸入/輸出] tree - 將要新增平面的 MPC 樹結構。

  • [輸入] blnd_cfg - 新混合層的 MPCC 混合配置。

  • [輸入] sm_cfg - 新混合層的 MPCC 立體混合配置。

    立體混合必須停用樹配置的最底層。

  • [輸入] insert_above_mpcc - 在此 MPCC 之上插入新平面。

    如果為 NULL,則作為底層平面插入。

  • [輸入] dpp_id - 要新增的平面的 DPP 例項。

  • [輸入] mpcc_id - 用於混合的 MPCC 物理例項。

返回

struct mpcc* - 新增的 MPCC。

remove_mpcc

從 MPC 樹中刪除指定的 MPCC。

引數

  • [輸入/輸出] mpc - MPC 上下文。

  • [輸入/輸出] tree - 將從中刪除平面的 MPC 樹結構。

  • [輸入/輸出] mpcc - 要從樹中刪除的 MPCC。

返回

void

mpc_init

透過斷開所有多路複用器來重置 MPCC HW 狀態。

引數

  • [輸入/輸出] mpc - MPC 上下文。

返回

void

mpc_init_single_inst

初始化給定的 MPCC 物理例項。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] mpcc_id - 要初始化的 MPCC 物理例項。

update_blending

更新指定 MPCC 的混合配置。

引數

  • [輸入/輸出] mpc - MPC 上下文。

  • [輸入] blnd_cfg - MPCC 混合配置。

  • [輸入] mpcc_id - MPCC 物理例項。

返回

void

cursor_lock

鎖定指定 OPP 的游標更新。 OPP 定義了一組一起鎖定以用於游標的 MPCC。

引數

  • [輸入] mpc - MPC 上下文。

  • [輸入] opp_id - 要在其上鎖定游標更新的 OPP

  • [輸入] lock - 鎖定/解鎖 OPP

返回

void

insert_plane_to_secondary

根據指定的混合位置將 DPP 新增到輔助 MPC 樹中。 僅用於作為 DWB 輸出的混合鏈的一部分的平面

引數

  • [輸入/輸出] mpc - MPC 上下文。

  • [輸入/輸出] tree - 將要新增平面的 MPC 樹結構。

  • [輸入] blnd_cfg - 新混合層的 MPCC 混合配置。

  • [輸入] sm_cfg - 新混合層的 MPCC 立體混合配置。

    立體混合必須停用樹配置的最底層。

  • [輸入] insert_above_mpcc - 在此 MPCC 之上插入新平面。 如果

    NULL,則作為底層平面插入。

  • [輸入] dpp_id - 要新增的平面的 DPP 例項。

  • [輸入] mpcc_id - 用於混合的 MPCC 物理例項。

返回

struct mpcc* - 新增的 MPCC。

remove_mpcc_from_secondary

從 “輔助” MPC 樹中刪除指定的 DPP。

引數

  • [輸入/輸出] mpc - MPC 上下文。

  • [輸入/輸出] tree - 將從中刪除平面的 MPC 樹結構。

  • [輸入] mpcc - 要從樹中刪除的 MPCC。

返回

void

get_mpcc_for_dpp_from_secondary

如果存在,則從與指定平面關聯的給定 “輔助” MPC 樹中查詢 MPCC。

引數:- [輸入/輸出] tree - 要搜尋平面的 MPC 樹結構。 - [輸入] dpp_id - 要搜尋的 DPP。

返回

struct mpcc* - 指向平面的指標;如果未找到平面,則為 NULL。

get_mpcc_for_dpp

如果存在,則從與指定平面關聯的給定 MPC 樹中查詢 MPCC。

引數:- [輸入/輸出] tree - 要搜尋平面的 MPC 樹結構。 - [輸入] dpp_id - 要搜尋的 DPP。

返回

struct mpcc* - 指向平面的指標;如果未找到平面,則為 NULL。

wait_for_idle

等待 MPC 上下文中的 MPCC 進入空閒狀態。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] id - 要等待空閒狀態的 MPCC。

返回

void

assert_mpcc_idle_before_connect

斷言 MPC 上下文中的 MPCC 是否處於空閒狀態。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] id - 要斷言空閒狀態的 MPCC。

返回

void

init_mpcc_list_from_hw

從給定的 MPC 上下文結構迭代 MPCC 陣列,並根據其暫存器的值配置每個 MPCC。

引數:- [輸入/輸出] mpc - 要初始化 MPCC 陣列的 MPC 上下文。 - [輸入/輸出] tree - 包含要初始化的 MPCC 上下文的 MPC 樹結構。

返回

void

set_denorm

基於給定的顏色深度,將相應的 OPP DENORM_CONTROL 暫存器值設定為特定的 denorm_mode。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] opp_id - 要更新暫存器的相應 OPP。 - [輸入] output_depth - 設定 denorm_mode 的任意顏色深度。

返回

void

set_denorm_clamp

在相應的 OPP DENORM CONTROL 暫存器上設定 denorm 鉗位值。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] opp_id - 要更新暫存器的相應 OPP。 - [輸入] denorm_clamp - 要設定的任意 denorm 鉗位。

返回

void

set_output_csc

使用給定的值和模式設定輸出顏色空間轉換矩陣。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] opp_id - 要更新暫存器的相應 OPP。 - [輸入] regval - 要在 CSC 矩陣中設定的值。 - [輸入] ocsc_mode - 要設定 CSC 的模式。

返回

void

set_ocsc_default

根據顏色空間將輸出顏色空間轉換矩陣設定為預設值。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] opp_id - 要更新暫存器的相應 OPP。 - [輸入] color_space - OCSC 顏色空間。 - [輸入] ocsc_mode - 要設定 CSC 的模式。

返回

void

set_output_gamma

使用給定的曲線引數設定輸出伽馬。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] mpcc_id - 要更新暫存器的相應 MPC。 - [輸入] params - 引數。

返回

void

power_on_mpc_mem_pwr

開啟/關閉給定 MPCC 的記憶體 LUT 電源。 開啟電源啟用 LUT 進行更新。 關閉電源允許進入低功耗模式。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] mpcc_id - 要開啟電源的 MPCC。 - [輸入] power_on

返回

void

set_dwb_mux

將相應的顯示寫回多路複用器 MPC 暫存器欄位設定為給定的 MPCC id。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] dwb_id - 要設定的 DWB。 - [輸入] mpcc_id - 要儲存在 DWB 多路複用器暫存器中的 MPCC id。

返回

void

disable_dwb_mux

重置相應的顯示寫回多路複用器 MPC 暫存器欄位.

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] dwb_id - 要設定的 DWB。

返回

void

is_dwb_idle

檢查 MPC_DWB0_MUX_STATUS 暫存器欄位上的 DWB 狀態。 如果為空,則返回。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] dwb_id - 要檢查的 DWB。

返回

bool - DWB 是否空閒

set_out_rate_control

設定顯示輸出速率控制。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] opp_id - 要設定的 OPP。 - [輸入] enable - [輸入] rate_2x_mode - [輸入] flow_control

返回

void

set_gamut_remap

為給定的 MPCC 設定混合後 CTM。

引數:- [輸入] mpc - MPC 上下文。 - [輸入] mpcc_id - 要設定色域對映的 MPCC。 - [輸入] adjust

返回

void

program_1dlut

設定一維查詢表。

引數:- [輸入/輸出] mpc - MPC 上下文 - [輸入] params - LUT 配置的曲線引數 - [輸入] rmu_idx

bool - LUT 是否已設定(使用給定的引數設定)或未設定(params 為 NULL 並且 LUT 已停用)。

program_shaper

設定整形器。

引數:- [輸入/輸出] mpc - MPC 上下文 - [輸入] params - 要設定的曲線引數 - [輸入] rmu_idx

返回

bool - 整形器是否已設定(使用給定的引數設定)或未設定(params 為 NULL 並且 LUT 已停用)。

acquire_rmu

設定給定的 MPCC 以多路複用到給定的 RMU 單元。

引數:- [輸入/輸出] mpc - MPC 上下文 - [輸入] mpcc_id - MPCC - [輸入] rmu_idx - 給定的 RMU 單元以設定 MPCC 以多路複用到。

返回

unit32_t - 如果操作成功,則為 rmu_idx,否則為 -1。

program_3dlut

設定三維查詢表。

引數:- [輸入/輸出] mpc - MPC 上下文 - [輸入] params - LUT 配置的四面體引數 - [輸入] rmu_idx

bool - LUT 是否已設定(使用給定的引數設定)或未設定(params 為 NULL 並且 LUT 已停用)。

release_rmu

對於給定的 MPCC,釋放它多路複用到的 RMU 單元。

引數:- [輸入/輸出] mpc - MPC 上下文 - [輸入] mpcc_id - MPCC

返回

int - 表示已釋放的 RMU 單元的有效 rmu_idx,如果不存在要釋放的 RMU 單元,則為 -1。

get_mpc_out_mux

返回 MPC 輸出多路複用器。

引數:- [輸入] mpc - MPC 上下文。 - [輸入] opp_id - OPP

返回

unsigned int - 輸出多路複用器

set_bg_color

查詢相應的最底層 MPCC 並設定其背景顏色。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] bg_color - 要設定的背景顏色。 - [輸入] mpcc_id

返回

void

set_mpc_mem_lp_mode

設定 mpc_mem_lp_mode。

引數:- [輸入/輸出] mpc - MPC 上下文。

返回

void

set_movable_cm_location

設定可移動 CM 位置。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] location - [輸入] mpcc_id

返回

void

update_3dlut_fast_load_select

更新 3D LUT 快速載入選擇。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] mpcc_id - [輸入] hubp_idx

返回

void

populate_lut

使用給定的四面體引數填充 LUT。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] id - [輸入] params - [輸入] lut_bank_a - [輸入] mpcc_id

返回

void

program_lut_read_write_control

程式 LUT RW 控制。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] id - [輸入] lut_bank_a - [輸入] mpcc_id

返回

void

program_lut_mode

程式 LUT 模式。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] id - [輸入] xable - [輸入] lut_bank_a - [輸入] mpcc_id

返回

void

program_3dlut_size

程式 3D LUT 大小。

引數:- [輸入/輸出] mpc - MPC 上下文。 - [輸入] is_17x17x17 - 3dlut 是否為 17x17x17 - [輸入] mpcc_id

返回

void

OPP

輸出平面處理器 (OPP) 塊組具有格式化畫素流的功能,使其適合在顯示裝置上顯示。 OPP 中包含的關鍵功能是

  • 自適應背光調製 (ABM)

  • 格式化程式 (FMT),它為格式化傳入的畫素流提供逐畫素操作。

  • 提供畫素複製和重疊的輸出緩衝區。

  • MPC 和 OPTC 之間的介面。

  • 時鐘和復位生成。

  • CRC 生成。

struct pwl_float_data

定點 RGB 顏色

定義:

struct pwl_float_data {
    struct fixed31_32 r;
    struct fixed31_32 g;
    struct fixed31_32 b;
};

成員

r

分量紅色。

g

分量綠色。

b

分量藍色。

DIO

顯示輸入輸出 (DIO) 是 DCN 中的顯示輸入和輸出單元。 它包括輸出編碼器,以支援不同的顯示輸出,如 DisplayPort、HDMI、DVI 介面等。 它還包括這些介面的控制和狀態通道。

檢查 link_hwss 是否可訪問

引數

const struct dc_link *link

引用包含一個或多個接收器和連線狀態的連結結構。

const struct link_resource *link_res

用於啟用連結的可對映硬體資源。

返回

如果連結編碼器可以從連結訪問,則返回 true。

返回 link_hwss 引用

引數

void

無引數

描述

此函式的作用類似於 get 函式,用於返回在 link_hwss_dio.c 檔案中填充的 link_hwss。

返回

返回指向填充的 link_hwss 結構的引用。