[PATCH v4 06/30] drm/dp_mst: Allow DSC in any Synaptics last branch device
Lyude Paul
lyude at redhat.com
Tue Nov 7 22:35:02 UTC 2023
Reviewed-by: Lyude Paul <lyude at redhat.com>
On Mon, 2023-10-30 at 17:58 +0200, Imre Deak wrote:
> The Synaptics MST branch devices support DSC decompression on all their
> output ports, provided that they are last branch devices (with their
> output ports connected to the sinks). The Thinkpad 40B0 TBT dock for
> instance has two such branch devices, a secondary one connected to one
> of the output ports of the primary; hence the decompression needs to be
> enabled in both branch devices to enable decompression for all the
> sinks.
>
> Based on the above add support for enabling decompression in last
> Synaptics branch devices.
>
> Cc: Lyude Paul <lyude at redhat.com>
> Cc: dri-devel at lists.freedesktop.org
> Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
> drivers/gpu/drm/display/drm_dp_mst_topology.c | 21 ++++++++++++-------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> index 5972c93615f18..cc0a8fe84d290 100644
> --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
> @@ -5994,6 +5994,7 @@ static bool drm_dp_mst_is_virtual_dpcd(struct drm_dp_mst_port *port)
> struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
> {
> struct drm_dp_mst_port *immediate_upstream_port;
> + struct drm_dp_aux *immediate_upstream_aux;
> struct drm_dp_mst_port *fec_port;
> struct drm_dp_desc desc = {};
> u8 endpoint_fec;
> @@ -6058,21 +6059,25 @@ struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
> * - Port is on primary branch device
> * - Not a VGA adapter (DP_DWN_STRM_PORT_TYPE_ANALOG)
> */
> - if (drm_dp_read_desc(port->mgr->aux, &desc, true))
> + if (immediate_upstream_port)
> + immediate_upstream_aux = &immediate_upstream_port->aux;
> + else
> + immediate_upstream_aux = port->mgr->aux;
> +
> + if (drm_dp_read_desc(immediate_upstream_aux, &desc, true))
> return NULL;
>
> - if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) &&
> - port->mgr->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14 &&
> - port->parent == port->mgr->mst_primary) {
> + if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD)) {
> u8 dpcd_ext[DP_RECEIVER_CAP_SIZE];
>
> - if (drm_dp_read_dpcd_caps(port->mgr->aux, dpcd_ext) < 0)
> + if (drm_dp_read_dpcd_caps(immediate_upstream_aux, dpcd_ext) < 0)
> return NULL;
>
> - if ((dpcd_ext[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT) &&
> + if (dpcd_ext[DP_DPCD_REV] >= DP_DPCD_REV_14 &&
> + ((dpcd_ext[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT) &&
> ((dpcd_ext[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_TYPE_MASK)
> - != DP_DWN_STRM_PORT_TYPE_ANALOG))
> - return port->mgr->aux;
> + != DP_DWN_STRM_PORT_TYPE_ANALOG)))
> + return immediate_upstream_aux;
> }
>
> /*
--
Cheers,
Lyude Paul (she/her)
Software Engineer at Red Hat
More information about the dri-devel
mailing list