DRM HDCP SRM revocation check services are used from I915 for HDCP1.4
and 2.2 revocation check during the respective authentication flow.

Signed-off-by: Ramalingam C <ramalinga...@intel.com>
---
 drivers/gpu/drm/i915/intel_hdcp.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
b/drivers/gpu/drm/i915/intel_hdcp.c
index 19130f9b970d..6982a2e6cf9a 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -531,6 +531,11 @@ int intel_hdcp_auth_downstream(struct intel_digital_port 
*intel_dig_port,
        if (ret)
                goto err;
 
+       if (drm_hdcp_ksvs_revocated(ksv_fifo, num_downstream)) {
+               DRM_ERROR("Revocated Ksv(s) in ksv_fifo\n");
+               return -EPERM;
+       }
+
        /*
         * When V prime mismatches, DP Spec mandates re-read of
         * V prime atleast twice.
@@ -625,6 +630,11 @@ static int intel_hdcp_auth(struct intel_digital_port 
*intel_dig_port,
        if (ret < 0)
                return ret;
 
+       if (drm_hdcp_ksvs_revocated(bksv.shim, 1)) {
+               DRM_ERROR("BKSV is revocated\n");
+               return -EPERM;
+       }
+
        I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
        I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);
 
@@ -1193,6 +1203,11 @@ static int hdcp2_authentication_key_exchange(struct 
intel_connector *connector)
 
        hdcp->is_repeater = HDCP_2_2_RX_REPEATER(msgs.send_cert.rx_caps[2]);
 
+       if (drm_hdcp_ksvs_revocated(msgs.send_cert.cert_rx.receiver_id, 1)) {
+               DRM_ERROR("Receiver ID is revocated\n");
+               return -EPERM;
+       }
+
        /*
         * Here msgs.no_stored_km will hold msgs corresponding to the km
         * stored also.
@@ -1350,8 +1365,8 @@ int hdcp2_authenticate_repeater_topology(struct 
intel_connector *connector)
                struct hdcp2_rep_send_ack rep_ack;
        } msgs;
        const struct intel_hdcp_shim *shim = hdcp->shim;
+       u32 seq_num_v, device_cnt;
        u8 *rx_info;
-       u32 seq_num_v;
        int ret;
 
        ret = shim->read_2_2_msg(intel_dig_port, HDCP_2_2_REP_SEND_RECVID_LIST,
@@ -1376,6 +1391,14 @@ int hdcp2_authenticate_repeater_topology(struct 
intel_connector *connector)
                return -EINVAL;
        }
 
+       device_cnt = HDCP_2_2_DEV_COUNT_HI(rx_info[0]) << 4 ||
+                       HDCP_2_2_DEV_COUNT_LO(rx_info[1]);
+       if (drm_hdcp_ksvs_revocated(msgs.recvid_list.receiver_ids,
+                                   device_cnt)) {
+               DRM_ERROR("Revoked receiver ID(s) is in list\n");
+               return -EPERM;
+       }
+
        ret = hdcp2_verify_rep_topology_prepare_ack(connector,
                                                    &msgs.recvid_list,
                                                    &msgs.rep_ack);
-- 
2.19.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to