public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
@ 2019-07-02  5:54 Ramalingam C
  2019-07-02 17:04 ` ✓ Fi.CI.BAT: success for " Patchwork
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Ramalingam C @ 2019-07-02  5:54 UTC (permalink / raw)
  To: shashank.sharma, Daniel Vetter, intel-gfx

From Gen12 onwards, HDCP HW block is implemented within transcoders.
Till Gen11 HDCP HW block was part of DDI.

Hence required changes in HW programming is handled here.

v2:
  _MMIO_TRANS is used [Lucas and Daniel]
  platform check is moved into the caller [Lucas]
v3:
  platform check is moved into a macro [Shashank]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/gpu/drm/i915/display/intel_hdcp.c | 155 ++++++++++++++--------
 drivers/gpu/drm/i915/display/intel_hdmi.c |   9 +-
 drivers/gpu/drm/i915/i915_reg.h           | 120 +++++++++++++++--
 drivers/gpu/drm/i915/intel_drv.h          |   8 ++
 4 files changed, 221 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
index bc3a94d491c4..14ba723a3561 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -17,6 +17,7 @@
 #include "intel_drv.h"
 #include "intel_hdcp.h"
 #include "intel_sideband.h"
+#include "intel_connector.h"
 
 #define KEY_LOAD_TRIES	5
 #define ENCRYPT_STATUS_CHANGE_TIMEOUT_MS	50
@@ -104,23 +105,21 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
 	return capable;
 }
 
-static inline bool intel_hdcp_in_use(struct intel_connector *connector)
+static inline bool intel_hdcp_in_use(struct drm_i915_private *dev_priv,
+				     enum pipe pipe, enum port port)
 {
-	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	enum port port = connector->encoder->port;
 	u32 reg;
 
-	reg = I915_READ(PORT_HDCP_STATUS(port));
+	reg = I915_READ(HDCP_STATUS(dev_priv, pipe, port));
 	return reg & HDCP_STATUS_ENC;
 }
 
-static inline bool intel_hdcp2_in_use(struct intel_connector *connector)
+static inline bool intel_hdcp2_in_use(struct drm_i915_private *dev_priv,
+				      enum pipe pipe, enum port port)
 {
-	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	enum port port = connector->encoder->port;
 	u32 reg;
 
-	reg = I915_READ(HDCP2_STATUS_DDI(port));
+	reg = I915_READ(HDCP2_STATUS(dev_priv, pipe, port));
 	return reg & LINK_ENCRYPTION_STATUS;
 }
 
@@ -253,37 +252,59 @@ static int intel_write_sha_text(struct drm_i915_private *dev_priv, u32 sha_text)
 }
 
 static
-u32 intel_hdcp_get_repeater_ctl(struct intel_digital_port *intel_dig_port)
+u32 intel_hdcp_get_repeater_ctl(struct drm_i915_private *dev_priv,
+				enum pipe pipe, enum port port)
 {
-	enum port port = intel_dig_port->base.port;
-	switch (port) {
-	case PORT_A:
-		return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
-	case PORT_B:
-		return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
-	case PORT_C:
-		return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
-	case PORT_D:
-		return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
-	case PORT_E:
-		return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
-	default:
-		break;
-	}
-	DRM_ERROR("Unknown port %d\n", port);
+	if (INTEL_GEN(dev_priv) >= 12) {
+		switch (pipe) {
+		case PIPE_A:
+			return HDCP_TRANSA_REP_PRESENT |
+			       HDCP_TRANSA_SHA1_M0;
+		case PIPE_B:
+			return HDCP_TRANSB_REP_PRESENT |
+			       HDCP_TRANSB_SHA1_M0;
+		case PIPE_C:
+			return HDCP_TRANSC_REP_PRESENT |
+			       HDCP_TRANSC_SHA1_M0;
+		/* FIXME: Add a case for PIPE_D */
+		default:
+			DRM_ERROR("Unknown pipe %d\n", pipe);
+			break;
+		}
+	} else {
+		switch (port) {
+		case PORT_A:
+			return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
+		case PORT_B:
+			return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
+		case PORT_C:
+			return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
+		case PORT_D:
+			return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
+		case PORT_E:
+			return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
+		default:
+			DRM_ERROR("Unknown port %d\n", port);
+			break;
+		}
+	}
 	return -EINVAL;
 }
 
 static
-int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
+int intel_hdcp_validate_v_prime(struct intel_connector *connector,
 				const struct intel_hdcp_shim *shim,
 				u8 *ksv_fifo, u8 num_downstream, u8 *bstatus)
 {
+	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
 	struct drm_i915_private *dev_priv;
+	enum pipe pipe = connector->hdcp.pipe;
+	enum port port;
 	u32 vprime, sha_text, sha_leftovers, rep_ctl;
 	int ret, i, j, sha_idx;
 
 	dev_priv = intel_dig_port->base.base.dev->dev_private;
+	port = intel_dig_port->base.port;
 
 	/* Process V' values from the receiver */
 	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++) {
@@ -306,7 +327,7 @@ int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
 	sha_idx = 0;
 	sha_text = 0;
 	sha_leftovers = 0;
-	rep_ctl = intel_hdcp_get_repeater_ctl(intel_dig_port);
+	rep_ctl = intel_hdcp_get_repeater_ctl(dev_priv, pipe, port);
 	I915_WRITE(HDCP_REP_CTL, rep_ctl | HDCP_SHA1_TEXT_32);
 	for (i = 0; i < num_downstream; i++) {
 		unsigned int sha_empty;
@@ -544,7 +565,7 @@ int intel_hdcp_auth_downstream(struct intel_connector *connector)
 	 * V prime atleast twice.
 	 */
 	for (i = 0; i < tries; i++) {
-		ret = intel_hdcp_validate_v_prime(intel_dig_port, shim,
+		ret = intel_hdcp_validate_v_prime(connector, shim,
 						  ksv_fifo, num_downstream,
 						  bstatus);
 		if (!ret)
@@ -572,6 +593,7 @@ static int intel_hdcp_auth(struct intel_connector *connector)
 	struct drm_device *dev = connector->base.dev;
 	const struct intel_hdcp_shim *shim = hdcp->shim;
 	struct drm_i915_private *dev_priv;
+	enum pipe pipe = connector->hdcp.pipe;
 	enum port port;
 	unsigned long r0_prime_gen_start;
 	int ret, i, tries = 2;
@@ -611,19 +633,20 @@ static int intel_hdcp_auth(struct intel_connector *connector)
 
 	/* Initialize An with 2 random values and acquire it */
 	for (i = 0; i < 2; i++)
-		I915_WRITE(PORT_HDCP_ANINIT(port), get_random_u32());
-	I915_WRITE(PORT_HDCP_CONF(port), HDCP_CONF_CAPTURE_AN);
+		I915_WRITE(HDCP_ANINIT(dev_priv, pipe, port), get_random_u32());
+	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), HDCP_CONF_CAPTURE_AN);
 
 	/* Wait for An to be acquired */
-	if (intel_wait_for_register(&dev_priv->uncore, PORT_HDCP_STATUS(port),
+	if (intel_wait_for_register(&dev_priv->uncore,
+				    HDCP_STATUS(dev_priv, pipe, port),
 				    HDCP_STATUS_AN_READY,
 				    HDCP_STATUS_AN_READY, 1)) {
 		DRM_ERROR("Timed out waiting for An\n");
 		return -ETIMEDOUT;
 	}
 
-	an.reg[0] = I915_READ(PORT_HDCP_ANLO(port));
-	an.reg[1] = I915_READ(PORT_HDCP_ANHI(port));
+	an.reg[0] = I915_READ(HDCP_ANLO(dev_priv, pipe, port));
+	an.reg[1] = I915_READ(HDCP_ANHI(dev_priv, pipe, port));
 	ret = shim->write_an_aksv(intel_dig_port, an.shim);
 	if (ret)
 		return ret;
@@ -641,24 +664,24 @@ static int intel_hdcp_auth(struct intel_connector *connector)
 		return -EPERM;
 	}
 
-	I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
-	I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);
+	I915_WRITE(HDCP_BKSVLO(dev_priv, pipe, port), bksv.reg[0]);
+	I915_WRITE(HDCP_BKSVHI(dev_priv, pipe, port), bksv.reg[1]);
 
 	ret = shim->repeater_present(intel_dig_port, &repeater_present);
 	if (ret)
 		return ret;
 	if (repeater_present)
 		I915_WRITE(HDCP_REP_CTL,
-			   intel_hdcp_get_repeater_ctl(intel_dig_port));
+			   intel_hdcp_get_repeater_ctl(dev_priv, pipe, port));
 
 	ret = shim->toggle_signalling(intel_dig_port, true);
 	if (ret)
 		return ret;
 
-	I915_WRITE(PORT_HDCP_CONF(port), HDCP_CONF_AUTH_AND_ENC);
+	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), HDCP_CONF_AUTH_AND_ENC);
 
 	/* Wait for R0 ready */
-	if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
+	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
 		     (HDCP_STATUS_R0_READY | HDCP_STATUS_ENC), 1)) {
 		DRM_ERROR("Timed out waiting for R0 ready\n");
 		return -ETIMEDOUT;
@@ -686,22 +709,23 @@ static int intel_hdcp_auth(struct intel_connector *connector)
 		ret = shim->read_ri_prime(intel_dig_port, ri.shim);
 		if (ret)
 			return ret;
-		I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
+		I915_WRITE(HDCP_RPRIME(dev_priv, pipe, port), ri.reg);
 
 		/* Wait for Ri prime match */
-		if (!wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
+		if (!wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
 		    (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1))
 			break;
 	}
 
 	if (i == tries) {
 		DRM_DEBUG_KMS("Timed out waiting for Ri prime match (%x)\n",
-			      I915_READ(PORT_HDCP_STATUS(port)));
+			      I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
 		return -ETIMEDOUT;
 	}
 
 	/* Wait for encryption confirmation */
-	if (intel_wait_for_register(&dev_priv->uncore, PORT_HDCP_STATUS(port),
+	if (intel_wait_for_register(&dev_priv->uncore,
+				    HDCP_STATUS(dev_priv, pipe, port),
 				    HDCP_STATUS_ENC, HDCP_STATUS_ENC,
 				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
 		DRM_ERROR("Timed out waiting for encryption\n");
@@ -726,15 +750,16 @@ static int _intel_hdcp_disable(struct intel_connector *connector)
 	struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
 	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
 	enum port port = intel_dig_port->base.port;
+	enum pipe pipe = hdcp->pipe;
 	int ret;
 
 	DRM_DEBUG_KMS("[%s:%d] HDCP is being disabled...\n",
 		      connector->base.name, connector->base.base.id);
 
 	hdcp->hdcp_encrypted = false;
-	I915_WRITE(PORT_HDCP_CONF(port), 0);
+	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), 0);
 	if (intel_wait_for_register(&dev_priv->uncore,
-				    PORT_HDCP_STATUS(port), ~0, 0,
+				    HDCP_STATUS(dev_priv, pipe, port), ~0, 0,
 				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
 		DRM_ERROR("Failed to disable HDCP, timeout clearing status\n");
 		return -ETIMEDOUT;
@@ -806,9 +831,11 @@ static int intel_hdcp_check_link(struct intel_connector *connector)
 	struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
 	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
 	enum port port = intel_dig_port->base.port;
+	enum pipe pipe;
 	int ret = 0;
 
 	mutex_lock(&hdcp->mutex);
+	pipe = hdcp->pipe;
 
 	/* Check_link valid only when HDCP1.4 is enabled */
 	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
@@ -817,10 +844,10 @@ static int intel_hdcp_check_link(struct intel_connector *connector)
 		goto out;
 	}
 
-	if (WARN_ON(!intel_hdcp_in_use(connector))) {
+	if (WARN_ON(!intel_hdcp_in_use(dev_priv, pipe, port))) {
 		DRM_ERROR("%s:%d HDCP link stopped encryption,%x\n",
 			  connector->base.name, connector->base.base.id,
-			  I915_READ(PORT_HDCP_STATUS(port)));
+			  I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
 		ret = -ENXIO;
 		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
 		schedule_work(&hdcp->prop_work);
@@ -1491,10 +1518,11 @@ static int hdcp2_enable_encryption(struct intel_connector *connector)
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
 	struct intel_hdcp *hdcp = &connector->hdcp;
 	enum port port = connector->encoder->port;
+	enum pipe pipe = hdcp->pipe;
 	int ret;
 
-	WARN_ON(I915_READ(HDCP2_STATUS_DDI(port)) & LINK_ENCRYPTION_STATUS);
-
+	WARN_ON(I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) &
+		LINK_ENCRYPTION_STATUS);
 	if (hdcp->shim->toggle_signalling) {
 		ret = hdcp->shim->toggle_signalling(intel_dig_port, true);
 		if (ret) {
@@ -1504,14 +1532,15 @@ static int hdcp2_enable_encryption(struct intel_connector *connector)
 		}
 	}
 
-	if (I915_READ(HDCP2_STATUS_DDI(port)) & LINK_AUTH_STATUS) {
+	if (I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) & LINK_AUTH_STATUS) {
 		/* Link is Authenticated. Now set for Encryption */
-		I915_WRITE(HDCP2_CTL_DDI(port),
-			   I915_READ(HDCP2_CTL_DDI(port)) |
+		I915_WRITE(HDCP2_CTL(dev_priv, pipe, port),
+			   I915_READ(HDCP2_CTL(dev_priv, pipe, port)) |
 			   CTL_LINK_ENCRYPTION_REQ);
 	}
 
-	ret = intel_wait_for_register(&dev_priv->uncore, HDCP2_STATUS_DDI(port),
+	ret = intel_wait_for_register(&dev_priv->uncore,
+				      HDCP2_STATUS(dev_priv, pipe, port),
 				      LINK_ENCRYPTION_STATUS,
 				      LINK_ENCRYPTION_STATUS,
 				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
@@ -1525,14 +1554,17 @@ static int hdcp2_disable_encryption(struct intel_connector *connector)
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
 	struct intel_hdcp *hdcp = &connector->hdcp;
 	enum port port = connector->encoder->port;
+	enum pipe pipe = hdcp->pipe;
 	int ret;
 
-	WARN_ON(!(I915_READ(HDCP2_STATUS_DDI(port)) & LINK_ENCRYPTION_STATUS));
+	WARN_ON(!(I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) &
+		LINK_ENCRYPTION_STATUS));
+	I915_WRITE(HDCP2_CTL(dev_priv, pipe, port),
+		   I915_READ(HDCP2_CTL(dev_priv, pipe, port)) &
+		   ~CTL_LINK_ENCRYPTION_REQ);
 
-	I915_WRITE(HDCP2_CTL_DDI(port),
-		   I915_READ(HDCP2_CTL_DDI(port)) & ~CTL_LINK_ENCRYPTION_REQ);
-
-	ret = intel_wait_for_register(&dev_priv->uncore, HDCP2_STATUS_DDI(port),
+	ret = intel_wait_for_register(&dev_priv->uncore,
+				      HDCP2_STATUS(dev_priv, pipe, port),
 				      LINK_ENCRYPTION_STATUS, 0x0,
 				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
 	if (ret == -ETIMEDOUT)
@@ -1631,9 +1663,11 @@ static int intel_hdcp2_check_link(struct intel_connector *connector)
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
 	struct intel_hdcp *hdcp = &connector->hdcp;
 	enum port port = connector->encoder->port;
+	enum pipe pipe;
 	int ret = 0;
 
 	mutex_lock(&hdcp->mutex);
+	pipe = hdcp->pipe;
 
 	/* hdcp2_check_link is expected only when HDCP2.2 is Enabled */
 	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
@@ -1642,9 +1676,9 @@ static int intel_hdcp2_check_link(struct intel_connector *connector)
 		goto out;
 	}
 
-	if (WARN_ON(!intel_hdcp2_in_use(connector))) {
+	if (WARN_ON(!intel_hdcp2_in_use(dev_priv, pipe, port))) {
 		DRM_ERROR("HDCP2.2 link stopped the encryption, %x\n",
-			  I915_READ(HDCP2_STATUS_DDI(port)));
+			  I915_READ(HDCP2_STATUS(dev_priv, pipe, port)));
 		ret = -ENXIO;
 		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
 		schedule_work(&hdcp->prop_work);
@@ -1857,6 +1891,9 @@ int intel_hdcp_enable(struct intel_connector *connector)
 	mutex_lock(&hdcp->mutex);
 	WARN_ON(hdcp->value == DRM_MODE_CONTENT_PROTECTION_ENABLED);
 
+	/* FIXME: Need to take the drm modeset lock for connection_mutex. */
+	hdcp->pipe = intel_connector_get_pipe(connector);
+
 	/*
 	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
 	 * is capable of HDCP2.2, it is preferred to use HDCP2.2.
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 0ebec69bbbfc..2096aee174b2 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -1491,7 +1491,10 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
 {
 	struct drm_i915_private *dev_priv =
 		intel_dig_port->base.base.dev->dev_private;
+	struct intel_connector *connector =
+				intel_dig_port->hdmi.attached_connector;
 	enum port port = intel_dig_port->base.port;
+	enum pipe pipe = connector->hdcp.pipe;
 	int ret;
 	union {
 		u32 reg;
@@ -1502,13 +1505,13 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
 	if (ret)
 		return false;
 
-	I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
+	I915_WRITE(HDCP_RPRIME(dev_priv, pipe, port), ri.reg);
 
 	/* Wait for Ri prime match */
-	if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
+	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
 		     (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
 		DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n",
-			  I915_READ(PORT_HDCP_STATUS(port)));
+			  I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
 		return false;
 	}
 	return true;
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 7e6009cefb18..2306e83b16fc 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -9225,12 +9225,20 @@ enum skl_power_gate {
 
 /* HDCP Repeater Registers */
 #define HDCP_REP_CTL			_MMIO(0x66d00)
+#define  HDCP_TRANSA_REP_PRESENT	BIT(31)
+#define  HDCP_TRANSB_REP_PRESENT	BIT(30)
+#define  HDCP_TRANSC_REP_PRESENT	BIT(29)
+#define  HDCP_TRANSD_REP_PRESENT	BIT(28)
 #define  HDCP_DDIB_REP_PRESENT		BIT(30)
 #define  HDCP_DDIA_REP_PRESENT		BIT(29)
 #define  HDCP_DDIC_REP_PRESENT		BIT(28)
 #define  HDCP_DDID_REP_PRESENT		BIT(27)
 #define  HDCP_DDIF_REP_PRESENT		BIT(26)
 #define  HDCP_DDIE_REP_PRESENT		BIT(25)
+#define  HDCP_TRANSA_SHA1_M0		(1 << 20)
+#define  HDCP_TRANSB_SHA1_M0		(2 << 20)
+#define  HDCP_TRANSC_SHA1_M0		(3 << 20)
+#define  HDCP_TRANSD_SHA1_M0		(4 << 20)
 #define  HDCP_DDIB_SHA1_M0		(1 << 20)
 #define  HDCP_DDIA_SHA1_M0		(2 << 20)
 #define  HDCP_DDIC_SHA1_M0		(3 << 20)
@@ -9270,15 +9278,89 @@ enum skl_power_gate {
 					  _PORTE_HDCP_AUTHENC, \
 					  _PORTF_HDCP_AUTHENC) + (x))
 #define PORT_HDCP_CONF(port)		_PORT_HDCP_AUTHENC(port, 0x0)
+#define _TRANSA_HDCP_CONF		0x66400
+#define _TRANSB_HDCP_CONF		0x66500
+#define TRANS_HDCP_CONF(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_CONF, \
+						    _TRANSB_HDCP_CONF)
+#define HDCP_CONF(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_CONF(pipe) : \
+					PORT_HDCP_CONF(port))
+
 #define  HDCP_CONF_CAPTURE_AN		BIT(0)
 #define  HDCP_CONF_AUTH_AND_ENC		(BIT(1) | BIT(0))
 #define PORT_HDCP_ANINIT(port)		_PORT_HDCP_AUTHENC(port, 0x4)
+#define _TRANSA_HDCP_ANINIT		0x66404
+#define _TRANSB_HDCP_ANINIT		0x66504
+#define TRANS_HDCP_ANINIT(trans)	_MMIO_TRANS(trans, \
+						    _TRANSA_HDCP_ANINIT, \
+						    _TRANSB_HDCP_ANINIT)
+#define HDCP_ANINIT(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_ANINIT(pipe) : \
+					PORT_HDCP_ANINIT(port))
+
 #define PORT_HDCP_ANLO(port)		_PORT_HDCP_AUTHENC(port, 0x8)
+#define _TRANSA_HDCP_ANLO		0x66408
+#define _TRANSB_HDCP_ANLO		0x66508
+#define TRANS_HDCP_ANLO(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_ANLO, \
+						    _TRANSB_HDCP_ANLO)
+#define HDCP_ANLO(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_ANLO(pipe) : \
+					PORT_HDCP_ANLO(port))
+
 #define PORT_HDCP_ANHI(port)		_PORT_HDCP_AUTHENC(port, 0xC)
+#define _TRANSA_HDCP_ANHI		0x6640C
+#define _TRANSB_HDCP_ANHI		0x6650C
+#define TRANS_HDCP_ANHI(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_ANHI, \
+						    _TRANSB_HDCP_ANHI)
+#define HDCP_ANHI(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_ANHI(pipe) : \
+					PORT_HDCP_ANHI(port))
+
 #define PORT_HDCP_BKSVLO(port)		_PORT_HDCP_AUTHENC(port, 0x10)
+#define _TRANSA_HDCP_BKSVLO		0x66410
+#define _TRANSB_HDCP_BKSVLO		0x66510
+#define TRANS_HDCP_BKSVLO(trans)	_MMIO_TRANS(trans, \
+						    _TRANSA_HDCP_BKSVLO, \
+						    _TRANSB_HDCP_BKSVLO)
+#define HDCP_BKSVLO(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_BKSVLO(pipe) : \
+					PORT_HDCP_BKSVLO(port))
+
 #define PORT_HDCP_BKSVHI(port)		_PORT_HDCP_AUTHENC(port, 0x14)
+#define _TRANSA_HDCP_BKSVHI		0x66414
+#define _TRANSB_HDCP_BKSVHI		0x66514
+#define TRANS_HDCP_BKSVHI(trans)	_MMIO_TRANS(trans, \
+						    _TRANSA_HDCP_BKSVHI, \
+						    _TRANSB_HDCP_BKSVHI)
+#define HDCP_BKSVHI(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_BKSVHI(pipe) : \
+					PORT_HDCP_BKSVHI(port))
+
 #define PORT_HDCP_RPRIME(port)		_PORT_HDCP_AUTHENC(port, 0x18)
+#define _TRANSA_HDCP_RPRIME		0x66418
+#define _TRANSB_HDCP_RPRIME		0x66518
+#define TRANS_HDCP_RPRIME(trans)	_MMIO_TRANS(trans, \
+						    _TRANSA_HDCP_RPRIME, \
+						    _TRANSB_HDCP_RPRIME)
+#define HDCP_RPRIME(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_RPRIME(pipe) : \
+					PORT_HDCP_RPRIME(port))
+
 #define PORT_HDCP_STATUS(port)		_PORT_HDCP_AUTHENC(port, 0x1C)
+#define _TRANSA_HDCP_STATUS		0x6641C
+#define _TRANSB_HDCP_STATUS		0x6651C
+#define TRANS_HDCP_STATUS(trans)	_MMIO_TRANS(trans, \
+						    _TRANSA_HDCP_STATUS, \
+						    _TRANSB_HDCP_STATUS)
+#define HDCP_STATUS(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP_STATUS(pipe) : \
+					PORT_HDCP_STATUS(port))
+
 #define  HDCP_STATUS_STREAM_A_ENC	BIT(31)
 #define  HDCP_STATUS_STREAM_B_ENC	BIT(30)
 #define  HDCP_STATUS_STREAM_C_ENC	BIT(29)
@@ -9305,23 +9387,43 @@ enum skl_power_gate {
 					  _PORTD_HDCP2_BASE, \
 					  _PORTE_HDCP2_BASE, \
 					  _PORTF_HDCP2_BASE) + (x))
-
-#define HDCP2_AUTH_DDI(port)		_PORT_HDCP2_BASE(port, 0x98)
+#define PORT_HDCP2_AUTH(port)		_PORT_HDCP2_BASE(port, 0x98)
+#define _TRANSA_HDCP2_AUTH		0x66498
+#define _TRANSB_HDCP2_AUTH		0x66598
+#define TRANS_HDCP2_AUTH(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP2_AUTH, \
+						    _TRANSB_HDCP2_AUTH)
 #define   AUTH_LINK_AUTHENTICATED	BIT(31)
 #define   AUTH_LINK_TYPE		BIT(30)
 #define   AUTH_FORCE_CLR_INPUTCTR	BIT(19)
 #define   AUTH_CLR_KEYS			BIT(18)
-
-#define HDCP2_CTL_DDI(port)		_PORT_HDCP2_BASE(port, 0xB0)
+#define HDCP2_AUTH(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					 TRANS_HDCP2_AUTH(pipe) : \
+					 PORT_HDCP2_AUTH(port))
+
+#define PORT_HDCP2_CTL(port)		_PORT_HDCP2_BASE(port, 0xB0)
+#define _TRANSA_HDCP2_CTL		0x664B0
+#define _TRANSB_HDCP2_CTL		0x665B0
+#define TRANS_HDCP2_CTL(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP2_CTL, \
+						    _TRANSB_HDCP2_CTL)
 #define   CTL_LINK_ENCRYPTION_REQ	BIT(31)
-
-#define HDCP2_STATUS_DDI(port)		_PORT_HDCP2_BASE(port, 0xB4)
-#define   STREAM_ENCRYPTION_STATUS_A	BIT(31)
-#define   STREAM_ENCRYPTION_STATUS_B	BIT(30)
-#define   STREAM_ENCRYPTION_STATUS_C	BIT(29)
+#define HDCP2_CTL(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
+					TRANS_HDCP2_CTL(pipe) : \
+					PORT_HDCP2_CTL(port))
+
+#define PORT_HDCP2_STATUS(port)		_PORT_HDCP2_BASE(port, 0xB4)
+#define _TRANSA_HDCP2_STATUS		0x664B4
+#define _TRANSB_HDCP2_STATUS		0x665B4
+#define TRANS_HDCP2_STATUS(trans)	_MMIO_TRANS(trans, \
+						    _TRANSA_HDCP2_STATUS, \
+						    _TRANSB_HDCP2_STATUS)
 #define   LINK_TYPE_STATUS		BIT(22)
 #define   LINK_AUTH_STATUS		BIT(21)
 #define   LINK_ENCRYPTION_STATUS	BIT(20)
+#define HDCP2_STATUS(dev_priv, pipe, port) \
+					(INTEL_GEN(dev_priv) >= 12 ? \
+					 TRANS_HDCP2_STATUS(pipe) : \
+					 PORT_HDCP2_STATUS(port))
 
 /* Per-pipe DDI Function Control */
 #define _TRANS_DDI_FUNC_CTL_A		0x60400
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 1d58f7ec5d84..53f13e6a5a73 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -359,6 +359,14 @@ struct intel_hdcp {
 	wait_queue_head_t cp_irq_queue;
 	atomic_t cp_irq_count;
 	int cp_irq_count_cached;
+
+	/*
+	 * Gen 12 onwards, HDCP is part of transcoder(previously DDI).
+	 * So chacheing the pipe associated to connector at hdcp_enable
+	 * would help in subsequent functions to derive the right offsets
+	 * for HDCP registers.
+	 */
+	enum pipe pipe;
 };
 
 struct intel_connector {
-- 
2.19.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* ✓ Fi.CI.BAT: success for drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
  2019-07-02  5:54 [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+ Ramalingam C
@ 2019-07-02 17:04 ` Patchwork
  2019-07-03 15:02 ` ✓ Fi.CI.IGT: " Patchwork
  2019-07-09  4:09 ` [PATCH] " Sharma, Shashank
  2 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2019-07-02 17:04 UTC (permalink / raw)
  To: Ramalingam C; +Cc: intel-gfx

