Commit afc8935e authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher
Browse files

drm/amd/display: revert dc_get_validate_context re-entrancy fix



Apply dc_get_validate_context re-entrancy fix to dc_validate_resources instead

Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 430ef426
Loading
Loading
Loading
Loading
+62 −9
Original line number Diff line number Diff line
@@ -653,6 +653,40 @@ void dc_destroy(struct dc **dc)
	*dc = NULL;
}

static bool is_validation_required(
		const struct core_dc *dc,
		const struct dc_validation_set set[],
		int set_count)
{
	const struct validate_context *context = dc->current_context;
	int i, j;

	if (context->stream_count != set_count)
		return true;

	for (i = 0; i < set_count; i++) {

		if (set[i].surface_count != context->stream_status[i].surface_count)
			return true;
		if (!is_stream_unchanged(DC_STREAM_TO_CORE(set[i].stream), context->streams[i]))
			return true;

		for (j = 0; j < set[i].surface_count; j++) {
			struct dc_surface temp_surf = { 0 };

			temp_surf = *context->stream_status[i].surfaces[j];
			temp_surf.clip_rect = set[i].surfaces[j]->clip_rect;
			temp_surf.dst_rect.x = set[i].surfaces[j]->dst_rect.x;
			temp_surf.dst_rect.y = set[i].surfaces[j]->dst_rect.y;

			if (memcmp(&temp_surf, set[i].surfaces[j], sizeof(temp_surf)) != 0)
				return true;
		}
	}

	return false;
}

struct validate_context *dc_get_validate_context(
		const struct dc *dc,
		const struct dc_validation_set set[],
@@ -666,8 +700,13 @@ struct validate_context *dc_get_validate_context(
	if (context == NULL)
		goto context_alloc_fail;

	if (!is_validation_required(core_dc, set, set_count)) {
		dc_resource_validate_ctx_copy_construct(core_dc->current_context, context);
		return context;
	}

	result = core_dc->res_pool->funcs->validate_with_context(
				core_dc, set, set_count, context, NULL);
			core_dc, set, set_count, context, core_dc->current_context);

context_alloc_fail:
	if (result != DC_OK) {
@@ -690,16 +729,30 @@ bool dc_validate_resources(
		const struct dc_validation_set set[],
		uint8_t set_count)
{
	struct validate_context *ctx;
	struct core_dc *core_dc = DC_TO_CORE(dc);
	enum dc_status result = DC_ERROR_UNEXPECTED;
	struct validate_context *context;

	ctx = dc_get_validate_context(dc, set, set_count);
	if (ctx) {
		dc_resource_validate_ctx_destruct(ctx);
		dm_free(ctx);
		return true;
	context = dm_alloc(sizeof(struct validate_context));
	if (context == NULL)
		goto context_alloc_fail;

	result = core_dc->res_pool->funcs->validate_with_context(
				core_dc, set, set_count, context, NULL);

context_alloc_fail:
	if (result != DC_OK) {
		dm_logger_write(core_dc->ctx->logger, LOG_WARNING,
				"%s:resource validation failed, dc_status:%d\n",
				__func__,
				result);
	}

	return false;
	dc_resource_validate_ctx_destruct(context);
	dm_free(context);
	context = NULL;

	return result == DC_OK;
}

bool dc_validate_guaranteed(