diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0793-drm-amd-dal-implement-ipp-opp-bypass.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0793-drm-amd-dal-implement-ipp-opp-bypass.patch | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0793-drm-amd-dal-implement-ipp-opp-bypass.patch b/common/recipes-kernel/linux/files/0793-drm-amd-dal-implement-ipp-opp-bypass.patch new file mode 100644 index 00000000..b601cf49 --- /dev/null +++ b/common/recipes-kernel/linux/files/0793-drm-amd-dal-implement-ipp-opp-bypass.patch @@ -0,0 +1,265 @@ +From 05558c0014a8623fa80476ead752aa294d14513f Mon Sep 17 00:00:00 2001 +From: Yongqiang Sun <yongqiang.sun@amd.com> +Date: Wed, 10 Feb 2016 14:29:59 -0500 +Subject: [PATCH 0793/1110] drm/amd/dal: implement ipp opp bypass. + +If gamma pointer in surface is null, it means +no gamma setting needed, in that case, set regamma_control +mode to bypass. + +Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + drivers/gpu/drm/amd/dal/dc/core/dc_target.c | 16 +++++------ + .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 15 +++++++---- + drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c | 3 ++- + drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h | 7 +++-- + .../gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma.c | 31 +++++++++++++--------- + .../drm/amd/dal/dc/dce110/dce110_opp_regamma_v.c | 2 +- + drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.c | 2 +- + drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.h | 2 +- + drivers/gpu/drm/amd/dal/dc/inc/opp.h | 12 ++++----- + 9 files changed, 49 insertions(+), 41 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c +index f00b5af..6b778d8 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c +@@ -258,6 +258,7 @@ bool dc_commit_surfaces_to_target( + DC_SURFACE_TO_CORE(dc_surface); + struct pipe_ctx *pipe_ctx = + &context->res_ctx.pipe_ctx[j]; ++ struct core_gamma *gamma = NULL; + + if (pipe_ctx->surface != + DC_SURFACE_TO_CORE(new_surfaces[i])) +@@ -279,15 +280,14 @@ bool dc_commit_surfaces_to_target( + dc_surface->dst_rect.width, + dc_surface->dst_rect.height); + +- if (dc_surface->gamma_correction) { +- struct core_gamma *gamma = DC_GAMMA_TO_CORE( +- dc_surface->gamma_correction); ++ if (surface->public.gamma_correction) ++ gamma = DC_GAMMA_TO_CORE( ++ surface->public.gamma_correction); + +- dc->hwss.set_gamma_correction( +- pipe_ctx->ipp, +- pipe_ctx->opp, +- gamma, surface); +- } ++ dc->hwss.set_gamma_correction( ++ pipe_ctx->ipp, ++ pipe_ctx->opp, ++ gamma, surface); + + dc->hwss.set_plane_config(dc, surface, pipe_ctx); + +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c +index 70349a0..810f6d5 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c +@@ -525,11 +525,16 @@ static bool set_gamma_ramp( + + ipp->funcs->ipp_program_prescale(ipp, prescale_params); + +- ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_sRGB); +- +- calculate_regamma_params(regamma_params, temp_params, ramp, surface); +- +- opp->funcs->opp_set_regamma(opp, regamma_params); ++ if (ramp) { ++ calculate_regamma_params(regamma_params, ++ temp_params, ramp, surface); ++ opp->funcs->opp_program_regamma_pwl(opp, regamma_params); ++ ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_sRGB); ++ opp->funcs->opp_set_regamma_mode(opp, OPP_REGAMMA_USER); ++ } else { ++ ipp->funcs->ipp_set_degamma(ipp, IPP_DEGAMMA_MODE_BYPASS); ++ opp->funcs->opp_set_regamma_mode(opp, OPP_REGAMMA_BYPASS); ++ } + + opp->funcs->opp_power_on_regamma_lut(opp, false); + +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c +index 86bf8c0..c06cf38 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.c +@@ -49,7 +49,8 @@ struct opp_funcs funcs = { + .opp_set_csc_adjustment = dce110_opp_set_csc_adjustment, + .opp_set_csc_default = dce110_opp_set_csc_default, + .opp_set_dyn_expansion = dce110_opp_set_dyn_expansion, +- .opp_set_regamma = dce110_opp_set_regamma, ++ .opp_program_regamma_pwl = dce110_opp_program_regamma_pwl, ++ .opp_set_regamma_mode = dce110_opp_set_regamma_mode, + .opp_destroy = dce110_opp_destroy, + }; + +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h +index 3460e18..a19e744 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp.h +@@ -107,13 +107,12 @@ void dce110_opp_power_on_regamma_lut( + struct output_pixel_processor *opp, + bool power_on); + +-bool dce110_opp_set_regamma( ++bool dce110_opp_program_regamma_pwl( + struct output_pixel_processor *opp, + const struct regamma_params *params); + +-void dce110_opp_power_on_regamma_lut( +- struct output_pixel_processor *opp, +- bool power_on); ++void dce110_opp_set_regamma_mode(struct output_pixel_processor *opp, ++ enum opp_regamma mode); + + void dce110_opp_set_csc_adjustment( + struct output_pixel_processor *opp, +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma.c +index f7a4bc2..88803eb 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma.c +@@ -393,18 +393,6 @@ static void program_pwl( + uint8_t max_tries = 10; + uint8_t counter = 0; + +- value = dm_read_reg(opp110->base.ctx, +- DCP_REG(mmREGAMMA_CONTROL)); +- +- set_reg_field_value( +- value, +- 3, +- REGAMMA_CONTROL, +- GRPH_REGAMMA_MODE); +- +- dm_write_reg(opp110->base.ctx, DCP_REG(mmREGAMMA_CONTROL), +- value); +- + /* Power on LUT memory */ + value = dm_read_reg(opp110->base.ctx, + DCFE_REG(mmDCFE_MEM_PWR_CTRL)); +@@ -495,7 +483,7 @@ static void program_pwl( + } + + +-bool dce110_opp_set_regamma( ++bool dce110_opp_program_regamma_pwl( + struct output_pixel_processor *opp, + const struct regamma_params *params) + { +@@ -533,3 +521,20 @@ void dce110_opp_power_on_regamma_lut( + + dm_write_reg(opp->ctx, DCFE_REG(mmDCFE_MEM_PWR_CTRL), value); + } ++ ++void dce110_opp_set_regamma_mode(struct output_pixel_processor *opp, ++ enum opp_regamma mode) ++{ ++ struct dce110_opp *opp110 = TO_DCE110_OPP(opp); ++ uint32_t value = dm_read_reg(opp110->base.ctx, ++ DCP_REG(mmREGAMMA_CONTROL)); ++ ++ set_reg_field_value( ++ value, ++ mode, ++ REGAMMA_CONTROL, ++ GRPH_REGAMMA_MODE); ++ ++ dm_write_reg(opp110->base.ctx, DCP_REG(mmREGAMMA_CONTROL), ++ value); ++} +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma_v.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma_v.c +index 4f6cc9c..b9d7eda 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma_v.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_regamma_v.c +@@ -491,7 +491,7 @@ static void program_pwl(struct dce110_opp *opp110, + } + } + +-bool dce110_opp_set_regamma_v( ++bool dce110_opp_program_regamma_pwl_v( + struct output_pixel_processor *opp, + const struct regamma_params *params) + { +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.c +index 9764940..367325f 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.c +@@ -39,7 +39,7 @@ + /*****************************************/ + + struct opp_funcs funcs = { +- .opp_set_regamma = dce110_opp_set_regamma_v, ++ .opp_program_regamma_pwl = dce110_opp_program_regamma_pwl_v, + + .opp_set_csc_default = dce110_opp_v_set_csc_default, + +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.h +index 56365aa..3f2ed4a 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.h ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_opp_v.h +@@ -47,7 +47,7 @@ void dce110_opp_v_set_csc_adjustment( + struct output_pixel_processor *opp, + const struct grph_csc_adjustment *adjust); + +-bool dce110_opp_set_regamma_v( ++bool dce110_opp_program_regamma_pwl_v( + struct output_pixel_processor *opp, + const struct regamma_params *params); + +diff --git a/drivers/gpu/drm/amd/dal/dc/inc/opp.h b/drivers/gpu/drm/amd/dal/dc/inc/opp.h +index 74dbea9..4924874 100644 +--- a/drivers/gpu/drm/amd/dal/dc/inc/opp.h ++++ b/drivers/gpu/drm/amd/dal/dc/inc/opp.h +@@ -36,7 +36,6 @@ struct fixed31_32; + struct gamma_parameters; + + /* TODO: Need cleanup */ +- + enum clamping_range { + CLAMPING_FULL_RANGE = 0, /* No Clamping */ + CLAMPING_LIMITED_RANGE_8BPC, /* 8 bpc: Clamping 1 to FE */ +@@ -243,14 +242,11 @@ struct pwl_float_data { + struct fixed31_32 b; + }; + +- +-/* TODO: Use when we redefine the OPP interface */ + enum opp_regamma { + OPP_REGAMMA_BYPASS = 0, + OPP_REGAMMA_SRGB, + OPP_REGAMMA_3_6, +- OPP_REGAMMA_PQ, +- OPP_REGAMMA_PQ_INTERIM, ++ OPP_REGAMMA_USER, + }; + + struct output_pixel_processor { +@@ -278,10 +274,13 @@ struct opp_funcs { + struct output_pixel_processor *opp, + bool power_on); + +- bool (*opp_set_regamma)( ++ bool (*opp_program_regamma_pwl)( + struct output_pixel_processor *opp, + const struct regamma_params *params); + ++ void (*opp_set_regamma_mode)(struct output_pixel_processor *opp, ++ enum opp_regamma mode); ++ + void (*opp_set_csc_adjustment)( + struct output_pixel_processor *opp, + const struct grph_csc_adjustment *adjust); +@@ -299,7 +298,6 @@ struct opp_funcs { + struct output_pixel_processor *opp, + const struct clamping_and_pixel_encoding_params *params); + +- + void (*opp_set_dyn_expansion)( + struct output_pixel_processor *opp, + enum color_space color_sp, +-- +2.7.4 + |