153 lines
6.2 KiB
Diff
153 lines
6.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: "Romli, Khairul Anuar" <khairul.anuar.romli@intel.com>
|
|
Date: Wed, 19 Sep 2018 14:18:50 +0800
|
|
Subject: [PATCH] drm/i915: Commit CP without modeset
|
|
|
|
This patch commits the content protection change of a connector,
|
|
without crtc modeset.
|
|
|
|
This will give better user experience. Daniel vetter and Ville has
|
|
mentioned that ville is developing some alternate approach for this
|
|
kind of connector related commits. Till then it is preferred to have
|
|
this solution in place.
|
|
|
|
Change-Id: I95fd78f0c45851fda1453ba2d94ee634ee29bf2f
|
|
Signed-off-by: Romli, Khairul Anuar <khairul.anuar.romli@intel.com>
|
|
---
|
|
drivers/gpu/drm/i915/intel_ddi.c | 7 ------
|
|
drivers/gpu/drm/i915/intel_display.c | 10 +++++++++
|
|
drivers/gpu/drm/i915/intel_drv.h | 7 ++++--
|
|
drivers/gpu/drm/i915/intel_hdcp.c | 32 ++++++++++++++++++++++++----
|
|
4 files changed, 43 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
|
|
index 4c3c207d11d6..897ad63815e0 100644
|
|
--- a/drivers/gpu/drm/i915/intel_ddi.c
|
|
+++ b/drivers/gpu/drm/i915/intel_ddi.c
|
|
@@ -3009,11 +3009,6 @@ static void intel_enable_ddi(struct intel_encoder *encoder,
|
|
intel_enable_ddi_hdmi(encoder, crtc_state, conn_state);
|
|
else
|
|
intel_enable_ddi_dp(encoder, crtc_state, conn_state);
|
|
-
|
|
- /* Enable hdcp if it's desired */
|
|
- if (conn_state->content_protection ==
|
|
- DRM_MODE_CONTENT_PROTECTION_DESIRED)
|
|
- intel_hdcp_enable(to_intel_connector(conn_state->connector));
|
|
}
|
|
|
|
static void intel_disable_ddi_dp(struct intel_encoder *encoder,
|
|
@@ -3053,8 +3048,6 @@ static void intel_disable_ddi(struct intel_encoder *encoder,
|
|
const struct intel_crtc_state *old_crtc_state,
|
|
const struct drm_connector_state *old_conn_state)
|
|
{
|
|
- intel_hdcp_disable(to_intel_connector(old_conn_state->connector));
|
|
-
|
|
if (intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_HDMI))
|
|
intel_disable_ddi_hdmi(encoder, old_crtc_state, old_conn_state);
|
|
else
|
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
|
index 876ccbf5dc06..9498352d39ec 100644
|
|
--- a/drivers/gpu/drm/i915/intel_display.c
|
|
+++ b/drivers/gpu/drm/i915/intel_display.c
|
|
@@ -12655,6 +12655,8 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
|
|
struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
|
|
struct drm_i915_private *dev_priv = to_i915(dev);
|
|
struct drm_crtc_state *old_crtc_state, *new_crtc_state;
|
|
+ struct drm_connector_state *old_conn_state, *new_conn_state;
|
|
+ struct drm_connector *connector;
|
|
struct drm_crtc *crtc;
|
|
struct intel_crtc_state *intel_cstate;
|
|
u64 put_domains[I915_MAX_PIPES] = {};
|
|
@@ -12747,9 +12749,17 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
|
|
}
|
|
}
|
|
|
|
+ for_each_oldnew_connector_in_state(state, connector, old_conn_state,
|
|
+ new_conn_state, i)
|
|
+ intel_hdcp_atomic_pre_commit(connector, old_conn_state,
|
|
+ new_conn_state);
|
|
+
|
|
/* Now enable the clocks, plane, pipe, and connectors that we set up. */
|
|
dev_priv->display.update_crtcs(state);
|
|
|
|
+ for_each_new_connector_in_state(state, connector, new_conn_state, i)
|
|
+ intel_hdcp_atomic_commit(connector, new_conn_state);
|
|
+
|
|
/* FIXME: We should call drm_atomic_helper_commit_hw_done() here
|
|
* already, but still need the state for the delayed optimization. To
|
|
* fix this:
|
|
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
|
|
index 6c073bfdac7d..10883e04bfe6 100644
|
|
--- a/drivers/gpu/drm/i915/intel_drv.h
|
|
+++ b/drivers/gpu/drm/i915/intel_drv.h
|
|
@@ -1942,10 +1942,13 @@ static inline void intel_backlight_device_unregister(struct intel_connector *con
|
|
void intel_hdcp_atomic_check(struct drm_connector *connector,
|
|
struct drm_connector_state *old_state,
|
|
struct drm_connector_state *new_state);
|
|
+void intel_hdcp_atomic_pre_commit(struct drm_connector *connector,
|
|
+ struct drm_connector_state *old_state,
|
|
+ struct drm_connector_state *new_state);
|
|
+void intel_hdcp_atomic_commit(struct drm_connector *connector,
|
|
+ struct drm_connector_state *new_state);
|
|
int intel_hdcp_init(struct intel_connector *connector,
|
|
const struct intel_hdcp_shim *hdcp_shim);
|
|
-int intel_hdcp_enable(struct intel_connector *connector);
|
|
-int intel_hdcp_disable(struct intel_connector *connector);
|
|
int intel_hdcp_check_link(struct intel_connector *connector);
|
|
bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port);
|
|
|
|
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
|
|
index ea938b9146b0..7f87667753b3 100644
|
|
--- a/drivers/gpu/drm/i915/intel_hdcp.c
|
|
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
|
|
@@ -806,7 +806,6 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,
|
|
{
|
|
uint64_t old_cp = old_state->content_protection;
|
|
uint64_t new_cp = new_state->content_protection;
|
|
- struct drm_crtc_state *crtc_state;
|
|
|
|
if (!new_state->crtc) {
|
|
/*
|
|
@@ -827,10 +826,35 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,
|
|
(old_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
|
|
new_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED))
|
|
return;
|
|
+}
|
|
+
|
|
+void intel_hdcp_atomic_pre_commit(struct drm_connector *connector,
|
|
+ struct drm_connector_state *old_state,
|
|
+ struct drm_connector_state *new_state)
|
|
+{
|
|
+ uint64_t old_cp = old_state->content_protection;
|
|
+ uint64_t new_cp = new_state->content_protection;
|
|
+
|
|
+ /*
|
|
+ * Disable HDCP if the connector is becoming disabled, or if requested
|
|
+ * via the property.
|
|
+ */
|
|
+ if ((!new_state->crtc &&
|
|
+ old_cp != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) ||
|
|
+ (new_state->crtc &&
|
|
+ old_cp != DRM_MODE_CONTENT_PROTECTION_UNDESIRED &&
|
|
+ new_cp == DRM_MODE_CONTENT_PROTECTION_UNDESIRED))
|
|
+ intel_hdcp_disable(to_intel_connector(connector));
|
|
+}
|
|
+
|
|
+void intel_hdcp_atomic_commit(struct drm_connector *connector,
|
|
+ struct drm_connector_state *new_state)
|
|
+{
|
|
+ uint64_t new_cp = new_state->content_protection;
|
|
|
|
- crtc_state = drm_atomic_get_new_crtc_state(new_state->state,
|
|
- new_state->crtc);
|
|
- crtc_state->mode_changed = true;
|
|
+ /* Enable hdcp if it's desired */
|
|
+ if (new_state->crtc && new_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED)
|
|
+ intel_hdcp_enable(to_intel_connector(connector));
|
|
}
|
|
|
|
/* Implements Part 3 of the HDCP authorization procedure */
|
|
--
|
|
https://clearlinux.org
|
|
|