Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e121bd20 authored by Anjaneya Prasad Musunuri's avatar Anjaneya Prasad Musunuri
Browse files

disp: msm: sde: handle partial update transitions in rounded corner



This change handles partial update use case transitions. Rounded
corner should be programmed to full ROI when transitioning out of
partial update use case.
This change also clear cached ROIs when rounded corner feature is
disabled to ensure full frame ROI for first frame when feature
is enabled again. This change depends on HAL change to disable PU
for one frame when RC mask config is set.
This change also moves cached rectangles from crtc state to crtc
structure to avoid cached rectangles being incorrect due to race
conditions between updating cached rectangles in crtc state and
duplicating crtc state when next commit starts.

Change-Id: I4c48ccd3f64409d1b0fa19f0e6f92eab5f86d099
Signed-off-by: default avatarAnjaneya Prasad Musunuri <aprasad@codeaurora.org>
parent 1ff0a561
Loading
Loading
Loading
Loading
+23 −16
Original line number Diff line number Diff line
@@ -1675,27 +1675,32 @@ static int sde_cp_crtc_set_pu_features(struct drm_crtc *crtc, bool *need_flush)
	}

	/* early return if not a partial update frame or no change in rois */
	if (sde_crtc_state->user_roi_list.num_rects == 0) {
	if ((sde_crtc_state->user_roi_list.num_rects == 0) &&
		(sde_crtc->cached_user_roi_list.num_rects == 0)) {
		DRM_DEBUG_DRIVER("no partial update required\n");
		memset(&sde_crtc_state->cached_user_roi_list, 0,
				sizeof(struct msm_roi_list));
		return 0;
	}

	} else if (sde_crtc_state->user_roi_list.num_rects == 0) {
		DRM_DEBUG_DRIVER("transition from PU to full update\n");
		memset(&sde_crtc->cached_user_roi_list, 0,
				sizeof(struct msm_roi_list));
	} else {
		sde_kms_rect_merge_rectangles(&sde_crtc_state->user_roi_list,
				&user_rect);
	sde_kms_rect_merge_rectangles(&sde_crtc_state->cached_user_roi_list,
		sde_kms_rect_merge_rectangles(
				&sde_crtc->cached_user_roi_list,
				&cached_rect);
		if (sde_kms_rect_is_equal(&user_rect, &cached_rect)) {
			DRM_DEBUG_DRIVER("no change in list of ROIs\n");
			return 0;
		}
	}

	catalog = get_kms(&sde_crtc->base)->catalog;
	memset(&hw_cfg, 0, sizeof(hw_cfg));
	hw_cfg.num_of_mixers = sde_crtc->num_mixers;
	hw_cfg.broadcast_disabled = catalog->dma_cfg.broadcast_disabled;
	hw_cfg.payload = &sde_crtc_state->user_roi_list;
	hw_cfg.payload = (sde_crtc_state->user_roi_list.num_rects) ?
		&sde_crtc_state->user_roi_list : NULL;
	hw_cfg.len = sizeof(sde_crtc_state->user_roi_list);
	for (i = 0; i < hw_cfg.num_of_mixers; i++)
		hw_cfg.dspp[i] = sde_crtc->mixers[i].hw_dspp;
@@ -1730,9 +1735,11 @@ static int sde_cp_crtc_set_pu_features(struct drm_crtc *crtc, bool *need_flush)
		}
	}

	memcpy(&sde_crtc_state->cached_user_roi_list,
	if (sde_crtc_state->user_roi_list.num_rects != 0) {
		memcpy(&sde_crtc->cached_user_roi_list,
				&sde_crtc_state->user_roi_list,
				sizeof(struct msm_roi_list));
	}

	return 0;
}
+4 −3
Original line number Diff line number Diff line
@@ -277,6 +277,7 @@ struct sde_crtc_misr_info {
 * @plane_mask_old: keeps track of the planes used in the previous commit
 * @frame_trigger_mode: frame trigger mode
 * @cp_pu_feature_mask: mask indicating cp feature enable for partial update
 * @cached_user_roi_list : Copy of user_roi_list from previous PU frame
 * @ltm_buffer_cnt  : number of ltm buffers
 * @ltm_buffers     : struct stores ltm buffer related data
 * @ltm_buf_free    : list of LTM buffers that are available
@@ -361,6 +362,7 @@ struct sde_crtc {
	enum frame_trigger_mode_type frame_trigger_mode;

	u32 cp_pu_feature_mask;
	struct msm_roi_list cached_user_roi_list;

	u32 ltm_buffer_cnt;
	struct sde_ltm_buffer *ltm_buffers[LTM_BUFFER_SIZE];
@@ -395,7 +397,6 @@ struct sde_crtc {
 * @lm_roi        : Current LM ROI, possibly sub-rectangle of mode.
 *                  Origin top left of CRTC.
 * @user_roi_list : List of user's requested ROIs as from set property
 * @cached_user_roi_list : Copy of user_roi_list from previous PU frame
  * @property_state: Local storage for msm_prop properties
 * @property_values: Current crtc property values
 * @input_fence_timeout_ns : Cached input fence timeout, in ns
@@ -423,7 +424,7 @@ struct sde_crtc_state {
	struct sde_rect crtc_roi;
	struct sde_rect lm_bounds[CRTC_DUAL_MIXERS];
	struct sde_rect lm_roi[CRTC_DUAL_MIXERS];
	struct msm_roi_list user_roi_list, cached_user_roi_list;
	struct msm_roi_list user_roi_list;

	struct msm_property_state property_state;
	struct msm_property_value property_values[CRTC_PROP_COUNT];
+5 −0
Original line number Diff line number Diff line
@@ -775,6 +775,7 @@ int sde_hw_rc_check_pu_roi(struct sde_hw_dspp *hw_dspp, void *cfg)
	roi_list = hw_cfg->payload;
	if (!roi_list) {
		SDE_DEBUG("full frame update\n");
		memset(&empty_roi_list, 0, sizeof(struct msm_roi_list));
		roi_list = &empty_roi_list;
	}

@@ -837,6 +838,7 @@ int sde_hw_rc_setup_pu_roi(struct sde_hw_dspp *hw_dspp, void *cfg)
	roi_list = hw_cfg->payload;
	if (!roi_list) {
		SDE_DEBUG("full frame update\n");
		memset(&empty_roi_list, 0, sizeof(struct msm_roi_list));
		roi_list = &empty_roi_list;
	}

@@ -906,6 +908,9 @@ int sde_hw_rc_setup_mask(struct sde_hw_dspp *hw_dspp, void *cfg)
		memset(RC_STATE(hw_dspp).last_rc_mask_cfg, 0,
				sizeof(struct drm_msm_rc_mask_cfg));
		RC_STATE(hw_dspp).mask_programmed = false;
		memset(RC_STATE(hw_dspp).last_roi_list, 0,
				sizeof(struct msm_roi_list));
		RC_STATE(hw_dspp).roi_programmed = false;

		return 0;
	}