All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ramalingam C <ramalingam.c@intel.com>
To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Cc: alexander.usyskin@intel.com, tomas.winkler@intel.com
Subject: [PATCH v4 37/41] drm/i915/gmbus: Enable burst read
Date: Mon, 21 May 2018 18:23:56 +0530	[thread overview]
Message-ID: <1526907240-17639-38-git-send-email-ramalingam.c@intel.com> (raw)
In-Reply-To: <1526907240-17639-1-git-send-email-ramalingam.c@intel.com>

Support for Burst read in HW is added for HDCP2.2 compliance
requirement.

This patch enables the burst read for all the gmbus read of more than
511Bytes, on capable platforms.

v2:
  Extra line is removed.
v3:
  Macro is added for detecting the BURST_READ Support [Jani]
  Runtime detection of the need for burst_read [Jani]
  Calculation enhancement.
v4:
  GMBUS0 reg val is passed from caller [ville]
  Removed a extra var [ville]
  Extra brackets are removed [ville]
  Implemented the handling of 512Bytes Burst Read.
v5:
  Burst read max length is fixed at 767Bytes [Ville]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h  |  3 ++
 drivers/gpu/drm/i915/i915_reg.h  |  1 +
 drivers/gpu/drm/i915/intel_i2c.c | 62 +++++++++++++++++++++++++++++++++-------
 3 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 028691108125..14293fc1a142 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2552,6 +2552,9 @@ intel_info(const struct drm_i915_private *dev_priv)
  */
 #define HAS_AUX_IRQ(dev_priv)   true
 #define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
