diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0354-drm-amd-display-Return-context-from-validate_context.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0354-drm-amd-display-Return-context-from-validate_context.patch | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0354-drm-amd-display-Return-context-from-validate_context.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0354-drm-amd-display-Return-context-from-validate_context.patch new file mode 100644 index 00000000..9f700078 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0354-drm-amd-display-Return-context-from-validate_context.patch @@ -0,0 +1,171 @@ +From a3878a5da6834fafb5cc42ec335741a17713a091 Mon Sep 17 00:00:00 2001 +From: Harry Wentland <harry.wentland@amd.com> +Date: Wed, 29 Mar 2017 11:22:05 -0400 +Subject: [PATCH 0354/4131] drm/amd/display: Return context from + validate_context + +This will allow us to carry it from check to commit + +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 26 +++++++++++----- + drivers/gpu/drm/amd/display/dc/core/dc.c | 36 +++++++++++++++++----- + drivers/gpu/drm/amd/display/dc/dc.h | 5 +++ + 3 files changed, 52 insertions(+), 15 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +index dbeee59..bb55944 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c +@@ -1557,6 +1557,7 @@ int amdgpu_dm_connector_mode_valid( + /* TODO: Unhardcode stream count */ + struct dc_stream *stream; + struct amdgpu_connector *aconnector = to_amdgpu_connector(connector); ++ struct validate_context *context; + + if ((mode->flags & DRM_MODE_FLAG_INTERLACE) || + (mode->flags & DRM_MODE_FLAG_DBLSCAN)) +@@ -1591,8 +1592,13 @@ int amdgpu_dm_connector_mode_valid( + stream->src.height = mode->vdisplay; + stream->dst = stream->src; + +- if (dc_validate_resources(adev->dm.dc, &val_set, 1)) ++ context = dc_get_validate_context(adev->dm.dc, &val_set, 1); ++ ++ if (context) { + result = MODE_OK; ++ dc_resource_validate_ctx_destruct(context); ++ dm_free(context); ++ } + + dc_stream_release(stream); + +@@ -3023,6 +3029,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + struct amdgpu_device *adev = dev->dev_private; + struct dc *dc = adev->dm.dc; + bool need_to_validate = false; ++ struct validate_context *context; + + ret = drm_atomic_helper_check(dev, state); + +@@ -3245,15 +3252,20 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + } + } + +- if (need_to_validate == false || set_count == 0 || +- dc_validate_resources(dc, set, set_count)) ++ context = dc_get_validate_context(dc, set, set_count); ++ ++ if (need_to_validate == false || set_count == 0 || context) + ret = 0; + +- for (i = 0; i < set_count; i++) { +- for (j = 0; j < set[i].surface_count; j++) { +- dc_surface_release(set[i].surfaces[j]); +- } ++ if (context) { ++ dc_resource_validate_ctx_destruct(context); ++ dm_free(context); + } ++ ++ for (i = 0; i < set_count; i++) ++ for (j = 0; j < set[i].surface_count; j++) ++ dc_surface_release(set[i].surfaces[j]); ++ + for (i = 0; i < new_stream_count; i++) + dc_stream_release(new_streams[i]); + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 5620fe3..64b5216 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -635,7 +635,7 @@ static bool is_validation_required( + return false; + } + +-bool dc_validate_resources( ++struct validate_context *dc_get_validate_context( + const struct dc *dc, + const struct dc_validation_set set[], + uint8_t set_count) +@@ -644,31 +644,51 @@ bool dc_validate_resources( + enum dc_status result = DC_ERROR_UNEXPECTED; + struct validate_context *context; + +- if (!is_validation_required(core_dc, set, set_count)) +- return true; +- + context = dm_alloc(sizeof(struct 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); + +- dc_resource_validate_ctx_destruct(context); +- dm_free(context); +- + 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); ++ ++ dc_resource_validate_ctx_destruct(context); ++ dm_free(context); ++ context = NULL; + } + +- return (result == DC_OK); ++ return context; + + } + ++bool dc_validate_resources( ++ const struct dc *dc, ++ const struct dc_validation_set set[], ++ uint8_t set_count) ++{ ++ struct validate_context *ctx; ++ ++ ctx = dc_get_validate_context(dc, set, set_count); ++ if (ctx) { ++ dc_resource_validate_ctx_destruct(ctx); ++ dm_free(ctx); ++ return true; ++ } ++ ++ return false; ++} ++ + bool dc_validate_guaranteed( + const struct dc *dc, + const struct dc_stream *stream) +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 7de2080..1b3fd79 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -505,6 +505,11 @@ struct dc_validation_set { + * After this call: + * No hardware is programmed for call. Only validation is done. + */ ++struct validate_context *dc_get_validate_context( ++ const struct dc *dc, ++ const struct dc_validation_set set[], ++ uint8_t set_count); ++ + bool dc_validate_resources( + const struct dc *dc, + const struct dc_validation_set set[], +-- +2.7.4 + |