Commit 1dc90497 authored by Andrey Grodzovsky's avatar Andrey Grodzovsky Committed by Alex Deucher

drm/amd/display: Per stream validate_context build v2.

Until now new context would start as empty, then populated
with exsisting pipes + new. Now we start with duplication
of existing context and then add/delete from the context
pipes as needed.

This allows to do a per stream resource
population, start discarding dc_validation_set
and by this brings DC closer to to DRM.

v2: Add some fixes and rebase.
Signed-off-by: default avatarAndrey Grodzovsky <Andrey.Grodzovsky@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 a185048c
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "dm_services_types.h" #include "dm_services_types.h"
#include "dc.h" #include "dc.h"
#include "dc/inc/core_types.h"
#include "vid.h" #include "vid.h"
#include "amdgpu.h" #include "amdgpu.h"
...@@ -690,13 +691,33 @@ struct drm_atomic_state * ...@@ -690,13 +691,33 @@ struct drm_atomic_state *
dm_atomic_state_alloc(struct drm_device *dev) dm_atomic_state_alloc(struct drm_device *dev)
{ {
struct dm_atomic_state *state = kzalloc(sizeof(*state), GFP_KERNEL); struct dm_atomic_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
struct validate_context *new_ctx;
struct amdgpu_device *adev = dev->dev_private;
struct dc *dc = adev->dm.dc;
if (!state || drm_atomic_state_init(dev, &state->base) < 0) { if (!state)
kfree(state);
return NULL; return NULL;
}
if (drm_atomic_state_init(dev, &state->base) < 0)
goto fail;
/* copy existing configuration */
new_ctx = dm_alloc(sizeof(*new_ctx));
if (!new_ctx)
goto fail;
atomic_inc(&new_ctx->ref_count);
dc_resource_validate_ctx_copy_construct_current(dc, new_ctx);
state->context = new_ctx;
return &state->base; return &state->base;
fail:
kfree(state);
return NULL;
} }
static void static void
...@@ -4418,7 +4439,6 @@ static int do_aquire_global_lock( ...@@ -4418,7 +4439,6 @@ static int do_aquire_global_lock(
int amdgpu_dm_atomic_check(struct drm_device *dev, int amdgpu_dm_atomic_check(struct drm_device *dev,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
struct dm_atomic_state *dm_state;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
struct drm_plane *plane; struct drm_plane *plane;
...@@ -4432,6 +4452,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -4432,6 +4452,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
int set_count; int set_count;
struct dc_validation_set set[MAX_STREAMS] = { { 0 } }; struct dc_validation_set set[MAX_STREAMS] = { { 0 } };
struct dm_crtc_state *old_acrtc_state, *new_acrtc_state; struct dm_crtc_state *old_acrtc_state, *new_acrtc_state;
struct dm_atomic_state *dm_state = to_dm_atomic_state(state);
/* /*
* This bool will be set for true for any modeset/reset * This bool will be set for true for any modeset/reset
...@@ -4446,8 +4467,6 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -4446,8 +4467,6 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
return ret; return ret;
} }
dm_state = to_dm_atomic_state(state);
/* copy existing configuration */ /* copy existing configuration */
set_count = 0; set_count = 0;
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
...@@ -4492,6 +4511,15 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -4492,6 +4511,15 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
/* i.e. reset mode */ /* i.e. reset mode */
if (new_acrtc_state->stream) { if (new_acrtc_state->stream) {
if (!dc_remove_stream_from_ctx(
dc,
dm_state->context,
new_acrtc_state->stream)) {
ret = -EINVAL;
goto fail;
}
set_count = remove_from_val_sets( set_count = remove_from_val_sets(
set, set,
set_count, set_count,
...@@ -4539,8 +4567,19 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -4539,8 +4567,19 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
if (modeset_required(crtc_state, new_stream, if (modeset_required(crtc_state, new_stream,
old_acrtc_state->stream)) { old_acrtc_state->stream)) {
if (new_acrtc_state->stream) if (new_acrtc_state->stream) {
if (!dc_remove_stream_from_ctx(
dc,
dm_state->context,
new_acrtc_state->stream)) {
ret = -EINVAL;
goto fail;
}
dc_stream_release(new_acrtc_state->stream); dc_stream_release(new_acrtc_state->stream);
}
new_acrtc_state->stream = new_stream; new_acrtc_state->stream = new_stream;
...@@ -4551,6 +4590,14 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -4551,6 +4590,14 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
new_acrtc_state->stream, new_acrtc_state->stream,
crtc); crtc);
if (!dc_add_stream_to_ctx(
dc,
dm_state->context,
new_acrtc_state->stream)) {
ret = -EINVAL;
goto fail;
}
lock_and_validation_needed = true; lock_and_validation_needed = true;
} else { } else {
/* /*
...@@ -4667,9 +4714,8 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, ...@@ -4667,9 +4714,8 @@ int amdgpu_dm_atomic_check(struct drm_device *dev,
ret = do_aquire_global_lock(dev, state); ret = do_aquire_global_lock(dev, state);
if (ret) if (ret)
goto fail; goto fail;
WARN_ON(dm_state->context);
dm_state->context = dc_get_validate_context(dc, set, set_count); if (!dc_validate_global_state(dc, set, set_count, dm_state->context)) {
if (!dm_state->context) {
ret = -EINVAL; ret = -EINVAL;
goto fail; goto fail;
} }
......
...@@ -669,41 +669,6 @@ void dc_destroy(struct dc **dc) ...@@ -669,41 +669,6 @@ void dc_destroy(struct dc **dc)
*dc = NULL; *dc = NULL;
} }
static bool is_validation_required(
const struct 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].plane_count != context->stream_status[i].plane_count)
return true;
if (!dc_is_stream_unchanged(set[i].stream, context->streams[i]))
return true;
for (j = 0; j < set[i].plane_count; j++) {
struct dc_plane_state temp_plane;
memset(&temp_plane, 0, sizeof(temp_plane));
temp_plane = *context->stream_status[i].plane_states[j];
temp_plane.clip_rect = set[i].plane_states[j]->clip_rect;
temp_plane.dst_rect.x = set[i].plane_states[j]->dst_rect.x;
temp_plane.dst_rect.y = set[i].plane_states[j]->dst_rect.y;
if (memcmp(&temp_plane, set[i].plane_states[j], sizeof(temp_plane)) != 0)
return true;
}
}
return false;
}
static bool validate_streams ( static bool validate_streams (
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], const struct dc_validation_set set[],
...@@ -733,52 +698,12 @@ static bool validate_surfaces( ...@@ -733,52 +698,12 @@ static bool validate_surfaces(
return true; return true;
} }
struct validate_context *dc_get_validate_context(
struct dc *dc,
const struct dc_validation_set set[],
uint8_t set_count)
{
struct dc *core_dc = dc;
enum dc_status result = DC_ERROR_UNEXPECTED;
struct validate_context *context;
context = dm_alloc(sizeof(struct validate_context));
if (context == NULL)
goto context_alloc_fail;
atomic_inc(&context->ref_count);
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, core_dc->current_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_release_validate_context(context);
context = NULL;
}
return context;
}
bool dc_validate_resources( bool dc_validate_resources(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], const struct dc_validation_set set[],
uint8_t set_count) uint8_t set_count)
{ {
struct dc *core_dc = dc; bool result = false;
enum dc_status result = DC_ERROR_UNEXPECTED;
struct validate_context *context; struct validate_context *context;
if (!validate_streams(dc, set, set_count)) if (!validate_streams(dc, set, set_count))
...@@ -793,21 +718,16 @@ bool dc_validate_resources( ...@@ -793,21 +718,16 @@ bool dc_validate_resources(
atomic_inc(&context->ref_count); atomic_inc(&context->ref_count);
result = core_dc->res_pool->funcs->validate_with_context( dc_resource_validate_ctx_copy_construct_current(dc, context);
core_dc, set, set_count, context, NULL);
context_alloc_fail: result = dc_validate_with_context(
if (result != DC_OK) { dc, set, set_count, context);
dm_logger_write(core_dc->ctx->logger, LOG_WARNING,
"%s:resource validation failed, dc_status:%d\n",
__func__,
result);
}
context_alloc_fail:
dc_release_validate_context(context); dc_release_validate_context(context);
context = NULL; context = NULL;
return result == DC_OK; return result;
} }
bool dc_validate_guaranteed( bool dc_validate_guaranteed(
...@@ -1093,7 +1013,7 @@ bool dc_commit_streams( ...@@ -1093,7 +1013,7 @@ bool dc_commit_streams(
uint8_t stream_count) uint8_t stream_count)
{ {
struct dc *core_dc = dc; struct dc *core_dc = dc;
enum dc_status result = DC_ERROR_UNEXPECTED; bool result = false;
struct validate_context *context; struct validate_context *context;
struct dc_validation_set set[MAX_STREAMS] = { {0, {0} } }; struct dc_validation_set set[MAX_STREAMS] = { {0, {0} } };
int i; int i;
...@@ -1135,13 +1055,11 @@ bool dc_commit_streams( ...@@ -1135,13 +1055,11 @@ bool dc_commit_streams(
atomic_inc(&context->ref_count); atomic_inc(&context->ref_count);
result = core_dc->res_pool->funcs->validate_with_context( dc_resource_validate_ctx_copy_construct_current(dc, context);
core_dc, set, stream_count, context, core_dc->current_context);
if (result != DC_OK){ result = dc_validate_with_context(
dm_logger_write(core_dc->ctx->logger, LOG_ERROR, dc, set, stream_count, context);
"%s: Context validation failed! dc_status:%d\n", if (!result) {
__func__,
result);
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
goto fail; goto fail;
} }
...@@ -1152,7 +1070,7 @@ bool dc_commit_streams( ...@@ -1152,7 +1070,7 @@ bool dc_commit_streams(
dc_release_validate_context(context); dc_release_validate_context(context);
context_alloc_fail: context_alloc_fail:
return (result == DC_OK); return result;
} }
bool dc_post_update_surfaces_to_stream(struct dc *dc) bool dc_post_update_surfaces_to_stream(struct dc *dc)
......
...@@ -618,6 +618,16 @@ bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream, ...@@ -618,6 +618,16 @@ bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream,
uint32_t *h_position, uint32_t *h_position,
uint32_t *v_position); uint32_t *v_position);
bool dc_remove_stream_from_ctx(
struct dc *dc,
struct validate_context *new_ctx,
struct dc_stream_state *stream);
bool dc_add_stream_to_ctx(
struct dc *dc,
struct validate_context *new_ctx,
struct dc_stream_state *stream);
/* /*
* Structure to store surface/stream associations for validation * Structure to store surface/stream associations for validation
*/ */
...@@ -630,16 +640,18 @@ struct dc_validation_set { ...@@ -630,16 +640,18 @@ struct dc_validation_set {
bool dc_validate_stream(struct dc *dc, struct dc_stream_state *stream); bool dc_validate_stream(struct dc *dc, struct dc_stream_state *stream);
bool dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state); bool dc_validate_plane(struct dc *dc, const struct dc_plane_state *plane_state);
/*
* This function takes a set of resources and checks that they are cofunctional. bool dc_validate_with_context(
*
* After this call:
* No hardware is programmed for call. Only validation is done.
*/
struct validate_context *dc_get_validate_context(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], const struct dc_validation_set set[],
uint8_t set_count); int set_count,
struct validate_context *context);
bool dc_validate_global_state(
struct dc *dc,
const struct dc_validation_set set[],
int set_count,
struct validate_context *new_ctx);
bool dc_validate_resources( bool dc_validate_resources(
struct dc *dc, struct dc *dc,
...@@ -662,6 +674,10 @@ void dc_resource_validate_ctx_copy_construct( ...@@ -662,6 +674,10 @@ void dc_resource_validate_ctx_copy_construct(
const struct validate_context *src_ctx, const struct validate_context *src_ctx,
struct validate_context *dst_ctx); struct validate_context *dst_ctx);
void dc_resource_validate_ctx_copy_construct_current(
const struct dc *dc,
struct validate_context *dst_ctx);
void dc_resource_validate_ctx_destruct(struct validate_context *context); void dc_resource_validate_ctx_destruct(struct validate_context *context);
/* /*
......
...@@ -654,23 +654,13 @@ static void destruct(struct dce110_resource_pool *pool) ...@@ -654,23 +654,13 @@ static void destruct(struct dce110_resource_pool *pool)
static enum dc_status build_mapped_resource( static enum dc_status build_mapped_resource(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context) struct dc_stream_state *stream)
{ {
enum dc_status status = DC_OK; enum dc_status status = DC_OK;
uint8_t i, j; struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
for (i = 0; i < context->stream_count; i++) { if (!pipe_ctx)
struct dc_stream_state *stream = context->streams[i]; return DC_ERROR_UNEXPECTED;
if (old_context && resource_is_stream_unchanged(old_context, stream))
continue;
for (j = 0; j < MAX_PIPES; j++) {
struct pipe_ctx *pipe_ctx =
&context->res_ctx.pipe_ctx[j];
if (context->res_ctx.pipe_ctx[j].stream != stream)
continue;
status = dce110_resource_build_pipe_hw_param(pipe_ctx); status = dce110_resource_build_pipe_hw_param(pipe_ctx);
...@@ -679,11 +669,6 @@ static enum dc_status build_mapped_resource( ...@@ -679,11 +669,6 @@ static enum dc_status build_mapped_resource(
resource_build_info_frame(pipe_ctx); resource_build_info_frame(pipe_ctx);
/* do not need to validate non root pipes */
break;
}
}
return DC_OK; return DC_OK;
} }
...@@ -719,48 +704,17 @@ static bool dce100_validate_surface_sets( ...@@ -719,48 +704,17 @@ static bool dce100_validate_surface_sets(
return true; return true;
} }
enum dc_status dce100_validate_with_context( enum dc_status dce100_validate_global(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], const struct dc_validation_set set[],
int set_count, int set_count,
struct validate_context *context, struct validate_context *old_context,
struct validate_context *old_context) struct validate_context *context)
{ {
struct dc_context *dc_ctx = dc->ctx;
enum dc_status result = DC_ERROR_UNEXPECTED;
int i;
if (!dce100_validate_surface_sets(set, set_count)) if (!dce100_validate_surface_sets(set, set_count))
return DC_FAIL_SURFACE_VALIDATE; return DC_FAIL_SURFACE_VALIDATE;
for (i = 0; i < set_count; i++) { return DC_OK;
context->streams[i] = set[i].stream;
dc_stream_retain(context->streams[i]);
context->stream_count++;
}
result = resource_map_pool_resources(dc, context, old_context);
if (result == DC_OK)
result = resource_map_clock_resources(dc, context, old_context);
if (!resource_validate_attach_surfaces(set, set_count,
old_context, context, dc->res_pool)) {
DC_ERROR("Failed to attach surface to stream!\n");
return DC_FAIL_ATTACH_SURFACES;
}
if (result == DC_OK)
result = build_mapped_resource(dc, context, old_context);
if (result == DC_OK)
result = resource_build_scaling_params_for_context(dc, context);
if (result == DC_OK)
if (!dce100_validate_bandwidth(dc, context))
result = DC_FAIL_BANDWIDTH_VALIDATE;
return result;
} }
enum dc_status dce100_validate_guaranteed( enum dc_status dce100_validate_guaranteed(
...@@ -774,13 +728,13 @@ enum dc_status dce100_validate_guaranteed( ...@@ -774,13 +728,13 @@ enum dc_status dce100_validate_guaranteed(
dc_stream_retain(context->streams[0]); dc_stream_retain(context->streams[0]);
context->stream_count++; context->stream_count++;
result = resource_map_pool_resources(dc, context, NULL); result = resource_map_pool_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = resource_map_clock_resources(dc, context, NULL); result = resource_map_clock_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = build_mapped_resource(dc, context, NULL); result = build_mapped_resource(dc, context, dc_stream);
if (result == DC_OK) { if (result == DC_OK) {
validate_guaranteed_copy_streams( validate_guaranteed_copy_streams(
...@@ -816,10 +770,10 @@ enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state) ...@@ -816,10 +770,10 @@ enum dc_status dce100_validate_plane(const struct dc_plane_state *plane_state)
static const struct resource_funcs dce100_res_pool_funcs = { static const struct resource_funcs dce100_res_pool_funcs = {
.destroy = dce100_destroy_resource_pool, .destroy = dce100_destroy_resource_pool,
.link_enc_create = dce100_link_encoder_create, .link_enc_create = dce100_link_encoder_create,
.validate_with_context = dce100_validate_with_context,
.validate_guaranteed = dce100_validate_guaranteed, .validate_guaranteed = dce100_validate_guaranteed,
.validate_bandwidth = dce100_validate_bandwidth, .validate_bandwidth = dce100_validate_bandwidth,
.validate_plane = dce100_validate_plane, .validate_plane = dce100_validate_plane,
.validate_global = dce100_validate_global
}; };
static bool construct( static bool construct(
......
...@@ -774,23 +774,13 @@ static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigne ...@@ -774,23 +774,13 @@ static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigne
static enum dc_status build_mapped_resource( static enum dc_status build_mapped_resource(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context) struct dc_stream_state *stream)
{ {
enum dc_status status = DC_OK; enum dc_status status = DC_OK;
uint8_t i, j; struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
for (i = 0; i < context->stream_count; i++) {
struct dc_stream_state *stream = context->streams[i];
if (old_context && resource_is_stream_unchanged(old_context, stream)) if (!pipe_ctx)
continue; return DC_ERROR_UNEXPECTED;
for (j = 0; j < MAX_PIPES; j++) {
struct pipe_ctx *pipe_ctx =
&context->res_ctx.pipe_ctx[j];
if (context->res_ctx.pipe_ctx[j].stream != stream)
continue;
if (!is_surface_pixel_format_supported(pipe_ctx, if (!is_surface_pixel_format_supported(pipe_ctx,
dc->res_pool->underlay_pipe_index)) dc->res_pool->underlay_pipe_index))
...@@ -805,11 +795,6 @@ static enum dc_status build_mapped_resource( ...@@ -805,11 +795,6 @@ static enum dc_status build_mapped_resource(
resource_build_info_frame(pipe_ctx); resource_build_info_frame(pipe_ctx);
/* do not need to validate non root pipes */
break;
}
}
return DC_OK; return DC_OK;
} }
...@@ -927,48 +912,17 @@ static bool dce110_validate_surface_sets( ...@@ -927,48 +912,17 @@ static bool dce110_validate_surface_sets(
return true; return true;
} }
static enum dc_status dce110_validate_with_context( enum dc_status dce110_validate_global(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], const struct dc_validation_set set[],
int set_count, int set_count,
struct validate_context *context, struct validate_context *old_context,
struct validate_context *old_context) struct validate_context *context)
{ {
struct dc_context *dc_ctx = dc->ctx;
enum dc_status result = DC_ERROR_UNEXPECTED;
int i;
if (!dce110_validate_surface_sets(set, set_count)) if (!dce110_validate_surface_sets(set, set_count))
return DC_FAIL_SURFACE_VALIDATE; return DC_FAIL_SURFACE_VALIDATE;
for (i = 0; i < set_count; i++) { return DC_OK;
context->streams[i] = set[i].stream;
dc_stream_retain(context->streams[i]);
context->stream_count++;
}
result = resource_map_pool_resources(dc, context, old_context);
if (result == DC_OK)
result = resource_map_clock_resources(dc, context, old_context);
if (!resource_validate_attach_surfaces(set, set_count,
old_context, context, dc->res_pool)) {
DC_ERROR("Failed to attach surface to stream!\n");
return DC_FAIL_ATTACH_SURFACES;
}
if (result == DC_OK)
result = build_mapped_resource(dc, context, old_context);
if (result == DC_OK)
result = resource_build_scaling_params_for_context(dc, context);
if (result == DC_OK)
if (!dce110_validate_bandwidth(dc, context))
result = DC_FAIL_BANDWIDTH_VALIDATE;
return result;
} }
static enum dc_status dce110_validate_guaranteed( static enum dc_status dce110_validate_guaranteed(
...@@ -982,13 +936,13 @@ static enum dc_status dce110_validate_guaranteed( ...@@ -982,13 +936,13 @@ static enum dc_status dce110_validate_guaranteed(
dc_stream_retain(context->streams[0]); dc_stream_retain(context->streams[0]);
context->stream_count++; context->stream_count++;
result = resource_map_pool_resources(dc, context, NULL); result = resource_map_pool_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = resource_map_clock_resources(dc, context, NULL); result = resource_map_clock_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = build_mapped_resource(dc, context, NULL); result = build_mapped_resource(dc, context, dc_stream);
if (result == DC_OK) { if (result == DC_OK) {
validate_guaranteed_copy_streams( validate_guaranteed_copy_streams(
...@@ -1078,10 +1032,10 @@ static void dce110_destroy_resource_pool(struct resource_pool **pool) ...@@ -1078,10 +1032,10 @@ static void dce110_destroy_resource_pool(struct resource_pool **pool)
static const struct resource_funcs dce110_res_pool_funcs = { static const struct resource_funcs dce110_res_pool_funcs = {
.destroy = dce110_destroy_resource_pool, .destroy = dce110_destroy_resource_pool,
.link_enc_create = dce110_link_encoder_create, .link_enc_create = dce110_link_encoder_create,
.validate_with_context = dce110_validate_with_context,
.validate_guaranteed = dce110_validate_guaranteed, .validate_guaranteed = dce110_validate_guaranteed,
.validate_bandwidth = dce110_validate_bandwidth, .validate_bandwidth = dce110_validate_bandwidth,
.acquire_idle_pipe_for_layer = dce110_acquire_underlay, .acquire_idle_pipe_for_layer = dce110_acquire_underlay,
.validate_global = dce110_validate_global
}; };
static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool) static bool underlay_create(struct dc_context *ctx, struct resource_pool *pool)
......
...@@ -725,23 +725,13 @@ static struct clock_source *find_matching_pll( ...@@ -725,23 +725,13 @@ static struct clock_source *find_matching_pll(
static enum dc_status build_mapped_resource( static enum dc_status build_mapped_resource(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context) struct dc_stream_state *stream)
{ {
enum dc_status status = DC_OK; enum dc_status status = DC_OK;
uint8_t i, j; struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
for (i = 0; i < context->stream_count; i++) { if (!pipe_ctx)
struct dc_stream_state *stream = context->streams[i]; return DC_ERROR_UNEXPECTED;
if (old_context && resource_is_stream_unchanged(old_context, stream))
continue;
for (j = 0; j < MAX_PIPES; j++) {
struct pipe_ctx *pipe_ctx =
&context->res_ctx.pipe_ctx[j];
if (context->res_ctx.pipe_ctx[j].stream != stream)
continue;
status = dce110_resource_build_pipe_hw_param(pipe_ctx); status = dce110_resource_build_pipe_hw_param(pipe_ctx);
...@@ -750,11 +740,6 @@ static enum dc_status build_mapped_resource( ...@@ -750,11 +740,6 @@ static enum dc_status build_mapped_resource(
resource_build_info_frame(pipe_ctx); resource_build_info_frame(pipe_ctx);
/* do not need to validate non root pipes */
break;
}
}
return DC_OK; return DC_OK;
} }
...@@ -839,23 +824,15 @@ bool dce112_validate_bandwidth( ...@@ -839,23 +824,15 @@ bool dce112_validate_bandwidth(
enum dc_status resource_map_phy_clock_resources( enum dc_status resource_map_phy_clock_resources(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context) struct dc_stream_state *stream)
{ {
uint8_t i, j;
/* acquire new resources */ /* acquire new resources */
for (i = 0; i < context->stream_count; i++) { struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(
struct dc_stream_state *stream = context->streams[i]; &context->res_ctx, stream);
if (old_context && resource_is_stream_unchanged(old_context, stream))
continue;
for (j = 0; j < MAX_PIPES; j++) {
struct pipe_ctx *pipe_ctx =
&context->res_ctx.pipe_ctx[j];
if (context->res_ctx.pipe_ctx[j].stream != stream) if (!pipe_ctx)
continue; return DC_ERROR_UNEXPECTED;
if (dc_is_dp_signal(pipe_ctx->stream->signal) if (dc_is_dp_signal(pipe_ctx->stream->signal)
|| pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL) || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL)
...@@ -874,11 +851,6 @@ enum dc_status resource_map_phy_clock_resources( ...@@ -874,11 +851,6 @@ enum dc_status resource_map_phy_clock_resources(
dc->res_pool, dc->res_pool,
pipe_ctx->clock_source); pipe_ctx->clock_source);
/* only one cs per stream regardless of mpo */
break;
}
}
return DC_OK; return DC_OK;
} }
...@@ -903,46 +875,21 @@ static bool dce112_validate_surface_sets( ...@@ -903,46 +875,21 @@ static bool dce112_validate_surface_sets(
return true; return true;
} }
enum dc_status dce112_validate_with_context( enum dc_status dce112_add_stream_to_ctx(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], struct validate_context *new_ctx,
int set_count, struct dc_stream_state *dc_stream)
struct validate_context *context,
struct validate_context *old_context)
{ {
struct dc_context *dc_ctx = dc->ctx;
enum dc_status result = DC_ERROR_UNEXPECTED; enum dc_status result = DC_ERROR_UNEXPECTED;
int i;
if (!dce112_validate_surface_sets(set, set_count)) result = resource_map_pool_resources(dc, new_ctx, dc_stream);
return DC_FAIL_SURFACE_VALIDATE;
for (i = 0; i < set_count; i++) {
context->streams[i] = set[i].stream;
dc_stream_retain(context->streams[i]);
context->stream_count++;
}
result = resource_map_pool_resources(dc, context, old_context);
if (result == DC_OK) if (result == DC_OK)
result = resource_map_phy_clock_resources(dc, context, old_context); result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
if (!resource_validate_attach_surfaces(set, set_count,
old_context, context, dc->res_pool)) {
DC_ERROR("Failed to attach surface to stream!\n");
return DC_FAIL_ATTACH_SURFACES;
}
if (result == DC_OK)
result = build_mapped_resource(dc, context, old_context);
if (result == DC_OK) if (result == DC_OK)
result = resource_build_scaling_params_for_context(dc, context); result = build_mapped_resource(dc, new_ctx, dc_stream);
if (result == DC_OK)
if (!dce112_validate_bandwidth(dc, context))
result = DC_FAIL_BANDWIDTH_VALIDATE;
return result; return result;
} }
...@@ -958,13 +905,13 @@ enum dc_status dce112_validate_guaranteed( ...@@ -958,13 +905,13 @@ enum dc_status dce112_validate_guaranteed(
dc_stream_retain(context->streams[0]); dc_stream_retain(context->streams[0]);
context->stream_count++; context->stream_count++;
result = resource_map_pool_resources(dc, context, NULL); result = resource_map_pool_resources(dc, context, stream);
if (result == DC_OK) if (result == DC_OK)
result = resource_map_phy_clock_resources(dc, context, NULL); result = resource_map_phy_clock_resources(dc, context, stream);
if (result == DC_OK) if (result == DC_OK)
result = build_mapped_resource(dc, context, NULL); result = build_mapped_resource(dc, context, stream);
if (result == DC_OK) { if (result == DC_OK) {
validate_guaranteed_copy_streams( validate_guaranteed_copy_streams(
...@@ -979,6 +926,19 @@ enum dc_status dce112_validate_guaranteed( ...@@ -979,6 +926,19 @@ enum dc_status dce112_validate_guaranteed(
return result; return result;
} }
enum dc_status dce112_validate_global(
struct dc *dc,
const struct dc_validation_set set[],
int set_count,
struct validate_context *old_context,
struct validate_context *context)
{
if (!dce112_validate_surface_sets(set, set_count))
return DC_FAIL_SURFACE_VALIDATE;
return DC_OK;
}
static void dce112_destroy_resource_pool(struct resource_pool **pool) static void dce112_destroy_resource_pool(struct resource_pool **pool)
{ {
struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool); struct dce110_resource_pool *dce110_pool = TO_DCE110_RES_POOL(*pool);
...@@ -991,10 +951,11 @@ static void dce112_destroy_resource_pool(struct resource_pool **pool) ...@@ -991,10 +951,11 @@ static void dce112_destroy_resource_pool(struct resource_pool **pool)
static const struct resource_funcs dce112_res_pool_funcs = { static const struct resource_funcs dce112_res_pool_funcs = {
.destroy = dce112_destroy_resource_pool, .destroy = dce112_destroy_resource_pool,
.link_enc_create = dce112_link_encoder_create, .link_enc_create = dce112_link_encoder_create,
.validate_with_context = dce112_validate_with_context,
.validate_guaranteed = dce112_validate_guaranteed, .validate_guaranteed = dce112_validate_guaranteed,
.validate_bandwidth = dce112_validate_bandwidth, .validate_bandwidth = dce112_validate_bandwidth,
.validate_plane = dce100_validate_plane .validate_plane = dce100_validate_plane,
.add_stream_to_ctx = dce112_add_stream_to_ctx,
.validate_global = dce112_validate_global
}; };
static void bw_calcs_data_update_from_pplib(struct dc *dc) static void bw_calcs_data_update_from_pplib(struct dc *dc)
......
...@@ -51,6 +51,11 @@ bool dce112_validate_bandwidth( ...@@ -51,6 +51,11 @@ bool dce112_validate_bandwidth(
struct dc *dc, struct dc *dc,
struct validate_context *context); struct validate_context *context);
enum dc_status dce112_add_stream_to_ctx(
struct dc *dc,
struct validate_context *new_ctx,
struct dc_stream_state *dc_stream);
#endif /* __DC_RESOURCE_DCE112_H__ */ #endif /* __DC_RESOURCE_DCE112_H__ */
...@@ -698,10 +698,10 @@ static void dce120_destroy_resource_pool(struct resource_pool **pool) ...@@ -698,10 +698,10 @@ static void dce120_destroy_resource_pool(struct resource_pool **pool)
static const struct resource_funcs dce120_res_pool_funcs = { static const struct resource_funcs dce120_res_pool_funcs = {
.destroy = dce120_destroy_resource_pool, .destroy = dce120_destroy_resource_pool,
.link_enc_create = dce120_link_encoder_create, .link_enc_create = dce120_link_encoder_create,
.validate_with_context = dce112_validate_with_context,
.validate_guaranteed = dce112_validate_guaranteed, .validate_guaranteed = dce112_validate_guaranteed,
.validate_bandwidth = dce112_validate_bandwidth, .validate_bandwidth = dce112_validate_bandwidth,
.validate_plane = dce100_validate_plane .validate_plane = dce100_validate_plane,
.add_stream_to_ctx = dce112_add_stream_to_ctx
}; };
static void bw_calcs_data_update_from_pplib(struct dc *dc) static void bw_calcs_data_update_from_pplib(struct dc *dc)
......
...@@ -686,23 +686,13 @@ static void destruct(struct dce110_resource_pool *pool) ...@@ -686,23 +686,13 @@ static void destruct(struct dce110_resource_pool *pool)
static enum dc_status build_mapped_resource( static enum dc_status build_mapped_resource(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context) struct dc_stream_state *stream)
{ {
enum dc_status status = DC_OK; enum dc_status status = DC_OK;
uint8_t i, j; struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
for (i = 0; i < context->stream_count; i++) { if (!pipe_ctx)
struct dc_stream_state *stream = context->streams[i]; return DC_ERROR_UNEXPECTED;
if (old_context && resource_is_stream_unchanged(old_context, stream))
continue;
for (j = 0; j < MAX_PIPES; j++) {
struct pipe_ctx *pipe_ctx =
&context->res_ctx.pipe_ctx[j];
if (context->res_ctx.pipe_ctx[j].stream != stream)
continue;
status = dce110_resource_build_pipe_hw_param(pipe_ctx); status = dce110_resource_build_pipe_hw_param(pipe_ctx);
...@@ -711,11 +701,6 @@ static enum dc_status build_mapped_resource( ...@@ -711,11 +701,6 @@ static enum dc_status build_mapped_resource(
resource_build_info_frame(pipe_ctx); resource_build_info_frame(pipe_ctx);
/* do not need to validate non root pipes */
break;
}
}
return DC_OK; return DC_OK;
} }
...@@ -751,47 +736,17 @@ static bool dce80_validate_surface_sets( ...@@ -751,47 +736,17 @@ static bool dce80_validate_surface_sets(
return true; return true;
} }
enum dc_status dce80_validate_with_context( enum dc_status dce80_validate_global(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], const struct dc_validation_set set[],
int set_count, int set_count,
struct validate_context *context, struct validate_context *old_context,
struct validate_context *old_context) struct validate_context *context)
{ {
struct dc_context *dc_ctx = dc->ctx;
enum dc_status result = DC_ERROR_UNEXPECTED;
int i;
if (!dce80_validate_surface_sets(set, set_count)) if (!dce80_validate_surface_sets(set, set_count))
return DC_FAIL_SURFACE_VALIDATE; return DC_FAIL_SURFACE_VALIDATE;
for (i = 0; i < set_count; i++) { return DC_OK;
context->streams[i] = set[i].stream;
dc_stream_retain(context->streams[i]);
context->stream_count++;
}
result = resource_map_pool_resources(dc, context, old_context);
if (result == DC_OK)
result = resource_map_clock_resources(dc, context, old_context);
if (!resource_validate_attach_surfaces(set, set_count,
old_context, context, dc->res_pool)) {
DC_ERROR("Failed to attach surface to stream!\n");
return DC_FAIL_ATTACH_SURFACES;
}
if (result == DC_OK)
result = build_mapped_resource(dc, context, old_context);
if (result == DC_OK)
result = resource_build_scaling_params_for_context(dc, context);
if (result == DC_OK)
result = dce80_validate_bandwidth(dc, context);
return result;
} }
enum dc_status dce80_validate_guaranteed( enum dc_status dce80_validate_guaranteed(
...@@ -805,13 +760,13 @@ enum dc_status dce80_validate_guaranteed( ...@@ -805,13 +760,13 @@ enum dc_status dce80_validate_guaranteed(
dc_stream_retain(context->streams[0]); dc_stream_retain(context->streams[0]);
context->stream_count++; context->stream_count++;
result = resource_map_pool_resources(dc, context, NULL); result = resource_map_pool_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = resource_map_clock_resources(dc, context, NULL); result = resource_map_clock_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = build_mapped_resource(dc, context, NULL); result = build_mapped_resource(dc, context, dc_stream);
if (result == DC_OK) { if (result == DC_OK) {
validate_guaranteed_copy_streams( validate_guaranteed_copy_streams(
...@@ -837,10 +792,10 @@ static void dce80_destroy_resource_pool(struct resource_pool **pool) ...@@ -837,10 +792,10 @@ static void dce80_destroy_resource_pool(struct resource_pool **pool)
static const struct resource_funcs dce80_res_pool_funcs = { static const struct resource_funcs dce80_res_pool_funcs = {
.destroy = dce80_destroy_resource_pool, .destroy = dce80_destroy_resource_pool,
.link_enc_create = dce80_link_encoder_create, .link_enc_create = dce80_link_encoder_create,
.validate_with_context = dce80_validate_with_context,
.validate_guaranteed = dce80_validate_guaranteed, .validate_guaranteed = dce80_validate_guaranteed,
.validate_bandwidth = dce80_validate_bandwidth, .validate_bandwidth = dce80_validate_bandwidth,
.validate_plane = dce100_validate_plane .validate_plane = dce100_validate_plane,
.validate_global = dce80_validate_global
}; };
static bool dce80_construct( static bool dce80_construct(
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "dce/dce_hwseq.h" #include "dce/dce_hwseq.h"
#include "../virtual/virtual_stream_encoder.h" #include "../virtual/virtual_stream_encoder.h"
#include "dce110/dce110_resource.h" #include "dce110/dce110_resource.h"
#include "dce112/dce112_resource.h"
#include "vega10/soc15ip.h" #include "vega10/soc15ip.h"
...@@ -840,17 +841,15 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx) ...@@ -840,17 +841,15 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
static enum dc_status build_mapped_resource( static enum dc_status build_mapped_resource(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context) struct dc_stream_state *stream)
{ {
enum dc_status status = DC_OK; enum dc_status status = DC_OK;
uint8_t i, j; struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(&context->res_ctx, stream);
for (i = 0; i < context->stream_count; i++) {
struct dc_stream_state *stream = context->streams[i];
if (old_context && resource_is_stream_unchanged(old_context, stream)) { /*TODO Seems unneeded anymore */
/* if (old_context && resource_is_stream_unchanged(old_context, stream)) {
if (stream != NULL && old_context->streams[i] != NULL) { if (stream != NULL && old_context->streams[i] != NULL) {
/* todo: shouldn't have to copy missing parameter here */ todo: shouldn't have to copy missing parameter here
resource_build_bit_depth_reduction_params(stream, resource_build_bit_depth_reduction_params(stream,
&stream->bit_depth_params); &stream->bit_depth_params);
stream->clamping.pixel_encoding = stream->clamping.pixel_encoding =
...@@ -863,68 +862,34 @@ static enum dc_status build_mapped_resource( ...@@ -863,68 +862,34 @@ static enum dc_status build_mapped_resource(
continue; continue;
} }
} }
*/
for (j = 0; j < dc->res_pool->pipe_count ; j++) { if (!pipe_ctx)
struct pipe_ctx *pipe_ctx = return DC_ERROR_UNEXPECTED;
&context->res_ctx.pipe_ctx[j];
if (context->res_ctx.pipe_ctx[j].stream != stream)
continue;
status = build_pipe_hw_param(pipe_ctx); status = build_pipe_hw_param(pipe_ctx);
if (status != DC_OK) if (status != DC_OK)
return status; return status;
/* do not need to validate non root pipes */
break;
}
}
return DC_OK; return DC_OK;
} }
enum dc_status dcn10_validate_with_context( enum dc_status dcn10_add_stream_to_ctx(
struct dc *dc, struct dc *dc,
const struct dc_validation_set set[], struct validate_context *new_ctx,
int set_count, struct dc_stream_state *dc_stream)
struct validate_context *context,
struct validate_context *old_context)
{ {
enum dc_status result = DC_OK; enum dc_status result = DC_ERROR_UNEXPECTED;
int i;
if (set_count == 0)
return result;
for (i = 0; i < set_count; i++) {
context->streams[i] = set[i].stream;
dc_stream_retain(context->streams[i]);
context->stream_count++;
}
result = resource_map_pool_resources(dc, context, old_context);
if (result != DC_OK)
return result;
result = resource_map_phy_clock_resources(dc, context, old_context); result = resource_map_pool_resources(dc, new_ctx, dc_stream);
if (result != DC_OK)
return result;
result = build_mapped_resource(dc, context, old_context); if (result == DC_OK)
if (result != DC_OK) result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
return result;
if (!resource_validate_attach_surfaces(set, set_count,
old_context, context, dc->res_pool))
return DC_FAIL_ATTACH_SURFACES;
result = resource_build_scaling_params_for_context(dc, context);
if (result != DC_OK)
return result;
if (!dcn_validate_bandwidth(dc, context)) if (result == DC_OK)
return DC_FAIL_BANDWIDTH_VALIDATE; result = build_mapped_resource(dc, new_ctx, dc_stream);
return result; return result;
} }
...@@ -940,13 +905,13 @@ enum dc_status dcn10_validate_guaranteed( ...@@ -940,13 +905,13 @@ enum dc_status dcn10_validate_guaranteed(
dc_stream_retain(context->streams[0]); dc_stream_retain(context->streams[0]);
context->stream_count++; context->stream_count++;
result = resource_map_pool_resources(dc, context, NULL); result = resource_map_pool_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = resource_map_phy_clock_resources(dc, context, NULL); result = resource_map_phy_clock_resources(dc, context, dc_stream);
if (result == DC_OK) if (result == DC_OK)
result = build_mapped_resource(dc, context, NULL); result = build_mapped_resource(dc, context, dc_stream);
if (result == DC_OK) { if (result == DC_OK) {
validate_guaranteed_copy_streams( validate_guaranteed_copy_streams(
...@@ -1226,10 +1191,10 @@ static struct dc_cap_funcs cap_funcs = { ...@@ -1226,10 +1191,10 @@ static struct dc_cap_funcs cap_funcs = {
static struct resource_funcs dcn10_res_pool_funcs = { static struct resource_funcs dcn10_res_pool_funcs = {
.destroy = dcn10_destroy_resource_pool, .destroy = dcn10_destroy_resource_pool,
.link_enc_create = dcn10_link_encoder_create, .link_enc_create = dcn10_link_encoder_create,
.validate_with_context = dcn10_validate_with_context,
.validate_guaranteed = dcn10_validate_guaranteed, .validate_guaranteed = dcn10_validate_guaranteed,
.validate_bandwidth = dcn_validate_bandwidth, .validate_bandwidth = dcn_validate_bandwidth,
.acquire_idle_pipe_for_layer = dcn10_acquire_idle_pipe_for_layer, .acquire_idle_pipe_for_layer = dcn10_acquire_idle_pipe_for_layer,
.add_stream_to_ctx = dcn10_add_stream_to_ctx
}; };
static bool construct( static bool construct(
......
...@@ -87,12 +87,6 @@ struct resource_funcs { ...@@ -87,12 +87,6 @@ struct resource_funcs {
void (*destroy)(struct resource_pool **pool); void (*destroy)(struct resource_pool **pool);
struct link_encoder *(*link_enc_create)( struct link_encoder *(*link_enc_create)(
const struct encoder_init_data *init); const struct encoder_init_data *init);
enum dc_status (*validate_with_context)(
struct dc *dc,
const struct dc_validation_set set[],
int set_count,
struct validate_context *context,
struct validate_context *old_context);
enum dc_status (*validate_guaranteed)( enum dc_status (*validate_guaranteed)(
struct dc *dc, struct dc *dc,
...@@ -103,11 +97,24 @@ struct resource_funcs { ...@@ -103,11 +97,24 @@ struct resource_funcs {
struct dc *dc, struct dc *dc,
struct validate_context *context); struct validate_context *context);
enum dc_status (*validate_global)(
struct dc *dc,
const struct dc_validation_set set[],
int set_count,
struct validate_context *old_context,
struct validate_context *context);
struct pipe_ctx *(*acquire_idle_pipe_for_layer)( struct pipe_ctx *(*acquire_idle_pipe_for_layer)(
struct validate_context *context, struct validate_context *context,
const struct resource_pool *pool, const struct resource_pool *pool,
struct dc_stream_state *stream); struct dc_stream_state *stream);
enum dc_status (*validate_plane)(const struct dc_plane_state *plane_state); enum dc_status (*validate_plane)(const struct dc_plane_state *plane_state);
enum dc_status (*add_stream_to_ctx)(
struct dc *dc,
struct validate_context *new_ctx,
struct dc_stream_state *dc_stream);
}; };
struct audio_support{ struct audio_support{
......
...@@ -82,7 +82,7 @@ void dc_destroy_resource_pool(struct dc *dc); ...@@ -82,7 +82,7 @@ void dc_destroy_resource_pool(struct dc *dc);
enum dc_status resource_map_pool_resources( enum dc_status resource_map_pool_resources(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context); struct dc_stream_state *stream);
bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx); bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx);
...@@ -150,12 +150,12 @@ void resource_validate_ctx_update_pointer_after_copy( ...@@ -150,12 +150,12 @@ void resource_validate_ctx_update_pointer_after_copy(
enum dc_status resource_map_clock_resources( enum dc_status resource_map_clock_resources(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context); struct dc_stream_state *stream);
enum dc_status resource_map_phy_clock_resources( enum dc_status resource_map_phy_clock_resources(
const struct dc *dc, const struct dc *dc,
struct validate_context *context, struct validate_context *context,
struct validate_context *old_context); struct dc_stream_state *stream);
bool pipe_need_reprogram( bool pipe_need_reprogram(
struct pipe_ctx *pipe_ctx_old, struct pipe_ctx *pipe_ctx_old,
......
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