Commit d2d7885f authored by Anthony Koo's avatar Anthony Koo Committed by Alex Deucher

drm/amd/display: add seamless boot flag to stream

[Why]
If we determine the stream we are trying to commit
matches HW, we want to try to optimize.

[How]
Try to acquire the HW resources that are already enabled
and optimize.
Also skip backend reprogramming
Signed-off-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ff582b61
...@@ -1096,6 +1096,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c ...@@ -1096,6 +1096,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
const struct dc_link *link = context->streams[i]->link; const struct dc_link *link = context->streams[i]->link;
struct dc_stream_status *status; struct dc_stream_status *status;
if (context->streams[i]->apply_seamless_boot_optimization)
context->streams[i]->apply_seamless_boot_optimization = false;
if (!context->streams[i]->mode_changed) if (!context->streams[i]->mode_changed)
continue; continue;
......
...@@ -2579,13 +2579,23 @@ void core_link_enable_stream( ...@@ -2579,13 +2579,23 @@ void core_link_enable_stream(
&stream->timing); &stream->timing);
if (!IS_FPGA_MAXIMUS_DC(core_dc->ctx->dce_environment)) { if (!IS_FPGA_MAXIMUS_DC(core_dc->ctx->dce_environment)) {
bool apply_edp_fast_boot_optimization =
pipe_ctx->stream->apply_edp_fast_boot_optimization;
pipe_ctx->stream->apply_edp_fast_boot_optimization = false;
resource_build_info_frame(pipe_ctx); resource_build_info_frame(pipe_ctx);
core_dc->hwss.update_info_frame(pipe_ctx); core_dc->hwss.update_info_frame(pipe_ctx);
/* Do not touch link on seamless boot optimization. */
if (pipe_ctx->stream->apply_seamless_boot_optimization) {
pipe_ctx->stream->dpms_off = false;
return;
}
/* eDP lit up by bios already, no need to enable again. */ /* eDP lit up by bios already, no need to enable again. */
if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP && if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP &&
pipe_ctx->stream->apply_edp_fast_boot_optimization) { apply_edp_fast_boot_optimization) {
pipe_ctx->stream->apply_edp_fast_boot_optimization = false;
pipe_ctx->stream->dpms_off = false; pipe_ctx->stream->dpms_off = false;
return; return;
} }
......
...@@ -1800,6 +1800,51 @@ static void calculate_phy_pix_clks(struct dc_stream_state *stream) ...@@ -1800,6 +1800,51 @@ static void calculate_phy_pix_clks(struct dc_stream_state *stream)
stream->phy_pix_clk *= 2; stream->phy_pix_clk *= 2;
} }
static int acquire_resource_from_hw_enabled_state(
struct resource_context *res_ctx,
const struct resource_pool *pool,
struct dc_stream_state *stream)
{
struct dc_link *link = stream->link;
unsigned int inst;
/* Check for enabled DIG to identify enabled display */
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
return -1;
/* Check for which front end is used by this encoder.
* Note the inst is 1 indexed, where 0 is undefined.
* Note that DIG_FE can source from different OTG but our
* current implementation always map 1-to-1, so this code makes
* the same assumption and doesn't check OTG source.
*/
inst = link->link_enc->funcs->get_dig_frontend(link->link_enc) - 1;
/* Instance should be within the range of the pool */
if (inst >= pool->pipe_count)
return -1;
if (!res_ctx->pipe_ctx[inst].stream) {
struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[inst];
pipe_ctx->stream_res.tg = pool->timing_generators[inst];
pipe_ctx->plane_res.mi = pool->mis[inst];
pipe_ctx->plane_res.hubp = pool->hubps[inst];
pipe_ctx->plane_res.ipp = pool->ipps[inst];
pipe_ctx->plane_res.xfm = pool->transforms[inst];
pipe_ctx->plane_res.dpp = pool->dpps[inst];
pipe_ctx->stream_res.opp = pool->opps[inst];
if (pool->dpps[inst])
pipe_ctx->plane_res.mpcc_inst = pool->dpps[inst]->inst;
pipe_ctx->pipe_idx = inst;
pipe_ctx->stream = stream;
return inst;
}
return -1;
}
enum dc_status resource_map_pool_resources( enum dc_status resource_map_pool_resources(
const struct dc *dc, const struct dc *dc,
struct dc_state *context, struct dc_state *context,
...@@ -1824,6 +1869,13 @@ enum dc_status resource_map_pool_resources( ...@@ -1824,6 +1869,13 @@ enum dc_status resource_map_pool_resources(
calculate_phy_pix_clks(stream); calculate_phy_pix_clks(stream);
if (stream->apply_seamless_boot_optimization)
pipe_idx = acquire_resource_from_hw_enabled_state(
&context->res_ctx,
pool,
stream);
if (pipe_idx < 0)
/* acquire new resources */ /* acquire new resources */
pipe_idx = acquire_first_free_pipe(&context->res_ctx, pool, stream); pipe_idx = acquire_first_free_pipe(&context->res_ctx, pool, stream);
......
...@@ -119,7 +119,6 @@ struct dc_stream_state { ...@@ -119,7 +119,6 @@ struct dc_stream_state {
int phy_pix_clk; int phy_pix_clk;
enum signal_type signal; enum signal_type signal;
bool dpms_off; bool dpms_off;
bool apply_edp_fast_boot_optimization;
void *dm_stream_context; void *dm_stream_context;
...@@ -146,6 +145,9 @@ struct dc_stream_state { ...@@ -146,6 +145,9 @@ struct dc_stream_state {
uint8_t otg_offset; uint8_t otg_offset;
} out; } out;
bool apply_edp_fast_boot_optimization;
bool apply_seamless_boot_optimization;
uint32_t stream_id; uint32_t stream_id;
}; };
......
...@@ -1339,6 +1339,8 @@ static enum dc_status apply_single_controller_ctx_to_hw( ...@@ -1339,6 +1339,8 @@ static enum dc_status apply_single_controller_ctx_to_hw(
} }
/* */ /* */
/* Do not touch stream timing on seamless boot optimization. */
if (!pipe_ctx->stream->apply_seamless_boot_optimization)
dc->hwss.enable_stream_timing(pipe_ctx, context, dc); dc->hwss.enable_stream_timing(pipe_ctx, context, dc);
if (pipe_ctx->stream_res.tg->funcs->program_vupdate_interrupt) if (pipe_ctx->stream_res.tg->funcs->program_vupdate_interrupt)
......
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