diff options
author | Ramalingam C <ramalingam.c@intel.com> | 2018-02-05 12:32:02 -0500 |
---|---|---|
committer | Sean Paul <seanpaul@chromium.org> | 2018-02-05 12:59:07 -0500 |
commit | f622a71d39069e3a0485da436e29ab18eac00b59 (patch) | |
tree | b6a4ba46da3aceb4f78a6455a8a3c8b9b95bc357 | |
parent | cb340bf37173d6d85aa6be881d927352fad382f9 (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.c | 18 |
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]); |