== Series Details ==

Series: drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
URL   : https://patchwork.freedesktop.org/series/63074/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6396 -> Patchwork_13490
====================================================

Summary
-------

  **WARNING**

  Minor unknown changes coming with Patchwork_13490 need to be verified
  manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_13490, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_13490:

### IGT changes ###

#### Warnings ####

  * igt@i915_selftest@live_contexts:
    - fi-skl-gvtdvm:      [INCOMPLETE][1] ([fdo#110976]) -> [DMESG-FAIL][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/fi-skl-gvtdvm/igt@i915_selftest@live_contexts.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/fi-skl-gvtdvm/igt@i915_selftest@live_contexts.html

  
Known issues
------------

  Here are the changes found in Patchwork_13490 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@i915_module_load@reload:
    - fi-blb-e6850:       [PASS][3] -> [INCOMPLETE][4] ([fdo#107718])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/fi-blb-e6850/igt@i915_module_load@reload.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/fi-blb-e6850/igt@i915_module_load@reload.html

  * igt@kms_addfb_basic@tile-pitch-mismatch:
    - fi-icl-u3:          [PASS][5] -> [DMESG-WARN][6] ([fdo#107724])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/fi-icl-u3/igt@kms_addfb_basic@tile-pitch-mismatch.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/fi-icl-u3/igt@kms_addfb_basic@tile-pitch-mismatch.html

  
#### Possible fixes ####

  * igt@gem_basic@create-close:
    - fi-icl-u3:          [DMESG-WARN][7] ([fdo#107724]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/fi-icl-u3/igt@gem_basic@create-close.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/fi-icl-u3/igt@gem_basic@create-close.html

  * igt@gem_ctx_create@basic-files:
    - fi-icl-dsi:         [INCOMPLETE][9] ([fdo#107713] / [fdo#109100]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/fi-icl-dsi/igt@gem_ctx_create@basic-files.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/fi-icl-dsi/igt@gem_ctx_create@basic-files.html

  * igt@i915_selftest@live_blt:
    - fi-skl-iommu:       [INCOMPLETE][11] ([fdo#108602]) -> [PASS][12]
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/fi-skl-iommu/igt@i915_selftest@live_blt.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/fi-skl-iommu/igt@i915_selftest@live_blt.html

  
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107718]: https://bugs.freedesktop.org/show_bug.cgi?id=107718
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#108602]: https://bugs.freedesktop.org/show_bug.cgi?id=108602
  [fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
  [fdo#110976]: https://bugs.freedesktop.org/show_bug.cgi?id=110976


Participating hosts (56 -> 46)
------------------------------

  Missing    (10): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-ctg-p8600 fi-pnv-d510 fi-icl-y fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * Linux: CI_DRM_6396 -> Patchwork_13490

  CI_DRM_6396: f6747e7cc19107131922db8fdeabc6c09d812300 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5079: 873df2fa9e8f5fd02d4532b30ef2579f4fe4f27f @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_13490: 4f21a937a4bd44dd48b1e2271e1a1d0552de3a4e @ git://anongit.freedesktop.org/gfx-ci/linux


== Kernel 32bit build ==

Warning: Kernel 32bit buildtest failed:
https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/build_32bit.log

  CALL    scripts/checksyscalls.sh
  CALL    scripts/atomic/check-atomics.sh
  CHK     include/generated/compile.h
Kernel: arch/x86/boot/bzImage is ready  (#1)
  Building modules, stage 2.
  MODPOST 112 modules
ERROR: "__udivdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined!
ERROR: "__divdi3" [drivers/gpu/drm/amd/amdgpu/amdgpu.ko] undefined!
scripts/Makefile.modpost:91: recipe for target '__modpost' failed
make[1]: *** [__modpost] Error 1
Makefile:1287: recipe for target 'modules' failed
make: *** [modules] Error 2


== Linux commits ==

4f21a937a4bd drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 5+ messages in thread

* ✓ Fi.CI.IGT: success for drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
  2019-07-02  5:54 [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+ Ramalingam C
  2019-07-02 17:04 ` ✓ Fi.CI.BAT: success for " Patchwork
@ 2019-07-03 15:02 ` Patchwork
  2019-07-09  4:09 ` [PATCH] " Sharma, Shashank
  2 siblings, 0 replies; 5+ messages in thread
From: Patchwork @ 2019-07-03 15:02 UTC (permalink / raw)
  To: Ramalingam C; +Cc: intel-gfx

== Series Details ==

Series: drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
URL   : https://patchwork.freedesktop.org/series/63074/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6396_full -> Patchwork_13490_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Known issues
------------

  Here are the changes found in Patchwork_13490_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_balancer@smoke:
    - shard-iclb:         [PASS][1] -> [SKIP][2] ([fdo#110854])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb4/igt@gem_exec_balancer@smoke.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb6/igt@gem_exec_balancer@smoke.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-skl:          [PASS][3] -> [FAIL][4] ([fdo#105363])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl8/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip_tiling@flip-x-tiled:
    - shard-iclb:         [PASS][5] -> [FAIL][6] ([fdo#108303])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb5/igt@kms_flip_tiling@flip-x-tiled.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb8/igt@kms_flip_tiling@flip-x-tiled.html

  * igt@kms_frontbuffer_tracking@fbc-badstride:
    - shard-iclb:         [PASS][7] -> [FAIL][8] ([fdo#103167]) +5 similar issues
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb5/igt@kms_frontbuffer_tracking@fbc-badstride.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb2/igt@kms_frontbuffer_tracking@fbc-badstride.html

  * igt@kms_plane_alpha_blend@pipe-b-coverage-7efc:
    - shard-skl:          [PASS][9] -> [FAIL][10] ([fdo#108145] / [fdo#110403])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl4/igt@kms_plane_alpha_blend@pipe-b-coverage-7efc.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl5/igt@kms_plane_alpha_blend@pipe-b-coverage-7efc.html

  * igt@kms_plane_lowres@pipe-a-tiling-y:
    - shard-iclb:         [PASS][11] -> [FAIL][12] ([fdo#103166])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb4/igt@kms_plane_lowres@pipe-a-tiling-y.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb5/igt@kms_plane_lowres@pipe-a-tiling-y.html

  * igt@kms_psr2_su@frontbuffer:
    - shard-iclb:         [PASS][13] -> [SKIP][14] ([fdo#109642])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb2/igt@kms_psr2_su@frontbuffer.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb6/igt@kms_psr2_su@frontbuffer.html

  * igt@kms_psr@psr2_primary_mmap_cpu:
    - shard-iclb:         [PASS][15] -> [SKIP][16] ([fdo#109441]) +1 similar issue
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb2/igt@kms_psr@psr2_primary_mmap_cpu.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb8/igt@kms_psr@psr2_primary_mmap_cpu.html

  * igt@kms_vblank@pipe-a-ts-continuation-suspend:
    - shard-apl:          [PASS][17] -> [DMESG-WARN][18] ([fdo#108566]) +1 similar issue
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-apl8/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-apl1/igt@kms_vblank@pipe-a-ts-continuation-suspend.html

  * igt@perf@polling:
    - shard-skl:          [PASS][19] -> [FAIL][20] ([fdo#110728])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl3/igt@perf@polling.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl9/igt@perf@polling.html

  * igt@perf_pmu@cpu-hotplug:
    - shard-iclb:         [PASS][21] -> [INCOMPLETE][22] ([fdo#107713])
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb2/igt@perf_pmu@cpu-hotplug.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb7/igt@perf_pmu@cpu-hotplug.html

  
#### Possible fixes ####

  * igt@gem_eio@unwedge-stress:
    - shard-snb:          [FAIL][23] ([fdo#109661]) -> [PASS][24]
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-snb1/igt@gem_eio@unwedge-stress.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-snb4/igt@gem_eio@unwedge-stress.html

  * igt@gem_tiled_swapping@non-threaded:
    - shard-apl:          [DMESG-WARN][25] ([fdo#108686]) -> [PASS][26]
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-apl2/igt@gem_tiled_swapping@non-threaded.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-apl1/igt@gem_tiled_swapping@non-threaded.html

  * igt@gem_workarounds@suspend-resume-context:
    - shard-skl:          [INCOMPLETE][27] ([fdo#104108]) -> [PASS][28]
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl4/igt@gem_workarounds@suspend-resume-context.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl9/igt@gem_workarounds@suspend-resume-context.html

  * igt@i915_selftest@mock_requests:
    - shard-skl:          [INCOMPLETE][29] ([fdo#110550]) -> [PASS][30]
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl8/igt@i915_selftest@mock_requests.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl8/igt@i915_selftest@mock_requests.html

  * igt@kms_cursor_crc@pipe-a-cursor-64x64-random:
    - shard-hsw:          [INCOMPLETE][31] ([fdo#103540]) -> [PASS][32]
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-hsw7/igt@kms_cursor_crc@pipe-a-cursor-64x64-random.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-hsw6/igt@kms_cursor_crc@pipe-a-cursor-64x64-random.html

  * igt@kms_flip@flip-vs-suspend:
    - shard-skl:          [INCOMPLETE][33] ([fdo#109507]) -> [PASS][34]
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl3/igt@kms_flip@flip-vs-suspend.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl9/igt@kms_flip@flip-vs-suspend.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-apl:          [DMESG-WARN][35] ([fdo#108566]) -> [PASS][36] +2 similar issues
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-apl1/igt@kms_flip@flip-vs-suspend-interruptible.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-apl1/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite:
    - shard-iclb:         [FAIL][37] ([fdo#103167]) -> [PASS][38] +1 similar issue
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-pri-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc:
    - shard-iclb:         [INCOMPLETE][39] ([fdo#106978] / [fdo#107713]) -> [PASS][40]
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb4/igt@kms_frontbuffer_tracking@fbcpsr-1p-offscren-pri-shrfb-draw-mmap-wc.html

  * igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-cpu:
    - shard-skl:          [FAIL][41] ([fdo#103167]) -> [PASS][42]
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl5/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-cpu.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl5/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-mmap-cpu.html

  * igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min:
    - shard-skl:          [FAIL][43] ([fdo#108145]) -> [PASS][44]
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-skl5/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-skl5/igt@kms_plane_alpha_blend@pipe-a-constant-alpha-min.html

  * igt@kms_psr@psr2_suspend:
    - shard-iclb:         [SKIP][45] ([fdo#109441]) -> [PASS][46] +2 similar issues
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb1/igt@kms_psr@psr2_suspend.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb2/igt@kms_psr@psr2_suspend.html

  
#### Warnings ####

  * igt@kms_dp_dsc@basic-dsc-enable-edp:
    - shard-iclb:         [DMESG-WARN][47] ([fdo#107724]) -> [SKIP][48] ([fdo#109349])
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6396/shard-iclb2/igt@kms_dp_dsc@basic-dsc-enable-edp.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/shard-iclb8/igt@kms_dp_dsc@basic-dsc-enable-edp.html

  
  [fdo#103166]: https://bugs.freedesktop.org/show_bug.cgi?id=103166
  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
  [fdo#104108]: https://bugs.freedesktop.org/show_bug.cgi?id=104108
  [fdo#105363]: https://bugs.freedesktop.org/show_bug.cgi?id=105363
  [fdo#106978]: https://bugs.freedesktop.org/show_bug.cgi?id=106978
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
  [fdo#108303]: https://bugs.freedesktop.org/show_bug.cgi?id=108303
  [fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
  [fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
  [fdo#109349]: https://bugs.freedesktop.org/show_bug.cgi?id=109349
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109507]: https://bugs.freedesktop.org/show_bug.cgi?id=109507
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#109661]: https://bugs.freedesktop.org/show_bug.cgi?id=109661
  [fdo#110403]: https://bugs.freedesktop.org/show_bug.cgi?id=110403
  [fdo#110550]: https://bugs.freedesktop.org/show_bug.cgi?id=110550
  [fdo#110728]: https://bugs.freedesktop.org/show_bug.cgi?id=110728
  [fdo#110854]: https://bugs.freedesktop.org/show_bug.cgi?id=110854


Participating hosts (10 -> 10)
------------------------------

  No changes in participating hosts


Build changes
-------------

  * Linux: CI_DRM_6396 -> Patchwork_13490

  CI_DRM_6396: f6747e7cc19107131922db8fdeabc6c09d812300 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5079: 873df2fa9e8f5fd02d4532b30ef2579f4fe4f27f @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_13490: 4f21a937a4bd44dd48b1e2271e1a1d0552de3a4e @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13490/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
  2019-07-09  4:09 ` [PATCH] " Sharma, Shashank
@ 2019-07-08 23:59   ` Ramalingam C
  0 siblings, 0 replies; 5+ messages in thread
From: Ramalingam C @ 2019-07-08 23:59 UTC (permalink / raw)
  To: Sharma, Shashank; +Cc: intel-gfx

On 2019-07-09 at 09:39:24 +0530, Sharma, Shashank wrote:
> Hello Ram,
> 
> On 7/2/2019 11:24 AM, Ramalingam C wrote:
> 
> >  From Gen12 onwards, HDCP HW block is implemented within transcoders.
> > Till Gen11 HDCP HW block was part of DDI.
> > 
> > Hence required changes in HW programming is handled here.
> > 
> > v2:
> >    _MMIO_TRANS is used [Lucas and Daniel]
> >    platform check is moved into the caller [Lucas]
> > v3:
> >    platform check is moved into a macro [Shashank]
> > 
> > Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> > ---
> >   drivers/gpu/drm/i915/display/intel_hdcp.c | 155 ++++++++++++++--------
> >   drivers/gpu/drm/i915/display/intel_hdmi.c |   9 +-
> >   drivers/gpu/drm/i915/i915_reg.h           | 120 +++++++++++++++--
> >   drivers/gpu/drm/i915/intel_drv.h          |   8 ++
> >   4 files changed, 221 insertions(+), 71 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index bc3a94d491c4..14ba723a3561 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > @@ -17,6 +17,7 @@
> >   #include "intel_drv.h"
> >   #include "intel_hdcp.h"
> >   #include "intel_sideband.h"
> > +#include "intel_connector.h"
> >   #define KEY_LOAD_TRIES	5
> >   #define ENCRYPT_STATUS_CHANGE_TIMEOUT_MS	50
> > @@ -104,23 +105,21 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
> >   	return capable;
> >   }
> > -static inline bool intel_hdcp_in_use(struct intel_connector *connector)
> > +static inline bool intel_hdcp_in_use(struct drm_i915_private *dev_priv,
> > +				     enum pipe pipe, enum port port)
> >   {
> > -	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	enum port port = connector->encoder->port;
> >   	u32 reg;
> > -	reg = I915_READ(PORT_HDCP_STATUS(port));
> > +	reg = I915_READ(HDCP_STATUS(dev_priv, pipe, port));
> >   	return reg & HDCP_STATUS_ENC;
> directly return I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
> HDCP_STATUS_ENC; ?

Sure.
> >   }
> > -static inline bool intel_hdcp2_in_use(struct intel_connector *connector)
> > +static inline bool intel_hdcp2_in_use(struct drm_i915_private *dev_priv,
> > +				      enum pipe pipe, enum port port)
> >   {
> > -	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	enum port port = connector->encoder->port;
> >   	u32 reg;
> > -	reg = I915_READ(HDCP2_STATUS_DDI(port));
> > +	reg = I915_READ(HDCP2_STATUS(dev_priv, pipe, port));
> >   	return reg & LINK_ENCRYPTION_STATUS;
> same here
> >   }
> > @@ -253,37 +252,59 @@ static int intel_write_sha_text(struct drm_i915_private *dev_priv, u32 sha_text)
> >   }
> >   static
> > -u32 intel_hdcp_get_repeater_ctl(struct intel_digital_port *intel_dig_port)
> > +u32 intel_hdcp_get_repeater_ctl(struct drm_i915_private *dev_priv,
> > +				enum pipe pipe, enum port port)
> >   {
> > -	enum port port = intel_dig_port->base.port;
> > -	switch (port) {
> > -	case PORT_A:
> > -		return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
> > -	case PORT_B:
> > -		return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
> > -	case PORT_C:
> > -		return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
> > -	case PORT_D:
> > -		return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
> > -	case PORT_E:
> > -		return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
> > -	default:
> > -		break;
> > -	}
> > -	DRM_ERROR("Unknown port %d\n", port);
> > +	if (INTEL_GEN(dev_priv) >= 12) {
> > +		switch (pipe) {
> > +		case PIPE_A:
> > +			return HDCP_TRANSA_REP_PRESENT |
> > +			       HDCP_TRANSA_SHA1_M0;
> > +		case PIPE_B:
> > +			return HDCP_TRANSB_REP_PRESENT |
> > +			       HDCP_TRANSB_SHA1_M0;
> > +		case PIPE_C:
> > +			return HDCP_TRANSC_REP_PRESENT |
> > +			       HDCP_TRANSC_SHA1_M0;
> > +		/* FIXME: Add a case for PIPE_D */
> > +		default:
> > +			DRM_ERROR("Unknown pipe %d\n", pipe);
> > +			break;
> > +		}
> 
> return -EINVAL here, then we don't need the else condition
> 
> may be something like:
> 
> ret = -EINVAL
> 
> if (GEN >=12) {
> 
>     switch(pipe) {
> 
>         case PIPEA: ret = ; break;
> 
>         case PIPE_B: ret =; break;
> 
>         default: DRM_ERROR(); break;
> 
>     }
> 
>     return ret;
> 
> }
> 
> switch (port) {
> 
>         case PORT_A: ret = ;
> 
>         case PORT_B: ret =;
> 
>         default: DRM_ERROR();
> 
> }
> 
> return ret;

Was not thinking to remove the else part. perhaps will look better
without else.
> 
> > +	} else {
> > +		switch (port) {
> > +		case PORT_A:
> > +			return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
> > +		case PORT_B:
> > +			return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
> > +		case PORT_C:
> > +			return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
> > +		case PORT_D:
> > +			return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
> > +		case PORT_E:
> > +			return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
> > +		default:
> > +			DRM_ERROR("Unknown port %d\n", port);
> > +			break;
> > +		}
> > +	}
> >   	return -EINVAL;
> >   }
> >   static
> > -int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
> > +int intel_hdcp_validate_v_prime(struct intel_connector *connector,
> >   				const struct intel_hdcp_shim *shim,
> >   				u8 *ksv_fifo, u8 num_downstream, u8 *bstatus)
> >   {
> > +	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> >   	struct drm_i915_private *dev_priv;
> > +	enum pipe pipe = connector->hdcp.pipe;
> > +	enum port port;
> enum port port = intel_dig_port->base.port;?
sure.
> >   	u32 vprime, sha_text, sha_leftovers, rep_ctl;
> >   	int ret, i, j, sha_idx;
> >   	dev_priv = intel_dig_port->base.base.dev->dev_private;
> > +	port = intel_dig_port->base.port;
> >   	/* Process V' values from the receiver */
> >   	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++) {
> > @@ -306,7 +327,7 @@ int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
> >   	sha_idx = 0;
> >   	sha_text = 0;
> >   	sha_leftovers = 0;
> > -	rep_ctl = intel_hdcp_get_repeater_ctl(intel_dig_port);
> > +	rep_ctl = intel_hdcp_get_repeater_ctl(dev_priv, pipe, port);
> >   	I915_WRITE(HDCP_REP_CTL, rep_ctl | HDCP_SHA1_TEXT_32);
> >   	for (i = 0; i < num_downstream; i++) {
> >   		unsigned int sha_empty;
> > @@ -544,7 +565,7 @@ int intel_hdcp_auth_downstream(struct intel_connector *connector)
> >   	 * V prime atleast twice.
> >   	 */
> >   	for (i = 0; i < tries; i++) {
> > -		ret = intel_hdcp_validate_v_prime(intel_dig_port, shim,
> > +		ret = intel_hdcp_validate_v_prime(connector, shim,
> >   						  ksv_fifo, num_downstream,
> >   						  bstatus);
> >   		if (!ret)
> > @@ -572,6 +593,7 @@ static int intel_hdcp_auth(struct intel_connector *connector)
> >   	struct drm_device *dev = connector->base.dev;
> >   	const struct intel_hdcp_shim *shim = hdcp->shim;
> >   	struct drm_i915_private *dev_priv;
> > +	enum pipe pipe = connector->hdcp.pipe;
> >   	enum port port;
> >   	unsigned long r0_prime_gen_start;
> >   	int ret, i, tries = 2;
> > @@ -611,19 +633,20 @@ static int intel_hdcp_auth(struct intel_connector *connector)
> >   	/* Initialize An with 2 random values and acquire it */
> >   	for (i = 0; i < 2; i++)
> > -		I915_WRITE(PORT_HDCP_ANINIT(port), get_random_u32());
> > -	I915_WRITE(PORT_HDCP_CONF(port), HDCP_CONF_CAPTURE_AN);
> > +		I915_WRITE(HDCP_ANINIT(dev_priv, pipe, port), get_random_u32());
> > +	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), HDCP_CONF_CAPTURE_AN);
> >   	/* Wait for An to be acquired */
> > -	if (intel_wait_for_register(&dev_priv->uncore, PORT_HDCP_STATUS(port),
> > +	if (intel_wait_for_register(&dev_priv->uncore,
> > +				    HDCP_STATUS(dev_priv, pipe, port),
> >   				    HDCP_STATUS_AN_READY,
> >   				    HDCP_STATUS_AN_READY, 1)) {
> >   		DRM_ERROR("Timed out waiting for An\n");
> >   		return -ETIMEDOUT;
> >   	}
> > -	an.reg[0] = I915_READ(PORT_HDCP_ANLO(port));
> > -	an.reg[1] = I915_READ(PORT_HDCP_ANHI(port));
> > +	an.reg[0] = I915_READ(HDCP_ANLO(dev_priv, pipe, port));
> > +	an.reg[1] = I915_READ(HDCP_ANHI(dev_priv, pipe, port));
> >   	ret = shim->write_an_aksv(intel_dig_port, an.shim);
> >   	if (ret)
> >   		return ret;
> > @@ -641,24 +664,24 @@ static int intel_hdcp_auth(struct intel_connector *connector)
> >   		return -EPERM;
> >   	}
> > -	I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
> > -	I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);
> > +	I915_WRITE(HDCP_BKSVLO(dev_priv, pipe, port), bksv.reg[0]);
> > +	I915_WRITE(HDCP_BKSVHI(dev_priv, pipe, port), bksv.reg[1]);
> >   	ret = shim->repeater_present(intel_dig_port, &repeater_present);
> >   	if (ret)
> >   		return ret;
> >   	if (repeater_present)
> >   		I915_WRITE(HDCP_REP_CTL,
> > -			   intel_hdcp_get_repeater_ctl(intel_dig_port));
> > +			   intel_hdcp_get_repeater_ctl(dev_priv, pipe, port));
> >   	ret = shim->toggle_signalling(intel_dig_port, true);
> >   	if (ret)
> >   		return ret;
> > -	I915_WRITE(PORT_HDCP_CONF(port), HDCP_CONF_AUTH_AND_ENC);
> > +	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), HDCP_CONF_AUTH_AND_ENC);
> >   	/* Wait for R0 ready */
> > -	if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
> > +	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
> >   		     (HDCP_STATUS_R0_READY | HDCP_STATUS_ENC), 1)) {
> >   		DRM_ERROR("Timed out waiting for R0 ready\n");
> >   		return -ETIMEDOUT;
> > @@ -686,22 +709,23 @@ static int intel_hdcp_auth(struct intel_connector *connector)
> >   		ret = shim->read_ri_prime(intel_dig_port, ri.shim);
> >   		if (ret)
> >   			return ret;
> > -		I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
> > +		I915_WRITE(HDCP_RPRIME(dev_priv, pipe, port), ri.reg);
> >   		/* Wait for Ri prime match */
> > -		if (!wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
> > +		if (!wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
> >   		    (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1))
> >   			break;
> >   	}
> >   	if (i == tries) {
> >   		DRM_DEBUG_KMS("Timed out waiting for Ri prime match (%x)\n",
> > -			      I915_READ(PORT_HDCP_STATUS(port)));
> > +			      I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
> >   		return -ETIMEDOUT;
> >   	}
> >   	/* Wait for encryption confirmation */
> > -	if (intel_wait_for_register(&dev_priv->uncore, PORT_HDCP_STATUS(port),
> > +	if (intel_wait_for_register(&dev_priv->uncore,
> > +				    HDCP_STATUS(dev_priv, pipe, port),
> >   				    HDCP_STATUS_ENC, HDCP_STATUS_ENC,
> >   				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
> >   		DRM_ERROR("Timed out waiting for encryption\n");
> > @@ -726,15 +750,16 @@ static int _intel_hdcp_disable(struct intel_connector *connector)
> >   	struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
> >   	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> >   	enum port port = intel_dig_port->base.port;
> > +	enum pipe pipe = hdcp->pipe;
> >   	int ret;
> >   	DRM_DEBUG_KMS("[%s:%d] HDCP is being disabled...\n",
> >   		      connector->base.name, connector->base.base.id);
> >   	hdcp->hdcp_encrypted = false;
> > -	I915_WRITE(PORT_HDCP_CONF(port), 0);
> > +	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), 0);
> >   	if (intel_wait_for_register(&dev_priv->uncore,
> > -				    PORT_HDCP_STATUS(port), ~0, 0,
> > +				    HDCP_STATUS(dev_priv, pipe, port), ~0, 0,
> >   				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
> >   		DRM_ERROR("Failed to disable HDCP, timeout clearing status\n");
> >   		return -ETIMEDOUT;
> > @@ -806,9 +831,11 @@ static int intel_hdcp_check_link(struct intel_connector *connector)
> >   	struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
> >   	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
> >   	enum port port = intel_dig_port->base.port;
> > +	enum pipe pipe;
> >   	int ret = 0;
> >   	mutex_lock(&hdcp->mutex);
> > +	pipe = hdcp->pipe;
> >   	/* Check_link valid only when HDCP1.4 is enabled */
> >   	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
> > @@ -817,10 +844,10 @@ static int intel_hdcp_check_link(struct intel_connector *connector)
> >   		goto out;
> >   	}
> > -	if (WARN_ON(!intel_hdcp_in_use(connector))) {
> > +	if (WARN_ON(!intel_hdcp_in_use(dev_priv, pipe, port))) {
> >   		DRM_ERROR("%s:%d HDCP link stopped encryption,%x\n",
> >   			  connector->base.name, connector->base.base.id,
> > -			  I915_READ(PORT_HDCP_STATUS(port)));
> > +			  I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
> >   		ret = -ENXIO;
> >   		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
> >   		schedule_work(&hdcp->prop_work);
> > @@ -1491,10 +1518,11 @@ static int hdcp2_enable_encryption(struct intel_connector *connector)
> >   	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> >   	struct intel_hdcp *hdcp = &connector->hdcp;
> >   	enum port port = connector->encoder->port;
> > +	enum pipe pipe = hdcp->pipe;
> >   	int ret;
> > -	WARN_ON(I915_READ(HDCP2_STATUS_DDI(port)) & LINK_ENCRYPTION_STATUS);
> > -
> > +	WARN_ON(I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) &
> > +		LINK_ENCRYPTION_STATUS);
> >   	if (hdcp->shim->toggle_signalling) {
> >   		ret = hdcp->shim->toggle_signalling(intel_dig_port, true);
> >   		if (ret) {
> > @@ -1504,14 +1532,15 @@ static int hdcp2_enable_encryption(struct intel_connector *connector)
> >   		}
> >   	}
> > -	if (I915_READ(HDCP2_STATUS_DDI(port)) & LINK_AUTH_STATUS) {
> > +	if (I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) & LINK_AUTH_STATUS) {
> >   		/* Link is Authenticated. Now set for Encryption */
> > -		I915_WRITE(HDCP2_CTL_DDI(port),
> > -			   I915_READ(HDCP2_CTL_DDI(port)) |
> > +		I915_WRITE(HDCP2_CTL(dev_priv, pipe, port),
> > +			   I915_READ(HDCP2_CTL(dev_priv, pipe, port)) |
> >   			   CTL_LINK_ENCRYPTION_REQ);
> >   	}
> > -	ret = intel_wait_for_register(&dev_priv->uncore, HDCP2_STATUS_DDI(port),
> > +	ret = intel_wait_for_register(&dev_priv->uncore,
> > +				      HDCP2_STATUS(dev_priv, pipe, port),
> >   				      LINK_ENCRYPTION_STATUS,
> >   				      LINK_ENCRYPTION_STATUS,
> >   				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
> > @@ -1525,14 +1554,17 @@ static int hdcp2_disable_encryption(struct intel_connector *connector)
> >   	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> >   	struct intel_hdcp *hdcp = &connector->hdcp;
> >   	enum port port = connector->encoder->port;
> > +	enum pipe pipe = hdcp->pipe;
> >   	int ret;
> > -	WARN_ON(!(I915_READ(HDCP2_STATUS_DDI(port)) & LINK_ENCRYPTION_STATUS));
> > +	WARN_ON(!(I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) &
> > +		LINK_ENCRYPTION_STATUS));
> > +	I915_WRITE(HDCP2_CTL(dev_priv, pipe, port),
> > +		   I915_READ(HDCP2_CTL(dev_priv, pipe, port)) &
> > +		   ~CTL_LINK_ENCRYPTION_REQ);
> > -	I915_WRITE(HDCP2_CTL_DDI(port),
> > -		   I915_READ(HDCP2_CTL_DDI(port)) & ~CTL_LINK_ENCRYPTION_REQ);
> > -
> > -	ret = intel_wait_for_register(&dev_priv->uncore, HDCP2_STATUS_DDI(port),
> > +	ret = intel_wait_for_register(&dev_priv->uncore,
> > +				      HDCP2_STATUS(dev_priv, pipe, port),
> >   				      LINK_ENCRYPTION_STATUS, 0x0,
> >   				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
> >   	if (ret == -ETIMEDOUT)
> > @@ -1631,9 +1663,11 @@ static int intel_hdcp2_check_link(struct intel_connector *connector)
> >   	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> >   	struct intel_hdcp *hdcp = &connector->hdcp;
> >   	enum port port = connector->encoder->port;
> > +	enum pipe pipe;
> >   	int ret = 0;
> >   	mutex_lock(&hdcp->mutex);
> > +	pipe = hdcp->pipe;
> >   	/* hdcp2_check_link is expected only when HDCP2.2 is Enabled */
> >   	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
> > @@ -1642,9 +1676,9 @@ static int intel_hdcp2_check_link(struct intel_connector *connector)
> >   		goto out;
> >   	}
> > -	if (WARN_ON(!intel_hdcp2_in_use(connector))) {
> > +	if (WARN_ON(!intel_hdcp2_in_use(dev_priv, pipe, port))) {
> >   		DRM_ERROR("HDCP2.2 link stopped the encryption, %x\n",
> > -			  I915_READ(HDCP2_STATUS_DDI(port)));
> > +			  I915_READ(HDCP2_STATUS(dev_priv, pipe, port)));
> >   		ret = -ENXIO;
> >   		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
> >   		schedule_work(&hdcp->prop_work);
> > @@ -1857,6 +1891,9 @@ int intel_hdcp_enable(struct intel_connector *connector)
> >   	mutex_lock(&hdcp->mutex);
> >   	WARN_ON(hdcp->value == DRM_MODE_CONTENT_PROTECTION_ENABLED);
> > +	/* FIXME: Need to take the drm modeset lock for connection_mutex. */
> And we can't take this right now because.... ?
Sorry this FIXME is supposed to be removed. drm mode set lock is already
acquired at this point in time.
> > +	hdcp->pipe = intel_connector_get_pipe(connector);
> > +
> >   	/*
> >   	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
> >   	 * is capable of HDCP2.2, it is preferred to use HDCP2.2.
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > index 0ebec69bbbfc..2096aee174b2 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> > @@ -1491,7 +1491,10 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
> >   {
> >   	struct drm_i915_private *dev_priv =
> >   		intel_dig_port->base.base.dev->dev_private;
> > +	struct intel_connector *connector =
> > +				intel_dig_port->hdmi.attached_connector;
> >   	enum port port = intel_dig_port->base.port;
> > +	enum pipe pipe = connector->hdcp.pipe;
> >   	int ret;
> >   	union {
> >   		u32 reg;
> > @@ -1502,13 +1505,13 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
> >   	if (ret)
> >   		return false;
> > -	I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
> > +	I915_WRITE(HDCP_RPRIME(dev_priv, pipe, port), ri.reg);
> >   	/* Wait for Ri prime match */
> > -	if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
> > +	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
> >   		     (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
> >   		DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n",
> > -			  I915_READ(PORT_HDCP_STATUS(port)));
> > +			  I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
> >   		return false;
> >   	}
> >   	return true;
> > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> > index 7e6009cefb18..2306e83b16fc 100644
> > --- a/drivers/gpu/drm/i915/i915_reg.h
> > +++ b/drivers/gpu/drm/i915/i915_reg.h
> > @@ -9225,12 +9225,20 @@ enum skl_power_gate {
> >   /* HDCP Repeater Registers */
> >   #define HDCP_REP_CTL			_MMIO(0x66d00)
> > +#define  HDCP_TRANSA_REP_PRESENT	BIT(31)
> > +#define  HDCP_TRANSB_REP_PRESENT	BIT(30)
> > +#define  HDCP_TRANSC_REP_PRESENT	BIT(29)
> > +#define  HDCP_TRANSD_REP_PRESENT	BIT(28)
> >   #define  HDCP_DDIB_REP_PRESENT		BIT(30)
> >   #define  HDCP_DDIA_REP_PRESENT		BIT(29)
> >   #define  HDCP_DDIC_REP_PRESENT		BIT(28)
> >   #define  HDCP_DDID_REP_PRESENT		BIT(27)
> >   #define  HDCP_DDIF_REP_PRESENT		BIT(26)
> >   #define  HDCP_DDIE_REP_PRESENT		BIT(25)
> > +#define  HDCP_TRANSA_SHA1_M0		(1 << 20)
> > +#define  HDCP_TRANSB_SHA1_M0		(2 << 20)
> > +#define  HDCP_TRANSC_SHA1_M0		(3 << 20)
> > +#define  HDCP_TRANSD_SHA1_M0		(4 << 20)
> >   #define  HDCP_DDIB_SHA1_M0		(1 << 20)
> >   #define  HDCP_DDIA_SHA1_M0		(2 << 20)
> >   #define  HDCP_DDIC_SHA1_M0		(3 << 20)
> > @@ -9270,15 +9278,89 @@ enum skl_power_gate {
> >   					  _PORTE_HDCP_AUTHENC, \
> >   					  _PORTF_HDCP_AUTHENC) + (x))
> >   #define PORT_HDCP_CONF(port)		_PORT_HDCP_AUTHENC(port, 0x0)
> > +#define _TRANSA_HDCP_CONF		0x66400
> > +#define _TRANSB_HDCP_CONF		0x66500
> > +#define TRANS_HDCP_CONF(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_CONF, \
> > +						    _TRANSB_HDCP_CONF)
> > +#define HDCP_CONF(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_CONF(pipe) : \
> > +					PORT_HDCP_CONF(port))
> Alignment
Shashank,

in diff this looks misaligned. But in file this is in place.

-Ram
> > +
> >   #define  HDCP_CONF_CAPTURE_AN		BIT(0)
> >   #define  HDCP_CONF_AUTH_AND_ENC		(BIT(1) | BIT(0))
> >   #define PORT_HDCP_ANINIT(port)		_PORT_HDCP_AUTHENC(port, 0x4)
> > +#define _TRANSA_HDCP_ANINIT		0x66404
> > +#define _TRANSB_HDCP_ANINIT		0x66504
> > +#define TRANS_HDCP_ANINIT(trans)	_MMIO_TRANS(trans, \
> > +						    _TRANSA_HDCP_ANINIT, \
> > +						    _TRANSB_HDCP_ANINIT)
> > +#define HDCP_ANINIT(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_ANINIT(pipe) : \
> > +					PORT_HDCP_ANINIT(port))
> Alignment
> > +
> >   #define PORT_HDCP_ANLO(port)		_PORT_HDCP_AUTHENC(port, 0x8)
> > +#define _TRANSA_HDCP_ANLO		0x66408
> > +#define _TRANSB_HDCP_ANLO		0x66508
> > +#define TRANS_HDCP_ANLO(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_ANLO, \
> > +						    _TRANSB_HDCP_ANLO)
> > +#define HDCP_ANLO(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_ANLO(pipe) : \
> > +					PORT_HDCP_ANLO(port))
> > +
> Alignment
> >   #define PORT_HDCP_ANHI(port)		_PORT_HDCP_AUTHENC(port, 0xC)
> > +#define _TRANSA_HDCP_ANHI		0x6640C
> > +#define _TRANSB_HDCP_ANHI		0x6650C
> > +#define TRANS_HDCP_ANHI(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_ANHI, \
> > +						    _TRANSB_HDCP_ANHI)
> > +#define HDCP_ANHI(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_ANHI(pipe) : \
> > +					PORT_HDCP_ANHI(port))
> > +
> Alignment
> >   #define PORT_HDCP_BKSVLO(port)		_PORT_HDCP_AUTHENC(port, 0x10)
> > +#define _TRANSA_HDCP_BKSVLO		0x66410
> > +#define _TRANSB_HDCP_BKSVLO		0x66510
> > +#define TRANS_HDCP_BKSVLO(trans)	_MMIO_TRANS(trans, \
> > +						    _TRANSA_HDCP_BKSVLO, \
> > +						    _TRANSB_HDCP_BKSVLO)
> > +#define HDCP_BKSVLO(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_BKSVLO(pipe) : \
> > +					PORT_HDCP_BKSVLO(port))
> > +
> Alignment
> >   #define PORT_HDCP_BKSVHI(port)		_PORT_HDCP_AUTHENC(port, 0x14)
> > +#define _TRANSA_HDCP_BKSVHI		0x66414
> > +#define _TRANSB_HDCP_BKSVHI		0x66514
> > +#define TRANS_HDCP_BKSVHI(trans)	_MMIO_TRANS(trans, \
> > +						    _TRANSA_HDCP_BKSVHI, \
> > +						    _TRANSB_HDCP_BKSVHI)
> > +#define HDCP_BKSVHI(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_BKSVHI(pipe) : \
> > +					PORT_HDCP_BKSVHI(port))
> > +
> Alignment
> >   #define PORT_HDCP_RPRIME(port)		_PORT_HDCP_AUTHENC(port, 0x18)
> > +#define _TRANSA_HDCP_RPRIME		0x66418
> > +#define _TRANSB_HDCP_RPRIME		0x66518
> > +#define TRANS_HDCP_RPRIME(trans)	_MMIO_TRANS(trans, \
> > +						    _TRANSA_HDCP_RPRIME, \
> > +						    _TRANSB_HDCP_RPRIME)
> > +#define HDCP_RPRIME(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_RPRIME(pipe) : \
> > +					PORT_HDCP_RPRIME(port))
> > +
> Alignment
> >   #define PORT_HDCP_STATUS(port)		_PORT_HDCP_AUTHENC(port, 0x1C)
> > +#define _TRANSA_HDCP_STATUS		0x6641C
> > +#define _TRANSB_HDCP_STATUS		0x6651C
> > +#define TRANS_HDCP_STATUS(trans)	_MMIO_TRANS(trans, \
> > +						    _TRANSA_HDCP_STATUS, \
> > +						    _TRANSB_HDCP_STATUS)
> > +#define HDCP_STATUS(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP_STATUS(pipe) : \
> > +					PORT_HDCP_STATUS(port))
> > +
> Alignment
> >   #define  HDCP_STATUS_STREAM_A_ENC	BIT(31)
> >   #define  HDCP_STATUS_STREAM_B_ENC	BIT(30)
> >   #define  HDCP_STATUS_STREAM_C_ENC	BIT(29)
> > @@ -9305,23 +9387,43 @@ enum skl_power_gate {
> >   					  _PORTD_HDCP2_BASE, \
> >   					  _PORTE_HDCP2_BASE, \
> >   					  _PORTF_HDCP2_BASE) + (x))
> > -
> > -#define HDCP2_AUTH_DDI(port)		_PORT_HDCP2_BASE(port, 0x98)
> > +#define PORT_HDCP2_AUTH(port)		_PORT_HDCP2_BASE(port, 0x98)
> > +#define _TRANSA_HDCP2_AUTH		0x66498
> > +#define _TRANSB_HDCP2_AUTH		0x66598
> > +#define TRANS_HDCP2_AUTH(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP2_AUTH, \
> > +						    _TRANSB_HDCP2_AUTH)
> Alignment
> >   #define   AUTH_LINK_AUTHENTICATED	BIT(31)
> >   #define   AUTH_LINK_TYPE		BIT(30)
> >   #define   AUTH_FORCE_CLR_INPUTCTR	BIT(19)
> >   #define   AUTH_CLR_KEYS			BIT(18)
> > -
> > -#define HDCP2_CTL_DDI(port)		_PORT_HDCP2_BASE(port, 0xB0)
> > +#define HDCP2_AUTH(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					 TRANS_HDCP2_AUTH(pipe) : \
> > +					 PORT_HDCP2_AUTH(port))
> > +
> > +#define PORT_HDCP2_CTL(port)		_PORT_HDCP2_BASE(port, 0xB0)
> > +#define _TRANSA_HDCP2_CTL		0x664B0
> > +#define _TRANSB_HDCP2_CTL		0x665B0
> > +#define TRANS_HDCP2_CTL(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP2_CTL, \
> > +						    _TRANSB_HDCP2_CTL)
> >   #define   CTL_LINK_ENCRYPTION_REQ	BIT(31)
> > -
> > -#define HDCP2_STATUS_DDI(port)		_PORT_HDCP2_BASE(port, 0xB4)
> > -#define   STREAM_ENCRYPTION_STATUS_A	BIT(31)
> > -#define   STREAM_ENCRYPTION_STATUS_B	BIT(30)
> > -#define   STREAM_ENCRYPTION_STATUS_C	BIT(29)
> > +#define HDCP2_CTL(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> > +					TRANS_HDCP2_CTL(pipe) : \
> > +					PORT_HDCP2_CTL(port))
> > +
> Alignment
> > +#define PORT_HDCP2_STATUS(port)		_PORT_HDCP2_BASE(port, 0xB4)
> > +#define _TRANSA_HDCP2_STATUS		0x664B4
> > +#define _TRANSB_HDCP2_STATUS		0x665B4
> > +#define TRANS_HDCP2_STATUS(trans)	_MMIO_TRANS(trans, \
> > +						    _TRANSA_HDCP2_STATUS, \
> > +						    _TRANSB_HDCP2_STATUS)
> >   #define   LINK_TYPE_STATUS		BIT(22)
> >   #define   LINK_AUTH_STATUS		BIT(21)
> >   #define   LINK_ENCRYPTION_STATUS	BIT(20)
> > +#define HDCP2_STATUS(dev_priv, pipe, port) \
> > +					(INTEL_GEN(dev_priv) >= 12 ? \
> > +					 TRANS_HDCP2_STATUS(pipe) : \
> > +					 PORT_HDCP2_STATUS(port))
> >   /* Per-pipe DDI Function Control */
> >   #define _TRANS_DDI_FUNC_CTL_A		0x60400
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index 1d58f7ec5d84..53f13e6a5a73 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -359,6 +359,14 @@ struct intel_hdcp {
> >   	wait_queue_head_t cp_irq_queue;
> >   	atomic_t cp_irq_count;
> >   	int cp_irq_count_cached;
> > +
> > +	/*
> > +	 * Gen 12 onwards, HDCP is part of transcoder(previously DDI).
> > +	 * So chacheing the pipe associated to connector at hdcp_enable
> > +	 * would help in subsequent functions to derive the right offsets
> > +	 * for HDCP registers.
> > +	 */
> > +	enum pipe pipe;
> >   };
> >   struct intel_connector {
> - Shashank
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+
  2019-07-02  5:54 [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+ Ramalingam C
  2019-07-02 17:04 ` ✓ Fi.CI.BAT: success for " Patchwork
  2019-07-03 15:02 ` ✓ Fi.CI.IGT: " Patchwork
@ 2019-07-09  4:09 ` Sharma, Shashank
  2019-07-08 23:59   ` Ramalingam C
  2 siblings, 1 reply; 5+ messages in thread
From: Sharma, Shashank @ 2019-07-09  4:09 UTC (permalink / raw)
  To: Ramalingam C, Daniel Vetter, intel-gfx

Hello Ram,

On 7/2/2019 11:24 AM, Ramalingam C wrote:

>  From Gen12 onwards, HDCP HW block is implemented within transcoders.
> Till Gen11 HDCP HW block was part of DDI.
>
> Hence required changes in HW programming is handled here.
>
> v2:
>    _MMIO_TRANS is used [Lucas and Daniel]
>    platform check is moved into the caller [Lucas]
> v3:
>    platform check is moved into a macro [Shashank]
>
> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_hdcp.c | 155 ++++++++++++++--------
>   drivers/gpu/drm/i915/display/intel_hdmi.c |   9 +-
>   drivers/gpu/drm/i915/i915_reg.h           | 120 +++++++++++++++--
>   drivers/gpu/drm/i915/intel_drv.h          |   8 ++
>   4 files changed, 221 insertions(+), 71 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index bc3a94d491c4..14ba723a3561 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -17,6 +17,7 @@
>   #include "intel_drv.h"
>   #include "intel_hdcp.h"
>   #include "intel_sideband.h"
> +#include "intel_connector.h"
>   
>   #define KEY_LOAD_TRIES	5
>   #define ENCRYPT_STATUS_CHANGE_TIMEOUT_MS	50
> @@ -104,23 +105,21 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
>   	return capable;
>   }
>   
> -static inline bool intel_hdcp_in_use(struct intel_connector *connector)
> +static inline bool intel_hdcp_in_use(struct drm_i915_private *dev_priv,
> +				     enum pipe pipe, enum port port)
>   {
> -	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	enum port port = connector->encoder->port;
>   	u32 reg;
>   
> -	reg = I915_READ(PORT_HDCP_STATUS(port));
> +	reg = I915_READ(HDCP_STATUS(dev_priv, pipe, port));
>   	return reg & HDCP_STATUS_ENC;
directly return I915_READ(HDCP_STATUS(dev_priv, pipe, port)) & 
HDCP_STATUS_ENC; ?
>   }
>   
> -static inline bool intel_hdcp2_in_use(struct intel_connector *connector)
> +static inline bool intel_hdcp2_in_use(struct drm_i915_private *dev_priv,
> +				      enum pipe pipe, enum port port)
>   {
> -	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	enum port port = connector->encoder->port;
>   	u32 reg;
>   
> -	reg = I915_READ(HDCP2_STATUS_DDI(port));
> +	reg = I915_READ(HDCP2_STATUS(dev_priv, pipe, port));
>   	return reg & LINK_ENCRYPTION_STATUS;
same here
>   }
>   
> @@ -253,37 +252,59 @@ static int intel_write_sha_text(struct drm_i915_private *dev_priv, u32 sha_text)
>   }
>   
>   static
> -u32 intel_hdcp_get_repeater_ctl(struct intel_digital_port *intel_dig_port)
> +u32 intel_hdcp_get_repeater_ctl(struct drm_i915_private *dev_priv,
> +				enum pipe pipe, enum port port)
>   {
> -	enum port port = intel_dig_port->base.port;
> -	switch (port) {
> -	case PORT_A:
> -		return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
> -	case PORT_B:
> -		return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
> -	case PORT_C:
> -		return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
> -	case PORT_D:
> -		return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
> -	case PORT_E:
> -		return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
> -	default:
> -		break;
> -	}
> -	DRM_ERROR("Unknown port %d\n", port);
> +	if (INTEL_GEN(dev_priv) >= 12) {
> +		switch (pipe) {
> +		case PIPE_A:
> +			return HDCP_TRANSA_REP_PRESENT |
> +			       HDCP_TRANSA_SHA1_M0;
> +		case PIPE_B:
> +			return HDCP_TRANSB_REP_PRESENT |
> +			       HDCP_TRANSB_SHA1_M0;
> +		case PIPE_C:
> +			return HDCP_TRANSC_REP_PRESENT |
> +			       HDCP_TRANSC_SHA1_M0;
> +		/* FIXME: Add a case for PIPE_D */
> +		default:
> +			DRM_ERROR("Unknown pipe %d\n", pipe);
> +			break;
> +		}

return -EINVAL here, then we don't need the else condition

may be something like:

ret = -EINVAL

if (GEN >=12) {

     switch(pipe) {

         case PIPEA: ret = ; break;

         case PIPE_B: ret =; break;

         default: DRM_ERROR(); break;

     }

     return ret;

}

switch (port) {

         case PORT_A: ret = ;

         case PORT_B: ret =;

         default: DRM_ERROR();

}

return ret;

> +	} else {
> +		switch (port) {
> +		case PORT_A:
> +			return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
> +		case PORT_B:
> +			return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
> +		case PORT_C:
> +			return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
> +		case PORT_D:
> +			return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
> +		case PORT_E:
> +			return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
> +		default:
> +			DRM_ERROR("Unknown port %d\n", port);
> +			break;
> +		}
> +	}
>   	return -EINVAL;
>   }
>   
>   static
> -int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
> +int intel_hdcp_validate_v_prime(struct intel_connector *connector,
>   				const struct intel_hdcp_shim *shim,
>   				u8 *ksv_fifo, u8 num_downstream, u8 *bstatus)
>   {
> +	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
>   	struct drm_i915_private *dev_priv;
> +	enum pipe pipe = connector->hdcp.pipe;
> +	enum port port;
enum port port = intel_dig_port->base.port;?
>   	u32 vprime, sha_text, sha_leftovers, rep_ctl;
>   	int ret, i, j, sha_idx;
>   
>   	dev_priv = intel_dig_port->base.base.dev->dev_private;
> +	port = intel_dig_port->base.port;
>   
>   	/* Process V' values from the receiver */
>   	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++) {
> @@ -306,7 +327,7 @@ int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
>   	sha_idx = 0;
>   	sha_text = 0;
>   	sha_leftovers = 0;
> -	rep_ctl = intel_hdcp_get_repeater_ctl(intel_dig_port);
> +	rep_ctl = intel_hdcp_get_repeater_ctl(dev_priv, pipe, port);
>   	I915_WRITE(HDCP_REP_CTL, rep_ctl | HDCP_SHA1_TEXT_32);
>   	for (i = 0; i < num_downstream; i++) {
>   		unsigned int sha_empty;
> @@ -544,7 +565,7 @@ int intel_hdcp_auth_downstream(struct intel_connector *connector)
>   	 * V prime atleast twice.
>   	 */
>   	for (i = 0; i < tries; i++) {
> -		ret = intel_hdcp_validate_v_prime(intel_dig_port, shim,
> +		ret = intel_hdcp_validate_v_prime(connector, shim,
>   						  ksv_fifo, num_downstream,
>   						  bstatus);
>   		if (!ret)
> @@ -572,6 +593,7 @@ static int intel_hdcp_auth(struct intel_connector *connector)
>   	struct drm_device *dev = connector->base.dev;
>   	const struct intel_hdcp_shim *shim = hdcp->shim;
>   	struct drm_i915_private *dev_priv;
> +	enum pipe pipe = connector->hdcp.pipe;
>   	enum port port;
>   	unsigned long r0_prime_gen_start;
>   	int ret, i, tries = 2;
> @@ -611,19 +633,20 @@ static int intel_hdcp_auth(struct intel_connector *connector)
>   
>   	/* Initialize An with 2 random values and acquire it */
>   	for (i = 0; i < 2; i++)
> -		I915_WRITE(PORT_HDCP_ANINIT(port), get_random_u32());
> -	I915_WRITE(PORT_HDCP_CONF(port), HDCP_CONF_CAPTURE_AN);
> +		I915_WRITE(HDCP_ANINIT(dev_priv, pipe, port), get_random_u32());
> +	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), HDCP_CONF_CAPTURE_AN);
>   
>   	/* Wait for An to be acquired */
> -	if (intel_wait_for_register(&dev_priv->uncore, PORT_HDCP_STATUS(port),
> +	if (intel_wait_for_register(&dev_priv->uncore,
> +				    HDCP_STATUS(dev_priv, pipe, port),
>   				    HDCP_STATUS_AN_READY,
>   				    HDCP_STATUS_AN_READY, 1)) {
>   		DRM_ERROR("Timed out waiting for An\n");
>   		return -ETIMEDOUT;
>   	}
>   
> -	an.reg[0] = I915_READ(PORT_HDCP_ANLO(port));
> -	an.reg[1] = I915_READ(PORT_HDCP_ANHI(port));
> +	an.reg[0] = I915_READ(HDCP_ANLO(dev_priv, pipe, port));
> +	an.reg[1] = I915_READ(HDCP_ANHI(dev_priv, pipe, port));
>   	ret = shim->write_an_aksv(intel_dig_port, an.shim);
>   	if (ret)
>   		return ret;
> @@ -641,24 +664,24 @@ static int intel_hdcp_auth(struct intel_connector *connector)
>   		return -EPERM;
>   	}
>   
> -	I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
> -	I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);
> +	I915_WRITE(HDCP_BKSVLO(dev_priv, pipe, port), bksv.reg[0]);
> +	I915_WRITE(HDCP_BKSVHI(dev_priv, pipe, port), bksv.reg[1]);
>   
>   	ret = shim->repeater_present(intel_dig_port, &repeater_present);
>   	if (ret)
>   		return ret;
>   	if (repeater_present)
>   		I915_WRITE(HDCP_REP_CTL,
> -			   intel_hdcp_get_repeater_ctl(intel_dig_port));
> +			   intel_hdcp_get_repeater_ctl(dev_priv, pipe, port));
>   
>   	ret = shim->toggle_signalling(intel_dig_port, true);
>   	if (ret)
>   		return ret;
>   
> -	I915_WRITE(PORT_HDCP_CONF(port), HDCP_CONF_AUTH_AND_ENC);
> +	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), HDCP_CONF_AUTH_AND_ENC);
>   
>   	/* Wait for R0 ready */
> -	if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
> +	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
>   		     (HDCP_STATUS_R0_READY | HDCP_STATUS_ENC), 1)) {
>   		DRM_ERROR("Timed out waiting for R0 ready\n");
>   		return -ETIMEDOUT;
> @@ -686,22 +709,23 @@ static int intel_hdcp_auth(struct intel_connector *connector)
>   		ret = shim->read_ri_prime(intel_dig_port, ri.shim);
>   		if (ret)
>   			return ret;
> -		I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
> +		I915_WRITE(HDCP_RPRIME(dev_priv, pipe, port), ri.reg);
>   
>   		/* Wait for Ri prime match */
> -		if (!wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
> +		if (!wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
>   		    (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1))
>   			break;
>   	}
>   
>   	if (i == tries) {
>   		DRM_DEBUG_KMS("Timed out waiting for Ri prime match (%x)\n",
> -			      I915_READ(PORT_HDCP_STATUS(port)));
> +			      I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
>   		return -ETIMEDOUT;
>   	}
>   
>   	/* Wait for encryption confirmation */
> -	if (intel_wait_for_register(&dev_priv->uncore, PORT_HDCP_STATUS(port),
> +	if (intel_wait_for_register(&dev_priv->uncore,
> +				    HDCP_STATUS(dev_priv, pipe, port),
>   				    HDCP_STATUS_ENC, HDCP_STATUS_ENC,
>   				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
>   		DRM_ERROR("Timed out waiting for encryption\n");
> @@ -726,15 +750,16 @@ static int _intel_hdcp_disable(struct intel_connector *connector)
>   	struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
>   	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
>   	enum port port = intel_dig_port->base.port;
> +	enum pipe pipe = hdcp->pipe;
>   	int ret;
>   
>   	DRM_DEBUG_KMS("[%s:%d] HDCP is being disabled...\n",
>   		      connector->base.name, connector->base.base.id);
>   
>   	hdcp->hdcp_encrypted = false;
> -	I915_WRITE(PORT_HDCP_CONF(port), 0);
> +	I915_WRITE(HDCP_CONF(dev_priv, pipe, port), 0);
>   	if (intel_wait_for_register(&dev_priv->uncore,
> -				    PORT_HDCP_STATUS(port), ~0, 0,
> +				    HDCP_STATUS(dev_priv, pipe, port), ~0, 0,
>   				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
>   		DRM_ERROR("Failed to disable HDCP, timeout clearing status\n");
>   		return -ETIMEDOUT;
> @@ -806,9 +831,11 @@ static int intel_hdcp_check_link(struct intel_connector *connector)
>   	struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
>   	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
>   	enum port port = intel_dig_port->base.port;
> +	enum pipe pipe;
>   	int ret = 0;
>   
>   	mutex_lock(&hdcp->mutex);
> +	pipe = hdcp->pipe;
>   
>   	/* Check_link valid only when HDCP1.4 is enabled */
>   	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
> @@ -817,10 +844,10 @@ static int intel_hdcp_check_link(struct intel_connector *connector)
>   		goto out;
>   	}
>   
> -	if (WARN_ON(!intel_hdcp_in_use(connector))) {
> +	if (WARN_ON(!intel_hdcp_in_use(dev_priv, pipe, port))) {
>   		DRM_ERROR("%s:%d HDCP link stopped encryption,%x\n",
>   			  connector->base.name, connector->base.base.id,
> -			  I915_READ(PORT_HDCP_STATUS(port)));
> +			  I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
>   		ret = -ENXIO;
>   		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
>   		schedule_work(&hdcp->prop_work);
> @@ -1491,10 +1518,11 @@ static int hdcp2_enable_encryption(struct intel_connector *connector)
>   	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>   	struct intel_hdcp *hdcp = &connector->hdcp;
>   	enum port port = connector->encoder->port;
> +	enum pipe pipe = hdcp->pipe;
>   	int ret;
>   
> -	WARN_ON(I915_READ(HDCP2_STATUS_DDI(port)) & LINK_ENCRYPTION_STATUS);
> -
> +	WARN_ON(I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) &
> +		LINK_ENCRYPTION_STATUS);
>   	if (hdcp->shim->toggle_signalling) {
>   		ret = hdcp->shim->toggle_signalling(intel_dig_port, true);
>   		if (ret) {
> @@ -1504,14 +1532,15 @@ static int hdcp2_enable_encryption(struct intel_connector *connector)
>   		}
>   	}
>   
> -	if (I915_READ(HDCP2_STATUS_DDI(port)) & LINK_AUTH_STATUS) {
> +	if (I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) & LINK_AUTH_STATUS) {
>   		/* Link is Authenticated. Now set for Encryption */
> -		I915_WRITE(HDCP2_CTL_DDI(port),
> -			   I915_READ(HDCP2_CTL_DDI(port)) |
> +		I915_WRITE(HDCP2_CTL(dev_priv, pipe, port),
> +			   I915_READ(HDCP2_CTL(dev_priv, pipe, port)) |
>   			   CTL_LINK_ENCRYPTION_REQ);
>   	}
>   
> -	ret = intel_wait_for_register(&dev_priv->uncore, HDCP2_STATUS_DDI(port),
> +	ret = intel_wait_for_register(&dev_priv->uncore,
> +				      HDCP2_STATUS(dev_priv, pipe, port),
>   				      LINK_ENCRYPTION_STATUS,
>   				      LINK_ENCRYPTION_STATUS,
>   				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
> @@ -1525,14 +1554,17 @@ static int hdcp2_disable_encryption(struct intel_connector *connector)
>   	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>   	struct intel_hdcp *hdcp = &connector->hdcp;
>   	enum port port = connector->encoder->port;
> +	enum pipe pipe = hdcp->pipe;
>   	int ret;
>   
> -	WARN_ON(!(I915_READ(HDCP2_STATUS_DDI(port)) & LINK_ENCRYPTION_STATUS));
> +	WARN_ON(!(I915_READ(HDCP2_STATUS(dev_priv, pipe, port)) &
> +		LINK_ENCRYPTION_STATUS));
> +	I915_WRITE(HDCP2_CTL(dev_priv, pipe, port),
> +		   I915_READ(HDCP2_CTL(dev_priv, pipe, port)) &
> +		   ~CTL_LINK_ENCRYPTION_REQ);
>   
> -	I915_WRITE(HDCP2_CTL_DDI(port),
> -		   I915_READ(HDCP2_CTL_DDI(port)) & ~CTL_LINK_ENCRYPTION_REQ);
> -
> -	ret = intel_wait_for_register(&dev_priv->uncore, HDCP2_STATUS_DDI(port),
> +	ret = intel_wait_for_register(&dev_priv->uncore,
> +				      HDCP2_STATUS(dev_priv, pipe, port),
>   				      LINK_ENCRYPTION_STATUS, 0x0,
>   				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
>   	if (ret == -ETIMEDOUT)
> @@ -1631,9 +1663,11 @@ static int intel_hdcp2_check_link(struct intel_connector *connector)
>   	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>   	struct intel_hdcp *hdcp = &connector->hdcp;
>   	enum port port = connector->encoder->port;
> +	enum pipe pipe;
>   	int ret = 0;
>   
>   	mutex_lock(&hdcp->mutex);
> +	pipe = hdcp->pipe;
>   
>   	/* hdcp2_check_link is expected only when HDCP2.2 is Enabled */
>   	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
> @@ -1642,9 +1676,9 @@ static int intel_hdcp2_check_link(struct intel_connector *connector)
>   		goto out;
>   	}
>   
> -	if (WARN_ON(!intel_hdcp2_in_use(connector))) {
> +	if (WARN_ON(!intel_hdcp2_in_use(dev_priv, pipe, port))) {
>   		DRM_ERROR("HDCP2.2 link stopped the encryption, %x\n",
> -			  I915_READ(HDCP2_STATUS_DDI(port)));
> +			  I915_READ(HDCP2_STATUS(dev_priv, pipe, port)));
>   		ret = -ENXIO;
>   		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
>   		schedule_work(&hdcp->prop_work);
> @@ -1857,6 +1891,9 @@ int intel_hdcp_enable(struct intel_connector *connector)
>   	mutex_lock(&hdcp->mutex);
>   	WARN_ON(hdcp->value == DRM_MODE_CONTENT_PROTECTION_ENABLED);
>   
> +	/* FIXME: Need to take the drm modeset lock for connection_mutex. */
And we can't take this right now because.... ?
> +	hdcp->pipe = intel_connector_get_pipe(connector);
> +
>   	/*
>   	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
>   	 * is capable of HDCP2.2, it is preferred to use HDCP2.2.
> diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
> index 0ebec69bbbfc..2096aee174b2 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
> @@ -1491,7 +1491,10 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
>   {
>   	struct drm_i915_private *dev_priv =
>   		intel_dig_port->base.base.dev->dev_private;
> +	struct intel_connector *connector =
> +				intel_dig_port->hdmi.attached_connector;
>   	enum port port = intel_dig_port->base.port;
> +	enum pipe pipe = connector->hdcp.pipe;
>   	int ret;
>   	union {
>   		u32 reg;
> @@ -1502,13 +1505,13 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
>   	if (ret)
>   		return false;
>   
> -	I915_WRITE(PORT_HDCP_RPRIME(port), ri.reg);
> +	I915_WRITE(HDCP_RPRIME(dev_priv, pipe, port), ri.reg);
>   
>   	/* Wait for Ri prime match */
> -	if (wait_for(I915_READ(PORT_HDCP_STATUS(port)) &
> +	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, pipe, port)) &
>   		     (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
>   		DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n",
> -			  I915_READ(PORT_HDCP_STATUS(port)));
> +			  I915_READ(HDCP_STATUS(dev_priv, pipe, port)));
>   		return false;
>   	}
>   	return true;
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 7e6009cefb18..2306e83b16fc 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -9225,12 +9225,20 @@ enum skl_power_gate {
>   
>   /* HDCP Repeater Registers */
>   #define HDCP_REP_CTL			_MMIO(0x66d00)
> +#define  HDCP_TRANSA_REP_PRESENT	BIT(31)
> +#define  HDCP_TRANSB_REP_PRESENT	BIT(30)
> +#define  HDCP_TRANSC_REP_PRESENT	BIT(29)
> +#define  HDCP_TRANSD_REP_PRESENT	BIT(28)
>   #define  HDCP_DDIB_REP_PRESENT		BIT(30)
>   #define  HDCP_DDIA_REP_PRESENT		BIT(29)
>   #define  HDCP_DDIC_REP_PRESENT		BIT(28)
>   #define  HDCP_DDID_REP_PRESENT		BIT(27)
>   #define  HDCP_DDIF_REP_PRESENT		BIT(26)
>   #define  HDCP_DDIE_REP_PRESENT		BIT(25)
> +#define  HDCP_TRANSA_SHA1_M0		(1 << 20)
> +#define  HDCP_TRANSB_SHA1_M0		(2 << 20)
> +#define  HDCP_TRANSC_SHA1_M0		(3 << 20)
> +#define  HDCP_TRANSD_SHA1_M0		(4 << 20)
>   #define  HDCP_DDIB_SHA1_M0		(1 << 20)
>   #define  HDCP_DDIA_SHA1_M0		(2 << 20)
>   #define  HDCP_DDIC_SHA1_M0		(3 << 20)
> @@ -9270,15 +9278,89 @@ enum skl_power_gate {
>   					  _PORTE_HDCP_AUTHENC, \
>   					  _PORTF_HDCP_AUTHENC) + (x))
>   #define PORT_HDCP_CONF(port)		_PORT_HDCP_AUTHENC(port, 0x0)
> +#define _TRANSA_HDCP_CONF		0x66400
> +#define _TRANSB_HDCP_CONF		0x66500
> +#define TRANS_HDCP_CONF(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_CONF, \
> +						    _TRANSB_HDCP_CONF)
> +#define HDCP_CONF(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_CONF(pipe) : \
> +					PORT_HDCP_CONF(port))
Alignment
> +
>   #define  HDCP_CONF_CAPTURE_AN		BIT(0)
>   #define  HDCP_CONF_AUTH_AND_ENC		(BIT(1) | BIT(0))
>   #define PORT_HDCP_ANINIT(port)		_PORT_HDCP_AUTHENC(port, 0x4)
> +#define _TRANSA_HDCP_ANINIT		0x66404
> +#define _TRANSB_HDCP_ANINIT		0x66504
> +#define TRANS_HDCP_ANINIT(trans)	_MMIO_TRANS(trans, \
> +						    _TRANSA_HDCP_ANINIT, \
> +						    _TRANSB_HDCP_ANINIT)
> +#define HDCP_ANINIT(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_ANINIT(pipe) : \
> +					PORT_HDCP_ANINIT(port))
Alignment
> +
>   #define PORT_HDCP_ANLO(port)		_PORT_HDCP_AUTHENC(port, 0x8)
> +#define _TRANSA_HDCP_ANLO		0x66408
> +#define _TRANSB_HDCP_ANLO		0x66508
> +#define TRANS_HDCP_ANLO(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_ANLO, \
> +						    _TRANSB_HDCP_ANLO)
> +#define HDCP_ANLO(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_ANLO(pipe) : \
> +					PORT_HDCP_ANLO(port))
> +
Alignment
>   #define PORT_HDCP_ANHI(port)		_PORT_HDCP_AUTHENC(port, 0xC)
> +#define _TRANSA_HDCP_ANHI		0x6640C
> +#define _TRANSB_HDCP_ANHI		0x6650C
> +#define TRANS_HDCP_ANHI(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP_ANHI, \
> +						    _TRANSB_HDCP_ANHI)
> +#define HDCP_ANHI(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_ANHI(pipe) : \
> +					PORT_HDCP_ANHI(port))
> +
Alignment
>   #define PORT_HDCP_BKSVLO(port)		_PORT_HDCP_AUTHENC(port, 0x10)
> +#define _TRANSA_HDCP_BKSVLO		0x66410
> +#define _TRANSB_HDCP_BKSVLO		0x66510
> +#define TRANS_HDCP_BKSVLO(trans)	_MMIO_TRANS(trans, \
> +						    _TRANSA_HDCP_BKSVLO, \
> +						    _TRANSB_HDCP_BKSVLO)
> +#define HDCP_BKSVLO(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_BKSVLO(pipe) : \
> +					PORT_HDCP_BKSVLO(port))
> +
Alignment
>   #define PORT_HDCP_BKSVHI(port)		_PORT_HDCP_AUTHENC(port, 0x14)
> +#define _TRANSA_HDCP_BKSVHI		0x66414
> +#define _TRANSB_HDCP_BKSVHI		0x66514
> +#define TRANS_HDCP_BKSVHI(trans)	_MMIO_TRANS(trans, \
> +						    _TRANSA_HDCP_BKSVHI, \
> +						    _TRANSB_HDCP_BKSVHI)
> +#define HDCP_BKSVHI(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_BKSVHI(pipe) : \
> +					PORT_HDCP_BKSVHI(port))
> +
Alignment
>   #define PORT_HDCP_RPRIME(port)		_PORT_HDCP_AUTHENC(port, 0x18)
> +#define _TRANSA_HDCP_RPRIME		0x66418
> +#define _TRANSB_HDCP_RPRIME		0x66518
> +#define TRANS_HDCP_RPRIME(trans)	_MMIO_TRANS(trans, \
> +						    _TRANSA_HDCP_RPRIME, \
> +						    _TRANSB_HDCP_RPRIME)
> +#define HDCP_RPRIME(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_RPRIME(pipe) : \
> +					PORT_HDCP_RPRIME(port))
> +
Alignment
>   #define PORT_HDCP_STATUS(port)		_PORT_HDCP_AUTHENC(port, 0x1C)
> +#define _TRANSA_HDCP_STATUS		0x6641C
> +#define _TRANSB_HDCP_STATUS		0x6651C
> +#define TRANS_HDCP_STATUS(trans)	_MMIO_TRANS(trans, \
> +						    _TRANSA_HDCP_STATUS, \
> +						    _TRANSB_HDCP_STATUS)
> +#define HDCP_STATUS(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP_STATUS(pipe) : \
> +					PORT_HDCP_STATUS(port))
> +
Alignment
>   #define  HDCP_STATUS_STREAM_A_ENC	BIT(31)
>   #define  HDCP_STATUS_STREAM_B_ENC	BIT(30)
>   #define  HDCP_STATUS_STREAM_C_ENC	BIT(29)
> @@ -9305,23 +9387,43 @@ enum skl_power_gate {
>   					  _PORTD_HDCP2_BASE, \
>   					  _PORTE_HDCP2_BASE, \
>   					  _PORTF_HDCP2_BASE) + (x))
> -
> -#define HDCP2_AUTH_DDI(port)		_PORT_HDCP2_BASE(port, 0x98)
> +#define PORT_HDCP2_AUTH(port)		_PORT_HDCP2_BASE(port, 0x98)
> +#define _TRANSA_HDCP2_AUTH		0x66498
> +#define _TRANSB_HDCP2_AUTH		0x66598
> +#define TRANS_HDCP2_AUTH(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP2_AUTH, \
> +						    _TRANSB_HDCP2_AUTH)
Alignment
>   #define   AUTH_LINK_AUTHENTICATED	BIT(31)
>   #define   AUTH_LINK_TYPE		BIT(30)
>   #define   AUTH_FORCE_CLR_INPUTCTR	BIT(19)
>   #define   AUTH_CLR_KEYS			BIT(18)
> -
> -#define HDCP2_CTL_DDI(port)		_PORT_HDCP2_BASE(port, 0xB0)
> +#define HDCP2_AUTH(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					 TRANS_HDCP2_AUTH(pipe) : \
> +					 PORT_HDCP2_AUTH(port))
> +
> +#define PORT_HDCP2_CTL(port)		_PORT_HDCP2_BASE(port, 0xB0)
> +#define _TRANSA_HDCP2_CTL		0x664B0
> +#define _TRANSB_HDCP2_CTL		0x665B0
> +#define TRANS_HDCP2_CTL(trans)		_MMIO_TRANS(trans, _TRANSA_HDCP2_CTL, \
> +						    _TRANSB_HDCP2_CTL)
>   #define   CTL_LINK_ENCRYPTION_REQ	BIT(31)
> -
> -#define HDCP2_STATUS_DDI(port)		_PORT_HDCP2_BASE(port, 0xB4)
> -#define   STREAM_ENCRYPTION_STATUS_A	BIT(31)
> -#define   STREAM_ENCRYPTION_STATUS_B	BIT(30)
> -#define   STREAM_ENCRYPTION_STATUS_C	BIT(29)
> +#define HDCP2_CTL(dev_priv, pipe, port)	(INTEL_GEN(dev_priv) >= 12 ? \
> +					TRANS_HDCP2_CTL(pipe) : \
> +					PORT_HDCP2_CTL(port))
> +
Alignment
> +#define PORT_HDCP2_STATUS(port)		_PORT_HDCP2_BASE(port, 0xB4)
> +#define _TRANSA_HDCP2_STATUS		0x664B4
> +#define _TRANSB_HDCP2_STATUS		0x665B4
> +#define TRANS_HDCP2_STATUS(trans)	_MMIO_TRANS(trans, \
> +						    _TRANSA_HDCP2_STATUS, \
> +						    _TRANSB_HDCP2_STATUS)
>   #define   LINK_TYPE_STATUS		BIT(22)
>   #define   LINK_AUTH_STATUS		BIT(21)
>   #define   LINK_ENCRYPTION_STATUS	BIT(20)
> +#define HDCP2_STATUS(dev_priv, pipe, port) \
> +					(INTEL_GEN(dev_priv) >= 12 ? \
> +					 TRANS_HDCP2_STATUS(pipe) : \
> +					 PORT_HDCP2_STATUS(port))
>   
>   /* Per-pipe DDI Function Control */
>   #define _TRANS_DDI_FUNC_CTL_A		0x60400
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 1d58f7ec5d84..53f13e6a5a73 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -359,6 +359,14 @@ struct intel_hdcp {
>   	wait_queue_head_t cp_irq_queue;
>   	atomic_t cp_irq_count;
>   	int cp_irq_count_cached;
> +
> +	/*
> +	 * Gen 12 onwards, HDCP is part of transcoder(previously DDI).
> +	 * So chacheing the pipe associated to connector at hdcp_enable
> +	 * would help in subsequent functions to derive the right offsets
> +	 * for HDCP registers.
> +	 */
> +	enum pipe pipe;
>   };
>   
>   struct intel_connector {
- Shashank
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-07-09  6:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-02  5:54 [PATCH] drm/i915/tgl: Enable HDCP 1.4 and 2.2 on Gen12+ Ramalingam C
2019-07-02 17:04 ` ✓ Fi.CI.BAT: success for " Patchwork
2019-07-03 15:02 ` ✓ Fi.CI.IGT: " Patchwork
2019-07-09  4:09 ` [PATCH] " Sharma, Shashank
2019-07-08 23:59   ` Ramalingam C

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox