[PATCH v2] drm/dp_mst: clear time slots for ports invalid
Lyude Paul
lyude at redhat.com
Tue Jan 14 18:59:07 UTC 2020
Pushed, thanks!
On Mon, 2020-01-06 at 18:21 +0800, Wayne Lin wrote:
> [Why]
> When change the connection status in a MST topology, mst device
> which detect the event will send out CONNECTION_STATUS_NOTIFY messgae.
>
> e.g. src-mst-mst-sst => src-mst (unplug) mst-sst
>
> Currently, under the above case of unplugging device, ports which have
> been allocated payloads and are no longer in the topology still occupy
> time slots and recorded in proposed_vcpi[] of topology manager.
>
> If we don't clean up the proposed_vcpi[], when code flow goes to try to
> update payload table by calling drm_dp_update_payload_part1(), we will
> fail at checking port validation due to there are ports with proposed
> time slots but no longer in the mst topology. As the result of that, we
> will also stop updating the DPCD payload table of down stream port.
>
> [How]
> While handling the CONNECTION_STATUS_NOTIFY message, add a detection to
> see if the event indicates that a device is unplugged to an output port.
> If the detection is true, then iterrate over all proposed_vcpi[] to
> see whether a port of the proposed_vcpi[] is still in the topology or
> not. If the port is invalid, set its num_slots to 0.
>
> Thereafter, when try to update payload table by calling
> drm_dp_update_payload_part1(), we can successfully update the DPCD
> payload table of down stream port and clear the proposed_vcpi[] to NULL.
>
> Changes since v1:(https://patchwork.kernel.org/patch/11275801/)
> * Invert the conditional to reduce the indenting
>
> Reviewed-by: Lyude Paul <lyude at redhat.com>
> Signed-off-by: Wayne Lin <Wayne.Lin at amd.com>
> Cc: stable at vger.kernel.org
> ---
> drivers/gpu/drm/drm_dp_mst_topology.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c
> b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 6e10f6235009..e37cd6ec6e36 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -2321,7 +2321,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch
> *mstb,
> {
> struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
> struct drm_dp_mst_port *port;
> - int old_ddps, ret;
> + int old_ddps, old_input, ret, i;
> u8 new_pdt;
> bool dowork = false, create_connector = false;
>
> @@ -2352,6 +2352,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch
> *mstb,
> }
>
> old_ddps = port->ddps;
> + old_input = port->input;
> port->input = conn_stat->input_port;
> port->mcs = conn_stat->message_capability_status;
> port->ldps = conn_stat->legacy_device_plug_status;
> @@ -2376,6 +2377,28 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch
> *mstb,
> dowork = false;
> }
>
> + if (!old_input && old_ddps != port->ddps && !port->ddps) {
> + for (i = 0; i < mgr->max_payloads; i++) {
> + struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
> + struct drm_dp_mst_port *port_validated;
> +
> + if (!vcpi)
> + continue;
> +
> + port_validated =
> + container_of(vcpi, struct drm_dp_mst_port,
> vcpi);
> + port_validated =
> + drm_dp_mst_topology_get_port_validated(mgr,
> port_validated);
> + if (!port_validated) {
> + mutex_lock(&mgr->payload_lock);
> + vcpi->num_slots = 0;
> + mutex_unlock(&mgr->payload_lock);
> + } else {
> + drm_dp_mst_topology_put_port(port_validated);
> + }
> + }
> + }
> +
> if (port->connector)
> drm_modeset_unlock(&mgr->base.lock);
> else if (create_connector)
--
Cheers,
Lyude Paul
More information about the amd-gfx
mailing list