]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/amd/display: Add display only once.
authorBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Thu, 26 Sep 2019 20:55:24 +0000 (16:55 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 18 Nov 2020 19:36:17 +0000 (14:36 -0500)
[Why]
We call add display multiple times because DESIRED->ENABLED cannot
happen instantaneously. We can't compare the new_state/old_state to
avoid this because on unplug we set the state to DESIRED and on hotplug
the state will still be DESIRED.

[How]
Add a flag to dm_connector_state to keep track of when to enable or
disable HDCP

Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: Zhan Liu <zhan.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

index 3c81adac46fc1c56d95cc6a5bf9c63c5aa044014..9df92c6024c0d9c0ead3c297d82fc4cd879ef64a 100644 (file)
@@ -2401,6 +2401,7 @@ static void handle_hpd_irq(void *param)
        enum dc_connection_type new_connection_type = dc_connection_none;
 #ifdef CONFIG_DRM_AMD_DC_HDCP
        struct amdgpu_device *adev = drm_to_adev(dev);
+       struct dm_connector_state *dm_con_state = to_dm_connector_state(connector->state);
 #endif
 
        /*
@@ -2410,8 +2411,10 @@ static void handle_hpd_irq(void *param)
        mutex_lock(&aconnector->hpd_lock);
 
 #ifdef CONFIG_DRM_AMD_DC_HDCP
-       if (adev->dm.hdcp_workqueue)
+       if (adev->dm.hdcp_workqueue) {
                hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
+               dm_con_state->update_hdcp = true;
+       }
 #endif
        if (aconnector->fake_enable)
                aconnector->fake_enable = false;
@@ -7233,6 +7236,7 @@ static bool is_content_protection_different(struct drm_connector_state *state,
                                            const struct drm_connector *connector, struct hdcp_workqueue *hdcp_w)
 {
        struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
+       struct dm_connector_state *dm_con_state = to_dm_connector_state(connector->state);
 
        if (old_state->hdcp_content_type != state->hdcp_content_type &&
            state->content_protection != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
@@ -7255,14 +7259,16 @@ static bool is_content_protection_different(struct drm_connector_state *state,
        /* Check if something is connected/enabled, otherwise we start hdcp but nothing is connected/enabled
         * hot-plug, headless s3, dpms
         */
-       if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED && connector->dpms == DRM_MODE_DPMS_ON &&
-           aconnector->dc_sink != NULL)
+       if (dm_con_state->update_hdcp && state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
+           connector->dpms == DRM_MODE_DPMS_ON && aconnector->dc_sink != NULL) {
+               dm_con_state->update_hdcp = false;
                return true;
+       }
 
        if (old_state->content_protection == state->content_protection)
                return false;
 
-       if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
+       if (state->content_protection != DRM_MODE_CONTENT_PROTECTION_ENABLED)
                return true;
 
        return false;
@@ -8189,6 +8195,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
                    connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED) {
                        hdcp_reset_display(adev->dm.hdcp_workqueue, aconnector->dc_link->link_index);
                        new_con_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
+                       dm_new_con_state->update_hdcp = true;
                        continue;
                }
 
index 9ba21f6a9842de8b789b56b3e736be5f957a6cd3..0b31779a04856ffef6730ce884299a6ee50afbaa 100644 (file)
@@ -483,6 +483,9 @@ struct dm_connector_state {
        uint8_t underscan_hborder;
        bool underscan_enable;
        bool freesync_capable;
+#ifdef CONFIG_DRM_AMD_DC_HDCP
+       bool update_hdcp;
+#endif
        uint8_t abm_level;
        int vcpi_slots;
        uint64_t pbn;