+#define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
+					IS_GEMINILAKE(dev_priv) || \
+					IS_KABYLAKE(dev_priv))
 
 /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
  * rows, which changed the alignment requirements and fence programming.
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index ebdf7c9d816e..575d9495f3e2 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2996,6 +2996,7 @@ enum i915_power_well_id {
 #define   GMBUS_RATE_400KHZ	(2<<8) /* reserved on Pineview */
 #define   GMBUS_RATE_1MHZ	(3<<8) /* reserved on Pineview */
 #define   GMBUS_HOLD_EXT	(1<<7) /* 300ns hold time, rsvd on Pineview */
+#define   GMBUS_BYTE_CNT_OVERRIDE (1<<6)
 #define   GMBUS_PIN_DISABLED	0
 #define   GMBUS_PIN_SSC		1
 #define   GMBUS_PIN_VGADDC	2
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
index 1c0f6b56b209..9e1142a2f81b 100644
--- a/drivers/gpu/drm/i915/intel_i2c.c
+++ b/drivers/gpu/drm/i915/intel_i2c.c
@@ -371,12 +371,30 @@ unsigned int gmbus_max_xfer_size(struct drm_i915_private *dev_priv)
 static int
 gmbus_xfer_read_chunk(struct drm_i915_private *dev_priv,
 		      unsigned short addr, u8 *buf, unsigned int len,
-		      u32 gmbus1_index)
+		      u32 gmbus0_reg, u32 gmbus1_index)
 {
+	unsigned int size = len;
+	bool burst_read = len > gmbus_max_xfer_size(dev_priv);
+	bool extra_byte_added = false;
+
+	if (burst_read) {
+
+		/*
+		 * As per HW Spec, for 512Bytes need to read extra Byte and
+		 * Ignore the extra byte read.
+		 */
+		if (len == 512) {
+			extra_byte_added = true;
+			len++;
+		}
+		size = len % 256 + 256;
+		I915_WRITE_FW(GMBUS0, gmbus0_reg | GMBUS_BYTE_CNT_OVERRIDE);
+	}
+
 	I915_WRITE_FW(GMBUS1,
 		      gmbus1_index |
 		      GMBUS_CYCLE_WAIT |
-		      (len << GMBUS_BYTE_COUNT_SHIFT) |
+		      (size << GMBUS_BYTE_COUNT_SHIFT) |
 		      (addr << GMBUS_SLAVE_ADDR_SHIFT) |
 		      GMBUS_SLAVE_READ | GMBUS_SW_RDY);
 	while (len) {
@@ -389,17 +407,34 @@ gmbus_xfer_read_chunk(struct drm_i915_private *dev_priv,
 
 		val = I915_READ_FW(GMBUS3);
 		do {
+			if (extra_byte_added && len == 1)
+				break;
+
 			*buf++ = val & 0xff;
 			val >>= 8;
 		} while (--len && ++loop < 4);
+
+		if (burst_read && len == size - 4)
+			/* Reset the override bit */
+			I915_WRITE_FW(GMBUS0, gmbus0_reg);
 	}
 
 	return 0;
 }
 
+/*
+ * HW spec says that 512Bytes in Burst read need special treatment.
+ * But it doesn't talk about other multiple of 256Bytes. And couldn't locate
+ * an I2C slave, which supports such a lengthy burst read too for experiments.
+ *
+ * So until things get clarified on HW support, to avoid the burst read length
+ * in fold of 256Bytes except 512, max burst read length is fixed at 767Bytes.
+ */
+#define INTEL_GMBUS_BURST_READ_MAX_LEN		767U
+
 static int
 gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
-		u32 gmbus1_index)
+		u32 gmbus0_reg, u32 gmbus1_index)
 {
 	u8 *buf = msg->buf;
 	unsigned int rx_size = msg->len;
@@ -407,10 +442,13 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
 	int ret;
 
 	do {
-		len = min(rx_size, gmbus_max_xfer_size(dev_priv));
+		if (HAS_GMBUS_BURST_READ(dev_priv))
+			len = min(rx_size, INTEL_GMBUS_BURST_READ_MAX_LEN);
+		else
+			len = min(rx_size, gmbus_max_xfer_size(dev_priv));
 
-		ret = gmbus_xfer_read_chunk(dev_priv, msg->addr,
-					    buf, len, gmbus1_index);
+		ret = gmbus_xfer_read_chunk(dev_priv, msg->addr, buf, len,
+					    gmbus0_reg, gmbus1_index);
 		if (ret)
 			return ret;
 
@@ -498,7 +536,8 @@ gmbus_is_index_xfer(struct i2c_msg *msgs, int i, int num)
 }
 
 static int
-gmbus_index_xfer(struct drm_i915_private *dev_priv, struct i2c_msg *msgs)
+gmbus_index_xfer(struct drm_i915_private *dev_priv, struct i2c_msg *msgs,
+		 u32 gmbus0_reg)
 {
 	u32 gmbus1_index = 0;
 	u32 gmbus5 = 0;
@@ -516,7 +555,8 @@ gmbus_index_xfer(struct drm_i915_private *dev_priv, struct i2c_msg *msgs)
 		I915_WRITE_FW(GMBUS5, gmbus5);
 
 	if (msgs[1].flags & I2C_M_RD)
-		ret = gmbus_xfer_read(dev_priv, &msgs[1], gmbus1_index);
+		ret = gmbus_xfer_read(dev_priv, &msgs[1], gmbus0_reg,
+				      gmbus1_index);
 	else
 		ret = gmbus_xfer_write(dev_priv, &msgs[1], gmbus1_index);
 
@@ -551,10 +591,12 @@ do_gmbus_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num,
 	for (; i < num; i += inc) {
 		inc = 1;
 		if (gmbus_is_index_xfer(msgs, i, num)) {
-			ret = gmbus_index_xfer(dev_priv, &msgs[i]);
+			ret = gmbus_index_xfer(dev_priv, &msgs[i],
+					       gmbus0_source | bus->reg0);
 			inc = 2; /* an index transmission is two msgs */
 		} else if (msgs[i].flags & I2C_M_RD) {
-			ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
+			ret = gmbus_xfer_read(dev_priv, &msgs[i],
+					      gmbus0_source | bus->reg0, 0);
 		} else {
 			ret = gmbus_xfer_write(dev_priv, &msgs[i], 0);
 		}
-- 
2.7.4

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

  parent reply	other threads:[~2018-05-21 12:53 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-21 12:53 [PATCH v4 00/41] drm/i915: Implement HDCP2.2 Ramalingam C
2018-05-21 12:53 ` [PATCH v4 01/41] drm: hdcp2.2 authentication msg definitions Ramalingam C
2018-05-21 12:53 ` [PATCH v4 02/41] drm: HDMI and DP specific HDCP2.2 defines Ramalingam C
2018-05-21 12:53 ` [PATCH v4 03/41] mei: bus: whitelist hdcp client Ramalingam C
2018-05-21 12:53 ` [PATCH v4 04/41] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2018-05-21 12:53 ` [PATCH v4 05/41] misc/mei/hdcp: Notifier chain for mei cldev state change Ramalingam C
2018-05-21 12:53 ` [PATCH v4 06/41] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2018-05-21 12:53 ` [PATCH v4 07/41] linux/mei: Header for mei_hdcp driver interface Ramalingam C
2018-05-21 12:53 ` [PATCH v4 08/41] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2018-05-21 12:53 ` [PATCH v4 09/41] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2018-05-21 12:53 ` [PATCH v4 10/41] misc/mei/hdcp: Verify H_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 11/41] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2018-05-21 12:53 ` [PATCH v4 12/41] misc/mei/hdcp: Initiate Locality check Ramalingam C
2018-05-21 12:53 ` [PATCH v4 13/41] misc/mei/hdcp: Verify L_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 14/41] misc/mei/hdcp: Prepare Session Key Ramalingam C
2018-05-21 12:53 ` [PATCH v4 15/41] misc/mei/hdcp: Repeater topology verification and ack Ramalingam C
2018-05-21 12:53 ` [PATCH v4 16/41] misc/mei/hdcp: Verify M_prime Ramalingam C
2018-05-21 12:53 ` [PATCH v4 17/41] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2018-05-21 12:53 ` [PATCH v4 18/41] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2018-05-21 12:53 ` [PATCH v4 19/41] drm/i915: wrapping all hdcp var into intel_hdcp Ramalingam C
2018-05-21 12:53 ` [PATCH v4 20/41] drm/i915: Define HDCP2.2 related variables Ramalingam C
2018-05-21 12:53 ` [PATCH v4 21/41] drm/i915: Define Intel HDCP2.2 registers Ramalingam C
2018-05-21 12:53 ` [PATCH v4 22/41] drm/i915: Wrappers for mei HDCP2.2 services Ramalingam C
2018-05-31  7:07   ` Daniel Vetter
2018-06-20  6:46     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 23/41] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2018-05-21 12:53 ` [PATCH v4 24/41] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2018-05-23 18:35   ` kbuild test robot
2018-05-21 12:53 ` [PATCH v4 25/41] drm/i915: Enable and Disable HDCP2.2 port encryption Ramalingam C
2018-05-31  7:09   ` Daniel Vetter
2018-06-20  6:49     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 26/41] drm/i915: Implement HDCP2.2 En/Dis-able Ramalingam C
2018-05-21 12:53 ` [PATCH v4 27/41] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2018-05-21 12:53 ` [PATCH v4 28/41] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2018-05-21 12:53 ` [PATCH v4 29/41] drm/i915: Pullout the bksv read and validation Ramalingam C
2018-05-21 12:53 ` [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface Ramalingam C
2018-05-24  8:06   ` Daniel Vetter
2018-05-25 11:12     ` Ramalingam C
2018-05-29  6:53       ` Daniel Vetter
2018-05-29  8:42         ` Daniel Vetter
2018-05-29  9:27           ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 31/41] drm/i915: Schedule hdcp_check_link in _intel_hdcp_enable Ramalingam C
2018-05-21 12:53 ` [PATCH v4 32/41] drm/i915: Enable superior HDCP ver that is capable Ramalingam C
2018-05-21 12:53 ` [PATCH v4 33/41] drm/i915: Enable HDCP1.4 incase of HDCP2.2 failure Ramalingam C
2018-05-21 12:53 ` [PATCH v4 34/41] drm/i915: hdcp_check_link only on CP_IRQ Ramalingam C
2018-05-21 12:53 ` [PATCH v4 35/41] drm/i915: Check HDCP 1.4 and 2.2 link " Ramalingam C
2018-05-21 12:53 ` [PATCH v4 36/41] drm/i915/gmbus: Increase the Bytes per Rd/Wr Op Ramalingam C
2018-05-21 12:53 ` Ramalingam C [this message]
2018-05-21 12:53 ` [PATCH v4 38/41] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2018-05-22 20:52   ` [Intel-gfx] " kbuild test robot
2018-05-22 21:33   ` kbuild test robot
2018-05-31  7:22   ` Daniel Vetter
2018-06-20 10:19     ` Ramalingam C
2018-06-20 11:43       ` Daniel Vetter
2018-06-20 11:55         ` C, Ramalingam
2018-05-21 12:53 ` [PATCH v4 39/41] drm/i915: Implement the HDCP2.2 support for HDMI Ramalingam C
2018-05-31  7:24   ` Daniel Vetter
2018-06-20 10:19     ` Ramalingam C
2018-05-21 12:53 ` [PATCH v4 40/41] drm/i915: Add HDCP2.2 support for DP connectors Ramalingam C
2018-05-21 12:54 ` [PATCH v4 41/41] drm/i915: Add HDCP2.2 support for HDMI connectors Ramalingam C
2018-05-21 13:16 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 (rev5) Patchwork
2018-05-21 13:23 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-05-21 15:04   ` Ramalingam C
2018-05-21 15:17     ` Shankar, Uma
2018-05-21 13:39 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-05-29  6:57 ` [PATCH v4 00/41] drm/i915: Implement HDCP2.2 Daniel Vetter
2018-05-29  7:51   ` C, Ramalingam
2018-05-29  8:30     ` Daniel Vetter
2018-05-29  9:40       ` C, Ramalingam

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1526907240-17639-38-git-send-email-ramalingam.c@intel.com \
    --to=ramalingam.c@intel.com \
    --cc=alexander.usyskin@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=tomas.winkler@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.