diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c index 81b842270db9..7480f072c375 100644 --- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c @@ -820,6 +820,7 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma, struct fixed31_32 clip = dc_fixpt_one; struct fixed31_32 output; bool use_eetf = false; + bool is_clipped = false; struct fixed31_32 sdr_white_level = dc_fixpt_from_int(fs_params->sdr_white_level); if (fs_params == NULL || fs_params->max_content == 0 || @@ -844,25 +845,32 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma, rgb += 32; // first 32 points have problems with fixed point, too small coord_x += 32; for (i = 32; i <= hw_points_num; i++) { - if (use_eetf) { - /*max content is equal 1 */ - scaledX1 = dc_fixpt_div(coord_x->x, - dc_fixpt_div(max_content, sdr_white_level)); - hermite_spline_eetf(scaledX1, max_display, min_display, - max_content, &scaledX); - } else - scaledX = dc_fixpt_div(coord_x->x, - dc_fixpt_div(max_display, sdr_white_level)); + if (!is_clipped) { + if (use_eetf) { + /*max content is equal 1 */ + scaledX1 = dc_fixpt_div(coord_x->x, + dc_fixpt_div(max_content, sdr_white_level)); + hermite_spline_eetf(scaledX1, max_display, min_display, + max_content, &scaledX); + } else + scaledX = dc_fixpt_div(coord_x->x, + dc_fixpt_div(max_display, sdr_white_level)); - if (dc_fixpt_lt(scaledX, clip)) { - if (dc_fixpt_lt(scaledX, dc_fixpt_zero)) - output = dc_fixpt_zero; - else - output = calculate_gamma22(scaledX); + if (dc_fixpt_lt(scaledX, clip)) { + if (dc_fixpt_lt(scaledX, dc_fixpt_zero)) + output = dc_fixpt_zero; + else + output = calculate_gamma22(scaledX); - rgb->r = output; - rgb->g = output; - rgb->b = output; + rgb->r = output; + rgb->g = output; + rgb->b = output; + } else { + is_clipped = true; + rgb->r = clip; + rgb->g = clip; + rgb->b = clip; + } } else { rgb->r = clip; rgb->g = clip;