On 2023-08-17 09:58, Alex Deucher wrote: > On Thu, Aug 17, 2023 at 8:45 AM Alex Hung <alex.hung@xxxxxxx> wrote: >> >> From: Harry Wentland <harry.wentland@xxxxxxx> >> >> [WHAT] >> Prepare a virtual connector for writeback. > > I presume the main point of virtual connectors in DC is for writeback? > Would there be a case where the virtual type would be mis-interpreted > in DC as something else? > Yes, the only purpose is writeback. In theory one could also use it to expose a virtual connector, but I'd rather keep that as is, with amdgpu_vkms handling it. Without DM making use of it DC shouldn't really be doing anything with it. Harry > Alex > >> >> Signed-off-by: Harry Wentland <harry.wentland@xxxxxxx> >> Signed-off-by: Alex Hung <alex.hung@xxxxxxx> >> --- >> drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 11 +++++++++-- >> drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c | 3 ++- >> 2 files changed, 11 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >> index b1245b732cc9..00254fdfa1f7 100644 >> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c >> @@ -1675,6 +1675,10 @@ static int amdgpu_dm_init(struct amdgpu_device *adev) >> init_data.dcn_reg_offsets = adev->reg_offset[DCE_HWIP][0]; >> init_data.nbio_reg_offsets = adev->reg_offset[NBIO_HWIP][0]; >> >> + /* Enable DWB for tested platforms only */ >> + if (adev->ip_versions[DCE_HWIP][0] >= IP_VERSION(3, 0, 0)) >> + init_data.num_virtual_links = 1; >> + >> INIT_LIST_HEAD(&adev->dm.da_list); >> >> retrieve_dmi_info(&adev->dm); >> @@ -4385,6 +4389,11 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) >> continue; >> } >> >> + link = dc_get_link_at_index(dm->dc, i); >> + >> + if (link->connector_signal == SIGNAL_TYPE_VIRTUAL) >> + continue; >> + >> aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL); >> if (!aconnector) >> goto fail; >> @@ -4403,8 +4412,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) >> goto fail; >> } >> >> - link = dc_get_link_at_index(dm->dc, i); >> - >> if (!dc_link_detect_connection_type(link, &new_connection_type)) >> DRM_ERROR("KMS: Failed to detect connector\n"); >> >> diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c >> index 2a7f47642a44..65e8504e6063 100644 >> --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c >> +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c >> @@ -96,7 +96,8 @@ static void enable_memory_low_power(struct dc *dc) >> if (dc->debug.enable_mem_low_power.bits.vpg && dc->res_pool->stream_enc[0]->vpg->funcs->vpg_powerdown) { >> // Power down VPGs >> for (i = 0; i < dc->res_pool->stream_enc_count; i++) >> - dc->res_pool->stream_enc[i]->vpg->funcs->vpg_powerdown(dc->res_pool->stream_enc[i]->vpg); >> + if (dc->res_pool->stream_enc[i]->vpg) >> + dc->res_pool->stream_enc[i]->vpg->funcs->vpg_powerdown(dc->res_pool->stream_enc[i]->vpg); >> #if defined(CONFIG_DRM_AMD_DC_FP) >> for (i = 0; i < dc->res_pool->hpo_dp_stream_enc_count; i++) >> dc->res_pool->hpo_dp_stream_enc[i]->vpg->funcs->vpg_powerdown(dc->res_pool->hpo_dp_stream_enc[i]->vpg); >> -- >> 2.41.0 >>