Reviewed-by: Arun R Murthy <[email protected]> Thanks and Regards, Arun R Murthy --------------------
> -----Original Message----- > From: Intel-gfx <[email protected]> On Behalf Of Imre > Deak > Sent: Thursday, February 19, 2026 11:58 PM > To: [email protected]; [email protected] > Subject: [PATCH 5/5] drm/i915/dp_tunnel: Send BW change notification after > tunnel creation > > Detecting a bandwidth change for a sink connected through a DP tunnel > depends on updating the sink's DPRX link rate and lane count. > > detect_new_tunnel() -> update_tunnel_state() updates the link configuration > only if the tunnel state changes. However, after the tunnel is created and > bandwidth allocation mode is enabled, the tunnel state itself may remain > unchanged. > > Record the sink bandwidth before creating the tunnel and compare it to the > bandwidth after tunnel creation and enabling bandwidth allocation mode, > ensuring that any bandwidth change is detected and userspace is notified > accordingly. > > Signed-off-by: Imre Deak <[email protected]> > --- > .../gpu/drm/i915/display/intel_dp_tunnel.c | 25 +++++++++++++++---- > 1 file changed, 20 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c > b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c > index 1c552a7091897..4b743387b15a6 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_tunnel.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_tunnel.c > @@ -62,7 +62,7 @@ static int get_current_link_bw(struct intel_dp *intel_dp) > return intel_dp_max_link_data_rate(intel_dp, rate, lane_count); } > > -static int __update_tunnel_state(struct intel_dp *intel_dp) > +static int __update_tunnel_state(struct intel_dp *intel_dp, bool > +force_sink_update) > { > struct intel_display *display = to_intel_display(intel_dp); > struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; @@ > -79,8 +79,8 @@ static int __update_tunnel_state(struct intel_dp *intel_dp) > return ret; > } > > - if (ret == 0 || > - !drm_dp_tunnel_bw_alloc_is_enabled(intel_dp->tunnel)) > + if (!force_sink_update && > + (ret == 0 || > +!drm_dp_tunnel_bw_alloc_is_enabled(intel_dp->tunnel))) > return 0; > > intel_dp_update_sink_caps(intel_dp); > @@ -124,7 +124,7 @@ static int update_tunnel_state(struct intel_dp > *intel_dp) > > old_bw = get_current_link_bw(intel_dp); > > - err = __update_tunnel_state(intel_dp); > + err = __update_tunnel_state(intel_dp, false); > if (err) > return err; > > @@ -187,13 +187,24 @@ static int allocate_initial_tunnel_bw(struct intel_dp > *intel_dp, > return allocate_initial_tunnel_bw_for_pipes(intel_dp, pipe_mask); } > > +/* > + * Returns: > + * - 0 in case of success - after any tunnel detected and added to > +@intel_dp > + * - 1 in case of success - after a tunnel detected and added to @intel_dp, > + * where the link BW via the tunnel changed in a way requiring a user > + * notification > + * - Negative error code if the tunnel detection failed */ > static int detect_new_tunnel(struct intel_dp *intel_dp, struct > drm_modeset_acquire_ctx *ctx) { > struct intel_display *display = to_intel_display(intel_dp); > struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; > struct drm_dp_tunnel *tunnel; > + int old_bw; > int ret; > > + old_bw = get_current_link_bw(intel_dp); > + > tunnel = drm_dp_tunnel_detect(display->dp_tunnel_mgr, > &intel_dp->aux); > if (IS_ERR(tunnel)) > @@ -223,7 +234,11 @@ static int detect_new_tunnel(struct intel_dp > *intel_dp, struct drm_modeset_acqui > return ret; > } > > - return update_tunnel_state(intel_dp); > + ret = __update_tunnel_state(intel_dp, true); > + if (ret) > + return ret; > + > + return has_tunnel_bw_changed(intel_dp, old_bw) ? 1 : 0; > } > > /** > -- > 2.49.1
