mirror of
https://github.com/torvalds/linux.git
synced 2026-05-01 04:52:32 -04:00
drm/amd/display: enabling seamless boot sequence for dcn2
[Why] Seamless boot (building SW state inheriting BIOS-initialized timing) was enabled on DCN2, including fixes [How] Includes fixes for MPC, DPPCLK, and DIG FE mapping/OTG source select/ Pixel clock. This is part 2 of 2 for seamless boot NV10 Signed-off-by: Martin Leung <martin.leung@amd.com> Reviewed-by: Jun Lei <Jun.Lei@amd.com> Acked-by: Leo Li <sunpeng.li@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
39bdac36cc
commit
5ec43eda85
@@ -1098,9 +1098,16 @@ static void dcn10_init_pipes(struct dc *dc, struct dc_state *context)
|
||||
}
|
||||
}
|
||||
|
||||
/* Cannot reset the MPC mux if seamless boot */
|
||||
if (!can_apply_seamless_boot)
|
||||
dc->res_pool->mpc->funcs->mpc_init(dc->res_pool->mpc);
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
/* Cannot reset the MPC mux if seamless boot */
|
||||
if (pipe_ctx->stream != NULL && can_apply_seamless_boot)
|
||||
continue;
|
||||
|
||||
dc->res_pool->mpc->funcs->mpc_init_single_inst(
|
||||
dc->res_pool->mpc, i);
|
||||
}
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct timing_generator *tg = dc->res_pool->timing_generators[i];
|
||||
|
||||
@@ -446,6 +446,46 @@ static uint8_t get_frontend_source(
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int dcn10_get_dig_frontend(struct link_encoder *enc)
|
||||
{
|
||||
struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
|
||||
int32_t value;
|
||||
enum engine_id result;
|
||||
|
||||
REG_GET(DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, &value);
|
||||
|
||||
switch (value) {
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGA:
|
||||
result = ENGINE_ID_DIGA;
|
||||
break;
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGB:
|
||||
result = ENGINE_ID_DIGB;
|
||||
break;
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGC:
|
||||
result = ENGINE_ID_DIGC;
|
||||
break;
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGD:
|
||||
result = ENGINE_ID_DIGD;
|
||||
break;
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGE:
|
||||
result = ENGINE_ID_DIGE;
|
||||
break;
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGF:
|
||||
result = ENGINE_ID_DIGF;
|
||||
break;
|
||||
case DCN10_DIG_FE_SOURCE_SELECT_DIGG:
|
||||
result = ENGINE_ID_DIGG;
|
||||
break;
|
||||
default:
|
||||
// invalid source select DIG
|
||||
ASSERT(false);
|
||||
result = ENGINE_ID_UNKNOWN;
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
void enc1_configure_encoder(
|
||||
struct dcn10_link_encoder *enc10,
|
||||
const struct dc_link_settings *link_settings)
|
||||
@@ -501,15 +541,6 @@ bool dcn10_is_dig_enabled(struct link_encoder *enc)
|
||||
return value;
|
||||
}
|
||||
|
||||
unsigned int dcn10_get_dig_frontend(struct link_encoder *enc)
|
||||
{
|
||||
struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
|
||||
uint32_t value;
|
||||
|
||||
REG_GET(DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, &value);
|
||||
return value;
|
||||
}
|
||||
|
||||
static void link_encoder_disable(struct dcn10_link_encoder *enc10)
|
||||
{
|
||||
/* reset training pattern */
|
||||
|
||||
@@ -364,6 +364,24 @@ void mpc1_mpc_init(struct mpc *mpc)
|
||||
}
|
||||
}
|
||||
|
||||
void mpc1_mpc_init_single_inst(struct mpc *mpc, unsigned int mpcc_id)
|
||||
{
|
||||
struct dcn10_mpc *mpc10 = TO_DCN10_MPC(mpc);
|
||||
int opp_id;
|
||||
|
||||
REG_GET(MPCC_OPP_ID[mpcc_id], MPCC_OPP_ID, &opp_id);
|
||||
|
||||
REG_SET(MPCC_TOP_SEL[mpcc_id], 0, MPCC_TOP_SEL, 0xf);
|
||||
REG_SET(MPCC_BOT_SEL[mpcc_id], 0, MPCC_BOT_SEL, 0xf);
|
||||
REG_SET(MPCC_OPP_ID[mpcc_id], 0, MPCC_OPP_ID, 0xf);
|
||||
|
||||
mpc1_init_mpcc(&(mpc->mpcc_array[mpcc_id]), mpcc_id);
|
||||
|
||||
if (opp_id < MAX_OPP && REG(MUX[opp_id]))
|
||||
REG_UPDATE(MUX[opp_id], MPC_OUT_MUX, 0xf);
|
||||
}
|
||||
|
||||
|
||||
void mpc1_init_mpcc_list_from_hw(
|
||||
struct mpc *mpc,
|
||||
struct mpc_tree *tree)
|
||||
@@ -433,6 +451,7 @@ static const struct mpc_funcs dcn10_mpc_funcs = {
|
||||
.insert_plane = mpc1_insert_plane,
|
||||
.remove_mpcc = mpc1_remove_mpcc,
|
||||
.mpc_init = mpc1_mpc_init,
|
||||
.mpc_init_single_inst = mpc1_mpc_init_single_inst,
|
||||
.get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
|
||||
.wait_for_idle = mpc1_assert_idle_mpcc,
|
||||
.assert_mpcc_idle_before_connect = mpc1_assert_mpcc_idle_before_connect,
|
||||
|
||||
@@ -149,6 +149,10 @@ void mpc1_remove_mpcc(
|
||||
void mpc1_mpc_init(
|
||||
struct mpc *mpc);
|
||||
|
||||
void mpc1_mpc_init_single_inst(
|
||||
struct mpc *mpc,
|
||||
unsigned int mpcc_id);
|
||||
|
||||
void mpc1_assert_idle_mpcc(
|
||||
struct mpc *mpc,
|
||||
int id);
|
||||
|
||||
@@ -539,6 +539,10 @@ struct dcn_otg_state {
|
||||
void optc1_read_otg_state(struct optc *optc1,
|
||||
struct dcn_otg_state *s);
|
||||
|
||||
bool optc1_is_matching_timing(
|
||||
struct timing_generator *tg,
|
||||
const struct dc_crtc_timing *otg_timing);
|
||||
|
||||
bool optc1_validate_timing(
|
||||
struct timing_generator *optc,
|
||||
const struct dc_crtc_timing *timing);
|
||||
|
||||
@@ -1542,6 +1542,17 @@ void enc1_dig_connect_to_otg(
|
||||
REG_UPDATE(DIG_FE_CNTL, DIG_SOURCE_SELECT, tg_inst);
|
||||
}
|
||||
|
||||
unsigned int enc1_dig_source_otg(
|
||||
struct stream_encoder *enc)
|
||||
{
|
||||
uint32_t tg_inst = 0;
|
||||
struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
|
||||
|
||||
REG_GET(DIG_FE_CNTL, DIG_SOURCE_SELECT, &tg_inst);
|
||||
|
||||
return tg_inst;
|
||||
}
|
||||
|
||||
static const struct stream_encoder_funcs dcn10_str_enc_funcs = {
|
||||
.dp_set_stream_attribute =
|
||||
enc1_stream_encoder_dp_set_stream_attribute,
|
||||
@@ -1577,6 +1588,7 @@ static const struct stream_encoder_funcs dcn10_str_enc_funcs = {
|
||||
.set_avmute = enc1_stream_encoder_set_avmute,
|
||||
.dig_connect_to_otg = enc1_dig_connect_to_otg,
|
||||
.hdmi_reset_stream_attribute = enc1_reset_hdmi_stream_attribute,
|
||||
.dig_source_otg = enc1_dig_source_otg,
|
||||
};
|
||||
|
||||
void dcn10_stream_encoder_construct(
|
||||
|
||||
@@ -598,6 +598,9 @@ void enc1_dig_connect_to_otg(
|
||||
struct stream_encoder *enc,
|
||||
int tg_inst);
|
||||
|
||||
unsigned int enc1_dig_source_otg(
|
||||
struct stream_encoder *enc);
|
||||
|
||||
void enc1_stream_encoder_set_stream_attribute_helper(
|
||||
struct dcn10_stream_encoder *enc1,
|
||||
struct dc_crtc_timing *crtc_timing);
|
||||
|
||||
Reference in New Issue
Block a user