diff --git a/msm/dp/dp_ctrl.c b/msm/dp/dp_ctrl.c index 062a8e8580e48..be90c50c0e522 100644 --- a/msm/dp/dp_ctrl.c +++ b/msm/dp/dp_ctrl.c @@ -1002,7 +1002,7 @@ static void dp_ctrl_mst_calculate_rg(struct dp_ctrl_private *ctrl, u32 x_int = 0, y_frac_enum = 0; u64 target_strm_sym, ts_int_fixp, ts_frac_fixp, y_frac_enum_fixp; - if (panel->pinfo.comp_info.comp_ratio) + if (panel->pinfo.comp_info.comp_ratio > 1) bpp = DSC_BPP(panel->pinfo.comp_info.dsc_info.config); /* min_slot_cnt */ diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index 2288838300ae2..a7420c7bb9555 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -1721,7 +1721,7 @@ static void dp_display_update_dsc_resources(struct dp_display_private *dp, u32 dsc_blk_cnt = 0; if (panel->pinfo.comp_info.comp_type == MSM_DISPLAY_COMPRESSION_DSC && - panel->pinfo.comp_info.comp_ratio) { + (panel->pinfo.comp_info.comp_ratio > 1)) { dsc_blk_cnt = panel->pinfo.h_active / dp->parser->max_dp_dsc_input_width_pixs; if (panel->pinfo.h_active % @@ -2084,7 +2084,7 @@ static enum drm_mode_status dp_display_validate_mode( dp_display->convert_to_dp_mode(dp_display, panel, mode, &dp_mode); - dsc_en = dp_mode.timing.comp_info.comp_ratio ? true : false; + dsc_en = (dp_mode.timing.comp_info.comp_ratio > 1) ? true : false; mode_bpp = dsc_en ? DSC_BPP(dp_mode.timing.comp_info.dsc_info.config) : dp_mode.timing.bpp; diff --git a/msm/dp/dp_drm.c b/msm/dp/dp_drm.c index f7f6a003c28a6..a2022cf473457 100644 --- a/msm/dp/dp_drm.c +++ b/msm/dp/dp_drm.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #include @@ -418,7 +418,7 @@ int dp_connector_get_mode_info(struct drm_connector *connector, dp_disp->convert_to_dp_mode(dp_disp, dp_panel, drm_mode, &dp_mode); - if (dp_mode.timing.comp_info.comp_ratio) { + if (dp_mode.timing.comp_info.comp_ratio > 1) { memcpy(&mode_info->comp_info, &dp_mode.timing.comp_info, sizeof(mode_info->comp_info)); diff --git a/msm/dp/dp_mst_drm.c b/msm/dp/dp_mst_drm.c index cbbf5c4c5bc5d..f7ecb5542eedb 100644 --- a/msm/dp/dp_mst_drm.c +++ b/msm/dp/dp_mst_drm.c @@ -526,7 +526,7 @@ static int dp_mst_calc_pbn_mode(struct dp_display_mode *dp_mode) bool dsc_en; s64 pbn_fp; - dsc_en = dp_mode->timing.comp_info.comp_ratio ? true : false; + dsc_en = (dp_mode->timing.comp_info.comp_ratio > 1) ? true : false; bpp = dsc_en ? DSC_BPP(dp_mode->timing.comp_info.dsc_info.config) : dp_mode->timing.bpp; diff --git a/msm/dp/dp_panel.c b/msm/dp/dp_panel.c index 2b79572408cdc..b6ae4727a8cd8 100644 --- a/msm/dp/dp_panel.c +++ b/msm/dp/dp_panel.c @@ -20,6 +20,10 @@ #define VSC_EXT_VESA_SDP_SUPPORTED BIT(4) #define VSC_EXT_VESA_SDP_CHAINING_SUPPORTED BIT(5) +#define DP_COMPRESSION_RATIO_2_TO_1 2 +#define DP_COMPRESSION_RATIO_3_TO_1 3 +#define DP_COMPRESSION_RATIO_NONE 1 + enum dp_panel_hdr_pixel_encoding { RGB, YCbCr444, @@ -1001,16 +1005,8 @@ static void dp_panel_calc_tu_parameters(struct dp_panel *dp_panel, in.fec_en = dp_panel->fec_en; in.num_of_dsc_slices = pinfo->comp_info.dsc_info.slice_per_pkt; - switch (pinfo->comp_info.comp_ratio) { - case MSM_DISPLAY_COMPRESSION_RATIO_2_TO_1: - in.compress_ratio = 200; - break; - case MSM_DISPLAY_COMPRESSION_RATIO_3_TO_1: - in.compress_ratio = 300; - break; - default: - in.compress_ratio = 100; - } + if (pinfo->comp_info.comp_ratio) + in.compress_ratio = pinfo->comp_info.comp_ratio * 100; _dp_panel_calc_tu(&in, tu_table); } @@ -1064,32 +1060,25 @@ static void dp_panel_config_tr_unit(struct dp_panel *dp_panel) catalog->update_transfer_unit(catalog); } -struct dp_dsc_dto_data { - enum msm_display_compression_ratio comp_ratio; - u32 org_bpp; /* bits */ - u32 dto_numerator; - u32 dto_denominator; -}; - -struct dp_dsc_dto_data dto_tbl[] = { - {MSM_DISPLAY_COMPRESSION_RATIO_2_TO_1, 24, 1, 2}, - {MSM_DISPLAY_COMPRESSION_RATIO_2_TO_1, 30, 5, 8}, - {MSM_DISPLAY_COMPRESSION_RATIO_3_TO_1, 24, 1, 3}, - {MSM_DISPLAY_COMPRESSION_RATIO_3_TO_1, 30, 5, 12}, -}; - -static void _dp_panel_get_dto_m_n(enum msm_display_compression_ratio ratio, - u32 org_bpp, u32 *dto_n, u32 *dto_d) +static void dp_panel_get_dto_params(u8 comp_ratio, u32 *num, u32 *denom, + u32 org_bpp) { - u32 idx; - - for (idx = 0; idx < ARRAY_SIZE(dto_tbl); idx++) { - if (ratio == dto_tbl[idx].comp_ratio && - org_bpp == dto_tbl[idx].org_bpp) { - *dto_n = dto_tbl[idx].dto_numerator; - *dto_d = dto_tbl[idx].dto_denominator; - return; - } + if ((comp_ratio == 2) && (org_bpp == 24)) { + *num = 1; + *denom = 2; + } else if ((comp_ratio == 2) && (org_bpp == 30)) { + *num = 5; + *denom = 8; + } else if ((comp_ratio == 3) && (org_bpp == 24)) { + *num = 1; + *denom = 3; + } else if ((comp_ratio == 3) && (org_bpp == 30)) { + *num = 5; + *denom = 12; + } else { + DP_ERR("dto params not found\n"); + *num = 0; + *denom = 1; } } @@ -1134,7 +1123,7 @@ static void dp_panel_dsc_prepare_pps_packet(struct dp_panel *dp_panel) } static void _dp_panel_dsc_get_num_extra_pclk(struct msm_display_dsc_info *dsc, - enum msm_display_compression_ratio ratio) + u8 ratio) { unsigned int dto_n = 0, dto_d = 0, remainder; int ack_required, last_few_ack_required, accum_ack; @@ -1142,8 +1131,8 @@ static void _dp_panel_dsc_get_num_extra_pclk(struct msm_display_dsc_info *dsc, int start, temp, line_width = dsc->config.pic_width/2; s64 temp1_fp, temp2_fp; - _dp_panel_get_dto_m_n(ratio, dsc->config.bits_per_component * 3, - &dto_n, &dto_d); + dp_panel_get_dto_params(ratio, &dto_n, &dto_d, + dsc->config.bits_per_component * 3); ack_required = dsc->pclk_per_line; @@ -1219,7 +1208,7 @@ static void _dp_panel_dsc_bw_overhead_calc(struct dp_panel *dp_panel, static void dp_panel_dsc_pclk_param_calc(struct dp_panel *dp_panel, struct msm_display_dsc_info *dsc, - enum msm_display_compression_ratio ratio, + u8 ratio, struct dp_display_mode *dp_mode) { int comp_ratio, intf_width; @@ -1238,17 +1227,8 @@ static void dp_panel_dsc_pclk_param_calc(struct dp_panel *dp_panel, slice_per_intf = DIV_ROUND_UP(intf_width, dsc->config.slice_width); - switch (ratio) { - case MSM_DISPLAY_COMPRESSION_RATIO_2_TO_1: - comp_ratio = 200; - break; - case MSM_DISPLAY_COMPRESSION_RATIO_3_TO_1: - comp_ratio = 300; - break; - default: - comp_ratio = 100; - break; - } + if (ratio) + comp_ratio = ratio * 100; temp1_fp = drm_fixp_from_fraction(comp_ratio, 100); temp2_fp = drm_fixp_from_fraction(slice_per_pkt * 8, 1); @@ -1457,7 +1437,7 @@ static int dp_panel_dsc_prepare_basic_params( DIV_ROUND_UP(dp_mode->timing.h_active, slice_width); comp_info->comp_type = MSM_DISPLAY_COMPRESSION_DSC; - comp_info->comp_ratio = MSM_DISPLAY_COMPRESSION_RATIO_3_TO_1; + comp_info->comp_ratio = DP_COMPRESSION_RATIO_3_TO_1; return 0; } @@ -2136,16 +2116,12 @@ static u32 _dp_panel_calc_be_in_lane(struct dp_panel *dp_panel) if (!dp_panel->mst_state) return be_in_lane; - switch (pinfo->comp_info.comp_ratio) { - case MSM_DISPLAY_COMPRESSION_RATIO_2_TO_1: + if (pinfo->comp_info.comp_ratio == DP_COMPRESSION_RATIO_2_TO_1) denominator = 16; /* 2 * bits-in-byte */ - break; - case MSM_DISPLAY_COMPRESSION_RATIO_3_TO_1: + else if (pinfo->comp_info.comp_ratio == DP_COMPRESSION_RATIO_3_TO_1) denominator = 24; /* 3 * bits-in-byte */ - break; - default: - denominator = 8; /* 1 * bits-in-byte */ - } + else + denominator = 8; numerator = (pinfo->h_active + pinfo->h_back_porch + pinfo->h_front_porch + pinfo->h_sync_width) * @@ -2205,8 +2181,8 @@ static void dp_panel_config_dsc(struct dp_panel *dp_panel, bool enable) dsc->dsc_en = true; dsc->dto_en = true; - _dp_panel_get_dto_m_n(comp_info->comp_ratio, pinfo->bpp, - &dsc->dto_n, &dsc->dto_d); + dp_panel_get_dto_params(comp_info->comp_ratio, &dsc->dto_n, + &dsc->dto_d, pinfo->bpp); } else { dsc->dsc_en = false; dsc->dto_en = false; @@ -2957,9 +2933,11 @@ static void dp_panel_convert_to_dp_mode(struct dp_panel *dp_panel, dp_mode->timing.widebus_en = dp_panel->widebus_en; dp_mode->timing.dsc_overhead_fp = 0; - if (dp_panel->dsc_en && dsc_cap) { - comp_info = &dp_mode->timing.comp_info; + comp_info = &dp_mode->timing.comp_info; + comp_info->comp_ratio = DP_COMPRESSION_RATIO_NONE; + comp_info->comp_type = MSM_DISPLAY_COMPRESSION_NONE; + if (dp_panel->dsc_en && dsc_cap) { if (dp_panel_dsc_prepare_basic_params(comp_info, dp_mode, dp_panel)) { DP_DEBUG("prepare DSC basic params failed\n"); diff --git a/msm/dp/dp_panel.h b/msm/dp/dp_panel.h index 212b61524b229..9120c476f3480 100644 --- a/msm/dp/dp_panel.h +++ b/msm/dp/dp_panel.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. */ #ifndef _DP_PANEL_H_ diff --git a/msm/sde/sde_encoder_phys_vid.c b/msm/sde/sde_encoder_phys_vid.c index b41e49e457773..a8e779ab1a258 100644 --- a/msm/sde/sde_encoder_phys_vid.c +++ b/msm/sde/sde_encoder_phys_vid.c @@ -135,7 +135,8 @@ static void drm_mode_to_intf_timing_params( * compression ratio */ if (phys_enc->hw_intf->cap->type == INTF_DP && - (timing->wide_bus_en || vid_enc->base.comp_ratio)) { + (timing->wide_bus_en || + (vid_enc->base.comp_ratio > 1))) { timing->width = timing->width >> 1; timing->xres = timing->xres >> 1; timing->h_back_porch = timing->h_back_porch >> 1; @@ -143,7 +144,7 @@ static void drm_mode_to_intf_timing_params( timing->hsync_pulse_width = timing->hsync_pulse_width >> 1; if (vid_enc->base.comp_type == MSM_DISPLAY_COMPRESSION_DSC && - vid_enc->base.comp_ratio) { + (vid_enc->base.comp_ratio > 1)) { timing->compression_en = true; timing->extra_dto_cycles = vid_enc->base.dsc_extra_pclk_cycle_cnt;