> -----Original Message-----
> From: Jani Nikula <[email protected]>
> Sent: Monday, February 23, 2026 10:18 PM
> To: Murthy, Arun R <[email protected]>; [email protected];
> [email protected]
> Cc: Kandpal, Suraj <[email protected]>; Murthy, Arun R
> <[email protected]>; Deak, Imre <[email protected]>
> Subject: Re: [PATCH] drm/i915/display/dp: On dpcd init/caps wake the dprx
>
> On Thu, 19 Feb 2026, Arun R Murthy <[email protected]> wrote:
> > Before reading the dpcd caps for eDP wake the sink device and for DP
> > after reading the lttpr caps and before reading the dpcd caps wake up
> > the sink device.
> >
> > Signed-off-by: Arun R Murthy <[email protected]>
> > ---
> > drivers/gpu/drm/i915/display/intel_dp.c | 28 +++++++++++++++++++
> > drivers/gpu/drm/i915/display/intel_dp.h | 1 +
> > .../drm/i915/display/intel_dp_link_training.c | 3 ++
> > 3 files changed, 32 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> > b/drivers/gpu/drm/i915/display/intel_dp.c
> > index 454e6144ee4e..4d86826dba1b 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -4705,6 +4705,32 @@ intel_edp_set_sink_rates(struct intel_dp
> *intel_dp)
> > intel_edp_set_data_override_rates(intel_dp);
> > }
> >
> > +void intel_dp_wake_sink(struct intel_dp *intel_dp) {
> > + u8 value = 0;
> > + int ret = 0, try = 0;
> > +
> > + intel_dp_dpcd_set_probe(intel_dp, false);
> > +
> > + /*
> > + * Wake the sink device
> > + * Spec section 2.3.1.2 if AUX CH is powered down by writing 0x02 to
> > + * DP_SET_POWER dpcd reg, 1ms time would be required to wake it up
> > + */
> > + while (try < 10 && ret < 0) {
> > + ret = drm_dp_dpcd_readb(&intel_dp->aux, DP_SET_POWER,
> &value);
> > + if (value)
> > + break;
> > + fsleep(1000);
> > + try++;
> > + }
>
> I'll defer to Imre on the functional change in general, but if we were to add
> this,
> it *must* be written using poll_timeout_us() and friends.
>
> There needs to be an extremely good reason to hand roll new polling loops.
>
> The above loop isn't executed even one time. It's dead code.
>
Based on the comments, this patch was dropped and
https://patchwork.freedesktop.org/series/161818/ was submitted.
Thanks and Regards,
Arun R Murthy
--------------------
>
> BR,
> Jani.
>
>
> > + /* After setting to D0 need a min of 1ms to wake(Spec sec 2.3.1.2) */
> > + drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER,
> DP_SET_POWER_D0);
> > + fsleep(1000);
> > +
> > + intel_dp_dpcd_set_probe(intel_dp, true); }
> > +
> > static bool
> > intel_edp_init_dpcd(struct intel_dp *intel_dp, struct intel_connector
> > *connector) { @@ -4713,6 +4739,8 @@ intel_edp_init_dpcd(struct
> > intel_dp *intel_dp, struct intel_connector *connector
> > /* this function is meant to be called only once */
> > drm_WARN_ON(display->drm, intel_dp->dpcd[DP_DPCD_REV] != 0);
> >
> > + intel_dp_wake_sink(intel_dp);
> > +
> > if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd) != 0)
> > return false;
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.h
> > b/drivers/gpu/drm/i915/display/intel_dp.h
> > index b0bbd5981f57..3f16077c0cc7 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> > @@ -232,6 +232,7 @@ bool intel_dp_dotclk_valid(struct intel_display
> > *display, bool intel_dp_joiner_candidate_valid(struct intel_connector
> *connector,
> > int hdisplay,
> > int num_joined_pipes);
> > +void intel_dp_wake_sink(struct intel_dp *intel_dp);
> >
> > #define for_each_joiner_candidate(__connector, __mode,
> __num_joined_pipes) \
> > for ((__num_joined_pipes) = 1; (__num_joined_pipes) <=
> > (I915_MAX_PIPES); (__num_joined_pipes)++) \ diff --git
> > a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > index 54c585c59b90..cbb712ea9f60 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > @@ -270,6 +270,9 @@ int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp
> *intel_dp)
> > lttpr_count = intel_dp_init_lttpr(intel_dp, dpcd);
> > }
> >
> > + /* After reading LTTPR wake up the sink before reading DPRX caps */
> > + intel_dp_wake_sink(intel_dp);
> > +
> > /*
> > * The DPTX shall read the DPRX caps after LTTPR detection, so re-read
> > * it here.
>
> --
> Jani Nikula, Intel