drm/amd/display: Refactor HDCP encryption status update
authorBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Wed, 4 Sep 2019 20:52:20 +0000 (16:52 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Nov 2019 15:12:53 +0000 (10:12 -0500)
[Why]
The old way was to poll PSP and update the properties. But due to a
limitation in the PSP interface this doesn't work for MST.

[How]
According to PSP if set_encryption return success, the link is encrypted
and the only way it will not be is if we get a link loss(which we handle
already).

So this method should be good enough to report HDCP status.

Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c
drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c
drivers/gpu/drm/amd/display/modules/inc/mod_hdcp.h

index 244a8e80334a7956ec2eaa1052a6f90e0db18aab..f6864a51891aafa3a9bdfd87b4ea300f50e17208 100644 (file)
@@ -85,6 +85,7 @@ static void process_output(struct hdcp_workqueue *hdcp_work)
                schedule_delayed_work(&hdcp_work->watchdog_timer_dwork,
                                      msecs_to_jiffies(output.watchdog_timer_delay));
 
+       schedule_delayed_work(&hdcp_work->property_validate_dwork, msecs_to_jiffies(0));
 }
 
 void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
@@ -234,8 +235,6 @@ static void event_property_validate(struct work_struct *work)
                schedule_work(&hdcp_work->property_update_work);
        }
 
-       schedule_delayed_work(&hdcp_work->property_validate_dwork, msecs_to_jiffies(DRM_HDCP_CHECK_PERIOD_MS));
-
        mutex_unlock(&hdcp_work->mutex);
 }
 
index 0f2f242710b351918fc8e838db32132c83d55a12..cbb5e9c063ec50dedd2d7c31ee9d43f0e979739e 100644 (file)
@@ -417,10 +417,20 @@ enum mod_hdcp_status mod_hdcp_query_display(struct mod_hdcp *hdcp,
        query->trace = &hdcp->connection.trace;
        query->encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
 
-       if (is_hdcp1(hdcp))
-               mod_hdcp_hdcp1_get_link_encryption_status(hdcp, &query->encryption_status);
-       else if (is_hdcp2(hdcp))
-               mod_hdcp_hdcp2_get_link_encryption_status(hdcp, &query->encryption_status);
+       if (is_display_encryption_enabled(display)) {
+               if (is_hdcp1(hdcp)) {
+                       query->encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON;
+               } else if (is_hdcp2(hdcp)) {
+                       if (query->link->adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_0)
+                               query->encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON;
+                       else if (query->link->adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_1)
+                               query->encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON;
+                       else
+                               query->encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_ON;
+               }
+       } else {
+               query->encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
+       }
 
 out:
        return status;
index ff2bb2bfbb53894959b62ec657e48066ee653593..f2a0e1a064da8f755db5d2cfb144ca8b5bb0038e 100644 (file)
@@ -191,9 +191,9 @@ struct mod_hdcp_trace {
 enum mod_hdcp_encryption_status {
        MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF = 0,
        MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON,
-       MOD_HDCP_ENCRYPTION_STATUS_HDCP2_ON,
        MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON,
-       MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON
+       MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON,
+       MOD_HDCP_ENCRYPTION_STATUS_HDCP2_ON
 };
 
 /* per link events dm has to notify to hdcp module */