diff options
Diffstat (limited to 'drivers/gpu/drm/vc4')
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_bo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_kms.c | 40 | 
2 files changed, 19 insertions, 23 deletions
| diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c index fddaeb0b09c1..f642bd6e71ff 100644 --- a/drivers/gpu/drm/vc4/vc4_bo.c +++ b/drivers/gpu/drm/vc4/vc4_bo.c @@ -391,7 +391,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)  	bo = kzalloc(sizeof(*bo), GFP_KERNEL);  	if (!bo) -		return ERR_PTR(-ENOMEM); +		return NULL;  	bo->madv = VC4_MADV_WILLNEED;  	refcount_set(&bo->usecnt, 0); diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c index f0b3e4cf5bce..b61792d2aa65 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -337,10 +337,10 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)  	struct drm_device *dev = state->dev;  	struct vc4_dev *vc4 = to_vc4_dev(dev);  	struct vc4_hvs *hvs = vc4->hvs; -	struct drm_crtc_state *old_crtc_state;  	struct drm_crtc_state *new_crtc_state;  	struct drm_crtc *crtc;  	struct vc4_hvs_state *old_hvs_state; +	unsigned int channel;  	int i;  	for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { @@ -353,30 +353,32 @@ static void vc4_atomic_commit_tail(struct drm_atomic_state *state)  		vc4_hvs_mask_underrun(dev, vc4_crtc_state->assigned_channel);  	} -	if (vc4->hvs->hvs5) -		clk_set_min_rate(hvs->core_clk, 500000000); -  	old_hvs_state = vc4_hvs_get_old_global_state(state); -	if (!old_hvs_state) +	if (IS_ERR(old_hvs_state))  		return; -	for_each_old_crtc_in_state(state, crtc, old_crtc_state, i) { -		struct vc4_crtc_state *vc4_crtc_state = -			to_vc4_crtc_state(old_crtc_state); -		unsigned int channel = vc4_crtc_state->assigned_channel; +	for (channel = 0; channel < HVS_NUM_CHANNELS; channel++) { +		struct drm_crtc_commit *commit;  		int ret; -		if (channel == VC4_HVS_CHANNEL_DISABLED) +		if (!old_hvs_state->fifo_state[channel].in_use)  			continue; -		if (!old_hvs_state->fifo_state[channel].in_use) +		commit = old_hvs_state->fifo_state[channel].pending_commit; +		if (!commit)  			continue; -		ret = drm_crtc_commit_wait(old_hvs_state->fifo_state[channel].pending_commit); +		ret = drm_crtc_commit_wait(commit);  		if (ret)  			drm_err(dev, "Timed out waiting for commit\n"); + +		drm_crtc_commit_put(commit); +		old_hvs_state->fifo_state[channel].pending_commit = NULL;  	} +	if (vc4->hvs->hvs5) +		clk_set_min_rate(hvs->core_clk, 500000000); +  	drm_atomic_helper_commit_modeset_disables(dev, state);  	vc4_ctm_commit(vc4, state); @@ -410,8 +412,8 @@ static int vc4_atomic_commit_setup(struct drm_atomic_state *state)  	unsigned int i;  	hvs_state = vc4_hvs_get_new_global_state(state); -	if (!hvs_state) -		return -EINVAL; +	if (WARN_ON(IS_ERR(hvs_state))) +		return PTR_ERR(hvs_state);  	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {  		struct vc4_crtc_state *vc4_crtc_state = @@ -668,12 +670,6 @@ vc4_hvs_channels_duplicate_state(struct drm_private_obj *obj)  	for (i = 0; i < HVS_NUM_CHANNELS; i++) {  		state->fifo_state[i].in_use = old_state->fifo_state[i].in_use; - -		if (!old_state->fifo_state[i].pending_commit) -			continue; - -		state->fifo_state[i].pending_commit = -			drm_crtc_commit_get(old_state->fifo_state[i].pending_commit);  	}  	return &state->base; @@ -762,8 +758,8 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,  	unsigned int i;  	hvs_new_state = vc4_hvs_get_global_state(state); -	if (!hvs_new_state) -		return -EINVAL; +	if (IS_ERR(hvs_new_state)) +		return PTR_ERR(hvs_new_state);  	for (i = 0; i < ARRAY_SIZE(hvs_new_state->fifo_state); i++)  		if (!hvs_new_state->fifo_state[i].in_use) |