On Mon, Jul 22, 2024 at 9:55 AM Imre Deak <imre.deak@xxxxxxxxx> wrote: > > In the > if (old_ddps != port->ddps || !created) > if (port->ddps && !port->input) > ret = drm_dp_send_enum_path_resources(); > > sequence the first if's condition is true if the port exists already > (!created) or the port was created anew (hence old_ddps==0) and it was > in the plugged state (port->ddps==1). The second if's condition is true > for output ports in the plugged state. So the function is called for an > output port in the plugged state, regardless if it already existed or > not and regardless of the old plugged state. In all other cases > port->full_pbn can be zeroed as the port is either an input for which > full_pbn is never set, or an output in the unplugged state for which > full_pbn was already zeroed previously or the port was just created > (with port->full_pbn==0). > > Simplify the condition, making it clear that the path resources are > always enumerated for an output port in the plugged state. Would this take care of the cases where a branch device is present between source and the sink and its properly allocating the resources and advertising UHBR capability from branch to sink. This was a bug earlier with UHBR on branch device/ MST hub Manasi > > Cc: Lyude Paul <lyude@xxxxxxxxxx> > Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx > Signed-off-by: Imre Deak <imre.deak@xxxxxxxxx> > --- > drivers/gpu/drm/display/drm_dp_mst_topology.c | 19 ++++++++----------- > 1 file changed, 8 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c b/drivers/gpu/drm/display/drm_dp_mst_topology.c > index 70e4bfc3532e0..bcc5bbed9bd04 100644 > --- a/drivers/gpu/drm/display/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c > @@ -2339,7 +2339,7 @@ drm_dp_mst_handle_link_address_port(struct drm_dp_mst_branch *mstb, > { > struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; > struct drm_dp_mst_port *port; > - int old_ddps = 0, ret; > + int ret; > u8 new_pdt = DP_PEER_DEVICE_NONE; > bool new_mcs = 0; > bool created = false, send_link_addr = false, changed = false; > @@ -2372,7 +2372,6 @@ drm_dp_mst_handle_link_address_port(struct drm_dp_mst_branch *mstb, > */ > drm_modeset_lock(&mgr->base.lock, NULL); > > - old_ddps = port->ddps; > changed = port->ddps != port_msg->ddps || > (port->ddps && > (port->ldps != port_msg->legacy_device_plug_status || > @@ -2407,15 +2406,13 @@ drm_dp_mst_handle_link_address_port(struct drm_dp_mst_branch *mstb, > * Reprobe PBN caps on both hotplug, and when re-probing the link > * for our parent mstb > */ > - if (old_ddps != port->ddps || !created) { > - if (port->ddps && !port->input) { > - ret = drm_dp_send_enum_path_resources(mgr, mstb, > - port); > - if (ret == 1) > - changed = true; > - } else { > - port->full_pbn = 0; > - } > + if (port->ddps && !port->input) { > + ret = drm_dp_send_enum_path_resources(mgr, mstb, > + port); > + if (ret == 1) > + changed = true; > + } else { > + port->full_pbn = 0; > } > > ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs); > -- > 2.44.2 >