clear-pkgs-linux-iot-lts2018/0677-drm-i915-Async-work-fo...

119 lines
3.9 KiB
Diff
Raw Normal View History

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
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
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
@@ -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
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
@@ -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
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)
--
https://clearlinux.org
2018-10-11 02:06:46 +08:00