2019-03-29 14:12:17 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2018-10-11 02:06:46 +08:00
|
|
|
From: "Romli, Khairul Anuar" <khairul.anuar.romli@intel.com>
|
|
|
|
Date: Wed, 19 Sep 2018 14:17:45 +0800
|
2019-03-29 14:12:17 +08:00
|
|
|
Subject: [PATCH] drm/i915: Async work for hdcp authentication
|
2018-10-11 02:06:46 +08:00
|
|
|
|
|
|
|
Each HDCP authentication, could take upto 5.1Sec, based on the
|
|
|
|
downstream HDCP topology.
|
|
|
|
|
|
|
|
Hence to avoid this much delay in the atomic_commit path, this patch
|
|
|
|
schedules the HDCP authentication into a asynchronous work.
|
|
|
|
|
|
|
|
Change-Id: I951f20d9db082c80c4323495c4cf290a6eed1238
|
|
|
|
Signed-off-by: Romli, Khairul Anuar <khairul.anuar.romli@intel.com>
|
|
|
|
---
|
|
|
|
drivers/gpu/drm/i915/intel_display.c | 1 +
|
|
|
|
drivers/gpu/drm/i915/intel_drv.h | 1 +
|
|
|
|
drivers/gpu/drm/i915/intel_hdcp.c | 36 +++++++++++++++++-----------
|
|
|
|
3 files changed, 24 insertions(+), 14 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
2019-09-19 15:09:25 +08:00
|
|
|
index 0ae505a..b8a9d6a 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
|
|
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
2019-09-19 15:09:25 +08:00
|
|
|
@@ -16286,6 +16286,7 @@ static void intel_hpd_poll_fini(struct drm_device *dev)
|
2018-10-11 02:06:46 +08:00
|
|
|
if (connector->hdcp_shim) {
|
|
|
|
cancel_delayed_work_sync(&connector->hdcp_check_work);
|
|
|
|
cancel_work_sync(&connector->hdcp_prop_work);
|
|
|
|
+ cancel_work_sync(&connector->hdcp_enable_work);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
drm_connector_list_iter_end(&conn_iter);
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
2020-01-10 00:27:19 +08:00
|
|
|
index 3ed6373..6c073bf 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/drivers/gpu/drm/i915/intel_drv.h
|
|
|
|
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
2019-03-29 14:12:17 +08:00
|
|
|
@@ -428,6 +428,7 @@ struct intel_connector {
|
2018-10-11 02:06:46 +08:00
|
|
|
uint64_t hdcp_value; /* protected by hdcp_mutex */
|
|
|
|
struct delayed_work hdcp_check_work;
|
|
|
|
struct work_struct hdcp_prop_work;
|
|
|
|
+ struct work_struct hdcp_enable_work;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct intel_digital_connector_state {
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
|
2019-03-29 14:12:17 +08:00
|
|
|
index 0cc6a86..ea938b9 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/drivers/gpu/drm/i915/intel_hdcp.c
|
|
|
|
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
|
|
|
|
@@ -679,8 +679,14 @@ static int _intel_hdcp_enable(struct intel_connector *connector)
|
|
|
|
for (i = 0; i < tries; i++) {
|
|
|
|
ret = intel_hdcp_auth(conn_to_dig_port(connector),
|
|
|
|
connector->hdcp_shim);
|
|
|
|
- if (!ret)
|
|
|
|
+ if (!ret) {
|
|
|
|
+ connector->hdcp_value =
|
|
|
|
+ DRM_MODE_CONTENT_PROTECTION_ENABLED;
|
|
|
|
+ schedule_work(&connector->hdcp_prop_work);
|
|
|
|
+ schedule_delayed_work(&connector->hdcp_check_work,
|
|
|
|
+ DRM_HDCP_CHECK_PERIOD_MS);
|
|
|
|
return 0;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
DRM_DEBUG_KMS("HDCP Auth failure (%d)\n", ret);
|
|
|
|
|
|
|
|
@@ -692,6 +698,17 @@ static int _intel_hdcp_enable(struct intel_connector *connector)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static void intel_hdcp_enable_work(struct work_struct *work)
|
|
|
|
+{
|
|
|
|
+ struct intel_connector *connector = container_of(work,
|
|
|
|
+ struct intel_connector,
|
|
|
|
+ hdcp_enable_work);
|
|
|
|
+
|
|
|
|
+ mutex_lock(&connector->hdcp_mutex);
|
|
|
|
+ _intel_hdcp_enable(connector);
|
|
|
|
+ mutex_unlock(&connector->hdcp_mutex);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static void intel_hdcp_check_work(struct work_struct *work)
|
|
|
|
{
|
|
|
|
struct intel_connector *connector = container_of(to_delayed_work(work),
|
|
|
|
@@ -748,29 +765,20 @@ int intel_hdcp_init(struct intel_connector *connector,
|
|
|
|
mutex_init(&connector->hdcp_mutex);
|
|
|
|
INIT_DELAYED_WORK(&connector->hdcp_check_work, intel_hdcp_check_work);
|
|
|
|
INIT_WORK(&connector->hdcp_prop_work, intel_hdcp_prop_work);
|
|
|
|
+ INIT_WORK(&connector->hdcp_enable_work, intel_hdcp_enable_work);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int intel_hdcp_enable(struct intel_connector *connector)
|
|
|
|
{
|
|
|
|
- int ret;
|
|
|
|
-
|
|
|
|
if (!connector->hdcp_shim)
|
|
|
|
return -ENOENT;
|
|
|
|
|
|
|
|
mutex_lock(&connector->hdcp_mutex);
|
|
|
|
-
|
|
|
|
- ret = _intel_hdcp_enable(connector);
|
|
|
|
- if (ret)
|
|
|
|
- goto out;
|
|
|
|
-
|
|
|
|
- connector->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
|
|
|
|
- schedule_work(&connector->hdcp_prop_work);
|
|
|
|
- schedule_delayed_work(&connector->hdcp_check_work,
|
|
|
|
- DRM_HDCP_CHECK_PERIOD_MS);
|
|
|
|
-out:
|
|
|
|
+ schedule_work(&connector->hdcp_enable_work);
|
|
|
|
mutex_unlock(&connector->hdcp_mutex);
|
|
|
|
- return ret;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int intel_hdcp_disable(struct intel_connector *connector)
|
|
|
|
--
|
2019-04-08 18:08:36 +08:00
|
|
|
https://clearlinux.org
|
2018-10-11 02:06:46 +08:00
|
|
|
|