[PATCH] drm/i915/hdcp: Retry first read and writes to downstream

Kandpal, Suraj suraj.kandpal at intel.com
Wed Sep 25 11:35:08 UTC 2024



> -----Original Message-----
> From: Jani Nikula <jani.nikula at linux.intel.com>
> Sent: Wednesday, September 25, 2024 2:26 PM
> To: Kandpal, Suraj <suraj.kandpal at intel.com>; intel-
> gfx at lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal at intel.com>; Kandpal, Suraj
> <suraj.kandpal at intel.com>
> Subject: Re: [PATCH] drm/i915/hdcp: Retry first read and writes to
> downstream
> 
> On Wed, 25 Sep 2024, Suraj Kandpal <suraj.kandpal at intel.com> wrote:
> > Retry the first read and write to downstream at least 10 times with a
> > 50ms delay if not hdcp2 capable. The reason being that
> 
> What are the 10 times and 50 ms delay based on?
> 

Multiple trial and errors and getting it working of wd19tb dock, hp type c and Lenovo
Dock,

> > during suspend resume Dock usually keep the HDCP2 registers
> > inaccesible causing AUX error. This wouldn't be a big problem if the
> > userspace just kept retrying with some delay while it continues to
> > play low values content but most userpace applications end up throwing
> > an error when it receives one from KMD. This makes sure we give the
> > dock and the sink devices to complete its power cycle and then try
> > HDCP authentication.
> >
> > Signed-off-by: Suraj Kandpal <suraj.kandpal at intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_hdcp.c | 26
> > +++++++++++++++++------
> >  1 file changed, 19 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index 2afa92321b08..5f2383c219e8 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > @@ -1512,7 +1512,7 @@ static int
> hdcp2_authentication_key_exchange(struct intel_connector *connector)
> >  	} msgs;
> >  	const struct intel_hdcp_shim *shim = hdcp->shim;
> >  	size_t size;
> > -	int ret;
> > +	int ret, i;
> >
> >  	/* Init for seq_num */
> >  	hdcp->seq_num_v = 0;
> > @@ -1522,13 +1522,25 @@ static int
> hdcp2_authentication_key_exchange(struct intel_connector *connector)
> >  	if (ret < 0)
> >  		return ret;
> >
> > -	ret = shim->write_2_2_msg(connector, &msgs.ake_init,
> > -				  sizeof(msgs.ake_init));
> > -	if (ret < 0)
> > -		return ret;
> > +	for (i = 0; i <= 10; i++) {
> 
> I'm pretty nitpicky about this. Please avoid <= in the for loop if you can. Just
> make it the obvious (i = 0; i < 10; i++), or if you have 1 try
> + 10 retries, then i < 10 + 1 or i < 11.
> 
> If the 10 retries is just made up, then maybe just try 10 times total.

Sure will update it to have just < 10

> 
> > +		if (!intel_hdcp2_get_capability(connector)) {
> > +			msleep(50);
> > +			continue;
> > +		}
> 
> This changes behaviour for the first try too. Is that intentional? No mention
> in the commit message?

Yes normally when we se that the aux returns a NACK we also see that hdcp2 capability suddenly
gets reported as not capable hence we add a little delay to give dock a little time to sort itself out.
Will add this in the commit message too.

> 
> > +
> > +		ret = shim->write_2_2_msg(connector, &msgs.ake_init,
> > +					  sizeof(msgs.ake_init));
> > +		if (ret < 0)
> > +			continue;
> > +
> > +		ret = shim->read_2_2_msg(connector,
> HDCP_2_2_AKE_SEND_CERT,
> > +					 &msgs.send_cert,
> sizeof(msgs.send_cert));
> > +		if (ret < 0)
> > +			continue;
> > +		else
> 
> The else is redundant here.

Ohkay we can the if(ret > 0) break
Since we need to come out of the loop as soon as the first write and the read pass

Regards,
Suraj Kandpal
 
> 
> > +			break;
> > +	}
> >
> > -	ret = shim->read_2_2_msg(connector, HDCP_2_2_AKE_SEND_CERT,
> > -				 &msgs.send_cert, sizeof(msgs.send_cert));
> >  	if (ret < 0)
> >  		return ret;
> 
> --
> Jani Nikula, Intel


More information about the Intel-gfx mailing list