[PATCH] Revert "drm/amd/display: reuse current context instead of recreating one"

Kazlauskas, Nicholas nicholas.kazlauskas at amd.com
Wed Feb 10 14:32:42 UTC 2021


On 2021-02-10 9:25 a.m., Alex Deucher wrote:
> This reverts commit 8866a67ab86cc0812e65c04f1ef02bcc41e24d68.
> 
> This breaks hotplug of HDMI on some systems, resulting in
> a blank screen.
> 
> Bug: https://bugzilla.kernel.org/show_bug.cgi?id=211649>> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---

Hotplug is still working from my side with this patch.

Same with our weekly testing reports that Daniel's been putting out.

This is probably something environment or configuration specific but I 
don't see any logs from the reporter. I'll follow up on the ticket but 
I'd like to understand the problem in more detail before reverting this.

Regards,
Nicholas Kazlauskas

>   .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 23 +++++++++-------
>   drivers/gpu/drm/amd/display/dc/core/dc.c      | 27 ++++++-------------
>   drivers/gpu/drm/amd/display/dc/dc_stream.h    |  3 ++-
>   3 files changed, 23 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 961abf1cf040..e438baa1adc1 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -1934,7 +1934,7 @@ static void dm_gpureset_commit_state(struct dc_state *dc_state,
>   		dc_commit_updates_for_stream(
>   			dm->dc, bundle->surface_updates,
>   			dc_state->stream_status->plane_count,
> -			dc_state->streams[k], &bundle->stream_update);
> +			dc_state->streams[k], &bundle->stream_update, dc_state);
>   	}
>   
>   cleanup:
> @@ -1965,7 +1965,8 @@ static void dm_set_dpms_off(struct dc_link *link)
>   
>   	stream_update.stream = stream_state;
>   	dc_commit_updates_for_stream(stream_state->ctx->dc, NULL, 0,
> -				     stream_state, &stream_update);
> +				     stream_state, &stream_update,
> +				     stream_state->ctx->dc->current_state);
>   	mutex_unlock(&adev->dm.dc_lock);
>   }
>   
> @@ -7548,7 +7549,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
>   				    struct drm_crtc *pcrtc,
>   				    bool wait_for_vblank)
>   {
> -	int i;
> +	uint32_t i;
>   	uint64_t timestamp_ns;
>   	struct drm_plane *plane;
>   	struct drm_plane_state *old_plane_state, *new_plane_state;
> @@ -7589,7 +7590,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
>   		amdgpu_dm_commit_cursors(state);
>   
>   	/* update planes when needed */
> -	for_each_oldnew_plane_in_state_reverse(state, plane, old_plane_state, new_plane_state, i) {
> +	for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
>   		struct drm_crtc *crtc = new_plane_state->crtc;
>   		struct drm_crtc_state *new_crtc_state;
>   		struct drm_framebuffer *fb = new_plane_state->fb;
> @@ -7812,7 +7813,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
>   						     bundle->surface_updates,
>   						     planes_count,
>   						     acrtc_state->stream,
> -						     &bundle->stream_update);
> +						     &bundle->stream_update,
> +						     dc_state);
>   
>   		/**
>   		 * Enable or disable the interrupts on the backend.
> @@ -8148,13 +8150,13 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>   		struct dm_connector_state *dm_new_con_state = to_dm_connector_state(new_con_state);
>   		struct dm_connector_state *dm_old_con_state = to_dm_connector_state(old_con_state);
>   		struct amdgpu_crtc *acrtc = to_amdgpu_crtc(dm_new_con_state->base.crtc);
> -		struct dc_surface_update surface_updates[MAX_SURFACES];
> +		struct dc_surface_update dummy_updates[MAX_SURFACES];
>   		struct dc_stream_update stream_update;
>   		struct dc_info_packet hdr_packet;
>   		struct dc_stream_status *status = NULL;
>   		bool abm_changed, hdr_changed, scaling_changed;
>   
> -		memset(&surface_updates, 0, sizeof(surface_updates));
> +		memset(&dummy_updates, 0, sizeof(dummy_updates));
>   		memset(&stream_update, 0, sizeof(stream_update));
>   
>   		if (acrtc) {
> @@ -8211,15 +8213,16 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
>   		 * To fix this, DC should permit updating only stream properties.
>   		 */
>   		for (j = 0; j < status->plane_count; j++)
> -			surface_updates[j].surface = status->plane_states[j];
> +			dummy_updates[j].surface = status->plane_states[0];
>   
>   
>   		mutex_lock(&dm->dc_lock);
>   		dc_commit_updates_for_stream(dm->dc,
> -						surface_updates,
> +						     dummy_updates,
>   						     status->plane_count,
>   						     dm_new_crtc_state->stream,
> -						     &stream_update);
> +						     &stream_update,
> +						     dc_state);
>   		mutex_unlock(&dm->dc_lock);
>   	}
>   
> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
> index 6cf1a5a2a5ec..58eb0d69873a 100644
> --- a/drivers/gpu/drm/amd/display/dc/core/dc.c
> +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
> @@ -2679,7 +2679,8 @@ void dc_commit_updates_for_stream(struct dc *dc,
>   		struct dc_surface_update *srf_updates,
>   		int surface_count,
>   		struct dc_stream_state *stream,
> -		struct dc_stream_update *stream_update)
> +		struct dc_stream_update *stream_update,
> +		struct dc_state *state)
>   {
>   	const struct dc_stream_status *stream_status;
>   	enum surface_update_type update_type;
> @@ -2698,12 +2699,6 @@ void dc_commit_updates_for_stream(struct dc *dc,
>   
>   
>   	if (update_type >= UPDATE_TYPE_FULL) {
> -		struct dc_plane_state *new_planes[MAX_SURFACES];
> -
> -		memset(new_planes, 0, sizeof(new_planes));
> -
> -		for (i = 0; i < surface_count; i++)
> -			new_planes[i] = srf_updates[i].surface;
>   
>   		/* initialize scratch memory for building context */
>   		context = dc_create_state(dc);
> @@ -2712,21 +2707,15 @@ void dc_commit_updates_for_stream(struct dc *dc,
>   			return;
>   		}
>   
> -		dc_resource_state_copy_construct(
> -				dc->current_state, context);
> +		dc_resource_state_copy_construct(state, context);
>   
> -		/*remove old surfaces from context */
> -		if (!dc_rem_all_planes_for_stream(dc, stream, context)) {
> -			DC_ERROR("Failed to remove streams for new validate context!\n");
> -			return;
> -		}
> +		for (i = 0; i < dc->res_pool->pipe_count; i++) {
> +			struct pipe_ctx *new_pipe = &context->res_ctx.pipe_ctx[i];
> +			struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i];
>   
> -		/* add surface to context */
> -		if (!dc_add_all_planes_for_stream(dc, stream, new_planes, surface_count, context)) {
> -			DC_ERROR("Failed to add streams for new validate context!\n");
> -			return;
> +			if (new_pipe->plane_state && new_pipe->plane_state != old_pipe->plane_state)
> +				new_pipe->plane_state->force_full_update = true;
>   		}
> -
>   	}
>   
>   
> diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
> index e243c01b9672..b7910976b81a 100644
> --- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
> +++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
> @@ -283,7 +283,8 @@ void dc_commit_updates_for_stream(struct dc *dc,
>   		struct dc_surface_update *srf_updates,
>   		int surface_count,
>   		struct dc_stream_state *stream,
> -		struct dc_stream_update *stream_update);
> +		struct dc_stream_update *stream_update,
> +		struct dc_state *state);
>   /*
>    * Log the current stream state.
>    */
> 




More information about the amd-gfx mailing list