Skip to content

Commit 6db6e56

Browse files
Paloma Arellanolumag
authored andcommitted
drm/msm/dp: change clock related programming for YUV420 over DP
Change all relevant DP controller related programming for YUV420 cases. Namely, change the pixel clock math to consider YUV420 and modify the MVID programming to consider YUV420. Changes in v2: - Move configuration control programming to a different commit - Slight code simplification - Add VSC SDP check when doing mode_pclk_khz division in dp_bridge_mode_valid Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/579640/ Link: https://lore.kernel.org/r/20240222194025.25329-12-quic_parellan@quicinc.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
1 parent 683d374 commit 6db6e56

4 files changed

Lines changed: 15 additions & 5 deletions

File tree

drivers/gpu/drm/msm/dp/dp_catalog.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ void dp_catalog_ctrl_config_misc(struct dp_catalog *dp_catalog,
452452

453453
void dp_catalog_ctrl_config_msa(struct dp_catalog *dp_catalog,
454454
u32 rate, u32 stream_rate_khz,
455-
bool fixed_nvid)
455+
bool fixed_nvid, bool is_ycbcr_420)
456456
{
457457
u32 pixel_m, pixel_n;
458458
u32 mvid, nvid, pixel_div = 0, dispcc_input_rate;
@@ -495,6 +495,9 @@ void dp_catalog_ctrl_config_msa(struct dp_catalog *dp_catalog,
495495
nvid = temp;
496496
}
497497

498+
if (is_ycbcr_420)
499+
mvid /= 2;
500+
498501
if (link_rate_hbr2 == rate)
499502
nvid *= 2;
500503

drivers/gpu/drm/msm/dp/dp_catalog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void dp_catalog_ctrl_mainlink_ctrl(struct dp_catalog *dp_catalog, bool enable);
9494
void dp_catalog_ctrl_psr_mainlink_enable(struct dp_catalog *dp_catalog, bool enable);
9595
void dp_catalog_ctrl_config_misc(struct dp_catalog *dp_catalog, u32 cc, u32 tb);
9696
void dp_catalog_ctrl_config_msa(struct dp_catalog *dp_catalog, u32 rate,
97-
u32 stream_rate_khz, bool fixed_nvid);
97+
u32 stream_rate_khz, bool fixed_nvid, bool is_ycbcr_420);
9898
int dp_catalog_ctrl_set_pattern_state_bit(struct dp_catalog *dp_catalog, u32 pattern);
9999
u32 dp_catalog_hw_revision(const struct dp_catalog *dp_catalog);
100100
void dp_catalog_ctrl_reset(struct dp_catalog *dp_catalog);

drivers/gpu/drm/msm/dp/dp_ctrl.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,7 @@ static void dp_ctrl_calc_tu_parameters(struct dp_ctrl_private *ctrl,
969969
in.hporch = drm_mode->htotal - drm_mode->hdisplay;
970970
in.nlanes = ctrl->link->link_params.num_lanes;
971971
in.bpp = ctrl->panel->dp_mode.bpp;
972-
in.pixel_enc = 444;
972+
in.pixel_enc = ctrl->panel->dp_mode.out_fmt_is_yuv_420 ? 420 : 444;
973973
in.dsc_en = 0;
974974
in.async_en = 0;
975975
in.fec_en = 0;
@@ -1852,6 +1852,8 @@ int dp_ctrl_on_link(struct dp_ctrl *dp_ctrl)
18521852
ctrl->link->link_params.rate = rate;
18531853
ctrl->link->link_params.num_lanes =
18541854
ctrl->panel->link_info.num_lanes;
1855+
if (ctrl->panel->dp_mode.out_fmt_is_yuv_420)
1856+
pixel_rate >>= 1;
18551857
}
18561858

18571859
drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n",
@@ -1967,7 +1969,7 @@ int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train)
19671969

19681970
pixel_rate = pixel_rate_orig = ctrl->panel->dp_mode.drm_mode.clock;
19691971

1970-
if (dp_ctrl->wide_bus_en)
1972+
if (dp_ctrl->wide_bus_en || ctrl->panel->dp_mode.out_fmt_is_yuv_420)
19711973
pixel_rate >>= 1;
19721974

19731975
drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n",
@@ -2019,7 +2021,8 @@ int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train)
20192021

20202022
dp_catalog_ctrl_config_msa(ctrl->catalog,
20212023
ctrl->link->link_params.rate,
2022-
pixel_rate_orig, dp_ctrl_use_fixed_nvid(ctrl));
2024+
pixel_rate_orig, dp_ctrl_use_fixed_nvid(ctrl),
2025+
ctrl->panel->dp_mode.out_fmt_is_yuv_420);
20232026

20242027
dp_ctrl_setup_tr_unit(ctrl);
20252028

drivers/gpu/drm/msm/dp/dp_display.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,10 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,
915915
dp_display = container_of(dp, struct dp_display_private, dp_display);
916916
link_info = &dp_display->panel->link_info;
917917

918+
if (drm_mode_is_420_only(&dp->connector->display_info, mode) &&
919+
dp_display->panel->vsc_sdp_supported)
920+
mode_pclk_khz /= 2;
921+
918922
mode_bpp = dp->connector->display_info.bpc * num_components;
919923
if (!mode_bpp)
920924
mode_bpp = default_bpp;

0 commit comments

Comments
 (0)