Commit b7a287fa authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amd/display/dc: add helper for panic updates



Add a DC helper for panic updates.

Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: Lu Yao <yaolu@kylinos.cn>
Cc: Jocelyn Falempe <jfalempe@redhat.com>
Cc: Harry Wentland <harry.wentland@amd.com>
parent 98471006
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -270,4 +270,50 @@ void dc_3dlut_func_retain(struct dc_3dlut *lut)
	kref_get(&lut->refcount);
}

void dc_plane_force_update_for_panic(struct dc_plane_state *plane_state,
				     bool clear_tiling)
{
	struct dc *dc;
	int i;

	if (!plane_state)
		return;

	dc = plane_state->ctx->dc;

	if (!dc || !dc->current_state)
		return;

	for (i = 0; i < dc->res_pool->pipe_count; i++) {
		struct pipe_ctx *pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];

		if (!pipe_ctx)
			continue;

		if (dc->ctx->dce_version >= DCE_VERSION_MAX) {
			struct hubp *hubp = pipe_ctx->plane_res.hubp;
			if (!hubp)
				continue;
			/* if framebuffer is tiled, disable tiling */
			if (clear_tiling && hubp->funcs->hubp_clear_tiling)
				hubp->funcs->hubp_clear_tiling(hubp);

			/* force page flip to see the new content of the framebuffer */
			hubp->funcs->hubp_program_surface_flip_and_addr(hubp,
									&plane_state->address,
									true);
		} else {
			struct mem_input *mi = pipe_ctx->plane_res.mi;
			if (!mi)
				continue;
			/* if framebuffer is tiled, disable tiling */
			if (clear_tiling && mi->funcs->mem_input_clear_tiling)
				mi->funcs->mem_input_clear_tiling(mi);

			/* force page flip to see the new content of the framebuffer */
			mi->funcs->mem_input_program_surface_flip_and_addr(mi,
									   &plane_state->address,
									   true);
		}
	}
}
+3 −0
Original line number Diff line number Diff line
@@ -34,4 +34,7 @@ const struct dc_plane_status *dc_plane_get_status(
void dc_plane_state_retain(struct dc_plane_state *plane_state);
void dc_plane_state_release(struct dc_plane_state *plane_state);

void dc_plane_force_update_for_panic(struct dc_plane_state *plane_state,
				     bool clear_tiling);

#endif /* _DC_PLANE_H_ */