[PATCH 4/8] drm/i915: Retry HDCP BKSV read

Ramalingam C
2018-02-02T10:51:10Z

When BKSV is invalid, to mitigate any communication errors,
BKSV is read once again.

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
drivers/gpu/drm/i915/intel_hdcp.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index b3f407cef8b0..fa2e7c727d00 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -401,7 +401,7 @@ static int intel_hdcp_auth(struct intel_connector *connector)
struct drm_i915_private *dev_priv;
enum port port;
unsigned long r0_prime_gen_start;
- int ret, i;
+ int ret, i, retry = 1;
union {
u32 reg[2];
u8 shim[DRM_HDCP_AN_LEN];
@@ -443,11 +443,16 @@ static int intel_hdcp_auth(struct intel_connector *connector)
r0_prime_gen_start = jiffies;

memset(&bksv, 0, sizeof(bksv));
- ret = shim->read_bksv(intel_dig_port, bksv.shim);
+
+ do {
+ ret = shim->read_bksv(intel_dig_port, bksv.shim);
+ if (!ret)
+ if (!intel_hdcp_is_ksv_valid(bksv.shim))
+ ret = -ENODEV;
+ } while (ret && retry--);
+
if (ret)
return ret;
- else if (!intel_hdcp_is_ksv_valid(bksv.shim))
- return -ENODEV;

I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);
--
2.7.4