| From 94ebc035456a4ccacfbbef60c444079a256623ad Mon Sep 17 00:00:00 2001 |
| From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Date: Fri, 12 Nov 2021 15:27:32 -0500 |
| Subject: drm/amd/display: Allow DSC on supported MST branch devices |
| |
| From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| |
| commit 94ebc035456a4ccacfbbef60c444079a256623ad upstream. |
| |
| [Why] |
| When trying to lightup two 4k60 non-DSC displays behind a branch device |
| that supports DSC we can't lightup both at once due to bandwidth |
| limitations - each requires 48 VCPI slots but we only have 63. |
| |
| [How] |
| The workaround already exists in the code but is guarded by a CONFIG |
| that cannot be set by the user and shouldn't need to be. |
| |
| Check for specific branch device IDs to device whether to enable |
| the workaround for multiple display scenarios. |
| |
| Reviewed-by: Hersen Wu <hersenxs.wu@amd.com> |
| Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> |
| Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 20 +++++++++--- |
| 1 file changed, 16 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c |
| @@ -36,6 +36,8 @@ |
| #include "dm_helpers.h" |
| |
| #include "dc_link_ddc.h" |
| +#include "ddc_service_types.h" |
| +#include "dpcd_defs.h" |
| |
| #include "i2caux_interface.h" |
| #if defined(CONFIG_DEBUG_FS) |
| @@ -152,6 +154,16 @@ static const struct drm_connector_funcs |
| }; |
| |
| #if defined(CONFIG_DRM_AMD_DC_DCN) |
| +static bool needs_dsc_aux_workaround(struct dc_link *link) |
| +{ |
| + if (link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 && |
| + (link->dpcd_caps.dpcd_rev.raw == DPCD_REV_14 || link->dpcd_caps.dpcd_rev.raw == DPCD_REV_12) && |
| + link->dpcd_caps.sink_count.bits.SINK_COUNT >= 2) |
| + return true; |
| + |
| + return false; |
| +} |
| + |
| static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnector) |
| { |
| struct dc_sink *dc_sink = aconnector->dc_sink; |
| @@ -159,7 +171,7 @@ static bool validate_dsc_caps_on_connect |
| u8 dsc_caps[16] = { 0 }; |
| |
| aconnector->dsc_aux = drm_dp_mst_dsc_aux_for_port(port); |
| -#if defined(CONFIG_HP_HOOK_WORKAROUND) |
| + |
| /* |
| * drm_dp_mst_dsc_aux_for_port() will return NULL for certain configs |
| * because it only check the dsc/fec caps of the "port variable" and not the dock |
| @@ -169,10 +181,10 @@ static bool validate_dsc_caps_on_connect |
| * Workaround: explicitly check the use case above and use the mst dock's aux as dsc_aux |
| * |
| */ |
| - |
| - if (!aconnector->dsc_aux && !port->parent->port_parent) |
| + if (!aconnector->dsc_aux && !port->parent->port_parent && |
| + needs_dsc_aux_workaround(aconnector->dc_link)) |
| aconnector->dsc_aux = &aconnector->mst_port->dm_dp_aux.aux; |
| -#endif |
| + |
| if (!aconnector->dsc_aux) |
| return false; |
| |