aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRamalingam C <ramalingam.c@intel.com>2018-02-05 12:32:02 -0500
committerSean Paul <seanpaul@chromium.org>2018-02-05 12:59:07 -0500
commitf622a71d39069e3a0485da436e29ab18eac00b59 (patch)
treeb6a4ba46da3aceb4f78a6455a8a3c8b9b95bc357
parentcb340bf37173d6d85aa6be881d927352fad382f9 (diff)
drm/i915: Retry HDCP bksv read
HDCP specification says that when bksv is identified as invalid (not with 20 1s), bksv should be re-read and verified. This patch adds the above mentioned re-read for bksv. v2: Rephrased the commit msg [Seanpaul] v3: do-while to for-loop [Seanpaul] v4: retry only if bksv is invalid and no error msg on each attempt [Seanpaul] v5: Correcting the return value [Seanpaul]. Signed-off-by: Ramalingam C <ramalingam.c@intel.com> Signed-off-by: Sean Paul <seanpaul@chromium.org> Link: https://patchwork.freedesktop.org/patch/msgid/1517851922-30547-1-git-send-email-ramalingam.c@intel.com
-rw-r--r--drivers/gpu/drm/i915/intel_hdcp.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index cfd13ee8c534..d7ddd6b28cd7 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -397,7 +397,7 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
397 struct drm_i915_private *dev_priv; 397 struct drm_i915_private *dev_priv;
398 enum port port; 398 enum port port;
399 unsigned long r0_prime_gen_start; 399 unsigned long r0_prime_gen_start;
400 int ret, i; 400 int ret, i, tries = 2;
401 union { 401 union {
402 u32 reg[2]; 402 u32 reg[2];
403 u8 shim[DRM_HDCP_AN_LEN]; 403 u8 shim[DRM_HDCP_AN_LEN];
@@ -438,11 +438,19 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
438 r0_prime_gen_start = jiffies; 438 r0_prime_gen_start = jiffies;
439 439
440 memset(&bksv, 0, sizeof(bksv)); 440 memset(&bksv, 0, sizeof(bksv));
441 ret = shim->read_bksv(intel_dig_port, bksv.shim); 441
442 if (ret) 442 /* HDCP spec states that we must retry the bksv if it is invalid */
443 return ret; 443 for (i = 0; i < tries; i++) {
444 else if (!intel_hdcp_is_ksv_valid(bksv.shim)) 444 ret = shim->read_bksv(intel_dig_port, bksv.shim);
445 if (ret)
446 return ret;
447 if (intel_hdcp_is_ksv_valid(bksv.shim))
448 break;
449 }
450 if (i == tries) {
451 DRM_ERROR("HDCP failed, Bksv is invalid\n");
445 return -ENODEV; 452 return -ENODEV;
453 }
446 454
447 I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]); 455 I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
448 I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]); 456 I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);