summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/display/dc/dce112
diff options
context:
space:
mode:
authorAndrey Grodzovsky2017-07-31 17:29:25 +0200
committerAlex Deucher2017-09-27 00:16:46 +0200
commit1dc904974eb7deef924650adc5af542878ce2040 (patch)
tree95442b52c0623207b322a7694674e5937acb00a6 /drivers/gpu/drm/amd/display/dc/dce112
parentdrm/amd/display: refactor pplib/smu communication (diff)
downloadkernel-qcow2-linux-1dc904974eb7deef924650adc5af542878ce2040.tar.gz
kernel-qcow2-linux-1dc904974eb7deef924650adc5af542878ce2040.tar.xz
kernel-qcow2-linux-1dc904974eb7deef924650adc5af542878ce2040.zip
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: Andrey Grodzovsky <Andrey.Grodzovsky@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>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/dce112')
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c143
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h5
2 files changed, 57 insertions, 91 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
index 89a8dfa68c01..85a396ef5aa5 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
@@ -725,35 +725,20 @@ static struct clock_source *find_matching_pll(
static enum dc_status build_mapped_resource(
const struct dc *dc,
struct validate_context *context,
- struct validate_context *old_context)
+ struct dc_stream_state *stream)
{
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 (!pipe_ctx)
+ 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);
+ if (status != DC_OK)
+ return status;
- if (status != DC_OK)
- return status;
-
- resource_build_info_frame(pipe_ctx);
-
- /* do not need to validate non root pipes */
- break;
- }
- }
+ resource_build_info_frame(pipe_ctx);
return DC_OK;
}
@@ -839,45 +824,32 @@ bool dce112_validate_bandwidth(
enum dc_status resource_map_phy_clock_resources(
const struct dc *dc,
struct validate_context *context,
- struct validate_context *old_context)
+ struct dc_stream_state *stream)
{
- uint8_t i, j;
/* acquire new resources */
- 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))
- 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;
+ struct pipe_ctx *pipe_ctx = resource_get_head_pipe_for_stream(
+ &context->res_ctx, stream);
- if (dc_is_dp_signal(pipe_ctx->stream->signal)
- || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL)
- pipe_ctx->clock_source =
- dc->res_pool->dp_clock_source;
- else
- pipe_ctx->clock_source = find_matching_pll(
- &context->res_ctx, dc->res_pool,
- stream);
+ if (!pipe_ctx)
+ return DC_ERROR_UNEXPECTED;
- if (pipe_ctx->clock_source == NULL)
- return DC_NO_CLOCK_SOURCE_RESOURCE;
+ if (dc_is_dp_signal(pipe_ctx->stream->signal)
+ || pipe_ctx->stream->signal == SIGNAL_TYPE_VIRTUAL)
+ pipe_ctx->clock_source =
+ dc->res_pool->dp_clock_source;
+ else
+ pipe_ctx->clock_source = find_matching_pll(
+ &context->res_ctx, dc->res_pool,
+ stream);
- resource_reference_clock_source(
- &context->res_ctx,
- dc->res_pool,
- pipe_ctx->clock_source);
+ if (pipe_ctx->clock_source == NULL)
+ return DC_NO_CLOCK_SOURCE_RESOURCE;
- /* only one cs per stream regardless of mpo */
- break;
- }
- }
+ resource_reference_clock_source(
+ &context->res_ctx,
+ dc->res_pool,
+ pipe_ctx->clock_source);
return DC_OK;
}
@@ -903,46 +875,21 @@ static bool dce112_validate_surface_sets(
return true;
}
-enum dc_status dce112_validate_with_context(
+enum dc_status dce112_add_stream_to_ctx(
struct dc *dc,
- const struct dc_validation_set set[],
- int set_count,
- struct validate_context *context,
- struct validate_context *old_context)
+ struct validate_context *new_ctx,
+ struct dc_stream_state *dc_stream)
{
- struct dc_context *dc_ctx = dc->ctx;
enum dc_status result = DC_ERROR_UNEXPECTED;
- int i;
- if (!dce112_validate_surface_sets(set, set_count))
- 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);
+ result = resource_map_pool_resources(dc, new_ctx, dc_stream);
if (result == DC_OK)
- result = resource_map_phy_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;
- }
+ result = resource_map_phy_clock_resources(dc, new_ctx, dc_stream);
- 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 (!dce112_validate_bandwidth(dc, context))
- result = DC_FAIL_BANDWIDTH_VALIDATE;
+ result = build_mapped_resource(dc, new_ctx, dc_stream);
return result;
}
@@ -958,13 +905,13 @@ enum dc_status dce112_validate_guaranteed(
dc_stream_retain(context->streams[0]);
context->stream_count++;
- result = resource_map_pool_resources(dc, context, NULL);
+ result = resource_map_pool_resources(dc, context, stream);
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)
- result = build_mapped_resource(dc, context, NULL);
+ result = build_mapped_resource(dc, context, stream);
if (result == DC_OK) {
validate_guaranteed_copy_streams(
@@ -979,6 +926,19 @@ enum dc_status dce112_validate_guaranteed(
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)
{
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)
static const struct resource_funcs dce112_res_pool_funcs = {
.destroy = dce112_destroy_resource_pool,
.link_enc_create = dce112_link_encoder_create,
- .validate_with_context = dce112_validate_with_context,
.validate_guaranteed = dce112_validate_guaranteed,
.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)
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
index 69f8f689196d..f1834bfe3d1e 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.h
@@ -51,6 +51,11 @@ bool dce112_validate_bandwidth(
struct dc *dc,
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__ */