On 07/22, Timur Kristóf wrote: > Apparently, both DCE 6.0 and 6.4 have 3 PLLs, but PLL0 can only > be used for DP. Make sure to initialize the correct amount of PLLs > in DC for these DCE versions and use PLL0 only for DP. > > Also, on DCE 6.0 and 6.4, the PLL0 needs to be powered on at > initialization as opposed to DCE 6.1 and 7.x which use a different > clock source for DFS. > > The following functions were used as reference from the old > radeon driver implementation of DCE 6.x: > - radeon_atom_pick_pll > - atombios_crtc_set_disp_eng_pll > > Signed-off-by: Timur Kristóf <timur.kris...@gmail.com> > --- > .../display/dc/clk_mgr/dce100/dce_clk_mgr.c | 5 +++ > .../dc/resource/dce60/dce60_resource.c | 34 +++++++++++-------- > 2 files changed, 25 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c > b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c > index 26feefbb8990..f5ad0a177038 100644 > --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c > +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce100/dce_clk_mgr.c > @@ -245,6 +245,11 @@ int dce_set_clock( > pxl_clk_params.target_pixel_clock_100hz = requested_clk_khz * 10; > pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS; > > + /* DCE 6.0, DCE 6.4: engine clock is the same as PLL0 */ > + if (clk_mgr_base->ctx->dce_version == DCE_VERSION_6_0 || > + clk_mgr_base->ctx->dce_version == DCE_VERSION_6_4) > + pxl_clk_params.pll_id = CLOCK_SOURCE_ID_PLL0; > + > if (clk_mgr_dce->dfs_bypass_active) > pxl_clk_params.flags.SET_DISPCLK_DFS_BYPASS = true; > > diff --git a/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c > b/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c > index 58b59d52dc9d..53b60044653f 100644 > --- a/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c > +++ b/drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c > @@ -373,7 +373,7 @@ static const struct resource_caps res_cap = { > .num_timing_generator = 6, > .num_audio = 6, > .num_stream_encoder = 6, > - .num_pll = 2, > + .num_pll = 3, > .num_ddc = 6, > }; > > @@ -389,7 +389,7 @@ static const struct resource_caps res_cap_64 = { > .num_timing_generator = 2, > .num_audio = 2, > .num_stream_encoder = 2, > - .num_pll = 2, > + .num_pll = 3, > .num_ddc = 2, > }; > > @@ -973,21 +973,24 @@ static bool dce60_construct( > > if (bp->fw_info_valid && > bp->fw_info.external_clock_source_frequency_for_dp != 0) { > pool->base.dp_clock_source = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_EXTERNAL, NULL, true); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_EXTERNAL, NULL, true); > > + /* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't > initialize it here. */ > pool->base.clock_sources[0] = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], false); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false); > pool->base.clock_sources[1] = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false); > pool->base.clk_src_count = 2; > > } else { > pool->base.dp_clock_source = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true); > > pool->base.clock_sources[0] = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false); > - pool->base.clk_src_count = 1; > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false); > + pool->base.clock_sources[1] = > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false); > + pool->base.clk_src_count = 2; > } > > if (pool->base.dp_clock_source == NULL) { > @@ -1365,21 +1368,24 @@ static bool dce64_construct( > > if (bp->fw_info_valid && > bp->fw_info.external_clock_source_frequency_for_dp != 0) { > pool->base.dp_clock_source = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_EXTERNAL, NULL, true); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_EXTERNAL, NULL, true); > > + /* DCE 6.0 and 6.4: PLL0 can only be used with DP. Don't > initialize it here. */ > pool->base.clock_sources[0] = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], false); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false); > pool->base.clock_sources[1] = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false); > pool->base.clk_src_count = 2; > > } else { > pool->base.dp_clock_source = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[0], true); > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL0, &clk_src_regs[0], true); > > pool->base.clock_sources[0] = > - dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL2, &clk_src_regs[1], false); > - pool->base.clk_src_count = 1; > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL1, &clk_src_regs[1], false); > + pool->base.clock_sources[1] = > + dce60_clock_source_create(ctx, bp, > CLOCK_SOURCE_ID_PLL2, &clk_src_regs[2], false); > + pool->base.clk_src_count = 2; > } > > if (pool->base.dp_clock_source == NULL) { > -- > 2.50.1 >
Reviewed-by: Rodrigo Siqueira <sique...@igalia.com> Again, I'm adding other displays folks for further review. Thanks -- Rodrigo Siqueira