diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_atomic.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_atomic.c | 29 | 
1 files changed, 25 insertions, 4 deletions
diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c index 1686fbb611fd..d77fa9793c54 100644 --- a/drivers/gpu/drm/msm/msm_atomic.c +++ b/drivers/gpu/drm/msm/msm_atomic.c @@ -179,6 +179,24 @@ static unsigned get_crtc_mask(struct drm_atomic_state *state)  	return mask;  } +int msm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) +{ +	struct drm_crtc_state *old_crtc_state, *new_crtc_state; +	struct drm_crtc *crtc; +	int i; + +	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, +				      new_crtc_state, i) { +		if ((old_crtc_state->ctm && !new_crtc_state->ctm) || +		    (!old_crtc_state->ctm && new_crtc_state->ctm)) { +			new_crtc_state->mode_changed = true; +			state->allow_modeset = true; +		} +	} + +	return drm_atomic_helper_check(dev, state); +} +  void msm_atomic_commit_tail(struct drm_atomic_state *state)  {  	struct drm_device *dev = state->dev; @@ -186,8 +204,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  	struct msm_kms *kms = priv->kms;  	struct drm_crtc *async_crtc = NULL;  	unsigned crtc_mask = get_crtc_mask(state); -	bool async = kms->funcs->vsync_time && -			can_do_async(state, &async_crtc); +	bool async = can_do_async(state, &async_crtc);  	trace_msm_atomic_commit_tail_start(async, crtc_mask); @@ -206,7 +223,8 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  	 * Now that there is no in-progress flush, prepare the  	 * current update:  	 */ -	kms->funcs->prepare_commit(kms, state); +	if (kms->funcs->prepare_commit) +		kms->funcs->prepare_commit(kms, state);  	/*  	 * Push atomic updates down to hardware: @@ -231,7 +249,9 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  			kms->pending_crtc_mask |= crtc_mask; -			vsync_time = kms->funcs->vsync_time(kms, async_crtc); +			if (drm_crtc_next_vblank_start(async_crtc, &vsync_time)) +				goto fallback; +  			wakeup_time = ktime_sub(vsync_time, ms_to_ktime(1));  			msm_hrtimer_queue_work(&timer->work, wakeup_time, @@ -253,6 +273,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  		return;  	} +fallback:  	/*  	 * If there is any async flush pending on updated crtcs, fold  	 * them into the current flush.  | 
