提交 9345d987 编写于 作者: A Andrey Grodzovsky 提交者: Alex Deucher

drm/amd/display: Move stream validations into seperate function.

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: NAndrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Reviewed-by: NHarry Wentland <Harry.Wentland@amd.com>
Reviewed-by: NTony Cheng <Tony.Cheng@amd.com>
Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
上级 6be425f3
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
......@@ -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;
......
......@@ -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;
}
......@@ -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.
*
......
......@@ -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:
......
......@@ -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 ************************/
......
......@@ -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(
......
......@@ -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(
......
......@@ -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(
......
......@@ -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(
......
......@@ -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(
......
......@@ -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);
......
......@@ -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) {}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部