diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4506-drm-amd-display-Handle-hdcp2.2-type0-1-in-dm.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4506-drm-amd-display-Handle-hdcp2.2-type0-1-in-dm.patch | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4506-drm-amd-display-Handle-hdcp2.2-type0-1-in-dm.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4506-drm-amd-display-Handle-hdcp2.2-type0-1-in-dm.patch new file mode 100644 index 00000000..490a1df7 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4506-drm-amd-display-Handle-hdcp2.2-type0-1-in-dm.patch @@ -0,0 +1,164 @@ +From 370e7141a7d4f568b25dec0fda37ceaeaa77ce5e Mon Sep 17 00:00:00 2001 +From: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Date: Fri, 16 Aug 2019 14:49:05 -0400 +Subject: [PATCH 4506/4736] drm/amd/display: Handle hdcp2.2 type0/1 in dm + +[Why] +HDCP 2.2 uses type0 and type1 content type. This is passed to the receiver +to stream the proper content. + +For example, in a MST case if the main +device is HDCP2.2 capable but the secondary device is only 1.4 capabale +we can use Type0 + +Type0 content: use HDCP 1.4 or HDCP2.2 type0 +Type1 content: Only use HDCP 2.2 type1 + +[How] +We use the "hdcp content type" property in drm. We use the +disable_type1 flag in hdcp module to select the type based on the +properties. + +For updating the property we use the same logic as 1.4, but now we +consider content_type as well and update the property if the +requirements are met + +Change-Id: I17bffd50b245e119adfba8ea0ad6a1402fcdd939 +Signed-off-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Reviewed-by: Harry Wentland <harry.wentland@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 18 ++++++++++++++---- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 17 +++++++++++++---- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h | 4 ++-- + .../gpu/drm/amd/display/modules/hdcp/hdcp.c | 5 ++++- + 4 files changed, 33 insertions(+), 11 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index ec9fac7d4559..3828a19a87bb 100755 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -43,6 +43,7 @@ + #include "amdgpu_dm.h" + #ifdef CONFIG_DRM_AMD_DC_HDCP + #include "amdgpu_dm_hdcp.h" ++#include <drm/drm_hdcp.h> + #endif + #include "amdgpu_pm.h" + +@@ -5477,7 +5478,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, + adev->mode_info.freesync_capable_property, 0); + #ifdef CONFIG_DRM_AMD_DC_HDCP + if (adev->asic_type >= CHIP_RAVEN) +- drm_connector_attach_content_protection_property(&aconnector->base, false); ++ drm_connector_attach_content_protection_property(&aconnector->base, true); + #endif + } + } +@@ -5728,6 +5729,12 @@ static bool is_content_protection_different(struct drm_connector_state *state, + { + struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); + ++ if (old_state->hdcp_content_type != state->hdcp_content_type && ++ state->content_protection != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { ++ state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED; ++ return true; ++ } ++ + /* CP is being re enabled, ignore this */ + if (old_state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED && + state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) { +@@ -5760,11 +5767,14 @@ static void update_content_protection(struct drm_connector_state *state, const s + struct hdcp_workqueue *hdcp_w) + { + struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); ++ bool disable_type1 = state->hdcp_content_type == DRM_MODE_HDCP_CONTENT_TYPE0 ? true : false; + +- if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) +- hdcp_add_display(hdcp_w, aconnector->dc_link->link_index, aconnector); +- else if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) ++ if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_DESIRED) { ++ hdcp_reset_display(hdcp_w, aconnector->dc_link->link_index); ++ hdcp_add_display(hdcp_w, aconnector->dc_link->link_index, aconnector, disable_type1); ++ } else if (state->content_protection == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { + hdcp_remove_display(hdcp_w, aconnector->dc_link->link_index, aconnector->base.index); ++ } + + } + #endif +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +index 970f2d58c6dc..a2ad1390977d 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +@@ -87,7 +87,8 @@ static void process_output(struct hdcp_workqueue *hdcp_work) + + } + +-void hdcp_add_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index, struct amdgpu_dm_connector *aconnector) ++void hdcp_add_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index, struct amdgpu_dm_connector *aconnector, ++ bool disable_type1) + { + struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index]; + struct mod_hdcp_display *display = &hdcp_work[link_index].display; +@@ -96,6 +97,8 @@ void hdcp_add_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index, + mutex_lock(&hdcp_w->mutex); + hdcp_w->aconnector = aconnector; + ++ hdcp_w->link.adjust.hdcp2.disable_type1 = disable_type1; ++ + mod_hdcp_add_display(&hdcp_w->hdcp, link, display, &hdcp_w->output); + + schedule_delayed_work(&hdcp_w->property_validate_dwork, msecs_to_jiffies(DRM_HDCP_CHECK_PERIOD_MS)); +@@ -190,10 +193,16 @@ static void event_property_update(struct work_struct *work) + } + } + +- if (hdcp_work->encryption_status != MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF) +- drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_ENABLED); +- else ++ if (hdcp_work->encryption_status != MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF) { ++ if (aconnector->base.state->hdcp_content_type == DRM_MODE_HDCP_CONTENT_TYPE0 && ++ hdcp_work->encryption_status <= MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON) ++ drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_ENABLED); ++ else if (aconnector->base.state->hdcp_content_type == DRM_MODE_HDCP_CONTENT_TYPE1 && ++ hdcp_work->encryption_status == MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON) ++ drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_ENABLED); ++ } else { + drm_hdcp_update_content_protection(&aconnector->base, DRM_MODE_CONTENT_PROTECTION_DESIRED); ++ } + + + mutex_unlock(&hdcp_work->mutex); +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h +index d3ba505d0696..098f7218f83a 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h +@@ -54,8 +54,8 @@ struct hdcp_workqueue { + uint8_t max_link; + }; + +-void hdcp_add_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index, +- struct amdgpu_dm_connector *aconnector); ++void hdcp_add_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index, struct amdgpu_dm_connector *aconnector, ++ bool disable_type1); + void hdcp_remove_display(struct hdcp_workqueue *work, unsigned int link_index, unsigned int display_index); + void hdcp_reset_display(struct hdcp_workqueue *work, unsigned int link_index); + void hdcp_handle_cpirq(struct hdcp_workqueue *work, unsigned int link_index); +diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c +index a74812977963..0f2f242710b3 100644 +--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c ++++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp.c +@@ -417,7 +417,10 @@ 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; + +- mod_hdcp_hdcp1_get_link_encryption_status(hdcp, &query->encryption_status); ++ 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); + + out: + return status; +-- +2.17.1 + |