Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: extend delta clamping logic to CM3 LUT helper

Commit 27fc10d1095f ("drm/amd/display: Fix the delta clamping for shaper
LUT") fixed banding when using plane shaper LUT in DCN10 CM helper. The
problem is also present in DCN30 CM helper, fix banding by extending the
same bug delta clamping fix to CM3.

Signed-off-by: Melissa Wen <mwen@igalia.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 0274a54897f356f9c78767c4a2a5863f7dde90c6)

authored by

Melissa Wen and committed by
Alex Deucher
d25b32aa 8f959d37

+49 -25
+24 -6
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c
··· 105 105 #define NUMBER_REGIONS 32 106 106 #define NUMBER_SW_SEGMENTS 16 107 107 108 - bool cm3_helper_translate_curve_to_hw_format( 109 - const struct dc_transfer_func *output_tf, 110 - struct pwl_params *lut_params, bool fixpoint) 108 + #define DC_LOGGER \ 109 + ctx->logger 110 + 111 + bool cm3_helper_translate_curve_to_hw_format(struct dc_context *ctx, 112 + const struct dc_transfer_func *output_tf, 113 + struct pwl_params *lut_params, bool fixpoint) 111 114 { 112 115 struct curve_points3 *corner_points; 113 116 struct pwl_result_data *rgb_resulted; ··· 254 251 if (fixpoint == true) { 255 252 i = 1; 256 253 while (i != hw_points + 2) { 254 + uint32_t red_clamp; 255 + uint32_t green_clamp; 256 + uint32_t blue_clamp; 257 + 257 258 if (i >= hw_points) { 258 259 if (dc_fixpt_lt(rgb_plus_1->red, rgb->red)) 259 260 rgb_plus_1->red = dc_fixpt_add(rgb->red, ··· 270 263 rgb_minus_1->delta_blue); 271 264 } 272 265 273 - rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red); 274 - rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green); 275 - rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue); 266 + rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red); 267 + rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green); 268 + rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue); 269 + 270 + red_clamp = dc_fixpt_clamp_u0d14(rgb->delta_red); 271 + green_clamp = dc_fixpt_clamp_u0d14(rgb->delta_green); 272 + blue_clamp = dc_fixpt_clamp_u0d14(rgb->delta_blue); 273 + 274 + if (red_clamp >> 10 || green_clamp >> 10 || blue_clamp >> 10) 275 + DC_LOG_ERROR("Losing delta precision while programming shaper LUT."); 276 + 277 + rgb->delta_red_reg = red_clamp & 0x3ff; 278 + rgb->delta_green_reg = green_clamp & 0x3ff; 279 + rgb->delta_blue_reg = blue_clamp & 0x3ff; 276 280 rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red); 277 281 rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green); 278 282 rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);
+1 -1
drivers/gpu/drm/amd/display/dc/dwb/dcn30/dcn30_cm_common.h
··· 59 59 const struct pwl_params *params, 60 60 const struct dcn3_xfer_func_reg *reg); 61 61 62 - bool cm3_helper_translate_curve_to_hw_format( 62 + bool cm3_helper_translate_curve_to_hw_format(struct dc_context *ctx, 63 63 const struct dc_transfer_func *output_tf, 64 64 struct pwl_params *lut_params, bool fixpoint); 65 65
+5 -4
drivers/gpu/drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c
··· 239 239 if (plane_state->blend_tf.type == TF_TYPE_HWPWL) 240 240 blend_lut = &plane_state->blend_tf.pwl; 241 241 else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) { 242 - result = cm3_helper_translate_curve_to_hw_format( 242 + result = cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 243 243 &plane_state->blend_tf, &dpp_base->regamma_params, false); 244 244 if (!result) 245 245 return result; ··· 334 334 if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL) 335 335 params = &plane_state->in_transfer_func.pwl; 336 336 else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS && 337 - cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func, 338 - &dpp_base->degamma_params, false)) 337 + cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 338 + &plane_state->in_transfer_func, 339 + &dpp_base->degamma_params, false)) 339 340 params = &dpp_base->degamma_params; 340 341 341 342 result = dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params); ··· 407 406 params = &stream->out_transfer_func.pwl; 408 407 else if (pipe_ctx->stream->out_transfer_func.type == 409 408 TF_TYPE_DISTRIBUTED_POINTS && 410 - cm3_helper_translate_curve_to_hw_format( 409 + cm3_helper_translate_curve_to_hw_format(stream->ctx, 411 410 &stream->out_transfer_func, 412 411 &mpc->blender_params, false)) 413 412 params = &mpc->blender_params;
+10 -7
drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c
··· 486 486 if (plane_state->blend_tf.type == TF_TYPE_HWPWL) 487 487 lut_params = &plane_state->blend_tf.pwl; 488 488 else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) { 489 - result = cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf, 490 - &dpp_base->regamma_params, false); 489 + result = cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 490 + &plane_state->blend_tf, 491 + &dpp_base->regamma_params, false); 491 492 if (!result) 492 493 return result; 493 494 ··· 503 502 else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) { 504 503 // TODO: dpp_base replace 505 504 ASSERT(false); 506 - cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func, 507 - &dpp_base->shaper_params, true); 505 + cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 506 + &plane_state->in_shaper_func, 507 + &dpp_base->shaper_params, true); 508 508 lut_params = &dpp_base->shaper_params; 509 509 } 510 510 ··· 545 543 if (plane_state->in_transfer_func.type == TF_TYPE_HWPWL) 546 544 params = &plane_state->in_transfer_func.pwl; 547 545 else if (plane_state->in_transfer_func.type == TF_TYPE_DISTRIBUTED_POINTS && 548 - cm3_helper_translate_curve_to_hw_format(&plane_state->in_transfer_func, 549 - &dpp_base->degamma_params, false)) 546 + cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 547 + &plane_state->in_transfer_func, 548 + &dpp_base->degamma_params, false)) 550 549 params = &dpp_base->degamma_params; 551 550 552 551 dpp_base->funcs->dpp_program_gamcor_lut(dpp_base, params); ··· 578 575 params = &stream->out_transfer_func.pwl; 579 576 else if (pipe_ctx->stream->out_transfer_func.type == 580 577 TF_TYPE_DISTRIBUTED_POINTS && 581 - cm3_helper_translate_curve_to_hw_format( 578 + cm3_helper_translate_curve_to_hw_format(stream->ctx, 582 579 &stream->out_transfer_func, 583 580 &mpc->blender_params, false)) 584 581 params = &mpc->blender_params;
+9 -7
drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
··· 430 430 if (mcm_luts.lut1d_func->type == TF_TYPE_HWPWL) 431 431 m_lut_params.pwl = &mcm_luts.lut1d_func->pwl; 432 432 else if (mcm_luts.lut1d_func->type == TF_TYPE_DISTRIBUTED_POINTS) { 433 - rval = cm3_helper_translate_curve_to_hw_format( 433 + rval = cm3_helper_translate_curve_to_hw_format(mpc->ctx, 434 434 mcm_luts.lut1d_func, 435 435 &dpp_base->regamma_params, false); 436 436 m_lut_params.pwl = rval ? &dpp_base->regamma_params : NULL; ··· 450 450 m_lut_params.pwl = &mcm_luts.shaper->pwl; 451 451 else if (mcm_luts.shaper->type == TF_TYPE_DISTRIBUTED_POINTS) { 452 452 ASSERT(false); 453 - rval = cm3_helper_translate_curve_to_hw_format( 453 + rval = cm3_helper_translate_curve_to_hw_format(mpc->ctx, 454 454 mcm_luts.shaper, 455 455 &dpp_base->regamma_params, true); 456 456 m_lut_params.pwl = rval ? &dpp_base->regamma_params : NULL; ··· 627 627 if (plane_state->blend_tf.type == TF_TYPE_HWPWL) 628 628 lut_params = &plane_state->blend_tf.pwl; 629 629 else if (plane_state->blend_tf.type == TF_TYPE_DISTRIBUTED_POINTS) { 630 - rval = cm3_helper_translate_curve_to_hw_format(&plane_state->blend_tf, 631 - &dpp_base->regamma_params, false); 630 + rval = cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 631 + &plane_state->blend_tf, 632 + &dpp_base->regamma_params, false); 632 633 lut_params = rval ? &dpp_base->regamma_params : NULL; 633 634 } 634 635 result = mpc->funcs->program_1dlut(mpc, lut_params, mpcc_id); ··· 640 639 lut_params = &plane_state->in_shaper_func.pwl; 641 640 else if (plane_state->in_shaper_func.type == TF_TYPE_DISTRIBUTED_POINTS) { 642 641 // TODO: dpp_base replace 643 - rval = cm3_helper_translate_curve_to_hw_format(&plane_state->in_shaper_func, 644 - &dpp_base->shaper_params, true); 642 + rval = cm3_helper_translate_curve_to_hw_format(plane_state->ctx, 643 + &plane_state->in_shaper_func, 644 + &dpp_base->shaper_params, true); 645 645 lut_params = rval ? &dpp_base->shaper_params : NULL; 646 646 } 647 647 result &= mpc->funcs->program_shaper(mpc, lut_params, mpcc_id); ··· 676 674 params = &stream->out_transfer_func.pwl; 677 675 else if (pipe_ctx->stream->out_transfer_func.type == 678 676 TF_TYPE_DISTRIBUTED_POINTS && 679 - cm3_helper_translate_curve_to_hw_format( 677 + cm3_helper_translate_curve_to_hw_format(stream->ctx, 680 678 &stream->out_transfer_func, 681 679 &mpc->blender_params, false)) 682 680 params = &mpc->blender_params;