Commit e2c7bb12 authored by Harry Wentland's avatar Harry Wentland Committed by Alex Deucher

drm/amd/display: Use validate_context from atomic_check in commit

Signed-off-by: default avatarHarry Wentland <harry.wentland@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent bf8aef2e
...@@ -2607,6 +2607,7 @@ void amdgpu_dm_atomic_commit_tail( ...@@ -2607,6 +2607,7 @@ void amdgpu_dm_atomic_commit_tail(
new_stream = dm_state->set[j].stream; new_stream = dm_state->set[j].stream;
break; break;
} }
/* /*
* this loop saves set mode crtcs * this loop saves set mode crtcs
* we needed to enable vblanks once all * we needed to enable vblanks once all
...@@ -2665,7 +2666,6 @@ void amdgpu_dm_atomic_commit_tail( ...@@ -2665,7 +2666,6 @@ void amdgpu_dm_atomic_commit_tail(
dm_error("%s: Failed to update stream scaling!\n", __func__); dm_error("%s: Failed to update stream scaling!\n", __func__);
} }
/* /*
* Add streams after required streams from new and replaced streams * Add streams after required streams from new and replaced streams
* are removed from freesync module * are removed from freesync module
...@@ -2693,15 +2693,19 @@ void amdgpu_dm_atomic_commit_tail( ...@@ -2693,15 +2693,19 @@ void amdgpu_dm_atomic_commit_tail(
} }
/* DC is optimized not to do anything if 'streams' didn't change. */ /* DC is optimized not to do anything if 'streams' didn't change. */
WARN_ON(!dc_commit_validation_set(dm->dc, dm_state->set, WARN_ON(!dc_commit_context(dm->dc, dm_state->context));
dm_state->set_count));
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
if (acrtc->stream != NULL) if (acrtc->stream != NULL) {
acrtc->otg_inst = const struct dc_stream_status *status = dc_stream_get_status(acrtc->stream);
dc_stream_get_status(acrtc->stream)->primary_otg_inst;
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++) { for (i = 0; i < new_crtcs_count; i++) {
...@@ -2884,6 +2888,7 @@ static uint32_t update_in_val_sets_stream( ...@@ -2884,6 +2888,7 @@ static uint32_t update_in_val_sets_stream(
} else { } else {
/* update. relase old stream */ /* update. relase old stream */
dc_stream_release(old_stream); dc_stream_release(old_stream);
} }
return set_count; return set_count;
...@@ -3064,6 +3069,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -3064,6 +3069,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
__func__, acrtc->base.base.id); __func__, acrtc->base.base.id);
break; break;
} }
new_stream->priv = acrtc;
new_streams[new_stream_count] = new_stream; new_streams[new_stream_count] = new_stream;
dm_state->set_count = update_in_val_sets_stream( dm_state->set_count = update_in_val_sets_stream(
......
...@@ -841,18 +841,17 @@ static void program_timing_sync( ...@@ -841,18 +841,17 @@ static void program_timing_sync(
} }
} }
static bool set_changed( static bool context_changed(
struct core_dc *dc, struct core_dc *dc,
const struct dc_validation_set set[], struct validate_context *context)
uint8_t set_count)
{ {
uint8_t i; uint8_t i;
if (set_count != dc->current_context->stream_count) if (context->stream_count != dc->current_context->stream_count)
return true; return true;
for (i = 0; i < dc->current_context->stream_count; i++) { 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; return true;
} }
...@@ -915,55 +914,37 @@ bool dc_enable_stereo( ...@@ -915,55 +914,37 @@ bool dc_enable_stereo(
} }
/* TODO operate on validation set (or something like it) */ /* TODO operate on validation set (or something like it) */
bool dc_commit_validation_set( bool dc_commit_context(struct dc *dc, struct validate_context *context)
const struct dc *dc,
const struct dc_validation_set set[],
uint8_t set_count)
{ {
struct core_dc *core_dc = DC_TO_CORE(dc); struct core_dc *core_dc = DC_TO_CORE(dc);
struct dc_bios *dcb = core_dc->ctx->dc_bios; struct dc_bios *dcb = core_dc->ctx->dc_bios;
enum dc_status result = DC_ERROR_UNEXPECTED; enum dc_status result = DC_ERROR_UNEXPECTED;
struct validate_context *context;
struct pipe_ctx *pipe; struct pipe_ctx *pipe;
int i, j, k, l; int i, j, k, l;
/* TODO check validation set changed */ if (!context)
if (false == set_changed(core_dc, set, set_count)) 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; return DC_OK;
dm_logger_write(core_dc->ctx->logger, LOG_DC, "%s: %d streams\n", dm_logger_write(core_dc->ctx->logger, LOG_DC, "%s: %d streams\n",
__func__, set_count); __func__, context->stream_count);
for (i = 0; i < set_count; i++)
dc_stream_log(set[i].stream,
core_dc->ctx->logger,
LOG_DC);
context = dm_alloc(sizeof(struct validate_context)); for (i = 0; i < context->stream_count; i++) {
if (context == NULL) const struct dc_stream *stream = &context->streams[i]->public;
goto context_alloc_fail;
/* TODO no need for validation. just rebuild context */ dc_stream_log(stream,
/* TODO check context is created deterministically */ core_dc->ctx->logger,
result = core_dc->res_pool->funcs->validate_with_context(core_dc, set, LOG_DC);
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;
} }
if (!dcb->funcs->is_accelerated_mode(dcb)) if (!dcb->funcs->is_accelerated_mode(dcb))
core_dc->hwss.enable_accelerated_mode(core_dc); 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); program_timing_sync(core_dc, context);
...@@ -1000,17 +981,8 @@ bool dc_commit_validation_set( ...@@ -1000,17 +981,8 @@ bool dc_commit_validation_set(
context->streams[i]->public.timing.pix_clk_khz); context->streams[i]->public.timing.pix_clk_khz);
} }
dc_resource_validate_ctx_destruct(core_dc->current_context); dc_resource_validate_ctx_copy_construct(context, core_dc->current_context);
dm_free(core_dc->current_context);
core_dc->current_context = context;
return (result == DC_OK);
fail:
dm_free(context);
context_alloc_fail:
return (result == DC_OK); return (result == DC_OK);
} }
...@@ -1631,7 +1603,10 @@ void dc_update_surfaces_and_stream(struct dc *dc, ...@@ -1631,7 +1603,10 @@ void dc_update_surfaces_and_stream(struct dc *dc,
if (update_type == UPDATE_TYPE_FAST) if (update_type == UPDATE_TYPE_FAST)
continue; 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( core_dc->hwss.set_input_transfer_func(
pipe_ctx, pipe_ctx->surface); pipe_ctx, pipe_ctx->surface);
......
...@@ -164,9 +164,11 @@ const struct dc_stream_status *dc_stream_get_status( ...@@ -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_stream *stream = DC_STREAM_TO_CORE(dc_stream);
struct core_dc *dc = DC_TO_CORE(stream->ctx->dc); struct core_dc *dc = DC_TO_CORE(stream->ctx->dc);
for (i = 0; i < dc->current_context->stream_count; i++) for (i = 0; i < dc->current_context->stream_count; i++) {
if (stream == dc->current_context->streams[i]) if (stream == dc->current_context->streams[i]) {
return &dc->current_context->stream_status[i]; return &dc->current_context->stream_status[i];
}
}
return NULL; return NULL;
} }
......
...@@ -590,10 +590,7 @@ void dc_resource_validate_ctx_destruct(struct validate_context *context); ...@@ -590,10 +590,7 @@ void dc_resource_validate_ctx_destruct(struct validate_context *context);
* Phy, Encoder, Timing Generator are programmed and enabled. * Phy, Encoder, Timing Generator are programmed and enabled.
* New streams are enabled with blank stream; no memory read. * New streams are enabled with blank stream; no memory read.
*/ */
bool dc_commit_validation_set( bool dc_commit_context(struct dc *dc, struct validate_context *context);
const struct dc *dc,
const struct dc_validation_set set[],
uint8_t set_count);
/* /*
* Set up streams and links associated to drive sinks * Set up streams and links associated to drive sinks
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment