Loading arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi +4 −2 Original line number Diff line number Diff line Loading @@ -493,7 +493,8 @@ qcom,mdss-dsi-t-clk-post = <0x0b>; qcom,mdss-dsi-t-clk-pre = <0x23>; qcom,display-topology = <1 1 1>, <2 2 1>; <2 2 1>, /* dsc merge */ <2 1 1>; /* 3d mux */ qcom,default-topology-index = <0>; }; Loading @@ -502,7 +503,8 @@ qcom,mdss-dsi-t-clk-post = <0x0b>; qcom,mdss-dsi-t-clk-pre = <0x23>; qcom,display-topology = <1 1 1>, <2 2 1>; <2 2 1>, /* dsc merge */ <2 1 1>; /* 3d mux */ qcom,default-topology-index = <0>; }; Loading drivers/gpu/drm/msm/sde/sde_crtc.c +42 −0 Original line number Diff line number Diff line Loading @@ -735,6 +735,25 @@ static int _sde_crtc_set_roi_v1(struct drm_crtc_state *state, return 0; } static bool _sde_crtc_setup_is_3dmux_dsc(struct drm_crtc_state *state) { int i; struct sde_crtc_state *cstate; bool is_3dmux_dsc = false; cstate = to_sde_crtc_state(state); for (i = 0; i < cstate->num_connectors; i++) { struct drm_connector *conn = cstate->connectors[i]; if (sde_connector_get_topology_name(conn) == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC) is_3dmux_dsc = true; } return is_3dmux_dsc; } static int _sde_crtc_set_crtc_roi(struct drm_crtc *crtc, struct drm_crtc_state *state) { Loading Loading @@ -768,6 +787,12 @@ static int _sde_crtc_set_crtc_roi(struct drm_crtc *crtc, sde_conn_state = to_sde_connector_state(conn_state); /* * current driver only supports same connector and crtc size, * but if support for different sizes is added, driver needs * to check the connector roi here to make sure is full screen * for dsc 3d-mux topology that doesn't support partial update. */ if (memcmp(&sde_conn_state->rois, &crtc_state->user_roi_list, sizeof(crtc_state->user_roi_list))) { SDE_ERROR("%s: crtc -> conn roi scaling unsupported\n", Loading @@ -778,6 +803,23 @@ static int _sde_crtc_set_crtc_roi(struct drm_crtc *crtc, sde_kms_rect_merge_rectangles(&crtc_state->user_roi_list, crtc_roi); /* * for 3dmux dsc, make sure is full ROI, since current driver doesn't * support partial update for this configuration. */ if (!sde_kms_rect_is_null(crtc_roi) && _sde_crtc_setup_is_3dmux_dsc(state)) { struct drm_display_mode *adj_mode = &state->adjusted_mode; if (crtc_roi->w != adj_mode->hdisplay || crtc_roi->h != adj_mode->vdisplay) { SDE_ERROR("%s: unsupported top roi[%d %d] wxh[%d %d]\n", sde_crtc->name, crtc_roi->w, crtc_roi->h, adj_mode->hdisplay, adj_mode->vdisplay); return -EINVAL; } } SDE_DEBUG("%s: crtc roi (%d,%d,%d,%d)\n", sde_crtc->name, crtc_roi->x, crtc_roi->y, crtc_roi->w, crtc_roi->h); Loading drivers/gpu/drm/msm/sde/sde_encoder.c +5 −3 Original line number Diff line number Diff line Loading @@ -651,7 +651,7 @@ static void _sde_encoder_get_connector_roi( sde_kms_rect_merge_rectangles(&c_state->rois, merged_conn_roi); } static int _sde_encoder_dsc_1_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) static int _sde_encoder_dsc_n_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) { int this_frame_slices; int intf_ip_w, enc_ip_w; Loading Loading @@ -692,6 +692,7 @@ static int _sde_encoder_dsc_1_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) return 0; } static int _sde_encoder_dsc_2_lm_2_enc_2_intf(struct sde_encoder_virt *sde_enc, struct sde_encoder_kickoff_params *params) { Loading Loading @@ -892,7 +893,7 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc, return -EINVAL; } SDE_DEBUG_ENC(sde_enc, "\n"); SDE_DEBUG_ENC(sde_enc, "topology:%d\n", topology); SDE_EVT32(DRMID(&sde_enc->base)); if (sde_kms_rect_is_equal(&sde_enc->cur_conn_roi, Loading @@ -901,7 +902,8 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc, switch (topology) { case SDE_RM_TOPOLOGY_SINGLEPIPE_DSC: ret = _sde_encoder_dsc_1_lm_1_enc_1_intf(sde_enc); case SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC: ret = _sde_encoder_dsc_n_lm_1_enc_1_intf(sde_enc); break; case SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE: ret = _sde_encoder_dsc_2_lm_2_enc_1_intf(sde_enc, params); Loading drivers/gpu/drm/msm/sde/sde_encoder_phys.h +2 −1 Original line number Diff line number Diff line Loading @@ -434,7 +434,8 @@ static inline enum sde_3d_blend_mode sde_encoder_helper_get_3d_blend_mode( topology = sde_connector_get_topology_name(phys_enc->connector); if (phys_enc->split_role == ENC_ROLE_SOLO && topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE) (topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE || topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC)) return BLEND_3D_H_ROW_INT; return BLEND_3D_NONE; Loading Loading
arch/arm64/boot/dts/qcom/sdm845-sde-display.dtsi +4 −2 Original line number Diff line number Diff line Loading @@ -493,7 +493,8 @@ qcom,mdss-dsi-t-clk-post = <0x0b>; qcom,mdss-dsi-t-clk-pre = <0x23>; qcom,display-topology = <1 1 1>, <2 2 1>; <2 2 1>, /* dsc merge */ <2 1 1>; /* 3d mux */ qcom,default-topology-index = <0>; }; Loading @@ -502,7 +503,8 @@ qcom,mdss-dsi-t-clk-post = <0x0b>; qcom,mdss-dsi-t-clk-pre = <0x23>; qcom,display-topology = <1 1 1>, <2 2 1>; <2 2 1>, /* dsc merge */ <2 1 1>; /* 3d mux */ qcom,default-topology-index = <0>; }; Loading
drivers/gpu/drm/msm/sde/sde_crtc.c +42 −0 Original line number Diff line number Diff line Loading @@ -735,6 +735,25 @@ static int _sde_crtc_set_roi_v1(struct drm_crtc_state *state, return 0; } static bool _sde_crtc_setup_is_3dmux_dsc(struct drm_crtc_state *state) { int i; struct sde_crtc_state *cstate; bool is_3dmux_dsc = false; cstate = to_sde_crtc_state(state); for (i = 0; i < cstate->num_connectors; i++) { struct drm_connector *conn = cstate->connectors[i]; if (sde_connector_get_topology_name(conn) == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC) is_3dmux_dsc = true; } return is_3dmux_dsc; } static int _sde_crtc_set_crtc_roi(struct drm_crtc *crtc, struct drm_crtc_state *state) { Loading Loading @@ -768,6 +787,12 @@ static int _sde_crtc_set_crtc_roi(struct drm_crtc *crtc, sde_conn_state = to_sde_connector_state(conn_state); /* * current driver only supports same connector and crtc size, * but if support for different sizes is added, driver needs * to check the connector roi here to make sure is full screen * for dsc 3d-mux topology that doesn't support partial update. */ if (memcmp(&sde_conn_state->rois, &crtc_state->user_roi_list, sizeof(crtc_state->user_roi_list))) { SDE_ERROR("%s: crtc -> conn roi scaling unsupported\n", Loading @@ -778,6 +803,23 @@ static int _sde_crtc_set_crtc_roi(struct drm_crtc *crtc, sde_kms_rect_merge_rectangles(&crtc_state->user_roi_list, crtc_roi); /* * for 3dmux dsc, make sure is full ROI, since current driver doesn't * support partial update for this configuration. */ if (!sde_kms_rect_is_null(crtc_roi) && _sde_crtc_setup_is_3dmux_dsc(state)) { struct drm_display_mode *adj_mode = &state->adjusted_mode; if (crtc_roi->w != adj_mode->hdisplay || crtc_roi->h != adj_mode->vdisplay) { SDE_ERROR("%s: unsupported top roi[%d %d] wxh[%d %d]\n", sde_crtc->name, crtc_roi->w, crtc_roi->h, adj_mode->hdisplay, adj_mode->vdisplay); return -EINVAL; } } SDE_DEBUG("%s: crtc roi (%d,%d,%d,%d)\n", sde_crtc->name, crtc_roi->x, crtc_roi->y, crtc_roi->w, crtc_roi->h); Loading
drivers/gpu/drm/msm/sde/sde_encoder.c +5 −3 Original line number Diff line number Diff line Loading @@ -651,7 +651,7 @@ static void _sde_encoder_get_connector_roi( sde_kms_rect_merge_rectangles(&c_state->rois, merged_conn_roi); } static int _sde_encoder_dsc_1_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) static int _sde_encoder_dsc_n_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) { int this_frame_slices; int intf_ip_w, enc_ip_w; Loading Loading @@ -692,6 +692,7 @@ static int _sde_encoder_dsc_1_lm_1_enc_1_intf(struct sde_encoder_virt *sde_enc) return 0; } static int _sde_encoder_dsc_2_lm_2_enc_2_intf(struct sde_encoder_virt *sde_enc, struct sde_encoder_kickoff_params *params) { Loading Loading @@ -892,7 +893,7 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc, return -EINVAL; } SDE_DEBUG_ENC(sde_enc, "\n"); SDE_DEBUG_ENC(sde_enc, "topology:%d\n", topology); SDE_EVT32(DRMID(&sde_enc->base)); if (sde_kms_rect_is_equal(&sde_enc->cur_conn_roi, Loading @@ -901,7 +902,8 @@ static int _sde_encoder_dsc_setup(struct sde_encoder_virt *sde_enc, switch (topology) { case SDE_RM_TOPOLOGY_SINGLEPIPE_DSC: ret = _sde_encoder_dsc_1_lm_1_enc_1_intf(sde_enc); case SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC: ret = _sde_encoder_dsc_n_lm_1_enc_1_intf(sde_enc); break; case SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE: ret = _sde_encoder_dsc_2_lm_2_enc_1_intf(sde_enc, params); Loading
drivers/gpu/drm/msm/sde/sde_encoder_phys.h +2 −1 Original line number Diff line number Diff line Loading @@ -434,7 +434,8 @@ static inline enum sde_3d_blend_mode sde_encoder_helper_get_3d_blend_mode( topology = sde_connector_get_topology_name(phys_enc->connector); if (phys_enc->split_role == ENC_ROLE_SOLO && topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE) (topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE || topology == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC)) return BLEND_3D_H_ROW_INT; return BLEND_3D_NONE; Loading