drm/amd/display: Move stream validations into seperate function.
authorAndrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Fri, 21 Jul 2017 20:34:36 +0000 (16:34 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 26 Sep 2017 22:15:40 +0000 (18:15 -0400)
Stateless streams validations (not require resource population)
moved into hook to be called directly from DM.

Call dc_validate_stream be before validate_with_context for
non Linux APIs

Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
12 files changed:
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h
drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
drivers/gpu/drm/amd/display/dc/virtual/virtual_link_encoder.c

index 79218805754ed4053973d09d277847be52f3cb9f..9c2faf8e4b141774132f872e9545f49f31bcba45 100644 (file)
@@ -664,6 +664,20 @@ static bool is_validation_required(
        return false;
 }
 
+static bool validate_streams (
+               const struct dc *dc,
+               const struct dc_validation_set set[],
+               int set_count)
+{
+       int i;
+
+       for (i = 0; i < set_count; i++)
+               if (!dc_validate_stream(dc, set[i].stream))
+                       return false;
+
+       return true;
+}
+
 struct validate_context *dc_get_validate_context(
                const struct dc *dc,
                const struct dc_validation_set set[],
@@ -673,6 +687,7 @@ struct validate_context *dc_get_validate_context(
        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;
@@ -711,6 +726,9 @@ bool dc_validate_resources(
        enum dc_status result = DC_ERROR_UNEXPECTED;
        struct validate_context *context;
 
+       if (!validate_streams(dc, set, set_count))
+               return false;
+
        context = dm_alloc(sizeof(struct validate_context));
        if (context == NULL)
                goto context_alloc_fail;
@@ -742,6 +760,9 @@ bool dc_validate_guaranteed(
        enum dc_status result = DC_ERROR_UNEXPECTED;
        struct validate_context *context;
 
+       if (!dc_validate_stream(dc, stream))
+               return false;
+
        context = dm_alloc(sizeof(struct validate_context));
        if (context == NULL)
                goto context_alloc_fail;
@@ -1044,6 +1065,9 @@ bool dc_commit_streams(
 
        }
 
+       if (!validate_streams(dc, set, stream_count))
+               return false;
+
        context = dm_alloc(sizeof(struct validate_context));
        if (context == NULL)
                goto context_alloc_fail;
index 7cb572ff3cba2b816ab7a5fd9e7714aa94f22f77..4403d8244407b768d219fb771142fd9da7a4d7d4 100644 (file)
@@ -1416,23 +1416,17 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
        return normalized_pix_clk;
 }
 
-static void calculate_phy_pix_clks(struct validate_context *context)
+static void calculate_phy_pix_clks(struct core_stream *stream)
 {
-       int i;
-
-       for (i = 0; i < context->stream_count; i++) {
-               struct core_stream *stream = context->streams[i];
-
-               update_stream_signal(stream);
-
-               /* update actual pixel clock on all streams */
-               if (dc_is_hdmi_signal(stream->signal))
-                       stream->phy_pix_clk = get_norm_pix_clk(
-                               &stream->public.timing);
-               else
-                       stream->phy_pix_clk =
-                               stream->public.timing.pix_clk_khz;
-       }
+       update_stream_signal(stream);
+
+       /* update actual pixel clock on all streams */
+       if (dc_is_hdmi_signal(stream->signal))
+               stream->phy_pix_clk = get_norm_pix_clk(
+                       &stream->public.timing);
+       else
+               stream->phy_pix_clk =
+                       stream->public.timing.pix_clk_khz;
 }
 
 enum dc_status resource_map_pool_resources(
@@ -1443,8 +1437,6 @@ enum dc_status resource_map_pool_resources(
        const struct resource_pool *pool = dc->res_pool;
        int i, j;
 
-       calculate_phy_pix_clks(context);
-
        for (i = 0; old_context && i < context->stream_count; i++) {
                struct core_stream *stream = context->streams[i];
 
@@ -2516,3 +2508,36 @@ void resource_build_bit_depth_reduction_params(const struct core_stream *stream,
 
        fmt_bit_depth->pixel_encoding = pixel_encoding;
 }
+
+bool dc_validate_stream(const struct dc *dc, const struct dc_stream *stream)
+{
+       struct core_dc *core_dc = DC_TO_CORE(dc);
+       struct dc_context *dc_ctx = core_dc->ctx;
+       struct core_stream *core_stream = DC_STREAM_TO_CORE(stream);
+       struct dc_link *link = core_stream->sink->link;
+       struct timing_generator *tg = core_dc->res_pool->timing_generators[0];
+       enum dc_status res = DC_OK;
+
+       calculate_phy_pix_clks(core_stream);
+
+       if (!tg->funcs->validate_timing(tg, &core_stream->public.timing))
+               res = DC_FAIL_CONTROLLER_VALIDATE;
+
+       if (res == DC_OK)
+               if (!link->link_enc->funcs->validate_output_with_stream(
+                                               link->link_enc, core_stream))
+                       res = DC_FAIL_ENC_VALIDATE;
+
+       /* TODO: validate audio ASIC caps, encoder */
+
+       if (res == DC_OK)
+               res = dc_link_validate_mode_timing(core_stream,
+                     link,
+                     &core_stream->public.timing);
+
+       if (res != DC_OK)
+               DC_ERROR("Failed validation for stream %p, err:%d, !\n",
+                               stream, res);
+
+       return res == DC_OK;
+}
index 5523bb68f4e8f1d8c56e3a5ee018b2dca5343969..f250e87d39ddb3c10bdc5ee5cc3348596d41e30c 100644 (file)
@@ -559,6 +559,8 @@ struct dc_validation_set {
        uint8_t surface_count;
 };
 
+bool dc_validate_stream(const struct dc *dc, const struct dc_stream *stream);
+
 /*
  * This function takes a set of resources and checks that they are cofunctional.
  *
index 318673da189b7a761add3196dc46a2dd7f66e193..aff0a440d4d3bf0a253b95c9cb5a3f83810eb29c 100644 (file)
@@ -1009,19 +1009,18 @@ bool dce110_link_encoder_construct(
 
 bool dce110_link_encoder_validate_output_with_stream(
        struct link_encoder *enc,
-       struct pipe_ctx *pipe_ctx)
+       const struct core_stream *stream)
 {
-       struct core_stream *stream = pipe_ctx->stream;
        struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
        bool is_valid;
 
-       switch (pipe_ctx->stream->signal) {
+       switch (stream->signal) {
        case SIGNAL_TYPE_DVI_SINGLE_LINK:
        case SIGNAL_TYPE_DVI_DUAL_LINK:
                is_valid = dce110_link_encoder_validate_dvi_output(
                        enc110,
                        stream->sink->link->connector_signal,
-                       pipe_ctx->stream->signal,
+                       stream->signal,
                        &stream->public.timing);
        break;
        case SIGNAL_TYPE_HDMI_TYPE_A:
index fd6ba7efc0f9c7c2f66077ebe05a90cf1730c3df..ded6c61304e64d8d70c00bf41dcbec8ada1c4f11 100644 (file)
@@ -199,7 +199,7 @@ bool dce110_link_encoder_validate_wireless_output(
 
 bool dce110_link_encoder_validate_output_with_stream(
        struct link_encoder *enc,
-       struct pipe_ctx *pipe_ctx);
+       const struct core_stream *stream);
 
 /****************** HW programming ************************/
 
index 6938158bed7fda759b1e6c281c17a22afcd94dc9..3d25a90e49b4133dae2aa66881d65c984d448bcd 100644 (file)
@@ -651,7 +651,7 @@ static void destruct(struct dce110_resource_pool *pool)
                dal_irq_service_destroy(&pool->base.irqs);
 }
 
-static enum dc_status validate_mapped_resource(
+static enum dc_status build_mapped_resource(
                const struct core_dc *dc,
                struct validate_context *context,
                struct validate_context *old_context)
@@ -661,7 +661,6 @@ static enum dc_status validate_mapped_resource(
 
        for (i = 0; i < context->stream_count; i++) {
                struct core_stream *stream = context->streams[i];
-               struct dc_link *link = stream->sink->link;
 
                if (old_context && resource_is_stream_unchanged(old_context, stream))
                        continue;
@@ -673,25 +672,8 @@ static enum dc_status validate_mapped_resource(
                        if (context->res_ctx.pipe_ctx[j].stream != stream)
                                continue;
 
-                       if (!pipe_ctx->tg->funcs->validate_timing(
-                               pipe_ctx->tg, &stream->public.timing))
-                               return DC_FAIL_CONTROLLER_VALIDATE;
-
                        status = dce110_resource_build_pipe_hw_param(pipe_ctx);
 
-                       if (status != DC_OK)
-                               return status;
-
-                       if (!link->link_enc->funcs->validate_output_with_stream(
-                               link->link_enc,
-                               pipe_ctx))
-                               return DC_FAIL_ENC_VALIDATE;
-
-                       /* TODO: validate audio ASIC caps, encoder */
-                       status = dc_link_validate_mode_timing(stream,
-                                                             link,
-                                                             &stream->public.timing);
-
                        if (status != DC_OK)
                                return status;
 
@@ -769,7 +751,7 @@ enum dc_status dce100_validate_with_context(
        }
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, old_context);
+               result = build_mapped_resource(dc, context, old_context);
 
        if (result == DC_OK)
                result = resource_build_scaling_params_for_context(dc, context);
@@ -798,7 +780,7 @@ enum dc_status dce100_validate_guaranteed(
                result = resource_map_clock_resources(dc, context, NULL);
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, NULL);
+               result = build_mapped_resource(dc, context, NULL);
 
        if (result == DC_OK) {
                validate_guaranteed_copy_streams(
index 015306a6ef887e42896f72a2c51ea0199e5494b9..c773351e93af8d20a3a7fb9c3a29c064b446e4c8 100644 (file)
@@ -771,7 +771,7 @@ static bool is_surface_pixel_format_supported(struct pipe_ctx *pipe_ctx, unsigne
        return true;
 }
 
-static enum dc_status validate_mapped_resource(
+static enum dc_status build_mapped_resource(
                const struct core_dc *dc,
                struct validate_context *context,
                struct validate_context *old_context)
@@ -781,7 +781,6 @@ static enum dc_status validate_mapped_resource(
 
        for (i = 0; i < context->stream_count; i++) {
                struct core_stream *stream = context->streams[i];
-               struct dc_link *link = stream->sink->link;
 
                if (old_context && resource_is_stream_unchanged(old_context, stream))
                        continue;
@@ -797,29 +796,13 @@ static enum dc_status validate_mapped_resource(
                                        dc->res_pool->underlay_pipe_index))
                                return DC_SURFACE_PIXEL_FORMAT_UNSUPPORTED;
 
-                       if (!pipe_ctx->tg->funcs->validate_timing(
-                               pipe_ctx->tg, &stream->public.timing))
-                               return DC_FAIL_CONTROLLER_VALIDATE;
-
                        status = dce110_resource_build_pipe_hw_param(pipe_ctx);
 
                        if (status != DC_OK)
                                return status;
 
-                       if (!link->link_enc->funcs->validate_output_with_stream(
-                               link->link_enc,
-                               pipe_ctx))
-                               return DC_FAIL_ENC_VALIDATE;
-
                        /* TODO: validate audio ASIC caps, encoder */
 
-                       status = dc_link_validate_mode_timing(stream,
-                                                             link,
-                                                             &stream->public.timing);
-
-                       if (status != DC_OK)
-                               return status;
-
                        resource_build_info_frame(pipe_ctx);
 
                        /* do not need to validate non root pipes */
@@ -976,7 +959,7 @@ enum dc_status dce110_validate_with_context(
        }
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, old_context);
+               result = build_mapped_resource(dc, context, old_context);
 
        if (result == DC_OK)
                result = resource_build_scaling_params_for_context(dc, context);
@@ -1005,7 +988,7 @@ enum dc_status dce110_validate_guaranteed(
                result = resource_map_clock_resources(dc, context, NULL);
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, NULL);
+               result = build_mapped_resource(dc, context, NULL);
 
        if (result == DC_OK) {
                validate_guaranteed_copy_streams(
index ca1e13e2a3db694764945b2d74b73dbce290c297..19cd99923b2443c484e2e6bc81733c295fa0627c 100644 (file)
@@ -720,7 +720,7 @@ static struct clock_source *find_matching_pll(
        return 0;
 }
 
-static enum dc_status validate_mapped_resource(
+static enum dc_status build_mapped_resource(
                const struct core_dc *dc,
                struct validate_context *context,
                struct validate_context *old_context)
@@ -730,7 +730,6 @@ static enum dc_status validate_mapped_resource(
 
        for (i = 0; i < context->stream_count; i++) {
                struct core_stream *stream = context->streams[i];
-               struct dc_link *link = stream->sink->link;
 
                if (old_context && resource_is_stream_unchanged(old_context, stream))
                        continue;
@@ -742,26 +741,8 @@ static enum dc_status validate_mapped_resource(
                        if (context->res_ctx.pipe_ctx[j].stream != stream)
                                continue;
 
-                       if (!pipe_ctx->tg->funcs->validate_timing(
-                               pipe_ctx->tg, &stream->public.timing))
-                               return DC_FAIL_CONTROLLER_VALIDATE;
-
                        status = dce110_resource_build_pipe_hw_param(pipe_ctx);
 
-                       if (status != DC_OK)
-                               return status;
-
-                       if (!link->link_enc->funcs->validate_output_with_stream(
-                               link->link_enc,
-                               pipe_ctx))
-                               return DC_FAIL_ENC_VALIDATE;
-
-                       /* TODO: validate audio ASIC caps, encoder */
-
-                       status = dc_link_validate_mode_timing(stream,
-                                                             link,
-                                                             &stream->public.timing);
-
                        if (status != DC_OK)
                                return status;
 
@@ -952,7 +933,7 @@ enum dc_status dce112_validate_with_context(
        }
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, old_context);
+               result = build_mapped_resource(dc, context, old_context);
 
        if (result == DC_OK)
                result = resource_build_scaling_params_for_context(dc, context);
@@ -981,7 +962,7 @@ enum dc_status dce112_validate_guaranteed(
                result = resource_map_phy_clock_resources(dc, context, NULL);
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, NULL);
+               result = build_mapped_resource(dc, context, NULL);
 
        if (result == DC_OK) {
                validate_guaranteed_copy_streams(
index b2319dbf3be33b613b341a1212f336e75e8fb829..0123006e53604f83b20c0229e5c2758c6e6d2444 100644 (file)
@@ -667,7 +667,7 @@ static void destruct(struct dce110_resource_pool *pool)
        }
 }
 
-static enum dc_status validate_mapped_resource(
+static enum dc_status build_mapped_resource(
                const struct core_dc *dc,
                struct validate_context *context,
                struct validate_context *old_context)
@@ -677,7 +677,6 @@ static enum dc_status validate_mapped_resource(
 
        for (i = 0; i < context->stream_count; i++) {
                struct core_stream *stream = context->streams[i];
-               struct dc_link *link = stream->sink->link;
 
                if (old_context && resource_is_stream_unchanged(old_context, stream))
                        continue;
@@ -689,26 +688,8 @@ static enum dc_status validate_mapped_resource(
                        if (context->res_ctx.pipe_ctx[j].stream != stream)
                                continue;
 
-                       if (!pipe_ctx->tg->funcs->validate_timing(
-                               pipe_ctx->tg, &stream->public.timing))
-                               return DC_FAIL_CONTROLLER_VALIDATE;
-
                        status = dce110_resource_build_pipe_hw_param(pipe_ctx);
 
-                       if (status != DC_OK)
-                               return status;
-
-                       if (!link->link_enc->funcs->validate_output_with_stream(
-                               link->link_enc,
-                               pipe_ctx))
-                               return DC_FAIL_ENC_VALIDATE;
-
-                       /* TODO: validate audio ASIC caps, encoder */
-
-                       status = dc_link_validate_mode_timing(stream,
-                                                             link,
-                                                             &stream->public.timing);
-
                        if (status != DC_OK)
                                return status;
 
@@ -786,7 +767,7 @@ enum dc_status dce80_validate_with_context(
        }
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, old_context);
+               result = build_mapped_resource(dc, context, old_context);
 
        if (result == DC_OK)
                result = resource_build_scaling_params_for_context(dc, context);
@@ -814,7 +795,7 @@ enum dc_status dce80_validate_guaranteed(
                result = resource_map_clock_resources(dc, context, NULL);
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, NULL);
+               result = build_mapped_resource(dc, context, NULL);
 
        if (result == DC_OK) {
                validate_guaranteed_copy_streams(
index 0110a431e289df6d671b5d895303a95418931c1c..b901ef9689a6ec377bca0d89ee1638a7436c795a 100644 (file)
@@ -835,7 +835,7 @@ static enum dc_status build_pipe_hw_param(struct pipe_ctx *pipe_ctx)
        return DC_OK;
 }
 
-static enum dc_status validate_mapped_resource(
+static enum dc_status build_mapped_resource(
                const struct core_dc *dc,
                struct validate_context *context,
                struct validate_context *old_context)
@@ -845,7 +845,6 @@ static enum dc_status validate_mapped_resource(
 
        for (i = 0; i < context->stream_count; i++) {
                struct core_stream *stream = context->streams[i];
-               struct dc_link *link = stream->sink->link;
 
                if (old_context && resource_is_stream_unchanged(old_context, stream)) {
                        if (stream != NULL && old_context->streams[i] != NULL) {
@@ -870,29 +869,11 @@ static enum dc_status validate_mapped_resource(
                        if (context->res_ctx.pipe_ctx[j].stream != stream)
                                continue;
 
-
-                       if (!pipe_ctx->tg->funcs->validate_timing(
-                                       pipe_ctx->tg, &stream->public.timing))
-                               return DC_FAIL_CONTROLLER_VALIDATE;
-
                        status = build_pipe_hw_param(pipe_ctx);
 
                        if (status != DC_OK)
                                return status;
 
-                       if (!link->link_enc->funcs->validate_output_with_stream(
-                               link->link_enc, pipe_ctx))
-                               return DC_FAIL_ENC_VALIDATE;
-
-                       /* TODO: validate audio ASIC caps, encoder */
-
-                       status = dc_link_validate_mode_timing(
-                               stream, link, &stream->public.timing);
-
-                       if (status != DC_OK)
-                               return status;
-
-
                        /* do not need to validate non root pipes */
                        break;
                }
@@ -928,7 +909,7 @@ enum dc_status dcn10_validate_with_context(
        if (result != DC_OK)
                return result;
 
-       result = validate_mapped_resource(dc, context, old_context);
+       result = build_mapped_resource(dc, context, old_context);
        if (result != DC_OK)
                return result;
 
@@ -963,7 +944,7 @@ enum dc_status dcn10_validate_guaranteed(
                result = resource_map_phy_clock_resources(dc, context, NULL);
 
        if (result == DC_OK)
-               result = validate_mapped_resource(dc, context, NULL);
+               result = build_mapped_resource(dc, context, NULL);
 
        if (result == DC_OK) {
                validate_guaranteed_copy_streams(
index d330d38aff161c98f81867c42dbbb796a716a1b7..0ee738774f9f539de71e45e232f4007c97e1025e 100644 (file)
@@ -94,7 +94,7 @@ struct link_encoder {
 
 struct link_encoder_funcs {
        bool (*validate_output_with_stream)(
-               struct link_encoder *enc, struct pipe_ctx *pipe_ctx);
+               struct link_encoder *enc, const struct core_stream *stream);
        void (*hw_init)(struct link_encoder *enc);
        void (*setup)(struct link_encoder *enc,
                enum signal_type signal);
index 12df49927f09ed9589b103e647f0ff74de7b685e..d312874d95b50cbcf07c8a765fc96b12372e9b6f 100644 (file)
@@ -30,7 +30,7 @@
 
 static bool virtual_link_encoder_validate_output_with_stream(
        struct link_encoder *enc,
-       struct pipe_ctx *pipe_ctx) { return true; }
+       const struct core_stream *stream) { return true; }
 
 static void virtual_link_encoder_hw_init(struct link_encoder *enc) {}