diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0581-drm-amd-display-Use-validate_context-from-atomic_che.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0581-drm-amd-display-Use-validate_context-from-atomic_che.patch | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0581-drm-amd-display-Use-validate_context-from-atomic_che.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0581-drm-amd-display-Use-validate_context-from-atomic_che.patch new file mode 100644 index 00000000..d0f07ee0 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0581-drm-amd-display-Use-validate_context-from-atomic_che.patch @@ -0,0 +1,243 @@ +From c3014d3b9ac1bf30c2130c6e37711cd139131d75 Mon Sep 17 00:00:00 2001 +From: Harry Wentland <harry.wentland@amd.com> +Date: Wed, 28 Jun 2017 13:23:04 -0400 +Subject: [PATCH 0581/4131] drm/amd/display: Use validate_context from + atomic_check in commit + +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 18 ++++-- + drivers/gpu/drm/amd/display/dc/core/dc.c | 71 +++++++--------------- + drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 6 +- + drivers/gpu/drm/amd/display/dc/dc.h | 5 +- + 4 files changed, 40 insertions(+), 60 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 8ce7d3e..d4ce770 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 +@@ -2752,6 +2752,7 @@ void amdgpu_dm_atomic_commit_tail( + new_stream = dm_state->set[j].stream; + break; + } ++ + /* + * this loop saves set mode crtcs + * we needed to enable vblanks once all +@@ -2810,7 +2811,6 @@ void amdgpu_dm_atomic_commit_tail( + dm_error("%s: Failed to update stream scaling!\n", __func__); + } + +- + /* + * Add streams after required streams from new and replaced streams + * are removed from freesync module +@@ -2838,15 +2838,19 @@ void amdgpu_dm_atomic_commit_tail( + } + + /* DC is optimized not to do anything if 'streams' didn't change. */ +- WARN_ON(!dc_commit_validation_set(dm->dc, dm_state->set, +- dm_state->set_count)); ++ WARN_ON(!dc_commit_context(dm->dc, dm_state->context)); + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); + +- if (acrtc->stream != NULL) +- acrtc->otg_inst = +- dc_stream_get_status(acrtc->stream)->primary_otg_inst; ++ if (acrtc->stream != NULL) { ++ const struct dc_stream_status *status = dc_stream_get_status(acrtc->stream); ++ ++ if (!status) ++ DC_ERR("got no status for stream %p on acrtc%p\n", acrtc->stream, acrtc); ++ else ++ acrtc->otg_inst = status->primary_otg_inst; ++ } + } + + for (i = 0; i < new_crtcs_count; i++) { +@@ -3029,6 +3033,7 @@ static uint32_t update_in_val_sets_stream( + } else { + /* update. relase old stream */ + dc_stream_release(old_stream); ++ + } + + return set_count; +@@ -3209,6 +3214,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + __func__, acrtc->base.base.id); + break; + } ++ new_stream->priv = acrtc; + + new_streams[new_stream_count] = new_stream; + dm_state->set_count = update_in_val_sets_stream( +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index b50fc0d..90a3150 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -841,18 +841,17 @@ static void program_timing_sync( + } + } + +-static bool set_changed( ++static bool context_changed( + struct core_dc *dc, +- const struct dc_validation_set set[], +- uint8_t set_count) ++ struct validate_context *context) + { + uint8_t i; + +- if (set_count != dc->current_context->stream_count) ++ if (context->stream_count != dc->current_context->stream_count) + return true; + + for (i = 0; i < dc->current_context->stream_count; i++) { +- if (&dc->current_context->streams[i]->public != set[i].stream) ++ if (&dc->current_context->streams[i]->public != &context->streams[i]->public) + return true; + } + +@@ -915,55 +914,37 @@ bool dc_enable_stereo( + } + + /* TODO operate on validation set (or something like it) */ +-bool dc_commit_validation_set( +- const struct dc *dc, +- const struct dc_validation_set set[], +- uint8_t set_count) ++bool dc_commit_context(struct dc *dc, struct validate_context *context) + { + struct core_dc *core_dc = DC_TO_CORE(dc); + struct dc_bios *dcb = core_dc->ctx->dc_bios; + enum dc_status result = DC_ERROR_UNEXPECTED; +- struct validate_context *context; + struct pipe_ctx *pipe; + int i, j, k, l; + +- /* TODO check validation set changed */ +- if (false == set_changed(core_dc, set, set_count)) ++ if (!context) ++ dm_logger_write(core_dc->ctx->logger, LOG_ERROR, ++ "%s: dc_commit_context with no context!\n", ++ __func__); ++ ++ if (false == context_changed(core_dc, context)) + return DC_OK; + + dm_logger_write(core_dc->ctx->logger, LOG_DC, "%s: %d streams\n", +- __func__, set_count); +- +- for (i = 0; i < set_count; i++) +- dc_stream_log(set[i].stream, +- core_dc->ctx->logger, +- LOG_DC); ++ __func__, context->stream_count); + +- context = dm_alloc(sizeof(struct validate_context)); +- if (context == NULL) +- goto context_alloc_fail; ++ for (i = 0; i < context->stream_count; i++) { ++ const struct dc_stream *stream = &context->streams[i]->public; + +- /* TODO no need for validation. just rebuild context */ +- /* TODO check context is created deterministically */ +- result = core_dc->res_pool->funcs->validate_with_context(core_dc, set, +- set_count, +- context, +- core_dc->current_context); +- if (result != DC_OK) { +- dm_logger_write(core_dc->ctx->logger, LOG_ERROR, +- "%s: Context validation failed! dc_status:%d\n", +- __func__, +- result); +- BREAK_TO_DEBUGGER(); +- dc_resource_validate_ctx_destruct(context); +- goto fail; ++ dc_stream_log(stream, ++ core_dc->ctx->logger, ++ LOG_DC); + } + + if (!dcb->funcs->is_accelerated_mode(dcb)) + core_dc->hwss.enable_accelerated_mode(core_dc); + +- if (result == DC_OK) +- result = core_dc->hwss.apply_ctx_to_hw(core_dc, context); ++ result = core_dc->hwss.apply_ctx_to_hw(core_dc, context); + + program_timing_sync(core_dc, context); + +@@ -1000,17 +981,8 @@ bool dc_commit_validation_set( + context->streams[i]->public.timing.pix_clk_khz); + } + +- dc_resource_validate_ctx_destruct(core_dc->current_context); +- dm_free(core_dc->current_context); +- +- core_dc->current_context = context; +- +- return (result == DC_OK); +- +-fail: +- dm_free(context); ++ dc_resource_validate_ctx_copy_construct(context, core_dc->current_context); + +-context_alloc_fail: + return (result == DC_OK); + } + +@@ -1631,7 +1603,10 @@ void dc_update_surfaces_and_stream(struct dc *dc, + if (update_type == UPDATE_TYPE_FAST) + continue; + +- if (srf_updates[i].in_transfer_func) ++ /* TODO find out why check is false */ ++ /* TODO with this still not programming some color stuff... panel is dark-ish */ ++ /*if (is_new_pipe_surface || ++ srf_updates[i].in_transfer_func)*/ + core_dc->hwss.set_input_transfer_func( + pipe_ctx, pipe_ctx->surface); + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c +index 4ba446d..ead7b63 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c +@@ -164,9 +164,11 @@ const struct dc_stream_status *dc_stream_get_status( + struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream); + struct core_dc *dc = DC_TO_CORE(stream->ctx->dc); + +- for (i = 0; i < dc->current_context->stream_count; i++) +- if (stream == dc->current_context->streams[i]) ++ for (i = 0; i < dc->current_context->stream_count; i++) { ++ if (stream == dc->current_context->streams[i]) { + return &dc->current_context->stream_status[i]; ++ } ++ } + + return NULL; + } +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 5487fb1..5d65416 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -590,10 +590,7 @@ void dc_resource_validate_ctx_destruct(struct validate_context *context); + * Phy, Encoder, Timing Generator are programmed and enabled. + * New streams are enabled with blank stream; no memory read. + */ +-bool dc_commit_validation_set( +- const struct dc *dc, +- const struct dc_validation_set set[], +- uint8_t set_count); ++bool dc_commit_context(struct dc *dc, struct validate_context *context); + + /* + * Set up streams and links associated to drive sinks +-- +2.7.4 + |