drm/amd/display: Internal refactoring to abstract color caps
[Why&How] modules/color calculates various colour operations which are translated to abstracted HW. DCE 5-12 had almost no important changes, but starting with DCN1, every new generation comes with fairly major differences in color pipeline. We would hack it with some DCN checks, but a better approach is to abstract color pipe capabilities so modules/DM can decide mapping to HW block based on logical capabilities, Signed-off-by: Krunoslav Kovac <Krunoslav.Kovac@amd.com> Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: Anthony Koo <Anthony.Koo@amd.com> Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -98,6 +98,49 @@ struct dc_plane_cap {
|
||||
} max_downscale_factor;
|
||||
};
|
||||
|
||||
// Color management caps (DPP and MPC)
|
||||
struct rom_curve_caps {
|
||||
uint16_t srgb : 1;
|
||||
uint16_t bt2020 : 1;
|
||||
uint16_t gamma2_2 : 1;
|
||||
uint16_t pq : 1;
|
||||
uint16_t hlg : 1;
|
||||
};
|
||||
|
||||
struct dpp_color_caps {
|
||||
uint16_t dcn_arch : 1; // all DCE generations treated the same
|
||||
// input lut is different than most LUTs, just plain 256-entry lookup
|
||||
uint16_t input_lut_shared : 1; // shared with DGAM
|
||||
uint16_t icsc : 1;
|
||||
uint16_t dgam_ram : 1;
|
||||
uint16_t post_csc : 1; // before gamut remap
|
||||
uint16_t gamma_corr : 1;
|
||||
|
||||
// hdr_mult and gamut remap always available in DPP (in that order)
|
||||
// 3d lut implies shaper LUT,
|
||||
// it may be shared with MPC - check MPC:shared_3d_lut flag
|
||||
uint16_t hw_3d_lut : 1;
|
||||
uint16_t ogam_ram : 1; // blnd gam
|
||||
uint16_t ocsc : 1;
|
||||
struct rom_curve_caps dgam_rom_caps;
|
||||
struct rom_curve_caps ogam_rom_caps;
|
||||
};
|
||||
|
||||
struct mpc_color_caps {
|
||||
uint16_t gamut_remap : 1;
|
||||
uint16_t ogam_ram : 1;
|
||||
uint16_t ocsc : 1;
|
||||
uint16_t num_3dluts : 3; //3d lut always assumes a preceding shaper LUT
|
||||
uint16_t shared_3d_lut:1; //can be in either DPP or MPC, but single instance
|
||||
|
||||
struct rom_curve_caps ogam_rom_caps;
|
||||
};
|
||||
|
||||
struct dc_color_caps {
|
||||
struct dpp_color_caps dpp;
|
||||
struct mpc_color_caps mpc;
|
||||
};
|
||||
|
||||
struct dc_caps {
|
||||
uint32_t max_streams;
|
||||
uint32_t max_links;
|
||||
@@ -120,9 +163,9 @@ struct dc_caps {
|
||||
bool psp_setup_panel_mode;
|
||||
bool extended_aux_timeout_support;
|
||||
bool dmcub_support;
|
||||
bool hw_3d_lut;
|
||||
enum dp_protocol_version max_dp_protocol_version;
|
||||
struct dc_plane_cap planes[MAX_PLANES];
|
||||
struct dc_color_caps color;
|
||||
};
|
||||
|
||||
struct dc_bug_wa {
|
||||
|
@@ -1384,6 +1384,40 @@ static bool dcn10_resource_construct(
|
||||
/* Raven DP PHY HBR2 eye diagram pattern is not stable. Use TP4 */
|
||||
dc->caps.force_dp_tps4_for_cp2520 = true;
|
||||
|
||||
/* Color pipeline capabilities */
|
||||
dc->caps.color.dpp.dcn_arch = 1;
|
||||
dc->caps.color.dpp.input_lut_shared = 1;
|
||||
dc->caps.color.dpp.icsc = 1;
|
||||
dc->caps.color.dpp.dgam_ram = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.dpp.dgam_rom_caps.pq = 0;
|
||||
dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
|
||||
dc->caps.color.dpp.post_csc = 0;
|
||||
dc->caps.color.dpp.gamma_corr = 0;
|
||||
|
||||
dc->caps.color.dpp.hw_3d_lut = 0;
|
||||
dc->caps.color.dpp.ogam_ram = 1; // RGAM on DCN1
|
||||
dc->caps.color.dpp.ogam_rom_caps.srgb = 1;
|
||||
dc->caps.color.dpp.ogam_rom_caps.bt2020 = 1;
|
||||
dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.pq = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.dpp.ocsc = 1;
|
||||
|
||||
/* no post-blend color operations */
|
||||
dc->caps.color.mpc.gamut_remap = 0;
|
||||
dc->caps.color.mpc.num_3dluts = 0;
|
||||
dc->caps.color.mpc.shared_3d_lut = 0;
|
||||
dc->caps.color.mpc.ogam_ram = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.pq = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.mpc.ocsc = 0;
|
||||
|
||||
if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
|
||||
dc->debug = debug_defaults_drv;
|
||||
else
|
||||
|
@@ -3709,9 +3709,42 @@ static bool dcn20_resource_construct(
|
||||
dc->caps.max_slave_planes = 1;
|
||||
dc->caps.post_blend_color_processing = true;
|
||||
dc->caps.force_dp_tps4_for_cp2520 = true;
|
||||
dc->caps.hw_3d_lut = true;
|
||||
dc->caps.extended_aux_timeout_support = true;
|
||||
|
||||
/* Color pipeline capabilities */
|
||||
dc->caps.color.dpp.dcn_arch = 1;
|
||||
dc->caps.color.dpp.input_lut_shared = 0;
|
||||
dc->caps.color.dpp.icsc = 1;
|
||||
dc->caps.color.dpp.dgam_ram = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.dpp.dgam_rom_caps.pq = 0;
|
||||
dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
|
||||
dc->caps.color.dpp.post_csc = 0;
|
||||
dc->caps.color.dpp.gamma_corr = 0;
|
||||
|
||||
dc->caps.color.dpp.hw_3d_lut = 1;
|
||||
dc->caps.color.dpp.ogam_ram = 1;
|
||||
// no OGAM ROM on DCN2, only MPC ROM
|
||||
dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.pq = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.dpp.ocsc = 0;
|
||||
|
||||
dc->caps.color.mpc.gamut_remap = 0;
|
||||
dc->caps.color.mpc.num_3dluts = 0;
|
||||
dc->caps.color.mpc.shared_3d_lut = 0;
|
||||
dc->caps.color.mpc.ogam_ram = 1;
|
||||
dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.pq = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.mpc.ocsc = 1;
|
||||
|
||||
if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV) {
|
||||
dc->debug = debug_defaults_drv;
|
||||
} else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) {
|
||||
|
@@ -1798,7 +1798,6 @@ static bool dcn21_resource_construct(
|
||||
dc->caps.i2c_speed_in_khz = 100;
|
||||
dc->caps.max_cursor_size = 256;
|
||||
dc->caps.dmdata_alloc_size = 2048;
|
||||
dc->caps.hw_3d_lut = true;
|
||||
|
||||
dc->caps.max_slave_planes = 1;
|
||||
dc->caps.post_blend_color_processing = true;
|
||||
@@ -1807,6 +1806,40 @@ static bool dcn21_resource_construct(
|
||||
dc->caps.dmcub_support = true;
|
||||
dc->caps.is_apu = true;
|
||||
|
||||
/* Color pipeline capabilities */
|
||||
dc->caps.color.dpp.dcn_arch = 1;
|
||||
dc->caps.color.dpp.input_lut_shared = 0;
|
||||
dc->caps.color.dpp.icsc = 1;
|
||||
dc->caps.color.dpp.dgam_ram = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.srgb = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.bt2020 = 1;
|
||||
dc->caps.color.dpp.dgam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.dpp.dgam_rom_caps.pq = 0;
|
||||
dc->caps.color.dpp.dgam_rom_caps.hlg = 0;
|
||||
dc->caps.color.dpp.post_csc = 0;
|
||||
dc->caps.color.dpp.gamma_corr = 0;
|
||||
|
||||
dc->caps.color.dpp.hw_3d_lut = 1;
|
||||
dc->caps.color.dpp.ogam_ram = 1;
|
||||
// no OGAM ROM on DCN2
|
||||
dc->caps.color.dpp.ogam_rom_caps.srgb = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.bt2020 = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.pq = 0;
|
||||
dc->caps.color.dpp.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.dpp.ocsc = 0;
|
||||
|
||||
dc->caps.color.mpc.gamut_remap = 0;
|
||||
dc->caps.color.mpc.num_3dluts = 0;
|
||||
dc->caps.color.mpc.shared_3d_lut = 0;
|
||||
dc->caps.color.mpc.ogam_ram = 1;
|
||||
dc->caps.color.mpc.ogam_rom_caps.srgb = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.bt2020 = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.gamma2_2 = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.pq = 0;
|
||||
dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.mpc.ocsc = 1;
|
||||
|
||||
if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
|
||||
dc->debug = debug_defaults_drv;
|
||||
else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) {
|
||||
|
Reference in New Issue
Block a user