All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS
@ 2023-02-01  9:08 Suraj Kandpal
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
                   ` (7 more replies)
  0 siblings, 8 replies; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx

These patches enable HDCP2.x on machines MTL and above.
From MTL onwards CSME is spilt into GSC and CSC and now
we use GSC CS instead of MEI to talk to firmware to start
HDCP authentication

--v2
-Fixing some checkpatch changes which I forgot before sending
out the series

--v3
-Drop cp and fw to make naming more agnostic[Jani]
-Sort header[Jani]
-remove static inline function from i915_hdcp_interface[Jani]
-abstract DISPLAY_VER check[Jani]

--v4
-Remove stale comment P2 [Jani]
-Fix part where file rename looks like its removed in P2 and
added in P3 [Jani]
-Add bitmask definition for host session id[Alan]
-Seprating gsc load and heci cmd submission into different funcs[Alan]
-Create comman function to fill gsc_mtl_header[Alan]

--v5
-No need to make hdcp_message field null as we use kzalloc [Alan]
-use i915->drm instead of gt->i915->drm [Alan]

--v6
-Make each patch build individually [Jani]
-drop cp_fw stale commit subject [Jani]
-fix the date on license [Jani]
-revert back to orginal design where mei and gsc fill their own header

--v7
-remove RB by Ankit

--v8
-change design to allocate and deallocate hdcp_message only at
enablement and disabling of hdcp [Alan]
-fix few formatting issue [Ankit]
-fix stale comments [Ankit]

--v9
-move allocation dealloc of hdcp messgae to init and teardown [Alan]
-remove obj from hdcp message , use i915_vma_unpin_and_release [Alan]
-remove return statement from intel_hdcp_gsc_fini [Ankit]

--v10
-remove unnecessary i915_vma_unpin [Alan]

Anshuman Gupta (1):
  drm/i915/hdcp: Keep hdcp agonstic naming convention

Suraj Kandpal (5):
  drm/i915/gsc: Create GSC request submission mechanism
  i915/hdcp: HDCP2.x Refactoring to agnostic hdcp
  drm/i915/hdcp: Refactor HDCP API structures
  drm/i915/mtl: Add function to send command to GSC CS
  drm/i915/mtl: Add HDCP GSC interface

 drivers/gpu/drm/i915/Makefile                 |   2 +
 .../gpu/drm/i915/display/intel_display_core.h |   8 +-
 .../drm/i915/display/intel_display_types.h    |   2 +-
 drivers/gpu/drm/i915/display/intel_hdcp.c     | 109 ++-
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 829 ++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  26 +
 drivers/gpu/drm/i915/gt/intel_gpu_commands.h  |   2 +
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h     |   1 +
 .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c | 109 +++
 .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h |  61 ++
 drivers/misc/mei/hdcp/mei_hdcp.c              | 105 ++-
 drivers/misc/mei/hdcp/mei_hdcp.h              | 354 --------
 include/drm/i915_hdcp_interface.h             | 539 ++++++++++++
 include/drm/i915_mei_hdcp_interface.h         | 184 ----
 14 files changed, 1692 insertions(+), 639 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
 create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
 create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
 create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
 create mode 100644 include/drm/i915_hdcp_interface.h
 delete mode 100644 include/drm/i915_mei_hdcp_interface.h

-- 
2.25.1


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

* [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
@ 2023-02-01  9:08 ` Suraj Kandpal
  2023-03-06 11:17   ` Shankar, Uma
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention Suraj Kandpal
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx; +Cc: Alan Previn

HDCP and PXP will require a common function to allow it to
submit commands to the gsc cs. Also adding the gsc mtl header
that needs to be added on to the existing payloads of HDCP
and PXP.

--v4
-Seprate gsc load and heci cmd submission into different
functions in different files for better scalability [Alan]
-Rename gsc address field [Alan]

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
Signed-off-by: Suraj Kandpal<suraj.kandpal@intel.com>
Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
---
 drivers/gpu/drm/i915/Makefile                 |  1 +
 drivers/gpu/drm/i915/gt/intel_gpu_commands.h  |  2 +
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h     |  1 +
 .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c | 94 +++++++++++++++++++
 .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h | 45 +++++++++
 5 files changed, 143 insertions(+)
 create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
 create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 918470a04591..482928cffb1c 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -195,6 +195,7 @@ i915-y += \
 i915-y += \
 	  gt/uc/intel_gsc_fw.o \
 	  gt/uc/intel_gsc_uc.o \
+	  gt/uc/intel_gsc_uc_heci_cmd_submit.o\
 	  gt/uc/intel_guc.o \
 	  gt/uc/intel_guc_ads.o \
 	  gt/uc/intel_guc_capture.o \
diff --git a/drivers/gpu/drm/i915/gt/intel_gpu_commands.h b/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
index 2af1ae3831df..454179884801 100644
--- a/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
+++ b/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
@@ -439,6 +439,8 @@
 #define GSC_FW_LOAD GSC_INSTR(1, 0, 2)
 #define   HECI1_FW_LIMIT_VALID (1 << 31)
 
+#define GSC_HECI_CMD_PKT GSC_INSTR(0, 0, 6)
+
 /*
  * Used to convert any address to canonical form.
  * Starting from gen8, some commands (e.g. STATE_BASE_ADDRESS,
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
index 4b5dbb44afb4..146ac0128f69 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
@@ -12,4 +12,5 @@ struct intel_gsc_uc;
 
 int intel_gsc_uc_fw_upload(struct intel_gsc_uc *gsc);
 bool intel_gsc_uc_fw_init_done(struct intel_gsc_uc *gsc);
+
 #endif
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
new file mode 100644
index 000000000000..be2424af521d
--- /dev/null
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include "gt/intel_engine_pm.h"
+#include "gt/intel_gpu_commands.h"
+#include "gt/intel_gt.h"
+#include "gt/intel_ring.h"
+#include "intel_gsc_uc_heci_cmd_submit.h"
+
+struct gsc_heci_pkt {
+	u64 addr_in;
+	u32 size_in;
+	u64 addr_out;
+	u32 size_out;
+};
+
+static int emit_gsc_heci_pkt(struct i915_request *rq, struct gsc_heci_pkt *pkt)
+{
+	u32 *cs;
+
+	cs = intel_ring_begin(rq, 8);
+	if (IS_ERR(cs))
+		return PTR_ERR(cs);
+
+	*cs++ = GSC_HECI_CMD_PKT;
+	*cs++ = lower_32_bits(pkt->addr_in);
+	*cs++ = upper_32_bits(pkt->addr_in);
+	*cs++ = pkt->size_in;
+	*cs++ = lower_32_bits(pkt->addr_out);
+	*cs++ = upper_32_bits(pkt->addr_out);
+	*cs++ = pkt->size_out;
+	*cs++ = 0;
+
+	intel_ring_advance(rq, cs);
+
+	return 0;
+}
+
+int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc, u64 addr_in,
+					u32 size_in, u64 addr_out,
+					u32 size_out)
+{
+	struct intel_context *ce = gsc->ce;
+	struct i915_request *rq;
+	struct gsc_heci_pkt pkt = {
+	.addr_in = addr_in,
+	.size_in = size_in,
+	.addr_out = addr_out,
+	.size_out = size_out
+	};
+	int err;
+
+	if (!ce)
+		return -ENODEV;
+
+	rq = i915_request_create(ce);
+	if (IS_ERR(rq))
+		return PTR_ERR(rq);
+
+	if (ce->engine->emit_init_breadcrumb) {
+		err = ce->engine->emit_init_breadcrumb(rq);
+		if (err)
+			goto out_rq;
+	}
+
+	err = emit_gsc_heci_pkt(rq, &pkt);
+
+	if (err)
+		goto out_rq;
+
+	err = ce->engine->emit_flush(rq, 0);
+
+out_rq:
+	i915_request_get(rq);
+
+	if (unlikely(err))
+		i915_request_set_error_once(rq, err);
+
+	i915_request_add(rq);
+
+	if (!err && i915_request_wait(rq, 0, msecs_to_jiffies(500)) < 0)
+		err = -ETIME;
+
+	i915_request_put(rq);
+
+	if (err)
+		drm_err(&gsc_uc_to_gt(gsc)->i915->drm,
+			"Request submission for GSC heci cmd failed (%d)\n",
+			err);
+
+	return err;
+}
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
new file mode 100644
index 000000000000..cf610dfca7a5
--- /dev/null
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _INTEL_GSC_UC_HECI_CMD_SUBMIT_H_
+#define _INTEL_GSC_UC_HECI_CMD_SUBMIT_H_
+
+#include <linux/types.h>
+
+struct intel_gsc_uc;
+struct intel_gsc_mtl_header {
+	u32 validity_marker;
+#define GSC_HECI_VALIDITY_MARKER 0xA578875A
+
+	u8 heci_client_id;
+#define HECI_MEADDRESS_PXP 17
+#define HECI_MEADDRESS_HDCP 18
+
+	u8 reserved1;
+
+	u16 header_version;
+#define MTL_GSC_HEADER_VERSION 1
+
+	u64 host_session_handle;
+	u64 gsc_message_handle;
+
+	u32 message_size; /* lower 20 bits only, upper 12 are reserved */
+
+	/*
+	 * Flags mask:
+	 * Bit 0: Pending
+	 * Bit 1: Session Cleanup;
+	 * Bits 2-15: Flags
+	 * Bits 16-31: Extension Size
+	 */
+	u32 flags;
+
+	u32 status;
+} __packed;
+
+int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc,
+					u64 addr_in, u32 size_in,
+					u64 addr_out, u32 size_out);
+#endif
-- 
2.25.1


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

* [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
@ 2023-02-01  9:08 ` Suraj Kandpal
  2023-03-06 11:38   ` Shankar, Uma
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp Suraj Kandpal
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi, Tomas Winkler

From: Anshuman Gupta <anshuman.gupta@intel.com>

Change the include/drm/i915_mei_hdcp_interface.h to
include/drm/i915_hdcp_interface.h

--v6
-make each patch build individually [Jani]

--v8
-change ME FW to ME/GSC FW [Ankit]
-fix formatting issue [Ankit]

Cc: Tomas Winkler <tomas.winkler@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Acked-by: Tomas Winkler <tomas.winkler@intel.com>
---
 .../gpu/drm/i915/display/intel_display_core.h |  2 +-
 .../drm/i915/display/intel_display_types.h    |  2 +-
 drivers/gpu/drm/i915/display/intel_hdcp.c     | 81 ++++++++--------
 drivers/misc/mei/hdcp/mei_hdcp.c              | 61 ++++++------
 ...hdcp_interface.h => i915_hdcp_interface.h} | 92 +++++++++----------
 5 files changed, 118 insertions(+), 120 deletions(-)
 rename include/drm/{i915_mei_hdcp_interface.h => i915_hdcp_interface.h} (73%)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index fb8670aa2932..8e7a68339876 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -378,7 +378,7 @@ struct intel_display {
 	} gmbus;
 
 	struct {
-		struct i915_hdcp_comp_master *master;
+		struct i915_hdcp_master *master;
 		bool comp_added;
 
 		/* Mutex to protect the above hdcp component related values. */
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 9ccae7a46020..7accd3a8877c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -43,7 +43,7 @@
 #include <drm/drm_rect.h>
 #include <drm/drm_vblank.h>
 #include <drm/drm_vblank_work.h>
-#include <drm/i915_mei_hdcp_interface.h>
+#include <drm/i915_hdcp_interface.h>
 #include <media/cec-notifier.h>
 
 #include "i915_vma.h"
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
index 6406fd487ee5..262c76f21801 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -1143,7 +1143,7 @@ hdcp2_prepare_ake_init(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1154,7 +1154,7 @@ hdcp2_prepare_ake_init(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->initiate_hdcp2_session(comp->mei_dev, data, ake_data);
+	ret = comp->ops->initiate_hdcp2_session(comp->hdcp_dev, data, ake_data);
 	if (ret)
 		drm_dbg_kms(&dev_priv->drm, "Prepare_ake_init failed. %d\n",
 			    ret);
@@ -1173,7 +1173,7 @@ hdcp2_verify_rx_cert_prepare_km(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1184,7 +1184,7 @@ hdcp2_verify_rx_cert_prepare_km(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->verify_receiver_cert_prepare_km(comp->mei_dev, data,
+	ret = comp->ops->verify_receiver_cert_prepare_km(comp->hdcp_dev, data,
 							 rx_cert, paired,
 							 ek_pub_km, msg_sz);
 	if (ret < 0)
@@ -1201,7 +1201,7 @@ static int hdcp2_verify_hprime(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1212,7 +1212,7 @@ static int hdcp2_verify_hprime(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->verify_hprime(comp->mei_dev, data, rx_hprime);
+	ret = comp->ops->verify_hprime(comp->hdcp_dev, data, rx_hprime);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Verify hprime failed. %d\n", ret);
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
@@ -1227,7 +1227,7 @@ hdcp2_store_pairing_info(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1238,7 +1238,7 @@ hdcp2_store_pairing_info(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->store_pairing_info(comp->mei_dev, data, pairing_info);
+	ret = comp->ops->store_pairing_info(comp->hdcp_dev, data, pairing_info);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Store pairing info failed. %d\n",
 			    ret);
@@ -1254,7 +1254,7 @@ hdcp2_prepare_lc_init(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1265,7 +1265,7 @@ hdcp2_prepare_lc_init(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->initiate_locality_check(comp->mei_dev, data, lc_init);
+	ret = comp->ops->initiate_locality_check(comp->hdcp_dev, data, lc_init);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Prepare lc_init failed. %d\n",
 			    ret);
@@ -1281,7 +1281,7 @@ hdcp2_verify_lprime(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1292,7 +1292,7 @@ hdcp2_verify_lprime(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->verify_lprime(comp->mei_dev, data, rx_lprime);
+	ret = comp->ops->verify_lprime(comp->hdcp_dev, data, rx_lprime);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Verify L_Prime failed. %d\n",
 			    ret);
@@ -1307,7 +1307,7 @@ static int hdcp2_prepare_skey(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1318,7 +1318,7 @@ static int hdcp2_prepare_skey(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->get_session_key(comp->mei_dev, data, ske_data);
+	ret = comp->ops->get_session_key(comp->hdcp_dev, data, ske_data);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Get session key failed. %d\n",
 			    ret);
@@ -1336,7 +1336,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1347,7 +1347,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->repeater_check_flow_prepare_ack(comp->mei_dev, data,
+	ret = comp->ops->repeater_check_flow_prepare_ack(comp->hdcp_dev, data,
 							 rep_topology,
 							 rep_send_ack);
 	if (ret < 0)
@@ -1365,7 +1365,7 @@ hdcp2_verify_mprime(struct intel_connector *connector,
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1376,7 +1376,7 @@ hdcp2_verify_mprime(struct intel_connector *connector,
 		return -EINVAL;
 	}
 
-	ret = comp->ops->verify_mprime(comp->mei_dev, data, stream_ready);
+	ret = comp->ops->verify_mprime(comp->hdcp_dev, data, stream_ready);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Verify mprime failed. %d\n", ret);
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
@@ -1389,7 +1389,7 @@ static int hdcp2_authenticate_port(struct intel_connector *connector)
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1400,7 +1400,7 @@ static int hdcp2_authenticate_port(struct intel_connector *connector)
 		return -EINVAL;
 	}
 
-	ret = comp->ops->enable_hdcp_authentication(comp->mei_dev, data);
+	ret = comp->ops->enable_hdcp_authentication(comp->hdcp_dev, data);
 	if (ret < 0)
 		drm_dbg_kms(&dev_priv->drm, "Enable hdcp auth failed. %d\n",
 			    ret);
@@ -1413,7 +1413,7 @@ static int hdcp2_close_mei_session(struct intel_connector *connector)
 {
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-	struct i915_hdcp_comp_master *comp;
+	struct i915_hdcp_master *comp;
 	int ret;
 
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
@@ -1424,7 +1424,7 @@ static int hdcp2_close_mei_session(struct intel_connector *connector)
 		return -EINVAL;
 	}
 
-	ret = comp->ops->close_hdcp_session(comp->mei_dev,
+	ret = comp->ops->close_hdcp_session(comp->hdcp_dev,
 					     &dig_port->hdcp_port_data);
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
 
@@ -2145,8 +2145,8 @@ static int i915_hdcp_component_bind(struct device *i915_kdev,
 
 	drm_dbg(&dev_priv->drm, "I915 HDCP comp bind\n");
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
-	dev_priv->display.hdcp.master = (struct i915_hdcp_comp_master *)data;
-	dev_priv->display.hdcp.master->mei_dev = mei_kdev;
+	dev_priv->display.hdcp.master = (struct i915_hdcp_master *)data;
+	dev_priv->display.hdcp.master->hdcp_dev = mei_kdev;
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
 
 	return 0;
@@ -2163,30 +2163,30 @@ static void i915_hdcp_component_unbind(struct device *i915_kdev,
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
 }
 
-static const struct component_ops i915_hdcp_component_ops = {
+static const struct component_ops i915_hdcp_ops = {
 	.bind   = i915_hdcp_component_bind,
 	.unbind = i915_hdcp_component_unbind,
 };
 
-static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
+static enum hdcp_ddi intel_get_hdcp_ddi_index(enum port port)
 {
 	switch (port) {
 	case PORT_A:
-		return MEI_DDI_A;
+		return HDCP_DDI_A;
 	case PORT_B ... PORT_F:
-		return (enum mei_fw_ddi)port;
+		return (enum hdcp_ddi)port;
 	default:
-		return MEI_DDI_INVALID_PORT;
+		return HDCP_DDI_INVALID_PORT;
 	}
 }
 
-static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
+static enum hdcp_transcoder intel_get_hdcp_transcoder(enum transcoder cpu_transcoder)
 {
 	switch (cpu_transcoder) {
 	case TRANSCODER_A ... TRANSCODER_D:
-		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
+		return (enum hdcp_transcoder)(cpu_transcoder | 0x10);
 	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
-		return MEI_INVALID_TRANSCODER;
+		return HDCP_INVALID_TRANSCODER;
 	}
 }
 
@@ -2200,20 +2200,20 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
 	enum port port = dig_port->base.port;
 
 	if (DISPLAY_VER(dev_priv) < 12)
-		data->fw_ddi = intel_get_mei_fw_ddi_index(port);
+		data->hdcp_ddi = intel_get_hdcp_ddi_index(port);
 	else
 		/*
-		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
+		 * As per ME FW API expectation, for GEN 12+, hdcp_ddi is filled
 		 * with zero(INVALID PORT index).
 		 */
-		data->fw_ddi = MEI_DDI_INVALID_PORT;
+		data->hdcp_ddi = HDCP_DDI_INVALID_PORT;
 
 	/*
-	 * As associated transcoder is set and modified at modeset, here fw_tc
+	 * As associated transcoder is set and modified at modeset, here hdcp_transcoder
 	 * is initialized to zero (invalid transcoder index). This will be
 	 * retained for <Gen12 forever.
 	 */
-	data->fw_tc = MEI_INVALID_TRANSCODER;
+	data->hdcp_transcoder = HDCP_INVALID_TRANSCODER;
 
 	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
 	data->protocol = (u8)shim->protocol;
@@ -2256,7 +2256,7 @@ void intel_hdcp_component_init(struct drm_i915_private *dev_priv)
 
 	dev_priv->display.hdcp.comp_added = true;
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
-	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_component_ops,
+	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
 				  I915_COMPONENT_HDCP);
 	if (ret < 0) {
 		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
@@ -2350,7 +2350,8 @@ int intel_hdcp_enable(struct intel_connector *connector,
 	}
 
 	if (DISPLAY_VER(dev_priv) >= 12)
-		dig_port->hdcp_port_data.fw_tc = intel_get_mei_fw_tc(hdcp->cpu_transcoder);
+		dig_port->hdcp_port_data.hdcp_transcoder =
+			intel_get_hdcp_transcoder(hdcp->cpu_transcoder);
 
 	/*
 	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
@@ -2485,7 +2486,7 @@ void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
 	dev_priv->display.hdcp.comp_added = false;
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
 
-	component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);
+	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
 }
 
 void intel_hdcp_cleanup(struct intel_connector *connector)
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index e889a8bd7ac8..b2c49599809c 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -23,7 +23,7 @@
 #include <linux/component.h>
 #include <drm/drm_connector.h>
 #include <drm/i915_component.h>
-#include <drm/i915_mei_hdcp_interface.h>
+#include <drm/i915_hdcp_interface.h>
 
 #include "mei_hdcp.h"
 
@@ -57,8 +57,8 @@ mei_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
 				WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
 
 	session_init_in.port.integrated_port_type = data->port_type;
-	session_init_in.port.physical_port = (u8)data->fw_ddi;
-	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
+	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
+	session_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 	session_init_in.protocol = data->protocol;
 
 	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
@@ -127,8 +127,8 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
 				WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
 
 	verify_rxcert_in.port.integrated_port_type = data->port_type;
-	verify_rxcert_in.port.physical_port = (u8)data->fw_ddi;
-	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
+	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
+	verify_rxcert_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
 	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
@@ -198,8 +198,8 @@ mei_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
 	send_hprime_in.header.buffer_len = WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
 
 	send_hprime_in.port.integrated_port_type = data->port_type;
-	send_hprime_in.port.physical_port = (u8)data->fw_ddi;
-	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
+	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
+	send_hprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
 	       HDCP_2_2_H_PRIME_LEN);
@@ -256,8 +256,8 @@ mei_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
 					WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
 
 	pairing_info_in.port.integrated_port_type = data->port_type;
-	pairing_info_in.port.physical_port = (u8)data->fw_ddi;
-	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
+	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
+	pairing_info_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
 	       HDCP_2_2_E_KH_KM_LEN);
@@ -315,8 +315,8 @@ mei_hdcp_initiate_locality_check(struct device *dev,
 	lc_init_in.header.buffer_len = WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
 
 	lc_init_in.port.integrated_port_type = data->port_type;
-	lc_init_in.port.physical_port = (u8)data->fw_ddi;
-	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
+	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
+	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
 	if (byte < 0) {
@@ -371,8 +371,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
 					WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
 
 	verify_lprime_in.port.integrated_port_type = data->port_type;
-	verify_lprime_in.port.physical_port = (u8)data->fw_ddi;
-	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
+	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
+	verify_lprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
 	       HDCP_2_2_L_PRIME_LEN);
@@ -429,8 +429,8 @@ static int mei_hdcp_get_session_key(struct device *dev,
 	get_skey_in.header.buffer_len = WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
 
 	get_skey_in.port.integrated_port_type = data->port_type;
-	get_skey_in.port.physical_port = (u8)data->fw_ddi;
-	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
+	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
+	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in));
 	if (byte < 0) {
@@ -494,8 +494,8 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
 					WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
 
 	verify_repeater_in.port.integrated_port_type = data->port_type;
-	verify_repeater_in.port.physical_port = (u8)data->fw_ddi;
-	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
+	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
+	verify_repeater_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
 	       HDCP_2_2_RXINFO_LEN);
@@ -572,8 +572,8 @@ static int mei_hdcp_verify_mprime(struct device *dev,
 	verify_mprime_in->header.buffer_len = cmd_size  - sizeof(verify_mprime_in->header);
 
 	verify_mprime_in->port.integrated_port_type = data->port_type;
-	verify_mprime_in->port.physical_port = (u8)data->fw_ddi;
-	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
+	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
+	verify_mprime_in->port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime, HDCP_2_2_MPRIME_LEN);
 	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data->seq_num_m);
@@ -634,8 +634,8 @@ static int mei_hdcp_enable_authentication(struct device *dev,
 	enable_auth_in.header.buffer_len = WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
 
 	enable_auth_in.port.integrated_port_type = data->port_type;
-	enable_auth_in.port.physical_port = (u8)data->fw_ddi;
-	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
+	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
+	enable_auth_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 	enable_auth_in.stream_type = data->streams[0].stream_type;
 
 	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in,
@@ -689,8 +689,8 @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
 				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
 
 	session_close_in.port.integrated_port_type = data->port_type;
-	session_close_in.port.physical_port = (u8)data->fw_ddi;
-	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
+	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
+	session_close_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
 
 	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
 			      sizeof(session_close_in));
@@ -715,7 +715,7 @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
 	return 0;
 }
 
-static const struct i915_hdcp_component_ops mei_hdcp_ops = {
+static const struct i915_hdcp_ops mei_hdcp_ops = {
 	.owner = THIS_MODULE,
 	.initiate_hdcp2_session = mei_hdcp_initiate_session,
 	.verify_receiver_cert_prepare_km =
@@ -735,13 +735,12 @@ static const struct i915_hdcp_component_ops mei_hdcp_ops = {
 static int mei_component_master_bind(struct device *dev)
 {
 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
-	struct i915_hdcp_comp_master *comp_master =
-						mei_cldev_get_drvdata(cldev);
+	struct i915_hdcp_master *comp_master = mei_cldev_get_drvdata(cldev);
 	int ret;
 
 	dev_dbg(dev, "%s\n", __func__);
 	comp_master->ops = &mei_hdcp_ops;
-	comp_master->mei_dev = dev;
+	comp_master->hdcp_dev = dev;
 	ret = component_bind_all(dev, comp_master);
 	if (ret < 0)
 		return ret;
@@ -752,8 +751,7 @@ static int mei_component_master_bind(struct device *dev)
 static void mei_component_master_unbind(struct device *dev)
 {
 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
-	struct i915_hdcp_comp_master *comp_master =
-						mei_cldev_get_drvdata(cldev);
+	struct i915_hdcp_master *comp_master = mei_cldev_get_drvdata(cldev);
 
 	dev_dbg(dev, "%s\n", __func__);
 	component_unbind_all(dev, comp_master);
@@ -801,7 +799,7 @@ static int mei_hdcp_component_match(struct device *dev, int subcomponent,
 static int mei_hdcp_probe(struct mei_cl_device *cldev,
 			  const struct mei_cl_device_id *id)
 {
-	struct i915_hdcp_comp_master *comp_master;
+	struct i915_hdcp_master *comp_master;
 	struct component_match *master_match;
 	int ret;
 
@@ -846,8 +844,7 @@ static int mei_hdcp_probe(struct mei_cl_device *cldev,
 
 static void mei_hdcp_remove(struct mei_cl_device *cldev)
 {
-	struct i915_hdcp_comp_master *comp_master =
-						mei_cldev_get_drvdata(cldev);
+	struct i915_hdcp_master *comp_master = mei_cldev_get_drvdata(cldev);
 	int ret;
 
 	component_master_del(&cldev->dev, &mei_component_master_ops);
diff --git a/include/drm/i915_mei_hdcp_interface.h b/include/drm/i915_hdcp_interface.h
similarity index 73%
rename from include/drm/i915_mei_hdcp_interface.h
rename to include/drm/i915_hdcp_interface.h
index f441cbcd95a4..75c75f52ab1b 100644
--- a/include/drm/i915_mei_hdcp_interface.h
+++ b/include/drm/i915_hdcp_interface.h
@@ -6,15 +6,15 @@
  * Ramalingam C <ramalingam.c@intel.com>
  */
 
-#ifndef _I915_MEI_HDCP_INTERFACE_H_
-#define _I915_MEI_HDCP_INTERFACE_H_
+#ifndef _I915_HDCP_INTERFACE_H_
+#define _I915_HDCP_INTERFACE_H_
 
 #include <linux/mutex.h>
 #include <linux/device.h>
 #include <drm/display/drm_hdcp.h>
 
 /**
- * enum hdcp_port_type - HDCP port implementation type defined by ME FW
+ * enum hdcp_port_type - HDCP port implementation type defined by ME/GSC FW
  * @HDCP_PORT_TYPE_INVALID: Invalid hdcp port type
  * @HDCP_PORT_TYPE_INTEGRATED: In-Host HDCP2.x port
  * @HDCP_PORT_TYPE_LSPCON: HDCP2.2 discrete wired Tx port with LSPCON
@@ -41,46 +41,46 @@ enum hdcp_wired_protocol {
 	HDCP_PROTOCOL_DP
 };
 
-enum mei_fw_ddi {
-	MEI_DDI_INVALID_PORT = 0x0,
+enum hdcp_ddi {
+	HDCP_DDI_INVALID_PORT = 0x0,
 
-	MEI_DDI_B = 1,
-	MEI_DDI_C,
-	MEI_DDI_D,
-	MEI_DDI_E,
-	MEI_DDI_F,
-	MEI_DDI_A = 7,
-	MEI_DDI_RANGE_END = MEI_DDI_A,
+	HDCP_DDI_B = 1,
+	HDCP_DDI_C,
+	HDCP_DDI_D,
+	HDCP_DDI_E,
+	HDCP_DDI_F,
+	HDCP_DDI_A = 7,
+	HDCP_DDI_RANGE_END = HDCP_DDI_A,
 };
 
 /**
- * enum mei_fw_tc - ME Firmware defined index for transcoders
- * @MEI_INVALID_TRANSCODER: Index for Invalid transcoder
- * @MEI_TRANSCODER_EDP: Index for EDP Transcoder
- * @MEI_TRANSCODER_DSI0: Index for DSI0 Transcoder
- * @MEI_TRANSCODER_DSI1: Index for DSI1 Transcoder
- * @MEI_TRANSCODER_A: Index for Transcoder A
- * @MEI_TRANSCODER_B: Index for Transcoder B
- * @MEI_TRANSCODER_C: Index for Transcoder C
- * @MEI_TRANSCODER_D: Index for Transcoder D
+ * enum hdcp_tc - ME/GSC Firmware defined index for transcoders
+ * @HDCP_INVALID_TRANSCODER: Index for Invalid transcoder
+ * @HDCP_TRANSCODER_EDP: Index for EDP Transcoder
+ * @HDCP_TRANSCODER_DSI0: Index for DSI0 Transcoder
+ * @HDCP_TRANSCODER_DSI1: Index for DSI1 Transcoder
+ * @HDCP_TRANSCODER_A: Index for Transcoder A
+ * @HDCP_TRANSCODER_B: Index for Transcoder B
+ * @HDCP_TRANSCODER_C: Index for Transcoder C
+ * @HDCP_TRANSCODER_D: Index for Transcoder D
  */
-enum mei_fw_tc {
-	MEI_INVALID_TRANSCODER = 0x00,
-	MEI_TRANSCODER_EDP,
-	MEI_TRANSCODER_DSI0,
-	MEI_TRANSCODER_DSI1,
-	MEI_TRANSCODER_A = 0x10,
-	MEI_TRANSCODER_B,
-	MEI_TRANSCODER_C,
-	MEI_TRANSCODER_D
+enum hdcp_transcoder {
+	HDCP_INVALID_TRANSCODER = 0x00,
+	HDCP_TRANSCODER_EDP,
+	HDCP_TRANSCODER_DSI0,
+	HDCP_TRANSCODER_DSI1,
+	HDCP_TRANSCODER_A = 0x10,
+	HDCP_TRANSCODER_B,
+	HDCP_TRANSCODER_C,
+	HDCP_TRANSCODER_D
 };
 
 /**
  * struct hdcp_port_data - intel specific HDCP port data
- * @fw_ddi: ddi index as per ME FW
- * @fw_tc: transcoder index as per ME FW
- * @port_type: HDCP port type as per ME FW classification
- * @protocol: HDCP adaptation as per ME FW
+ * @hdcp_ddi: ddi index as per ME/GSC FW
+ * @hdcp_transcoder: transcoder index as per ME/GSC FW
+ * @port_type: HDCP port type as per ME/GSC FW classification
+ * @protocol: HDCP adaptation as per ME/GSC FW
  * @k: No of streams transmitted on a port. Only on DP MST this is != 1
  * @seq_num_m: Count of RepeaterAuth_Stream_Manage msg propagated.
  *	       Initialized to 0 on AKE_INIT. Incremented after every successful
@@ -90,8 +90,8 @@ enum mei_fw_tc {
  *	     streams
  */
 struct hdcp_port_data {
-	enum mei_fw_ddi fw_ddi;
-	enum mei_fw_tc fw_tc;
+	enum hdcp_ddi hdcp_ddi;
+	enum hdcp_transcoder hdcp_transcoder;
 	u8 port_type;
 	u8 protocol;
 	u16 k;
@@ -100,7 +100,7 @@ struct hdcp_port_data {
 };
 
 /**
- * struct i915_hdcp_component_ops- ops for HDCP2.2 services.
+ * struct i915_hdcp_ops- ops for HDCP2.2 services.
  * @owner: Module providing the ops
  * @initiate_hdcp2_session: Initiate a Wired HDCP2.2 Tx Session.
  *			    And Prepare AKE_Init.
@@ -119,9 +119,9 @@ struct hdcp_port_data {
  * @close_hdcp_session: Close the Wired HDCP Tx session per port.
  *			This also disables the authenticated state of the port.
  */
-struct i915_hdcp_component_ops {
+struct i915_hdcp_ops {
 	/**
-	 * @owner: mei_hdcp module
+	 * @owner: hdcp module
 	 */
 	struct module *owner;
 
@@ -169,16 +169,16 @@ struct i915_hdcp_component_ops {
 
 /**
  * struct i915_hdcp_component_master - Used for communication between i915
- * and mei_hdcp drivers for the HDCP2.2 services
- * @mei_dev: device that provide the HDCP2.2 service from MEI Bus.
- * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
+ * and hdcp drivers for the HDCP2.2 services
+ * @hdcp_dev: device that provide the HDCP2.2 service from MEI Bus.
+ * @hdcp_ops: Ops implemented by hdcp driver or intel_hdcp_gsc , used by i915 driver.
  */
-struct i915_hdcp_comp_master {
-	struct device *mei_dev;
-	const struct i915_hdcp_component_ops *ops;
+struct i915_hdcp_master {
+	struct device *hdcp_dev;
+	const struct i915_hdcp_ops *ops;
 
 	/* To protect the above members. */
 	struct mutex mutex;
 };
 
-#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
+#endif /* _I915_HDCP_INTERFACE_H_ */
-- 
2.25.1


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

* [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention Suraj Kandpal
@ 2023-02-01  9:08 ` Suraj Kandpal
  2023-03-06 12:00   ` Shankar, Uma
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi, Tomas Winkler

As now we have more then one type of content protection
secrity firmware. Let change the i915_hdcp_interface.h
header naming convention to suit generic f/w type.
%s/MEI_/HDCP_
%s/mei_dev/hdcp_dev

As interface to CP FW can be either a non i915 component or
i915 intergral component, change structure name Accordingly.
%s/i915_hdcp_comp_master/i915_hdcp_master
%s/i915_hdcp_component_ops/i915_hdcp_ops

--v3
-Changing names to drop cp_fw to make naming more agnostic[Jani]

Cc: Tomas Winkler <tomas.winkler@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_core.h | 1 +
 drivers/gpu/drm/i915/display/intel_hdcp.c         | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 8e7a68339876..139100fe2383 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -15,6 +15,7 @@
 
 #include <drm/drm_connector.h>
 #include <drm/drm_modeset_lock.h>
+#include <drm/i915_hdcp_interface.h>
 
 #include "intel_cdclk.h"
 #include "intel_display_limits.h"
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
index 262c76f21801..0d6aed1eb171 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -1409,7 +1409,7 @@ static int hdcp2_authenticate_port(struct intel_connector *connector)
 	return ret;
 }
 
-static int hdcp2_close_mei_session(struct intel_connector *connector)
+static int hdcp2_close_session(struct intel_connector *connector)
 {
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1433,7 +1433,7 @@ static int hdcp2_close_mei_session(struct intel_connector *connector)
 
 static int hdcp2_deauthenticate_port(struct intel_connector *connector)
 {
-	return hdcp2_close_mei_session(connector);
+	return hdcp2_close_session(connector);
 }
 
 /* Authentication flow starts from here */
-- 
2.25.1


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

* [Intel-gfx] [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (2 preceding siblings ...)
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp Suraj Kandpal
@ 2023-02-01  9:08 ` Suraj Kandpal
  2023-03-06 12:01   ` Shankar, Uma
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS Suraj Kandpal
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi, Tomas Winkler

It requires to move intel specific HDCP API structures to
i915_hdcp_interface.h from driver/misc/mei/hdcp/mei_hdcp.h
so that any content protection fw interfaces can use these
structures.

Cc: Tomas Winkler <tomas.winkler@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/misc/mei/hdcp/mei_hdcp.c  |  44 ++--
 drivers/misc/mei/hdcp/mei_hdcp.h  | 354 -----------------------------
 include/drm/i915_hdcp_interface.h | 355 ++++++++++++++++++++++++++++++
 3 files changed, 377 insertions(+), 376 deletions(-)

diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index b2c49599809c..a262e1fa3b48 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -52,7 +52,7 @@ mei_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
 
 	session_init_in.header.api_version = HDCP_API_VERSION;
 	session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
-	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	session_init_in.header.buffer_len =
 				WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
 
@@ -75,7 +75,7 @@ mei_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
 		return byte;
 	}
 
-	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
 			WIRED_INITIATE_HDCP2_SESSION,
 			session_init_out.header.status);
@@ -122,7 +122,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
 
 	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
 	verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT;
-	verify_rxcert_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	verify_rxcert_in.header.buffer_len =
 				WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
 
@@ -148,7 +148,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
 		return byte;
 	}
 
-	if (verify_rxcert_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
 			WIRED_VERIFY_RECEIVER_CERT,
 			verify_rxcert_out.header.status);
@@ -194,7 +194,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
 
 	send_hprime_in.header.api_version = HDCP_API_VERSION;
 	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
-	send_hprime_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	send_hprime_in.header.buffer_len = WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
 
 	send_hprime_in.port.integrated_port_type = data->port_type;
@@ -218,7 +218,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
 		return byte;
 	}
 
-	if (send_hprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
 			WIRED_AKE_SEND_HPRIME, send_hprime_out.header.status);
 		return -EIO;
@@ -251,7 +251,7 @@ mei_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
 
 	pairing_info_in.header.api_version = HDCP_API_VERSION;
 	pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
-	pairing_info_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	pairing_info_in.header.buffer_len =
 					WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
 
@@ -276,7 +276,7 @@ mei_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
 		return byte;
 	}
 
-	if (pairing_info_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X failed. Status: 0x%X\n",
 			WIRED_AKE_SEND_PAIRING_INFO,
 			pairing_info_out.header.status);
@@ -311,7 +311,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
 
 	lc_init_in.header.api_version = HDCP_API_VERSION;
 	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
-	lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	lc_init_in.header.buffer_len = WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
 
 	lc_init_in.port.integrated_port_type = data->port_type;
@@ -330,7 +330,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
 		return byte;
 	}
 
-	if (lc_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X Failed. status: 0x%X\n",
 			WIRED_INIT_LOCALITY_CHECK, lc_init_out.header.status);
 		return -EIO;
@@ -366,7 +366,7 @@ mei_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
 
 	verify_lprime_in.header.api_version = HDCP_API_VERSION;
 	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
-	verify_lprime_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	verify_lprime_in.header.buffer_len =
 					WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
 
@@ -391,7 +391,7 @@ mei_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
 		return byte;
 	}
 
-	if (verify_lprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
 			WIRED_VALIDATE_LOCALITY,
 			verify_lprime_out.header.status);
@@ -425,7 +425,7 @@ static int mei_hdcp_get_session_key(struct device *dev,
 
 	get_skey_in.header.api_version = HDCP_API_VERSION;
 	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
-	get_skey_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	get_skey_in.header.buffer_len = WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
 
 	get_skey_in.port.integrated_port_type = data->port_type;
@@ -445,7 +445,7 @@ static int mei_hdcp_get_session_key(struct device *dev,
 		return byte;
 	}
 
-	if (get_skey_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
 			WIRED_GET_SESSION_KEY, get_skey_out.header.status);
 		return -EIO;
@@ -489,7 +489,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
 
 	verify_repeater_in.header.api_version = HDCP_API_VERSION;
 	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
-	verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	verify_repeater_in.header.buffer_len =
 					WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
 
@@ -520,7 +520,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
 		return byte;
 	}
 
-	if (verify_repeater_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (verify_repeater_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
 			WIRED_VERIFY_REPEATER,
 			verify_repeater_out.header.status);
@@ -568,7 +568,7 @@ static int mei_hdcp_verify_mprime(struct device *dev,
 
 	verify_mprime_in->header.api_version = HDCP_API_VERSION;
 	verify_mprime_in->header.command_id = WIRED_REPEATER_AUTH_STREAM_REQ;
-	verify_mprime_in->header.status = ME_HDCP_STATUS_SUCCESS;
+	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
 	verify_mprime_in->header.buffer_len = cmd_size  - sizeof(verify_mprime_in->header);
 
 	verify_mprime_in->port.integrated_port_type = data->port_type;
@@ -597,7 +597,7 @@ static int mei_hdcp_verify_mprime(struct device *dev,
 		return byte;
 	}
 
-	if (verify_mprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (verify_mprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
 			WIRED_REPEATER_AUTH_STREAM_REQ,
 			verify_mprime_out.header.status);
@@ -630,7 +630,7 @@ static int mei_hdcp_enable_authentication(struct device *dev,
 
 	enable_auth_in.header.api_version = HDCP_API_VERSION;
 	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
-	enable_auth_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	enable_auth_in.header.buffer_len = WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
 
 	enable_auth_in.port.integrated_port_type = data->port_type;
@@ -652,7 +652,7 @@ static int mei_hdcp_enable_authentication(struct device *dev,
 		return byte;
 	}
 
-	if (enable_auth_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
 			WIRED_ENABLE_AUTH, enable_auth_out.header.status);
 		return -EIO;
@@ -684,7 +684,7 @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
 
 	session_close_in.header.api_version = HDCP_API_VERSION;
 	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
-	session_close_in.header.status = ME_HDCP_STATUS_SUCCESS;
+	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
 	session_close_in.header.buffer_len =
 				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
 
@@ -706,7 +706,7 @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
 		return byte;
 	}
 
-	if (session_close_out.header.status != ME_HDCP_STATUS_SUCCESS) {
+	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS) {
 		dev_dbg(dev, "Session Close Failed. status: 0x%X\n",
 			session_close_out.header.status);
 		return -EIO;
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.h b/drivers/misc/mei/hdcp/mei_hdcp.h
index ca09c8f83d6b..0683d83ec17a 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.h
+++ b/drivers/misc/mei/hdcp/mei_hdcp.h
@@ -11,358 +11,4 @@
 
 #include <drm/display/drm_hdcp.h>
 
-/* me_hdcp_status: Enumeration of all HDCP Status Codes */
-enum me_hdcp_status {
-	ME_HDCP_STATUS_SUCCESS			= 0x0000,
-
-	/* WiDi Generic Status Codes */
-	ME_HDCP_STATUS_INTERNAL_ERROR		= 0x1000,
-	ME_HDCP_STATUS_UNKNOWN_ERROR		= 0x1001,
-	ME_HDCP_STATUS_INCORRECT_API_VERSION	= 0x1002,
-	ME_HDCP_STATUS_INVALID_FUNCTION		= 0x1003,
-	ME_HDCP_STATUS_INVALID_BUFFER_LENGTH	= 0x1004,
-	ME_HDCP_STATUS_INVALID_PARAMS		= 0x1005,
-	ME_HDCP_STATUS_AUTHENTICATION_FAILED	= 0x1006,
-
-	/* WiDi Status Codes */
-	ME_HDCP_INVALID_SESSION_STATE		= 0x6000,
-	ME_HDCP_SRM_FRAGMENT_UNEXPECTED		= 0x6001,
-	ME_HDCP_SRM_INVALID_LENGTH		= 0x6002,
-	ME_HDCP_SRM_FRAGMENT_OFFSET_INVALID	= 0x6003,
-	ME_HDCP_SRM_VERIFICATION_FAILED		= 0x6004,
-	ME_HDCP_SRM_VERSION_TOO_OLD		= 0x6005,
-	ME_HDCP_RX_CERT_VERIFICATION_FAILED	= 0x6006,
-	ME_HDCP_RX_REVOKED			= 0x6007,
-	ME_HDCP_H_VERIFICATION_FAILED		= 0x6008,
-	ME_HDCP_REPEATER_CHECK_UNEXPECTED	= 0x6009,
-	ME_HDCP_TOPOLOGY_MAX_EXCEEDED		= 0x600A,
-	ME_HDCP_V_VERIFICATION_FAILED		= 0x600B,
-	ME_HDCP_L_VERIFICATION_FAILED		= 0x600C,
-	ME_HDCP_STREAM_KEY_ALLOC_FAILED		= 0x600D,
-	ME_HDCP_BASE_KEY_RESET_FAILED		= 0x600E,
-	ME_HDCP_NONCE_GENERATION_FAILED		= 0x600F,
-	ME_HDCP_STATUS_INVALID_E_KEY_STATE	= 0x6010,
-	ME_HDCP_STATUS_INVALID_CS_ICV		= 0x6011,
-	ME_HDCP_STATUS_INVALID_KB_KEY_STATE	= 0x6012,
-	ME_HDCP_STATUS_INVALID_PAVP_MODE_ICV	= 0x6013,
-	ME_HDCP_STATUS_INVALID_PAVP_MODE	= 0x6014,
-	ME_HDCP_STATUS_LC_MAX_ATTEMPTS		= 0x6015,
-
-	/* New status for HDCP 2.1 */
-	ME_HDCP_STATUS_MISMATCH_IN_M		= 0x6016,
-
-	/* New status code for HDCP 2.2 Rx */
-	ME_HDCP_STATUS_RX_PROV_NOT_ALLOWED	= 0x6017,
-	ME_HDCP_STATUS_RX_PROV_WRONG_SUBJECT	= 0x6018,
-	ME_HDCP_RX_NEEDS_PROVISIONING		= 0x6019,
-	ME_HDCP_BKSV_ICV_AUTH_FAILED		= 0x6020,
-	ME_HDCP_STATUS_INVALID_STREAM_ID	= 0x6021,
-	ME_HDCP_STATUS_CHAIN_NOT_INITIALIZED	= 0x6022,
-	ME_HDCP_FAIL_NOT_EXPECTED		= 0x6023,
-	ME_HDCP_FAIL_HDCP_OFF			= 0x6024,
-	ME_HDCP_FAIL_INVALID_PAVP_MEMORY_MODE	= 0x6025,
-	ME_HDCP_FAIL_AES_ECB_FAILURE		= 0x6026,
-	ME_HDCP_FEATURE_NOT_SUPPORTED		= 0x6027,
-	ME_HDCP_DMA_READ_ERROR			= 0x6028,
-	ME_HDCP_DMA_WRITE_ERROR			= 0x6029,
-	ME_HDCP_FAIL_INVALID_PACKET_SIZE	= 0x6030,
-	ME_HDCP_H264_PARSING_ERROR		= 0x6031,
-	ME_HDCP_HDCP2_ERRATA_VIDEO_VIOLATION	= 0x6032,
-	ME_HDCP_HDCP2_ERRATA_AUDIO_VIOLATION	= 0x6033,
-	ME_HDCP_TX_ACTIVE_ERROR			= 0x6034,
-	ME_HDCP_MODE_CHANGE_ERROR		= 0x6035,
-	ME_HDCP_STREAM_TYPE_ERROR		= 0x6036,
-	ME_HDCP_STREAM_MANAGE_NOT_POSSIBLE	= 0x6037,
-
-	ME_HDCP_STATUS_PORT_INVALID_COMMAND	= 0x6038,
-	ME_HDCP_STATUS_UNSUPPORTED_PROTOCOL	= 0x6039,
-	ME_HDCP_STATUS_INVALID_PORT_INDEX	= 0x603a,
-	ME_HDCP_STATUS_TX_AUTH_NEEDED		= 0x603b,
-	ME_HDCP_STATUS_NOT_INTEGRATED_PORT	= 0x603c,
-	ME_HDCP_STATUS_SESSION_MAX_REACHED	= 0x603d,
-
-	/* hdcp capable bit is not set in rx_caps(error is unique to DP) */
-	ME_HDCP_STATUS_NOT_HDCP_CAPABLE		= 0x6041,
-
-	ME_HDCP_STATUS_INVALID_STREAM_COUNT	= 0x6042,
-};
-
-#define HDCP_API_VERSION				0x00010000
-
-#define HDCP_M_LEN					16
-#define HDCP_KH_LEN					16
-
-/* Payload Buffer size(Excluding Header) for CMDs and corresponding response */
-/* Wired_Tx_AKE  */
-#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN	(4 + 1)
-#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_OUT	(4 + 8 + 3)
-
-#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN	(4 + 522 + 8 + 3)
-#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MIN_OUT	(4 + 1 + 3 + 16 + 16)
-#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MAX_OUT	(4 + 1 + 3 + 128)
-
-#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN		(4 + 32)
-#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_OUT		(4)
-
-#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN		(4 + 16)
-#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_OUT		(4)
-
-#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN		(4)
-#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_OUT		(4)
-
-/* Wired_Tx_LC */
-#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN	(4)
-#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_OUT	(4 + 8)
-
-#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN		(4 + 32)
-#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_OUT		(4)
-
-/* Wired_Tx_SKE */
-#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN		(4)
-#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_OUT		(4 + 16 + 8)
-
-/* Wired_Tx_SKE */
-#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN		(4 + 1)
-#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_OUT		(4)
-
-/* Wired_Tx_Repeater */
-#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN		(4 + 2 + 3 + 16 + 155)
-#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_OUT		(4 + 1 + 16)
-
-#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_MIN_IN	(4 + 3 + \
-								32 + 2 + 2)
-
-#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_OUT		(4)
-
-/* hdcp_command_id: Enumeration of all WIRED HDCP Command IDs */
-enum hdcp_command_id {
-	_WIDI_COMMAND_BASE		= 0x00030000,
-	WIDI_INITIATE_HDCP2_SESSION	= _WIDI_COMMAND_BASE,
-	HDCP_GET_SRM_STATUS,
-	HDCP_SEND_SRM_FRAGMENT,
-
-	/* The wired HDCP Tx commands */
-	_WIRED_COMMAND_BASE		= 0x00031000,
-	WIRED_INITIATE_HDCP2_SESSION	= _WIRED_COMMAND_BASE,
-	WIRED_VERIFY_RECEIVER_CERT,
-	WIRED_AKE_SEND_HPRIME,
-	WIRED_AKE_SEND_PAIRING_INFO,
-	WIRED_INIT_LOCALITY_CHECK,
-	WIRED_VALIDATE_LOCALITY,
-	WIRED_GET_SESSION_KEY,
-	WIRED_ENABLE_AUTH,
-	WIRED_VERIFY_REPEATER,
-	WIRED_REPEATER_AUTH_STREAM_REQ,
-	WIRED_CLOSE_SESSION,
-
-	_WIRED_COMMANDS_COUNT,
-};
-
-union encrypted_buff {
-	u8		e_kpub_km[HDCP_2_2_E_KPUB_KM_LEN];
-	u8		e_kh_km_m[HDCP_2_2_E_KH_KM_M_LEN];
-	struct {
-		u8	e_kh_km[HDCP_KH_LEN];
-		u8	m[HDCP_M_LEN];
-	} __packed;
-};
-
-/* HDCP HECI message header. All header values are little endian. */
-struct hdcp_cmd_header {
-	u32			api_version;
-	u32			command_id;
-	enum me_hdcp_status	status;
-	/* Length of the HECI message (excluding the header) */
-	u32			buffer_len;
-} __packed;
-
-/* Empty command request or response. No data follows the header. */
-struct hdcp_cmd_no_data {
-	struct hdcp_cmd_header header;
-} __packed;
-
-/* Uniquely identifies the hdcp port being addressed for a given command. */
-struct hdcp_port_id {
-	u8	integrated_port_type;
-	/* physical_port is used until Gen11.5. Must be zero for Gen11.5+ */
-	u8	physical_port;
-	/* attached_transcoder is for Gen11.5+. Set to zero for <Gen11.5 */
-	u8	attached_transcoder;
-	u8	reserved;
-} __packed;
-
-/*
- * Data structures for integrated wired HDCP2 Tx in
- * support of the AKE protocol
- */
-/* HECI struct for integrated wired HDCP Tx session initiation. */
-struct wired_cmd_initiate_hdcp2_session_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			protocol; /* for HDMI vs DP */
-} __packed;
-
-struct wired_cmd_initiate_hdcp2_session_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			r_tx[HDCP_2_2_RTX_LEN];
-	struct hdcp2_tx_caps	tx_caps;
-} __packed;
-
-/* HECI struct for ending an integrated wired HDCP Tx session. */
-struct wired_cmd_close_session_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-struct wired_cmd_close_session_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-/* HECI struct for integrated wired HDCP Tx Rx Cert verification. */
-struct wired_cmd_verify_receiver_cert_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	struct hdcp2_cert_rx	cert_rx;
-	u8			r_rx[HDCP_2_2_RRX_LEN];
-	u8			rx_caps[HDCP_2_2_RXCAPS_LEN];
-} __packed;
-
-struct wired_cmd_verify_receiver_cert_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			km_stored;
-	u8			reserved[3];
-	union encrypted_buff	ekm_buff;
-} __packed;
-
-/* HECI struct for verification of Rx's Hprime in a HDCP Tx session */
-struct wired_cmd_ake_send_hprime_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			h_prime[HDCP_2_2_H_PRIME_LEN];
-} __packed;
-
-struct wired_cmd_ake_send_hprime_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-/*
- * HECI struct for sending in AKE pairing data generated by the Rx in an
- * integrated wired HDCP Tx session.
- */
-struct wired_cmd_ake_send_pairing_info_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			e_kh_km[HDCP_2_2_E_KH_KM_LEN];
-} __packed;
-
-struct wired_cmd_ake_send_pairing_info_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-/* Data structures for integrated wired HDCP2 Tx in support of the LC protocol*/
-/*
- * HECI struct for initiating locality check with an
- * integrated wired HDCP Tx session.
- */
-struct wired_cmd_init_locality_check_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-struct wired_cmd_init_locality_check_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			r_n[HDCP_2_2_RN_LEN];
-} __packed;
-
-/*
- * HECI struct for validating an Rx's LPrime value in an
- * integrated wired HDCP Tx session.
- */
-struct wired_cmd_validate_locality_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			l_prime[HDCP_2_2_L_PRIME_LEN];
-} __packed;
-
-struct wired_cmd_validate_locality_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-/*
- * Data structures for integrated wired HDCP2 Tx in support of the
- * SKE protocol
- */
-/* HECI struct for creating session key */
-struct wired_cmd_get_session_key_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-struct wired_cmd_get_session_key_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			e_dkey_ks[HDCP_2_2_E_DKEY_KS_LEN];
-	u8			r_iv[HDCP_2_2_RIV_LEN];
-} __packed;
-
-/* HECI struct for the Tx enable authentication command */
-struct wired_cmd_enable_auth_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			stream_type;
-} __packed;
-
-struct wired_cmd_enable_auth_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
-
-/*
- * Data structures for integrated wired HDCP2 Tx in support of
- * the repeater protocols
- */
-/*
- * HECI struct for verifying the downstream repeater's HDCP topology in an
- * integrated wired HDCP Tx session.
- */
-struct wired_cmd_verify_repeater_in {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			rx_info[HDCP_2_2_RXINFO_LEN];
-	u8			seq_num_v[HDCP_2_2_SEQ_NUM_LEN];
-	u8			v_prime[HDCP_2_2_V_PRIME_HALF_LEN];
-	u8			receiver_ids[HDCP_2_2_RECEIVER_IDS_MAX_LEN];
-} __packed;
-
-struct wired_cmd_verify_repeater_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-	u8			content_type_supported;
-	u8			v[HDCP_2_2_V_PRIME_HALF_LEN];
-} __packed;
-
-/*
- * HECI struct in support of stream management in an
- * integrated wired HDCP Tx session.
- */
-struct wired_cmd_repeater_auth_stream_req_in {
-	struct hdcp_cmd_header		header;
-	struct hdcp_port_id		port;
-	u8				seq_num_m[HDCP_2_2_SEQ_NUM_LEN];
-	u8				m_prime[HDCP_2_2_MPRIME_LEN];
-	__be16				k;
-	struct hdcp2_streamid_type	streams[];
-} __packed;
-
-struct wired_cmd_repeater_auth_stream_req_out {
-	struct hdcp_cmd_header	header;
-	struct hdcp_port_id	port;
-} __packed;
 #endif /* __MEI_HDCP_H__ */
diff --git a/include/drm/i915_hdcp_interface.h b/include/drm/i915_hdcp_interface.h
index 75c75f52ab1b..004412040909 100644
--- a/include/drm/i915_hdcp_interface.h
+++ b/include/drm/i915_hdcp_interface.h
@@ -181,4 +181,359 @@ struct i915_hdcp_master {
 	struct mutex mutex;
 };
 
+/* fw_hdcp_status: Enumeration of all HDCP Status Codes */
+enum fw_hdcp_status {
+	FW_HDCP_STATUS_SUCCESS			= 0x0000,
+
+	/* WiDi Generic Status Codes */
+	FW_HDCP_STATUS_INTERNAL_ERROR		= 0x1000,
+	FW_HDCP_STATUS_UNKNOWN_ERROR		= 0x1001,
+	FW_HDCP_STATUS_INCORRECT_API_VERSION	= 0x1002,
+	FW_HDCP_STATUS_INVALID_FUNCTION		= 0x1003,
+	FW_HDCP_STATUS_INVALID_BUFFER_LENGTH	= 0x1004,
+	FW_HDCP_STATUS_INVALID_PARAMS		= 0x1005,
+	FW_HDCP_STATUS_AUTHENTICATION_FAILED	= 0x1006,
+
+	/* WiDi Status Codes */
+	FW_HDCP_INVALID_SESSION_STATE		= 0x6000,
+	FW_HDCP_SRM_FRAGMENT_UNEXPECTED		= 0x6001,
+	FW_HDCP_SRM_INVALID_LENGTH		= 0x6002,
+	FW_HDCP_SRM_FRAGMENT_OFFSET_INVALID	= 0x6003,
+	FW_HDCP_SRM_VERIFICATION_FAILED		= 0x6004,
+	FW_HDCP_SRM_VERSION_TOO_OLD		= 0x6005,
+	FW_HDCP_RX_CERT_VERIFICATION_FAILED	= 0x6006,
+	FW_HDCP_RX_REVOKED			= 0x6007,
+	FW_HDCP_H_VERIFICATION_FAILED		= 0x6008,
+	FW_HDCP_REPEATER_CHECK_UNEXPECTED	= 0x6009,
+	FW_HDCP_TOPOLOGY_MAX_EXCEEDED		= 0x600A,
+	FW_HDCP_V_VERIFICATION_FAILED		= 0x600B,
+	FW_HDCP_L_VERIFICATION_FAILED		= 0x600C,
+	FW_HDCP_STREAM_KEY_ALLOC_FAILED		= 0x600D,
+	FW_HDCP_BASE_KEY_RESET_FAILED		= 0x600E,
+	FW_HDCP_NONCE_GENERATION_FAILED		= 0x600F,
+	FW_HDCP_STATUS_INVALID_E_KEY_STATE	= 0x6010,
+	FW_HDCP_STATUS_INVALID_CS_ICV		= 0x6011,
+	FW_HDCP_STATUS_INVALID_KB_KEY_STATE	= 0x6012,
+	FW_HDCP_STATUS_INVALID_PAVP_MODE_ICV	= 0x6013,
+	FW_HDCP_STATUS_INVALID_PAVP_MODE	= 0x6014,
+	FW_HDCP_STATUS_LC_MAX_ATTEMPTS		= 0x6015,
+
+	/* New status for HDCP 2.1 */
+	FW_HDCP_STATUS_MISMATCH_IN_M		= 0x6016,
+
+	/* New status code for HDCP 2.2 Rx */
+	FW_HDCP_STATUS_RX_PROV_NOT_ALLOWED	= 0x6017,
+	FW_HDCP_STATUS_RX_PROV_WRONG_SUBJECT	= 0x6018,
+	FW_HDCP_RX_NEEDS_PROVISIONING		= 0x6019,
+	FW_HDCP_BKSV_ICV_AUTH_FAILED		= 0x6020,
+	FW_HDCP_STATUS_INVALID_STREAM_ID	= 0x6021,
+	FW_HDCP_STATUS_CHAIN_NOT_INITIALIZED	= 0x6022,
+	FW_HDCP_FAIL_NOT_EXPECTED		= 0x6023,
+	FW_HDCP_FAIL_HDCP_OFF			= 0x6024,
+	FW_HDCP_FAIL_INVALID_PAVP_MEMORY_MODE	= 0x6025,
+	FW_HDCP_FAIL_AES_ECB_FAILURE		= 0x6026,
+	FW_HDCP_FEATURE_NOT_SUPPORTED		= 0x6027,
+	FW_HDCP_DMA_READ_ERROR			= 0x6028,
+	FW_HDCP_DMA_WRITE_ERROR			= 0x6029,
+	FW_HDCP_FAIL_INVALID_PACKET_SIZE	= 0x6030,
+	FW_HDCP_H264_PARSING_ERROR		= 0x6031,
+	FW_HDCP_HDCP2_ERRATA_VIDEO_VIOLATION	= 0x6032,
+	FW_HDCP_HDCP2_ERRATA_AUDIO_VIOLATION	= 0x6033,
+	FW_HDCP_TX_ACTIVE_ERROR			= 0x6034,
+	FW_HDCP_MODE_CHANGE_ERROR		= 0x6035,
+	FW_HDCP_STREAM_TYPE_ERROR		= 0x6036,
+	FW_HDCP_STREAM_MANAGE_NOT_POSSIBLE	= 0x6037,
+
+	FW_HDCP_STATUS_PORT_INVALID_COMMAND	= 0x6038,
+	FW_HDCP_STATUS_UNSUPPORTED_PROTOCOL	= 0x6039,
+	FW_HDCP_STATUS_INVALID_PORT_INDEX	= 0x603a,
+	FW_HDCP_STATUS_TX_AUTH_NEEDED		= 0x603b,
+	FW_HDCP_STATUS_NOT_INTEGRATED_PORT	= 0x603c,
+	FW_HDCP_STATUS_SESSION_MAX_REACHED	= 0x603d,
+
+	/* hdcp capable bit is not set in rx_caps(error is unique to DP) */
+	FW_HDCP_STATUS_NOT_HDCP_CAPABLE		= 0x6041,
+
+	FW_HDCP_STATUS_INVALID_STREAM_COUNT	= 0x6042,
+};
+
+#define HDCP_API_VERSION				0x00010000
+
+#define HDCP_M_LEN					16
+#define HDCP_KH_LEN					16
+
+/* Payload Buffer size(Excluding Header) for CMDs and corresponding response */
+/* Wired_Tx_AKE  */
+#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN	(4 + 1)
+#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_OUT	(4 + 8 + 3)
+
+#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN	(4 + 522 + 8 + 3)
+#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MIN_OUT	(4 + 1 + 3 + 16 + 16)
+#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MAX_OUT	(4 + 1 + 3 + 128)
+
+#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN		(4 + 32)
+#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_OUT		(4)
+
+#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN		(4 + 16)
+#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_OUT		(4)
+
+#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN		(4)
+#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_OUT		(4)
+
+/* Wired_Tx_LC */
+#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN	(4)
+#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_OUT	(4 + 8)
+
+#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN		(4 + 32)
+#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_OUT		(4)
+
+/* Wired_Tx_SKE */
+#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN		(4)
+#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_OUT		(4 + 16 + 8)
+
+/* Wired_Tx_SKE */
+#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN		(4 + 1)
+#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_OUT		(4)
+
+/* Wired_Tx_Repeater */
+#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN		(4 + 2 + 3 + 16 + 155)
+#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_OUT		(4 + 1 + 16)
+
+#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_MIN_IN	(4 + 3 + \
+								32 + 2 + 2)
+
+#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_OUT		(4)
+
+/* hdcp_command_id: Enumeration of all WIRED HDCP Command IDs */
+enum hdcp_command_id {
+	_WIDI_COMMAND_BASE		= 0x00030000,
+	WIDI_INITIATE_HDCP2_SESSION	= _WIDI_COMMAND_BASE,
+	HDCP_GET_SRM_STATUS,
+	HDCP_SEND_SRM_FRAGMENT,
+
+	/* The wired HDCP Tx commands */
+	_WIRED_COMMAND_BASE		= 0x00031000,
+	WIRED_INITIATE_HDCP2_SESSION	= _WIRED_COMMAND_BASE,
+	WIRED_VERIFY_RECEIVER_CERT,
+	WIRED_AKE_SEND_HPRIME,
+	WIRED_AKE_SEND_PAIRING_INFO,
+	WIRED_INIT_LOCALITY_CHECK,
+	WIRED_VALIDATE_LOCALITY,
+	WIRED_GET_SESSION_KEY,
+	WIRED_ENABLE_AUTH,
+	WIRED_VERIFY_REPEATER,
+	WIRED_REPEATER_AUTH_STREAM_REQ,
+	WIRED_CLOSE_SESSION,
+
+	_WIRED_COMMANDS_COUNT,
+};
+
+union encrypted_buff {
+	u8		e_kpub_km[HDCP_2_2_E_KPUB_KM_LEN];
+	u8		e_kh_km_m[HDCP_2_2_E_KH_KM_M_LEN];
+	struct {
+		u8	e_kh_km[HDCP_KH_LEN];
+		u8	m[HDCP_M_LEN];
+	} __packed;
+};
+
+/* HDCP HECI message header. All header values are little endian. */
+struct hdcp_cmd_header {
+	u32			api_version;
+	u32			command_id;
+	enum fw_hdcp_status	status;
+	/* Length of the HECI message (excluding the header) */
+	u32			buffer_len;
+} __packed;
+
+/* Empty command request or response. No data follows the header. */
+struct hdcp_cmd_no_data {
+	struct hdcp_cmd_header header;
+} __packed;
+
+/* Uniquely identifies the hdcp port being addressed for a given command. */
+struct hdcp_port_id {
+	u8	integrated_port_type;
+	/* physical_port is used until Gen11.5. Must be zero for Gen11.5+ */
+	u8	physical_port;
+	/* attached_transcoder is for Gen11.5+. Set to zero for <Gen11.5 */
+	u8	attached_transcoder;
+	u8	reserved;
+} __packed;
+
+/*
+ * Data structures for integrated wired HDCP2 Tx in
+ * support of the AKE protocol
+ */
+/* HECI struct for integrated wired HDCP Tx session initiation. */
+struct wired_cmd_initiate_hdcp2_session_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			protocol; /* for HDMI vs DP */
+} __packed;
+
+struct wired_cmd_initiate_hdcp2_session_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			r_tx[HDCP_2_2_RTX_LEN];
+	struct hdcp2_tx_caps	tx_caps;
+} __packed;
+
+/* HECI struct for ending an integrated wired HDCP Tx session. */
+struct wired_cmd_close_session_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+struct wired_cmd_close_session_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/* HECI struct for integrated wired HDCP Tx Rx Cert verification. */
+struct wired_cmd_verify_receiver_cert_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	struct hdcp2_cert_rx	cert_rx;
+	u8			r_rx[HDCP_2_2_RRX_LEN];
+	u8			rx_caps[HDCP_2_2_RXCAPS_LEN];
+} __packed;
+
+struct wired_cmd_verify_receiver_cert_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			km_stored;
+	u8			reserved[3];
+	union encrypted_buff	ekm_buff;
+} __packed;
+
+/* HECI struct for verification of Rx's Hprime in a HDCP Tx session */
+struct wired_cmd_ake_send_hprime_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			h_prime[HDCP_2_2_H_PRIME_LEN];
+} __packed;
+
+struct wired_cmd_ake_send_hprime_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/*
+ * HECI struct for sending in AKE pairing data generated by the Rx in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_ake_send_pairing_info_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			e_kh_km[HDCP_2_2_E_KH_KM_LEN];
+} __packed;
+
+struct wired_cmd_ake_send_pairing_info_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/* Data structures for integrated wired HDCP2 Tx in support of the LC protocol*/
+/*
+ * HECI struct for initiating locality check with an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_init_locality_check_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+struct wired_cmd_init_locality_check_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			r_n[HDCP_2_2_RN_LEN];
+} __packed;
+
+/*
+ * HECI struct for validating an Rx's LPrime value in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_validate_locality_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			l_prime[HDCP_2_2_L_PRIME_LEN];
+} __packed;
+
+struct wired_cmd_validate_locality_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/*
+ * Data structures for integrated wired HDCP2 Tx in support of the
+ * SKE protocol
+ */
+/* HECI struct for creating session key */
+struct wired_cmd_get_session_key_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+struct wired_cmd_get_session_key_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			e_dkey_ks[HDCP_2_2_E_DKEY_KS_LEN];
+	u8			r_iv[HDCP_2_2_RIV_LEN];
+} __packed;
+
+/* HECI struct for the Tx enable authentication command */
+struct wired_cmd_enable_auth_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			stream_type;
+} __packed;
+
+struct wired_cmd_enable_auth_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
+/*
+ * Data structures for integrated wired HDCP2 Tx in support of
+ * the repeater protocols
+ */
+/*
+ * HECI struct for verifying the downstream repeater's HDCP topology in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_verify_repeater_in {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			rx_info[HDCP_2_2_RXINFO_LEN];
+	u8			seq_num_v[HDCP_2_2_SEQ_NUM_LEN];
+	u8			v_prime[HDCP_2_2_V_PRIME_HALF_LEN];
+	u8			receiver_ids[HDCP_2_2_RECEIVER_IDS_MAX_LEN];
+} __packed;
+
+struct wired_cmd_verify_repeater_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+	u8			content_type_supported;
+	u8			v[HDCP_2_2_V_PRIME_HALF_LEN];
+} __packed;
+
+/*
+ * HECI struct in support of stream management in an
+ * integrated wired HDCP Tx session.
+ */
+struct wired_cmd_repeater_auth_stream_req_in {
+	struct hdcp_cmd_header		header;
+	struct hdcp_port_id		port;
+	u8				seq_num_m[HDCP_2_2_SEQ_NUM_LEN];
+	u8				m_prime[HDCP_2_2_MPRIME_LEN];
+	__be16				k;
+	struct hdcp2_streamid_type	streams[];
+} __packed;
+
+struct wired_cmd_repeater_auth_stream_req_out {
+	struct hdcp_cmd_header	header;
+	struct hdcp_port_id	port;
+} __packed;
+
 #endif /* _I915_HDCP_INTERFACE_H_ */
-- 
2.25.1


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

* [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (3 preceding siblings ...)
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
@ 2023-02-01  9:08 ` Suraj Kandpal
  2023-03-06 12:32   ` Shankar, Uma
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx; +Cc: Alan Pervin Teres

Add function that takes care of sending command to gsc cs. We start
of with allocation of memory for our command intel_hdcp_gsc_message that
contains gsc cs memory header as directed in specs followed by the
actual payload hdcp message that we want to send.
Spec states that we need to poll pending bit of response header around
20 times each try being 50ms apart hence adding that to current
gsc_msg_send function
Also we use the same function to take care of both sending and receiving
hence no separate function to get the response.

--v4
-Create common function to fill in gsc_mtl_header [Alan]
-define host session bitmask [Alan]

--v5
-use i915 directly instead of gt->i915 [Alan]
-No need to make fields NULL as we are already
using kzalloc [Alan]

--v8
-change mechanism to reuse the same memory for one hdcp session[Alan]
-fix header ordering
-add comments to explain flags and host session mask [Alan]

--v9
-remove gem obj from hdcp message as we can use
i915_vma_unpin_and_release [Alan]
-move hdcp message allocation and deallocation from hdcp2_enable and
hdcp2_disable to init and teardown of HDCP [Alan]

--v10
-remove unnecessary i915_vma_unpin [Alan]

Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Alan Pervin Teres <alan.previn.teres.alexis@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Anshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
---
 drivers/gpu/drm/i915/Makefile                 |   1 +
 .../gpu/drm/i915/display/intel_display_core.h |   5 +
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 198 ++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  23 ++
 .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c |  15 ++
 .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h |  16 ++
 6 files changed, 258 insertions(+)
 create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
 create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 482928cffb1c..ba76bec715af 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -255,6 +255,7 @@ i915-y += \
 	display/intel_frontbuffer.o \
 	display/intel_global_state.o \
 	display/intel_hdcp.o \
+	display/intel_hdcp_gsc.o \
 	display/intel_hotplug.o \
 	display/intel_hti.o \
 	display/intel_lpe_audio.o \
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 139100fe2383..20d2a79a5d05 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -382,6 +382,11 @@ struct intel_display {
 		struct i915_hdcp_master *master;
 		bool comp_added;
 
+		/*HDCP message struct for allocation of memory which can be reused
+		 * when sending message to gsc cs
+		 * this is only populated post Meteorlake
+		 */
+		struct intel_hdcp_gsc_message *hdcp_message;
 		/* Mutex to protect the above hdcp component related values. */
 		struct mutex comp_mutex;
 	} hdcp;
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
new file mode 100644
index 000000000000..8e3b5e6733d7
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
@@ -0,0 +1,198 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2023, Intel Corporation.
+ */
+
+#include "display/intel_hdcp_gsc.h"
+#include "gem/i915_gem_region.h"
+#include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
+#include "i915_drv.h"
+#include "i915_utils.h"
+
+/*This function helps allocate memory for the command that we will send to gsc cs */
+static int intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
+					     struct intel_hdcp_gsc_message *hdcp_message)
+{
+	struct intel_gt *gt = i915->media_gt;
+	struct drm_i915_gem_object *obj = NULL;
+	struct i915_vma *vma = NULL;
+	void *cmd;
+	int err;
+
+	/* allocate object of one page for HDCP command memory and store it */
+	obj = i915_gem_object_create_shmem(i915, PAGE_SIZE);
+
+	if (IS_ERR(obj)) {
+		drm_err(&i915->drm, "Failed to allocate HDCP streaming command!\n");
+		return PTR_ERR(obj);
+	}
+
+	cmd = i915_gem_object_pin_map_unlocked(obj, i915_coherent_map_type(i915, obj, true));
+	if (IS_ERR(cmd)) {
+		drm_err(&i915->drm, "Failed to map gsc message page!\n");
+		err = PTR_ERR(cmd);
+		goto out_unpin;
+	}
+
+	vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
+	if (IS_ERR(vma)) {
+		err = PTR_ERR(vma);
+		goto out_unmap;
+	}
+
+	err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
+	if (err)
+		goto out_unmap;
+
+	memset(cmd, 0, obj->base.size);
+
+	hdcp_message->hdcp_cmd = cmd;
+	hdcp_message->vma = vma;
+
+	return 0;
+
+out_unmap:
+	i915_gem_object_unpin_map(obj);
+out_unpin:
+	i915_gem_object_put(obj);
+	return err;
+}
+
+int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
+{
+	struct intel_hdcp_gsc_message *hdcp_message;
+	int ret;
+
+	hdcp_message = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
+
+	if (!hdcp_message)
+		return -ENOMEM;
+
+	/* NOTE: No need to lock the comp mutex here as it is already
+	 * going to be taken before this function called
+	 */
+	i915->display.hdcp.hdcp_message = hdcp_message;
+	ret = intel_hdcp_gsc_initialize_message(i915, hdcp_message);
+
+	if (ret)
+		drm_err(&i915->drm, "Could not initialize hdcp_message\n");
+
+	return ret;
+}
+
+void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
+{
+	struct intel_hdcp_gsc_message *hdcp_message =
+					i915->display.hdcp.hdcp_message;
+
+	i915_vma_unpin_and_release(&hdcp_message->vma, I915_VMA_RELEASE_MAP);
+	kfree(hdcp_message);
+}
+
+static int intel_gsc_send_sync(struct drm_i915_private *i915,
+			       struct intel_gsc_mtl_header *header, u64 addr,
+			       size_t msg_out_len)
+{
+	struct intel_gt *gt = i915->media_gt;
+	int ret;
+
+	header->flags = 0;
+	ret = intel_gsc_uc_heci_cmd_submit_packet(&gt->uc.gsc, addr,
+						  header->message_size,
+						  addr,
+						  msg_out_len + sizeof(*header));
+	if (ret) {
+		drm_err(&i915->drm, "failed to send gsc HDCP msg (%d)\n", ret);
+		return ret;
+	}
+	/*
+	 * Checking validity marker for memory sanity
+	 */
+	if (header->validity_marker != GSC_HECI_VALIDITY_MARKER) {
+		drm_err(&i915->drm, "invalid validity marker\n");
+		return -EINVAL;
+	}
+
+	if (header->status != 0) {
+		drm_err(&i915->drm, "header status indicates error %d\n",
+			header->status);
+		return -EINVAL;
+	}
+
+	if (header->flags & GSC_OUTFLAG_MSG_PENDING)
+		return -EAGAIN;
+
+	return 0;
+}
+
+/*
+ * This function can now be used for sending requests and will also handle
+ * receipt of reply messages hence no different function of message retrieval
+ * is required. We will initialize intel_hdcp_gsc_message structure then add
+ * gsc cs memory header as stated in specs after which the normal HDCP payload
+ * will follow
+ */
+ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
+				size_t msg_in_len, u8 *msg_out, size_t msg_out_len)
+{
+	struct intel_gt *gt = i915->media_gt;
+	struct intel_gsc_mtl_header *header;
+	const size_t max_msg_size = PAGE_SIZE - sizeof(*header);
+	struct intel_hdcp_gsc_message *hdcp_message;
+	u64 addr, host_session_id;
+	u32 reply_size, msg_size;
+	int ret, tries = 0;
+
+	if (!intel_uc_uses_gsc_uc(&gt->uc))
+		return -ENODEV;
+
+	if (msg_in_len > max_msg_size || msg_out_len > max_msg_size)
+		return -ENOSPC;
+
+	hdcp_message = i915->display.hdcp.hdcp_message;
+	header = hdcp_message->hdcp_cmd;
+	addr = i915_ggtt_offset(hdcp_message->vma);
+
+	msg_size = msg_in_len + sizeof(*header);
+	memset(header, 0, msg_size);
+	get_random_bytes(&host_session_id, sizeof(u64));
+	intel_gsc_uc_heci_cmd_emit_mtl_header(header, HECI_MEADDRESS_HDCP,
+					      msg_size, host_session_id);
+	memcpy(hdcp_message->hdcp_cmd + sizeof(*header), msg_in, msg_in_len);
+
+	/*
+	 * Keep sending request in case the pending bit is set no need to add
+	 * message handle as we are using same address hence loc. of header is
+	 * same and it will contain the message handle. we will send the message
+	 * 20 times each message 50 ms apart
+	 */
+	do {
+		ret = intel_gsc_send_sync(i915, header, addr, msg_out_len);
+
+		/* Only try again if gsc says so */
+		if (ret != -EAGAIN)
+			break;
+
+		msleep(50);
+
+	} while (++tries < 20);
+
+	if (ret)
+		goto err;
+
+	/* we use the same mem for the reply, so header is in the same loc */
+	reply_size = header->message_size - sizeof(*header);
+	if (reply_size > msg_out_len) {
+		drm_warn(&i915->drm, "caller with insufficient HDCP reply size %u (%d)\n",
+			 reply_size, (u32)msg_out_len);
+		reply_size = msg_out_len;
+	} else if (reply_size != msg_out_len) {
+		drm_dbg_kms(&i915->drm, "caller unexpected HCDP reply size %u (%d)\n",
+			    reply_size, (u32)msg_out_len);
+	}
+
+	memcpy(msg_out, hdcp_message->hdcp_cmd + sizeof(*header), msg_out_len);
+
+err:
+	return ret;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
new file mode 100644
index 000000000000..09ffd7ec02cd
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef __INTEL_HDCP_GSC_H__
+#define __INTEL_HDCP_GSC_H__
+
+#include <linux/err.h>
+#include <linux/types.h>
+
+struct drm_i915_private;
+
+struct intel_hdcp_gsc_message {
+	struct i915_vma *vma;
+	void *hdcp_cmd;
+};
+
+ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
+				size_t msg_in_len, u8 *msg_out,
+				size_t msg_out_len);
+
+#endif /* __INTEL_HDCP_GCS_H__ */
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
index be2424af521d..ea0da06e2f39 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
@@ -92,3 +92,18 @@ int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc, u64 addr_in,
 
 	return err;
 }
+
+void intel_gsc_uc_heci_cmd_emit_mtl_header(struct intel_gsc_mtl_header *header,
+					   u8 heci_client_id, u32 message_size,
+					   u64 host_session_id)
+{
+	host_session_id &= ~HOST_SESSION_MASK;
+	if (heci_client_id == HECI_MEADDRESS_PXP)
+		host_session_id |= HOST_SESSION_PXP_SINGLE;
+
+	header->validity_marker = GSC_HECI_VALIDITY_MARKER;
+	header->heci_client_id = heci_client_id;
+	header->host_session_handle = host_session_id;
+	header->header_version = MTL_GSC_HEADER_VERSION;
+	header->message_size = message_size;
+}
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
index cf610dfca7a5..3d56ae501991 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
@@ -22,7 +22,17 @@ struct intel_gsc_mtl_header {
 	u16 header_version;
 #define MTL_GSC_HEADER_VERSION 1
 
+	/*
+	 * FW allows host to decide host_session handle
+	 * as it sees fit.
+	 * For intertracebility reserving select bits(60-63)
+	 * to differentiate caller-target subsystem
+	 * 0000 - HDCP
+	 * 0001 - PXP Single Session
+	 */
 	u64 host_session_handle;
+#define HOST_SESSION_MASK	REG_GENMASK64(63, 60)
+#define HOST_SESSION_PXP_SINGLE BIT_ULL(60)
 	u64 gsc_message_handle;
 
 	u32 message_size; /* lower 20 bits only, upper 12 are reserved */
@@ -33,8 +43,11 @@ struct intel_gsc_mtl_header {
 	 * Bit 1: Session Cleanup;
 	 * Bits 2-15: Flags
 	 * Bits 16-31: Extension Size
+	 * According to internal spec flags are either input or output
+	 * we distinguish the flags using OUTFLAG or INFLAG
 	 */
 	u32 flags;
+#define GSC_OUTFLAG_MSG_PENDING	1
 
 	u32 status;
 } __packed;
@@ -42,4 +55,7 @@ struct intel_gsc_mtl_header {
 int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc,
 					u64 addr_in, u32 size_in,
 					u64 addr_out, u32 size_out);
+void intel_gsc_uc_heci_cmd_emit_mtl_header(struct intel_gsc_mtl_header *header,
+					   u8 heci_client_id, u32 message_size,
+					   u64 host_session_id);
 #endif
-- 
2.25.1


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

* [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (4 preceding siblings ...)
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS Suraj Kandpal
@ 2023-02-01  9:08 ` Suraj Kandpal
  2023-03-06 12:34   ` Shankar, Uma
  2023-02-01  9:45 ` [Intel-gfx] ✓ Fi.CI.BAT: success for Enable HDCP2.x via GSC CS (rev10) Patchwork
  2023-02-01 10:51 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
  7 siblings, 1 reply; 27+ messages in thread
From: Suraj Kandpal @ 2023-02-01  9:08 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi, Tomas Winkler

MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP commands
to GSC f/w. It requires to keep hdcp display driver
agnostic to content protection f/w (ME/GSC fw) in the form of
i915_hdcp_fw_ops generic ops.

Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops generic
ops instead of I915_HDCP_COMPONENT as integral part of i915.

Adding checks to see if GSC is loaded and proxy is setup

--v6
-dont change the license date in same patch series [Jani]
-fix the license year {Jani]

--v8
-remove stale comment [Ankit]
-get headers in alphabetical order [Ankit]
-fix hdcp2_supported check [Ankit]

--v9
-remove return statement from hdcp_gsc_fini [Ankit]

Cc: Tomas Winkler <tomas.winkler@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637 +++++++++++++++++-
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
 3 files changed, 660 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
index 0d6aed1eb171..61bb2bbd0349 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -23,6 +23,7 @@
 #include "intel_display_power_well.h"
 #include "intel_display_types.h"
 #include "intel_hdcp.h"
+#include "intel_hdcp_gsc.h"
 #include "intel_hdcp_regs.h"
 #include "intel_pcode.h"
 
@@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
 	struct intel_hdcp *hdcp = &connector->hdcp;
+	struct intel_gt *gt = dev_priv->media_gt;
+	struct intel_gsc_uc *gsc = &gt->uc.gsc;
 	bool capable = false;
 
 	/* I915 support for HDCP2.2 */
 	if (!hdcp->hdcp2_supported)
 		return false;
 
-	/* MEI interface is solid */
+	/* If MTL+ make sure gsc is loaded and proxy is setup */
+	if (intel_hdcp_gsc_cs_required(dev_priv))
+		if (!intel_uc_fw_is_running(&gsc->fw))
+			return false;
+
+	/* MEI/GSC interface is solid depending on which is used */
 	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
 	if (!dev_priv->display.hdcp.comp_added ||  !dev_priv->display.hdcp.master) {
 		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
@@ -2235,6 +2243,9 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
 
 static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
 {
+	if (intel_hdcp_gsc_cs_required(dev_priv))
+		return true;
+
 	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
 		return false;
 
@@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct drm_i915_private *dev_priv)
 
 	dev_priv->display.hdcp.comp_added = true;
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
-	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
-				  I915_COMPONENT_HDCP);
+	if (intel_hdcp_gsc_cs_required(dev_priv))
+		ret = intel_hdcp_gsc_init(dev_priv);
+	else
+		ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
+					  I915_COMPONENT_HDCP);
+
 	if (ret < 0) {
-		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
+		drm_dbg_kms(&dev_priv->drm, "Failed at fw component add(%d)\n",
 			    ret);
 		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
 		dev_priv->display.hdcp.comp_added = false;
@@ -2486,7 +2501,10 @@ void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
 	dev_priv->display.hdcp.comp_added = false;
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
 
-	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
+	if (intel_hdcp_gsc_cs_required(dev_priv))
+		intel_hdcp_gsc_fini(dev_priv);
+	else
+		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
 }
 
 void intel_hdcp_cleanup(struct intel_connector *connector)
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
index 8e3b5e6733d7..7eb1eeeb5a51 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
@@ -3,12 +3,617 @@
  * Copyright 2023, Intel Corporation.
  */
 
+#include <drm/i915_hdcp_interface.h>
+
 #include "display/intel_hdcp_gsc.h"
 #include "gem/i915_gem_region.h"
 #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
 #include "i915_drv.h"
 #include "i915_utils.h"
 
+bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915)
+{
+	return DISPLAY_VER(i915) >= 14;
+}
+
+static int
+gsc_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
+			  struct hdcp2_ake_init *ake_data)
+{
+	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
+	struct wired_cmd_initiate_hdcp2_session_out
+						session_init_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !ake_data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	session_init_in.header.api_version = HDCP_API_VERSION;
+	session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
+	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	session_init_in.header.buffer_len =
+				WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
+
+	session_init_in.port.integrated_port_type = data->port_type;
+	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
+	session_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+	session_init_in.protocol = data->protocol;
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_init_in,
+				       sizeof(session_init_in),
+				       (u8 *)&session_init_out,
+				       sizeof(session_init_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status: 0x%X\n",
+			    WIRED_INITIATE_HDCP2_SESSION,
+			    session_init_out.header.status);
+		return -EIO;
+	}
+
+	ake_data->msg_id = HDCP_2_2_AKE_INIT;
+	ake_data->tx_caps = session_init_out.tx_caps;
+	memcpy(ake_data->r_tx, session_init_out.r_tx, HDCP_2_2_RTX_LEN);
+
+	return 0;
+}
+
+static int
+gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
+					 struct hdcp_port_data *data,
+					 struct hdcp2_ake_send_cert *rx_cert,
+					 bool *km_stored,
+					 struct hdcp2_ake_no_stored_km
+								*ek_pub_km,
+					 size_t *msg_sz)
+{
+	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
+	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km || !msg_sz)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
+	verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT;
+	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	verify_rxcert_in.header.buffer_len =
+				WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
+
+	verify_rxcert_in.port.integrated_port_type = data->port_type;
+	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
+	verify_rxcert_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
+	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
+	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps, HDCP_2_2_RXCAPS_LEN);
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_rxcert_in,
+				       sizeof(verify_rxcert_in),
+				       (u8 *)&verify_rxcert_out,
+				       sizeof(verify_rxcert_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed: %zd\n", byte);
+		return byte;
+	}
+
+	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status: 0x%X\n",
+			    WIRED_VERIFY_RECEIVER_CERT,
+			    verify_rxcert_out.header.status);
+		return -EIO;
+	}
+
+	*km_stored = !!verify_rxcert_out.km_stored;
+	if (verify_rxcert_out.km_stored) {
+		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
+		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
+	} else {
+		ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM;
+		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
+	}
+
+	memcpy(ek_pub_km->e_kpub_km, &verify_rxcert_out.ekm_buff,
+	       sizeof(verify_rxcert_out.ekm_buff));
+
+	return 0;
+}
+
+static int
+gsc_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
+		       struct hdcp2_ake_send_hprime *rx_hprime)
+{
+	struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
+	struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !rx_hprime)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	send_hprime_in.header.api_version = HDCP_API_VERSION;
+	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
+	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	send_hprime_in.header.buffer_len = WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
+
+	send_hprime_in.port.integrated_port_type = data->port_type;
+	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
+	send_hprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
+	       HDCP_2_2_H_PRIME_LEN);
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&send_hprime_in,
+				       sizeof(send_hprime_in),
+				       (u8 *)&send_hprime_out,
+				       sizeof(send_hprime_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status: 0x%X\n",
+			    WIRED_AKE_SEND_HPRIME, send_hprime_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int
+gsc_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
+			    struct hdcp2_ake_send_pairing_info *pairing_info)
+{
+	struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 } };
+	struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !pairing_info)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	pairing_info_in.header.api_version = HDCP_API_VERSION;
+	pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
+	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	pairing_info_in.header.buffer_len =
+					WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
+
+	pairing_info_in.port.integrated_port_type = data->port_type;
+	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
+	pairing_info_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
+	       HDCP_2_2_E_KH_KM_LEN);
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&pairing_info_in,
+				       sizeof(pairing_info_in),
+				       (u8 *)&pairing_info_out,
+				       sizeof(pairing_info_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. Status: 0x%X\n",
+			    WIRED_AKE_SEND_PAIRING_INFO,
+			    pairing_info_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int
+gsc_hdcp_initiate_locality_check(struct device *dev,
+				 struct hdcp_port_data *data,
+				 struct hdcp2_lc_init *lc_init_data)
+{
+	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
+	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !lc_init_data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	lc_init_in.header.api_version = HDCP_API_VERSION;
+	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
+	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	lc_init_in.header.buffer_len = WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
+
+	lc_init_in.port.integrated_port_type = data->port_type;
+	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
+	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in, sizeof(lc_init_in),
+				       (u8 *)&lc_init_out, sizeof(lc_init_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. status: 0x%X\n",
+			    WIRED_INIT_LOCALITY_CHECK, lc_init_out.header.status);
+		return -EIO;
+	}
+
+	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
+	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
+
+	return 0;
+}
+
+static int
+gsc_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
+		       struct hdcp2_lc_send_lprime *rx_lprime)
+{
+	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
+	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !rx_lprime)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	verify_lprime_in.header.api_version = HDCP_API_VERSION;
+	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
+	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	verify_lprime_in.header.buffer_len =
+					WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
+
+	verify_lprime_in.port.integrated_port_type = data->port_type;
+	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
+	verify_lprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
+	       HDCP_2_2_L_PRIME_LEN);
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_lprime_in,
+				       sizeof(verify_lprime_in),
+				       (u8 *)&verify_lprime_out,
+				       sizeof(verify_lprime_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status: 0x%X\n",
+			    WIRED_VALIDATE_LOCALITY,
+			    verify_lprime_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int gsc_hdcp_get_session_key(struct device *dev,
+				    struct hdcp_port_data *data,
+				    struct hdcp2_ske_send_eks *ske_data)
+{
+	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
+	struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data || !ske_data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	get_skey_in.header.api_version = HDCP_API_VERSION;
+	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
+	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	get_skey_in.header.buffer_len = WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
+
+	get_skey_in.port.integrated_port_type = data->port_type;
+	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
+	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in, sizeof(get_skey_in),
+				       (u8 *)&get_skey_out, sizeof(get_skey_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status: 0x%X\n",
+			    WIRED_GET_SESSION_KEY, get_skey_out.header.status);
+		return -EIO;
+	}
+
+	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
+	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
+	       HDCP_2_2_E_DKEY_KS_LEN);
+	memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN);
+
+	return 0;
+}
+
+static int
+gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
+					 struct hdcp_port_data *data,
+					 struct hdcp2_rep_send_receiverid_list
+							*rep_topology,
+					 struct hdcp2_rep_send_ack
+							*rep_send_ack)
+{
+	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
+	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !rep_topology || !rep_send_ack || !data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	verify_repeater_in.header.api_version = HDCP_API_VERSION;
+	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
+	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	verify_repeater_in.header.buffer_len =
+					WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
+
+	verify_repeater_in.port.integrated_port_type = data->port_type;
+	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
+	verify_repeater_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
+	       HDCP_2_2_RXINFO_LEN);
+	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,
+	       HDCP_2_2_SEQ_NUM_LEN);
+	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
+	       HDCP_2_2_V_PRIME_HALF_LEN);
+	memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids,
+	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_repeater_in,
+				       sizeof(verify_repeater_in),
+				       (u8 *)&verify_repeater_out,
+				       sizeof(verify_repeater_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (verify_repeater_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status: 0x%X\n",
+			    WIRED_VERIFY_REPEATER,
+			    verify_repeater_out.header.status);
+		return -EIO;
+	}
+
+	memcpy(rep_send_ack->v, verify_repeater_out.v,
+	       HDCP_2_2_V_PRIME_HALF_LEN);
+	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
+
+	return 0;
+}
+
+static int gsc_hdcp_verify_mprime(struct device *dev,
+				  struct hdcp_port_data *data,
+				  struct hdcp2_rep_stream_ready *stream_ready)
+{
+	struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
+	struct wired_cmd_repeater_auth_stream_req_out
+					verify_mprime_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+	size_t cmd_size;
+
+	if (!dev || !stream_ready || !data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	cmd_size = struct_size(verify_mprime_in, streams, data->k);
+	if (cmd_size == SIZE_MAX)
+		return -EINVAL;
+
+	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
+	if (!verify_mprime_in)
+		return -ENOMEM;
+
+	verify_mprime_in->header.api_version = HDCP_API_VERSION;
+	verify_mprime_in->header.command_id = WIRED_REPEATER_AUTH_STREAM_REQ;
+	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
+	verify_mprime_in->header.buffer_len = cmd_size  - sizeof(verify_mprime_in->header);
+
+	verify_mprime_in->port.integrated_port_type = data->port_type;
+	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
+	verify_mprime_in->port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime, HDCP_2_2_MPRIME_LEN);
+	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data->seq_num_m);
+
+	memcpy(verify_mprime_in->streams, data->streams,
+	       array_size(data->k, sizeof(*data->streams)));
+
+	verify_mprime_in->k = cpu_to_be16(data->k);
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)verify_mprime_in, cmd_size,
+				       (u8 *)&verify_mprime_out,
+				       sizeof(verify_mprime_out));
+	kfree(verify_mprime_in);
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (verify_mprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status: 0x%X\n",
+			    WIRED_REPEATER_AUTH_STREAM_REQ,
+			    verify_mprime_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int gsc_hdcp_enable_authentication(struct device *dev,
+					  struct hdcp_port_data *data)
+{
+	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
+	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	enable_auth_in.header.api_version = HDCP_API_VERSION;
+	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
+	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	enable_auth_in.header.buffer_len = WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
+
+	enable_auth_in.port.integrated_port_type = data->port_type;
+	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
+	enable_auth_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+	enable_auth_in.stream_type = data->streams[0].stream_type;
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&enable_auth_in,
+				       sizeof(enable_auth_in),
+				       (u8 *)&enable_auth_out,
+				       sizeof(enable_auth_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status: 0x%X\n",
+			    WIRED_ENABLE_AUTH, enable_auth_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static int
+gsc_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
+{
+	struct wired_cmd_close_session_in session_close_in = { { 0 } };
+	struct wired_cmd_close_session_out session_close_out = { { 0 } };
+	struct drm_i915_private *i915;
+	ssize_t byte;
+
+	if (!dev || !data)
+		return -EINVAL;
+
+	i915 = kdev_to_i915(dev);
+	if (!i915) {
+		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
+		return -ENODEV;
+	}
+
+	session_close_in.header.api_version = HDCP_API_VERSION;
+	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
+	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
+	session_close_in.header.buffer_len =
+				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
+
+	session_close_in.port.integrated_port_type = data->port_type;
+	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
+	session_close_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
+
+	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_close_in,
+				       sizeof(session_close_in),
+				       (u8 *)&session_close_out,
+				       sizeof(session_close_out));
+	if (byte < 0) {
+		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed. %zd\n", byte);
+		return byte;
+	}
+
+	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS) {
+		drm_dbg_kms(&i915->drm, "Session Close Failed. status: 0x%X\n",
+			    session_close_out.header.status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+static const struct i915_hdcp_ops gsc_hdcp_ops = {
+	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
+	.verify_receiver_cert_prepare_km =
+				gsc_hdcp_verify_receiver_cert_prepare_km,
+	.verify_hprime = gsc_hdcp_verify_hprime,
+	.store_pairing_info = gsc_hdcp_store_pairing_info,
+	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
+	.verify_lprime = gsc_hdcp_verify_lprime,
+	.get_session_key = gsc_hdcp_get_session_key,
+	.repeater_check_flow_prepare_ack =
+				gsc_hdcp_repeater_check_flow_prepare_ack,
+	.verify_mprime = gsc_hdcp_verify_mprime,
+	.enable_hdcp_authentication = gsc_hdcp_enable_authentication,
+	.close_hdcp_session = gsc_hdcp_close_session,
+};
+
 /*This function helps allocate memory for the command that we will send to gsc cs */
 static int intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
 					     struct intel_hdcp_gsc_message *hdcp_message)
@@ -58,7 +663,7 @@ static int intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
 	return err;
 }
 
-int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
+static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
 {
 	struct intel_hdcp_gsc_message *hdcp_message;
 	int ret;
@@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
 	return ret;
 }
 
-void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
+static void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
 {
 	struct intel_hdcp_gsc_message *hdcp_message =
 					i915->display.hdcp.hdcp_message;
@@ -89,6 +694,31 @@ void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
 	kfree(hdcp_message);
 }
 
+int intel_hdcp_gsc_init(struct drm_i915_private *i915)
+{
+	struct i915_hdcp_master *data;
+	int ret;
+
+	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+
+	mutex_lock(&i915->display.hdcp.comp_mutex);
+	i915->display.hdcp.master = data;
+	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
+	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
+	ret = intel_hdcp_gsc_hdcp2_init(i915);
+	mutex_unlock(&i915->display.hdcp.comp_mutex);
+
+	return ret;
+}
+
+void intel_hdcp_gsc_fini(struct drm_i915_private *i915)
+{
+	intel_hdcp_gsc_free_message(i915);
+	kfree(i915->display.hdcp.master);
+}
+
 static int intel_gsc_send_sync(struct drm_i915_private *i915,
 			       struct intel_gsc_mtl_header *header, u64 addr,
 			       size_t msg_out_len)
@@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct drm_i915_private *i915,
  * will follow
  */
 ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
-				size_t msg_in_len, u8 *msg_out, size_t msg_out_len)
+				size_t msg_in_len, u8 *msg_out,
+				size_t msg_out_len)
 {
 	struct intel_gt *gt = i915->media_gt;
 	struct intel_gsc_mtl_header *header;
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
index 09ffd7ec02cd..5cc9fd2e88f6 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
@@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
 	void *hdcp_cmd;
 };
 
+bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
 ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
 				size_t msg_in_len, u8 *msg_out,
 				size_t msg_out_len);
+int intel_hdcp_gsc_init(struct drm_i915_private *i915);
+void intel_hdcp_gsc_fini(struct drm_i915_private *i915);
 
 #endif /* __INTEL_HDCP_GCS_H__ */
-- 
2.25.1


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

* [Intel-gfx] ✓ Fi.CI.BAT: success for Enable HDCP2.x via GSC CS (rev10)
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (5 preceding siblings ...)
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
@ 2023-02-01  9:45 ` Patchwork
  2023-02-01 10:51 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
  7 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2023-02-01  9:45 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 3390 bytes --]

== Series Details ==

Series: Enable HDCP2.x via GSC CS (rev10)
URL   : https://patchwork.freedesktop.org/series/111876/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_12676 -> Patchwork_111876v10
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/index.html

Participating hosts (27 -> 25)
------------------------------

  Missing    (2): fi-kbl-soraka fi-snb-2520m 

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

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

### IGT changes ###

#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@i915_selftest@live@slpc:
    - {bat-rpls-1}:       [PASS][1] -> [DMESG-FAIL][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/bat-rpls-1/igt@i915_selftest@live@slpc.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/bat-rpls-1/igt@i915_selftest@live@slpc.html

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

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

### IGT changes ###

#### Possible fixes ####

  * igt@fbdev@write:
    - fi-blb-e6850:       [SKIP][3] ([fdo#109271]) -> [PASS][4] +4 similar issues
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/fi-blb-e6850/igt@fbdev@write.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/fi-blb-e6850/igt@fbdev@write.html

  * igt@i915_selftest@live@hangcheck:
    - {bat-dg2-11}:       [ABORT][5] ([i915#7913]) -> [PASS][6]
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/bat-dg2-11/igt@i915_selftest@live@hangcheck.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/bat-dg2-11/igt@i915_selftest@live@hangcheck.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [i915#6311]: https://gitlab.freedesktop.org/drm/intel/issues/6311
  [i915#7359]: https://gitlab.freedesktop.org/drm/intel/issues/7359
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#7913]: https://gitlab.freedesktop.org/drm/intel/issues/7913
  [i915#7982]: https://gitlab.freedesktop.org/drm/intel/issues/7982


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

  * Linux: CI_DRM_12676 -> Patchwork_111876v10

  CI-20190529: 20190529
  CI_DRM_12676: 3775348312c45a69754d1ed47103a2c62ae18485 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7143: c7b12dcc460fc2348e1fa7f4dcb791bb82e29e44 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_111876v10: 3775348312c45a69754d1ed47103a2c62ae18485 @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

e7a84aca705e drm/i915/mtl: Add HDCP GSC interface
044a2e6438f8 drm/i915/mtl: Add function to send command to GSC CS
2a6665aee54e drm/i915/hdcp: Refactor HDCP API structures
aefa0410d94a i915/hdcp: HDCP2.x Refactoring to agnostic hdcp
fbc70f8e71cd drm/i915/hdcp: Keep hdcp agonstic naming convention
8cd66e2b28b7 drm/i915/gsc: Create GSC request submission mechanism

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/index.html

[-- Attachment #2: Type: text/html, Size: 3822 bytes --]

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

* [Intel-gfx] ✓ Fi.CI.IGT: success for Enable HDCP2.x via GSC CS (rev10)
  2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (6 preceding siblings ...)
  2023-02-01  9:45 ` [Intel-gfx] ✓ Fi.CI.BAT: success for Enable HDCP2.x via GSC CS (rev10) Patchwork
@ 2023-02-01 10:51 ` Patchwork
  7 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2023-02-01 10:51 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 20500 bytes --]

== Series Details ==

Series: Enable HDCP2.x via GSC CS (rev10)
URL   : https://patchwork.freedesktop.org/series/111876/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_12676_full -> Patchwork_111876v10_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/index.html

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

  Additional (1): shard-rkl0 

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_fair@basic-pace-share@rcs0:
    - shard-glk:          [PASS][1] -> [FAIL][2] ([i915#2842])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-glk3/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-glk2/igt@gem_exec_fair@basic-pace-share@rcs0.html

  * igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions-varying-size:
    - shard-glk:          [PASS][3] -> [FAIL][4] ([i915#2346])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-glk1/igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions-varying-size.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-glk1/igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions-varying-size.html

  * igt@kms_flip@2x-flip-vs-expired-vblank@ac-hdmi-a1-hdmi-a2:
    - shard-glk:          [PASS][5] -> [FAIL][6] ([i915#79]) +1 similar issue
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-glk8/igt@kms_flip@2x-flip-vs-expired-vblank@ac-hdmi-a1-hdmi-a2.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-glk3/igt@kms_flip@2x-flip-vs-expired-vblank@ac-hdmi-a1-hdmi-a2.html

  
#### Possible fixes ####

  * igt@drm_fdinfo@idle@rcs0:
    - {shard-rkl}:        [FAIL][7] ([i915#7742]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-4/igt@drm_fdinfo@idle@rcs0.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-5/igt@drm_fdinfo@idle@rcs0.html

  * igt@fbdev@read:
    - {shard-rkl}:        [SKIP][9] ([i915#2582]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-3/igt@fbdev@read.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@fbdev@read.html

  * igt@gem_eio@in-flight-suspend:
    - {shard-rkl}:        [FAIL][11] ([fdo#103375]) -> [PASS][12]
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-4/igt@gem_eio@in-flight-suspend.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-2/igt@gem_eio@in-flight-suspend.html

  * igt@gem_exec_fair@basic-none@vcs0:
    - {shard-rkl}:        [FAIL][13] ([i915#2842]) -> [PASS][14] +2 similar issues
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-6/igt@gem_exec_fair@basic-none@vcs0.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-5/igt@gem_exec_fair@basic-none@vcs0.html

  * igt@gem_exec_reloc@basic-write-read-noreloc:
    - {shard-rkl}:        [SKIP][15] ([i915#3281]) -> [PASS][16] +10 similar issues
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-6/igt@gem_exec_reloc@basic-write-read-noreloc.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-5/igt@gem_exec_reloc@basic-write-read-noreloc.html

  * igt@gem_pread@bench:
    - {shard-rkl}:        [SKIP][17] ([i915#3282]) -> [PASS][18] +4 similar issues
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-2/igt@gem_pread@bench.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-5/igt@gem_pread@bench.html

  * igt@gen9_exec_parse@bb-start-out:
    - {shard-rkl}:        [SKIP][19] ([i915#2527]) -> [PASS][20] +2 similar issues
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-6/igt@gen9_exec_parse@bb-start-out.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-5/igt@gen9_exec_parse@bb-start-out.html

  * igt@i915_hangman@gt-engine-error@bcs0:
    - {shard-rkl}:        [SKIP][21] ([i915#6258]) -> [PASS][22]
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-5/igt@i915_hangman@gt-engine-error@bcs0.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@i915_hangman@gt-engine-error@bcs0.html

  * igt@kms_atomic@atomic_plane_damage:
    - {shard-rkl}:        [SKIP][23] ([i915#4098]) -> [PASS][24]
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-3/igt@kms_atomic@atomic_plane_damage.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_atomic@atomic_plane_damage.html

  * igt@kms_ccs@pipe-b-random-ccs-data-y_tiled_gen12_rc_ccs:
    - {shard-rkl}:        [SKIP][25] ([i915#1845] / [i915#4098]) -> [PASS][26] +18 similar issues
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-5/igt@kms_ccs@pipe-b-random-ccs-data-y_tiled_gen12_rc_ccs.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_ccs@pipe-b-random-ccs-data-y_tiled_gen12_rc_ccs.html

  * igt@kms_ccs@pipe-c-random-ccs-data-y_tiled_gen12_rc_ccs_cc:
    - {shard-tglu}:       [SKIP][27] ([i915#7651]) -> [PASS][28] +7 similar issues
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-tglu-6/igt@kms_ccs@pipe-c-random-ccs-data-y_tiled_gen12_rc_ccs_cc.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-tglu-3/igt@kms_ccs@pipe-c-random-ccs-data-y_tiled_gen12_rc_ccs_cc.html

  * igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ac-hdmi-a1-hdmi-a2:
    - shard-glk:          [FAIL][29] ([i915#2122]) -> [PASS][30]
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-glk4/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ac-hdmi-a1-hdmi-a2.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-glk9/igt@kms_flip@2x-plain-flip-fb-recreate-interruptible@ac-hdmi-a1-hdmi-a2.html

  * igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt:
    - {shard-tglu}:       [SKIP][31] ([i915#1849]) -> [PASS][32] +1 similar issue
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-tglu-6/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-tglu-3/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-mmap-gtt.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt:
    - {shard-rkl}:        [SKIP][33] ([i915#1849] / [i915#4098]) -> [PASS][34] +18 similar issues
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt.html

  * igt@kms_plane@plane-position-hole-dpms@pipe-b-planes:
    - {shard-rkl}:        [SKIP][35] ([i915#1849]) -> [PASS][36] +1 similar issue
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-2/igt@kms_plane@plane-position-hole-dpms@pipe-b-planes.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_plane@plane-position-hole-dpms@pipe-b-planes.html

  * igt@kms_psr@basic:
    - {shard-rkl}:        [SKIP][37] ([i915#1072]) -> [PASS][38]
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-2/igt@kms_psr@basic.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_psr@basic.html

  * igt@kms_psr_stress_test@invalidate-primary-flip-overlay:
    - {shard-rkl}:        [SKIP][39] ([i915#5461]) -> [PASS][40]
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-3/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_psr_stress_test@invalidate-primary-flip-overlay.html

  * igt@kms_universal_plane@universal-plane-pageflip-windowed-pipe-b:
    - {shard-rkl}:        [SKIP][41] ([i915#4070] / [i915#4098]) -> [PASS][42]
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-2/igt@kms_universal_plane@universal-plane-pageflip-windowed-pipe-b.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-6/igt@kms_universal_plane@universal-plane-pageflip-windowed-pipe-b.html

  * igt@kms_vblank@pipe-d-query-forked:
    - {shard-tglu}:       [SKIP][43] ([i915#1845] / [i915#7651]) -> [PASS][44] +2 similar issues
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-tglu-6/igt@kms_vblank@pipe-d-query-forked.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-tglu-3/igt@kms_vblank@pipe-d-query-forked.html

  * igt@prime_vgem@basic-read:
    - {shard-rkl}:        [SKIP][45] ([fdo#109295] / [i915#3291] / [i915#3708]) -> [PASS][46]
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12676/shard-rkl-3/igt@prime_vgem@basic-read.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/shard-rkl-5/igt@prime_vgem@basic-read.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
  [fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
  [fdo#109283]: https://bugs.freedesktop.org/show_bug.cgi?id=109283
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109291]: https://bugs.freedesktop.org/show_bug.cgi?id=109291
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#109300]: https://bugs.freedesktop.org/show_bug.cgi?id=109300
  [fdo#109303]: https://bugs.freedesktop.org/show_bug.cgi?id=109303
  [fdo#109307]: https://bugs.freedesktop.org/show_bug.cgi?id=109307
  [fdo#109308]: https://bugs.freedesktop.org/show_bug.cgi?id=109308
  [fdo#109313]: https://bugs.freedesktop.org/show_bug.cgi?id=109313
  [fdo#109314]: https://bugs.freedesktop.org/show_bug.cgi?id=109314
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
  [fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
  [fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
  [fdo#111656]: https://bugs.freedesktop.org/show_bug.cgi?id=111656
  [fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#132]: https://gitlab.freedesktop.org/drm/intel/issues/132
  [i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
  [i915#1755]: https://gitlab.freedesktop.org/drm/intel/issues/1755
  [i915#1769]: https://gitlab.freedesktop.org/drm/intel/issues/1769
  [i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
  [i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
  [i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
  [i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
  [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
  [i915#2658]: https://gitlab.freedesktop.org/drm/intel/issues/2658
  [i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
  [i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681
  [i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
  [i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
  [i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
  [i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
  [i915#2920]: https://gitlab.freedesktop.org/drm/intel/issues/2920
  [i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
  [i915#315]: https://gitlab.freedesktop.org/drm/intel/issues/315
  [i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
  [i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
  [i915#3323]: https://gitlab.freedesktop.org/drm/intel/issues/3323
  [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
  [i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
  [i915#3469]: https://gitlab.freedesktop.org/drm/intel/issues/3469
  [i915#3528]: https://gitlab.freedesktop.org/drm/intel/issues/3528
  [i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
  [i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3558]: https://gitlab.freedesktop.org/drm/intel/issues/3558
  [i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
  [i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
  [i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
  [i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
  [i915#3938]: https://gitlab.freedesktop.org/drm/intel/issues/3938
  [i915#3952]: https://gitlab.freedesktop.org/drm/intel/issues/3952
  [i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955
  [i915#3966]: https://gitlab.freedesktop.org/drm/intel/issues/3966
  [i915#4036]: https://gitlab.freedesktop.org/drm/intel/issues/4036
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
  [i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
  [i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
  [i915#426]: https://gitlab.freedesktop.org/drm/intel/issues/426
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
  [i915#4387]: https://gitlab.freedesktop.org/drm/intel/issues/4387
  [i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4767]: https://gitlab.freedesktop.org/drm/intel/issues/4767
  [i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771
  [i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
  [i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
  [i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
  [i915#4859]: https://gitlab.freedesktop.org/drm/intel/issues/4859
  [i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
  [i915#4874]: https://gitlab.freedesktop.org/drm/intel/issues/4874
  [i915#4877]: https://gitlab.freedesktop.org/drm/intel/issues/4877
  [i915#4880]: https://gitlab.freedesktop.org/drm/intel/issues/4880
  [i915#4884]: https://gitlab.freedesktop.org/drm/intel/issues/4884
  [i915#4885]: https://gitlab.freedesktop.org/drm/intel/issues/4885
  [i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
  [i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
  [i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
  [i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
  [i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#5439]: https://gitlab.freedesktop.org/drm/intel/issues/5439
  [i915#5461]: https://gitlab.freedesktop.org/drm/intel/issues/5461
  [i915#5563]: https://gitlab.freedesktop.org/drm/intel/issues/5563
  [i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#6117]: https://gitlab.freedesktop.org/drm/intel/issues/6117
  [i915#6230]: https://gitlab.freedesktop.org/drm/intel/issues/6230
  [i915#6247]: https://gitlab.freedesktop.org/drm/intel/issues/6247
  [i915#6248]: https://gitlab.freedesktop.org/drm/intel/issues/6248
  [i915#6252]: https://gitlab.freedesktop.org/drm/intel/issues/6252
  [i915#6258]: https://gitlab.freedesktop.org/drm/intel/issues/6258
  [i915#6268]: https://gitlab.freedesktop.org/drm/intel/issues/6268
  [i915#6334]: https://gitlab.freedesktop.org/drm/intel/issues/6334
  [i915#6335]: https://gitlab.freedesktop.org/drm/intel/issues/6335
  [i915#6344]: https://gitlab.freedesktop.org/drm/intel/issues/6344
  [i915#6433]: https://gitlab.freedesktop.org/drm/intel/issues/6433
  [i915#6497]: https://gitlab.freedesktop.org/drm/intel/issues/6497
  [i915#6524]: https://gitlab.freedesktop.org/drm/intel/issues/6524
  [i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
  [i915#6590]: https://gitlab.freedesktop.org/drm/intel/issues/6590
  [i915#6621]: https://gitlab.freedesktop.org/drm/intel/issues/6621
  [i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
  [i915#6944]: https://gitlab.freedesktop.org/drm/intel/issues/6944
  [i915#6946]: https://gitlab.freedesktop.org/drm/intel/issues/6946
  [i915#6953]: https://gitlab.freedesktop.org/drm/intel/issues/6953
  [i915#7037]: https://gitlab.freedesktop.org/drm/intel/issues/7037
  [i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
  [i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
  [i915#7128]: https://gitlab.freedesktop.org/drm/intel/issues/7128
  [i915#7456]: https://gitlab.freedesktop.org/drm/intel/issues/7456
  [i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
  [i915#7582]: https://gitlab.freedesktop.org/drm/intel/issues/7582
  [i915#7651]: https://gitlab.freedesktop.org/drm/intel/issues/7651
  [i915#7697]: https://gitlab.freedesktop.org/drm/intel/issues/7697
  [i915#7701]: https://gitlab.freedesktop.org/drm/intel/issues/7701
  [i915#7707]: https://gitlab.freedesktop.org/drm/intel/issues/7707
  [i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
  [i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742
  [i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
  [i915#7949]: https://gitlab.freedesktop.org/drm/intel/issues/7949
  [i915#7957]: https://gitlab.freedesktop.org/drm/intel/issues/7957
  [i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975


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

  * Linux: CI_DRM_12676 -> Patchwork_111876v10

  CI-20190529: 20190529
  CI_DRM_12676: 3775348312c45a69754d1ed47103a2c62ae18485 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7143: c7b12dcc460fc2348e1fa7f4dcb791bb82e29e44 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_111876v10: 3775348312c45a69754d1ed47103a2c62ae18485 @ git://anongit.freedesktop.org/gfx-ci/linux

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v10/index.html

[-- Attachment #2: Type: text/html, Size: 13306 bytes --]

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

* Re: [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
@ 2023-03-06 11:17   ` Shankar, Uma
  2023-03-06 12:39     ` Kandpal, Suraj
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-06 11:17 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Teres Alexis, Alan Previn



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Suraj
> Kandpal
> Sent: Wednesday, February 1, 2023 2:38 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Teres Alexis, Alan Previn <alan.previn.teres.alexis@intel.com>
> Subject: [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission
> mechanism
> 
> HDCP and PXP will require a common function to allow it to submit commands to the
> gsc cs. Also adding the gsc mtl header that needs to be added on to the existing
> payloads of HDCP and PXP.
> 
> --v4
> -Seprate gsc load and heci cmd submission into different functions in different files
> for better scalability [Alan] -Rename gsc address field [Alan]
> 
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
> Signed-off-by: Suraj Kandpal<suraj.kandpal@intel.com>
> Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
> ---
>  drivers/gpu/drm/i915/Makefile                 |  1 +
>  drivers/gpu/drm/i915/gt/intel_gpu_commands.h  |  2 +
>  drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h     |  1 +
>  .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c | 94 +++++++++++++++++++
> .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h | 45 +++++++++
>  5 files changed, 143 insertions(+)
>  create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
>  create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index
> 918470a04591..482928cffb1c 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -195,6 +195,7 @@ i915-y += \
>  i915-y += \
>  	  gt/uc/intel_gsc_fw.o \
>  	  gt/uc/intel_gsc_uc.o \
> +	  gt/uc/intel_gsc_uc_heci_cmd_submit.o\
>  	  gt/uc/intel_guc.o \
>  	  gt/uc/intel_guc_ads.o \
>  	  gt/uc/intel_guc_capture.o \
> diff --git a/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> b/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> index 2af1ae3831df..454179884801 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> @@ -439,6 +439,8 @@
>  #define GSC_FW_LOAD GSC_INSTR(1, 0, 2)
>  #define   HECI1_FW_LIMIT_VALID (1 << 31)
> 
> +#define GSC_HECI_CMD_PKT GSC_INSTR(0, 0, 6)
> +
>  /*
>   * Used to convert any address to canonical form.
>   * Starting from gen8, some commands (e.g. STATE_BASE_ADDRESS, diff --git
> a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> index 4b5dbb44afb4..146ac0128f69 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> @@ -12,4 +12,5 @@ struct intel_gsc_uc;
> 
>  int intel_gsc_uc_fw_upload(struct intel_gsc_uc *gsc);  bool
> intel_gsc_uc_fw_init_done(struct intel_gsc_uc *gsc);
> +

This redundant and unrelated change can be dropped.

>  #endif
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> new file mode 100644
> index 000000000000..be2424af521d
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> @@ -0,0 +1,94 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#include "gt/intel_engine_pm.h"
> +#include "gt/intel_gpu_commands.h"
> +#include "gt/intel_gt.h"
> +#include "gt/intel_ring.h"
> +#include "intel_gsc_uc_heci_cmd_submit.h"
> +
> +struct gsc_heci_pkt {
> +	u64 addr_in;
> +	u32 size_in;
> +	u64 addr_out;
> +	u32 size_out;
> +};
> +
> +static int emit_gsc_heci_pkt(struct i915_request *rq, struct
> +gsc_heci_pkt *pkt) {
> +	u32 *cs;
> +
> +	cs = intel_ring_begin(rq, 8);
> +	if (IS_ERR(cs))
> +		return PTR_ERR(cs);
> +
> +	*cs++ = GSC_HECI_CMD_PKT;
> +	*cs++ = lower_32_bits(pkt->addr_in);
> +	*cs++ = upper_32_bits(pkt->addr_in);
> +	*cs++ = pkt->size_in;
> +	*cs++ = lower_32_bits(pkt->addr_out);
> +	*cs++ = upper_32_bits(pkt->addr_out);
> +	*cs++ = pkt->size_out;
> +	*cs++ = 0;
> +
> +	intel_ring_advance(rq, cs);
> +
> +	return 0;
> +}
> +
> +int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc, u64 addr_in,
> +					u32 size_in, u64 addr_out,
> +					u32 size_out)
> +{
> +	struct intel_context *ce = gsc->ce;
> +	struct i915_request *rq;
> +	struct gsc_heci_pkt pkt = {
> +	.addr_in = addr_in,
> +	.size_in = size_in,
> +	.addr_out = addr_out,
> +	.size_out = size_out
> +	};
> +	int err;
> +
> +	if (!ce)
> +		return -ENODEV;
> +
> +	rq = i915_request_create(ce);
> +	if (IS_ERR(rq))
> +		return PTR_ERR(rq);
> +
> +	if (ce->engine->emit_init_breadcrumb) {
> +		err = ce->engine->emit_init_breadcrumb(rq);
> +		if (err)
> +			goto out_rq;
> +	}
> +
> +	err = emit_gsc_heci_pkt(rq, &pkt);
> +
> +	if (err)
> +		goto out_rq;
> +
> +	err = ce->engine->emit_flush(rq, 0);
> +
> +out_rq:
> +	i915_request_get(rq);
> +
> +	if (unlikely(err))
> +		i915_request_set_error_once(rq, err);
> +
> +	i915_request_add(rq);
> +
> +	if (!err && i915_request_wait(rq, 0, msecs_to_jiffies(500)) < 0)
> +		err = -ETIME;
> +
> +	i915_request_put(rq);
> +
> +	if (err)
> +		drm_err(&gsc_uc_to_gt(gsc)->i915->drm,
> +			"Request submission for GSC heci cmd failed (%d)\n",
> +			err);
> +
> +	return err;
> +}
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> new file mode 100644
> index 000000000000..cf610dfca7a5
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> @@ -0,0 +1,45 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#ifndef _INTEL_GSC_UC_HECI_CMD_SUBMIT_H_ #define
> +_INTEL_GSC_UC_HECI_CMD_SUBMIT_H_
> +
> +#include <linux/types.h>
> +
> +struct intel_gsc_uc;
> +struct intel_gsc_mtl_header {
> +	u32 validity_marker;
> +#define GSC_HECI_VALIDITY_MARKER 0xA578875A
> +
> +	u8 heci_client_id;
> +#define HECI_MEADDRESS_PXP 17
> +#define HECI_MEADDRESS_HDCP 18
> +
> +	u8 reserved1;
> +
> +	u16 header_version;
> +#define MTL_GSC_HEADER_VERSION 1
> +
> +	u64 host_session_handle;
> +	u64 gsc_message_handle;
> +
> +	u32 message_size; /* lower 20 bits only, upper 12 are reserved */
> +
> +	/*
> +	 * Flags mask:
> +	 * Bit 0: Pending
> +	 * Bit 1: Session Cleanup;
> +	 * Bits 2-15: Flags
> +	 * Bits 16-31: Extension Size
> +	 */
> +	u32 flags;
> +
> +	u32 status;
> +} __packed;
> +
> +int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc,
> +					u64 addr_in, u32 size_in,
> +					u64 addr_out, u32 size_out);
> +#endif
> --
> 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention Suraj Kandpal
@ 2023-03-06 11:38   ` Shankar, Uma
  2023-03-06 12:50     ` Kandpal, Suraj
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-06 11:38 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Wednesday, February 1, 2023 2:38 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>; Vivi,
> Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma <uma.shankar@intel.com>;
> Kandpal, Suraj <suraj.kandpal@intel.com>
> Subject: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention

Typo in agnostic.

Also I feel this header can be re-phrased: "Use generic names for HDCP helpers and structs"
Add the rationale why this is required, explain the legacy and new usage which is the cause
for this patch.

> 
> From: Anshuman Gupta <anshuman.gupta@intel.com>
> 
> Change the include/drm/i915_mei_hdcp_interface.h to
> include/drm/i915_hdcp_interface.h
> 
> --v6
> -make each patch build individually [Jani]
> 
> --v8
> -change ME FW to ME/GSC FW [Ankit]
> -fix formatting issue [Ankit]
> 
> Cc: Tomas Winkler <tomas.winkler@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Uma Shankar <uma.shankar@intel.com>
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Acked-by: Tomas Winkler <tomas.winkler@intel.com>
> ---
>  .../gpu/drm/i915/display/intel_display_core.h |  2 +-
>  .../drm/i915/display/intel_display_types.h    |  2 +-
>  drivers/gpu/drm/i915/display/intel_hdcp.c     | 81 ++++++++--------
>  drivers/misc/mei/hdcp/mei_hdcp.c              | 61 ++++++------
>  ...hdcp_interface.h => i915_hdcp_interface.h} | 92 +++++++++----------
>  5 files changed, 118 insertions(+), 120 deletions(-)  rename
> include/drm/{i915_mei_hdcp_interface.h => i915_hdcp_interface.h} (73%)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> b/drivers/gpu/drm/i915/display/intel_display_core.h
> index fb8670aa2932..8e7a68339876 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -378,7 +378,7 @@ struct intel_display {
>  	} gmbus;
> 
>  	struct {
> -		struct i915_hdcp_comp_master *master;
> +		struct i915_hdcp_master *master;

Since we are changing this up, can we drop the use of phrase like "master" etc,
if feasible in the series, else this can be taken with a follow up cleanup series.

>  		bool comp_added;
> 
>  		/* Mutex to protect the above hdcp component related values. */
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 9ccae7a46020..7accd3a8877c 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -43,7 +43,7 @@
>  #include <drm/drm_rect.h>
>  #include <drm/drm_vblank.h>
>  #include <drm/drm_vblank_work.h>
> -#include <drm/i915_mei_hdcp_interface.h>
> +#include <drm/i915_hdcp_interface.h>
>  #include <media/cec-notifier.h>
> 
>  #include "i915_vma.h"
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 6406fd487ee5..262c76f21801 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -1143,7 +1143,7 @@ hdcp2_prepare_ake_init(struct intel_connector
> *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;

comp name is relevant if we use component framework, having the name for a
generic case doesn't seem right. Change it universally in patch.

>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1154,7 +1154,7 @@ hdcp2_prepare_ake_init(struct intel_connector
> *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->initiate_hdcp2_session(comp->mei_dev, data, ake_data);
> +	ret = comp->ops->initiate_hdcp2_session(comp->hdcp_dev, data,
> +ake_data);
>  	if (ret)
>  		drm_dbg_kms(&dev_priv->drm, "Prepare_ake_init failed. %d\n",
>  			    ret);
> @@ -1173,7 +1173,7 @@ hdcp2_verify_rx_cert_prepare_km(struct intel_connector
> *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1184,7 +1184,7 @@ hdcp2_verify_rx_cert_prepare_km(struct intel_connector
> *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->verify_receiver_cert_prepare_km(comp->mei_dev, data,
> +	ret = comp->ops->verify_receiver_cert_prepare_km(comp->hdcp_dev, data,
>  							 rx_cert, paired,
>  							 ek_pub_km, msg_sz);
>  	if (ret < 0)
> @@ -1201,7 +1201,7 @@ static int hdcp2_verify_hprime(struct intel_connector
> *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1212,7 +1212,7 @@ static int hdcp2_verify_hprime(struct intel_connector
> *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->verify_hprime(comp->mei_dev, data, rx_hprime);
> +	ret = comp->ops->verify_hprime(comp->hdcp_dev, data, rx_hprime);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Verify hprime failed. %d\n", ret);
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1227,7 +1227,7 @@ hdcp2_store_pairing_info(struct intel_connector
> *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1238,7 +1238,7 @@ hdcp2_store_pairing_info(struct intel_connector
> *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->store_pairing_info(comp->mei_dev, data, pairing_info);
> +	ret = comp->ops->store_pairing_info(comp->hdcp_dev, data,
> +pairing_info);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Store pairing info failed. %d\n",
>  			    ret);
> @@ -1254,7 +1254,7 @@ hdcp2_prepare_lc_init(struct intel_connector *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1265,7 +1265,7 @@ hdcp2_prepare_lc_init(struct intel_connector *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->initiate_locality_check(comp->mei_dev, data, lc_init);
> +	ret = comp->ops->initiate_locality_check(comp->hdcp_dev, data,
> +lc_init);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Prepare lc_init failed. %d\n",
>  			    ret);
> @@ -1281,7 +1281,7 @@ hdcp2_verify_lprime(struct intel_connector *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1292,7 +1292,7 @@ hdcp2_verify_lprime(struct intel_connector *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->verify_lprime(comp->mei_dev, data, rx_lprime);
> +	ret = comp->ops->verify_lprime(comp->hdcp_dev, data, rx_lprime);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Verify L_Prime failed. %d\n",
>  			    ret);
> @@ -1307,7 +1307,7 @@ static int hdcp2_prepare_skey(struct intel_connector
> *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1318,7 +1318,7 @@ static int hdcp2_prepare_skey(struct intel_connector
> *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->get_session_key(comp->mei_dev, data, ske_data);
> +	ret = comp->ops->get_session_key(comp->hdcp_dev, data, ske_data);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Get session key failed. %d\n",
>  			    ret);
> @@ -1336,7 +1336,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct
> intel_connector *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1347,7 +1347,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct
> intel_connector *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->repeater_check_flow_prepare_ack(comp->mei_dev,
> data,
> +	ret = comp->ops->repeater_check_flow_prepare_ack(comp->hdcp_dev,
> data,
>  							 rep_topology,
>  							 rep_send_ack);
>  	if (ret < 0)
> @@ -1365,7 +1365,7 @@ hdcp2_verify_mprime(struct intel_connector *connector,
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1376,7 +1376,7 @@ hdcp2_verify_mprime(struct intel_connector *connector,
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->verify_mprime(comp->mei_dev, data, stream_ready);
> +	ret = comp->ops->verify_mprime(comp->hdcp_dev, data, stream_ready);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Verify mprime failed. %d\n", ret);
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1389,7 +1389,7 @@ static int hdcp2_authenticate_port(struct intel_connector
> *connector)
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1400,7 +1400,7 @@ static int hdcp2_authenticate_port(struct intel_connector
> *connector)
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->enable_hdcp_authentication(comp->mei_dev, data);
> +	ret = comp->ops->enable_hdcp_authentication(comp->hdcp_dev, data);
>  	if (ret < 0)
>  		drm_dbg_kms(&dev_priv->drm, "Enable hdcp auth failed. %d\n",
>  			    ret);
> @@ -1413,7 +1413,7 @@ static int hdcp2_close_mei_session(struct intel_connector
> *connector)  {
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> -	struct i915_hdcp_comp_master *comp;
> +	struct i915_hdcp_master *comp;
>  	int ret;
> 
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> @@ -1424,7 +1424,7 @@ static int hdcp2_close_mei_session(struct intel_connector
> *connector)
>  		return -EINVAL;
>  	}
> 
> -	ret = comp->ops->close_hdcp_session(comp->mei_dev,
> +	ret = comp->ops->close_hdcp_session(comp->hdcp_dev,
>  					     &dig_port->hdcp_port_data);
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> 
> @@ -2145,8 +2145,8 @@ static int i915_hdcp_component_bind(struct device
> *i915_kdev,
> 
>  	drm_dbg(&dev_priv->drm, "I915 HDCP comp bind\n");
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> -	dev_priv->display.hdcp.master = (struct i915_hdcp_comp_master *)data;
> -	dev_priv->display.hdcp.master->mei_dev = mei_kdev;
> +	dev_priv->display.hdcp.master = (struct i915_hdcp_master *)data;
> +	dev_priv->display.hdcp.master->hdcp_dev = mei_kdev;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> 
>  	return 0;
> @@ -2163,30 +2163,30 @@ static void i915_hdcp_component_unbind(struct device
> *i915_kdev,
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
>  }
> 
> -static const struct component_ops i915_hdcp_component_ops = {
> +static const struct component_ops i915_hdcp_ops = {
>  	.bind   = i915_hdcp_component_bind,
>  	.unbind = i915_hdcp_component_unbind,
>  };
> 
> -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> +static enum hdcp_ddi intel_get_hdcp_ddi_index(enum port port)
>  {
>  	switch (port) {
>  	case PORT_A:
> -		return MEI_DDI_A;
> +		return HDCP_DDI_A;
>  	case PORT_B ... PORT_F:
> -		return (enum mei_fw_ddi)port;
> +		return (enum hdcp_ddi)port;
>  	default:
> -		return MEI_DDI_INVALID_PORT;
> +		return HDCP_DDI_INVALID_PORT;
>  	}
>  }
> 
> -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
> +static enum hdcp_transcoder intel_get_hdcp_transcoder(enum transcoder
> +cpu_transcoder)
>  {
>  	switch (cpu_transcoder) {
>  	case TRANSCODER_A ... TRANSCODER_D:
> -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> +		return (enum hdcp_transcoder)(cpu_transcoder | 0x10);
>  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> -		return MEI_INVALID_TRANSCODER;
> +		return HDCP_INVALID_TRANSCODER;
>  	}
>  }
> 
> @@ -2200,20 +2200,20 @@ static int initialize_hdcp_port_data(struct
> intel_connector *connector,
>  	enum port port = dig_port->base.port;
> 
>  	if (DISPLAY_VER(dev_priv) < 12)
> -		data->fw_ddi = intel_get_mei_fw_ddi_index(port);
> +		data->hdcp_ddi = intel_get_hdcp_ddi_index(port);
>  	else
>  		/*
> -		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
> +		 * As per ME FW API expectation, for GEN 12+, hdcp_ddi is filled
>  		 * with zero(INVALID PORT index).
>  		 */
> -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> +		data->hdcp_ddi = HDCP_DDI_INVALID_PORT;
> 
>  	/*
> -	 * As associated transcoder is set and modified at modeset, here fw_tc
> +	 * As associated transcoder is set and modified at modeset, here
> +hdcp_transcoder
>  	 * is initialized to zero (invalid transcoder index). This will be
>  	 * retained for <Gen12 forever.
>  	 */
> -	data->fw_tc = MEI_INVALID_TRANSCODER;
> +	data->hdcp_transcoder = HDCP_INVALID_TRANSCODER;
> 
>  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
>  	data->protocol = (u8)shim->protocol;
> @@ -2256,7 +2256,7 @@ void intel_hdcp_component_init(struct drm_i915_private
> *dev_priv)
> 
>  	dev_priv->display.hdcp.comp_added = true;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> -	ret = component_add_typed(dev_priv->drm.dev,
> &i915_hdcp_component_ops,
> +	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
>  				  I915_COMPONENT_HDCP);
>  	if (ret < 0) {
>  		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
> @@ -2350,7 +2350,8 @@ int intel_hdcp_enable(struct intel_connector *connector,
>  	}
> 
>  	if (DISPLAY_VER(dev_priv) >= 12)
> -		dig_port->hdcp_port_data.fw_tc = intel_get_mei_fw_tc(hdcp-
> >cpu_transcoder);
> +		dig_port->hdcp_port_data.hdcp_transcoder =
> +			intel_get_hdcp_transcoder(hdcp->cpu_transcoder);
> 
>  	/*
>  	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup @@ -
> 2485,7 +2486,7 @@ void intel_hdcp_component_fini(struct drm_i915_private
> *dev_priv)
>  	dev_priv->display.hdcp.comp_added = false;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> 
> -	component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);
> +	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
>  }
> 
>  void intel_hdcp_cleanup(struct intel_connector *connector) diff --git
> a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> index e889a8bd7ac8..b2c49599809c 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> @@ -23,7 +23,7 @@
>  #include <linux/component.h>
>  #include <drm/drm_connector.h>
>  #include <drm/i915_component.h>
> -#include <drm/i915_mei_hdcp_interface.h>
> +#include <drm/i915_hdcp_interface.h>
> 
>  #include "mei_hdcp.h"
> 
> @@ -57,8 +57,8 @@ mei_hdcp_initiate_session(struct device *dev, struct
> hdcp_port_data *data,
> 
> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> 
>  	session_init_in.port.integrated_port_type = data->port_type;
> -	session_init_in.port.physical_port = (u8)data->fw_ddi;
> -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
> +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> +	session_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
>  	session_init_in.protocol = data->protocol;
> 
>  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in, @@ -127,8 +127,8
> @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> 
> 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> 
>  	verify_rxcert_in.port.integrated_port_type = data->port_type;
> -	verify_rxcert_in.port.physical_port = (u8)data->fw_ddi;
> -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
> +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> +	verify_rxcert_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
>  	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN); @@ -
> 198,8 +198,8 @@ mei_hdcp_verify_hprime(struct device *dev, struct
> hdcp_port_data *data,
>  	send_hprime_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> 
>  	send_hprime_in.port.integrated_port_type = data->port_type;
> -	send_hprime_in.port.physical_port = (u8)data->fw_ddi;
> -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
> +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> +	send_hprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
>  	       HDCP_2_2_H_PRIME_LEN);
> @@ -256,8 +256,8 @@ mei_hdcp_store_pairing_info(struct device *dev, struct
> hdcp_port_data *data,
> 
> 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> 
>  	pairing_info_in.port.integrated_port_type = data->port_type;
> -	pairing_info_in.port.physical_port = (u8)data->fw_ddi;
> -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
> +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> +	pairing_info_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
>  	       HDCP_2_2_E_KH_KM_LEN);
> @@ -315,8 +315,8 @@ mei_hdcp_initiate_locality_check(struct device *dev,
>  	lc_init_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> 
>  	lc_init_in.port.integrated_port_type = data->port_type;
> -	lc_init_in.port.physical_port = (u8)data->fw_ddi;
> -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
> +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
>  	if (byte < 0) {
> @@ -371,8 +371,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct
> hdcp_port_data *data,
> 
> 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> 
>  	verify_lprime_in.port.integrated_port_type = data->port_type;
> -	verify_lprime_in.port.physical_port = (u8)data->fw_ddi;
> -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
> +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> +	verify_lprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
>  	       HDCP_2_2_L_PRIME_LEN);
> @@ -429,8 +429,8 @@ static int mei_hdcp_get_session_key(struct device *dev,
>  	get_skey_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> 
>  	get_skey_in.port.integrated_port_type = data->port_type;
> -	get_skey_in.port.physical_port = (u8)data->fw_ddi;
> -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
> +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> +	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in));
>  	if (byte < 0) {
> @@ -494,8 +494,8 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device
> *dev,
> 
> 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> 
>  	verify_repeater_in.port.integrated_port_type = data->port_type;
> -	verify_repeater_in.port.physical_port = (u8)data->fw_ddi;
> -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
> +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> +	verify_repeater_in.port.attached_transcoder =
> +(u8)data->hdcp_transcoder;
> 
>  	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
>  	       HDCP_2_2_RXINFO_LEN);
> @@ -572,8 +572,8 @@ static int mei_hdcp_verify_mprime(struct device *dev,
>  	verify_mprime_in->header.buffer_len = cmd_size  - sizeof(verify_mprime_in-
> >header);
> 
>  	verify_mprime_in->port.integrated_port_type = data->port_type;
> -	verify_mprime_in->port.physical_port = (u8)data->fw_ddi;
> -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> +	verify_mprime_in->port.attached_transcoder =
> +(u8)data->hdcp_transcoder;
> 
>  	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> HDCP_2_2_MPRIME_LEN);
>  	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> >seq_num_m); @@ -634,8 +634,8 @@ static int
> mei_hdcp_enable_authentication(struct device *dev,
>  	enable_auth_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> 
>  	enable_auth_in.port.integrated_port_type = data->port_type;
> -	enable_auth_in.port.physical_port = (u8)data->fw_ddi;
> -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
> +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> +	enable_auth_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
>  	enable_auth_in.stream_type = data->streams[0].stream_type;
> 
>  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in, @@ -689,8 +689,8
> @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
>  				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> 
>  	session_close_in.port.integrated_port_type = data->port_type;
> -	session_close_in.port.physical_port = (u8)data->fw_ddi;
> -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
> +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> +	session_close_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> 
>  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
>  			      sizeof(session_close_in));
> @@ -715,7 +715,7 @@ mei_hdcp_close_session(struct device *dev, struct
> hdcp_port_data *data)
>  	return 0;
>  }
> 
> -static const struct i915_hdcp_component_ops mei_hdcp_ops = {
> +static const struct i915_hdcp_ops mei_hdcp_ops = {
>  	.owner = THIS_MODULE,
>  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
>  	.verify_receiver_cert_prepare_km =
> @@ -735,13 +735,12 @@ static const struct i915_hdcp_component_ops
> mei_hdcp_ops = {  static int mei_component_master_bind(struct device *dev)  {
>  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> -	struct i915_hdcp_comp_master *comp_master =
> -						mei_cldev_get_drvdata(cldev);
> +	struct i915_hdcp_master *comp_master = mei_cldev_get_drvdata(cldev);
>  	int ret;
> 
>  	dev_dbg(dev, "%s\n", __func__);
>  	comp_master->ops = &mei_hdcp_ops;
> -	comp_master->mei_dev = dev;
> +	comp_master->hdcp_dev = dev;
>  	ret = component_bind_all(dev, comp_master);
>  	if (ret < 0)
>  		return ret;
> @@ -752,8 +751,7 @@ static int mei_component_master_bind(struct device *dev)
> static void mei_component_master_unbind(struct device *dev)  {
>  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> -	struct i915_hdcp_comp_master *comp_master =
> -						mei_cldev_get_drvdata(cldev);
> +	struct i915_hdcp_master *comp_master = mei_cldev_get_drvdata(cldev);
> 
>  	dev_dbg(dev, "%s\n", __func__);
>  	component_unbind_all(dev, comp_master); @@ -801,7 +799,7 @@ static
> int mei_hdcp_component_match(struct device *dev, int subcomponent,  static int
> mei_hdcp_probe(struct mei_cl_device *cldev,
>  			  const struct mei_cl_device_id *id)  {
> -	struct i915_hdcp_comp_master *comp_master;
> +	struct i915_hdcp_master *comp_master;
>  	struct component_match *master_match;
>  	int ret;
> 
> @@ -846,8 +844,7 @@ static int mei_hdcp_probe(struct mei_cl_device *cldev,
> 
>  static void mei_hdcp_remove(struct mei_cl_device *cldev)  {
> -	struct i915_hdcp_comp_master *comp_master =
> -						mei_cldev_get_drvdata(cldev);
> +	struct i915_hdcp_master *comp_master = mei_cldev_get_drvdata(cldev);
>  	int ret;
> 
>  	component_master_del(&cldev->dev, &mei_component_master_ops); diff -
> -git a/include/drm/i915_mei_hdcp_interface.h b/include/drm/i915_hdcp_interface.h
> similarity index 73%
> rename from include/drm/i915_mei_hdcp_interface.h
> rename to include/drm/i915_hdcp_interface.h index f441cbcd95a4..75c75f52ab1b
> 100644
> --- a/include/drm/i915_mei_hdcp_interface.h
> +++ b/include/drm/i915_hdcp_interface.h
> @@ -6,15 +6,15 @@
>   * Ramalingam C <ramalingam.c@intel.com>
>   */
> 
> -#ifndef _I915_MEI_HDCP_INTERFACE_H_
> -#define _I915_MEI_HDCP_INTERFACE_H_
> +#ifndef _I915_HDCP_INTERFACE_H_
> +#define _I915_HDCP_INTERFACE_H_
> 
>  #include <linux/mutex.h>
>  #include <linux/device.h>
>  #include <drm/display/drm_hdcp.h>
> 
>  /**
> - * enum hdcp_port_type - HDCP port implementation type defined by ME FW
> + * enum hdcp_port_type - HDCP port implementation type defined by
> + ME/GSC FW
>   * @HDCP_PORT_TYPE_INVALID: Invalid hdcp port type
>   * @HDCP_PORT_TYPE_INTEGRATED: In-Host HDCP2.x port
>   * @HDCP_PORT_TYPE_LSPCON: HDCP2.2 discrete wired Tx port with LSPCON @@
> -41,46 +41,46 @@ enum hdcp_wired_protocol {
>  	HDCP_PROTOCOL_DP
>  };
> 
> -enum mei_fw_ddi {
> -	MEI_DDI_INVALID_PORT = 0x0,
> +enum hdcp_ddi {
> +	HDCP_DDI_INVALID_PORT = 0x0,
> 
> -	MEI_DDI_B = 1,
> -	MEI_DDI_C,
> -	MEI_DDI_D,
> -	MEI_DDI_E,
> -	MEI_DDI_F,
> -	MEI_DDI_A = 7,
> -	MEI_DDI_RANGE_END = MEI_DDI_A,
> +	HDCP_DDI_B = 1,
> +	HDCP_DDI_C,
> +	HDCP_DDI_D,
> +	HDCP_DDI_E,
> +	HDCP_DDI_F,
> +	HDCP_DDI_A = 7,
> +	HDCP_DDI_RANGE_END = HDCP_DDI_A,
>  };
> 
>  /**
> - * enum mei_fw_tc - ME Firmware defined index for transcoders
> - * @MEI_INVALID_TRANSCODER: Index for Invalid transcoder
> - * @MEI_TRANSCODER_EDP: Index for EDP Transcoder
> - * @MEI_TRANSCODER_DSI0: Index for DSI0 Transcoder
> - * @MEI_TRANSCODER_DSI1: Index for DSI1 Transcoder
> - * @MEI_TRANSCODER_A: Index for Transcoder A
> - * @MEI_TRANSCODER_B: Index for Transcoder B
> - * @MEI_TRANSCODER_C: Index for Transcoder C
> - * @MEI_TRANSCODER_D: Index for Transcoder D
> + * enum hdcp_tc - ME/GSC Firmware defined index for transcoders
> + * @HDCP_INVALID_TRANSCODER: Index for Invalid transcoder
> + * @HDCP_TRANSCODER_EDP: Index for EDP Transcoder
> + * @HDCP_TRANSCODER_DSI0: Index for DSI0 Transcoder
> + * @HDCP_TRANSCODER_DSI1: Index for DSI1 Transcoder
> + * @HDCP_TRANSCODER_A: Index for Transcoder A
> + * @HDCP_TRANSCODER_B: Index for Transcoder B
> + * @HDCP_TRANSCODER_C: Index for Transcoder C
> + * @HDCP_TRANSCODER_D: Index for Transcoder D
>   */
> -enum mei_fw_tc {
> -	MEI_INVALID_TRANSCODER = 0x00,
> -	MEI_TRANSCODER_EDP,
> -	MEI_TRANSCODER_DSI0,
> -	MEI_TRANSCODER_DSI1,
> -	MEI_TRANSCODER_A = 0x10,
> -	MEI_TRANSCODER_B,
> -	MEI_TRANSCODER_C,
> -	MEI_TRANSCODER_D
> +enum hdcp_transcoder {
> +	HDCP_INVALID_TRANSCODER = 0x00,
> +	HDCP_TRANSCODER_EDP,
> +	HDCP_TRANSCODER_DSI0,
> +	HDCP_TRANSCODER_DSI1,
> +	HDCP_TRANSCODER_A = 0x10,
> +	HDCP_TRANSCODER_B,
> +	HDCP_TRANSCODER_C,
> +	HDCP_TRANSCODER_D
>  };
> 
>  /**
>   * struct hdcp_port_data - intel specific HDCP port data
> - * @fw_ddi: ddi index as per ME FW
> - * @fw_tc: transcoder index as per ME FW
> - * @port_type: HDCP port type as per ME FW classification
> - * @protocol: HDCP adaptation as per ME FW
> + * @hdcp_ddi: ddi index as per ME/GSC FW
> + * @hdcp_transcoder: transcoder index as per ME/GSC FW
> + * @port_type: HDCP port type as per ME/GSC FW classification
> + * @protocol: HDCP adaptation as per ME/GSC FW
>   * @k: No of streams transmitted on a port. Only on DP MST this is != 1
>   * @seq_num_m: Count of RepeaterAuth_Stream_Manage msg propagated.
>   *	       Initialized to 0 on AKE_INIT. Incremented after every successful
> @@ -90,8 +90,8 @@ enum mei_fw_tc {
>   *	     streams
>   */
>  struct hdcp_port_data {
> -	enum mei_fw_ddi fw_ddi;
> -	enum mei_fw_tc fw_tc;
> +	enum hdcp_ddi hdcp_ddi;
> +	enum hdcp_transcoder hdcp_transcoder;
>  	u8 port_type;
>  	u8 protocol;
>  	u16 k;
> @@ -100,7 +100,7 @@ struct hdcp_port_data {  };
> 
>  /**
> - * struct i915_hdcp_component_ops- ops for HDCP2.2 services.
> + * struct i915_hdcp_ops- ops for HDCP2.2 services.
>   * @owner: Module providing the ops
>   * @initiate_hdcp2_session: Initiate a Wired HDCP2.2 Tx Session.
>   *			    And Prepare AKE_Init.
> @@ -119,9 +119,9 @@ struct hdcp_port_data {
>   * @close_hdcp_session: Close the Wired HDCP Tx session per port.
>   *			This also disables the authenticated state of the port.
>   */
> -struct i915_hdcp_component_ops {
> +struct i915_hdcp_ops {
>  	/**
> -	 * @owner: mei_hdcp module
> +	 * @owner: hdcp module
>  	 */
>  	struct module *owner;
> 
> @@ -169,16 +169,16 @@ struct i915_hdcp_component_ops {
> 
>  /**
>   * struct i915_hdcp_component_master - Used for communication between i915

Name doesn't match with the structure, please fix.

> - * and mei_hdcp drivers for the HDCP2.2 services
> - * @mei_dev: device that provide the HDCP2.2 service from MEI Bus.
> - * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
> + * and hdcp drivers for the HDCP2.2 services
> + * @hdcp_dev: device that provide the HDCP2.2 service from MEI Bus.
> + * @hdcp_ops: Ops implemented by hdcp driver or intel_hdcp_gsc , used by i915
> driver.
>   */
> -struct i915_hdcp_comp_master {
> -	struct device *mei_dev;
> -	const struct i915_hdcp_component_ops *ops;
> +struct i915_hdcp_master {
> +	struct device *hdcp_dev;
> +	const struct i915_hdcp_ops *ops;
> 
>  	/* To protect the above members. */
>  	struct mutex mutex;
>  };
> 
> -#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
> +#endif /* _I915_HDCP_INTERFACE_H_ */
> --
> 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp Suraj Kandpal
@ 2023-03-06 12:00   ` Shankar, Uma
  2023-03-06 12:51     ` Kandpal, Suraj
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-06 12:00 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Wednesday, February 1, 2023 2:38 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>; Vivi,
> Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma <uma.shankar@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp

Prefix drm.

> As now we have more then one type of content protection secrity firmware. Let

Typo in security

> change the i915_hdcp_interface.h header naming convention to suit generic f/w
> type.
> %s/MEI_/HDCP_
> %s/mei_dev/hdcp_dev
> 
> As interface to CP FW can be either a non i915 component or
> i915 intergral component, change structure name Accordingly.
> %s/i915_hdcp_comp_master/i915_hdcp_master
> %s/i915_hdcp_component_ops/i915_hdcp_ops

Description seems to be off from the changes in the patch. Please fix.

> --v3
> -Changing names to drop cp_fw to make naming more agnostic[Jani]
> 
> Cc: Tomas Winkler <tomas.winkler@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Uma Shankar <uma.shankar@intel.com>
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_core.h | 1 +
>  drivers/gpu/drm/i915/display/intel_hdcp.c         | 4 ++--
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 8e7a68339876..139100fe2383 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -15,6 +15,7 @@
> 
>  #include <drm/drm_connector.h>
>  #include <drm/drm_modeset_lock.h>
> +#include <drm/i915_hdcp_interface.h>

This change doesn't seem to affect the changes below. Please move this
to the right patch.

> 
>  #include "intel_cdclk.h"
>  #include "intel_display_limits.h"
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 262c76f21801..0d6aed1eb171 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -1409,7 +1409,7 @@ static int hdcp2_authenticate_port(struct intel_connector
> *connector)
>  	return ret;
>  }
> 
> -static int hdcp2_close_mei_session(struct intel_connector *connector)
> +static int hdcp2_close_session(struct intel_connector *connector)
>  {
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev); @@ -
> 1433,7 +1433,7 @@ static int hdcp2_close_mei_session(struct intel_connector
> *connector)
> 
>  static int hdcp2_deauthenticate_port(struct intel_connector *connector)  {
> -	return hdcp2_close_mei_session(connector);
> +	return hdcp2_close_session(connector);
>  }
> 
>  /* Authentication flow starts from here */
> --
> 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
@ 2023-03-06 12:01   ` Shankar, Uma
  0 siblings, 0 replies; 27+ messages in thread
From: Shankar, Uma @ 2023-03-06 12:01 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Wednesday, February 1, 2023 2:38 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>; Vivi,
> Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma <uma.shankar@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures
> 
> It requires to move intel specific HDCP API structures to i915_hdcp_interface.h from
> driver/misc/mei/hdcp/mei_hdcp.h so that any content protection fw interfaces can
> use these structures.

Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar@intel.com>

> Cc: Tomas Winkler <tomas.winkler@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Uma Shankar <uma.shankar@intel.com>
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
>  drivers/misc/mei/hdcp/mei_hdcp.c  |  44 ++--  drivers/misc/mei/hdcp/mei_hdcp.h  |
> 354 -----------------------------  include/drm/i915_hdcp_interface.h | 355
> ++++++++++++++++++++++++++++++
>  3 files changed, 377 insertions(+), 376 deletions(-)
> 
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> index b2c49599809c..a262e1fa3b48 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> @@ -52,7 +52,7 @@ mei_hdcp_initiate_session(struct device *dev, struct
> hdcp_port_data *data,
> 
>  	session_init_in.header.api_version = HDCP_API_VERSION;
>  	session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
> -	session_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	session_init_in.header.buffer_len =
> 
> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> 
> @@ -75,7 +75,7 @@ mei_hdcp_initiate_session(struct device *dev, struct
> hdcp_port_data *data,
>  		return byte;
>  	}
> 
> -	if (session_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
>  			WIRED_INITIATE_HDCP2_SESSION,
>  			session_init_out.header.status);
> @@ -122,7 +122,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device
> *dev,
> 
>  	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
>  	verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT;
> -	verify_rxcert_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	verify_rxcert_in.header.buffer_len =
> 
> 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> 
> @@ -148,7 +148,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device
> *dev,
>  		return byte;
>  	}
> 
> -	if (verify_rxcert_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
>  			WIRED_VERIFY_RECEIVER_CERT,
>  			verify_rxcert_out.header.status);
> @@ -194,7 +194,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct
> hdcp_port_data *data,
> 
>  	send_hprime_in.header.api_version = HDCP_API_VERSION;
>  	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
> -	send_hprime_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	send_hprime_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> 
>  	send_hprime_in.port.integrated_port_type = data->port_type; @@ -218,7
> +218,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data
> *data,
>  		return byte;
>  	}
> 
> -	if (send_hprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n",
>  			WIRED_AKE_SEND_HPRIME,
> send_hprime_out.header.status);
>  		return -EIO;
> @@ -251,7 +251,7 @@ mei_hdcp_store_pairing_info(struct device *dev, struct
> hdcp_port_data *data,
> 
>  	pairing_info_in.header.api_version = HDCP_API_VERSION;
>  	pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
> -	pairing_info_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	pairing_info_in.header.buffer_len =
> 
> 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> 
> @@ -276,7 +276,7 @@ mei_hdcp_store_pairing_info(struct device *dev, struct
> hdcp_port_data *data,
>  		return byte;
>  	}
> 
> -	if (pairing_info_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X failed. Status: 0x%X\n",
>  			WIRED_AKE_SEND_PAIRING_INFO,
>  			pairing_info_out.header.status);
> @@ -311,7 +311,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
> 
>  	lc_init_in.header.api_version = HDCP_API_VERSION;
>  	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
> -	lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	lc_init_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> 
>  	lc_init_in.port.integrated_port_type = data->port_type; @@ -330,7 +330,7
> @@ mei_hdcp_initiate_locality_check(struct device *dev,
>  		return byte;
>  	}
> 
> -	if (lc_init_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X Failed. status: 0x%X\n",
>  			WIRED_INIT_LOCALITY_CHECK, lc_init_out.header.status);
>  		return -EIO;
> @@ -366,7 +366,7 @@ mei_hdcp_verify_lprime(struct device *dev, struct
> hdcp_port_data *data,
> 
>  	verify_lprime_in.header.api_version = HDCP_API_VERSION;
>  	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
> -	verify_lprime_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	verify_lprime_in.header.buffer_len =
> 
> 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> 
> @@ -391,7 +391,7 @@ mei_hdcp_verify_lprime(struct device *dev, struct
> hdcp_port_data *data,
>  		return byte;
>  	}
> 
> -	if (verify_lprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>  			WIRED_VALIDATE_LOCALITY,
>  			verify_lprime_out.header.status);
> @@ -425,7 +425,7 @@ static int mei_hdcp_get_session_key(struct device *dev,
> 
>  	get_skey_in.header.api_version = HDCP_API_VERSION;
>  	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
> -	get_skey_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	get_skey_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> 
>  	get_skey_in.port.integrated_port_type = data->port_type; @@ -445,7
> +445,7 @@ static int mei_hdcp_get_session_key(struct device *dev,
>  		return byte;
>  	}
> 
> -	if (get_skey_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>  			WIRED_GET_SESSION_KEY, get_skey_out.header.status);
>  		return -EIO;
> @@ -489,7 +489,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device
> *dev,
> 
>  	verify_repeater_in.header.api_version = HDCP_API_VERSION;
>  	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
> -	verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	verify_repeater_in.header.buffer_len =
> 
> 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> 
> @@ -520,7 +520,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device
> *dev,
>  		return byte;
>  	}
> 
> -	if (verify_repeater_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (verify_repeater_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>  			WIRED_VERIFY_REPEATER,
>  			verify_repeater_out.header.status);
> @@ -568,7 +568,7 @@ static int mei_hdcp_verify_mprime(struct device *dev,
> 
>  	verify_mprime_in->header.api_version = HDCP_API_VERSION;
>  	verify_mprime_in->header.command_id =
> WIRED_REPEATER_AUTH_STREAM_REQ;
> -	verify_mprime_in->header.status = ME_HDCP_STATUS_SUCCESS;
> +	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
>  	verify_mprime_in->header.buffer_len = cmd_size  - sizeof(verify_mprime_in-
> >header);
> 
>  	verify_mprime_in->port.integrated_port_type = data->port_type; @@ -
> 597,7 +597,7 @@ static int mei_hdcp_verify_mprime(struct device *dev,
>  		return byte;
>  	}
> 
> -	if (verify_mprime_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (verify_mprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>  			WIRED_REPEATER_AUTH_STREAM_REQ,
>  			verify_mprime_out.header.status);
> @@ -630,7 +630,7 @@ static int mei_hdcp_enable_authentication(struct device
> *dev,
> 
>  	enable_auth_in.header.api_version = HDCP_API_VERSION;
>  	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
> -	enable_auth_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	enable_auth_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> 
>  	enable_auth_in.port.integrated_port_type = data->port_type; @@ -652,7
> +652,7 @@ static int mei_hdcp_enable_authentication(struct device *dev,
>  		return byte;
>  	}
> 
> -	if (enable_auth_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "ME cmd 0x%08X failed. status: 0x%X\n",
>  			WIRED_ENABLE_AUTH, enable_auth_out.header.status);
>  		return -EIO;
> @@ -684,7 +684,7 @@ mei_hdcp_close_session(struct device *dev, struct
> hdcp_port_data *data)
> 
>  	session_close_in.header.api_version = HDCP_API_VERSION;
>  	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
> -	session_close_in.header.status = ME_HDCP_STATUS_SUCCESS;
> +	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
>  	session_close_in.header.buffer_len =
>  				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> 
> @@ -706,7 +706,7 @@ mei_hdcp_close_session(struct device *dev, struct
> hdcp_port_data *data)
>  		return byte;
>  	}
> 
> -	if (session_close_out.header.status != ME_HDCP_STATUS_SUCCESS) {
> +	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS) {
>  		dev_dbg(dev, "Session Close Failed. status: 0x%X\n",
>  			session_close_out.header.status);
>  		return -EIO;
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.h b/drivers/misc/mei/hdcp/mei_hdcp.h
> index ca09c8f83d6b..0683d83ec17a 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.h
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.h
> @@ -11,358 +11,4 @@
> 
>  #include <drm/display/drm_hdcp.h>
> 
> -/* me_hdcp_status: Enumeration of all HDCP Status Codes */ -enum
> me_hdcp_status {
> -	ME_HDCP_STATUS_SUCCESS			= 0x0000,
> -
> -	/* WiDi Generic Status Codes */
> -	ME_HDCP_STATUS_INTERNAL_ERROR		= 0x1000,
> -	ME_HDCP_STATUS_UNKNOWN_ERROR		= 0x1001,
> -	ME_HDCP_STATUS_INCORRECT_API_VERSION	= 0x1002,
> -	ME_HDCP_STATUS_INVALID_FUNCTION		= 0x1003,
> -	ME_HDCP_STATUS_INVALID_BUFFER_LENGTH	= 0x1004,
> -	ME_HDCP_STATUS_INVALID_PARAMS		= 0x1005,
> -	ME_HDCP_STATUS_AUTHENTICATION_FAILED	= 0x1006,
> -
> -	/* WiDi Status Codes */
> -	ME_HDCP_INVALID_SESSION_STATE		= 0x6000,
> -	ME_HDCP_SRM_FRAGMENT_UNEXPECTED		= 0x6001,
> -	ME_HDCP_SRM_INVALID_LENGTH		= 0x6002,
> -	ME_HDCP_SRM_FRAGMENT_OFFSET_INVALID	= 0x6003,
> -	ME_HDCP_SRM_VERIFICATION_FAILED		= 0x6004,
> -	ME_HDCP_SRM_VERSION_TOO_OLD		= 0x6005,
> -	ME_HDCP_RX_CERT_VERIFICATION_FAILED	= 0x6006,
> -	ME_HDCP_RX_REVOKED			= 0x6007,
> -	ME_HDCP_H_VERIFICATION_FAILED		= 0x6008,
> -	ME_HDCP_REPEATER_CHECK_UNEXPECTED	= 0x6009,
> -	ME_HDCP_TOPOLOGY_MAX_EXCEEDED		= 0x600A,
> -	ME_HDCP_V_VERIFICATION_FAILED		= 0x600B,
> -	ME_HDCP_L_VERIFICATION_FAILED		= 0x600C,
> -	ME_HDCP_STREAM_KEY_ALLOC_FAILED		= 0x600D,
> -	ME_HDCP_BASE_KEY_RESET_FAILED		= 0x600E,
> -	ME_HDCP_NONCE_GENERATION_FAILED		= 0x600F,
> -	ME_HDCP_STATUS_INVALID_E_KEY_STATE	= 0x6010,
> -	ME_HDCP_STATUS_INVALID_CS_ICV		= 0x6011,
> -	ME_HDCP_STATUS_INVALID_KB_KEY_STATE	= 0x6012,
> -	ME_HDCP_STATUS_INVALID_PAVP_MODE_ICV	= 0x6013,
> -	ME_HDCP_STATUS_INVALID_PAVP_MODE	= 0x6014,
> -	ME_HDCP_STATUS_LC_MAX_ATTEMPTS		= 0x6015,
> -
> -	/* New status for HDCP 2.1 */
> -	ME_HDCP_STATUS_MISMATCH_IN_M		= 0x6016,
> -
> -	/* New status code for HDCP 2.2 Rx */
> -	ME_HDCP_STATUS_RX_PROV_NOT_ALLOWED	= 0x6017,
> -	ME_HDCP_STATUS_RX_PROV_WRONG_SUBJECT	= 0x6018,
> -	ME_HDCP_RX_NEEDS_PROVISIONING		= 0x6019,
> -	ME_HDCP_BKSV_ICV_AUTH_FAILED		= 0x6020,
> -	ME_HDCP_STATUS_INVALID_STREAM_ID	= 0x6021,
> -	ME_HDCP_STATUS_CHAIN_NOT_INITIALIZED	= 0x6022,
> -	ME_HDCP_FAIL_NOT_EXPECTED		= 0x6023,
> -	ME_HDCP_FAIL_HDCP_OFF			= 0x6024,
> -	ME_HDCP_FAIL_INVALID_PAVP_MEMORY_MODE	= 0x6025,
> -	ME_HDCP_FAIL_AES_ECB_FAILURE		= 0x6026,
> -	ME_HDCP_FEATURE_NOT_SUPPORTED		= 0x6027,
> -	ME_HDCP_DMA_READ_ERROR			= 0x6028,
> -	ME_HDCP_DMA_WRITE_ERROR			= 0x6029,
> -	ME_HDCP_FAIL_INVALID_PACKET_SIZE	= 0x6030,
> -	ME_HDCP_H264_PARSING_ERROR		= 0x6031,
> -	ME_HDCP_HDCP2_ERRATA_VIDEO_VIOLATION	= 0x6032,
> -	ME_HDCP_HDCP2_ERRATA_AUDIO_VIOLATION	= 0x6033,
> -	ME_HDCP_TX_ACTIVE_ERROR			= 0x6034,
> -	ME_HDCP_MODE_CHANGE_ERROR		= 0x6035,
> -	ME_HDCP_STREAM_TYPE_ERROR		= 0x6036,
> -	ME_HDCP_STREAM_MANAGE_NOT_POSSIBLE	= 0x6037,
> -
> -	ME_HDCP_STATUS_PORT_INVALID_COMMAND	= 0x6038,
> -	ME_HDCP_STATUS_UNSUPPORTED_PROTOCOL	= 0x6039,
> -	ME_HDCP_STATUS_INVALID_PORT_INDEX	= 0x603a,
> -	ME_HDCP_STATUS_TX_AUTH_NEEDED		= 0x603b,
> -	ME_HDCP_STATUS_NOT_INTEGRATED_PORT	= 0x603c,
> -	ME_HDCP_STATUS_SESSION_MAX_REACHED	= 0x603d,
> -
> -	/* hdcp capable bit is not set in rx_caps(error is unique to DP) */
> -	ME_HDCP_STATUS_NOT_HDCP_CAPABLE		= 0x6041,
> -
> -	ME_HDCP_STATUS_INVALID_STREAM_COUNT	= 0x6042,
> -};
> -
> -#define HDCP_API_VERSION				0x00010000
> -
> -#define HDCP_M_LEN					16
> -#define HDCP_KH_LEN					16
> -
> -/* Payload Buffer size(Excluding Header) for CMDs and corresponding response */
> -/* Wired_Tx_AKE  */
> -#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN	(4 + 1)
> -#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_OUT	(4 + 8 + 3)
> -
> -#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN	(4 + 522 +
> 8 + 3)
> -#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MIN_OUT	(4
> + 1 + 3 + 16 + 16)
> -#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MAX_OUT	(4
> + 1 + 3 + 128)
> -
> -#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN		(4 + 32)
> -#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_OUT		(4)
> -
> -#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN		(4
> + 16)
> -#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_OUT		(4)
> -
> -#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN		(4)
> -#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_OUT		(4)
> -
> -/* Wired_Tx_LC */
> -#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN	(4)
> -#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_OUT	(4 + 8)
> -
> -#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN		(4
> + 32)
> -#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_OUT		(4)
> -
> -/* Wired_Tx_SKE */
> -#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN		(4)
> -#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_OUT		(4
> + 16 + 8)
> -
> -/* Wired_Tx_SKE */
> -#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN		(4 + 1)
> -#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_OUT		(4)
> -
> -/* Wired_Tx_Repeater */
> -#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN		(4 + 2 + 3 +
> 16 + 155)
> -#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_OUT		(4
> + 1 + 16)
> -
> -#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_MIN_IN
> 	(4 + 3 + \
> -								32 + 2 + 2)
> -
> -#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_OUT
> 	(4)
> -
> -/* hdcp_command_id: Enumeration of all WIRED HDCP Command IDs */ -enum
> hdcp_command_id {
> -	_WIDI_COMMAND_BASE		= 0x00030000,
> -	WIDI_INITIATE_HDCP2_SESSION	= _WIDI_COMMAND_BASE,
> -	HDCP_GET_SRM_STATUS,
> -	HDCP_SEND_SRM_FRAGMENT,
> -
> -	/* The wired HDCP Tx commands */
> -	_WIRED_COMMAND_BASE		= 0x00031000,
> -	WIRED_INITIATE_HDCP2_SESSION	= _WIRED_COMMAND_BASE,
> -	WIRED_VERIFY_RECEIVER_CERT,
> -	WIRED_AKE_SEND_HPRIME,
> -	WIRED_AKE_SEND_PAIRING_INFO,
> -	WIRED_INIT_LOCALITY_CHECK,
> -	WIRED_VALIDATE_LOCALITY,
> -	WIRED_GET_SESSION_KEY,
> -	WIRED_ENABLE_AUTH,
> -	WIRED_VERIFY_REPEATER,
> -	WIRED_REPEATER_AUTH_STREAM_REQ,
> -	WIRED_CLOSE_SESSION,
> -
> -	_WIRED_COMMANDS_COUNT,
> -};
> -
> -union encrypted_buff {
> -	u8		e_kpub_km[HDCP_2_2_E_KPUB_KM_LEN];
> -	u8		e_kh_km_m[HDCP_2_2_E_KH_KM_M_LEN];
> -	struct {
> -		u8	e_kh_km[HDCP_KH_LEN];
> -		u8	m[HDCP_M_LEN];
> -	} __packed;
> -};
> -
> -/* HDCP HECI message header. All header values are little endian. */ -struct
> hdcp_cmd_header {
> -	u32			api_version;
> -	u32			command_id;
> -	enum me_hdcp_status	status;
> -	/* Length of the HECI message (excluding the header) */
> -	u32			buffer_len;
> -} __packed;
> -
> -/* Empty command request or response. No data follows the header. */ -struct
> hdcp_cmd_no_data {
> -	struct hdcp_cmd_header header;
> -} __packed;
> -
> -/* Uniquely identifies the hdcp port being addressed for a given command. */ -
> struct hdcp_port_id {
> -	u8	integrated_port_type;
> -	/* physical_port is used until Gen11.5. Must be zero for Gen11.5+ */
> -	u8	physical_port;
> -	/* attached_transcoder is for Gen11.5+. Set to zero for <Gen11.5 */
> -	u8	attached_transcoder;
> -	u8	reserved;
> -} __packed;
> -
> -/*
> - * Data structures for integrated wired HDCP2 Tx in
> - * support of the AKE protocol
> - */
> -/* HECI struct for integrated wired HDCP Tx session initiation. */ -struct
> wired_cmd_initiate_hdcp2_session_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			protocol; /* for HDMI vs DP */
> -} __packed;
> -
> -struct wired_cmd_initiate_hdcp2_session_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			r_tx[HDCP_2_2_RTX_LEN];
> -	struct hdcp2_tx_caps	tx_caps;
> -} __packed;
> -
> -/* HECI struct for ending an integrated wired HDCP Tx session. */ -struct
> wired_cmd_close_session_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -struct wired_cmd_close_session_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -/* HECI struct for integrated wired HDCP Tx Rx Cert verification. */ -struct
> wired_cmd_verify_receiver_cert_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	struct hdcp2_cert_rx	cert_rx;
> -	u8			r_rx[HDCP_2_2_RRX_LEN];
> -	u8			rx_caps[HDCP_2_2_RXCAPS_LEN];
> -} __packed;
> -
> -struct wired_cmd_verify_receiver_cert_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			km_stored;
> -	u8			reserved[3];
> -	union encrypted_buff	ekm_buff;
> -} __packed;
> -
> -/* HECI struct for verification of Rx's Hprime in a HDCP Tx session */ -struct
> wired_cmd_ake_send_hprime_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			h_prime[HDCP_2_2_H_PRIME_LEN];
> -} __packed;
> -
> -struct wired_cmd_ake_send_hprime_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -/*
> - * HECI struct for sending in AKE pairing data generated by the Rx in an
> - * integrated wired HDCP Tx session.
> - */
> -struct wired_cmd_ake_send_pairing_info_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			e_kh_km[HDCP_2_2_E_KH_KM_LEN];
> -} __packed;
> -
> -struct wired_cmd_ake_send_pairing_info_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -/* Data structures for integrated wired HDCP2 Tx in support of the LC protocol*/
> -/*
> - * HECI struct for initiating locality check with an
> - * integrated wired HDCP Tx session.
> - */
> -struct wired_cmd_init_locality_check_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -struct wired_cmd_init_locality_check_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			r_n[HDCP_2_2_RN_LEN];
> -} __packed;
> -
> -/*
> - * HECI struct for validating an Rx's LPrime value in an
> - * integrated wired HDCP Tx session.
> - */
> -struct wired_cmd_validate_locality_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			l_prime[HDCP_2_2_L_PRIME_LEN];
> -} __packed;
> -
> -struct wired_cmd_validate_locality_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -/*
> - * Data structures for integrated wired HDCP2 Tx in support of the
> - * SKE protocol
> - */
> -/* HECI struct for creating session key */ -struct wired_cmd_get_session_key_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -struct wired_cmd_get_session_key_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			e_dkey_ks[HDCP_2_2_E_DKEY_KS_LEN];
> -	u8			r_iv[HDCP_2_2_RIV_LEN];
> -} __packed;
> -
> -/* HECI struct for the Tx enable authentication command */ -struct
> wired_cmd_enable_auth_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			stream_type;
> -} __packed;
> -
> -struct wired_cmd_enable_auth_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
> -
> -/*
> - * Data structures for integrated wired HDCP2 Tx in support of
> - * the repeater protocols
> - */
> -/*
> - * HECI struct for verifying the downstream repeater's HDCP topology in an
> - * integrated wired HDCP Tx session.
> - */
> -struct wired_cmd_verify_repeater_in {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			rx_info[HDCP_2_2_RXINFO_LEN];
> -	u8			seq_num_v[HDCP_2_2_SEQ_NUM_LEN];
> -	u8			v_prime[HDCP_2_2_V_PRIME_HALF_LEN];
> -	u8			receiver_ids[HDCP_2_2_RECEIVER_IDS_MAX_LEN];
> -} __packed;
> -
> -struct wired_cmd_verify_repeater_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -	u8			content_type_supported;
> -	u8			v[HDCP_2_2_V_PRIME_HALF_LEN];
> -} __packed;
> -
> -/*
> - * HECI struct in support of stream management in an
> - * integrated wired HDCP Tx session.
> - */
> -struct wired_cmd_repeater_auth_stream_req_in {
> -	struct hdcp_cmd_header		header;
> -	struct hdcp_port_id		port;
> -	u8				seq_num_m[HDCP_2_2_SEQ_NUM_LEN];
> -	u8				m_prime[HDCP_2_2_MPRIME_LEN];
> -	__be16				k;
> -	struct hdcp2_streamid_type	streams[];
> -} __packed;
> -
> -struct wired_cmd_repeater_auth_stream_req_out {
> -	struct hdcp_cmd_header	header;
> -	struct hdcp_port_id	port;
> -} __packed;
>  #endif /* __MEI_HDCP_H__ */
> diff --git a/include/drm/i915_hdcp_interface.h b/include/drm/i915_hdcp_interface.h
> index 75c75f52ab1b..004412040909 100644
> --- a/include/drm/i915_hdcp_interface.h
> +++ b/include/drm/i915_hdcp_interface.h
> @@ -181,4 +181,359 @@ struct i915_hdcp_master {
>  	struct mutex mutex;
>  };
> 
> +/* fw_hdcp_status: Enumeration of all HDCP Status Codes */ enum
> +fw_hdcp_status {
> +	FW_HDCP_STATUS_SUCCESS			= 0x0000,
> +
> +	/* WiDi Generic Status Codes */
> +	FW_HDCP_STATUS_INTERNAL_ERROR		= 0x1000,
> +	FW_HDCP_STATUS_UNKNOWN_ERROR		= 0x1001,
> +	FW_HDCP_STATUS_INCORRECT_API_VERSION	= 0x1002,
> +	FW_HDCP_STATUS_INVALID_FUNCTION		= 0x1003,
> +	FW_HDCP_STATUS_INVALID_BUFFER_LENGTH	= 0x1004,
> +	FW_HDCP_STATUS_INVALID_PARAMS		= 0x1005,
> +	FW_HDCP_STATUS_AUTHENTICATION_FAILED	= 0x1006,
> +
> +	/* WiDi Status Codes */
> +	FW_HDCP_INVALID_SESSION_STATE		= 0x6000,
> +	FW_HDCP_SRM_FRAGMENT_UNEXPECTED		= 0x6001,
> +	FW_HDCP_SRM_INVALID_LENGTH		= 0x6002,
> +	FW_HDCP_SRM_FRAGMENT_OFFSET_INVALID	= 0x6003,
> +	FW_HDCP_SRM_VERIFICATION_FAILED		= 0x6004,
> +	FW_HDCP_SRM_VERSION_TOO_OLD		= 0x6005,
> +	FW_HDCP_RX_CERT_VERIFICATION_FAILED	= 0x6006,
> +	FW_HDCP_RX_REVOKED			= 0x6007,
> +	FW_HDCP_H_VERIFICATION_FAILED		= 0x6008,
> +	FW_HDCP_REPEATER_CHECK_UNEXPECTED	= 0x6009,
> +	FW_HDCP_TOPOLOGY_MAX_EXCEEDED		= 0x600A,
> +	FW_HDCP_V_VERIFICATION_FAILED		= 0x600B,
> +	FW_HDCP_L_VERIFICATION_FAILED		= 0x600C,
> +	FW_HDCP_STREAM_KEY_ALLOC_FAILED		= 0x600D,
> +	FW_HDCP_BASE_KEY_RESET_FAILED		= 0x600E,
> +	FW_HDCP_NONCE_GENERATION_FAILED		= 0x600F,
> +	FW_HDCP_STATUS_INVALID_E_KEY_STATE	= 0x6010,
> +	FW_HDCP_STATUS_INVALID_CS_ICV		= 0x6011,
> +	FW_HDCP_STATUS_INVALID_KB_KEY_STATE	= 0x6012,
> +	FW_HDCP_STATUS_INVALID_PAVP_MODE_ICV	= 0x6013,
> +	FW_HDCP_STATUS_INVALID_PAVP_MODE	= 0x6014,
> +	FW_HDCP_STATUS_LC_MAX_ATTEMPTS		= 0x6015,
> +
> +	/* New status for HDCP 2.1 */
> +	FW_HDCP_STATUS_MISMATCH_IN_M		= 0x6016,
> +
> +	/* New status code for HDCP 2.2 Rx */
> +	FW_HDCP_STATUS_RX_PROV_NOT_ALLOWED	= 0x6017,
> +	FW_HDCP_STATUS_RX_PROV_WRONG_SUBJECT	= 0x6018,
> +	FW_HDCP_RX_NEEDS_PROVISIONING		= 0x6019,
> +	FW_HDCP_BKSV_ICV_AUTH_FAILED		= 0x6020,
> +	FW_HDCP_STATUS_INVALID_STREAM_ID	= 0x6021,
> +	FW_HDCP_STATUS_CHAIN_NOT_INITIALIZED	= 0x6022,
> +	FW_HDCP_FAIL_NOT_EXPECTED		= 0x6023,
> +	FW_HDCP_FAIL_HDCP_OFF			= 0x6024,
> +	FW_HDCP_FAIL_INVALID_PAVP_MEMORY_MODE	= 0x6025,
> +	FW_HDCP_FAIL_AES_ECB_FAILURE		= 0x6026,
> +	FW_HDCP_FEATURE_NOT_SUPPORTED		= 0x6027,
> +	FW_HDCP_DMA_READ_ERROR			= 0x6028,
> +	FW_HDCP_DMA_WRITE_ERROR			= 0x6029,
> +	FW_HDCP_FAIL_INVALID_PACKET_SIZE	= 0x6030,
> +	FW_HDCP_H264_PARSING_ERROR		= 0x6031,
> +	FW_HDCP_HDCP2_ERRATA_VIDEO_VIOLATION	= 0x6032,
> +	FW_HDCP_HDCP2_ERRATA_AUDIO_VIOLATION	= 0x6033,
> +	FW_HDCP_TX_ACTIVE_ERROR			= 0x6034,
> +	FW_HDCP_MODE_CHANGE_ERROR		= 0x6035,
> +	FW_HDCP_STREAM_TYPE_ERROR		= 0x6036,
> +	FW_HDCP_STREAM_MANAGE_NOT_POSSIBLE	= 0x6037,
> +
> +	FW_HDCP_STATUS_PORT_INVALID_COMMAND	= 0x6038,
> +	FW_HDCP_STATUS_UNSUPPORTED_PROTOCOL	= 0x6039,
> +	FW_HDCP_STATUS_INVALID_PORT_INDEX	= 0x603a,
> +	FW_HDCP_STATUS_TX_AUTH_NEEDED		= 0x603b,
> +	FW_HDCP_STATUS_NOT_INTEGRATED_PORT	= 0x603c,
> +	FW_HDCP_STATUS_SESSION_MAX_REACHED	= 0x603d,
> +
> +	/* hdcp capable bit is not set in rx_caps(error is unique to DP) */
> +	FW_HDCP_STATUS_NOT_HDCP_CAPABLE		= 0x6041,
> +
> +	FW_HDCP_STATUS_INVALID_STREAM_COUNT	= 0x6042,
> +};
> +
> +#define HDCP_API_VERSION				0x00010000
> +
> +#define HDCP_M_LEN					16
> +#define HDCP_KH_LEN					16
> +
> +/* Payload Buffer size(Excluding Header) for CMDs and corresponding
> +response */
> +/* Wired_Tx_AKE  */
> +#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN	(4 + 1)
> +#define	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_OUT	(4 + 8 + 3)
> +
> +#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN	(4 + 522 +
> 8 + 3)
> +#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MIN_OUT	(4
> + 1 + 3 + 16 + 16)
> +#define	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_MAX_OUT	(4
> + 1 + 3 + 128)
> +
> +#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN		(4 + 32)
> +#define	WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_OUT		(4)
> +
> +#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN		(4
> + 16)
> +#define	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_OUT		(4)
> +
> +#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN		(4)
> +#define	WIRED_CMD_BUF_LEN_CLOSE_SESSION_OUT		(4)
> +
> +/* Wired_Tx_LC */
> +#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN	(4)
> +#define	WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_OUT	(4 + 8)
> +
> +#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN		(4
> + 32)
> +#define	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_OUT		(4)
> +
> +/* Wired_Tx_SKE */
> +#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN		(4)
> +#define	WIRED_CMD_BUF_LEN_GET_SESSION_KEY_OUT		(4
> + 16 + 8)
> +
> +/* Wired_Tx_SKE */
> +#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN		(4 + 1)
> +#define	WIRED_CMD_BUF_LEN_ENABLE_AUTH_OUT		(4)
> +
> +/* Wired_Tx_Repeater */
> +#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN		(4 + 2 + 3 +
> 16 + 155)
> +#define	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_OUT		(4
> + 1 + 16)
> +
> +#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_MIN_IN
> 	(4 + 3 + \
> +								32 + 2 + 2)
> +
> +#define	WIRED_CMD_BUF_LEN_REPEATER_AUTH_STREAM_REQ_OUT
> 	(4)
> +
> +/* hdcp_command_id: Enumeration of all WIRED HDCP Command IDs */ enum
> +hdcp_command_id {
> +	_WIDI_COMMAND_BASE		= 0x00030000,
> +	WIDI_INITIATE_HDCP2_SESSION	= _WIDI_COMMAND_BASE,
> +	HDCP_GET_SRM_STATUS,
> +	HDCP_SEND_SRM_FRAGMENT,
> +
> +	/* The wired HDCP Tx commands */
> +	_WIRED_COMMAND_BASE		= 0x00031000,
> +	WIRED_INITIATE_HDCP2_SESSION	= _WIRED_COMMAND_BASE,
> +	WIRED_VERIFY_RECEIVER_CERT,
> +	WIRED_AKE_SEND_HPRIME,
> +	WIRED_AKE_SEND_PAIRING_INFO,
> +	WIRED_INIT_LOCALITY_CHECK,
> +	WIRED_VALIDATE_LOCALITY,
> +	WIRED_GET_SESSION_KEY,
> +	WIRED_ENABLE_AUTH,
> +	WIRED_VERIFY_REPEATER,
> +	WIRED_REPEATER_AUTH_STREAM_REQ,
> +	WIRED_CLOSE_SESSION,
> +
> +	_WIRED_COMMANDS_COUNT,
> +};
> +
> +union encrypted_buff {
> +	u8		e_kpub_km[HDCP_2_2_E_KPUB_KM_LEN];
> +	u8		e_kh_km_m[HDCP_2_2_E_KH_KM_M_LEN];
> +	struct {
> +		u8	e_kh_km[HDCP_KH_LEN];
> +		u8	m[HDCP_M_LEN];
> +	} __packed;
> +};
> +
> +/* HDCP HECI message header. All header values are little endian. */
> +struct hdcp_cmd_header {
> +	u32			api_version;
> +	u32			command_id;
> +	enum fw_hdcp_status	status;
> +	/* Length of the HECI message (excluding the header) */
> +	u32			buffer_len;
> +} __packed;
> +
> +/* Empty command request or response. No data follows the header. */
> +struct hdcp_cmd_no_data {
> +	struct hdcp_cmd_header header;
> +} __packed;
> +
> +/* Uniquely identifies the hdcp port being addressed for a given
> +command. */ struct hdcp_port_id {
> +	u8	integrated_port_type;
> +	/* physical_port is used until Gen11.5. Must be zero for Gen11.5+ */
> +	u8	physical_port;
> +	/* attached_transcoder is for Gen11.5+. Set to zero for <Gen11.5 */
> +	u8	attached_transcoder;
> +	u8	reserved;
> +} __packed;
> +
> +/*
> + * Data structures for integrated wired HDCP2 Tx in
> + * support of the AKE protocol
> + */
> +/* HECI struct for integrated wired HDCP Tx session initiation. */
> +struct wired_cmd_initiate_hdcp2_session_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			protocol; /* for HDMI vs DP */
> +} __packed;
> +
> +struct wired_cmd_initiate_hdcp2_session_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			r_tx[HDCP_2_2_RTX_LEN];
> +	struct hdcp2_tx_caps	tx_caps;
> +} __packed;
> +
> +/* HECI struct for ending an integrated wired HDCP Tx session. */
> +struct wired_cmd_close_session_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +struct wired_cmd_close_session_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +/* HECI struct for integrated wired HDCP Tx Rx Cert verification. */
> +struct wired_cmd_verify_receiver_cert_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	struct hdcp2_cert_rx	cert_rx;
> +	u8			r_rx[HDCP_2_2_RRX_LEN];
> +	u8			rx_caps[HDCP_2_2_RXCAPS_LEN];
> +} __packed;
> +
> +struct wired_cmd_verify_receiver_cert_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			km_stored;
> +	u8			reserved[3];
> +	union encrypted_buff	ekm_buff;
> +} __packed;
> +
> +/* HECI struct for verification of Rx's Hprime in a HDCP Tx session */
> +struct wired_cmd_ake_send_hprime_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			h_prime[HDCP_2_2_H_PRIME_LEN];
> +} __packed;
> +
> +struct wired_cmd_ake_send_hprime_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +/*
> + * HECI struct for sending in AKE pairing data generated by the Rx in
> +an
> + * integrated wired HDCP Tx session.
> + */
> +struct wired_cmd_ake_send_pairing_info_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			e_kh_km[HDCP_2_2_E_KH_KM_LEN];
> +} __packed;
> +
> +struct wired_cmd_ake_send_pairing_info_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +/* Data structures for integrated wired HDCP2 Tx in support of the LC
> +protocol*/
> +/*
> + * HECI struct for initiating locality check with an
> + * integrated wired HDCP Tx session.
> + */
> +struct wired_cmd_init_locality_check_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +struct wired_cmd_init_locality_check_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			r_n[HDCP_2_2_RN_LEN];
> +} __packed;
> +
> +/*
> + * HECI struct for validating an Rx's LPrime value in an
> + * integrated wired HDCP Tx session.
> + */
> +struct wired_cmd_validate_locality_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			l_prime[HDCP_2_2_L_PRIME_LEN];
> +} __packed;
> +
> +struct wired_cmd_validate_locality_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +/*
> + * Data structures for integrated wired HDCP2 Tx in support of the
> + * SKE protocol
> + */
> +/* HECI struct for creating session key */ struct
> +wired_cmd_get_session_key_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +struct wired_cmd_get_session_key_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			e_dkey_ks[HDCP_2_2_E_DKEY_KS_LEN];
> +	u8			r_iv[HDCP_2_2_RIV_LEN];
> +} __packed;
> +
> +/* HECI struct for the Tx enable authentication command */ struct
> +wired_cmd_enable_auth_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			stream_type;
> +} __packed;
> +
> +struct wired_cmd_enable_auth_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
> +/*
> + * Data structures for integrated wired HDCP2 Tx in support of
> + * the repeater protocols
> + */
> +/*
> + * HECI struct for verifying the downstream repeater's HDCP topology in
> +an
> + * integrated wired HDCP Tx session.
> + */
> +struct wired_cmd_verify_repeater_in {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			rx_info[HDCP_2_2_RXINFO_LEN];
> +	u8			seq_num_v[HDCP_2_2_SEQ_NUM_LEN];
> +	u8			v_prime[HDCP_2_2_V_PRIME_HALF_LEN];
> +	u8			receiver_ids[HDCP_2_2_RECEIVER_IDS_MAX_LEN];
> +} __packed;
> +
> +struct wired_cmd_verify_repeater_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +	u8			content_type_supported;
> +	u8			v[HDCP_2_2_V_PRIME_HALF_LEN];
> +} __packed;
> +
> +/*
> + * HECI struct in support of stream management in an
> + * integrated wired HDCP Tx session.
> + */
> +struct wired_cmd_repeater_auth_stream_req_in {
> +	struct hdcp_cmd_header		header;
> +	struct hdcp_port_id		port;
> +	u8				seq_num_m[HDCP_2_2_SEQ_NUM_LEN];
> +	u8				m_prime[HDCP_2_2_MPRIME_LEN];
> +	__be16				k;
> +	struct hdcp2_streamid_type	streams[];
> +} __packed;
> +
> +struct wired_cmd_repeater_auth_stream_req_out {
> +	struct hdcp_cmd_header	header;
> +	struct hdcp_port_id	port;
> +} __packed;
> +
>  #endif /* _I915_HDCP_INTERFACE_H_ */
> --
> 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS Suraj Kandpal
@ 2023-03-06 12:32   ` Shankar, Uma
  2023-03-06 12:54     ` Kandpal, Suraj
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-06 12:32 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Teres Alexis, Alan Previn



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Wednesday, February 1, 2023 2:38 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>; Ceraolo Spurio, Daniele
> <daniele.ceraolospurio@intel.com>; Teres Alexis, Alan Previn
> <alan.previn.teres.alexis@intel.com>; Shankar, Uma <uma.shankar@intel.com>;
> Gupta, Anshuman <anshuman.gupta@intel.com>
> Subject: [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS
> 
> Add function that takes care of sending command to gsc cs. We start of with
> allocation of memory for our command intel_hdcp_gsc_message that contains gsc
> cs memory header as directed in specs followed by the actual payload hdcp message
> that we want to send.
> Spec states that we need to poll pending bit of response header around
> 20 times each try being 50ms apart hence adding that to current gsc_msg_send
> function Also we use the same function to take care of both sending and receiving
> hence no separate function to get the response.
> 
> --v4
> -Create common function to fill in gsc_mtl_header [Alan] -define host session
> bitmask [Alan]
> 
> --v5
> -use i915 directly instead of gt->i915 [Alan] -No need to make fields NULL as we are
> already using kzalloc [Alan]
> 
> --v8
> -change mechanism to reuse the same memory for one hdcp session[Alan] -fix
> header ordering -add comments to explain flags and host session mask [Alan]
> 
> --v9
> -remove gem obj from hdcp message as we can use i915_vma_unpin_and_release
> [Alan] -move hdcp message allocation and deallocation from hdcp2_enable and
> hdcp2_disable to init and teardown of HDCP [Alan]
> 
> --v10
> -remove unnecessary i915_vma_unpin [Alan]
> 
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Alan Pervin Teres <alan.previn.teres.alexis@intel.com>
> Cc: Uma Shankar <uma.shankar@intel.com>
> Cc: Anshuman Gupta <anshuman.gupta@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
> ---
>  drivers/gpu/drm/i915/Makefile                 |   1 +
>  .../gpu/drm/i915/display/intel_display_core.h |   5 +
>  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 198 ++++++++++++++++++
> drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  23 ++
> .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c |  15 ++
> .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h |  16 ++
>  6 files changed, 258 insertions(+)
>  create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
>  create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index
> 482928cffb1c..ba76bec715af 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -255,6 +255,7 @@ i915-y += \
>  	display/intel_frontbuffer.o \
>  	display/intel_global_state.o \
>  	display/intel_hdcp.o \
> +	display/intel_hdcp_gsc.o \
>  	display/intel_hotplug.o \
>  	display/intel_hti.o \
>  	display/intel_lpe_audio.o \
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 139100fe2383..20d2a79a5d05 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -382,6 +382,11 @@ struct intel_display {
>  		struct i915_hdcp_master *master;
>  		bool comp_added;
> 
> +		/*HDCP message struct for allocation of memory which can be
> reused

Fix Comment style.

> +		 * when sending message to gsc cs
> +		 * this is only populated post Meteorlake
> +		 */
> +		struct intel_hdcp_gsc_message *hdcp_message;
>  		/* Mutex to protect the above hdcp component related values. */
>  		struct mutex comp_mutex;
>  	} hdcp;
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> new file mode 100644
> index 000000000000..8e3b5e6733d7
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> @@ -0,0 +1,198 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright 2023, Intel Corporation.
> + */
> +
> +#include "display/intel_hdcp_gsc.h"
> +#include "gem/i915_gem_region.h"
> +#include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> +#include "i915_drv.h"
> +#include "i915_utils.h"
> +
> +/*This function helps allocate memory for the command that we will send
> +to gsc cs */ static int intel_hdcp_gsc_initialize_message(struct drm_i915_private
> *i915,
> +					     struct intel_hdcp_gsc_message
> *hdcp_message) {
> +	struct intel_gt *gt = i915->media_gt;
> +	struct drm_i915_gem_object *obj = NULL;
> +	struct i915_vma *vma = NULL;
> +	void *cmd;
> +	int err;
> +
> +	/* allocate object of one page for HDCP command memory and store it */
> +	obj = i915_gem_object_create_shmem(i915, PAGE_SIZE);
> +
> +	if (IS_ERR(obj)) {
> +		drm_err(&i915->drm, "Failed to allocate HDCP streaming
> command!\n");
> +		return PTR_ERR(obj);
> +	}
> +
> +	cmd = i915_gem_object_pin_map_unlocked(obj,
> i915_coherent_map_type(i915, obj, true));
> +	if (IS_ERR(cmd)) {
> +		drm_err(&i915->drm, "Failed to map gsc message page!\n");
> +		err = PTR_ERR(cmd);
> +		goto out_unpin;
> +	}
> +
> +	vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
> +	if (IS_ERR(vma)) {
> +		err = PTR_ERR(vma);
> +		goto out_unmap;
> +	}
> +
> +	err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
> +	if (err)
> +		goto out_unmap;
> +
> +	memset(cmd, 0, obj->base.size);
> +
> +	hdcp_message->hdcp_cmd = cmd;
> +	hdcp_message->vma = vma;
> +
> +	return 0;
> +
> +out_unmap:
> +	i915_gem_object_unpin_map(obj);
> +out_unpin:
> +	i915_gem_object_put(obj);
> +	return err;
> +}
> +
> +int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915) {
> +	struct intel_hdcp_gsc_message *hdcp_message;
> +	int ret;
> +
> +	hdcp_message = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
> +
> +	if (!hdcp_message)
> +		return -ENOMEM;
> +
> +	/* NOTE: No need to lock the comp mutex here as it is already

Fix Comment style.

> +	 * going to be taken before this function called
> +	 */
> +	i915->display.hdcp.hdcp_message = hdcp_message;
> +	ret = intel_hdcp_gsc_initialize_message(i915, hdcp_message);
> +
> +	if (ret)
> +		drm_err(&i915->drm, "Could not initialize hdcp_message\n");
> +
> +	return ret;
> +}
> +
> +void intel_hdcp_gsc_free_message(struct drm_i915_private *i915) {
> +	struct intel_hdcp_gsc_message *hdcp_message =
> +					i915->display.hdcp.hdcp_message;
> +
> +	i915_vma_unpin_and_release(&hdcp_message->vma,
> I915_VMA_RELEASE_MAP);
> +	kfree(hdcp_message);
> +}
> +
> +static int intel_gsc_send_sync(struct drm_i915_private *i915,
> +			       struct intel_gsc_mtl_header *header, u64 addr,
> +			       size_t msg_out_len)
> +{
> +	struct intel_gt *gt = i915->media_gt;
> +	int ret;
> +
> +	header->flags = 0;
> +	ret = intel_gsc_uc_heci_cmd_submit_packet(&gt->uc.gsc, addr,
> +						  header->message_size,
> +						  addr,
> +						  msg_out_len + sizeof(*header));
> +	if (ret) {
> +		drm_err(&i915->drm, "failed to send gsc HDCP msg (%d)\n", ret);
> +		return ret;
> +	}

Leave a line gap.

> +	/*
> +	 * Checking validity marker for memory sanity
> +	 */
> +	if (header->validity_marker != GSC_HECI_VALIDITY_MARKER) {
> +		drm_err(&i915->drm, "invalid validity marker\n");
> +		return -EINVAL;
> +	}
> +
> +	if (header->status != 0) {
> +		drm_err(&i915->drm, "header status indicates error %d\n",
> +			header->status);
> +		return -EINVAL;
> +	}
> +
> +	if (header->flags & GSC_OUTFLAG_MSG_PENDING)
> +		return -EAGAIN;
> +
> +	return 0;
> +}
> +
> +/*
> + * This function can now be used for sending requests and will also
> +handle
> + * receipt of reply messages hence no different function of message
> +retrieval
> + * is required. We will initialize intel_hdcp_gsc_message structure
> +then add
> + * gsc cs memory header as stated in specs after which the normal HDCP
> +payload
> + * will follow
> + */
> +ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
> +				size_t msg_in_len, u8 *msg_out, size_t
> msg_out_len) {
> +	struct intel_gt *gt = i915->media_gt;
> +	struct intel_gsc_mtl_header *header;
> +	const size_t max_msg_size = PAGE_SIZE - sizeof(*header);
> +	struct intel_hdcp_gsc_message *hdcp_message;
> +	u64 addr, host_session_id;
> +	u32 reply_size, msg_size;
> +	int ret, tries = 0;
> +
> +	if (!intel_uc_uses_gsc_uc(&gt->uc))
> +		return -ENODEV;
> +
> +	if (msg_in_len > max_msg_size || msg_out_len > max_msg_size)
> +		return -ENOSPC;
> +
> +	hdcp_message = i915->display.hdcp.hdcp_message;
> +	header = hdcp_message->hdcp_cmd;
> +	addr = i915_ggtt_offset(hdcp_message->vma);
> +
> +	msg_size = msg_in_len + sizeof(*header);
> +	memset(header, 0, msg_size);
> +	get_random_bytes(&host_session_id, sizeof(u64));
> +	intel_gsc_uc_heci_cmd_emit_mtl_header(header,
> HECI_MEADDRESS_HDCP,
> +					      msg_size, host_session_id);
> +	memcpy(hdcp_message->hdcp_cmd + sizeof(*header), msg_in, msg_in_len);
> +
> +	/*
> +	 * Keep sending request in case the pending bit is set no need to add
> +	 * message handle as we are using same address hence loc. of header is
> +	 * same and it will contain the message handle. we will send the message
> +	 * 20 times each message 50 ms apart
> +	 */
> +	do {
> +		ret = intel_gsc_send_sync(i915, header, addr, msg_out_len);
> +
> +		/* Only try again if gsc says so */
> +		if (ret != -EAGAIN)
> +			break;
> +
> +		msleep(50);
> +
> +	} while (++tries < 20);
> +
> +	if (ret)
> +		goto err;
> +
> +	/* we use the same mem for the reply, so header is in the same loc */
> +	reply_size = header->message_size - sizeof(*header);
> +	if (reply_size > msg_out_len) {
> +		drm_warn(&i915->drm, "caller with insufficient HDCP reply size %u
> (%d)\n",
> +			 reply_size, (u32)msg_out_len);
> +		reply_size = msg_out_len;
> +	} else if (reply_size != msg_out_len) {
> +		drm_dbg_kms(&i915->drm, "caller unexpected HCDP reply size %u
> (%d)\n",
> +			    reply_size, (u32)msg_out_len);
> +	}
> +
> +	memcpy(msg_out, hdcp_message->hdcp_cmd + sizeof(*header),
> +msg_out_len);
> +
> +err:
> +	return ret;
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> new file mode 100644
> index 000000000000..09ffd7ec02cd
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> @@ -0,0 +1,23 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#ifndef __INTEL_HDCP_GSC_H__
> +#define __INTEL_HDCP_GSC_H__
> +
> +#include <linux/err.h>
> +#include <linux/types.h>
> +
> +struct drm_i915_private;
> +
> +struct intel_hdcp_gsc_message {
> +	struct i915_vma *vma;
> +	void *hdcp_cmd;
> +};
> +
> +ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
> +				size_t msg_in_len, u8 *msg_out,
> +				size_t msg_out_len);
> +
> +#endif /* __INTEL_HDCP_GCS_H__ */
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> index be2424af521d..ea0da06e2f39 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> @@ -92,3 +92,18 @@ int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc
> *gsc, u64 addr_in,
> 
>  	return err;
>  }
> +
> +void intel_gsc_uc_heci_cmd_emit_mtl_header(struct intel_gsc_mtl_header
> *header,
> +					   u8 heci_client_id, u32 message_size,
> +					   u64 host_session_id)
> +{
> +	host_session_id &= ~HOST_SESSION_MASK;
> +	if (heci_client_id == HECI_MEADDRESS_PXP)
> +		host_session_id |= HOST_SESSION_PXP_SINGLE;
> +
> +	header->validity_marker = GSC_HECI_VALIDITY_MARKER;
> +	header->heci_client_id = heci_client_id;
> +	header->host_session_handle = host_session_id;
> +	header->header_version = MTL_GSC_HEADER_VERSION;
> +	header->message_size = message_size;
> +}
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> index cf610dfca7a5..3d56ae501991 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> @@ -22,7 +22,17 @@ struct intel_gsc_mtl_header {
>  	u16 header_version;
>  #define MTL_GSC_HEADER_VERSION 1
> 
> +	/*
> +	 * FW allows host to decide host_session handle
> +	 * as it sees fit.
> +	 * For intertracebility reserving select bits(60-63)
> +	 * to differentiate caller-target subsystem
> +	 * 0000 - HDCP
> +	 * 0001 - PXP Single Session
> +	 */
>  	u64 host_session_handle;
> +#define HOST_SESSION_MASK	REG_GENMASK64(63, 60)
> +#define HOST_SESSION_PXP_SINGLE BIT_ULL(60)
>  	u64 gsc_message_handle;
> 
>  	u32 message_size; /* lower 20 bits only, upper 12 are reserved */ @@ -33,8
> +43,11 @@ struct intel_gsc_mtl_header {
>  	 * Bit 1: Session Cleanup;
>  	 * Bits 2-15: Flags
>  	 * Bits 16-31: Extension Size
> +	 * According to internal spec flags are either input or output
> +	 * we distinguish the flags using OUTFLAG or INFLAG
>  	 */
>  	u32 flags;
> +#define GSC_OUTFLAG_MSG_PENDING	1
> 
>  	u32 status;
>  } __packed;
> @@ -42,4 +55,7 @@ struct intel_gsc_mtl_header {  int
> intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc,
>  					u64 addr_in, u32 size_in,
>  					u64 addr_out, u32 size_out);
> +void intel_gsc_uc_heci_cmd_emit_mtl_header(struct intel_gsc_mtl_header
> *header,
> +					   u8 heci_client_id, u32 message_size,
> +					   u64 host_session_id);
>  #endif
> --
> 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
@ 2023-03-06 12:34   ` Shankar, Uma
  2023-03-07  6:45     ` Shankar, Uma
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-06 12:34 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Wednesday, February 1, 2023 2:38 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> <suraj.kandpal@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>; Vivi,
> Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma <uma.shankar@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> 
> MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP commands to GSC
> f/w. It requires to keep hdcp display driver agnostic to content protection f/w
> (ME/GSC fw) in the form of i915_hdcp_fw_ops generic ops.
> 
> Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops generic ops
> instead of I915_HDCP_COMPONENT as integral part of i915.
> 
> Adding checks to see if GSC is loaded and proxy is setup
> 
> --v6
> -dont change the license date in same patch series [Jani] -fix the license year {Jani]
> 
> --v8
> -remove stale comment [Ankit]
> -get headers in alphabetical order [Ankit] -fix hdcp2_supported check [Ankit]
> 
> --v9
> -remove return statement from hdcp_gsc_fini [Ankit]

Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar@intel.com>

> Cc: Tomas Winkler <tomas.winkler@intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Uma Shankar <uma.shankar@intel.com>
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
>  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637 +++++++++++++++++-
>  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
>  3 files changed, 660 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 0d6aed1eb171..61bb2bbd0349 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -23,6 +23,7 @@
>  #include "intel_display_power_well.h"
>  #include "intel_display_types.h"
>  #include "intel_hdcp.h"
> +#include "intel_hdcp_gsc.h"
>  #include "intel_hdcp_regs.h"
>  #include "intel_pcode.h"
> 
> @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct intel_connector
> *connector)
>  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
>  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
>  	struct intel_hdcp *hdcp = &connector->hdcp;
> +	struct intel_gt *gt = dev_priv->media_gt;
> +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
>  	bool capable = false;
> 
>  	/* I915 support for HDCP2.2 */
>  	if (!hdcp->hdcp2_supported)
>  		return false;
> 
> -	/* MEI interface is solid */
> +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> +	if (intel_hdcp_gsc_cs_required(dev_priv))
> +		if (!intel_uc_fw_is_running(&gsc->fw))
> +			return false;
> +
> +	/* MEI/GSC interface is solid depending on which is used */
>  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
>  	if (!dev_priv->display.hdcp.comp_added ||  !dev_priv->display.hdcp.master)
> {
>  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> @@ -2235,6 +2243,9 @@ static int initialize_hdcp_port_data(struct intel_connector
> *connector,
> 
>  static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)  {
> +	if (intel_hdcp_gsc_cs_required(dev_priv))
> +		return true;
> +
>  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
>  		return false;
> 
> @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> drm_i915_private *dev_priv)
> 
>  	dev_priv->display.hdcp.comp_added = true;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> -	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> -				  I915_COMPONENT_HDCP);
> +	if (intel_hdcp_gsc_cs_required(dev_priv))
> +		ret = intel_hdcp_gsc_init(dev_priv);
> +	else
> +		ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> +					  I915_COMPONENT_HDCP);
> +
>  	if (ret < 0) {
> -		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
> +		drm_dbg_kms(&dev_priv->drm, "Failed at fw component
> add(%d)\n",
>  			    ret);
>  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
>  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7 +2501,10
> @@ void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
>  	dev_priv->display.hdcp.comp_added = false;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> 
> -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> +	if (intel_hdcp_gsc_cs_required(dev_priv))
> +		intel_hdcp_gsc_fini(dev_priv);
> +	else
> +		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
>  }
> 
>  void intel_hdcp_cleanup(struct intel_connector *connector) diff --git
> a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> index 8e3b5e6733d7..7eb1eeeb5a51 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> @@ -3,12 +3,617 @@
>   * Copyright 2023, Intel Corporation.
>   */
> 
> +#include <drm/i915_hdcp_interface.h>
> +
>  #include "display/intel_hdcp_gsc.h"
>  #include "gem/i915_gem_region.h"
>  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
>  #include "i915_drv.h"
>  #include "i915_utils.h"
> 
> +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> +	return DISPLAY_VER(i915) >= 14;
> +}
> +
> +static int
> +gsc_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
> +			  struct hdcp2_ake_init *ake_data)
> +{
> +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
> +	struct wired_cmd_initiate_hdcp2_session_out
> +						session_init_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !ake_data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	session_init_in.header.api_version = HDCP_API_VERSION;
> +	session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
> +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	session_init_in.header.buffer_len =
> +
> 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> +
> +	session_init_in.port.integrated_port_type = data->port_type;
> +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> +	session_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +	session_init_in.protocol = data->protocol;
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_init_in,
> +				       sizeof(session_init_in),
> +				       (u8 *)&session_init_out,
> +				       sizeof(session_init_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> 0x%X\n",
> +			    WIRED_INITIATE_HDCP2_SESSION,
> +			    session_init_out.header.status);
> +		return -EIO;
> +	}
> +
> +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> +	ake_data->tx_caps = session_init_out.tx_caps;
> +	memcpy(ake_data->r_tx, session_init_out.r_tx, HDCP_2_2_RTX_LEN);
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> +					 struct hdcp_port_data *data,
> +					 struct hdcp2_ake_send_cert *rx_cert,
> +					 bool *km_stored,
> +					 struct hdcp2_ake_no_stored_km
> +								*ek_pub_km,
> +					 size_t *msg_sz)
> +{
> +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
> +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km || !msg_sz)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> +	verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT;
> +	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	verify_rxcert_in.header.buffer_len =
> +
> 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> +
> +	verify_rxcert_in.port.integrated_port_type = data->port_type;
> +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> +	verify_rxcert_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
> +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> +HDCP_2_2_RXCAPS_LEN);
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_rxcert_in,
> +				       sizeof(verify_rxcert_in),
> +				       (u8 *)&verify_rxcert_out,
> +				       sizeof(verify_rxcert_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed:
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> 0x%X\n",
> +			    WIRED_VERIFY_RECEIVER_CERT,
> +			    verify_rxcert_out.header.status);
> +		return -EIO;
> +	}
> +
> +	*km_stored = !!verify_rxcert_out.km_stored;
> +	if (verify_rxcert_out.km_stored) {
> +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> +	} else {
> +		ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM;
> +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> +	}
> +
> +	memcpy(ek_pub_km->e_kpub_km, &verify_rxcert_out.ekm_buff,
> +	       sizeof(verify_rxcert_out.ekm_buff));
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
> +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
> +	struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !rx_hprime)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> +	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
> +	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	send_hprime_in.header.buffer_len =
> +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> +
> +	send_hprime_in.port.integrated_port_type = data->port_type;
> +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> +	send_hprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> +	       HDCP_2_2_H_PRIME_LEN);
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&send_hprime_in,
> +				       sizeof(send_hprime_in),
> +				       (u8 *)&send_hprime_out,
> +				       sizeof(send_hprime_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> 0x%X\n",
> +			    WIRED_AKE_SEND_HPRIME,
> send_hprime_out.header.status);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
> +			    struct hdcp2_ake_send_pairing_info *pairing_info) {
> +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 } };
> +	struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !pairing_info)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> +	pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
> +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	pairing_info_in.header.buffer_len =
> +
> 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> +
> +	pairing_info_in.port.integrated_port_type = data->port_type;
> +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> +	pairing_info_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> +	       HDCP_2_2_E_KH_KM_LEN);
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&pairing_info_in,
> +				       sizeof(pairing_info_in),
> +				       (u8 *)&pairing_info_out,
> +				       sizeof(pairing_info_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. Status:
> 0x%X\n",
> +			    WIRED_AKE_SEND_PAIRING_INFO,
> +			    pairing_info_out.header.status);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_initiate_locality_check(struct device *dev,
> +				 struct hdcp_port_data *data,
> +				 struct hdcp2_lc_init *lc_init_data) {
> +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !lc_init_data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	lc_init_in.header.api_version = HDCP_API_VERSION;
> +	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
> +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	lc_init_in.header.buffer_len =
> +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> +
> +	lc_init_in.port.integrated_port_type = data->port_type;
> +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in, sizeof(lc_init_in),
> +				       (u8 *)&lc_init_out, sizeof(lc_init_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. status:
> 0x%X\n",
> +			    WIRED_INIT_LOCALITY_CHECK,
> lc_init_out.header.status);
> +		return -EIO;
> +	}
> +
> +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> +	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
> +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> +	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
> +	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !rx_lprime)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> +	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
> +	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	verify_lprime_in.header.buffer_len =
> +
> 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> +
> +	verify_lprime_in.port.integrated_port_type = data->port_type;
> +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> +	verify_lprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> +	       HDCP_2_2_L_PRIME_LEN);
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_lprime_in,
> +				       sizeof(verify_lprime_in),
> +				       (u8 *)&verify_lprime_out,
> +				       sizeof(verify_lprime_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> 0x%X\n",
> +			    WIRED_VALIDATE_LOCALITY,
> +			    verify_lprime_out.header.status);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int gsc_hdcp_get_session_key(struct device *dev,
> +				    struct hdcp_port_data *data,
> +				    struct hdcp2_ske_send_eks *ske_data) {
> +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data || !ske_data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	get_skey_in.header.api_version = HDCP_API_VERSION;
> +	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
> +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	get_skey_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> +
> +	get_skey_in.port.integrated_port_type = data->port_type;
> +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> +	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> sizeof(get_skey_in),
> +				       (u8 *)&get_skey_out, sizeof(get_skey_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> 0x%X\n",
> +			    WIRED_GET_SESSION_KEY, get_skey_out.header.status);
> +		return -EIO;
> +	}
> +
> +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> +	       HDCP_2_2_E_DKEY_KS_LEN);
> +	memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN);
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> +					 struct hdcp_port_data *data,
> +					 struct hdcp2_rep_send_receiverid_list
> +							*rep_topology,
> +					 struct hdcp2_rep_send_ack
> +							*rep_send_ack)
> +{
> +	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
> +	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !rep_topology || !rep_send_ack || !data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	verify_repeater_in.header.api_version = HDCP_API_VERSION;
> +	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
> +	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	verify_repeater_in.header.buffer_len =
> +
> 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> +
> +	verify_repeater_in.port.integrated_port_type = data->port_type;
> +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> +	verify_repeater_in.port.attached_transcoder =
> +(u8)data->hdcp_transcoder;
> +
> +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> +	       HDCP_2_2_RXINFO_LEN);
> +	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,
> +	       HDCP_2_2_SEQ_NUM_LEN);
> +	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
> +	       HDCP_2_2_V_PRIME_HALF_LEN);
> +	memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids,
> +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_repeater_in,
> +				       sizeof(verify_repeater_in),
> +				       (u8 *)&verify_repeater_out,
> +				       sizeof(verify_repeater_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (verify_repeater_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> 0x%X\n",
> +			    WIRED_VERIFY_REPEATER,
> +			    verify_repeater_out.header.status);
> +		return -EIO;
> +	}
> +
> +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> +	       HDCP_2_2_V_PRIME_HALF_LEN);
> +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> +
> +	return 0;
> +}
> +
> +static int gsc_hdcp_verify_mprime(struct device *dev,
> +				  struct hdcp_port_data *data,
> +				  struct hdcp2_rep_stream_ready *stream_ready) {
> +	struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
> +	struct wired_cmd_repeater_auth_stream_req_out
> +					verify_mprime_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +	size_t cmd_size;
> +
> +	if (!dev || !stream_ready || !data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> +	if (cmd_size == SIZE_MAX)
> +		return -EINVAL;
> +
> +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> +	if (!verify_mprime_in)
> +		return -ENOMEM;
> +
> +	verify_mprime_in->header.api_version = HDCP_API_VERSION;
> +	verify_mprime_in->header.command_id =
> WIRED_REPEATER_AUTH_STREAM_REQ;
> +	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
> +	verify_mprime_in->header.buffer_len = cmd_size  -
> +sizeof(verify_mprime_in->header);
> +
> +	verify_mprime_in->port.integrated_port_type = data->port_type;
> +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> +	verify_mprime_in->port.attached_transcoder =
> +(u8)data->hdcp_transcoder;
> +
> +	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> HDCP_2_2_MPRIME_LEN);
> +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> >seq_num_m);
> +
> +	memcpy(verify_mprime_in->streams, data->streams,
> +	       array_size(data->k, sizeof(*data->streams)));
> +
> +	verify_mprime_in->k = cpu_to_be16(data->k);
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)verify_mprime_in, cmd_size,
> +				       (u8 *)&verify_mprime_out,
> +				       sizeof(verify_mprime_out));
> +	kfree(verify_mprime_in);
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (verify_mprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> 0x%X\n",
> +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> +			    verify_mprime_out.header.status);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int gsc_hdcp_enable_authentication(struct device *dev,
> +					  struct hdcp_port_data *data)
> +{
> +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> +	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
> +	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	enable_auth_in.header.buffer_len =
> WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> +
> +	enable_auth_in.port.integrated_port_type = data->port_type;
> +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> +	enable_auth_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +	enable_auth_in.stream_type = data->streams[0].stream_type;
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&enable_auth_in,
> +				       sizeof(enable_auth_in),
> +				       (u8 *)&enable_auth_out,
> +				       sizeof(enable_auth_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> 0x%X\n",
> +			    WIRED_ENABLE_AUTH, enable_auth_out.header.status);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +gsc_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
> +{
> +	struct wired_cmd_close_session_in session_close_in = { { 0 } };
> +	struct wired_cmd_close_session_out session_close_out = { { 0 } };
> +	struct drm_i915_private *i915;
> +	ssize_t byte;
> +
> +	if (!dev || !data)
> +		return -EINVAL;
> +
> +	i915 = kdev_to_i915(dev);
> +	if (!i915) {
> +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> +		return -ENODEV;
> +	}
> +
> +	session_close_in.header.api_version = HDCP_API_VERSION;
> +	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
> +	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
> +	session_close_in.header.buffer_len =
> +				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> +
> +	session_close_in.port.integrated_port_type = data->port_type;
> +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> +	session_close_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> +
> +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_close_in,
> +				       sizeof(session_close_in),
> +				       (u8 *)&session_close_out,
> +				       sizeof(session_close_out));
> +	if (byte < 0) {
> +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> %zd\n", byte);
> +		return byte;
> +	}
> +
> +	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> +		drm_dbg_kms(&i915->drm, "Session Close Failed. status: 0x%X\n",
> +			    session_close_out.header.status);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> +	.verify_receiver_cert_prepare_km =
> +				gsc_hdcp_verify_receiver_cert_prepare_km,
> +	.verify_hprime = gsc_hdcp_verify_hprime,
> +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> +	.verify_lprime = gsc_hdcp_verify_lprime,
> +	.get_session_key = gsc_hdcp_get_session_key,
> +	.repeater_check_flow_prepare_ack =
> +				gsc_hdcp_repeater_check_flow_prepare_ack,
> +	.verify_mprime = gsc_hdcp_verify_mprime,
> +	.enable_hdcp_authentication = gsc_hdcp_enable_authentication,
> +	.close_hdcp_session = gsc_hdcp_close_session, };
> +
>  /*This function helps allocate memory for the command that we will send to gsc cs
> */  static int intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
>  					     struct intel_hdcp_gsc_message
> *hdcp_message) @@ -58,7 +663,7 @@ static int
> intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
>  	return err;
>  }
> 
> -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
>  {
>  	struct intel_hdcp_gsc_message *hdcp_message;
>  	int ret;
> @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
>  	return ret;
>  }
> 
> -void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
> +static void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
>  {
>  	struct intel_hdcp_gsc_message *hdcp_message =
>  					i915->display.hdcp.hdcp_message;
> @@ -89,6 +694,31 @@ void intel_hdcp_gsc_free_message(struct drm_i915_private
> *i915)
>  	kfree(hdcp_message);
>  }
> 
> +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> +	struct i915_hdcp_master *data;
> +	int ret;
> +
> +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> +	if (!data)
> +		return -ENOMEM;
> +
> +	mutex_lock(&i915->display.hdcp.comp_mutex);
> +	i915->display.hdcp.master = data;
> +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> +
> +	return ret;
> +}
> +
> +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> +	intel_hdcp_gsc_free_message(i915);
> +	kfree(i915->display.hdcp.master);
> +}
> +
>  static int intel_gsc_send_sync(struct drm_i915_private *i915,
>  			       struct intel_gsc_mtl_header *header, u64 addr,
>  			       size_t msg_out_len)
> @@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct drm_i915_private
> *i915,
>   * will follow
>   */
>  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
> -				size_t msg_in_len, u8 *msg_out, size_t
> msg_out_len)
> +				size_t msg_in_len, u8 *msg_out,
> +				size_t msg_out_len)
>  {
>  	struct intel_gt *gt = i915->media_gt;
>  	struct intel_gsc_mtl_header *header;
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> index 09ffd7ec02cd..5cc9fd2e88f6 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
>  	void *hdcp_cmd;
>  };
> 
> +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
>  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
>  				size_t msg_in_len, u8 *msg_out,
>  				size_t msg_out_len);
> +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> 
>  #endif /* __INTEL_HDCP_GCS_H__ */
> --
> 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism
  2023-03-06 11:17   ` Shankar, Uma
@ 2023-03-06 12:39     ` Kandpal, Suraj
  0 siblings, 0 replies; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-06 12:39 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Teres Alexis, Alan Previn

> 
> > -----Original Message-----
> > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of
> > Suraj Kandpal
> > Sent: Wednesday, February 1, 2023 2:38 PM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Teres Alexis, Alan Previn <alan.previn.teres.alexis@intel.com>
> > Subject: [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request
> > submission mechanism
> >
> > HDCP and PXP will require a common function to allow it to submit
> > commands to the gsc cs. Also adding the gsc mtl header that needs to
> > be added on to the existing payloads of HDCP and PXP.
> >
> > --v4
> > -Seprate gsc load and heci cmd submission into different functions in
> > different files for better scalability [Alan] -Rename gsc address
> > field [Alan]
> >
> > Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> > Cc: Alan Previn <alan.previn.teres.alexis@intel.com>
> > Signed-off-by: Suraj Kandpal<suraj.kandpal@intel.com>
> > Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
> > ---
> >  drivers/gpu/drm/i915/Makefile                 |  1 +
> >  drivers/gpu/drm/i915/gt/intel_gpu_commands.h  |  2 +
> >  drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h     |  1 +
> >  .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c | 94
> > +++++++++++++++++++ .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h | 45
> > +++++++++
> >  5 files changed, 143 insertions(+)
> >  create mode 100644
> > drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> >  create mode 100644
> > drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> >
> > diff --git a/drivers/gpu/drm/i915/Makefile
> > b/drivers/gpu/drm/i915/Makefile index 918470a04591..482928cffb1c
> > 100644
> > --- a/drivers/gpu/drm/i915/Makefile
> > +++ b/drivers/gpu/drm/i915/Makefile
> > @@ -195,6 +195,7 @@ i915-y += \
> >  i915-y += \
> >  	  gt/uc/intel_gsc_fw.o \
> >  	  gt/uc/intel_gsc_uc.o \
> > +	  gt/uc/intel_gsc_uc_heci_cmd_submit.o\
> >  	  gt/uc/intel_guc.o \
> >  	  gt/uc/intel_guc_ads.o \
> >  	  gt/uc/intel_guc_capture.o \
> > diff --git a/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> > b/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> > index 2af1ae3831df..454179884801 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> > +++ b/drivers/gpu/drm/i915/gt/intel_gpu_commands.h
> > @@ -439,6 +439,8 @@
> >  #define GSC_FW_LOAD GSC_INSTR(1, 0, 2)
> >  #define   HECI1_FW_LIMIT_VALID (1 << 31)
> >
> > +#define GSC_HECI_CMD_PKT GSC_INSTR(0, 0, 6)
> > +
> >  /*
> >   * Used to convert any address to canonical form.
> >   * Starting from gen8, some commands (e.g. STATE_BASE_ADDRESS, diff
> > --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> > b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> > index 4b5dbb44afb4..146ac0128f69 100644
> > --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> > +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
> > @@ -12,4 +12,5 @@ struct intel_gsc_uc;
> >
> >  int intel_gsc_uc_fw_upload(struct intel_gsc_uc *gsc);  bool
> > intel_gsc_uc_fw_init_done(struct intel_gsc_uc *gsc);
> > +
> 
> This redundant and unrelated change can be dropped.
> 

Okay got it,

Regard,
Suraj Kandpal
> >  #endif
> > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > new file mode 100644
> > index 000000000000..be2424af521d
> > --- /dev/null
> > +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > @@ -0,0 +1,94 @@
> > +// SPDX-License-Identifier: MIT
> > +/*
> > + * Copyright © 2023 Intel Corporation  */
> > +
> > +#include "gt/intel_engine_pm.h"
> > +#include "gt/intel_gpu_commands.h"
> > +#include "gt/intel_gt.h"
> > +#include "gt/intel_ring.h"
> > +#include "intel_gsc_uc_heci_cmd_submit.h"
> > +
> > +struct gsc_heci_pkt {
> > +	u64 addr_in;
> > +	u32 size_in;
> > +	u64 addr_out;
> > +	u32 size_out;
> > +};
> > +
> > +static int emit_gsc_heci_pkt(struct i915_request *rq, struct
> > +gsc_heci_pkt *pkt) {
> > +	u32 *cs;
> > +
> > +	cs = intel_ring_begin(rq, 8);
> > +	if (IS_ERR(cs))
> > +		return PTR_ERR(cs);
> > +
> > +	*cs++ = GSC_HECI_CMD_PKT;
> > +	*cs++ = lower_32_bits(pkt->addr_in);
> > +	*cs++ = upper_32_bits(pkt->addr_in);
> > +	*cs++ = pkt->size_in;
> > +	*cs++ = lower_32_bits(pkt->addr_out);
> > +	*cs++ = upper_32_bits(pkt->addr_out);
> > +	*cs++ = pkt->size_out;
> > +	*cs++ = 0;
> > +
> > +	intel_ring_advance(rq, cs);
> > +
> > +	return 0;
> > +}
> > +
> > +int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc, u64
> addr_in,
> > +					u32 size_in, u64 addr_out,
> > +					u32 size_out)
> > +{
> > +	struct intel_context *ce = gsc->ce;
> > +	struct i915_request *rq;
> > +	struct gsc_heci_pkt pkt = {
> > +	.addr_in = addr_in,
> > +	.size_in = size_in,
> > +	.addr_out = addr_out,
> > +	.size_out = size_out
> > +	};
> > +	int err;
> > +
> > +	if (!ce)
> > +		return -ENODEV;
> > +
> > +	rq = i915_request_create(ce);
> > +	if (IS_ERR(rq))
> > +		return PTR_ERR(rq);
> > +
> > +	if (ce->engine->emit_init_breadcrumb) {
> > +		err = ce->engine->emit_init_breadcrumb(rq);
> > +		if (err)
> > +			goto out_rq;
> > +	}
> > +
> > +	err = emit_gsc_heci_pkt(rq, &pkt);
> > +
> > +	if (err)
> > +		goto out_rq;
> > +
> > +	err = ce->engine->emit_flush(rq, 0);
> > +
> > +out_rq:
> > +	i915_request_get(rq);
> > +
> > +	if (unlikely(err))
> > +		i915_request_set_error_once(rq, err);
> > +
> > +	i915_request_add(rq);
> > +
> > +	if (!err && i915_request_wait(rq, 0, msecs_to_jiffies(500)) < 0)
> > +		err = -ETIME;
> > +
> > +	i915_request_put(rq);
> > +
> > +	if (err)
> > +		drm_err(&gsc_uc_to_gt(gsc)->i915->drm,
> > +			"Request submission for GSC heci cmd failed (%d)\n",
> > +			err);
> > +
> > +	return err;
> > +}
> > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > new file mode 100644
> > index 000000000000..cf610dfca7a5
> > --- /dev/null
> > +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > @@ -0,0 +1,45 @@
> > +/* SPDX-License-Identifier: MIT */
> > +/*
> > + * Copyright © 2023 Intel Corporation  */
> > +
> > +#ifndef _INTEL_GSC_UC_HECI_CMD_SUBMIT_H_ #define
> > +_INTEL_GSC_UC_HECI_CMD_SUBMIT_H_
> > +
> > +#include <linux/types.h>
> > +
> > +struct intel_gsc_uc;
> > +struct intel_gsc_mtl_header {
> > +	u32 validity_marker;
> > +#define GSC_HECI_VALIDITY_MARKER 0xA578875A
> > +
> > +	u8 heci_client_id;
> > +#define HECI_MEADDRESS_PXP 17
> > +#define HECI_MEADDRESS_HDCP 18
> > +
> > +	u8 reserved1;
> > +
> > +	u16 header_version;
> > +#define MTL_GSC_HEADER_VERSION 1
> > +
> > +	u64 host_session_handle;
> > +	u64 gsc_message_handle;
> > +
> > +	u32 message_size; /* lower 20 bits only, upper 12 are reserved */
> > +
> > +	/*
> > +	 * Flags mask:
> > +	 * Bit 0: Pending
> > +	 * Bit 1: Session Cleanup;
> > +	 * Bits 2-15: Flags
> > +	 * Bits 16-31: Extension Size
> > +	 */
> > +	u32 flags;
> > +
> > +	u32 status;
> > +} __packed;
> > +
> > +int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc,
> > +					u64 addr_in, u32 size_in,
> > +					u64 addr_out, u32 size_out);
> > +#endif
> > --
> > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention
  2023-03-06 11:38   ` Shankar, Uma
@ 2023-03-06 12:50     ` Kandpal, Suraj
  2023-03-07  6:40       ` Shankar, Uma
  0 siblings, 1 reply; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-06 12:50 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo

> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: Wednesday, February 1, 2023 2:38 PM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta, Anshuman
> > <anshuman.gupta@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>;
> > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > <uma.shankar@intel.com>; Kandpal, Suraj <suraj.kandpal@intel.com>
> > Subject: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming
> > convention
> 
> Typo in agnostic.
> 
> Also I feel this header can be re-phrased: "Use generic names for HDCP
> helpers and structs"
> Add the rationale why this is required, explain the legacy and new usage
> which is the cause for this patch.
> 

Sure will add it in the next version

Regards,
Suraj Kandpal
> >
> > From: Anshuman Gupta <anshuman.gupta@intel.com>
> >
> > Change the include/drm/i915_mei_hdcp_interface.h to
> > include/drm/i915_hdcp_interface.h
> >
> > --v6
> > -make each patch build individually [Jani]
> >
> > --v8
> > -change ME FW to ME/GSC FW [Ankit]
> > -fix formatting issue [Ankit]
> >
> > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Cc: Uma Shankar <uma.shankar@intel.com>
> > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Acked-by: Tomas Winkler <tomas.winkler@intel.com>
> > ---
> >  .../gpu/drm/i915/display/intel_display_core.h |  2 +-
> >  .../drm/i915/display/intel_display_types.h    |  2 +-
> >  drivers/gpu/drm/i915/display/intel_hdcp.c     | 81 ++++++++--------
> >  drivers/misc/mei/hdcp/mei_hdcp.c              | 61 ++++++------
> >  ...hdcp_interface.h => i915_hdcp_interface.h} | 92
> > +++++++++----------
> >  5 files changed, 118 insertions(+), 120 deletions(-)  rename
> > include/drm/{i915_mei_hdcp_interface.h => i915_hdcp_interface.h} (73%)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > index fb8670aa2932..8e7a68339876 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > @@ -378,7 +378,7 @@ struct intel_display {
> >  	} gmbus;
> >
> >  	struct {
> > -		struct i915_hdcp_comp_master *master;
> > +		struct i915_hdcp_master *master;
> 
> Since we are changing this up, can we drop the use of phrase like "master"
> etc, if feasible in the series, else this can be taken with a follow up cleanup
> series.

I actually plan on cleaning this up later on in a different hdcp cleanup series


> 
> >  		bool comp_added;
> >
> >  		/* Mutex to protect the above hdcp component related
> values. */
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 9ccae7a46020..7accd3a8877c 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > @@ -43,7 +43,7 @@
> >  #include <drm/drm_rect.h>
> >  #include <drm/drm_vblank.h>
> >  #include <drm/drm_vblank_work.h>
> > -#include <drm/i915_mei_hdcp_interface.h>
> > +#include <drm/i915_hdcp_interface.h>
> >  #include <media/cec-notifier.h>
> >
> >  #include "i915_vma.h"
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index 6406fd487ee5..262c76f21801 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > @@ -1143,7 +1143,7 @@ hdcp2_prepare_ake_init(struct intel_connector
> > *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> 
> comp name is relevant if we use component framework, having the name for
> a generic case doesn't seem right. Change it universally in patch.

I think I lost you here as the change here from my side was i915_hdcp_comp_master to
I915_hdcp_master and I left the variable name as is.
If you do want me to change the variable name what do you think would be better
> 
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1154,7 +1154,7 @@ hdcp2_prepare_ake_init(struct intel_connector
> > *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->initiate_hdcp2_session(comp->mei_dev, data,
> ake_data);
> > +	ret = comp->ops->initiate_hdcp2_session(comp->hdcp_dev, data,
> > +ake_data);
> >  	if (ret)
> >  		drm_dbg_kms(&dev_priv->drm, "Prepare_ake_init failed.
> %d\n",
> >  			    ret);
> > @@ -1173,7 +1173,7 @@ hdcp2_verify_rx_cert_prepare_km(struct
> > intel_connector *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1184,7 +1184,7 @@ hdcp2_verify_rx_cert_prepare_km(struct
> > intel_connector *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->verify_receiver_cert_prepare_km(comp->mei_dev,
> data,
> > +	ret = comp->ops->verify_receiver_cert_prepare_km(comp-
> >hdcp_dev,
> > +data,
> >  							 rx_cert, paired,
> >  							 ek_pub_km,
> msg_sz);
> >  	if (ret < 0)
> > @@ -1201,7 +1201,7 @@ static int hdcp2_verify_hprime(struct
> > intel_connector *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1212,7 +1212,7 @@ static int hdcp2_verify_hprime(struct
> > intel_connector *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->verify_hprime(comp->mei_dev, data, rx_hprime);
> > +	ret = comp->ops->verify_hprime(comp->hdcp_dev, data, rx_hprime);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Verify hprime failed.
> %d\n", ret);
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1227,7 +1227,7 @@ hdcp2_store_pairing_info(struct intel_connector
> > *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1238,7 +1238,7 @@ hdcp2_store_pairing_info(struct intel_connector
> > *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->store_pairing_info(comp->mei_dev, data,
> pairing_info);
> > +	ret = comp->ops->store_pairing_info(comp->hdcp_dev, data,
> > +pairing_info);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Store pairing info failed.
> %d\n",
> >  			    ret);
> > @@ -1254,7 +1254,7 @@ hdcp2_prepare_lc_init(struct intel_connector
> *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1265,7 +1265,7 @@ hdcp2_prepare_lc_init(struct intel_connector
> *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->initiate_locality_check(comp->mei_dev, data,
> lc_init);
> > +	ret = comp->ops->initiate_locality_check(comp->hdcp_dev, data,
> > +lc_init);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Prepare lc_init failed.
> %d\n",
> >  			    ret);
> > @@ -1281,7 +1281,7 @@ hdcp2_verify_lprime(struct intel_connector
> *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1292,7 +1292,7 @@ hdcp2_verify_lprime(struct intel_connector
> *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->verify_lprime(comp->mei_dev, data, rx_lprime);
> > +	ret = comp->ops->verify_lprime(comp->hdcp_dev, data, rx_lprime);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Verify L_Prime failed.
> %d\n",
> >  			    ret);
> > @@ -1307,7 +1307,7 @@ static int hdcp2_prepare_skey(struct
> > intel_connector *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1318,7 +1318,7 @@ static int hdcp2_prepare_skey(struct
> > intel_connector *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->get_session_key(comp->mei_dev, data, ske_data);
> > +	ret = comp->ops->get_session_key(comp->hdcp_dev, data,
> ske_data);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Get session key failed.
> %d\n",
> >  			    ret);
> > @@ -1336,7 +1336,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct
> > intel_connector *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1347,7 +1347,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct
> > intel_connector *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->repeater_check_flow_prepare_ack(comp-
> >mei_dev,
> > data,
> > +	ret = comp->ops->repeater_check_flow_prepare_ack(comp-
> >hdcp_dev,
> > data,
> >  							 rep_topology,
> >  							 rep_send_ack);
> >  	if (ret < 0)
> > @@ -1365,7 +1365,7 @@ hdcp2_verify_mprime(struct intel_connector
> *connector,
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1376,7 +1376,7 @@ hdcp2_verify_mprime(struct intel_connector
> *connector,
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->verify_mprime(comp->mei_dev, data,
> stream_ready);
> > +	ret = comp->ops->verify_mprime(comp->hdcp_dev, data,
> stream_ready);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Verify mprime failed.
> %d\n", ret);
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1389,7 +1389,7 @@ static int hdcp2_authenticate_port(struct
> > intel_connector
> > *connector)
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1400,7 +1400,7 @@ static int hdcp2_authenticate_port(struct
> > intel_connector
> > *connector)
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->enable_hdcp_authentication(comp->mei_dev,
> data);
> > +	ret = comp->ops->enable_hdcp_authentication(comp->hdcp_dev,
> data);
> >  	if (ret < 0)
> >  		drm_dbg_kms(&dev_priv->drm, "Enable hdcp auth failed.
> %d\n",
> >  			    ret);
> > @@ -1413,7 +1413,7 @@ static int hdcp2_close_mei_session(struct
> > intel_connector
> > *connector)  {
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > -	struct i915_hdcp_comp_master *comp;
> > +	struct i915_hdcp_master *comp;
> >  	int ret;
> >
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -1424,7 +1424,7 @@ static int hdcp2_close_mei_session(struct
> > intel_connector
> > *connector)
> >  		return -EINVAL;
> >  	}
> >
> > -	ret = comp->ops->close_hdcp_session(comp->mei_dev,
> > +	ret = comp->ops->close_hdcp_session(comp->hdcp_dev,
> >  					     &dig_port->hdcp_port_data);
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >
> > @@ -2145,8 +2145,8 @@ static int i915_hdcp_component_bind(struct
> > device *i915_kdev,
> >
> >  	drm_dbg(&dev_priv->drm, "I915 HDCP comp bind\n");
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > -	dev_priv->display.hdcp.master = (struct i915_hdcp_comp_master
> *)data;
> > -	dev_priv->display.hdcp.master->mei_dev = mei_kdev;
> > +	dev_priv->display.hdcp.master = (struct i915_hdcp_master *)data;
> > +	dev_priv->display.hdcp.master->hdcp_dev = mei_kdev;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >
> >  	return 0;
> > @@ -2163,30 +2163,30 @@ static void
> i915_hdcp_component_unbind(struct
> > device *i915_kdev,
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >  }
> >
> > -static const struct component_ops i915_hdcp_component_ops = {
> > +static const struct component_ops i915_hdcp_ops = {
> >  	.bind   = i915_hdcp_component_bind,
> >  	.unbind = i915_hdcp_component_unbind,  };
> >
> > -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> > +static enum hdcp_ddi intel_get_hdcp_ddi_index(enum port port)
> >  {
> >  	switch (port) {
> >  	case PORT_A:
> > -		return MEI_DDI_A;
> > +		return HDCP_DDI_A;
> >  	case PORT_B ... PORT_F:
> > -		return (enum mei_fw_ddi)port;
> > +		return (enum hdcp_ddi)port;
> >  	default:
> > -		return MEI_DDI_INVALID_PORT;
> > +		return HDCP_DDI_INVALID_PORT;
> >  	}
> >  }
> >
> > -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder
> > cpu_transcoder)
> > +static enum hdcp_transcoder intel_get_hdcp_transcoder(enum
> transcoder
> > +cpu_transcoder)
> >  {
> >  	switch (cpu_transcoder) {
> >  	case TRANSCODER_A ... TRANSCODER_D:
> > -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> > +		return (enum hdcp_transcoder)(cpu_transcoder | 0x10);
> >  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> > -		return MEI_INVALID_TRANSCODER;
> > +		return HDCP_INVALID_TRANSCODER;
> >  	}
> >  }
> >
> > @@ -2200,20 +2200,20 @@ static int initialize_hdcp_port_data(struct
> > intel_connector *connector,
> >  	enum port port = dig_port->base.port;
> >
> >  	if (DISPLAY_VER(dev_priv) < 12)
> > -		data->fw_ddi = intel_get_mei_fw_ddi_index(port);
> > +		data->hdcp_ddi = intel_get_hdcp_ddi_index(port);
> >  	else
> >  		/*
> > -		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
> > +		 * As per ME FW API expectation, for GEN 12+, hdcp_ddi is
> filled
> >  		 * with zero(INVALID PORT index).
> >  		 */
> > -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> > +		data->hdcp_ddi = HDCP_DDI_INVALID_PORT;
> >
> >  	/*
> > -	 * As associated transcoder is set and modified at modeset, here
> fw_tc
> > +	 * As associated transcoder is set and modified at modeset, here
> > +hdcp_transcoder
> >  	 * is initialized to zero (invalid transcoder index). This will be
> >  	 * retained for <Gen12 forever.
> >  	 */
> > -	data->fw_tc = MEI_INVALID_TRANSCODER;
> > +	data->hdcp_transcoder = HDCP_INVALID_TRANSCODER;
> >
> >  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
> >  	data->protocol = (u8)shim->protocol; @@ -2256,7 +2256,7 @@ void
> > intel_hdcp_component_init(struct drm_i915_private
> > *dev_priv)
> >
> >  	dev_priv->display.hdcp.comp_added = true;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > -	ret = component_add_typed(dev_priv->drm.dev,
> > &i915_hdcp_component_ops,
> > +	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> >  				  I915_COMPONENT_HDCP);
> >  	if (ret < 0) {
> >  		drm_dbg_kms(&dev_priv->drm, "Failed at component
> add(%d)\n", @@
> > -2350,7 +2350,8 @@ int intel_hdcp_enable(struct intel_connector
> *connector,
> >  	}
> >
> >  	if (DISPLAY_VER(dev_priv) >= 12)
> > -		dig_port->hdcp_port_data.fw_tc =
> intel_get_mei_fw_tc(hdcp-
> > >cpu_transcoder);
> > +		dig_port->hdcp_port_data.hdcp_transcoder =
> > +			intel_get_hdcp_transcoder(hdcp->cpu_transcoder);
> >
> >  	/*
> >  	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the
> > setup @@ -
> > 2485,7 +2486,7 @@ void intel_hdcp_component_fini(struct
> > drm_i915_private
> > *dev_priv)
> >  	dev_priv->display.hdcp.comp_added = false;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >
> > -	component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);
> > +	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> >  }
> >
> >  void intel_hdcp_cleanup(struct intel_connector *connector) diff --git
> > a/drivers/misc/mei/hdcp/mei_hdcp.c
> b/drivers/misc/mei/hdcp/mei_hdcp.c
> > index e889a8bd7ac8..b2c49599809c 100644
> > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> > @@ -23,7 +23,7 @@
> >  #include <linux/component.h>
> >  #include <drm/drm_connector.h>
> >  #include <drm/i915_component.h>
> > -#include <drm/i915_mei_hdcp_interface.h>
> > +#include <drm/i915_hdcp_interface.h>
> >
> >  #include "mei_hdcp.h"
> >
> > @@ -57,8 +57,8 @@ mei_hdcp_initiate_session(struct device *dev, struct
> > hdcp_port_data *data,
> >
> > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> >
> >  	session_init_in.port.integrated_port_type = data->port_type;
> > -	session_init_in.port.physical_port = (u8)data->fw_ddi;
> > -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	session_init_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >  	session_init_in.protocol = data->protocol;
> >
> >  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in, @@ -127,8
> > +127,8 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device
> *dev,
> >
> > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> >
> >  	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > -	verify_rxcert_in.port.physical_port = (u8)data->fw_ddi;
> > -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_rxcert_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >
> >  	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> >  	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
> @@
> > -
> > 198,8 +198,8 @@ mei_hdcp_verify_hprime(struct device *dev, struct
> > hdcp_port_data *data,
> >  	send_hprime_in.header.buffer_len =
> > WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> >
> >  	send_hprime_in.port.integrated_port_type = data->port_type;
> > -	send_hprime_in.port.physical_port = (u8)data->fw_ddi;
> > -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	send_hprime_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> >
> >  	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> >  	       HDCP_2_2_H_PRIME_LEN);
> > @@ -256,8 +256,8 @@ mei_hdcp_store_pairing_info(struct device *dev,
> > struct hdcp_port_data *data,
> >
> > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> >
> >  	pairing_info_in.port.integrated_port_type = data->port_type;
> > -	pairing_info_in.port.physical_port = (u8)data->fw_ddi;
> > -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	pairing_info_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >
> >  	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> >  	       HDCP_2_2_E_KH_KM_LEN);
> > @@ -315,8 +315,8 @@ mei_hdcp_initiate_locality_check(struct device
> *dev,
> >  	lc_init_in.header.buffer_len =
> > WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> >
> >  	lc_init_in.port.integrated_port_type = data->port_type;
> > -	lc_init_in.port.physical_port = (u8)data->fw_ddi;
> > -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> >
> >  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
> >  	if (byte < 0) {
> > @@ -371,8 +371,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct
> > hdcp_port_data *data,
> >
> > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> >
> >  	verify_lprime_in.port.integrated_port_type = data->port_type;
> > -	verify_lprime_in.port.physical_port = (u8)data->fw_ddi;
> > -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_lprime_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >
> >  	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> >  	       HDCP_2_2_L_PRIME_LEN);
> > @@ -429,8 +429,8 @@ static int mei_hdcp_get_session_key(struct device
> *dev,
> >  	get_skey_in.header.buffer_len =
> > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> >
> >  	get_skey_in.port.integrated_port_type = data->port_type;
> > -	get_skey_in.port.physical_port = (u8)data->fw_ddi;
> > -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> >
> >  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in,
> sizeof(get_skey_in));
> >  	if (byte < 0) {
> > @@ -494,8 +494,8 @@
> mei_hdcp_repeater_check_flow_prepare_ack(struct
> > device *dev,
> >
> > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> >
> >  	verify_repeater_in.port.integrated_port_type = data->port_type;
> > -	verify_repeater_in.port.physical_port = (u8)data->fw_ddi;
> > -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_repeater_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >
> >  	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> >  	       HDCP_2_2_RXINFO_LEN);
> > @@ -572,8 +572,8 @@ static int mei_hdcp_verify_mprime(struct device
> *dev,
> >  	verify_mprime_in->header.buffer_len = cmd_size  -
> > sizeof(verify_mprime_in-
> > >header);
> >
> >  	verify_mprime_in->port.integrated_port_type = data->port_type;
> > -	verify_mprime_in->port.physical_port = (u8)data->fw_ddi;
> > -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_mprime_in->port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >
> >  	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > HDCP_2_2_MPRIME_LEN);
> >  	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > >seq_num_m); @@ -634,8 +634,8 @@ static int
> > mei_hdcp_enable_authentication(struct device *dev,
> >  	enable_auth_in.header.buffer_len =
> > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> >
> >  	enable_auth_in.port.integrated_port_type = data->port_type;
> > -	enable_auth_in.port.physical_port = (u8)data->fw_ddi;
> > -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	enable_auth_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> >  	enable_auth_in.stream_type = data->streams[0].stream_type;
> >
> >  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in, @@ -689,8
> +689,8
> > @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data
> *data)
> >  				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> >
> >  	session_close_in.port.integrated_port_type = data->port_type;
> > -	session_close_in.port.physical_port = (u8)data->fw_ddi;
> > -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
> > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	session_close_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> >
> >  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
> >  			      sizeof(session_close_in));
> > @@ -715,7 +715,7 @@ mei_hdcp_close_session(struct device *dev, struct
> > hdcp_port_data *data)
> >  	return 0;
> >  }
> >
> > -static const struct i915_hdcp_component_ops mei_hdcp_ops = {
> > +static const struct i915_hdcp_ops mei_hdcp_ops = {
> >  	.owner = THIS_MODULE,
> >  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
> >  	.verify_receiver_cert_prepare_km =
> > @@ -735,13 +735,12 @@ static const struct i915_hdcp_component_ops
> > mei_hdcp_ops = {  static int mei_component_master_bind(struct device
> *dev)  {
> >  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> > -	struct i915_hdcp_comp_master *comp_master =
> > -
> 	mei_cldev_get_drvdata(cldev);
> > +	struct i915_hdcp_master *comp_master =
> mei_cldev_get_drvdata(cldev);
> >  	int ret;
> >
> >  	dev_dbg(dev, "%s\n", __func__);
> >  	comp_master->ops = &mei_hdcp_ops;
> > -	comp_master->mei_dev = dev;
> > +	comp_master->hdcp_dev = dev;
> >  	ret = component_bind_all(dev, comp_master);
> >  	if (ret < 0)
> >  		return ret;
> > @@ -752,8 +751,7 @@ static int mei_component_master_bind(struct
> device
> > *dev) static void mei_component_master_unbind(struct device *dev)  {
> >  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> > -	struct i915_hdcp_comp_master *comp_master =
> > -
> 	mei_cldev_get_drvdata(cldev);
> > +	struct i915_hdcp_master *comp_master =
> mei_cldev_get_drvdata(cldev);
> >
> >  	dev_dbg(dev, "%s\n", __func__);
> >  	component_unbind_all(dev, comp_master); @@ -801,7 +799,7 @@
> static
> > int mei_hdcp_component_match(struct device *dev, int subcomponent,
> > static int mei_hdcp_probe(struct mei_cl_device *cldev,
> >  			  const struct mei_cl_device_id *id)  {
> > -	struct i915_hdcp_comp_master *comp_master;
> > +	struct i915_hdcp_master *comp_master;
> >  	struct component_match *master_match;
> >  	int ret;
> >
> > @@ -846,8 +844,7 @@ static int mei_hdcp_probe(struct mei_cl_device
> > *cldev,
> >
> >  static void mei_hdcp_remove(struct mei_cl_device *cldev)  {
> > -	struct i915_hdcp_comp_master *comp_master =
> > -
> 	mei_cldev_get_drvdata(cldev);
> > +	struct i915_hdcp_master *comp_master =
> mei_cldev_get_drvdata(cldev);
> >  	int ret;
> >
> >  	component_master_del(&cldev->dev,
> &mei_component_master_ops); diff -
> > -git a/include/drm/i915_mei_hdcp_interface.h
> > b/include/drm/i915_hdcp_interface.h
> > similarity index 73%
> > rename from include/drm/i915_mei_hdcp_interface.h
> > rename to include/drm/i915_hdcp_interface.h index
> > f441cbcd95a4..75c75f52ab1b
> > 100644
> > --- a/include/drm/i915_mei_hdcp_interface.h
> > +++ b/include/drm/i915_hdcp_interface.h
> > @@ -6,15 +6,15 @@
> >   * Ramalingam C <ramalingam.c@intel.com>
> >   */
> >
> > -#ifndef _I915_MEI_HDCP_INTERFACE_H_
> > -#define _I915_MEI_HDCP_INTERFACE_H_
> > +#ifndef _I915_HDCP_INTERFACE_H_
> > +#define _I915_HDCP_INTERFACE_H_
> >
> >  #include <linux/mutex.h>
> >  #include <linux/device.h>
> >  #include <drm/display/drm_hdcp.h>
> >
> >  /**
> > - * enum hdcp_port_type - HDCP port implementation type defined by ME
> > FW
> > + * enum hdcp_port_type - HDCP port implementation type defined by
> > + ME/GSC FW
> >   * @HDCP_PORT_TYPE_INVALID: Invalid hdcp port type
> >   * @HDCP_PORT_TYPE_INTEGRATED: In-Host HDCP2.x port
> >   * @HDCP_PORT_TYPE_LSPCON: HDCP2.2 discrete wired Tx port with
> LSPCON
> > @@
> > -41,46 +41,46 @@ enum hdcp_wired_protocol {
> >  	HDCP_PROTOCOL_DP
> >  };
> >
> > -enum mei_fw_ddi {
> > -	MEI_DDI_INVALID_PORT = 0x0,
> > +enum hdcp_ddi {
> > +	HDCP_DDI_INVALID_PORT = 0x0,
> >
> > -	MEI_DDI_B = 1,
> > -	MEI_DDI_C,
> > -	MEI_DDI_D,
> > -	MEI_DDI_E,
> > -	MEI_DDI_F,
> > -	MEI_DDI_A = 7,
> > -	MEI_DDI_RANGE_END = MEI_DDI_A,
> > +	HDCP_DDI_B = 1,
> > +	HDCP_DDI_C,
> > +	HDCP_DDI_D,
> > +	HDCP_DDI_E,
> > +	HDCP_DDI_F,
> > +	HDCP_DDI_A = 7,
> > +	HDCP_DDI_RANGE_END = HDCP_DDI_A,
> >  };
> >
> >  /**
> > - * enum mei_fw_tc - ME Firmware defined index for transcoders
> > - * @MEI_INVALID_TRANSCODER: Index for Invalid transcoder
> > - * @MEI_TRANSCODER_EDP: Index for EDP Transcoder
> > - * @MEI_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > - * @MEI_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > - * @MEI_TRANSCODER_A: Index for Transcoder A
> > - * @MEI_TRANSCODER_B: Index for Transcoder B
> > - * @MEI_TRANSCODER_C: Index for Transcoder C
> > - * @MEI_TRANSCODER_D: Index for Transcoder D
> > + * enum hdcp_tc - ME/GSC Firmware defined index for transcoders
> > + * @HDCP_INVALID_TRANSCODER: Index for Invalid transcoder
> > + * @HDCP_TRANSCODER_EDP: Index for EDP Transcoder
> > + * @HDCP_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > + * @HDCP_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > + * @HDCP_TRANSCODER_A: Index for Transcoder A
> > + * @HDCP_TRANSCODER_B: Index for Transcoder B
> > + * @HDCP_TRANSCODER_C: Index for Transcoder C
> > + * @HDCP_TRANSCODER_D: Index for Transcoder D
> >   */
> > -enum mei_fw_tc {
> > -	MEI_INVALID_TRANSCODER = 0x00,
> > -	MEI_TRANSCODER_EDP,
> > -	MEI_TRANSCODER_DSI0,
> > -	MEI_TRANSCODER_DSI1,
> > -	MEI_TRANSCODER_A = 0x10,
> > -	MEI_TRANSCODER_B,
> > -	MEI_TRANSCODER_C,
> > -	MEI_TRANSCODER_D
> > +enum hdcp_transcoder {
> > +	HDCP_INVALID_TRANSCODER = 0x00,
> > +	HDCP_TRANSCODER_EDP,
> > +	HDCP_TRANSCODER_DSI0,
> > +	HDCP_TRANSCODER_DSI1,
> > +	HDCP_TRANSCODER_A = 0x10,
> > +	HDCP_TRANSCODER_B,
> > +	HDCP_TRANSCODER_C,
> > +	HDCP_TRANSCODER_D
> >  };
> >
> >  /**
> >   * struct hdcp_port_data - intel specific HDCP port data
> > - * @fw_ddi: ddi index as per ME FW
> > - * @fw_tc: transcoder index as per ME FW
> > - * @port_type: HDCP port type as per ME FW classification
> > - * @protocol: HDCP adaptation as per ME FW
> > + * @hdcp_ddi: ddi index as per ME/GSC FW
> > + * @hdcp_transcoder: transcoder index as per ME/GSC FW
> > + * @port_type: HDCP port type as per ME/GSC FW classification
> > + * @protocol: HDCP adaptation as per ME/GSC FW
> >   * @k: No of streams transmitted on a port. Only on DP MST this is != 1
> >   * @seq_num_m: Count of RepeaterAuth_Stream_Manage msg
> propagated.
> >   *	       Initialized to 0 on AKE_INIT. Incremented after every successful
> > @@ -90,8 +90,8 @@ enum mei_fw_tc {
> >   *	     streams
> >   */
> >  struct hdcp_port_data {
> > -	enum mei_fw_ddi fw_ddi;
> > -	enum mei_fw_tc fw_tc;
> > +	enum hdcp_ddi hdcp_ddi;
> > +	enum hdcp_transcoder hdcp_transcoder;
> >  	u8 port_type;
> >  	u8 protocol;
> >  	u16 k;
> > @@ -100,7 +100,7 @@ struct hdcp_port_data {  };
> >
> >  /**
> > - * struct i915_hdcp_component_ops- ops for HDCP2.2 services.
> > + * struct i915_hdcp_ops- ops for HDCP2.2 services.
> >   * @owner: Module providing the ops
> >   * @initiate_hdcp2_session: Initiate a Wired HDCP2.2 Tx Session.
> >   *			    And Prepare AKE_Init.
> > @@ -119,9 +119,9 @@ struct hdcp_port_data {
> >   * @close_hdcp_session: Close the Wired HDCP Tx session per port.
> >   *			This also disables the authenticated state of the port.
> >   */
> > -struct i915_hdcp_component_ops {
> > +struct i915_hdcp_ops {
> >  	/**
> > -	 * @owner: mei_hdcp module
> > +	 * @owner: hdcp module
> >  	 */
> >  	struct module *owner;
> >
> > @@ -169,16 +169,16 @@ struct i915_hdcp_component_ops {
> >
> >  /**
> >   * struct i915_hdcp_component_master - Used for communication
> between
> > i915
> 
> Name doesn't match with the structure, please fix.
> 

Okay it missed this will do

Regards,
Suraj Kandpal
> > - * and mei_hdcp drivers for the HDCP2.2 services
> > - * @mei_dev: device that provide the HDCP2.2 service from MEI Bus.
> > - * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
> > + * and hdcp drivers for the HDCP2.2 services
> > + * @hdcp_dev: device that provide the HDCP2.2 service from MEI Bus.
> > + * @hdcp_ops: Ops implemented by hdcp driver or intel_hdcp_gsc , used
> > + by i915
> > driver.
> >   */
> > -struct i915_hdcp_comp_master {
> > -	struct device *mei_dev;
> > -	const struct i915_hdcp_component_ops *ops;
> > +struct i915_hdcp_master {
> > +	struct device *hdcp_dev;
> > +	const struct i915_hdcp_ops *ops;
> >
> >  	/* To protect the above members. */
> >  	struct mutex mutex;
> >  };
> >
> > -#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
> > +#endif /* _I915_HDCP_INTERFACE_H_ */
> > --
> > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp
  2023-03-06 12:00   ` Shankar, Uma
@ 2023-03-06 12:51     ` Kandpal, Suraj
  0 siblings, 0 replies; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-06 12:51 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo

> 
> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: Wednesday, February 1, 2023 2:38 PM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > <suraj.kandpal@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>;
> > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > <uma.shankar@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>
> > Subject: [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic
> > hdcp
> 
> Prefix drm.
> 
Sure

> > As now we have more then one type of content protection secrity
> > firmware. Let
> 
> Typo in security
> 
Will fix
> > change the i915_hdcp_interface.h header naming convention to suit
> > generic f/w type.
> > %s/MEI_/HDCP_
> > %s/mei_dev/hdcp_dev
> >
> > As interface to CP FW can be either a non i915 component or
> > i915 intergral component, change structure name Accordingly.
> > %s/i915_hdcp_comp_master/i915_hdcp_master
> > %s/i915_hdcp_component_ops/i915_hdcp_ops
> 
> Description seems to be off from the changes in the patch. Please fix.
> 
> > --v3
> > -Changing names to drop cp_fw to make naming more agnostic[Jani]
> >
> > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Cc: Uma Shankar <uma.shankar@intel.com>
> > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display_core.h | 1 +
> >  drivers/gpu/drm/i915/display/intel_hdcp.c         | 4 ++--
> >  2 files changed, 3 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > index 8e7a68339876..139100fe2383 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > @@ -15,6 +15,7 @@
> >
> >  #include <drm/drm_connector.h>
> >  #include <drm/drm_modeset_lock.h>
> > +#include <drm/i915_hdcp_interface.h>
> 
> This change doesn't seem to affect the changes below. Please move this to
> the right patch.

Okay got it

Regards,
Suraj Kandpal
> 
> >
> >  #include "intel_cdclk.h"
> >  #include "intel_display_limits.h"
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index 262c76f21801..0d6aed1eb171 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > @@ -1409,7 +1409,7 @@ static int hdcp2_authenticate_port(struct
> > intel_connector
> > *connector)
> >  	return ret;
> >  }
> >
> > -static int hdcp2_close_mei_session(struct intel_connector *connector)
> > +static int hdcp2_close_session(struct intel_connector *connector)
> >  {
> >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> @@
> > -
> > 1433,7 +1433,7 @@ static int hdcp2_close_mei_session(struct
> > intel_connector
> > *connector)
> >
> >  static int hdcp2_deauthenticate_port(struct intel_connector *connector)  {
> > -	return hdcp2_close_mei_session(connector);
> > +	return hdcp2_close_session(connector);
> >  }
> >
> >  /* Authentication flow starts from here */
> > --
> > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS
  2023-03-06 12:32   ` Shankar, Uma
@ 2023-03-06 12:54     ` Kandpal, Suraj
  0 siblings, 0 replies; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-06 12:54 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Teres Alexis, Alan Previn



> -----Original Message-----
> From: Shankar, Uma <uma.shankar@intel.com>
> Sent: Monday, March 6, 2023 6:03 PM
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Ceraolo Spurio, Daniele
> <daniele.ceraolospurio@intel.com>; Teres Alexis, Alan Previn
> <alan.previn.teres.alexis@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>
> Subject: RE: [PATCH v10 5/6] drm/i915/mtl: Add function to send command
> to GSC CS
> 
> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: Wednesday, February 1, 2023 2:38 PM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > <suraj.kandpal@intel.com>; Ceraolo Spurio, Daniele
> > <daniele.ceraolospurio@intel.com>; Teres Alexis, Alan Previn
> > <alan.previn.teres.alexis@intel.com>; Shankar, Uma
> > <uma.shankar@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>
> > Subject: [PATCH v10 5/6] drm/i915/mtl: Add function to send command to
> > GSC CS
> >
> > Add function that takes care of sending command to gsc cs. We start of
> > with allocation of memory for our command intel_hdcp_gsc_message that
> > contains gsc cs memory header as directed in specs followed by the
> > actual payload hdcp message that we want to send.
> > Spec states that we need to poll pending bit of response header around
> > 20 times each try being 50ms apart hence adding that to current
> > gsc_msg_send function Also we use the same function to take care of
> > both sending and receiving hence no separate function to get the response.
> >
> > --v4
> > -Create common function to fill in gsc_mtl_header [Alan] -define host
> > session bitmask [Alan]
> >
> > --v5
> > -use i915 directly instead of gt->i915 [Alan] -No need to make fields
> > NULL as we are already using kzalloc [Alan]
> >
> > --v8
> > -change mechanism to reuse the same memory for one hdcp session[Alan]
> > -fix header ordering -add comments to explain flags and host session
> > mask [Alan]
> >
> > --v9
> > -remove gem obj from hdcp message as we can use
> > i915_vma_unpin_and_release [Alan] -move hdcp message allocation and
> > deallocation from hdcp2_enable and hdcp2_disable to init and teardown
> > of HDCP [Alan]
> >
> > --v10
> > -remove unnecessary i915_vma_unpin [Alan]
> >
> > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> > Cc: Alan Pervin Teres <alan.previn.teres.alexis@intel.com>
> > Cc: Uma Shankar <uma.shankar@intel.com>
> > Cc: Anshuman Gupta <anshuman.gupta@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > Reviewed-by: Alan Previn <alan.previn.teres.alexis@intel.com>
> > ---
> >  drivers/gpu/drm/i915/Makefile                 |   1 +
> >  .../gpu/drm/i915/display/intel_display_core.h |   5 +
> >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 198
> > ++++++++++++++++++ drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  23
> > ++ .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c |  15 ++
> > .../i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h |  16 ++
> >  6 files changed, 258 insertions(+)
> >  create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> >  create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> >
> > diff --git a/drivers/gpu/drm/i915/Makefile
> > b/drivers/gpu/drm/i915/Makefile index 482928cffb1c..ba76bec715af
> > 100644
> > --- a/drivers/gpu/drm/i915/Makefile
> > +++ b/drivers/gpu/drm/i915/Makefile
> > @@ -255,6 +255,7 @@ i915-y += \
> >  	display/intel_frontbuffer.o \
> >  	display/intel_global_state.o \
> >  	display/intel_hdcp.o \
> > +	display/intel_hdcp_gsc.o \
> >  	display/intel_hotplug.o \
> >  	display/intel_hti.o \
> >  	display/intel_lpe_audio.o \
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > index 139100fe2383..20d2a79a5d05 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > @@ -382,6 +382,11 @@ struct intel_display {
> >  		struct i915_hdcp_master *master;
> >  		bool comp_added;
> >
> > +		/*HDCP message struct for allocation of memory which can
> be
> > reused
> 
> Fix Comment style.

Sure 
> 
> > +		 * when sending message to gsc cs
> > +		 * this is only populated post Meteorlake
> > +		 */
> > +		struct intel_hdcp_gsc_message *hdcp_message;
> >  		/* Mutex to protect the above hdcp component related
> values. */
> >  		struct mutex comp_mutex;
> >  	} hdcp;
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > new file mode 100644
> > index 000000000000..8e3b5e6733d7
> > --- /dev/null
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > @@ -0,0 +1,198 @@
> > +// SPDX-License-Identifier: MIT
> > +/*
> > + * Copyright 2023, Intel Corporation.
> > + */
> > +
> > +#include "display/intel_hdcp_gsc.h"
> > +#include "gem/i915_gem_region.h"
> > +#include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> > +#include "i915_drv.h"
> > +#include "i915_utils.h"
> > +
> > +/*This function helps allocate memory for the command that we will
> > +send to gsc cs */ static int intel_hdcp_gsc_initialize_message(struct
> > +drm_i915_private
> > *i915,
> > +					     struct intel_hdcp_gsc_message
> > *hdcp_message) {
> > +	struct intel_gt *gt = i915->media_gt;
> > +	struct drm_i915_gem_object *obj = NULL;
> > +	struct i915_vma *vma = NULL;
> > +	void *cmd;
> > +	int err;
> > +
> > +	/* allocate object of one page for HDCP command memory and store
> it */
> > +	obj = i915_gem_object_create_shmem(i915, PAGE_SIZE);
> > +
> > +	if (IS_ERR(obj)) {
> > +		drm_err(&i915->drm, "Failed to allocate HDCP streaming
> > command!\n");
> > +		return PTR_ERR(obj);
> > +	}
> > +
> > +	cmd = i915_gem_object_pin_map_unlocked(obj,
> > i915_coherent_map_type(i915, obj, true));
> > +	if (IS_ERR(cmd)) {
> > +		drm_err(&i915->drm, "Failed to map gsc message page!\n");
> > +		err = PTR_ERR(cmd);
> > +		goto out_unpin;
> > +	}
> > +
> > +	vma = i915_vma_instance(obj, &gt->ggtt->vm, NULL);
> > +	if (IS_ERR(vma)) {
> > +		err = PTR_ERR(vma);
> > +		goto out_unmap;
> > +	}
> > +
> > +	err = i915_vma_pin(vma, 0, 0, PIN_GLOBAL);
> > +	if (err)
> > +		goto out_unmap;
> > +
> > +	memset(cmd, 0, obj->base.size);
> > +
> > +	hdcp_message->hdcp_cmd = cmd;
> > +	hdcp_message->vma = vma;
> > +
> > +	return 0;
> > +
> > +out_unmap:
> > +	i915_gem_object_unpin_map(obj);
> > +out_unpin:
> > +	i915_gem_object_put(obj);
> > +	return err;
> > +}
> > +
> > +int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915) {
> > +	struct intel_hdcp_gsc_message *hdcp_message;
> > +	int ret;
> > +
> > +	hdcp_message = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
> > +
> > +	if (!hdcp_message)
> > +		return -ENOMEM;
> > +
> > +	/* NOTE: No need to lock the comp mutex here as it is already
> 
> Fix Comment style.
> 
> > +	 * going to be taken before this function called
> > +	 */
> > +	i915->display.hdcp.hdcp_message = hdcp_message;
> > +	ret = intel_hdcp_gsc_initialize_message(i915, hdcp_message);
> > +
> > +	if (ret)
> > +		drm_err(&i915->drm, "Could not initialize
> hdcp_message\n");
> > +
> > +	return ret;
> > +}
> > +
> > +void intel_hdcp_gsc_free_message(struct drm_i915_private *i915) {
> > +	struct intel_hdcp_gsc_message *hdcp_message =
> > +					i915->display.hdcp.hdcp_message;
> > +
> > +	i915_vma_unpin_and_release(&hdcp_message->vma,
> > I915_VMA_RELEASE_MAP);
> > +	kfree(hdcp_message);
> > +}
> > +
> > +static int intel_gsc_send_sync(struct drm_i915_private *i915,
> > +			       struct intel_gsc_mtl_header *header, u64 addr,
> > +			       size_t msg_out_len)
> > +{
> > +	struct intel_gt *gt = i915->media_gt;
> > +	int ret;
> > +
> > +	header->flags = 0;
> > +	ret = intel_gsc_uc_heci_cmd_submit_packet(&gt->uc.gsc, addr,
> > +						  header->message_size,
> > +						  addr,
> > +						  msg_out_len +
> sizeof(*header));
> > +	if (ret) {
> > +		drm_err(&i915->drm, "failed to send gsc HDCP msg (%d)\n",
> ret);
> > +		return ret;
> > +	}
> 
> Leave a line gap.

Okay got it

Regards,
Suraj Kandpal
> 
> > +	/*
> > +	 * Checking validity marker for memory sanity
> > +	 */
> > +	if (header->validity_marker != GSC_HECI_VALIDITY_MARKER) {
> > +		drm_err(&i915->drm, "invalid validity marker\n");
> > +		return -EINVAL;
> > +	}
> > +
> > +	if (header->status != 0) {
> > +		drm_err(&i915->drm, "header status indicates error %d\n",
> > +			header->status);
> > +		return -EINVAL;
> > +	}
> > +
> > +	if (header->flags & GSC_OUTFLAG_MSG_PENDING)
> > +		return -EAGAIN;
> > +
> > +	return 0;
> > +}
> > +
> > +/*
> > + * This function can now be used for sending requests and will also
> > +handle
> > + * receipt of reply messages hence no different function of message
> > +retrieval
> > + * is required. We will initialize intel_hdcp_gsc_message structure
> > +then add
> > + * gsc cs memory header as stated in specs after which the normal
> > +HDCP payload
> > + * will follow
> > + */
> > +ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> > +				size_t msg_in_len, u8 *msg_out, size_t
> > msg_out_len) {
> > +	struct intel_gt *gt = i915->media_gt;
> > +	struct intel_gsc_mtl_header *header;
> > +	const size_t max_msg_size = PAGE_SIZE - sizeof(*header);
> > +	struct intel_hdcp_gsc_message *hdcp_message;
> > +	u64 addr, host_session_id;
> > +	u32 reply_size, msg_size;
> > +	int ret, tries = 0;
> > +
> > +	if (!intel_uc_uses_gsc_uc(&gt->uc))
> > +		return -ENODEV;
> > +
> > +	if (msg_in_len > max_msg_size || msg_out_len > max_msg_size)
> > +		return -ENOSPC;
> > +
> > +	hdcp_message = i915->display.hdcp.hdcp_message;
> > +	header = hdcp_message->hdcp_cmd;
> > +	addr = i915_ggtt_offset(hdcp_message->vma);
> > +
> > +	msg_size = msg_in_len + sizeof(*header);
> > +	memset(header, 0, msg_size);
> > +	get_random_bytes(&host_session_id, sizeof(u64));
> > +	intel_gsc_uc_heci_cmd_emit_mtl_header(header,
> > HECI_MEADDRESS_HDCP,
> > +					      msg_size, host_session_id);
> > +	memcpy(hdcp_message->hdcp_cmd + sizeof(*header), msg_in,
> > +msg_in_len);
> > +
> > +	/*
> > +	 * Keep sending request in case the pending bit is set no need to add
> > +	 * message handle as we are using same address hence loc. of
> header is
> > +	 * same and it will contain the message handle. we will send the
> message
> > +	 * 20 times each message 50 ms apart
> > +	 */
> > +	do {
> > +		ret = intel_gsc_send_sync(i915, header, addr, msg_out_len);
> > +
> > +		/* Only try again if gsc says so */
> > +		if (ret != -EAGAIN)
> > +			break;
> > +
> > +		msleep(50);
> > +
> > +	} while (++tries < 20);
> > +
> > +	if (ret)
> > +		goto err;
> > +
> > +	/* we use the same mem for the reply, so header is in the same loc
> */
> > +	reply_size = header->message_size - sizeof(*header);
> > +	if (reply_size > msg_out_len) {
> > +		drm_warn(&i915->drm, "caller with insufficient HDCP reply
> size %u
> > (%d)\n",
> > +			 reply_size, (u32)msg_out_len);
> > +		reply_size = msg_out_len;
> > +	} else if (reply_size != msg_out_len) {
> > +		drm_dbg_kms(&i915->drm, "caller unexpected HCDP reply
> size %u
> > (%d)\n",
> > +			    reply_size, (u32)msg_out_len);
> > +	}
> > +
> > +	memcpy(msg_out, hdcp_message->hdcp_cmd + sizeof(*header),
> > +msg_out_len);
> > +
> > +err:
> > +	return ret;
> > +}
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > new file mode 100644
> > index 000000000000..09ffd7ec02cd
> > --- /dev/null
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > @@ -0,0 +1,23 @@
> > +/* SPDX-License-Identifier: MIT */
> > +/*
> > + * Copyright © 2023 Intel Corporation  */
> > +
> > +#ifndef __INTEL_HDCP_GSC_H__
> > +#define __INTEL_HDCP_GSC_H__
> > +
> > +#include <linux/err.h>
> > +#include <linux/types.h>
> > +
> > +struct drm_i915_private;
> > +
> > +struct intel_hdcp_gsc_message {
> > +	struct i915_vma *vma;
> > +	void *hdcp_cmd;
> > +};
> > +
> > +ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> > +				size_t msg_in_len, u8 *msg_out,
> > +				size_t msg_out_len);
> > +
> > +#endif /* __INTEL_HDCP_GCS_H__ */
> > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > index be2424af521d..ea0da06e2f39 100644
> > --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.c
> > @@ -92,3 +92,18 @@ int intel_gsc_uc_heci_cmd_submit_packet(struct
> > intel_gsc_uc *gsc, u64 addr_in,
> >
> >  	return err;
> >  }
> > +
> > +void intel_gsc_uc_heci_cmd_emit_mtl_header(struct
> > +intel_gsc_mtl_header
> > *header,
> > +					   u8 heci_client_id, u32
> message_size,
> > +					   u64 host_session_id)
> > +{
> > +	host_session_id &= ~HOST_SESSION_MASK;
> > +	if (heci_client_id == HECI_MEADDRESS_PXP)
> > +		host_session_id |= HOST_SESSION_PXP_SINGLE;
> > +
> > +	header->validity_marker = GSC_HECI_VALIDITY_MARKER;
> > +	header->heci_client_id = heci_client_id;
> > +	header->host_session_handle = host_session_id;
> > +	header->header_version = MTL_GSC_HEADER_VERSION;
> > +	header->message_size = message_size; }
> > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > index cf610dfca7a5..3d56ae501991 100644
> > --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
> > @@ -22,7 +22,17 @@ struct intel_gsc_mtl_header {
> >  	u16 header_version;
> >  #define MTL_GSC_HEADER_VERSION 1
> >
> > +	/*
> > +	 * FW allows host to decide host_session handle
> > +	 * as it sees fit.
> > +	 * For intertracebility reserving select bits(60-63)
> > +	 * to differentiate caller-target subsystem
> > +	 * 0000 - HDCP
> > +	 * 0001 - PXP Single Session
> > +	 */
> >  	u64 host_session_handle;
> > +#define HOST_SESSION_MASK	REG_GENMASK64(63, 60)
> > +#define HOST_SESSION_PXP_SINGLE BIT_ULL(60)
> >  	u64 gsc_message_handle;
> >
> >  	u32 message_size; /* lower 20 bits only, upper 12 are reserved */
> @@
> > -33,8
> > +43,11 @@ struct intel_gsc_mtl_header {
> >  	 * Bit 1: Session Cleanup;
> >  	 * Bits 2-15: Flags
> >  	 * Bits 16-31: Extension Size
> > +	 * According to internal spec flags are either input or output
> > +	 * we distinguish the flags using OUTFLAG or INFLAG
> >  	 */
> >  	u32 flags;
> > +#define GSC_OUTFLAG_MSG_PENDING	1
> >
> >  	u32 status;
> >  } __packed;
> > @@ -42,4 +55,7 @@ struct intel_gsc_mtl_header {  int
> > intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc,
> >  					u64 addr_in, u32 size_in,
> >  					u64 addr_out, u32 size_out);
> > +void intel_gsc_uc_heci_cmd_emit_mtl_header(struct
> > +intel_gsc_mtl_header
> > *header,
> > +					   u8 heci_client_id, u32
> message_size,
> > +					   u64 host_session_id);
> >  #endif
> > --
> > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention
  2023-03-06 12:50     ` Kandpal, Suraj
@ 2023-03-07  6:40       ` Shankar, Uma
  2023-03-07  6:48         ` Kandpal, Suraj
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-07  6:40 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Monday, March 6, 2023 6:20 PM
> To: Shankar, Uma <uma.shankar@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>; Vivi,
> Rodrigo <rodrigo.vivi@intel.com>
> Subject: RE: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention
> 
> >
> >
> > > -----Original Message-----
> > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > To: intel-gfx@lists.freedesktop.org
> > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta, Anshuman
> > > <anshuman.gupta@intel.com>; Winkler, Tomas
> > <tomas.winkler@intel.com>;
> > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > <uma.shankar@intel.com>; Kandpal, Suraj <suraj.kandpal@intel.com>
> > > Subject: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming
> > > convention
> >
> > Typo in agnostic.
> >
> > Also I feel this header can be re-phrased: "Use generic names for HDCP
> > helpers and structs"
> > Add the rationale why this is required, explain the legacy and new
> > usage which is the cause for this patch.
> >
> 
> Sure will add it in the next version
> 
> Regards,
> Suraj Kandpal
> > >
> > > From: Anshuman Gupta <anshuman.gupta@intel.com>
> > >
> > > Change the include/drm/i915_mei_hdcp_interface.h to
> > > include/drm/i915_hdcp_interface.h
> > >
> > > --v6
> > > -make each patch build individually [Jani]
> > >
> > > --v8
> > > -change ME FW to ME/GSC FW [Ankit]
> > > -fix formatting issue [Ankit]
> > >
> > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > Acked-by: Tomas Winkler <tomas.winkler@intel.com>
> > > ---
> > >  .../gpu/drm/i915/display/intel_display_core.h |  2 +-
> > >  .../drm/i915/display/intel_display_types.h    |  2 +-
> > >  drivers/gpu/drm/i915/display/intel_hdcp.c     | 81 ++++++++--------
> > >  drivers/misc/mei/hdcp/mei_hdcp.c              | 61 ++++++------
> > >  ...hdcp_interface.h => i915_hdcp_interface.h} | 92
> > > +++++++++----------
> > >  5 files changed, 118 insertions(+), 120 deletions(-)  rename
> > > include/drm/{i915_mei_hdcp_interface.h => i915_hdcp_interface.h}
> > > (73%)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > > index fb8670aa2932..8e7a68339876 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > > @@ -378,7 +378,7 @@ struct intel_display {
> > >  	} gmbus;
> > >
> > >  	struct {
> > > -		struct i915_hdcp_comp_master *master;
> > > +		struct i915_hdcp_master *master;
> >
> > Since we are changing this up, can we drop the use of phrase like "master"
> > etc, if feasible in the series, else this can be taken with a follow
> > up cleanup series.
> 
> I actually plan on cleaning this up later on in a different hdcp cleanup series

Ok sure, create an internal task to track this.

> 
> >
> > >  		bool comp_added;
> > >
> > >  		/* Mutex to protect the above hdcp component related
> > values. */
> > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > > index 9ccae7a46020..7accd3a8877c 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > > @@ -43,7 +43,7 @@
> > >  #include <drm/drm_rect.h>
> > >  #include <drm/drm_vblank.h>
> > >  #include <drm/drm_vblank_work.h>
> > > -#include <drm/i915_mei_hdcp_interface.h>
> > > +#include <drm/i915_hdcp_interface.h>
> > >  #include <media/cec-notifier.h>
> > >
> > >  #include "i915_vma.h"
> > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > index 6406fd487ee5..262c76f21801 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > @@ -1143,7 +1143,7 @@ hdcp2_prepare_ake_init(struct intel_connector
> > > *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> >
> > comp name is relevant if we use component framework, having the name
> > for a generic case doesn't seem right. Change it universally in patch.
> 
> I think I lost you here as the change here from my side was i915_hdcp_comp_master
> to I915_hdcp_master and I left the variable name as is.
> If you do want me to change the variable name what do you think would be better

Comp is a name assuming we are using component framework but that is limited to
only mei not gsc. A more generic name would be better.

> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1154,7 +1154,7 @@ hdcp2_prepare_ake_init(struct intel_connector
> > > *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->initiate_hdcp2_session(comp->mei_dev, data,
> > ake_data);
> > > +	ret = comp->ops->initiate_hdcp2_session(comp->hdcp_dev, data,
> > > +ake_data);
> > >  	if (ret)
> > >  		drm_dbg_kms(&dev_priv->drm, "Prepare_ake_init failed.
> > %d\n",
> > >  			    ret);
> > > @@ -1173,7 +1173,7 @@ hdcp2_verify_rx_cert_prepare_km(struct
> > > intel_connector *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1184,7 +1184,7 @@ hdcp2_verify_rx_cert_prepare_km(struct
> > > intel_connector *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->verify_receiver_cert_prepare_km(comp->mei_dev,
> > data,
> > > +	ret = comp->ops->verify_receiver_cert_prepare_km(comp-
> > >hdcp_dev,
> > > +data,
> > >  							 rx_cert, paired,
> > >  							 ek_pub_km,
> > msg_sz);
> > >  	if (ret < 0)
> > > @@ -1201,7 +1201,7 @@ static int hdcp2_verify_hprime(struct
> > > intel_connector *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1212,7 +1212,7 @@ static int hdcp2_verify_hprime(struct
> > > intel_connector *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->verify_hprime(comp->mei_dev, data, rx_hprime);
> > > +	ret = comp->ops->verify_hprime(comp->hdcp_dev, data, rx_hprime);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Verify hprime failed.
> > %d\n", ret);
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1227,7 +1227,7 @@ hdcp2_store_pairing_info(struct
> > > intel_connector *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1238,7 +1238,7 @@ hdcp2_store_pairing_info(struct
> > > intel_connector *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->store_pairing_info(comp->mei_dev, data,
> > pairing_info);
> > > +	ret = comp->ops->store_pairing_info(comp->hdcp_dev, data,
> > > +pairing_info);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Store pairing info failed.
> > %d\n",
> > >  			    ret);
> > > @@ -1254,7 +1254,7 @@ hdcp2_prepare_lc_init(struct intel_connector
> > *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1265,7 +1265,7 @@ hdcp2_prepare_lc_init(struct intel_connector
> > *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->initiate_locality_check(comp->mei_dev, data,
> > lc_init);
> > > +	ret = comp->ops->initiate_locality_check(comp->hdcp_dev, data,
> > > +lc_init);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Prepare lc_init failed.
> > %d\n",
> > >  			    ret);
> > > @@ -1281,7 +1281,7 @@ hdcp2_verify_lprime(struct intel_connector
> > *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1292,7 +1292,7 @@ hdcp2_verify_lprime(struct intel_connector
> > *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->verify_lprime(comp->mei_dev, data, rx_lprime);
> > > +	ret = comp->ops->verify_lprime(comp->hdcp_dev, data, rx_lprime);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Verify L_Prime failed.
> > %d\n",
> > >  			    ret);
> > > @@ -1307,7 +1307,7 @@ static int hdcp2_prepare_skey(struct
> > > intel_connector *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1318,7 +1318,7 @@ static int hdcp2_prepare_skey(struct
> > > intel_connector *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->get_session_key(comp->mei_dev, data, ske_data);
> > > +	ret = comp->ops->get_session_key(comp->hdcp_dev, data,
> > ske_data);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Get session key failed.
> > %d\n",
> > >  			    ret);
> > > @@ -1336,7 +1336,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct
> > > intel_connector *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1347,7 +1347,7 @@ hdcp2_verify_rep_topology_prepare_ack(struct
> > > intel_connector *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->repeater_check_flow_prepare_ack(comp-
> > >mei_dev,
> > > data,
> > > +	ret = comp->ops->repeater_check_flow_prepare_ack(comp-
> > >hdcp_dev,
> > > data,
> > >  							 rep_topology,
> > >  							 rep_send_ack);
> > >  	if (ret < 0)
> > > @@ -1365,7 +1365,7 @@ hdcp2_verify_mprime(struct intel_connector
> > *connector,
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1376,7 +1376,7 @@ hdcp2_verify_mprime(struct intel_connector
> > *connector,
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->verify_mprime(comp->mei_dev, data,
> > stream_ready);
> > > +	ret = comp->ops->verify_mprime(comp->hdcp_dev, data,
> > stream_ready);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Verify mprime failed.
> > %d\n", ret);
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1389,7 +1389,7 @@ static int hdcp2_authenticate_port(struct
> > > intel_connector
> > > *connector)
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1400,7 +1400,7 @@ static int hdcp2_authenticate_port(struct
> > > intel_connector
> > > *connector)
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->enable_hdcp_authentication(comp->mei_dev,
> > data);
> > > +	ret = comp->ops->enable_hdcp_authentication(comp->hdcp_dev,
> > data);
> > >  	if (ret < 0)
> > >  		drm_dbg_kms(&dev_priv->drm, "Enable hdcp auth failed.
> > %d\n",
> > >  			    ret);
> > > @@ -1413,7 +1413,7 @@ static int hdcp2_close_mei_session(struct
> > > intel_connector
> > > *connector)  {
> > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > -	struct i915_hdcp_comp_master *comp;
> > > +	struct i915_hdcp_master *comp;
> > >  	int ret;
> > >
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -1424,7 +1424,7 @@ static int hdcp2_close_mei_session(struct
> > > intel_connector
> > > *connector)
> > >  		return -EINVAL;
> > >  	}
> > >
> > > -	ret = comp->ops->close_hdcp_session(comp->mei_dev,
> > > +	ret = comp->ops->close_hdcp_session(comp->hdcp_dev,
> > >  					     &dig_port->hdcp_port_data);
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > >
> > > @@ -2145,8 +2145,8 @@ static int i915_hdcp_component_bind(struct
> > > device *i915_kdev,
> > >
> > >  	drm_dbg(&dev_priv->drm, "I915 HDCP comp bind\n");
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > -	dev_priv->display.hdcp.master = (struct i915_hdcp_comp_master
> > *)data;
> > > -	dev_priv->display.hdcp.master->mei_dev = mei_kdev;
> > > +	dev_priv->display.hdcp.master = (struct i915_hdcp_master *)data;
> > > +	dev_priv->display.hdcp.master->hdcp_dev = mei_kdev;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > >
> > >  	return 0;
> > > @@ -2163,30 +2163,30 @@ static void
> > i915_hdcp_component_unbind(struct
> > > device *i915_kdev,
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > >  }
> > >
> > > -static const struct component_ops i915_hdcp_component_ops = {
> > > +static const struct component_ops i915_hdcp_ops = {
> > >  	.bind   = i915_hdcp_component_bind,
> > >  	.unbind = i915_hdcp_component_unbind,  };
> > >
> > > -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> > > +static enum hdcp_ddi intel_get_hdcp_ddi_index(enum port port)
> > >  {
> > >  	switch (port) {
> > >  	case PORT_A:
> > > -		return MEI_DDI_A;
> > > +		return HDCP_DDI_A;
> > >  	case PORT_B ... PORT_F:
> > > -		return (enum mei_fw_ddi)port;
> > > +		return (enum hdcp_ddi)port;
> > >  	default:
> > > -		return MEI_DDI_INVALID_PORT;
> > > +		return HDCP_DDI_INVALID_PORT;
> > >  	}
> > >  }
> > >
> > > -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder
> > > cpu_transcoder)
> > > +static enum hdcp_transcoder intel_get_hdcp_transcoder(enum
> > transcoder
> > > +cpu_transcoder)
> > >  {
> > >  	switch (cpu_transcoder) {
> > >  	case TRANSCODER_A ... TRANSCODER_D:
> > > -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> > > +		return (enum hdcp_transcoder)(cpu_transcoder | 0x10);
> > >  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> > > -		return MEI_INVALID_TRANSCODER;
> > > +		return HDCP_INVALID_TRANSCODER;
> > >  	}
> > >  }
> > >
> > > @@ -2200,20 +2200,20 @@ static int initialize_hdcp_port_data(struct
> > > intel_connector *connector,
> > >  	enum port port = dig_port->base.port;
> > >
> > >  	if (DISPLAY_VER(dev_priv) < 12)
> > > -		data->fw_ddi = intel_get_mei_fw_ddi_index(port);
> > > +		data->hdcp_ddi = intel_get_hdcp_ddi_index(port);
> > >  	else
> > >  		/*
> > > -		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
> > > +		 * As per ME FW API expectation, for GEN 12+, hdcp_ddi is
> > filled
> > >  		 * with zero(INVALID PORT index).
> > >  		 */
> > > -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> > > +		data->hdcp_ddi = HDCP_DDI_INVALID_PORT;
> > >
> > >  	/*
> > > -	 * As associated transcoder is set and modified at modeset, here
> > fw_tc
> > > +	 * As associated transcoder is set and modified at modeset, here
> > > +hdcp_transcoder
> > >  	 * is initialized to zero (invalid transcoder index). This will be
> > >  	 * retained for <Gen12 forever.
> > >  	 */
> > > -	data->fw_tc = MEI_INVALID_TRANSCODER;
> > > +	data->hdcp_transcoder = HDCP_INVALID_TRANSCODER;
> > >
> > >  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
> > >  	data->protocol = (u8)shim->protocol; @@ -2256,7 +2256,7 @@ void
> > > intel_hdcp_component_init(struct drm_i915_private
> > > *dev_priv)
> > >
> > >  	dev_priv->display.hdcp.comp_added = true;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > -	ret = component_add_typed(dev_priv->drm.dev,
> > > &i915_hdcp_component_ops,
> > > +	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > >  				  I915_COMPONENT_HDCP);
> > >  	if (ret < 0) {
> > >  		drm_dbg_kms(&dev_priv->drm, "Failed at component
> > add(%d)\n", @@
> > > -2350,7 +2350,8 @@ int intel_hdcp_enable(struct intel_connector
> > *connector,
> > >  	}
> > >
> > >  	if (DISPLAY_VER(dev_priv) >= 12)
> > > -		dig_port->hdcp_port_data.fw_tc =
> > intel_get_mei_fw_tc(hdcp-
> > > >cpu_transcoder);
> > > +		dig_port->hdcp_port_data.hdcp_transcoder =
> > > +			intel_get_hdcp_transcoder(hdcp->cpu_transcoder);
> > >
> > >  	/*
> > >  	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the
> > > setup @@ -
> > > 2485,7 +2486,7 @@ void intel_hdcp_component_fini(struct
> > > drm_i915_private
> > > *dev_priv)
> > >  	dev_priv->display.hdcp.comp_added = false;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > >
> > > -	component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);
> > > +	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > >  }
> > >
> > >  void intel_hdcp_cleanup(struct intel_connector *connector) diff
> > > --git a/drivers/misc/mei/hdcp/mei_hdcp.c
> > b/drivers/misc/mei/hdcp/mei_hdcp.c
> > > index e889a8bd7ac8..b2c49599809c 100644
> > > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> > > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> > > @@ -23,7 +23,7 @@
> > >  #include <linux/component.h>
> > >  #include <drm/drm_connector.h>
> > >  #include <drm/i915_component.h>
> > > -#include <drm/i915_mei_hdcp_interface.h>
> > > +#include <drm/i915_hdcp_interface.h>
> > >
> > >  #include "mei_hdcp.h"
> > >
> > > @@ -57,8 +57,8 @@ mei_hdcp_initiate_session(struct device *dev,
> > > struct hdcp_port_data *data,
> > >
> > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > >
> > >  	session_init_in.port.integrated_port_type = data->port_type;
> > > -	session_init_in.port.physical_port = (u8)data->fw_ddi;
> > > -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	session_init_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >  	session_init_in.protocol = data->protocol;
> > >
> > >  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in, @@ -127,8
> > > +127,8 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device
> > *dev,
> > >
> > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > >
> > >  	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > > -	verify_rxcert_in.port.physical_port = (u8)data->fw_ddi;
> > > -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_rxcert_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >
> > >  	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > >  	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
> > @@
> > > -
> > > 198,8 +198,8 @@ mei_hdcp_verify_hprime(struct device *dev, struct
> > > hdcp_port_data *data,
> > >  	send_hprime_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > >
> > >  	send_hprime_in.port.integrated_port_type = data->port_type;
> > > -	send_hprime_in.port.physical_port = (u8)data->fw_ddi;
> > > -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	send_hprime_in.port.attached_transcoder = (u8)data-
> > >hdcp_transcoder;
> > >
> > >  	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > >  	       HDCP_2_2_H_PRIME_LEN);
> > > @@ -256,8 +256,8 @@ mei_hdcp_store_pairing_info(struct device *dev,
> > > struct hdcp_port_data *data,
> > >
> > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > >
> > >  	pairing_info_in.port.integrated_port_type = data->port_type;
> > > -	pairing_info_in.port.physical_port = (u8)data->fw_ddi;
> > > -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	pairing_info_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >
> > >  	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > >  	       HDCP_2_2_E_KH_KM_LEN);
> > > @@ -315,8 +315,8 @@ mei_hdcp_initiate_locality_check(struct device
> > *dev,
> > >  	lc_init_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > >
> > >  	lc_init_in.port.integrated_port_type = data->port_type;
> > > -	lc_init_in.port.physical_port = (u8)data->fw_ddi;
> > > -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > >
> > >  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
> > >  	if (byte < 0) {
> > > @@ -371,8 +371,8 @@ mei_hdcp_verify_lprime(struct device *dev,
> > > struct hdcp_port_data *data,
> > >
> > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > >
> > >  	verify_lprime_in.port.integrated_port_type = data->port_type;
> > > -	verify_lprime_in.port.physical_port = (u8)data->fw_ddi;
> > > -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_lprime_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >
> > >  	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > >  	       HDCP_2_2_L_PRIME_LEN);
> > > @@ -429,8 +429,8 @@ static int mei_hdcp_get_session_key(struct
> > > device
> > *dev,
> > >  	get_skey_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > >
> > >  	get_skey_in.port.integrated_port_type = data->port_type;
> > > -	get_skey_in.port.physical_port = (u8)data->fw_ddi;
> > > -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > >
> > >  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in,
> > sizeof(get_skey_in));
> > >  	if (byte < 0) {
> > > @@ -494,8 +494,8 @@
> > mei_hdcp_repeater_check_flow_prepare_ack(struct
> > > device *dev,
> > >
> > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > >
> > >  	verify_repeater_in.port.integrated_port_type = data->port_type;
> > > -	verify_repeater_in.port.physical_port = (u8)data->fw_ddi;
> > > -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_repeater_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >
> > >  	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > >  	       HDCP_2_2_RXINFO_LEN);
> > > @@ -572,8 +572,8 @@ static int mei_hdcp_verify_mprime(struct device
> > *dev,
> > >  	verify_mprime_in->header.buffer_len = cmd_size  -
> > > sizeof(verify_mprime_in-
> > > >header);
> > >
> > >  	verify_mprime_in->port.integrated_port_type = data->port_type;
> > > -	verify_mprime_in->port.physical_port = (u8)data->fw_ddi;
> > > -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_mprime_in->port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >
> > >  	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > > HDCP_2_2_MPRIME_LEN);
> > >  	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > > >seq_num_m); @@ -634,8 +634,8 @@ static int
> > > mei_hdcp_enable_authentication(struct device *dev,
> > >  	enable_auth_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > >
> > >  	enable_auth_in.port.integrated_port_type = data->port_type;
> > > -	enable_auth_in.port.physical_port = (u8)data->fw_ddi;
> > > -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> > >hdcp_transcoder;
> > >  	enable_auth_in.stream_type = data->streams[0].stream_type;
> > >
> > >  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in, @@ -689,8
> > +689,8
> > > @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > *data)
> > >  				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > >
> > >  	session_close_in.port.integrated_port_type = data->port_type;
> > > -	session_close_in.port.physical_port = (u8)data->fw_ddi;
> > > -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
> > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	session_close_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > >
> > >  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
> > >  			      sizeof(session_close_in)); @@ -715,7 +715,7 @@
> > > mei_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > > *data)
> > >  	return 0;
> > >  }
> > >
> > > -static const struct i915_hdcp_component_ops mei_hdcp_ops = {
> > > +static const struct i915_hdcp_ops mei_hdcp_ops = {
> > >  	.owner = THIS_MODULE,
> > >  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
> > >  	.verify_receiver_cert_prepare_km = @@ -735,13 +735,12 @@ static
> > > const struct i915_hdcp_component_ops mei_hdcp_ops = {  static int
> > > mei_component_master_bind(struct device
> > *dev)  {
> > >  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> > > -	struct i915_hdcp_comp_master *comp_master =
> > > -
> > 	mei_cldev_get_drvdata(cldev);
> > > +	struct i915_hdcp_master *comp_master =
> > mei_cldev_get_drvdata(cldev);
> > >  	int ret;
> > >
> > >  	dev_dbg(dev, "%s\n", __func__);
> > >  	comp_master->ops = &mei_hdcp_ops;
> > > -	comp_master->mei_dev = dev;
> > > +	comp_master->hdcp_dev = dev;
> > >  	ret = component_bind_all(dev, comp_master);
> > >  	if (ret < 0)
> > >  		return ret;
> > > @@ -752,8 +751,7 @@ static int mei_component_master_bind(struct
> > device
> > > *dev) static void mei_component_master_unbind(struct device *dev)  {
> > >  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> > > -	struct i915_hdcp_comp_master *comp_master =
> > > -
> > 	mei_cldev_get_drvdata(cldev);
> > > +	struct i915_hdcp_master *comp_master =
> > mei_cldev_get_drvdata(cldev);
> > >
> > >  	dev_dbg(dev, "%s\n", __func__);
> > >  	component_unbind_all(dev, comp_master); @@ -801,7 +799,7 @@
> > static
> > > int mei_hdcp_component_match(struct device *dev, int subcomponent,
> > > static int mei_hdcp_probe(struct mei_cl_device *cldev,
> > >  			  const struct mei_cl_device_id *id)  {
> > > -	struct i915_hdcp_comp_master *comp_master;
> > > +	struct i915_hdcp_master *comp_master;
> > >  	struct component_match *master_match;
> > >  	int ret;
> > >
> > > @@ -846,8 +844,7 @@ static int mei_hdcp_probe(struct mei_cl_device
> > > *cldev,
> > >
> > >  static void mei_hdcp_remove(struct mei_cl_device *cldev)  {
> > > -	struct i915_hdcp_comp_master *comp_master =
> > > -
> > 	mei_cldev_get_drvdata(cldev);
> > > +	struct i915_hdcp_master *comp_master =
> > mei_cldev_get_drvdata(cldev);
> > >  	int ret;
> > >
> > >  	component_master_del(&cldev->dev,
> > &mei_component_master_ops); diff -
> > > -git a/include/drm/i915_mei_hdcp_interface.h
> > > b/include/drm/i915_hdcp_interface.h
> > > similarity index 73%
> > > rename from include/drm/i915_mei_hdcp_interface.h
> > > rename to include/drm/i915_hdcp_interface.h index
> > > f441cbcd95a4..75c75f52ab1b
> > > 100644
> > > --- a/include/drm/i915_mei_hdcp_interface.h
> > > +++ b/include/drm/i915_hdcp_interface.h
> > > @@ -6,15 +6,15 @@
> > >   * Ramalingam C <ramalingam.c@intel.com>
> > >   */
> > >
> > > -#ifndef _I915_MEI_HDCP_INTERFACE_H_ -#define
> > > _I915_MEI_HDCP_INTERFACE_H_
> > > +#ifndef _I915_HDCP_INTERFACE_H_
> > > +#define _I915_HDCP_INTERFACE_H_
> > >
> > >  #include <linux/mutex.h>
> > >  #include <linux/device.h>
> > >  #include <drm/display/drm_hdcp.h>
> > >
> > >  /**
> > > - * enum hdcp_port_type - HDCP port implementation type defined by
> > > ME FW
> > > + * enum hdcp_port_type - HDCP port implementation type defined by
> > > + ME/GSC FW
> > >   * @HDCP_PORT_TYPE_INVALID: Invalid hdcp port type
> > >   * @HDCP_PORT_TYPE_INTEGRATED: In-Host HDCP2.x port
> > >   * @HDCP_PORT_TYPE_LSPCON: HDCP2.2 discrete wired Tx port with
> > LSPCON
> > > @@
> > > -41,46 +41,46 @@ enum hdcp_wired_protocol {
> > >  	HDCP_PROTOCOL_DP
> > >  };
> > >
> > > -enum mei_fw_ddi {
> > > -	MEI_DDI_INVALID_PORT = 0x0,
> > > +enum hdcp_ddi {
> > > +	HDCP_DDI_INVALID_PORT = 0x0,
> > >
> > > -	MEI_DDI_B = 1,
> > > -	MEI_DDI_C,
> > > -	MEI_DDI_D,
> > > -	MEI_DDI_E,
> > > -	MEI_DDI_F,
> > > -	MEI_DDI_A = 7,
> > > -	MEI_DDI_RANGE_END = MEI_DDI_A,
> > > +	HDCP_DDI_B = 1,
> > > +	HDCP_DDI_C,
> > > +	HDCP_DDI_D,
> > > +	HDCP_DDI_E,
> > > +	HDCP_DDI_F,
> > > +	HDCP_DDI_A = 7,
> > > +	HDCP_DDI_RANGE_END = HDCP_DDI_A,
> > >  };
> > >
> > >  /**
> > > - * enum mei_fw_tc - ME Firmware defined index for transcoders
> > > - * @MEI_INVALID_TRANSCODER: Index for Invalid transcoder
> > > - * @MEI_TRANSCODER_EDP: Index for EDP Transcoder
> > > - * @MEI_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > > - * @MEI_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > > - * @MEI_TRANSCODER_A: Index for Transcoder A
> > > - * @MEI_TRANSCODER_B: Index for Transcoder B
> > > - * @MEI_TRANSCODER_C: Index for Transcoder C
> > > - * @MEI_TRANSCODER_D: Index for Transcoder D
> > > + * enum hdcp_tc - ME/GSC Firmware defined index for transcoders
> > > + * @HDCP_INVALID_TRANSCODER: Index for Invalid transcoder
> > > + * @HDCP_TRANSCODER_EDP: Index for EDP Transcoder
> > > + * @HDCP_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > > + * @HDCP_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > > + * @HDCP_TRANSCODER_A: Index for Transcoder A
> > > + * @HDCP_TRANSCODER_B: Index for Transcoder B
> > > + * @HDCP_TRANSCODER_C: Index for Transcoder C
> > > + * @HDCP_TRANSCODER_D: Index for Transcoder D
> > >   */
> > > -enum mei_fw_tc {
> > > -	MEI_INVALID_TRANSCODER = 0x00,
> > > -	MEI_TRANSCODER_EDP,
> > > -	MEI_TRANSCODER_DSI0,
> > > -	MEI_TRANSCODER_DSI1,
> > > -	MEI_TRANSCODER_A = 0x10,
> > > -	MEI_TRANSCODER_B,
> > > -	MEI_TRANSCODER_C,
> > > -	MEI_TRANSCODER_D
> > > +enum hdcp_transcoder {
> > > +	HDCP_INVALID_TRANSCODER = 0x00,
> > > +	HDCP_TRANSCODER_EDP,
> > > +	HDCP_TRANSCODER_DSI0,
> > > +	HDCP_TRANSCODER_DSI1,
> > > +	HDCP_TRANSCODER_A = 0x10,
> > > +	HDCP_TRANSCODER_B,
> > > +	HDCP_TRANSCODER_C,
> > > +	HDCP_TRANSCODER_D
> > >  };
> > >
> > >  /**
> > >   * struct hdcp_port_data - intel specific HDCP port data
> > > - * @fw_ddi: ddi index as per ME FW
> > > - * @fw_tc: transcoder index as per ME FW
> > > - * @port_type: HDCP port type as per ME FW classification
> > > - * @protocol: HDCP adaptation as per ME FW
> > > + * @hdcp_ddi: ddi index as per ME/GSC FW
> > > + * @hdcp_transcoder: transcoder index as per ME/GSC FW
> > > + * @port_type: HDCP port type as per ME/GSC FW classification
> > > + * @protocol: HDCP adaptation as per ME/GSC FW
> > >   * @k: No of streams transmitted on a port. Only on DP MST this is != 1
> > >   * @seq_num_m: Count of RepeaterAuth_Stream_Manage msg
> > propagated.
> > >   *	       Initialized to 0 on AKE_INIT. Incremented after every successful
> > > @@ -90,8 +90,8 @@ enum mei_fw_tc {
> > >   *	     streams
> > >   */
> > >  struct hdcp_port_data {
> > > -	enum mei_fw_ddi fw_ddi;
> > > -	enum mei_fw_tc fw_tc;
> > > +	enum hdcp_ddi hdcp_ddi;
> > > +	enum hdcp_transcoder hdcp_transcoder;
> > >  	u8 port_type;
> > >  	u8 protocol;
> > >  	u16 k;
> > > @@ -100,7 +100,7 @@ struct hdcp_port_data {  };
> > >
> > >  /**
> > > - * struct i915_hdcp_component_ops- ops for HDCP2.2 services.
> > > + * struct i915_hdcp_ops- ops for HDCP2.2 services.
> > >   * @owner: Module providing the ops
> > >   * @initiate_hdcp2_session: Initiate a Wired HDCP2.2 Tx Session.
> > >   *			    And Prepare AKE_Init.
> > > @@ -119,9 +119,9 @@ struct hdcp_port_data {
> > >   * @close_hdcp_session: Close the Wired HDCP Tx session per port.
> > >   *			This also disables the authenticated state of the port.
> > >   */
> > > -struct i915_hdcp_component_ops {
> > > +struct i915_hdcp_ops {
> > >  	/**
> > > -	 * @owner: mei_hdcp module
> > > +	 * @owner: hdcp module
> > >  	 */
> > >  	struct module *owner;
> > >
> > > @@ -169,16 +169,16 @@ struct i915_hdcp_component_ops {
> > >
> > >  /**
> > >   * struct i915_hdcp_component_master - Used for communication
> > between
> > > i915
> >
> > Name doesn't match with the structure, please fix.
> >
> 
> Okay it missed this will do
> 
> Regards,
> Suraj Kandpal
> > > - * and mei_hdcp drivers for the HDCP2.2 services
> > > - * @mei_dev: device that provide the HDCP2.2 service from MEI Bus.
> > > - * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
> > > + * and hdcp drivers for the HDCP2.2 services
> > > + * @hdcp_dev: device that provide the HDCP2.2 service from MEI Bus.
> > > + * @hdcp_ops: Ops implemented by hdcp driver or intel_hdcp_gsc ,
> > > + used by i915
> > > driver.
> > >   */
> > > -struct i915_hdcp_comp_master {
> > > -	struct device *mei_dev;
> > > -	const struct i915_hdcp_component_ops *ops;
> > > +struct i915_hdcp_master {
> > > +	struct device *hdcp_dev;
> > > +	const struct i915_hdcp_ops *ops;
> > >
> > >  	/* To protect the above members. */
> > >  	struct mutex mutex;
> > >  };
> > >
> > > -#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
> > > +#endif /* _I915_HDCP_INTERFACE_H_ */
> > > --
> > > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-03-06 12:34   ` Shankar, Uma
@ 2023-03-07  6:45     ` Shankar, Uma
  2023-03-07  6:50       ` Kandpal, Suraj
  2023-03-09  7:52       ` Kandpal, Suraj
  0 siblings, 2 replies; 27+ messages in thread
From: Shankar, Uma @ 2023-03-07  6:45 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Shankar, Uma
> Sent: Monday, March 6, 2023 6:05 PM
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta,
> Anshuman <Anshuman.Gupta@intel.com>
> Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> 
> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: Wednesday, February 1, 2023 2:38 PM
> > To: intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > <suraj.kandpal@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>;
> > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > <uma.shankar@intel.com>; Gupta, Anshuman <anshuman.gupta@intel.com>
> > Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> >
> > MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP commands to
> > GSC f/w. It requires to keep hdcp display driver agnostic to content
> > protection f/w (ME/GSC fw) in the form of i915_hdcp_fw_ops generic ops.
> >
> > Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops
> > generic ops instead of I915_HDCP_COMPONENT as integral part of i915.
> >
> > Adding checks to see if GSC is loaded and proxy is setup
> >
> > --v6
> > -dont change the license date in same patch series [Jani] -fix the
> > license year {Jani]
> >
> > --v8
> > -remove stale comment [Ankit]
> > -get headers in alphabetical order [Ankit] -fix hdcp2_supported check
> > [Ankit]
> >
> > --v9
> > -remove return statement from hdcp_gsc_fini [Ankit]
> 
> Looks Good to me.
> Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> 
> > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Cc: Uma Shankar <uma.shankar@intel.com>
> > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
> >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637 +++++++++++++++++-
> >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
> >  3 files changed, 660 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index 0d6aed1eb171..61bb2bbd0349 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > @@ -23,6 +23,7 @@
> >  #include "intel_display_power_well.h"
> >  #include "intel_display_types.h"
> >  #include "intel_hdcp.h"
> > +#include "intel_hdcp_gsc.h"
> >  #include "intel_hdcp_regs.h"
> >  #include "intel_pcode.h"
> >
> > @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct intel_connector
> > *connector)
> >  	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> >  	struct intel_hdcp *hdcp = &connector->hdcp;
> > +	struct intel_gt *gt = dev_priv->media_gt;
> > +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
> >  	bool capable = false;
> >
> >  	/* I915 support for HDCP2.2 */
> >  	if (!hdcp->hdcp2_supported)
> >  		return false;
> >
> > -	/* MEI interface is solid */
> > +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > +		if (!intel_uc_fw_is_running(&gsc->fw))
> > +			return false;
> > +
> > +	/* MEI/GSC interface is solid depending on which is used */
> >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> >  	if (!dev_priv->display.hdcp.comp_added ||
> > !dev_priv->display.hdcp.master) {
> >  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > @@ -2235,6 +2243,9 @@ static int initialize_hdcp_port_data(struct
> > intel_connector *connector,
> >
> >  static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)  {
> > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > +		return true;
> > +
> >  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> >  		return false;
> >
> > @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> > drm_i915_private *dev_priv)
> >
> >  	dev_priv->display.hdcp.comp_added = true;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > -	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > -				  I915_COMPONENT_HDCP);
> > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > +		ret = intel_hdcp_gsc_init(dev_priv);
> > +	else
> > +		ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > +					  I915_COMPONENT_HDCP);
> > +
> >  	if (ret < 0) {
> > -		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
> > +		drm_dbg_kms(&dev_priv->drm, "Failed at fw component
> > add(%d)\n",
> >  			    ret);
> >  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> >  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7 +2501,10
> @@
> > void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
> >  	dev_priv->display.hdcp.comp_added = false;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >
> > -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > +		intel_hdcp_gsc_fini(dev_priv);
> > +	else
> > +		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> >  }
> >
> >  void intel_hdcp_cleanup(struct intel_connector *connector) diff --git
> > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > index 8e3b5e6733d7..7eb1eeeb5a51 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > @@ -3,12 +3,617 @@
> >   * Copyright 2023, Intel Corporation.
> >   */
> >
> > +#include <drm/i915_hdcp_interface.h>
> > +
> >  #include "display/intel_hdcp_gsc.h"
> >  #include "gem/i915_gem_region.h"
> >  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> >  #include "i915_drv.h"
> >  #include "i915_utils.h"
> >
> > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> > +	return DISPLAY_VER(i915) >= 14;
> > +}
> > +
> > +static int
> > +gsc_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
> > +			  struct hdcp2_ake_init *ake_data) {


One more input, can we make the data packet creation in a common file since it
is defined by protocol and should be same both for mei or gsc.

mei and GSC specific stuff like headers and actual command to send can be separated
by respective interface but protocol part can be kept common.

Regards,
Uma Shankar

> > +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
> > +	struct wired_cmd_initiate_hdcp2_session_out
> > +						session_init_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !ake_data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	session_init_in.header.api_version = HDCP_API_VERSION;
> > +	session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
> > +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	session_init_in.header.buffer_len =
> > +
> > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > +
> > +	session_init_in.port.integrated_port_type = data->port_type;
> > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	session_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > +	session_init_in.protocol = data->protocol;
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_init_in,
> > +				       sizeof(session_init_in),
> > +				       (u8 *)&session_init_out,
> > +				       sizeof(session_init_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > 0x%X\n",
> > +			    WIRED_INITIATE_HDCP2_SESSION,
> > +			    session_init_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> > +	ake_data->tx_caps = session_init_out.tx_caps;
> > +	memcpy(ake_data->r_tx, session_init_out.r_tx, HDCP_2_2_RTX_LEN);
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> > +					 struct hdcp_port_data *data,
> > +					 struct hdcp2_ake_send_cert *rx_cert,
> > +					 bool *km_stored,
> > +					 struct hdcp2_ake_no_stored_km
> > +								*ek_pub_km,
> > +					 size_t *msg_sz)
> > +{
> > +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
> > +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km || !msg_sz)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> > +	verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT;
> > +	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	verify_rxcert_in.header.buffer_len =
> > +
> > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > +
> > +	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_rxcert_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> > +
> > +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
> > +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> > +HDCP_2_2_RXCAPS_LEN);
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_rxcert_in,
> > +				       sizeof(verify_rxcert_in),
> > +				       (u8 *)&verify_rxcert_out,
> > +				       sizeof(verify_rxcert_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed:
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > 0x%X\n",
> > +			    WIRED_VERIFY_RECEIVER_CERT,
> > +			    verify_rxcert_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	*km_stored = !!verify_rxcert_out.km_stored;
> > +	if (verify_rxcert_out.km_stored) {
> > +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> > +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> > +	} else {
> > +		ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM;
> > +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> > +	}
> > +
> > +	memcpy(ek_pub_km->e_kpub_km, &verify_rxcert_out.ekm_buff,
> > +	       sizeof(verify_rxcert_out.ekm_buff));
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
> > +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> > +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
> > +	struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !rx_hprime)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> > +	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
> > +	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	send_hprime_in.header.buffer_len =
> > +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > +
> > +	send_hprime_in.port.integrated_port_type = data->port_type;
> > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	send_hprime_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > +
> > +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > +	       HDCP_2_2_H_PRIME_LEN);
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&send_hprime_in,
> > +				       sizeof(send_hprime_in),
> > +				       (u8 *)&send_hprime_out,
> > +				       sizeof(send_hprime_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > 0x%X\n",
> > +			    WIRED_AKE_SEND_HPRIME,
> > send_hprime_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
> > +			    struct hdcp2_ake_send_pairing_info *pairing_info) {
> > +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 } };
> > +	struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !pairing_info)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> > +	pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
> > +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	pairing_info_in.header.buffer_len =
> > +
> > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > +
> > +	pairing_info_in.port.integrated_port_type = data->port_type;
> > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	pairing_info_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> > +
> > +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > +	       HDCP_2_2_E_KH_KM_LEN);
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&pairing_info_in,
> > +				       sizeof(pairing_info_in),
> > +				       (u8 *)&pairing_info_out,
> > +				       sizeof(pairing_info_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. Status:
> > 0x%X\n",
> > +			    WIRED_AKE_SEND_PAIRING_INFO,
> > +			    pairing_info_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_initiate_locality_check(struct device *dev,
> > +				 struct hdcp_port_data *data,
> > +				 struct hdcp2_lc_init *lc_init_data) {
> > +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> > +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !lc_init_data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	lc_init_in.header.api_version = HDCP_API_VERSION;
> > +	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
> > +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	lc_init_in.header.buffer_len =
> > +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > +
> > +	lc_init_in.port.integrated_port_type = data->port_type;
> > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in, sizeof(lc_init_in),
> > +				       (u8 *)&lc_init_out, sizeof(lc_init_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. status:
> > 0x%X\n",
> > +			    WIRED_INIT_LOCALITY_CHECK,
> > lc_init_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> > +	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
> > +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> > +	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
> > +	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !rx_lprime)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> > +	verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
> > +	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	verify_lprime_in.header.buffer_len =
> > +
> > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > +
> > +	verify_lprime_in.port.integrated_port_type = data->port_type;
> > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_lprime_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> > +
> > +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > +	       HDCP_2_2_L_PRIME_LEN);
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_lprime_in,
> > +				       sizeof(verify_lprime_in),
> > +				       (u8 *)&verify_lprime_out,
> > +				       sizeof(verify_lprime_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > 0x%X\n",
> > +			    WIRED_VALIDATE_LOCALITY,
> > +			    verify_lprime_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int gsc_hdcp_get_session_key(struct device *dev,
> > +				    struct hdcp_port_data *data,
> > +				    struct hdcp2_ske_send_eks *ske_data) {
> > +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> > +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data || !ske_data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	get_skey_in.header.api_version = HDCP_API_VERSION;
> > +	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
> > +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	get_skey_in.header.buffer_len =
> > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > +
> > +	get_skey_in.port.integrated_port_type = data->port_type;
> > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> > sizeof(get_skey_in),
> > +				       (u8 *)&get_skey_out, sizeof(get_skey_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > 0x%X\n",
> > +			    WIRED_GET_SESSION_KEY, get_skey_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> > +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> > +	       HDCP_2_2_E_DKEY_KS_LEN);
> > +	memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN);
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> > +					 struct hdcp_port_data *data,
> > +					 struct hdcp2_rep_send_receiverid_list
> > +							*rep_topology,
> > +					 struct hdcp2_rep_send_ack
> > +							*rep_send_ack)
> > +{
> > +	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
> > +	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !rep_topology || !rep_send_ack || !data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	verify_repeater_in.header.api_version = HDCP_API_VERSION;
> > +	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
> > +	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	verify_repeater_in.header.buffer_len =
> > +
> > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > +
> > +	verify_repeater_in.port.integrated_port_type = data->port_type;
> > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_repeater_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> > +
> > +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > +	       HDCP_2_2_RXINFO_LEN);
> > +	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,
> > +	       HDCP_2_2_SEQ_NUM_LEN);
> > +	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
> > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > +	memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids,
> > +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_repeater_in,
> > +				       sizeof(verify_repeater_in),
> > +				       (u8 *)&verify_repeater_out,
> > +				       sizeof(verify_repeater_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (verify_repeater_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > 0x%X\n",
> > +			    WIRED_VERIFY_REPEATER,
> > +			    verify_repeater_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> > +
> > +	return 0;
> > +}
> > +
> > +static int gsc_hdcp_verify_mprime(struct device *dev,
> > +				  struct hdcp_port_data *data,
> > +				  struct hdcp2_rep_stream_ready *stream_ready) {
> > +	struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
> > +	struct wired_cmd_repeater_auth_stream_req_out
> > +					verify_mprime_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +	size_t cmd_size;
> > +
> > +	if (!dev || !stream_ready || !data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> > +	if (cmd_size == SIZE_MAX)
> > +		return -EINVAL;
> > +
> > +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> > +	if (!verify_mprime_in)
> > +		return -ENOMEM;
> > +
> > +	verify_mprime_in->header.api_version = HDCP_API_VERSION;
> > +	verify_mprime_in->header.command_id =
> > WIRED_REPEATER_AUTH_STREAM_REQ;
> > +	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
> > +	verify_mprime_in->header.buffer_len = cmd_size  -
> > +sizeof(verify_mprime_in->header);
> > +
> > +	verify_mprime_in->port.integrated_port_type = data->port_type;
> > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > +	verify_mprime_in->port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> > +
> > +	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > HDCP_2_2_MPRIME_LEN);
> > +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > >seq_num_m);
> > +
> > +	memcpy(verify_mprime_in->streams, data->streams,
> > +	       array_size(data->k, sizeof(*data->streams)));
> > +
> > +	verify_mprime_in->k = cpu_to_be16(data->k);
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)verify_mprime_in, cmd_size,
> > +				       (u8 *)&verify_mprime_out,
> > +				       sizeof(verify_mprime_out));
> > +	kfree(verify_mprime_in);
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (verify_mprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > 0x%X\n",
> > +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> > +			    verify_mprime_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int gsc_hdcp_enable_authentication(struct device *dev,
> > +					  struct hdcp_port_data *data)
> > +{
> > +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> > +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> > +	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
> > +	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	enable_auth_in.header.buffer_len =
> > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > +
> > +	enable_auth_in.port.integrated_port_type = data->port_type;
> > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	enable_auth_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > +	enable_auth_in.stream_type = data->streams[0].stream_type;
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&enable_auth_in,
> > +				       sizeof(enable_auth_in),
> > +				       (u8 *)&enable_auth_out,
> > +				       sizeof(enable_auth_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > 0x%X\n",
> > +			    WIRED_ENABLE_AUTH, enable_auth_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int
> > +gsc_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > +*data) {
> > +	struct wired_cmd_close_session_in session_close_in = { { 0 } };
> > +	struct wired_cmd_close_session_out session_close_out = { { 0 } };
> > +	struct drm_i915_private *i915;
> > +	ssize_t byte;
> > +
> > +	if (!dev || !data)
> > +		return -EINVAL;
> > +
> > +	i915 = kdev_to_i915(dev);
> > +	if (!i915) {
> > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > +		return -ENODEV;
> > +	}
> > +
> > +	session_close_in.header.api_version = HDCP_API_VERSION;
> > +	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
> > +	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > +	session_close_in.header.buffer_len =
> > +				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > +
> > +	session_close_in.port.integrated_port_type = data->port_type;
> > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > +	session_close_in.port.attached_transcoder =
> > +(u8)data->hdcp_transcoder;
> > +
> > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_close_in,
> > +				       sizeof(session_close_in),
> > +				       (u8 *)&session_close_out,
> > +				       sizeof(session_close_out));
> > +	if (byte < 0) {
> > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send failed.
> > %zd\n", byte);
> > +		return byte;
> > +	}
> > +
> > +	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > +		drm_dbg_kms(&i915->drm, "Session Close Failed. status: 0x%X\n",
> > +			    session_close_out.header.status);
> > +		return -EIO;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> > +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> > +	.verify_receiver_cert_prepare_km =
> > +				gsc_hdcp_verify_receiver_cert_prepare_km,
> > +	.verify_hprime = gsc_hdcp_verify_hprime,
> > +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> > +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> > +	.verify_lprime = gsc_hdcp_verify_lprime,
> > +	.get_session_key = gsc_hdcp_get_session_key,
> > +	.repeater_check_flow_prepare_ack =
> > +				gsc_hdcp_repeater_check_flow_prepare_ack,
> > +	.verify_mprime = gsc_hdcp_verify_mprime,
> > +	.enable_hdcp_authentication = gsc_hdcp_enable_authentication,
> > +	.close_hdcp_session = gsc_hdcp_close_session, };
> > +
> >  /*This function helps allocate memory for the command that we will
> > send to gsc cs */  static int intel_hdcp_gsc_initialize_message(struct
> drm_i915_private *i915,
> >  					     struct intel_hdcp_gsc_message
> > *hdcp_message) @@ -58,7 +663,7 @@ static int
> > intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
> >  	return err;
> >  }
> >
> > -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> >  {
> >  	struct intel_hdcp_gsc_message *hdcp_message;
> >  	int ret;
> > @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private
> *i915)
> >  	return ret;
> >  }
> >
> > -void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
> > +static void intel_hdcp_gsc_free_message(struct drm_i915_private
> > +*i915)
> >  {
> >  	struct intel_hdcp_gsc_message *hdcp_message =
> >  					i915->display.hdcp.hdcp_message; @@ -
> 89,6 +694,31 @@ void
> > intel_hdcp_gsc_free_message(struct drm_i915_private
> > *i915)
> >  	kfree(hdcp_message);
> >  }
> >
> > +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> > +	struct i915_hdcp_master *data;
> > +	int ret;
> > +
> > +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> > +	if (!data)
> > +		return -ENOMEM;
> > +
> > +	mutex_lock(&i915->display.hdcp.comp_mutex);
> > +	i915->display.hdcp.master = data;
> > +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> > +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> > +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> > +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> > +
> > +	return ret;
> > +}
> > +
> > +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> > +	intel_hdcp_gsc_free_message(i915);
> > +	kfree(i915->display.hdcp.master);
> > +}
> > +
> >  static int intel_gsc_send_sync(struct drm_i915_private *i915,
> >  			       struct intel_gsc_mtl_header *header, u64 addr,
> >  			       size_t msg_out_len)
> > @@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct
> > drm_i915_private *i915,
> >   * will follow
> >   */
> >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
> > -				size_t msg_in_len, u8 *msg_out, size_t
> > msg_out_len)
> > +				size_t msg_in_len, u8 *msg_out,
> > +				size_t msg_out_len)
> >  {
> >  	struct intel_gt *gt = i915->media_gt;
> >  	struct intel_gsc_mtl_header *header; diff --git
> > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > index 09ffd7ec02cd..5cc9fd2e88f6 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
> >  	void *hdcp_cmd;
> >  };
> >
> > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
> >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
> >  				size_t msg_in_len, u8 *msg_out,
> >  				size_t msg_out_len);
> > +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> > +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> >
> >  #endif /* __INTEL_HDCP_GCS_H__ */
> > --
> > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention
  2023-03-07  6:40       ` Shankar, Uma
@ 2023-03-07  6:48         ` Kandpal, Suraj
  0 siblings, 0 replies; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-07  6:48 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Shankar, Uma <uma.shankar@intel.com>
> Sent: Tuesday, March 7, 2023 12:10 PM
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>;
> Vivi, Rodrigo <rodrigo.vivi@intel.com>
> Subject: RE: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming
> convention
> 
> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: Monday, March 6, 2023 6:20 PM
> > To: Shankar, Uma <uma.shankar@intel.com>;
> > intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta, Anshuman
> > <anshuman.gupta@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>;
> > Vivi, Rodrigo <rodrigo.vivi@intel.com>
> > Subject: RE: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming
> > convention
> >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > > To: intel-gfx@lists.freedesktop.org
> > > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Gupta,
> > > > Anshuman <anshuman.gupta@intel.com>; Winkler, Tomas
> > > <tomas.winkler@intel.com>;
> > > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > > <uma.shankar@intel.com>; Kandpal, Suraj <suraj.kandpal@intel.com>
> > > > Subject: [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming
> > > > convention
> > >
> > > Typo in agnostic.
> > >
> > > Also I feel this header can be re-phrased: "Use generic names for
> > > HDCP helpers and structs"
> > > Add the rationale why this is required, explain the legacy and new
> > > usage which is the cause for this patch.
> > >
> >
> > Sure will add it in the next version
> >
> > Regards,
> > Suraj Kandpal
> > > >
> > > > From: Anshuman Gupta <anshuman.gupta@intel.com>
> > > >
> > > > Change the include/drm/i915_mei_hdcp_interface.h to
> > > > include/drm/i915_hdcp_interface.h
> > > >
> > > > --v6
> > > > -make each patch build individually [Jani]
> > > >
> > > > --v8
> > > > -change ME FW to ME/GSC FW [Ankit] -fix formatting issue [Ankit]
> > > >
> > > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > Acked-by: Tomas Winkler <tomas.winkler@intel.com>
> > > > ---
> > > >  .../gpu/drm/i915/display/intel_display_core.h |  2 +-
> > > >  .../drm/i915/display/intel_display_types.h    |  2 +-
> > > >  drivers/gpu/drm/i915/display/intel_hdcp.c     | 81 ++++++++--------
> > > >  drivers/misc/mei/hdcp/mei_hdcp.c              | 61 ++++++------
> > > >  ...hdcp_interface.h => i915_hdcp_interface.h} | 92
> > > > +++++++++----------
> > > >  5 files changed, 118 insertions(+), 120 deletions(-)  rename
> > > > include/drm/{i915_mei_hdcp_interface.h => i915_hdcp_interface.h}
> > > > (73%)
> > > >
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > > > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > > > index fb8670aa2932..8e7a68339876 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > > > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > > > @@ -378,7 +378,7 @@ struct intel_display {
> > > >  	} gmbus;
> > > >
> > > >  	struct {
> > > > -		struct i915_hdcp_comp_master *master;
> > > > +		struct i915_hdcp_master *master;
> > >
> > > Since we are changing this up, can we drop the use of phrase like
> "master"
> > > etc, if feasible in the series, else this can be taken with a follow
> > > up cleanup series.
> >
> > I actually plan on cleaning this up later on in a different hdcp
> > cleanup series
> 
> Ok sure, create an internal task to track this.
> 
> >
> > >
> > > >  		bool comp_added;
> > > >
> > > >  		/* Mutex to protect the above hdcp component related
> > > values. */
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > > > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > > > index 9ccae7a46020..7accd3a8877c 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> > > > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> > > > @@ -43,7 +43,7 @@
> > > >  #include <drm/drm_rect.h>
> > > >  #include <drm/drm_vblank.h>
> > > >  #include <drm/drm_vblank_work.h>
> > > > -#include <drm/i915_mei_hdcp_interface.h>
> > > > +#include <drm/i915_hdcp_interface.h>
> > > >  #include <media/cec-notifier.h>
> > > >
> > > >  #include "i915_vma.h"
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > index 6406fd487ee5..262c76f21801 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > @@ -1143,7 +1143,7 @@ hdcp2_prepare_ake_init(struct
> > > > intel_connector *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > >
> > > comp name is relevant if we use component framework, having the name
> > > for a generic case doesn't seem right. Change it universally in patch.
> >
> > I think I lost you here as the change here from my side was
> > i915_hdcp_comp_master to I915_hdcp_master and I left the variable name
> as is.
> > If you do want me to change the variable name what do you think would
> > be better
> 
> Comp is a name assuming we are using component framework but that is
> limited to only mei not gsc. A more generic name would be better.
> 

Ohkay got it this makes sense ill add this into the cleanup task along with the hdcp_master
Rename 

Regards,
Suraj Kandpal

> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1154,7 +1154,7 @@ hdcp2_prepare_ake_init(struct
> > > > intel_connector *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->initiate_hdcp2_session(comp->mei_dev, data,
> > > ake_data);
> > > > +	ret = comp->ops->initiate_hdcp2_session(comp->hdcp_dev, data,
> > > > +ake_data);
> > > >  	if (ret)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Prepare_ake_init failed.
> > > %d\n",
> > > >  			    ret);
> > > > @@ -1173,7 +1173,7 @@ hdcp2_verify_rx_cert_prepare_km(struct
> > > > intel_connector *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1184,7 +1184,7 @@ hdcp2_verify_rx_cert_prepare_km(struct
> > > > intel_connector *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->verify_receiver_cert_prepare_km(comp->mei_dev,
> > > data,
> > > > +	ret = comp->ops->verify_receiver_cert_prepare_km(comp-
> > > >hdcp_dev,
> > > > +data,
> > > >  							 rx_cert, paired,
> > > >  							 ek_pub_km,
> > > msg_sz);
> > > >  	if (ret < 0)
> > > > @@ -1201,7 +1201,7 @@ static int hdcp2_verify_hprime(struct
> > > > intel_connector *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1212,7 +1212,7 @@ static int hdcp2_verify_hprime(struct
> > > > intel_connector *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->verify_hprime(comp->mei_dev, data, rx_hprime);
> > > > +	ret = comp->ops->verify_hprime(comp->hdcp_dev, data, rx_hprime);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Verify hprime failed.
> > > %d\n", ret);
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1227,7 +1227,7 @@ hdcp2_store_pairing_info(struct
> > > > intel_connector *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1238,7 +1238,7 @@ hdcp2_store_pairing_info(struct
> > > > intel_connector *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->store_pairing_info(comp->mei_dev, data,
> > > pairing_info);
> > > > +	ret = comp->ops->store_pairing_info(comp->hdcp_dev, data,
> > > > +pairing_info);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Store pairing info failed.
> > > %d\n",
> > > >  			    ret);
> > > > @@ -1254,7 +1254,7 @@ hdcp2_prepare_lc_init(struct intel_connector
> > > *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1265,7 +1265,7 @@ hdcp2_prepare_lc_init(struct intel_connector
> > > *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->initiate_locality_check(comp->mei_dev, data,
> > > lc_init);
> > > > +	ret = comp->ops->initiate_locality_check(comp->hdcp_dev, data,
> > > > +lc_init);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Prepare lc_init failed.
> > > %d\n",
> > > >  			    ret);
> > > > @@ -1281,7 +1281,7 @@ hdcp2_verify_lprime(struct intel_connector
> > > *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1292,7 +1292,7 @@ hdcp2_verify_lprime(struct intel_connector
> > > *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->verify_lprime(comp->mei_dev, data, rx_lprime);
> > > > +	ret = comp->ops->verify_lprime(comp->hdcp_dev, data, rx_lprime);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Verify L_Prime failed.
> > > %d\n",
> > > >  			    ret);
> > > > @@ -1307,7 +1307,7 @@ static int hdcp2_prepare_skey(struct
> > > > intel_connector *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1318,7 +1318,7 @@ static int hdcp2_prepare_skey(struct
> > > > intel_connector *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->get_session_key(comp->mei_dev, data, ske_data);
> > > > +	ret = comp->ops->get_session_key(comp->hdcp_dev, data,
> > > ske_data);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Get session key failed.
> > > %d\n",
> > > >  			    ret);
> > > > @@ -1336,7 +1336,7 @@
> hdcp2_verify_rep_topology_prepare_ack(struct
> > > > intel_connector *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1347,7 +1347,7 @@
> hdcp2_verify_rep_topology_prepare_ack(struct
> > > > intel_connector *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->repeater_check_flow_prepare_ack(comp-
> > > >mei_dev,
> > > > data,
> > > > +	ret = comp->ops->repeater_check_flow_prepare_ack(comp-
> > > >hdcp_dev,
> > > > data,
> > > >  							 rep_topology,
> > > >  							 rep_send_ack);
> > > >  	if (ret < 0)
> > > > @@ -1365,7 +1365,7 @@ hdcp2_verify_mprime(struct intel_connector
> > > *connector,
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1376,7 +1376,7 @@ hdcp2_verify_mprime(struct intel_connector
> > > *connector,
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->verify_mprime(comp->mei_dev, data,
> > > stream_ready);
> > > > +	ret = comp->ops->verify_mprime(comp->hdcp_dev, data,
> > > stream_ready);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Verify mprime failed.
> > > %d\n", ret);
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1389,7 +1389,7 @@ static int hdcp2_authenticate_port(struct
> > > > intel_connector
> > > > *connector)
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1400,7 +1400,7 @@ static int hdcp2_authenticate_port(struct
> > > > intel_connector
> > > > *connector)
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->enable_hdcp_authentication(comp->mei_dev,
> > > data);
> > > > +	ret = comp->ops->enable_hdcp_authentication(comp->hdcp_dev,
> > > data);
> > > >  	if (ret < 0)
> > > >  		drm_dbg_kms(&dev_priv->drm, "Enable hdcp auth failed.
> > > %d\n",
> > > >  			    ret);
> > > > @@ -1413,7 +1413,7 @@ static int hdcp2_close_mei_session(struct
> > > > intel_connector
> > > > *connector)  {
> > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > -	struct i915_hdcp_comp_master *comp;
> > > > +	struct i915_hdcp_master *comp;
> > > >  	int ret;
> > > >
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -1424,7 +1424,7 @@ static int hdcp2_close_mei_session(struct
> > > > intel_connector
> > > > *connector)
> > > >  		return -EINVAL;
> > > >  	}
> > > >
> > > > -	ret = comp->ops->close_hdcp_session(comp->mei_dev,
> > > > +	ret = comp->ops->close_hdcp_session(comp->hdcp_dev,
> > > >  					     &dig_port->hdcp_port_data);
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > >
> > > > @@ -2145,8 +2145,8 @@ static int i915_hdcp_component_bind(struct
> > > > device *i915_kdev,
> > > >
> > > >  	drm_dbg(&dev_priv->drm, "I915 HDCP comp bind\n");
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > -	dev_priv->display.hdcp.master = (struct i915_hdcp_comp_master
> > > *)data;
> > > > -	dev_priv->display.hdcp.master->mei_dev = mei_kdev;
> > > > +	dev_priv->display.hdcp.master = (struct i915_hdcp_master *)data;
> > > > +	dev_priv->display.hdcp.master->hdcp_dev = mei_kdev;
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > >
> > > >  	return 0;
> > > > @@ -2163,30 +2163,30 @@ static void
> > > i915_hdcp_component_unbind(struct
> > > > device *i915_kdev,
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > >  }
> > > >
> > > > -static const struct component_ops i915_hdcp_component_ops = {
> > > > +static const struct component_ops i915_hdcp_ops = {
> > > >  	.bind   = i915_hdcp_component_bind,
> > > >  	.unbind = i915_hdcp_component_unbind,  };
> > > >
> > > > -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> > > > +static enum hdcp_ddi intel_get_hdcp_ddi_index(enum port port)
> > > >  {
> > > >  	switch (port) {
> > > >  	case PORT_A:
> > > > -		return MEI_DDI_A;
> > > > +		return HDCP_DDI_A;
> > > >  	case PORT_B ... PORT_F:
> > > > -		return (enum mei_fw_ddi)port;
> > > > +		return (enum hdcp_ddi)port;
> > > >  	default:
> > > > -		return MEI_DDI_INVALID_PORT;
> > > > +		return HDCP_DDI_INVALID_PORT;
> > > >  	}
> > > >  }
> > > >
> > > > -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder
> > > > cpu_transcoder)
> > > > +static enum hdcp_transcoder intel_get_hdcp_transcoder(enum
> > > transcoder
> > > > +cpu_transcoder)
> > > >  {
> > > >  	switch (cpu_transcoder) {
> > > >  	case TRANSCODER_A ... TRANSCODER_D:
> > > > -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> > > > +		return (enum hdcp_transcoder)(cpu_transcoder | 0x10);
> > > >  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> > > > -		return MEI_INVALID_TRANSCODER;
> > > > +		return HDCP_INVALID_TRANSCODER;
> > > >  	}
> > > >  }
> > > >
> > > > @@ -2200,20 +2200,20 @@ static int
> > > > initialize_hdcp_port_data(struct intel_connector *connector,
> > > >  	enum port port = dig_port->base.port;
> > > >
> > > >  	if (DISPLAY_VER(dev_priv) < 12)
> > > > -		data->fw_ddi = intel_get_mei_fw_ddi_index(port);
> > > > +		data->hdcp_ddi = intel_get_hdcp_ddi_index(port);
> > > >  	else
> > > >  		/*
> > > > -		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
> > > > +		 * As per ME FW API expectation, for GEN 12+, hdcp_ddi is
> > > filled
> > > >  		 * with zero(INVALID PORT index).
> > > >  		 */
> > > > -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> > > > +		data->hdcp_ddi = HDCP_DDI_INVALID_PORT;
> > > >
> > > >  	/*
> > > > -	 * As associated transcoder is set and modified at modeset, here
> > > fw_tc
> > > > +	 * As associated transcoder is set and modified at modeset, here
> > > > +hdcp_transcoder
> > > >  	 * is initialized to zero (invalid transcoder index). This will be
> > > >  	 * retained for <Gen12 forever.
> > > >  	 */
> > > > -	data->fw_tc = MEI_INVALID_TRANSCODER;
> > > > +	data->hdcp_transcoder = HDCP_INVALID_TRANSCODER;
> > > >
> > > >  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
> > > >  	data->protocol = (u8)shim->protocol; @@ -2256,7 +2256,7 @@ void
> > > > intel_hdcp_component_init(struct drm_i915_private
> > > > *dev_priv)
> > > >
> > > >  	dev_priv->display.hdcp.comp_added = true;
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > -	ret = component_add_typed(dev_priv->drm.dev,
> > > > &i915_hdcp_component_ops,
> > > > +	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > > >  				  I915_COMPONENT_HDCP);
> > > >  	if (ret < 0) {
> > > >  		drm_dbg_kms(&dev_priv->drm, "Failed at component
> > > add(%d)\n", @@
> > > > -2350,7 +2350,8 @@ int intel_hdcp_enable(struct intel_connector
> > > *connector,
> > > >  	}
> > > >
> > > >  	if (DISPLAY_VER(dev_priv) >= 12)
> > > > -		dig_port->hdcp_port_data.fw_tc =
> > > intel_get_mei_fw_tc(hdcp-
> > > > >cpu_transcoder);
> > > > +		dig_port->hdcp_port_data.hdcp_transcoder =
> > > > +			intel_get_hdcp_transcoder(hdcp->cpu_transcoder);
> > > >
> > > >  	/*
> > > >  	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the
> > > > setup @@ -
> > > > 2485,7 +2486,7 @@ void intel_hdcp_component_fini(struct
> > > > drm_i915_private
> > > > *dev_priv)
> > > >  	dev_priv->display.hdcp.comp_added = false;
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > >
> > > > -	component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);
> > > > +	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > >  }
> > > >
> > > >  void intel_hdcp_cleanup(struct intel_connector *connector) diff
> > > > --git a/drivers/misc/mei/hdcp/mei_hdcp.c
> > > b/drivers/misc/mei/hdcp/mei_hdcp.c
> > > > index e889a8bd7ac8..b2c49599809c 100644
> > > > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> > > > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> > > > @@ -23,7 +23,7 @@
> > > >  #include <linux/component.h>
> > > >  #include <drm/drm_connector.h>
> > > >  #include <drm/i915_component.h>
> > > > -#include <drm/i915_mei_hdcp_interface.h>
> > > > +#include <drm/i915_hdcp_interface.h>
> > > >
> > > >  #include "mei_hdcp.h"
> > > >
> > > > @@ -57,8 +57,8 @@ mei_hdcp_initiate_session(struct device *dev,
> > > > struct hdcp_port_data *data,
> > > >
> > > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > > >
> > > >  	session_init_in.port.integrated_port_type = data->port_type;
> > > > -	session_init_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	session_init_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >  	session_init_in.protocol = data->protocol;
> > > >
> > > >  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in, @@ -127,8
> > > > +127,8 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device
> > > *dev,
> > > >
> > > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > > >
> > > >  	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > > > -	verify_rxcert_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_rxcert_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > > >  	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
> > > @@
> > > > -
> > > > 198,8 +198,8 @@ mei_hdcp_verify_hprime(struct device *dev, struct
> > > > hdcp_port_data *data,
> > > >  	send_hprime_in.header.buffer_len =
> > > > WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > > >
> > > >  	send_hprime_in.port.integrated_port_type = data->port_type;
> > > > -	send_hprime_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	send_hprime_in.port.attached_transcoder = (u8)data-
> > > >hdcp_transcoder;
> > > >
> > > >  	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > > >  	       HDCP_2_2_H_PRIME_LEN);
> > > > @@ -256,8 +256,8 @@ mei_hdcp_store_pairing_info(struct device
> > > > *dev, struct hdcp_port_data *data,
> > > >
> > > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > > >
> > > >  	pairing_info_in.port.integrated_port_type = data->port_type;
> > > > -	pairing_info_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	pairing_info_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > > >  	       HDCP_2_2_E_KH_KM_LEN);
> > > > @@ -315,8 +315,8 @@ mei_hdcp_initiate_locality_check(struct device
> > > *dev,
> > > >  	lc_init_in.header.buffer_len =
> > > > WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > > >
> > > >  	lc_init_in.port.integrated_port_type = data->port_type;
> > > > -	lc_init_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > > >
> > > >  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
> > > >  	if (byte < 0) {
> > > > @@ -371,8 +371,8 @@ mei_hdcp_verify_lprime(struct device *dev,
> > > > struct hdcp_port_data *data,
> > > >
> > > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > > >
> > > >  	verify_lprime_in.port.integrated_port_type = data->port_type;
> > > > -	verify_lprime_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_lprime_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > > >  	       HDCP_2_2_L_PRIME_LEN);
> > > > @@ -429,8 +429,8 @@ static int mei_hdcp_get_session_key(struct
> > > > device
> > > *dev,
> > > >  	get_skey_in.header.buffer_len =
> > > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > > >
> > > >  	get_skey_in.port.integrated_port_type = data->port_type;
> > > > -	get_skey_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	get_skey_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in,
> > > sizeof(get_skey_in));
> > > >  	if (byte < 0) {
> > > > @@ -494,8 +494,8 @@
> > > mei_hdcp_repeater_check_flow_prepare_ack(struct
> > > > device *dev,
> > > >
> > > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > > >
> > > >  	verify_repeater_in.port.integrated_port_type = data->port_type;
> > > > -	verify_repeater_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_repeater_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > > >  	       HDCP_2_2_RXINFO_LEN);
> > > > @@ -572,8 +572,8 @@ static int mei_hdcp_verify_mprime(struct
> > > > device
> > > *dev,
> > > >  	verify_mprime_in->header.buffer_len = cmd_size  -
> > > > sizeof(verify_mprime_in-
> > > > >header);
> > > >
> > > >  	verify_mprime_in->port.integrated_port_type = data->port_type;
> > > > -	verify_mprime_in->port.physical_port = (u8)data->fw_ddi;
> > > > -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_mprime_in->port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > > > HDCP_2_2_MPRIME_LEN);
> > > >  	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > > > >seq_num_m); @@ -634,8 +634,8 @@ static int
> > > > mei_hdcp_enable_authentication(struct device *dev,
> > > >  	enable_auth_in.header.buffer_len =
> > > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > > >
> > > >  	enable_auth_in.port.integrated_port_type = data->port_type;
> > > > -	enable_auth_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> > > >hdcp_transcoder;
> > > >  	enable_auth_in.stream_type = data->streams[0].stream_type;
> > > >
> > > >  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in, @@ -689,8
> > > +689,8
> > > > @@ mei_hdcp_close_session(struct device *dev, struct
> > > > hdcp_port_data
> > > *data)
> > > >  				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > > >
> > > >  	session_close_in.port.integrated_port_type = data->port_type;
> > > > -	session_close_in.port.physical_port = (u8)data->fw_ddi;
> > > > -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
> > > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	session_close_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > >
> > > >  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
> > > >  			      sizeof(session_close_in)); @@ -715,7 +715,7 @@
> > > > mei_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > > > *data)
> > > >  	return 0;
> > > >  }
> > > >
> > > > -static const struct i915_hdcp_component_ops mei_hdcp_ops = {
> > > > +static const struct i915_hdcp_ops mei_hdcp_ops = {
> > > >  	.owner = THIS_MODULE,
> > > >  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
> > > >  	.verify_receiver_cert_prepare_km = @@ -735,13 +735,12 @@ static
> > > > const struct i915_hdcp_component_ops mei_hdcp_ops = {  static int
> > > > mei_component_master_bind(struct device
> > > *dev)  {
> > > >  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> > > > -	struct i915_hdcp_comp_master *comp_master =
> > > > -
> > > 	mei_cldev_get_drvdata(cldev);
> > > > +	struct i915_hdcp_master *comp_master =
> > > mei_cldev_get_drvdata(cldev);
> > > >  	int ret;
> > > >
> > > >  	dev_dbg(dev, "%s\n", __func__);
> > > >  	comp_master->ops = &mei_hdcp_ops;
> > > > -	comp_master->mei_dev = dev;
> > > > +	comp_master->hdcp_dev = dev;
> > > >  	ret = component_bind_all(dev, comp_master);
> > > >  	if (ret < 0)
> > > >  		return ret;
> > > > @@ -752,8 +751,7 @@ static int mei_component_master_bind(struct
> > > device
> > > > *dev) static void mei_component_master_unbind(struct device *dev)  {
> > > >  	struct mei_cl_device *cldev = to_mei_cl_device(dev);
> > > > -	struct i915_hdcp_comp_master *comp_master =
> > > > -
> > > 	mei_cldev_get_drvdata(cldev);
> > > > +	struct i915_hdcp_master *comp_master =
> > > mei_cldev_get_drvdata(cldev);
> > > >
> > > >  	dev_dbg(dev, "%s\n", __func__);
> > > >  	component_unbind_all(dev, comp_master); @@ -801,7 +799,7 @@
> > > static
> > > > int mei_hdcp_component_match(struct device *dev, int
> subcomponent,
> > > > static int mei_hdcp_probe(struct mei_cl_device *cldev,
> > > >  			  const struct mei_cl_device_id *id)  {
> > > > -	struct i915_hdcp_comp_master *comp_master;
> > > > +	struct i915_hdcp_master *comp_master;
> > > >  	struct component_match *master_match;
> > > >  	int ret;
> > > >
> > > > @@ -846,8 +844,7 @@ static int mei_hdcp_probe(struct mei_cl_device
> > > > *cldev,
> > > >
> > > >  static void mei_hdcp_remove(struct mei_cl_device *cldev)  {
> > > > -	struct i915_hdcp_comp_master *comp_master =
> > > > -
> > > 	mei_cldev_get_drvdata(cldev);
> > > > +	struct i915_hdcp_master *comp_master =
> > > mei_cldev_get_drvdata(cldev);
> > > >  	int ret;
> > > >
> > > >  	component_master_del(&cldev->dev,
> > > &mei_component_master_ops); diff -
> > > > -git a/include/drm/i915_mei_hdcp_interface.h
> > > > b/include/drm/i915_hdcp_interface.h
> > > > similarity index 73%
> > > > rename from include/drm/i915_mei_hdcp_interface.h
> > > > rename to include/drm/i915_hdcp_interface.h index
> > > > f441cbcd95a4..75c75f52ab1b
> > > > 100644
> > > > --- a/include/drm/i915_mei_hdcp_interface.h
> > > > +++ b/include/drm/i915_hdcp_interface.h
> > > > @@ -6,15 +6,15 @@
> > > >   * Ramalingam C <ramalingam.c@intel.com>
> > > >   */
> > > >
> > > > -#ifndef _I915_MEI_HDCP_INTERFACE_H_ -#define
> > > > _I915_MEI_HDCP_INTERFACE_H_
> > > > +#ifndef _I915_HDCP_INTERFACE_H_
> > > > +#define _I915_HDCP_INTERFACE_H_
> > > >
> > > >  #include <linux/mutex.h>
> > > >  #include <linux/device.h>
> > > >  #include <drm/display/drm_hdcp.h>
> > > >
> > > >  /**
> > > > - * enum hdcp_port_type - HDCP port implementation type defined by
> > > > ME FW
> > > > + * enum hdcp_port_type - HDCP port implementation type defined by
> > > > + ME/GSC FW
> > > >   * @HDCP_PORT_TYPE_INVALID: Invalid hdcp port type
> > > >   * @HDCP_PORT_TYPE_INTEGRATED: In-Host HDCP2.x port
> > > >   * @HDCP_PORT_TYPE_LSPCON: HDCP2.2 discrete wired Tx port with
> > > LSPCON
> > > > @@
> > > > -41,46 +41,46 @@ enum hdcp_wired_protocol {
> > > >  	HDCP_PROTOCOL_DP
> > > >  };
> > > >
> > > > -enum mei_fw_ddi {
> > > > -	MEI_DDI_INVALID_PORT = 0x0,
> > > > +enum hdcp_ddi {
> > > > +	HDCP_DDI_INVALID_PORT = 0x0,
> > > >
> > > > -	MEI_DDI_B = 1,
> > > > -	MEI_DDI_C,
> > > > -	MEI_DDI_D,
> > > > -	MEI_DDI_E,
> > > > -	MEI_DDI_F,
> > > > -	MEI_DDI_A = 7,
> > > > -	MEI_DDI_RANGE_END = MEI_DDI_A,
> > > > +	HDCP_DDI_B = 1,
> > > > +	HDCP_DDI_C,
> > > > +	HDCP_DDI_D,
> > > > +	HDCP_DDI_E,
> > > > +	HDCP_DDI_F,
> > > > +	HDCP_DDI_A = 7,
> > > > +	HDCP_DDI_RANGE_END = HDCP_DDI_A,
> > > >  };
> > > >
> > > >  /**
> > > > - * enum mei_fw_tc - ME Firmware defined index for transcoders
> > > > - * @MEI_INVALID_TRANSCODER: Index for Invalid transcoder
> > > > - * @MEI_TRANSCODER_EDP: Index for EDP Transcoder
> > > > - * @MEI_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > > > - * @MEI_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > > > - * @MEI_TRANSCODER_A: Index for Transcoder A
> > > > - * @MEI_TRANSCODER_B: Index for Transcoder B
> > > > - * @MEI_TRANSCODER_C: Index for Transcoder C
> > > > - * @MEI_TRANSCODER_D: Index for Transcoder D
> > > > + * enum hdcp_tc - ME/GSC Firmware defined index for transcoders
> > > > + * @HDCP_INVALID_TRANSCODER: Index for Invalid transcoder
> > > > + * @HDCP_TRANSCODER_EDP: Index for EDP Transcoder
> > > > + * @HDCP_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > > > + * @HDCP_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > > > + * @HDCP_TRANSCODER_A: Index for Transcoder A
> > > > + * @HDCP_TRANSCODER_B: Index for Transcoder B
> > > > + * @HDCP_TRANSCODER_C: Index for Transcoder C
> > > > + * @HDCP_TRANSCODER_D: Index for Transcoder D
> > > >   */
> > > > -enum mei_fw_tc {
> > > > -	MEI_INVALID_TRANSCODER = 0x00,
> > > > -	MEI_TRANSCODER_EDP,
> > > > -	MEI_TRANSCODER_DSI0,
> > > > -	MEI_TRANSCODER_DSI1,
> > > > -	MEI_TRANSCODER_A = 0x10,
> > > > -	MEI_TRANSCODER_B,
> > > > -	MEI_TRANSCODER_C,
> > > > -	MEI_TRANSCODER_D
> > > > +enum hdcp_transcoder {
> > > > +	HDCP_INVALID_TRANSCODER = 0x00,
> > > > +	HDCP_TRANSCODER_EDP,
> > > > +	HDCP_TRANSCODER_DSI0,
> > > > +	HDCP_TRANSCODER_DSI1,
> > > > +	HDCP_TRANSCODER_A = 0x10,
> > > > +	HDCP_TRANSCODER_B,
> > > > +	HDCP_TRANSCODER_C,
> > > > +	HDCP_TRANSCODER_D
> > > >  };
> > > >
> > > >  /**
> > > >   * struct hdcp_port_data - intel specific HDCP port data
> > > > - * @fw_ddi: ddi index as per ME FW
> > > > - * @fw_tc: transcoder index as per ME FW
> > > > - * @port_type: HDCP port type as per ME FW classification
> > > > - * @protocol: HDCP adaptation as per ME FW
> > > > + * @hdcp_ddi: ddi index as per ME/GSC FW
> > > > + * @hdcp_transcoder: transcoder index as per ME/GSC FW
> > > > + * @port_type: HDCP port type as per ME/GSC FW classification
> > > > + * @protocol: HDCP adaptation as per ME/GSC FW
> > > >   * @k: No of streams transmitted on a port. Only on DP MST this is != 1
> > > >   * @seq_num_m: Count of RepeaterAuth_Stream_Manage msg
> > > propagated.
> > > >   *	       Initialized to 0 on AKE_INIT. Incremented after every successful
> > > > @@ -90,8 +90,8 @@ enum mei_fw_tc {
> > > >   *	     streams
> > > >   */
> > > >  struct hdcp_port_data {
> > > > -	enum mei_fw_ddi fw_ddi;
> > > > -	enum mei_fw_tc fw_tc;
> > > > +	enum hdcp_ddi hdcp_ddi;
> > > > +	enum hdcp_transcoder hdcp_transcoder;
> > > >  	u8 port_type;
> > > >  	u8 protocol;
> > > >  	u16 k;
> > > > @@ -100,7 +100,7 @@ struct hdcp_port_data {  };
> > > >
> > > >  /**
> > > > - * struct i915_hdcp_component_ops- ops for HDCP2.2 services.
> > > > + * struct i915_hdcp_ops- ops for HDCP2.2 services.
> > > >   * @owner: Module providing the ops
> > > >   * @initiate_hdcp2_session: Initiate a Wired HDCP2.2 Tx Session.
> > > >   *			    And Prepare AKE_Init.
> > > > @@ -119,9 +119,9 @@ struct hdcp_port_data {
> > > >   * @close_hdcp_session: Close the Wired HDCP Tx session per port.
> > > >   *			This also disables the authenticated state of the port.
> > > >   */
> > > > -struct i915_hdcp_component_ops {
> > > > +struct i915_hdcp_ops {
> > > >  	/**
> > > > -	 * @owner: mei_hdcp module
> > > > +	 * @owner: hdcp module
> > > >  	 */
> > > >  	struct module *owner;
> > > >
> > > > @@ -169,16 +169,16 @@ struct i915_hdcp_component_ops {
> > > >
> > > >  /**
> > > >   * struct i915_hdcp_component_master - Used for communication
> > > between
> > > > i915
> > >
> > > Name doesn't match with the structure, please fix.
> > >
> >
> > Okay it missed this will do
> >
> > Regards,
> > Suraj Kandpal
> > > > - * and mei_hdcp drivers for the HDCP2.2 services
> > > > - * @mei_dev: device that provide the HDCP2.2 service from MEI Bus.
> > > > - * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915
> driver.
> > > > + * and hdcp drivers for the HDCP2.2 services
> > > > + * @hdcp_dev: device that provide the HDCP2.2 service from MEI Bus.
> > > > + * @hdcp_ops: Ops implemented by hdcp driver or intel_hdcp_gsc ,
> > > > + used by i915
> > > > driver.
> > > >   */
> > > > -struct i915_hdcp_comp_master {
> > > > -	struct device *mei_dev;
> > > > -	const struct i915_hdcp_component_ops *ops;
> > > > +struct i915_hdcp_master {
> > > > +	struct device *hdcp_dev;
> > > > +	const struct i915_hdcp_ops *ops;
> > > >
> > > >  	/* To protect the above members. */
> > > >  	struct mutex mutex;
> > > >  };
> > > >
> > > > -#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
> > > > +#endif /* _I915_HDCP_INTERFACE_H_ */
> > > > --
> > > > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-03-07  6:45     ` Shankar, Uma
@ 2023-03-07  6:50       ` Kandpal, Suraj
  2023-03-09  7:52       ` Kandpal, Suraj
  1 sibling, 0 replies; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-07  6:50 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Shankar, Uma <uma.shankar@intel.com>
> Sent: Tuesday, March 7, 2023 12:15 PM
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> 
> 
> 
> > -----Original Message-----
> > From: Shankar, Uma
> > Sent: Monday, March 6, 2023 6:05 PM
> > To: Kandpal, Suraj <suraj.kandpal@intel.com>;
> > intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > Gupta, Anshuman <Anshuman.Gupta@intel.com>
> > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> >
> >
> >
> > > -----Original Message-----
> > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > To: intel-gfx@lists.freedesktop.org
> > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > > <suraj.kandpal@intel.com>; Winkler, Tomas <tomas.winkler@intel.com>;
> > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > <uma.shankar@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>
> > > Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > >
> > > MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP commands
> > > to GSC f/w. It requires to keep hdcp display driver agnostic to
> > > content protection f/w (ME/GSC fw) in the form of i915_hdcp_fw_ops
> generic ops.
> > >
> > > Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops
> > > generic ops instead of I915_HDCP_COMPONENT as integral part of i915.
> > >
> > > Adding checks to see if GSC is loaded and proxy is setup
> > >
> > > --v6
> > > -dont change the license date in same patch series [Jani] -fix the
> > > license year {Jani]
> > >
> > > --v8
> > > -remove stale comment [Ankit]
> > > -get headers in alphabetical order [Ankit] -fix hdcp2_supported
> > > check [Ankit]
> > >
> > > --v9
> > > -remove return statement from hdcp_gsc_fini [Ankit]
> >
> > Looks Good to me.
> > Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> >
> > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
> > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637
> +++++++++++++++++-
> > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
> > >  3 files changed, 660 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > index 0d6aed1eb171..61bb2bbd0349 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > @@ -23,6 +23,7 @@
> > >  #include "intel_display_power_well.h"
> > >  #include "intel_display_types.h"
> > >  #include "intel_hdcp.h"
> > > +#include "intel_hdcp_gsc.h"
> > >  #include "intel_hdcp_regs.h"
> > >  #include "intel_pcode.h"
> > >
> > > @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct
> > > intel_connector
> > > *connector)
> > >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > >  	struct intel_hdcp *hdcp = &connector->hdcp;
> > > +	struct intel_gt *gt = dev_priv->media_gt;
> > > +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
> > >  	bool capable = false;
> > >
> > >  	/* I915 support for HDCP2.2 */
> > >  	if (!hdcp->hdcp2_supported)
> > >  		return false;
> > >
> > > -	/* MEI interface is solid */
> > > +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		if (!intel_uc_fw_is_running(&gsc->fw))
> > > +			return false;
> > > +
> > > +	/* MEI/GSC interface is solid depending on which is used */
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > >  	if (!dev_priv->display.hdcp.comp_added ||
> > > !dev_priv->display.hdcp.master) {
> > >  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -2235,6 +2243,9 @@ static int initialize_hdcp_port_data(struct
> > > intel_connector *connector,
> > >
> > >  static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
> > > {
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		return true;
> > > +
> > >  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> > >  		return false;
> > >
> > > @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> > > drm_i915_private *dev_priv)
> > >
> > >  	dev_priv->display.hdcp.comp_added = true;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > -	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > > -				  I915_COMPONENT_HDCP);
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		ret = intel_hdcp_gsc_init(dev_priv);
> > > +	else
> > > +		ret = component_add_typed(dev_priv->drm.dev,
> &i915_hdcp_ops,
> > > +					  I915_COMPONENT_HDCP);
> > > +
> > >  	if (ret < 0) {
> > > -		drm_dbg_kms(&dev_priv->drm, "Failed at component
> add(%d)\n",
> > > +		drm_dbg_kms(&dev_priv->drm, "Failed at fw component
> > > add(%d)\n",
> > >  			    ret);
> > >  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > >  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7
> +2501,10
> > @@
> > > void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
> > >  	dev_priv->display.hdcp.comp_added = false;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > >
> > > -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		intel_hdcp_gsc_fini(dev_priv);
> > > +	else
> > > +		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > >  }
> > >
> > >  void intel_hdcp_cleanup(struct intel_connector *connector) diff
> > > --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > index 8e3b5e6733d7..7eb1eeeb5a51 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > @@ -3,12 +3,617 @@
> > >   * Copyright 2023, Intel Corporation.
> > >   */
> > >
> > > +#include <drm/i915_hdcp_interface.h>
> > > +
> > >  #include "display/intel_hdcp_gsc.h"
> > >  #include "gem/i915_gem_region.h"
> > >  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> > >  #include "i915_drv.h"
> > >  #include "i915_utils.h"
> > >
> > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> > > +	return DISPLAY_VER(i915) >= 14;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_initiate_session(struct device *dev, struct hdcp_port_data
> *data,
> > > +			  struct hdcp2_ake_init *ake_data) {
> 
> 
> One more input, can we make the data packet creation in a common file
> since it is defined by protocol and should be same both for mei or gsc.
> 
> mei and GSC specific stuff like headers and actual command to send can be
> separated by respective interface but protocol part can be kept common.
> 
> Regards,
> Uma Shankar

Makes sense will add this along with the cleanup task for hdcp 

Regards,
Suraj Kandpal
> 
> > > +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
> > > +	struct wired_cmd_initiate_hdcp2_session_out
> > > +						session_init_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !ake_data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	session_init_in.header.api_version = HDCP_API_VERSION;
> > > +	session_init_in.header.command_id =
> WIRED_INITIATE_HDCP2_SESSION;
> > > +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	session_init_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > > +
> > > +	session_init_in.port.integrated_port_type = data->port_type;
> > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	session_init_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> > > +	session_init_in.protocol = data->protocol;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_init_in,
> > > +				       sizeof(session_init_in),
> > > +				       (u8 *)&session_init_out,
> > > +				       sizeof(session_init_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_INITIATE_HDCP2_SESSION,
> > > +			    session_init_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> > > +	ake_data->tx_caps = session_init_out.tx_caps;
> > > +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> HDCP_2_2_RTX_LEN);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> > > +					 struct hdcp_port_data *data,
> > > +					 struct hdcp2_ake_send_cert
> *rx_cert,
> > > +					 bool *km_stored,
> > > +					 struct hdcp2_ake_no_stored_km
> > > +								*ek_pub_km,
> > > +					 size_t *msg_sz)
> > > +{
> > > +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
> > > +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 }
> };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km || !msg_sz)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> > > +	verify_rxcert_in.header.command_id =
> WIRED_VERIFY_RECEIVER_CERT;
> > > +	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_rxcert_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > > +
> > > +	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_rxcert_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > > +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx, HDCP_2_2_RRX_LEN);
> > > +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> > > +HDCP_2_2_RXCAPS_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_rxcert_in,
> > > +				       sizeof(verify_rxcert_in),
> > > +				       (u8 *)&verify_rxcert_out,
> > > +				       sizeof(verify_rxcert_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed:
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_VERIFY_RECEIVER_CERT,
> > > +			    verify_rxcert_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	*km_stored = !!verify_rxcert_out.km_stored;
> > > +	if (verify_rxcert_out.km_stored) {
> > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> > > +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> > > +	} else {
> > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM;
> > > +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> > > +	}
> > > +
> > > +	memcpy(ek_pub_km->e_kpub_km, &verify_rxcert_out.ekm_buff,
> > > +	       sizeof(verify_rxcert_out.ekm_buff));
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data
> *data,
> > > +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> > > +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
> > > +	struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !rx_hprime)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> > > +	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
> > > +	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	send_hprime_in.header.buffer_len =
> > > +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > > +
> > > +	send_hprime_in.port.integrated_port_type = data->port_type;
> > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	send_hprime_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > > +	       HDCP_2_2_H_PRIME_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&send_hprime_in,
> > > +				       sizeof(send_hprime_in),
> > > +				       (u8 *)&send_hprime_out,
> > > +				       sizeof(send_hprime_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_AKE_SEND_HPRIME,
> > > send_hprime_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data
> *data,
> > > +			    struct hdcp2_ake_send_pairing_info *pairing_info)
> {
> > > +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 }
> };
> > > +	struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0
> } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !pairing_info)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> > > +	pairing_info_in.header.command_id =
> WIRED_AKE_SEND_PAIRING_INFO;
> > > +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	pairing_info_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > > +
> > > +	pairing_info_in.port.integrated_port_type = data->port_type;
> > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	pairing_info_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > > +	       HDCP_2_2_E_KH_KM_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&pairing_info_in,
> > > +				       sizeof(pairing_info_in),
> > > +				       (u8 *)&pairing_info_out,
> > > +				       sizeof(pairing_info_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_AKE_SEND_PAIRING_INFO,
> > > +			    pairing_info_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_initiate_locality_check(struct device *dev,
> > > +				 struct hdcp_port_data *data,
> > > +				 struct hdcp2_lc_init *lc_init_data) {
> > > +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> > > +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !lc_init_data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	lc_init_in.header.api_version = HDCP_API_VERSION;
> > > +	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
> > > +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	lc_init_in.header.buffer_len =
> > > +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > > +
> > > +	lc_init_in.port.integrated_port_type = data->port_type;
> > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in,
> sizeof(lc_init_in),
> > > +				       (u8 *)&lc_init_out, sizeof(lc_init_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. status:
> > > 0x%X\n",
> > > +			    WIRED_INIT_LOCALITY_CHECK,
> > > lc_init_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> > > +	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data
> *data,
> > > +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> > > +	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
> > > +	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !rx_lprime)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> > > +	verify_lprime_in.header.command_id =
> WIRED_VALIDATE_LOCALITY;
> > > +	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_lprime_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > > +
> > > +	verify_lprime_in.port.integrated_port_type = data->port_type;
> > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_lprime_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > > +	       HDCP_2_2_L_PRIME_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_lprime_in,
> > > +				       sizeof(verify_lprime_in),
> > > +				       (u8 *)&verify_lprime_out,
> > > +				       sizeof(verify_lprime_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_VALIDATE_LOCALITY,
> > > +			    verify_lprime_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int gsc_hdcp_get_session_key(struct device *dev,
> > > +				    struct hdcp_port_data *data,
> > > +				    struct hdcp2_ske_send_eks *ske_data) {
> > > +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> > > +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !ske_data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	get_skey_in.header.api_version = HDCP_API_VERSION;
> > > +	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
> > > +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	get_skey_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > > +
> > > +	get_skey_in.port.integrated_port_type = data->port_type;
> > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	get_skey_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> > > sizeof(get_skey_in),
> > > +				       (u8 *)&get_skey_out,
> sizeof(get_skey_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_GET_SESSION_KEY,
> get_skey_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> > > +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> > > +	       HDCP_2_2_E_DKEY_KS_LEN);
> > > +	memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> > > +					 struct hdcp_port_data *data,
> > > +					 struct
> hdcp2_rep_send_receiverid_list
> > > +							*rep_topology,
> > > +					 struct hdcp2_rep_send_ack
> > > +							*rep_send_ack)
> > > +{
> > > +	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
> > > +	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !rep_topology || !rep_send_ack || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	verify_repeater_in.header.api_version = HDCP_API_VERSION;
> > > +	verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
> > > +	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_repeater_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > > +
> > > +	verify_repeater_in.port.integrated_port_type = data->port_type;
> > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_repeater_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > > +	       HDCP_2_2_RXINFO_LEN);
> > > +	memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v,
> > > +	       HDCP_2_2_SEQ_NUM_LEN);
> > > +	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
> > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > +	memcpy(verify_repeater_in.receiver_ids, rep_topology-
> >receiver_ids,
> > > +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_repeater_in,
> > > +				       sizeof(verify_repeater_in),
> > > +				       (u8 *)&verify_repeater_out,
> > > +				       sizeof(verify_repeater_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_repeater_out.header.status !=
> FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_VERIFY_REPEATER,
> > > +			    verify_repeater_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int gsc_hdcp_verify_mprime(struct device *dev,
> > > +				  struct hdcp_port_data *data,
> > > +				  struct hdcp2_rep_stream_ready
> *stream_ready) {
> > > +	struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
> > > +	struct wired_cmd_repeater_auth_stream_req_out
> > > +					verify_mprime_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +	size_t cmd_size;
> > > +
> > > +	if (!dev || !stream_ready || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> > > +	if (cmd_size == SIZE_MAX)
> > > +		return -EINVAL;
> > > +
> > > +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> > > +	if (!verify_mprime_in)
> > > +		return -ENOMEM;
> > > +
> > > +	verify_mprime_in->header.api_version = HDCP_API_VERSION;
> > > +	verify_mprime_in->header.command_id =
> > > WIRED_REPEATER_AUTH_STREAM_REQ;
> > > +	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_mprime_in->header.buffer_len = cmd_size  -
> > > +sizeof(verify_mprime_in->header);
> > > +
> > > +	verify_mprime_in->port.integrated_port_type = data->port_type;
> > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_mprime_in->port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > > HDCP_2_2_MPRIME_LEN);
> > > +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > > >seq_num_m);
> > > +
> > > +	memcpy(verify_mprime_in->streams, data->streams,
> > > +	       array_size(data->k, sizeof(*data->streams)));
> > > +
> > > +	verify_mprime_in->k = cpu_to_be16(data->k);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)verify_mprime_in,
> cmd_size,
> > > +				       (u8 *)&verify_mprime_out,
> > > +				       sizeof(verify_mprime_out));
> > > +	kfree(verify_mprime_in);
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_mprime_out.header.status != FW_HDCP_STATUS_SUCCESS)
> {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> > > +			    verify_mprime_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int gsc_hdcp_enable_authentication(struct device *dev,
> > > +					  struct hdcp_port_data *data) {
> > > +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> > > +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> > > +	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
> > > +	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	enable_auth_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > > +
> > > +	enable_auth_in.port.integrated_port_type = data->port_type;
> > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> > > +	enable_auth_in.stream_type = data->streams[0].stream_type;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&enable_auth_in,
> > > +				       sizeof(enable_auth_in),
> > > +				       (u8 *)&enable_auth_out,
> > > +				       sizeof(enable_auth_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_ENABLE_AUTH,
> enable_auth_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > > +*data) {
> > > +	struct wired_cmd_close_session_in session_close_in = { { 0 } };
> > > +	struct wired_cmd_close_session_out session_close_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	session_close_in.header.api_version = HDCP_API_VERSION;
> > > +	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
> > > +	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	session_close_in.header.buffer_len =
> > > +				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > > +
> > > +	session_close_in.port.integrated_port_type = data->port_type;
> > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	session_close_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_close_in,
> > > +				       sizeof(session_close_in),
> > > +				       (u8 *)&session_close_out,
> > > +				       sizeof(session_close_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "Session Close Failed. status:
> 0x%X\n",
> > > +			    session_close_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> > > +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> > > +	.verify_receiver_cert_prepare_km =
> > > +				gsc_hdcp_verify_receiver_cert_prepare_km,
> > > +	.verify_hprime = gsc_hdcp_verify_hprime,
> > > +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> > > +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> > > +	.verify_lprime = gsc_hdcp_verify_lprime,
> > > +	.get_session_key = gsc_hdcp_get_session_key,
> > > +	.repeater_check_flow_prepare_ack =
> > > +
> 	gsc_hdcp_repeater_check_flow_prepare_ack,
> > > +	.verify_mprime = gsc_hdcp_verify_mprime,
> > > +	.enable_hdcp_authentication = gsc_hdcp_enable_authentication,
> > > +	.close_hdcp_session = gsc_hdcp_close_session, };
> > > +
> > >  /*This function helps allocate memory for the command that we will
> > > send to gsc cs */  static int
> > > intel_hdcp_gsc_initialize_message(struct
> > drm_i915_private *i915,
> > >  					     struct intel_hdcp_gsc_message
> > > *hdcp_message) @@ -58,7 +663,7 @@ static int
> > > intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
> > >  	return err;
> > >  }
> > >
> > > -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > > +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > >  {
> > >  	struct intel_hdcp_gsc_message *hdcp_message;
> > >  	int ret;
> > > @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct
> > > drm_i915_private
> > *i915)
> > >  	return ret;
> > >  }
> > >
> > > -void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
> > > +static void intel_hdcp_gsc_free_message(struct drm_i915_private
> > > +*i915)
> > >  {
> > >  	struct intel_hdcp_gsc_message *hdcp_message =
> > >  					i915->display.hdcp.hdcp_message;
> @@ -
> > 89,6 +694,31 @@ void
> > > intel_hdcp_gsc_free_message(struct drm_i915_private
> > > *i915)
> > >  	kfree(hdcp_message);
> > >  }
> > >
> > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> > > +	struct i915_hdcp_master *data;
> > > +	int ret;
> > > +
> > > +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> > > +	if (!data)
> > > +		return -ENOMEM;
> > > +
> > > +	mutex_lock(&i915->display.hdcp.comp_mutex);
> > > +	i915->display.hdcp.master = data;
> > > +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> > > +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> > > +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> > > +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> > > +
> > > +	return ret;
> > > +}
> > > +
> > > +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> > > +	intel_hdcp_gsc_free_message(i915);
> > > +	kfree(i915->display.hdcp.master);
> > > +}
> > > +
> > >  static int intel_gsc_send_sync(struct drm_i915_private *i915,
> > >  			       struct intel_gsc_mtl_header *header, u64 addr,
> > >  			       size_t msg_out_len)
> > > @@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct
> > > drm_i915_private *i915,
> > >   * will follow
> > >   */
> > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> > > -				size_t msg_in_len, u8 *msg_out, size_t
> > > msg_out_len)
> > > +				size_t msg_in_len, u8 *msg_out,
> > > +				size_t msg_out_len)
> > >  {
> > >  	struct intel_gt *gt = i915->media_gt;
> > >  	struct intel_gsc_mtl_header *header; diff --git
> > > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > index 09ffd7ec02cd..5cc9fd2e88f6 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
> > >  	void *hdcp_cmd;
> > >  };
> > >
> > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
> > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> > >  				size_t msg_in_len, u8 *msg_out,
> > >  				size_t msg_out_len);
> > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> > > +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> > >
> > >  #endif /* __INTEL_HDCP_GCS_H__ */
> > > --
> > > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-03-07  6:45     ` Shankar, Uma
  2023-03-07  6:50       ` Kandpal, Suraj
@ 2023-03-09  7:52       ` Kandpal, Suraj
  2023-03-16  8:12         ` Shankar, Uma
  1 sibling, 1 reply; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-09  7:52 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Shankar, Uma <uma.shankar@intel.com>
> Sent: Tuesday, March 7, 2023 12:15 PM
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> 
> 
> 
> > -----Original Message-----
> > From: Shankar, Uma
> > Sent: Monday, March 6, 2023 6:05 PM
> > To: Kandpal, Suraj <suraj.kandpal@intel.com>;
> > intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > Gupta, Anshuman <Anshuman.Gupta@intel.com>
> > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> >
> >
> >
> > > -----Original Message-----
> > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > To: intel-gfx@lists.freedesktop.org
> > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > > <suraj.kandpal@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>;
> > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > <uma.shankar@intel.com>; Gupta, Anshuman
> <anshuman.gupta@intel.com>
> > > Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > >
> > > MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP
> commands
> > > to GSC f/w. It requires to keep hdcp display driver agnostic to
> > > content protection f/w (ME/GSC fw) in the form of i915_hdcp_fw_ops
> generic ops.
> > >
> > > Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops
> > > generic ops instead of I915_HDCP_COMPONENT as integral part of i915.
> > >
> > > Adding checks to see if GSC is loaded and proxy is setup
> > >
> > > --v6
> > > -dont change the license date in same patch series [Jani] -fix the
> > > license year {Jani]
> > >
> > > --v8
> > > -remove stale comment [Ankit]
> > > -get headers in alphabetical order [Ankit] -fix hdcp2_supported
> > > check [Ankit]
> > >
> > > --v9
> > > -remove return statement from hdcp_gsc_fini [Ankit]
> >
> > Looks Good to me.
> > Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> >
> > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
> > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637
> +++++++++++++++++-
> > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
> > >  3 files changed, 660 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > index 0d6aed1eb171..61bb2bbd0349 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > @@ -23,6 +23,7 @@
> > >  #include "intel_display_power_well.h"
> > >  #include "intel_display_types.h"
> > >  #include "intel_hdcp.h"
> > > +#include "intel_hdcp_gsc.h"
> > >  #include "intel_hdcp_regs.h"
> > >  #include "intel_pcode.h"
> > >
> > > @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct
> > > intel_connector
> > > *connector)
> > >  	struct intel_digital_port *dig_port =
> intel_attached_dig_port(connector);
> > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > >  	struct intel_hdcp *hdcp = &connector->hdcp;
> > > +	struct intel_gt *gt = dev_priv->media_gt;
> > > +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
> > >  	bool capable = false;
> > >
> > >  	/* I915 support for HDCP2.2 */
> > >  	if (!hdcp->hdcp2_supported)
> > >  		return false;
> > >
> > > -	/* MEI interface is solid */
> > > +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		if (!intel_uc_fw_is_running(&gsc->fw))
> > > +			return false;
> > > +
> > > +	/* MEI/GSC interface is solid depending on which is used */
> > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > >  	if (!dev_priv->display.hdcp.comp_added ||
> > > !dev_priv->display.hdcp.master) {
> > >  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > @@ -2235,6 +2243,9 @@ static int initialize_hdcp_port_data(struct
> > > intel_connector *connector,
> > >
> > >  static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
> > > {
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		return true;
> > > +
> > >  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> > >  		return false;
> > >
> > > @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> > > drm_i915_private *dev_priv)
> > >
> > >  	dev_priv->display.hdcp.comp_added = true;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > -	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > > -				  I915_COMPONENT_HDCP);
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		ret = intel_hdcp_gsc_init(dev_priv);
> > > +	else
> > > +		ret = component_add_typed(dev_priv->drm.dev,
> &i915_hdcp_ops,
> > > +					  I915_COMPONENT_HDCP);
> > > +
> > >  	if (ret < 0) {
> > > -		drm_dbg_kms(&dev_priv->drm, "Failed at component
> add(%d)\n",
> > > +		drm_dbg_kms(&dev_priv->drm, "Failed at fw component
> > > add(%d)\n",
> > >  			    ret);
> > >  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > >  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7
> +2501,10
> > @@
> > > void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
> > >  	dev_priv->display.hdcp.comp_added = false;
> > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > >
> > > -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > +		intel_hdcp_gsc_fini(dev_priv);
> > > +	else
> > > +		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > >  }
> > >
> > >  void intel_hdcp_cleanup(struct intel_connector *connector) diff
> > > --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > index 8e3b5e6733d7..7eb1eeeb5a51 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > @@ -3,12 +3,617 @@
> > >   * Copyright 2023, Intel Corporation.
> > >   */
> > >
> > > +#include <drm/i915_hdcp_interface.h>
> > > +
> > >  #include "display/intel_hdcp_gsc.h"
> > >  #include "gem/i915_gem_region.h"
> > >  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> > >  #include "i915_drv.h"
> > >  #include "i915_utils.h"
> > >
> > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> > > +	return DISPLAY_VER(i915) >= 14;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_initiate_session(struct device *dev, struct hdcp_port_data
> *data,
> > > +			  struct hdcp2_ake_init *ake_data) {
> 
> 
> One more input, can we make the data packet creation in a common file
> since it is defined by protocol and should be same both for mei or gsc.
> 
> mei and GSC specific stuff like headers and actual command to send can be
> separated by respective interface but protocol part can be kept common.
> 
> Regards,
> Uma Shankar

We actually discussed this over in a previous version to which Jani suggested to go with a 
Separate module which felt like a lot of rework considering they will only be used at two places.
https://patchwork.freedesktop.org/patch/516449/?series=111876&rev=5

Regards,
Suraj Kandpal
 
> 
> > > +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 }
> };
> > > +	struct wired_cmd_initiate_hdcp2_session_out
> > > +						session_init_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !ake_data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	session_init_in.header.api_version = HDCP_API_VERSION;
> > > +	session_init_in.header.command_id =
> WIRED_INITIATE_HDCP2_SESSION;
> > > +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	session_init_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > > +
> > > +	session_init_in.port.integrated_port_type = data->port_type;
> > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	session_init_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> > > +	session_init_in.protocol = data->protocol;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_init_in,
> > > +				       sizeof(session_init_in),
> > > +				       (u8 *)&session_init_out,
> > > +				       sizeof(session_init_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_INITIATE_HDCP2_SESSION,
> > > +			    session_init_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> > > +	ake_data->tx_caps = session_init_out.tx_caps;
> > > +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> HDCP_2_2_RTX_LEN);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> > > +					 struct hdcp_port_data *data,
> > > +					 struct hdcp2_ake_send_cert
> *rx_cert,
> > > +					 bool *km_stored,
> > > +					 struct hdcp2_ake_no_stored_km
> > > +								*ek_pub_km,
> > > +					 size_t *msg_sz)
> > > +{
> > > +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
> > > +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0
> } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km ||
> !msg_sz)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> > > +	verify_rxcert_in.header.command_id =
> WIRED_VERIFY_RECEIVER_CERT;
> > > +	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_rxcert_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > > +
> > > +	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_rxcert_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > > +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx,
> HDCP_2_2_RRX_LEN);
> > > +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> > > +HDCP_2_2_RXCAPS_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_rxcert_in,
> > > +				       sizeof(verify_rxcert_in),
> > > +				       (u8 *)&verify_rxcert_out,
> > > +				       sizeof(verify_rxcert_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed:
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS)
> {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_VERIFY_RECEIVER_CERT,
> > > +			    verify_rxcert_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	*km_stored = !!verify_rxcert_out.km_stored;
> > > +	if (verify_rxcert_out.km_stored) {
> > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> > > +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> > > +	} else {
> > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM;
> > > +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> > > +	}
> > > +
> > > +	memcpy(ek_pub_km->e_kpub_km, &verify_rxcert_out.ekm_buff,
> > > +	       sizeof(verify_rxcert_out.ekm_buff));
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data
> *data,
> > > +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> > > +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
> > > +	struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 }
> };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !rx_hprime)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> > > +	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
> > > +	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	send_hprime_in.header.buffer_len =
> > > +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > > +
> > > +	send_hprime_in.port.integrated_port_type = data->port_type;
> > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	send_hprime_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > > +	       HDCP_2_2_H_PRIME_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&send_hprime_in,
> > > +				       sizeof(send_hprime_in),
> > > +				       (u8 *)&send_hprime_out,
> > > +				       sizeof(send_hprime_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS)
> {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_AKE_SEND_HPRIME,
> > > send_hprime_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data
> *data,
> > > +			    struct hdcp2_ake_send_pairing_info *pairing_info)
> {
> > > +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 }
> };
> > > +	struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { {
> 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !pairing_info)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> > > +	pairing_info_in.header.command_id =
> WIRED_AKE_SEND_PAIRING_INFO;
> > > +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	pairing_info_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > > +
> > > +	pairing_info_in.port.integrated_port_type = data->port_type;
> > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	pairing_info_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > > +	       HDCP_2_2_E_KH_KM_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&pairing_info_in,
> > > +				       sizeof(pairing_info_in),
> > > +				       (u8 *)&pairing_info_out,
> > > +				       sizeof(pairing_info_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. Status:
> > > 0x%X\n",
> > > +			    WIRED_AKE_SEND_PAIRING_INFO,
> > > +			    pairing_info_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_initiate_locality_check(struct device *dev,
> > > +				 struct hdcp_port_data *data,
> > > +				 struct hdcp2_lc_init *lc_init_data) {
> > > +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> > > +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !lc_init_data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	lc_init_in.header.api_version = HDCP_API_VERSION;
> > > +	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
> > > +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	lc_init_in.header.buffer_len =
> > > +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > > +
> > > +	lc_init_in.port.integrated_port_type = data->port_type;
> > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in,
> sizeof(lc_init_in),
> > > +				       (u8 *)&lc_init_out, sizeof(lc_init_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. status:
> > > 0x%X\n",
> > > +			    WIRED_INIT_LOCALITY_CHECK,
> > > lc_init_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> > > +	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data
> *data,
> > > +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> > > +	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
> > > +	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !rx_lprime)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> > > +	verify_lprime_in.header.command_id =
> WIRED_VALIDATE_LOCALITY;
> > > +	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_lprime_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > > +
> > > +	verify_lprime_in.port.integrated_port_type = data->port_type;
> > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_lprime_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > > +	       HDCP_2_2_L_PRIME_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_lprime_in,
> > > +				       sizeof(verify_lprime_in),
> > > +				       (u8 *)&verify_lprime_out,
> > > +				       sizeof(verify_lprime_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS)
> {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_VALIDATE_LOCALITY,
> > > +			    verify_lprime_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int gsc_hdcp_get_session_key(struct device *dev,
> > > +				    struct hdcp_port_data *data,
> > > +				    struct hdcp2_ske_send_eks *ske_data) {
> > > +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> > > +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data || !ske_data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	get_skey_in.header.api_version = HDCP_API_VERSION;
> > > +	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
> > > +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	get_skey_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > > +
> > > +	get_skey_in.port.integrated_port_type = data->port_type;
> > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	get_skey_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> > > sizeof(get_skey_in),
> > > +				       (u8 *)&get_skey_out,
> sizeof(get_skey_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_GET_SESSION_KEY,
> get_skey_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> > > +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> > > +	       HDCP_2_2_E_DKEY_KS_LEN);
> > > +	memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> > > +					 struct hdcp_port_data *data,
> > > +					 struct
> hdcp2_rep_send_receiverid_list
> > > +							*rep_topology,
> > > +					 struct hdcp2_rep_send_ack
> > > +							*rep_send_ack)
> > > +{
> > > +	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
> > > +	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 }
> };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !rep_topology || !rep_send_ack || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	verify_repeater_in.header.api_version = HDCP_API_VERSION;
> > > +	verify_repeater_in.header.command_id =
> WIRED_VERIFY_REPEATER;
> > > +	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_repeater_in.header.buffer_len =
> > > +
> > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > > +
> > > +	verify_repeater_in.port.integrated_port_type = data->port_type;
> > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_repeater_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > > +	       HDCP_2_2_RXINFO_LEN);
> > > +	memcpy(verify_repeater_in.seq_num_v, rep_topology-
> >seq_num_v,
> > > +	       HDCP_2_2_SEQ_NUM_LEN);
> > > +	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
> > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > +	memcpy(verify_repeater_in.receiver_ids, rep_topology-
> >receiver_ids,
> > > +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_repeater_in,
> > > +				       sizeof(verify_repeater_in),
> > > +				       (u8 *)&verify_repeater_out,
> > > +				       sizeof(verify_repeater_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_repeater_out.header.status !=
> FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_VERIFY_REPEATER,
> > > +			    verify_repeater_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int gsc_hdcp_verify_mprime(struct device *dev,
> > > +				  struct hdcp_port_data *data,
> > > +				  struct hdcp2_rep_stream_ready
> *stream_ready) {
> > > +	struct wired_cmd_repeater_auth_stream_req_in
> *verify_mprime_in;
> > > +	struct wired_cmd_repeater_auth_stream_req_out
> > > +					verify_mprime_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +	size_t cmd_size;
> > > +
> > > +	if (!dev || !stream_ready || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> > > +	if (cmd_size == SIZE_MAX)
> > > +		return -EINVAL;
> > > +
> > > +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> > > +	if (!verify_mprime_in)
> > > +		return -ENOMEM;
> > > +
> > > +	verify_mprime_in->header.api_version = HDCP_API_VERSION;
> > > +	verify_mprime_in->header.command_id =
> > > WIRED_REPEATER_AUTH_STREAM_REQ;
> > > +	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	verify_mprime_in->header.buffer_len = cmd_size  -
> > > +sizeof(verify_mprime_in->header);
> > > +
> > > +	verify_mprime_in->port.integrated_port_type = data->port_type;
> > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > +	verify_mprime_in->port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > > HDCP_2_2_MPRIME_LEN);
> > > +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > > >seq_num_m);
> > > +
> > > +	memcpy(verify_mprime_in->streams, data->streams,
> > > +	       array_size(data->k, sizeof(*data->streams)));
> > > +
> > > +	verify_mprime_in->k = cpu_to_be16(data->k);
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)verify_mprime_in,
> cmd_size,
> > > +				       (u8 *)&verify_mprime_out,
> > > +				       sizeof(verify_mprime_out));
> > > +	kfree(verify_mprime_in);
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (verify_mprime_out.header.status !=
> FW_HDCP_STATUS_SUCCESS) {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> > > +			    verify_mprime_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int gsc_hdcp_enable_authentication(struct device *dev,
> > > +					  struct hdcp_port_data *data) {
> > > +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> > > +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> > > +	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
> > > +	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	enable_auth_in.header.buffer_len =
> > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > > +
> > > +	enable_auth_in.port.integrated_port_type = data->port_type;
> > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> >hdcp_transcoder;
> > > +	enable_auth_in.stream_type = data->streams[0].stream_type;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&enable_auth_in,
> > > +				       sizeof(enable_auth_in),
> > > +				       (u8 *)&enable_auth_out,
> > > +				       sizeof(enable_auth_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS)
> {
> > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > 0x%X\n",
> > > +			    WIRED_ENABLE_AUTH,
> enable_auth_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static int
> > > +gsc_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > > +*data) {
> > > +	struct wired_cmd_close_session_in session_close_in = { { 0 } };
> > > +	struct wired_cmd_close_session_out session_close_out = { { 0 } };
> > > +	struct drm_i915_private *i915;
> > > +	ssize_t byte;
> > > +
> > > +	if (!dev || !data)
> > > +		return -EINVAL;
> > > +
> > > +	i915 = kdev_to_i915(dev);
> > > +	if (!i915) {
> > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > +		return -ENODEV;
> > > +	}
> > > +
> > > +	session_close_in.header.api_version = HDCP_API_VERSION;
> > > +	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
> > > +	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > +	session_close_in.header.buffer_len =
> > > +				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > > +
> > > +	session_close_in.port.integrated_port_type = data->port_type;
> > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > +	session_close_in.port.attached_transcoder =
> > > +(u8)data->hdcp_transcoder;
> > > +
> > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_close_in,
> > > +				       sizeof(session_close_in),
> > > +				       (u8 *)&session_close_out,
> > > +				       sizeof(session_close_out));
> > > +	if (byte < 0) {
> > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> failed.
> > > %zd\n", byte);
> > > +		return byte;
> > > +	}
> > > +
> > > +	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS)
> {
> > > +		drm_dbg_kms(&i915->drm, "Session Close Failed. status:
> 0x%X\n",
> > > +			    session_close_out.header.status);
> > > +		return -EIO;
> > > +	}
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> > > +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> > > +	.verify_receiver_cert_prepare_km =
> > > +				gsc_hdcp_verify_receiver_cert_prepare_km,
> > > +	.verify_hprime = gsc_hdcp_verify_hprime,
> > > +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> > > +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> > > +	.verify_lprime = gsc_hdcp_verify_lprime,
> > > +	.get_session_key = gsc_hdcp_get_session_key,
> > > +	.repeater_check_flow_prepare_ack =
> > > +
> 	gsc_hdcp_repeater_check_flow_prepare_ack,
> > > +	.verify_mprime = gsc_hdcp_verify_mprime,
> > > +	.enable_hdcp_authentication = gsc_hdcp_enable_authentication,
> > > +	.close_hdcp_session = gsc_hdcp_close_session, };
> > > +
> > >  /*This function helps allocate memory for the command that we will
> > > send to gsc cs */  static int
> > > intel_hdcp_gsc_initialize_message(struct
> > drm_i915_private *i915,
> > >  					     struct intel_hdcp_gsc_message
> > > *hdcp_message) @@ -58,7 +663,7 @@ static int
> > > intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
> > >  	return err;
> > >  }
> > >
> > > -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > > +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > >  {
> > >  	struct intel_hdcp_gsc_message *hdcp_message;
> > >  	int ret;
> > > @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct
> > > drm_i915_private
> > *i915)
> > >  	return ret;
> > >  }
> > >
> > > -void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
> > > +static void intel_hdcp_gsc_free_message(struct drm_i915_private
> > > +*i915)
> > >  {
> > >  	struct intel_hdcp_gsc_message *hdcp_message =
> > >  					i915->display.hdcp.hdcp_message;
> @@ -
> > 89,6 +694,31 @@ void
> > > intel_hdcp_gsc_free_message(struct drm_i915_private
> > > *i915)
> > >  	kfree(hdcp_message);
> > >  }
> > >
> > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> > > +	struct i915_hdcp_master *data;
> > > +	int ret;
> > > +
> > > +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> > > +	if (!data)
> > > +		return -ENOMEM;
> > > +
> > > +	mutex_lock(&i915->display.hdcp.comp_mutex);
> > > +	i915->display.hdcp.master = data;
> > > +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> > > +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> > > +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> > > +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> > > +
> > > +	return ret;
> > > +}
> > > +
> > > +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> > > +	intel_hdcp_gsc_free_message(i915);
> > > +	kfree(i915->display.hdcp.master);
> > > +}
> > > +
> > >  static int intel_gsc_send_sync(struct drm_i915_private *i915,
> > >  			       struct intel_gsc_mtl_header *header, u64 addr,
> > >  			       size_t msg_out_len)
> > > @@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct
> > > drm_i915_private *i915,
> > >   * will follow
> > >   */
> > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> > > -				size_t msg_in_len, u8 *msg_out, size_t
> > > msg_out_len)
> > > +				size_t msg_in_len, u8 *msg_out,
> > > +				size_t msg_out_len)
> > >  {
> > >  	struct intel_gt *gt = i915->media_gt;
> > >  	struct intel_gsc_mtl_header *header; diff --git
> > > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > index 09ffd7ec02cd..5cc9fd2e88f6 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
> > >  	void *hdcp_cmd;
> > >  };
> > >
> > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
> > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> *msg_in,
> > >  				size_t msg_in_len, u8 *msg_out,
> > >  				size_t msg_out_len);
> > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> > > +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> > >
> > >  #endif /* __INTEL_HDCP_GCS_H__ */
> > > --
> > > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-03-09  7:52       ` Kandpal, Suraj
@ 2023-03-16  8:12         ` Shankar, Uma
  2023-03-20 12:09           ` Kandpal, Suraj
  0 siblings, 1 reply; 27+ messages in thread
From: Shankar, Uma @ 2023-03-16  8:12 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Kandpal, Suraj <suraj.kandpal@intel.com>
> Sent: Thursday, March 9, 2023 1:22 PM
> To: Shankar, Uma <uma.shankar@intel.com>; intel-gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> 
> 
> 
> > -----Original Message-----
> > From: Shankar, Uma <uma.shankar@intel.com>
> > Sent: Tuesday, March 7, 2023 12:15 PM
> > To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> > gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > Gupta, Anshuman <anshuman.gupta@intel.com>
> > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> >
> >
> >
> > > -----Original Message-----
> > > From: Shankar, Uma
> > > Sent: Monday, March 6, 2023 6:05 PM
> > > To: Kandpal, Suraj <suraj.kandpal@intel.com>;
> > > intel-gfx@lists.freedesktop.org
> > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > > Gupta, Anshuman <Anshuman.Gupta@intel.com>
> > > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > > To: intel-gfx@lists.freedesktop.org
> > > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal, Suraj
> > > > <suraj.kandpal@intel.com>; Winkler, Tomas
> > <tomas.winkler@intel.com>;
> > > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > > <uma.shankar@intel.com>; Gupta, Anshuman
> > <anshuman.gupta@intel.com>
> > > > Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > > >
> > > > MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP
> > commands
> > > > to GSC f/w. It requires to keep hdcp display driver agnostic to
> > > > content protection f/w (ME/GSC fw) in the form of i915_hdcp_fw_ops
> > generic ops.
> > > >
> > > > Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops
> > > > generic ops instead of I915_HDCP_COMPONENT as integral part of i915.
> > > >
> > > > Adding checks to see if GSC is loaded and proxy is setup
> > > >
> > > > --v6
> > > > -dont change the license date in same patch series [Jani] -fix the
> > > > license year {Jani]
> > > >
> > > > --v8
> > > > -remove stale comment [Ankit]
> > > > -get headers in alphabetical order [Ankit] -fix hdcp2_supported
> > > > check [Ankit]
> > > >
> > > > --v9
> > > > -remove return statement from hdcp_gsc_fini [Ankit]
> > >
> > > Looks Good to me.
> > > Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> > >
> > > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > ---
> > > >  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
> > > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637
> > +++++++++++++++++-
> > > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
> > > >  3 files changed, 660 insertions(+), 8 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > index 0d6aed1eb171..61bb2bbd0349 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > @@ -23,6 +23,7 @@
> > > >  #include "intel_display_power_well.h"
> > > >  #include "intel_display_types.h"
> > > >  #include "intel_hdcp.h"
> > > > +#include "intel_hdcp_gsc.h"
> > > >  #include "intel_hdcp_regs.h"
> > > >  #include "intel_pcode.h"
> > > >
> > > > @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct
> > > > intel_connector
> > > > *connector)
> > > >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > >  	struct intel_hdcp *hdcp = &connector->hdcp;
> > > > +	struct intel_gt *gt = dev_priv->media_gt;
> > > > +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
> > > >  	bool capable = false;
> > > >
> > > >  	/* I915 support for HDCP2.2 */
> > > >  	if (!hdcp->hdcp2_supported)
> > > >  		return false;
> > > >
> > > > -	/* MEI interface is solid */
> > > > +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > +		if (!intel_uc_fw_is_running(&gsc->fw))
> > > > +			return false;
> > > > +
> > > > +	/* MEI/GSC interface is solid depending on which is used */
> > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > >  	if (!dev_priv->display.hdcp.comp_added ||
> > > > !dev_priv->display.hdcp.master) {
> > > >  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > @@ -2235,6 +2243,9 @@ static int initialize_hdcp_port_data(struct
> > > > intel_connector *connector,
> > > >
> > > >  static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
> > > > {
> > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > +		return true;
> > > > +
> > > >  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> > > >  		return false;
> > > >
> > > > @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> > > > drm_i915_private *dev_priv)
> > > >
> > > >  	dev_priv->display.hdcp.comp_added = true;
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > -	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
> > > > -				  I915_COMPONENT_HDCP);
> > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > +		ret = intel_hdcp_gsc_init(dev_priv);
> > > > +	else
> > > > +		ret = component_add_typed(dev_priv->drm.dev,
> > &i915_hdcp_ops,
> > > > +					  I915_COMPONENT_HDCP);
> > > > +
> > > >  	if (ret < 0) {
> > > > -		drm_dbg_kms(&dev_priv->drm, "Failed at component
> > add(%d)\n",
> > > > +		drm_dbg_kms(&dev_priv->drm, "Failed at fw component
> > > > add(%d)\n",
> > > >  			    ret);
> > > >  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > >  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7
> > +2501,10
> > > @@
> > > > void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
> > > >  	dev_priv->display.hdcp.comp_added = false;
> > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > >
> > > > -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > +		intel_hdcp_gsc_fini(dev_priv);
> > > > +	else
> > > > +		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > >  }
> > > >
> > > >  void intel_hdcp_cleanup(struct intel_connector *connector) diff
> > > > --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > index 8e3b5e6733d7..7eb1eeeb5a51 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > @@ -3,12 +3,617 @@
> > > >   * Copyright 2023, Intel Corporation.
> > > >   */
> > > >
> > > > +#include <drm/i915_hdcp_interface.h>
> > > > +
> > > >  #include "display/intel_hdcp_gsc.h"
> > > >  #include "gem/i915_gem_region.h"
> > > >  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> > > >  #include "i915_drv.h"
> > > >  #include "i915_utils.h"
> > > >
> > > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> > > > +	return DISPLAY_VER(i915) >= 14;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_initiate_session(struct device *dev, struct
> > > > +hdcp_port_data
> > *data,
> > > > +			  struct hdcp2_ake_init *ake_data) {
> >
> >
> > One more input, can we make the data packet creation in a common file
> > since it is defined by protocol and should be same both for mei or gsc.
> >
> > mei and GSC specific stuff like headers and actual command to send can
> > be separated by respective interface but protocol part can be kept common.
> >
> > Regards,
> > Uma Shankar
> 
> We actually discussed this over in a previous version to which Jani suggested to go
> with a Separate module which felt like a lot of rework considering they will only be
> used at two places.
> https://patchwork.freedesktop.org/patch/516449/?series=111876&rev=5

It may be used now even by Xe driver as well. Can you create an internal JIRA to plan
the module and cleaning these definitions. For now, we can go with this unless some
strong objection by anyone.

Regards,
Uma Shankar
 
> Regards,
> Suraj Kandpal
> 
> >
> > > > +	struct wired_cmd_initiate_hdcp2_session_in session_init_in = { {
> > > > +0 }
> > };
> > > > +	struct wired_cmd_initiate_hdcp2_session_out
> > > > +						session_init_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !ake_data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	session_init_in.header.api_version = HDCP_API_VERSION;
> > > > +	session_init_in.header.command_id =
> > WIRED_INITIATE_HDCP2_SESSION;
> > > > +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	session_init_in.header.buffer_len =
> > > > +
> > > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > > > +
> > > > +	session_init_in.port.integrated_port_type = data->port_type;
> > > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	session_init_in.port.attached_transcoder = (u8)data-
> > >hdcp_transcoder;
> > > > +	session_init_in.protocol = data->protocol;
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_init_in,
> > > > +				       sizeof(session_init_in),
> > > > +				       (u8 *)&session_init_out,
> > > > +				       sizeof(session_init_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (session_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > > 0x%X\n",
> > > > +			    WIRED_INITIATE_HDCP2_SESSION,
> > > > +			    session_init_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> > > > +	ake_data->tx_caps = session_init_out.tx_caps;
> > > > +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> > HDCP_2_2_RTX_LEN);
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> > > > +					 struct hdcp_port_data *data,
> > > > +					 struct hdcp2_ake_send_cert
> > *rx_cert,
> > > > +					 bool *km_stored,
> > > > +					 struct hdcp2_ake_no_stored_km
> > > > +								*ek_pub_km,
> > > > +					 size_t *msg_sz)
> > > > +{
> > > > +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
> > > > +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = {
> > > > +{ 0
> > } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km ||
> > !msg_sz)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> > > > +	verify_rxcert_in.header.command_id =
> > WIRED_VERIFY_RECEIVER_CERT;
> > > > +	verify_rxcert_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	verify_rxcert_in.header.buffer_len =
> > > > +
> > > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > > > +
> > > > +	verify_rxcert_in.port.integrated_port_type = data->port_type;
> > > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_rxcert_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > > > +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx,
> > HDCP_2_2_RRX_LEN);
> > > > +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> > > > +HDCP_2_2_RXCAPS_LEN);
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_rxcert_in,
> > > > +				       sizeof(verify_rxcert_in),
> > > > +				       (u8 *)&verify_rxcert_out,
> > > > +				       sizeof(verify_rxcert_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed:
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (verify_rxcert_out.header.status != FW_HDCP_STATUS_SUCCESS)
> > {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > > 0x%X\n",
> > > > +			    WIRED_VERIFY_RECEIVER_CERT,
> > > > +			    verify_rxcert_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	*km_stored = !!verify_rxcert_out.km_stored;
> > > > +	if (verify_rxcert_out.km_stored) {
> > > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> > > > +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> > > > +	} else {
> > > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM;
> > > > +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> > > > +	}
> > > > +
> > > > +	memcpy(ek_pub_km->e_kpub_km, &verify_rxcert_out.ekm_buff,
> > > > +	       sizeof(verify_rxcert_out.ekm_buff));
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data
> > *data,
> > > > +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> > > > +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
> > > > +	struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 }
> > };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !rx_hprime)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> > > > +	send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
> > > > +	send_hprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	send_hprime_in.header.buffer_len =
> > > > +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > > > +
> > > > +	send_hprime_in.port.integrated_port_type = data->port_type;
> > > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	send_hprime_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > > > +	       HDCP_2_2_H_PRIME_LEN);
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&send_hprime_in,
> > > > +				       sizeof(send_hprime_in),
> > > > +				       (u8 *)&send_hprime_out,
> > > > +				       sizeof(send_hprime_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (send_hprime_out.header.status != FW_HDCP_STATUS_SUCCESS)
> > {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. Status:
> > > > 0x%X\n",
> > > > +			    WIRED_AKE_SEND_HPRIME,
> > > > send_hprime_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_store_pairing_info(struct device *dev, struct
> > > > +hdcp_port_data
> > *data,
> > > > +			    struct hdcp2_ake_send_pairing_info *pairing_info)
> > {
> > > > +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { {
> > > > +0 }
> > };
> > > > +	struct wired_cmd_ake_send_pairing_info_out pairing_info_out = {
> > > > +{
> > 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !pairing_info)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> > > > +	pairing_info_in.header.command_id =
> > WIRED_AKE_SEND_PAIRING_INFO;
> > > > +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	pairing_info_in.header.buffer_len =
> > > > +
> > > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > > > +
> > > > +	pairing_info_in.port.integrated_port_type = data->port_type;
> > > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	pairing_info_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > > > +	       HDCP_2_2_E_KH_KM_LEN);
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&pairing_info_in,
> > > > +				       sizeof(pairing_info_in),
> > > > +				       (u8 *)&pairing_info_out,
> > > > +				       sizeof(pairing_info_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (pairing_info_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. Status:
> > > > 0x%X\n",
> > > > +			    WIRED_AKE_SEND_PAIRING_INFO,
> > > > +			    pairing_info_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_initiate_locality_check(struct device *dev,
> > > > +				 struct hdcp_port_data *data,
> > > > +				 struct hdcp2_lc_init *lc_init_data) {
> > > > +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> > > > +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !lc_init_data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	lc_init_in.header.api_version = HDCP_API_VERSION;
> > > > +	lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
> > > > +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	lc_init_in.header.buffer_len =
> > > > +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > > > +
> > > > +	lc_init_in.port.integrated_port_type = data->port_type;
> > > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	lc_init_in.port.attached_transcoder = (u8)data->hdcp_transcoder;
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in,
> > sizeof(lc_init_in),
> > > > +				       (u8 *)&lc_init_out, sizeof(lc_init_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed. status:
> > > > 0x%X\n",
> > > > +			    WIRED_INIT_LOCALITY_CHECK,
> > > > lc_init_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> > > > +	memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN);
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data
> > *data,
> > > > +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> > > > +	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
> > > > +	struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !rx_lprime)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> > > > +	verify_lprime_in.header.command_id =
> > WIRED_VALIDATE_LOCALITY;
> > > > +	verify_lprime_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	verify_lprime_in.header.buffer_len =
> > > > +
> > > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > > > +
> > > > +	verify_lprime_in.port.integrated_port_type = data->port_type;
> > > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_lprime_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > > > +	       HDCP_2_2_L_PRIME_LEN);
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_lprime_in,
> > > > +				       sizeof(verify_lprime_in),
> > > > +				       (u8 *)&verify_lprime_out,
> > > > +				       sizeof(verify_lprime_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (verify_lprime_out.header.status != FW_HDCP_STATUS_SUCCESS)
> > {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > > 0x%X\n",
> > > > +			    WIRED_VALIDATE_LOCALITY,
> > > > +			    verify_lprime_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int gsc_hdcp_get_session_key(struct device *dev,
> > > > +				    struct hdcp_port_data *data,
> > > > +				    struct hdcp2_ske_send_eks *ske_data) {
> > > > +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> > > > +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data || !ske_data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	get_skey_in.header.api_version = HDCP_API_VERSION;
> > > > +	get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
> > > > +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	get_skey_in.header.buffer_len =
> > > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > > > +
> > > > +	get_skey_in.port.integrated_port_type = data->port_type;
> > > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	get_skey_in.port.attached_transcoder = (u8)data-
> > >hdcp_transcoder;
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> > > > sizeof(get_skey_in),
> > > > +				       (u8 *)&get_skey_out,
> > sizeof(get_skey_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (get_skey_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > > 0x%X\n",
> > > > +			    WIRED_GET_SESSION_KEY,
> > get_skey_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> > > > +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> > > > +	       HDCP_2_2_E_DKEY_KS_LEN);
> > > > +	memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN);
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> > > > +					 struct hdcp_port_data *data,
> > > > +					 struct
> > hdcp2_rep_send_receiverid_list
> > > > +							*rep_topology,
> > > > +					 struct hdcp2_rep_send_ack
> > > > +							*rep_send_ack)
> > > > +{
> > > > +	struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
> > > > +	struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0
> > > > +}
> > };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !rep_topology || !rep_send_ack || !data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	verify_repeater_in.header.api_version = HDCP_API_VERSION;
> > > > +	verify_repeater_in.header.command_id =
> > WIRED_VERIFY_REPEATER;
> > > > +	verify_repeater_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	verify_repeater_in.header.buffer_len =
> > > > +
> > > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > > > +
> > > > +	verify_repeater_in.port.integrated_port_type = data->port_type;
> > > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_repeater_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > > > +	       HDCP_2_2_RXINFO_LEN);
> > > > +	memcpy(verify_repeater_in.seq_num_v, rep_topology-
> > >seq_num_v,
> > > > +	       HDCP_2_2_SEQ_NUM_LEN);
> > > > +	memcpy(verify_repeater_in.v_prime, rep_topology->v_prime,
> > > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > > +	memcpy(verify_repeater_in.receiver_ids, rep_topology-
> > >receiver_ids,
> > > > +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&verify_repeater_in,
> > > > +				       sizeof(verify_repeater_in),
> > > > +				       (u8 *)&verify_repeater_out,
> > > > +				       sizeof(verify_repeater_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (verify_repeater_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS) {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > > 0x%X\n",
> > > > +			    WIRED_VERIFY_REPEATER,
> > > > +			    verify_repeater_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> > > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > > +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int gsc_hdcp_verify_mprime(struct device *dev,
> > > > +				  struct hdcp_port_data *data,
> > > > +				  struct hdcp2_rep_stream_ready
> > *stream_ready) {
> > > > +	struct wired_cmd_repeater_auth_stream_req_in
> > *verify_mprime_in;
> > > > +	struct wired_cmd_repeater_auth_stream_req_out
> > > > +					verify_mprime_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +	size_t cmd_size;
> > > > +
> > > > +	if (!dev || !stream_ready || !data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> > > > +	if (cmd_size == SIZE_MAX)
> > > > +		return -EINVAL;
> > > > +
> > > > +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> > > > +	if (!verify_mprime_in)
> > > > +		return -ENOMEM;
> > > > +
> > > > +	verify_mprime_in->header.api_version = HDCP_API_VERSION;
> > > > +	verify_mprime_in->header.command_id =
> > > > WIRED_REPEATER_AUTH_STREAM_REQ;
> > > > +	verify_mprime_in->header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	verify_mprime_in->header.buffer_len = cmd_size  -
> > > > +sizeof(verify_mprime_in->header);
> > > > +
> > > > +	verify_mprime_in->port.integrated_port_type = data->port_type;
> > > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > > +	verify_mprime_in->port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	memcpy(verify_mprime_in->m_prime, stream_ready->m_prime,
> > > > HDCP_2_2_MPRIME_LEN);
> > > > +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m, data-
> > > > >seq_num_m);
> > > > +
> > > > +	memcpy(verify_mprime_in->streams, data->streams,
> > > > +	       array_size(data->k, sizeof(*data->streams)));
> > > > +
> > > > +	verify_mprime_in->k = cpu_to_be16(data->k);
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)verify_mprime_in,
> > cmd_size,
> > > > +				       (u8 *)&verify_mprime_out,
> > > > +				       sizeof(verify_mprime_out));
> > > > +	kfree(verify_mprime_in);
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (verify_mprime_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS) {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > > 0x%X\n",
> > > > +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> > > > +			    verify_mprime_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int gsc_hdcp_enable_authentication(struct device *dev,
> > > > +					  struct hdcp_port_data *data) {
> > > > +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> > > > +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> > > > +	enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
> > > > +	enable_auth_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	enable_auth_in.header.buffer_len =
> > > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > > > +
> > > > +	enable_auth_in.port.integrated_port_type = data->port_type;
> > > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> > >hdcp_transcoder;
> > > > +	enable_auth_in.stream_type = data->streams[0].stream_type;
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&enable_auth_in,
> > > > +				       sizeof(enable_auth_in),
> > > > +				       (u8 *)&enable_auth_out,
> > > > +				       sizeof(enable_auth_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (enable_auth_out.header.status != FW_HDCP_STATUS_SUCCESS)
> > {
> > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed. status:
> > > > 0x%X\n",
> > > > +			    WIRED_ENABLE_AUTH,
> > enable_auth_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +gsc_hdcp_close_session(struct device *dev, struct hdcp_port_data
> > > > +*data) {
> > > > +	struct wired_cmd_close_session_in session_close_in = { { 0 } };
> > > > +	struct wired_cmd_close_session_out session_close_out = { { 0 } };
> > > > +	struct drm_i915_private *i915;
> > > > +	ssize_t byte;
> > > > +
> > > > +	if (!dev || !data)
> > > > +		return -EINVAL;
> > > > +
> > > > +	i915 = kdev_to_i915(dev);
> > > > +	if (!i915) {
> > > > +		dev_err(dev, "DRM not initialized, aborting HDCP.\n");
> > > > +		return -ENODEV;
> > > > +	}
> > > > +
> > > > +	session_close_in.header.api_version = HDCP_API_VERSION;
> > > > +	session_close_in.header.command_id = WIRED_CLOSE_SESSION;
> > > > +	session_close_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > +	session_close_in.header.buffer_len =
> > > > +				WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > > > +
> > > > +	session_close_in.port.integrated_port_type = data->port_type;
> > > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > +	session_close_in.port.attached_transcoder =
> > > > +(u8)data->hdcp_transcoder;
> > > > +
> > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&session_close_in,
> > > > +				       sizeof(session_close_in),
> > > > +				       (u8 *)&session_close_out,
> > > > +				       sizeof(session_close_out));
> > > > +	if (byte < 0) {
> > > > +		drm_dbg_kms(&i915->drm, "intel_hdcp_gsc_msg_send
> > failed.
> > > > %zd\n", byte);
> > > > +		return byte;
> > > > +	}
> > > > +
> > > > +	if (session_close_out.header.status != FW_HDCP_STATUS_SUCCESS)
> > {
> > > > +		drm_dbg_kms(&i915->drm, "Session Close Failed. status:
> > 0x%X\n",
> > > > +			    session_close_out.header.status);
> > > > +		return -EIO;
> > > > +	}
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> > > > +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> > > > +	.verify_receiver_cert_prepare_km =
> > > > +				gsc_hdcp_verify_receiver_cert_prepare_km,
> > > > +	.verify_hprime = gsc_hdcp_verify_hprime,
> > > > +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> > > > +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> > > > +	.verify_lprime = gsc_hdcp_verify_lprime,
> > > > +	.get_session_key = gsc_hdcp_get_session_key,
> > > > +	.repeater_check_flow_prepare_ack =
> > > > +
> > 	gsc_hdcp_repeater_check_flow_prepare_ack,
> > > > +	.verify_mprime = gsc_hdcp_verify_mprime,
> > > > +	.enable_hdcp_authentication = gsc_hdcp_enable_authentication,
> > > > +	.close_hdcp_session = gsc_hdcp_close_session, };
> > > > +
> > > >  /*This function helps allocate memory for the command that we
> > > > will send to gsc cs */  static int
> > > > intel_hdcp_gsc_initialize_message(struct
> > > drm_i915_private *i915,
> > > >  					     struct intel_hdcp_gsc_message
> > > > *hdcp_message) @@ -58,7 +663,7 @@ static int
> > > > intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
> > > >  	return err;
> > > >  }
> > > >
> > > > -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > > > +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private
> > > > +*i915)
> > > >  {
> > > >  	struct intel_hdcp_gsc_message *hdcp_message;
> > > >  	int ret;
> > > > @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct
> > > > drm_i915_private
> > > *i915)
> > > >  	return ret;
> > > >  }
> > > >
> > > > -void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
> > > > +static void intel_hdcp_gsc_free_message(struct drm_i915_private
> > > > +*i915)
> > > >  {
> > > >  	struct intel_hdcp_gsc_message *hdcp_message =
> > > >  					i915->display.hdcp.hdcp_message;
> > @@ -
> > > 89,6 +694,31 @@ void
> > > > intel_hdcp_gsc_free_message(struct drm_i915_private
> > > > *i915)
> > > >  	kfree(hdcp_message);
> > > >  }
> > > >
> > > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> > > > +	struct i915_hdcp_master *data;
> > > > +	int ret;
> > > > +
> > > > +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> > > > +	if (!data)
> > > > +		return -ENOMEM;
> > > > +
> > > > +	mutex_lock(&i915->display.hdcp.comp_mutex);
> > > > +	i915->display.hdcp.master = data;
> > > > +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> > > > +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> > > > +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> > > > +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> > > > +
> > > > +	return ret;
> > > > +}
> > > > +
> > > > +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> > > > +	intel_hdcp_gsc_free_message(i915);
> > > > +	kfree(i915->display.hdcp.master); }
> > > > +
> > > >  static int intel_gsc_send_sync(struct drm_i915_private *i915,
> > > >  			       struct intel_gsc_mtl_header *header, u64 addr,
> > > >  			       size_t msg_out_len)
> > > > @@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct
> > > > drm_i915_private *i915,
> > > >   * will follow
> > > >   */
> > > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> > *msg_in,
> > > > -				size_t msg_in_len, u8 *msg_out, size_t
> > > > msg_out_len)
> > > > +				size_t msg_in_len, u8 *msg_out,
> > > > +				size_t msg_out_len)
> > > >  {
> > > >  	struct intel_gt *gt = i915->media_gt;
> > > >  	struct intel_gsc_mtl_header *header; diff --git
> > > > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > index 09ffd7ec02cd..5cc9fd2e88f6 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
> > > >  	void *hdcp_cmd;
> > > >  };
> > > >
> > > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
> > > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8
> > *msg_in,
> > > >  				size_t msg_in_len, u8 *msg_out,
> > > >  				size_t msg_out_len);
> > > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> > > > +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> > > >
> > > >  #endif /* __INTEL_HDCP_GCS_H__ */
> > > > --
> > > > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-03-16  8:12         ` Shankar, Uma
@ 2023-03-20 12:09           ` Kandpal, Suraj
  2023-03-20 14:10             ` Shankar, Uma
  0 siblings, 1 reply; 27+ messages in thread
From: Kandpal, Suraj @ 2023-03-20 12:09 UTC (permalink / raw)
  To: Shankar, Uma, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo



> -----Original Message-----
> From: Shankar, Uma <uma.shankar@intel.com>
> Sent: Thursday, March 16, 2023 1:43 PM
> To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> gfx@lists.freedesktop.org
> Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta,
> Anshuman <anshuman.gupta@intel.com>
> Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> 
> 
> 
> > -----Original Message-----
> > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > Sent: Thursday, March 9, 2023 1:22 PM
> > To: Shankar, Uma <uma.shankar@intel.com>;
> > intel-gfx@lists.freedesktop.org
> > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > Gupta, Anshuman <anshuman.gupta@intel.com>
> > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> >
> >
> >
> > > -----Original Message-----
> > > From: Shankar, Uma <uma.shankar@intel.com>
> > > Sent: Tuesday, March 7, 2023 12:15 PM
> > > To: Kandpal, Suraj <suraj.kandpal@intel.com>; intel-
> > > gfx@lists.freedesktop.org
> > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > > Gupta, Anshuman <anshuman.gupta@intel.com>
> > > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Shankar, Uma
> > > > Sent: Monday, March 6, 2023 6:05 PM
> > > > To: Kandpal, Suraj <suraj.kandpal@intel.com>;
> > > > intel-gfx@lists.freedesktop.org
> > > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Winkler, Tomas
> > > > <tomas.winkler@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> > > > Gupta, Anshuman <Anshuman.Gupta@intel.com>
> > > > Subject: RE: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > > >
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > > > To: intel-gfx@lists.freedesktop.org
> > > > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal,
> > > > > Suraj <suraj.kandpal@intel.com>; Winkler, Tomas
> > > <tomas.winkler@intel.com>;
> > > > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > > > <uma.shankar@intel.com>; Gupta, Anshuman
> > > <anshuman.gupta@intel.com>
> > > > > Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > > > >
> > > > > MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP
> > > commands
> > > > > to GSC f/w. It requires to keep hdcp display driver agnostic to
> > > > > content protection f/w (ME/GSC fw) in the form of
> > > > > i915_hdcp_fw_ops
> > > generic ops.
> > > > >
> > > > > Adding HDCP GSC CS interface by leveraging the i915_hdcp_fw_ops
> > > > > generic ops instead of I915_HDCP_COMPONENT as integral part of
> i915.
> > > > >
> > > > > Adding checks to see if GSC is loaded and proxy is setup
> > > > >
> > > > > --v6
> > > > > -dont change the license date in same patch series [Jani] -fix
> > > > > the license year {Jani]
> > > > >
> > > > > --v8
> > > > > -remove stale comment [Ankit]
> > > > > -get headers in alphabetical order [Ankit] -fix hdcp2_supported
> > > > > check [Ankit]
> > > > >
> > > > > --v9
> > > > > -remove return statement from hdcp_gsc_fini [Ankit]
> > > >
> > > > Looks Good to me.
> > > > Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> > > >
> > > > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > > ---
> > > > >  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
> > > > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637
> > > +++++++++++++++++-
> > > > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
> > > > >  3 files changed, 660 insertions(+), 8 deletions(-)
> > > > >
> > > > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > index 0d6aed1eb171..61bb2bbd0349 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > @@ -23,6 +23,7 @@
> > > > >  #include "intel_display_power_well.h"
> > > > >  #include "intel_display_types.h"
> > > > >  #include "intel_hdcp.h"
> > > > > +#include "intel_hdcp_gsc.h"
> > > > >  #include "intel_hdcp_regs.h"
> > > > >  #include "intel_pcode.h"
> > > > >
> > > > > @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct
> > > > > intel_connector
> > > > > *connector)
> > > > >  	struct intel_digital_port *dig_port =
> > > intel_attached_dig_port(connector);
> > > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > >  	struct intel_hdcp *hdcp = &connector->hdcp;
> > > > > +	struct intel_gt *gt = dev_priv->media_gt;
> > > > > +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
> > > > >  	bool capable = false;
> > > > >
> > > > >  	/* I915 support for HDCP2.2 */
> > > > >  	if (!hdcp->hdcp2_supported)
> > > > >  		return false;
> > > > >
> > > > > -	/* MEI interface is solid */
> > > > > +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > +		if (!intel_uc_fw_is_running(&gsc->fw))
> > > > > +			return false;
> > > > > +
> > > > > +	/* MEI/GSC interface is solid depending on which is used */
> > > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > >  	if (!dev_priv->display.hdcp.comp_added ||
> > > > > !dev_priv->display.hdcp.master) {
> > > > >  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > > @@ -2235,6 +2243,9 @@ static int
> > > > > initialize_hdcp_port_data(struct intel_connector *connector,
> > > > >
> > > > >  static bool is_hdcp2_supported(struct drm_i915_private
> > > > > *dev_priv) {
> > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > +		return true;
> > > > > +
> > > > >  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> > > > >  		return false;
> > > > >
> > > > > @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> > > > > drm_i915_private *dev_priv)
> > > > >
> > > > >  	dev_priv->display.hdcp.comp_added = true;
> > > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > > -	ret = component_add_typed(dev_priv->drm.dev,
> &i915_hdcp_ops,
> > > > > -				  I915_COMPONENT_HDCP);
> > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > +		ret = intel_hdcp_gsc_init(dev_priv);
> > > > > +	else
> > > > > +		ret = component_add_typed(dev_priv->drm.dev,
> > > &i915_hdcp_ops,
> > > > > +					  I915_COMPONENT_HDCP);
> > > > > +
> > > > >  	if (ret < 0) {
> > > > > -		drm_dbg_kms(&dev_priv->drm, "Failed at
> component
> > > add(%d)\n",
> > > > > +		drm_dbg_kms(&dev_priv->drm, "Failed at fw
> component
> > > > > add(%d)\n",
> > > > >  			    ret);
> > > > >  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > >  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7
> > > +2501,10
> > > > @@
> > > > > void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
> > > > >  	dev_priv->display.hdcp.comp_added = false;
> > > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > >
> > > > > -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > +		intel_hdcp_gsc_fini(dev_priv);
> > > > > +	else
> > > > > +		component_del(dev_priv->drm.dev,
> &i915_hdcp_ops);
> > > > >  }
> > > > >
> > > > >  void intel_hdcp_cleanup(struct intel_connector *connector) diff
> > > > > --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > index 8e3b5e6733d7..7eb1eeeb5a51 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > @@ -3,12 +3,617 @@
> > > > >   * Copyright 2023, Intel Corporation.
> > > > >   */
> > > > >
> > > > > +#include <drm/i915_hdcp_interface.h>
> > > > > +
> > > > >  #include "display/intel_hdcp_gsc.h"
> > > > >  #include "gem/i915_gem_region.h"
> > > > >  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> > > > >  #include "i915_drv.h"
> > > > >  #include "i915_utils.h"
> > > > >
> > > > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> > > > > +	return DISPLAY_VER(i915) >= 14; }
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_initiate_session(struct device *dev, struct
> > > > > +hdcp_port_data
> > > *data,
> > > > > +			  struct hdcp2_ake_init *ake_data) {
> > >
> > >
> > > One more input, can we make the data packet creation in a common
> > > file since it is defined by protocol and should be same both for mei or gsc.
> > >
> > > mei and GSC specific stuff like headers and actual command to send
> > > can be separated by respective interface but protocol part can be kept
> common.
> > >
> > > Regards,
> > > Uma Shankar
> >
> > We actually discussed this over in a previous version to which Jani
> > suggested to go with a Separate module which felt like a lot of rework
> > considering they will only be used at two places.
> > https://patchwork.freedesktop.org/patch/516449/?series=111876&rev=5
> 
> It may be used now even by Xe driver as well. Can you create an internal JIRA
> to plan the module and cleaning these definitions. For now, we can go with
> this unless some strong objection by anyone.
> 

Hi, 
Sure I will create an internal task for HDCP cleanup and common code reword through header or module
Whichever the community prefers

Regards,
Suraj Kandpal
> Regards,
> Uma Shankar
> 
> > Regards,
> > Suraj Kandpal
> >
> > >
> > > > > +	struct wired_cmd_initiate_hdcp2_session_in session_init_in
> = {
> > > > > +{
> > > > > +0 }
> > > };
> > > > > +	struct wired_cmd_initiate_hdcp2_session_out
> > > > > +						session_init_out = { {
> 0 } };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !ake_data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	session_init_in.header.api_version = HDCP_API_VERSION;
> > > > > +	session_init_in.header.command_id =
> > > WIRED_INITIATE_HDCP2_SESSION;
> > > > > +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > +	session_init_in.header.buffer_len =
> > > > > +
> > > > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > > > > +
> > > > > +	session_init_in.port.integrated_port_type = data->port_type;
> > > > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	session_init_in.port.attached_transcoder = (u8)data-
> > > >hdcp_transcoder;
> > > > > +	session_init_in.protocol = data->protocol;
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&session_init_in,
> > > > > +				       sizeof(session_init_in),
> > > > > +				       (u8 *)&session_init_out,
> > > > > +				       sizeof(session_init_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (session_init_out.header.status !=
> FW_HDCP_STATUS_SUCCESS) {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> Status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_INITIATE_HDCP2_SESSION,
> > > > > +			    session_init_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> > > > > +	ake_data->tx_caps = session_init_out.tx_caps;
> > > > > +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> > > HDCP_2_2_RTX_LEN);
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> > > > > +					 struct hdcp_port_data *data,
> > > > > +					 struct hdcp2_ake_send_cert
> > > *rx_cert,
> > > > > +					 bool *km_stored,
> > > > > +					 struct
> hdcp2_ake_no_stored_km
> > > > > +
> 	*ek_pub_km,
> > > > > +					 size_t *msg_sz)
> > > > > +{
> > > > > +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = {
> { 0 } };
> > > > > +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out
> =
> > > > > +{ { 0
> > > } };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km ||
> > > !msg_sz)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> > > > > +	verify_rxcert_in.header.command_id =
> > > WIRED_VERIFY_RECEIVER_CERT;
> > > > > +	verify_rxcert_in.header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	verify_rxcert_in.header.buffer_len =
> > > > > +
> > > > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > > > > +
> > > > > +	verify_rxcert_in.port.integrated_port_type = data-
> >port_type;
> > > > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	verify_rxcert_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > > > > +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx,
> > > HDCP_2_2_RRX_LEN);
> > > > > +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> > > > > +HDCP_2_2_RXCAPS_LEN);
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&verify_rxcert_in,
> > > > > +				       sizeof(verify_rxcert_in),
> > > > > +				       (u8 *)&verify_rxcert_out,
> > > > > +				       sizeof(verify_rxcert_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed:
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (verify_rxcert_out.header.status !=
> FW_HDCP_STATUS_SUCCESS)
> > > {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> Status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_VERIFY_RECEIVER_CERT,
> > > > > +			    verify_rxcert_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	*km_stored = !!verify_rxcert_out.km_stored;
> > > > > +	if (verify_rxcert_out.km_stored) {
> > > > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> > > > > +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> > > > > +	} else {
> > > > > +		ek_pub_km->msg_id =
> HDCP_2_2_AKE_NO_STORED_KM;
> > > > > +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> > > > > +	}
> > > > > +
> > > > > +	memcpy(ek_pub_km->e_kpub_km,
> &verify_rxcert_out.ekm_buff,
> > > > > +	       sizeof(verify_rxcert_out.ekm_buff));
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_verify_hprime(struct device *dev, struct
> > > > > +hdcp_port_data
> > > *data,
> > > > > +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> > > > > +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { {
> 0 } };
> > > > > +	struct wired_cmd_ake_send_hprime_out send_hprime_out =
> { { 0 }
> > > };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !rx_hprime)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> > > > > +	send_hprime_in.header.command_id =
> WIRED_AKE_SEND_HPRIME;
> > > > > +	send_hprime_in.header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	send_hprime_in.header.buffer_len =
> > > > > +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > > > > +
> > > > > +	send_hprime_in.port.integrated_port_type = data-
> >port_type;
> > > > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	send_hprime_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > > > > +	       HDCP_2_2_H_PRIME_LEN);
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&send_hprime_in,
> > > > > +				       sizeof(send_hprime_in),
> > > > > +				       (u8 *)&send_hprime_out,
> > > > > +				       sizeof(send_hprime_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (send_hprime_out.header.status !=
> FW_HDCP_STATUS_SUCCESS)
> > > {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> Status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_AKE_SEND_HPRIME,
> > > > > send_hprime_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_store_pairing_info(struct device *dev, struct
> > > > > +hdcp_port_data
> > > *data,
> > > > > +			    struct hdcp2_ake_send_pairing_info
> *pairing_info)
> > > {
> > > > > +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in
> = {
> > > > > +{
> > > > > +0 }
> > > };
> > > > > +	struct wired_cmd_ake_send_pairing_info_out
> pairing_info_out =
> > > > > +{ {
> > > 0 } };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !pairing_info)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> > > > > +	pairing_info_in.header.command_id =
> > > WIRED_AKE_SEND_PAIRING_INFO;
> > > > > +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > +	pairing_info_in.header.buffer_len =
> > > > > +
> > > > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > > > > +
> > > > > +	pairing_info_in.port.integrated_port_type = data->port_type;
> > > > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	pairing_info_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > > > > +	       HDCP_2_2_E_KH_KM_LEN);
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&pairing_info_in,
> > > > > +				       sizeof(pairing_info_in),
> > > > > +				       (u8 *)&pairing_info_out,
> > > > > +				       sizeof(pairing_info_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (pairing_info_out.header.status !=
> FW_HDCP_STATUS_SUCCESS) {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> Status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_AKE_SEND_PAIRING_INFO,
> > > > > +			    pairing_info_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_initiate_locality_check(struct device *dev,
> > > > > +				 struct hdcp_port_data *data,
> > > > > +				 struct hdcp2_lc_init *lc_init_data) {
> > > > > +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> > > > > +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0 }
> };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !lc_init_data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	lc_init_in.header.api_version = HDCP_API_VERSION;
> > > > > +	lc_init_in.header.command_id =
> WIRED_INIT_LOCALITY_CHECK;
> > > > > +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > +	lc_init_in.header.buffer_len =
> > > > > +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > > > > +
> > > > > +	lc_init_in.port.integrated_port_type = data->port_type;
> > > > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	lc_init_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in,
> > > sizeof(lc_init_in),
> > > > > +				       (u8 *)&lc_init_out,
> sizeof(lc_init_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_INIT_LOCALITY_CHECK,
> > > > > lc_init_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> > > > > +	memcpy(lc_init_data->r_n, lc_init_out.r_n,
> HDCP_2_2_RN_LEN);
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_verify_lprime(struct device *dev, struct
> > > > > +hdcp_port_data
> > > *data,
> > > > > +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> > > > > +	struct wired_cmd_validate_locality_in verify_lprime_in = { { 0
> } };
> > > > > +	struct wired_cmd_validate_locality_out verify_lprime_out = {
> { 0 } };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !rx_lprime)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> > > > > +	verify_lprime_in.header.command_id =
> > > WIRED_VALIDATE_LOCALITY;
> > > > > +	verify_lprime_in.header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	verify_lprime_in.header.buffer_len =
> > > > > +
> > > > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > > > > +
> > > > > +	verify_lprime_in.port.integrated_port_type = data-
> >port_type;
> > > > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	verify_lprime_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > > > > +	       HDCP_2_2_L_PRIME_LEN);
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&verify_lprime_in,
> > > > > +				       sizeof(verify_lprime_in),
> > > > > +				       (u8 *)&verify_lprime_out,
> > > > > +				       sizeof(verify_lprime_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (verify_lprime_out.header.status !=
> FW_HDCP_STATUS_SUCCESS)
> > > {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_VALIDATE_LOCALITY,
> > > > > +			    verify_lprime_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int gsc_hdcp_get_session_key(struct device *dev,
> > > > > +				    struct hdcp_port_data *data,
> > > > > +				    struct hdcp2_ske_send_eks
> *ske_data) {
> > > > > +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> > > > > +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 }
> };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data || !ske_data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	get_skey_in.header.api_version = HDCP_API_VERSION;
> > > > > +	get_skey_in.header.command_id =
> WIRED_GET_SESSION_KEY;
> > > > > +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > +	get_skey_in.header.buffer_len =
> > > > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > > > > +
> > > > > +	get_skey_in.port.integrated_port_type = data->port_type;
> > > > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	get_skey_in.port.attached_transcoder = (u8)data-
> > > >hdcp_transcoder;
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> > > > > sizeof(get_skey_in),
> > > > > +				       (u8 *)&get_skey_out,
> > > sizeof(get_skey_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (get_skey_out.header.status !=
> FW_HDCP_STATUS_SUCCESS) {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_GET_SESSION_KEY,
> > > get_skey_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> > > > > +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> > > > > +	       HDCP_2_2_E_DKEY_KS_LEN);
> > > > > +	memcpy(ske_data->riv, get_skey_out.r_iv,
> HDCP_2_2_RIV_LEN);
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> > > > > +					 struct hdcp_port_data *data,
> > > > > +					 struct
> > > hdcp2_rep_send_receiverid_list
> > > > > +
> 	*rep_topology,
> > > > > +					 struct hdcp2_rep_send_ack
> > > > > +
> 	*rep_send_ack)
> > > > > +{
> > > > > +	struct wired_cmd_verify_repeater_in verify_repeater_in = { {
> 0 } };
> > > > > +	struct wired_cmd_verify_repeater_out verify_repeater_out =
> { {
> > > > > +0 }
> > > };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !rep_topology || !rep_send_ack || !data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	verify_repeater_in.header.api_version =
> HDCP_API_VERSION;
> > > > > +	verify_repeater_in.header.command_id =
> > > WIRED_VERIFY_REPEATER;
> > > > > +	verify_repeater_in.header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	verify_repeater_in.header.buffer_len =
> > > > > +
> > > > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > > > > +
> > > > > +	verify_repeater_in.port.integrated_port_type = data-
> >port_type;
> > > > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	verify_repeater_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > > > > +	       HDCP_2_2_RXINFO_LEN);
> > > > > +	memcpy(verify_repeater_in.seq_num_v, rep_topology-
> > > >seq_num_v,
> > > > > +	       HDCP_2_2_SEQ_NUM_LEN);
> > > > > +	memcpy(verify_repeater_in.v_prime, rep_topology-
> >v_prime,
> > > > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > > > +	memcpy(verify_repeater_in.receiver_ids, rep_topology-
> > > >receiver_ids,
> > > > > +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&verify_repeater_in,
> > > > > +				       sizeof(verify_repeater_in),
> > > > > +				       (u8 *)&verify_repeater_out,
> > > > > +				       sizeof(verify_repeater_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (verify_repeater_out.header.status !=
> > > FW_HDCP_STATUS_SUCCESS) {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_VERIFY_REPEATER,
> > > > > +			    verify_repeater_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> > > > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > > > +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int gsc_hdcp_verify_mprime(struct device *dev,
> > > > > +				  struct hdcp_port_data *data,
> > > > > +				  struct hdcp2_rep_stream_ready
> > > *stream_ready) {
> > > > > +	struct wired_cmd_repeater_auth_stream_req_in
> > > *verify_mprime_in;
> > > > > +	struct wired_cmd_repeater_auth_stream_req_out
> > > > > +					verify_mprime_out = { { 0 } };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +	size_t cmd_size;
> > > > > +
> > > > > +	if (!dev || !stream_ready || !data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> > > > > +	if (cmd_size == SIZE_MAX)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> > > > > +	if (!verify_mprime_in)
> > > > > +		return -ENOMEM;
> > > > > +
> > > > > +	verify_mprime_in->header.api_version =
> HDCP_API_VERSION;
> > > > > +	verify_mprime_in->header.command_id =
> > > > > WIRED_REPEATER_AUTH_STREAM_REQ;
> > > > > +	verify_mprime_in->header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	verify_mprime_in->header.buffer_len = cmd_size  -
> > > > > +sizeof(verify_mprime_in->header);
> > > > > +
> > > > > +	verify_mprime_in->port.integrated_port_type = data-
> >port_type;
> > > > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	verify_mprime_in->port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	memcpy(verify_mprime_in->m_prime, stream_ready-
> >m_prime,
> > > > > HDCP_2_2_MPRIME_LEN);
> > > > > +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m,
> data-
> > > > > >seq_num_m);
> > > > > +
> > > > > +	memcpy(verify_mprime_in->streams, data->streams,
> > > > > +	       array_size(data->k, sizeof(*data->streams)));
> > > > > +
> > > > > +	verify_mprime_in->k = cpu_to_be16(data->k);
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)verify_mprime_in,
> > > cmd_size,
> > > > > +				       (u8 *)&verify_mprime_out,
> > > > > +				       sizeof(verify_mprime_out));
> > > > > +	kfree(verify_mprime_in);
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (verify_mprime_out.header.status !=
> > > FW_HDCP_STATUS_SUCCESS) {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> > > > > +			    verify_mprime_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int gsc_hdcp_enable_authentication(struct device *dev,
> > > > > +					  struct hdcp_port_data
> *data) {
> > > > > +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> > > > > +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 }
> };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> > > > > +	enable_auth_in.header.command_id =
> WIRED_ENABLE_AUTH;
> > > > > +	enable_auth_in.header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	enable_auth_in.header.buffer_len =
> > > > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > > > > +
> > > > > +	enable_auth_in.port.integrated_port_type = data-
> >port_type;
> > > > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> > > >hdcp_transcoder;
> > > > > +	enable_auth_in.stream_type = data-
> >streams[0].stream_type;
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&enable_auth_in,
> > > > > +				       sizeof(enable_auth_in),
> > > > > +				       (u8 *)&enable_auth_out,
> > > > > +				       sizeof(enable_auth_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (enable_auth_out.header.status !=
> FW_HDCP_STATUS_SUCCESS)
> > > {
> > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> status:
> > > > > 0x%X\n",
> > > > > +			    WIRED_ENABLE_AUTH,
> > > enable_auth_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static int
> > > > > +gsc_hdcp_close_session(struct device *dev, struct
> > > > > +hdcp_port_data
> > > > > +*data) {
> > > > > +	struct wired_cmd_close_session_in session_close_in = { { 0 }
> };
> > > > > +	struct wired_cmd_close_session_out session_close_out = { {
> 0 } };
> > > > > +	struct drm_i915_private *i915;
> > > > > +	ssize_t byte;
> > > > > +
> > > > > +	if (!dev || !data)
> > > > > +		return -EINVAL;
> > > > > +
> > > > > +	i915 = kdev_to_i915(dev);
> > > > > +	if (!i915) {
> > > > > +		dev_err(dev, "DRM not initialized, aborting
> HDCP.\n");
> > > > > +		return -ENODEV;
> > > > > +	}
> > > > > +
> > > > > +	session_close_in.header.api_version = HDCP_API_VERSION;
> > > > > +	session_close_in.header.command_id =
> WIRED_CLOSE_SESSION;
> > > > > +	session_close_in.header.status =
> FW_HDCP_STATUS_SUCCESS;
> > > > > +	session_close_in.header.buffer_len =
> > > > > +
> 	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > > > > +
> > > > > +	session_close_in.port.integrated_port_type = data-
> >port_type;
> > > > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > +	session_close_in.port.attached_transcoder =
> > > > > +(u8)data->hdcp_transcoder;
> > > > > +
> > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> *)&session_close_in,
> > > > > +				       sizeof(session_close_in),
> > > > > +				       (u8 *)&session_close_out,
> > > > > +				       sizeof(session_close_out));
> > > > > +	if (byte < 0) {
> > > > > +		drm_dbg_kms(&i915->drm,
> "intel_hdcp_gsc_msg_send
> > > failed.
> > > > > %zd\n", byte);
> > > > > +		return byte;
> > > > > +	}
> > > > > +
> > > > > +	if (session_close_out.header.status !=
> FW_HDCP_STATUS_SUCCESS)
> > > {
> > > > > +		drm_dbg_kms(&i915->drm, "Session Close Failed.
> status:
> > > 0x%X\n",
> > > > > +			    session_close_out.header.status);
> > > > > +		return -EIO;
> > > > > +	}
> > > > > +
> > > > > +	return 0;
> > > > > +}
> > > > > +
> > > > > +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> > > > > +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> > > > > +	.verify_receiver_cert_prepare_km =
> > > > > +
> 	gsc_hdcp_verify_receiver_cert_prepare_km,
> > > > > +	.verify_hprime = gsc_hdcp_verify_hprime,
> > > > > +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> > > > > +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> > > > > +	.verify_lprime = gsc_hdcp_verify_lprime,
> > > > > +	.get_session_key = gsc_hdcp_get_session_key,
> > > > > +	.repeater_check_flow_prepare_ack =
> > > > > +
> > > 	gsc_hdcp_repeater_check_flow_prepare_ack,
> > > > > +	.verify_mprime = gsc_hdcp_verify_mprime,
> > > > > +	.enable_hdcp_authentication =
> gsc_hdcp_enable_authentication,
> > > > > +	.close_hdcp_session = gsc_hdcp_close_session, };
> > > > > +
> > > > >  /*This function helps allocate memory for the command that we
> > > > > will send to gsc cs */  static int
> > > > > intel_hdcp_gsc_initialize_message(struct
> > > > drm_i915_private *i915,
> > > > >  					     struct intel_hdcp_gsc_message
> > > > > *hdcp_message) @@ -58,7 +663,7 @@ static int
> > > > > intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
> > > > >  	return err;
> > > > >  }
> > > > >
> > > > > -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > > > > +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private
> > > > > +*i915)
> > > > >  {
> > > > >  	struct intel_hdcp_gsc_message *hdcp_message;
> > > > >  	int ret;
> > > > > @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct
> > > > > drm_i915_private
> > > > *i915)
> > > > >  	return ret;
> > > > >  }
> > > > >
> > > > > -void intel_hdcp_gsc_free_message(struct drm_i915_private *i915)
> > > > > +static void intel_hdcp_gsc_free_message(struct drm_i915_private
> > > > > +*i915)
> > > > >  {
> > > > >  	struct intel_hdcp_gsc_message *hdcp_message =
> > > > >  					i915->display.hdcp.hdcp_message;
> > > @@ -
> > > > 89,6 +694,31 @@ void
> > > > > intel_hdcp_gsc_free_message(struct drm_i915_private
> > > > > *i915)
> > > > >  	kfree(hdcp_message);
> > > > >  }
> > > > >
> > > > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> > > > > +	struct i915_hdcp_master *data;
> > > > > +	int ret;
> > > > > +
> > > > > +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> > > > > +	if (!data)
> > > > > +		return -ENOMEM;
> > > > > +
> > > > > +	mutex_lock(&i915->display.hdcp.comp_mutex);
> > > > > +	i915->display.hdcp.master = data;
> > > > > +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> > > > > +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> > > > > +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> > > > > +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> > > > > +
> > > > > +	return ret;
> > > > > +}
> > > > > +
> > > > > +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> > > > > +	intel_hdcp_gsc_free_message(i915);
> > > > > +	kfree(i915->display.hdcp.master); }
> > > > > +
> > > > >  static int intel_gsc_send_sync(struct drm_i915_private *i915,
> > > > >  			       struct intel_gsc_mtl_header *header, u64 addr,
> > > > >  			       size_t msg_out_len)
> > > > > @@ -133,7 +763,8 @@ static int intel_gsc_send_sync(struct
> > > > > drm_i915_private *i915,
> > > > >   * will follow
> > > > >   */
> > > > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915,
> > > > > u8
> > > *msg_in,
> > > > > -				size_t msg_in_len, u8 *msg_out,
> size_t
> > > > > msg_out_len)
> > > > > +				size_t msg_in_len, u8 *msg_out,
> > > > > +				size_t msg_out_len)
> > > > >  {
> > > > >  	struct intel_gt *gt = i915->media_gt;
> > > > >  	struct intel_gsc_mtl_header *header; diff --git
> > > > > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > index 09ffd7ec02cd..5cc9fd2e88f6 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
> > > > >  	void *hdcp_cmd;
> > > > >  };
> > > > >
> > > > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
> > > > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915,
> > > > > u8
> > > *msg_in,
> > > > >  				size_t msg_in_len, u8 *msg_out,
> > > > >  				size_t msg_out_len);
> > > > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> > > > > +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> > > > >
> > > > >  #endif /* __INTEL_HDCP_GCS_H__ */
> > > > > --
> > > > > 2.25.1


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

* Re: [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
  2023-03-20 12:09           ` Kandpal, Suraj
@ 2023-03-20 14:10             ` Shankar, Uma
  0 siblings, 0 replies; 27+ messages in thread
From: Shankar, Uma @ 2023-03-20 14:10 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx, jani.nikula; +Cc: Winkler, Tomas, Vivi, Rodrigo


> > > > > > -----Original Message-----
> > > > > > From: Kandpal, Suraj <suraj.kandpal@intel.com>
> > > > > > Sent: Wednesday, February 1, 2023 2:38 PM
> > > > > > To: intel-gfx@lists.freedesktop.org
> > > > > > Cc: Nautiyal, Ankit K <ankit.k.nautiyal@intel.com>; Kandpal,
> > > > > > Suraj <suraj.kandpal@intel.com>; Winkler, Tomas
> > > > <tomas.winkler@intel.com>;
> > > > > > Vivi, Rodrigo <rodrigo.vivi@intel.com>; Shankar, Uma
> > > > > > <uma.shankar@intel.com>; Gupta, Anshuman
> > > > <anshuman.gupta@intel.com>
> > > > > > Subject: [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface
> > > > > >
> > > > > > MTL uses GSC command streamer i.e gsc cs to send HDCP/PXP
> > > > commands
> > > > > > to GSC f/w. It requires to keep hdcp display driver agnostic
> > > > > > to content protection f/w (ME/GSC fw) in the form of
> > > > > > i915_hdcp_fw_ops
> > > > generic ops.
> > > > > >
> > > > > > Adding HDCP GSC CS interface by leveraging the
> > > > > > i915_hdcp_fw_ops generic ops instead of I915_HDCP_COMPONENT as
> > > > > > integral part of
> > i915.
> > > > > >
> > > > > > Adding checks to see if GSC is loaded and proxy is setup
> > > > > >
> > > > > > --v6
> > > > > > -dont change the license date in same patch series [Jani] -fix
> > > > > > the license year {Jani]
> > > > > >
> > > > > > --v8
> > > > > > -remove stale comment [Ankit]
> > > > > > -get headers in alphabetical order [Ankit] -fix
> > > > > > hdcp2_supported check [Ankit]
> > > > > >
> > > > > > --v9
> > > > > > -remove return statement from hdcp_gsc_fini [Ankit]
> > > > >
> > > > > Looks Good to me.
> > > > > Reviewed-by: Uma Shankar <uma.shankar@intel.com>
> > > > >
> > > > > > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > > > > > Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > > > > Cc: Uma Shankar <uma.shankar@intel.com>
> > > > > > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > > > Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com>
> > > > > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > > > > > Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > > > > ---
> > > > > >  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
> > > > > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 637
> > > > +++++++++++++++++-
> > > > > >  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |   3 +
> > > > > >  3 files changed, 660 insertions(+), 8 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > > index 0d6aed1eb171..61bb2bbd0349 100644
> > > > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > > > > > @@ -23,6 +23,7 @@
> > > > > >  #include "intel_display_power_well.h"
> > > > > >  #include "intel_display_types.h"
> > > > > >  #include "intel_hdcp.h"
> > > > > > +#include "intel_hdcp_gsc.h"
> > > > > >  #include "intel_hdcp_regs.h"
> > > > > >  #include "intel_pcode.h"
> > > > > >
> > > > > > @@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct
> > > > > > intel_connector
> > > > > > *connector)
> > > > > >  	struct intel_digital_port *dig_port =
> > > > intel_attached_dig_port(connector);
> > > > > >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> > > > > >  	struct intel_hdcp *hdcp = &connector->hdcp;
> > > > > > +	struct intel_gt *gt = dev_priv->media_gt;
> > > > > > +	struct intel_gsc_uc *gsc = &gt->uc.gsc;
> > > > > >  	bool capable = false;
> > > > > >
> > > > > >  	/* I915 support for HDCP2.2 */
> > > > > >  	if (!hdcp->hdcp2_supported)
> > > > > >  		return false;
> > > > > >
> > > > > > -	/* MEI interface is solid */
> > > > > > +	/* If MTL+ make sure gsc is loaded and proxy is setup */
> > > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > > +		if (!intel_uc_fw_is_running(&gsc->fw))
> > > > > > +			return false;
> > > > > > +
> > > > > > +	/* MEI/GSC interface is solid depending on which is used */
> > > > > >  	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > > >  	if (!dev_priv->display.hdcp.comp_added ||
> > > > > > !dev_priv->display.hdcp.master) {
> > > > > >  		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > > > @@ -2235,6 +2243,9 @@ static int
> > > > > > initialize_hdcp_port_data(struct intel_connector *connector,
> > > > > >
> > > > > >  static bool is_hdcp2_supported(struct drm_i915_private
> > > > > > *dev_priv) {
> > > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > > +		return true;
> > > > > > +
> > > > > >  	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> > > > > >  		return false;
> > > > > >
> > > > > > @@ -2256,10 +2267,14 @@ void intel_hdcp_component_init(struct
> > > > > > drm_i915_private *dev_priv)
> > > > > >
> > > > > >  	dev_priv->display.hdcp.comp_added = true;
> > > > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > > > -	ret = component_add_typed(dev_priv->drm.dev,
> > &i915_hdcp_ops,
> > > > > > -				  I915_COMPONENT_HDCP);
> > > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > > +		ret = intel_hdcp_gsc_init(dev_priv);
> > > > > > +	else
> > > > > > +		ret = component_add_typed(dev_priv->drm.dev,
> > > > &i915_hdcp_ops,
> > > > > > +					  I915_COMPONENT_HDCP);
> > > > > > +
> > > > > >  	if (ret < 0) {
> > > > > > -		drm_dbg_kms(&dev_priv->drm, "Failed at
> > component
> > > > add(%d)\n",
> > > > > > +		drm_dbg_kms(&dev_priv->drm, "Failed at fw
> > component
> > > > > > add(%d)\n",
> > > > > >  			    ret);
> > > > > >  		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
> > > > > >  		dev_priv->display.hdcp.comp_added = false; @@ -2486,7
> > > > +2501,10
> > > > > @@
> > > > > > void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
> > > > > >  	dev_priv->display.hdcp.comp_added = false;
> > > > > >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> > > > > >
> > > > > > -	component_del(dev_priv->drm.dev, &i915_hdcp_ops);
> > > > > > +	if (intel_hdcp_gsc_cs_required(dev_priv))
> > > > > > +		intel_hdcp_gsc_fini(dev_priv);
> > > > > > +	else
> > > > > > +		component_del(dev_priv->drm.dev,
> > &i915_hdcp_ops);
> > > > > >  }
> > > > > >
> > > > > >  void intel_hdcp_cleanup(struct intel_connector *connector)
> > > > > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > > index 8e3b5e6733d7..7eb1eeeb5a51 100644
> > > > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> > > > > > @@ -3,12 +3,617 @@
> > > > > >   * Copyright 2023, Intel Corporation.
> > > > > >   */
> > > > > >
> > > > > > +#include <drm/i915_hdcp_interface.h>
> > > > > > +
> > > > > >  #include "display/intel_hdcp_gsc.h"
> > > > > >  #include "gem/i915_gem_region.h"
> > > > > >  #include "gt/uc/intel_gsc_uc_heci_cmd_submit.h"
> > > > > >  #include "i915_drv.h"
> > > > > >  #include "i915_utils.h"
> > > > > >
> > > > > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915) {
> > > > > > +	return DISPLAY_VER(i915) >= 14; }
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_initiate_session(struct device *dev, struct
> > > > > > +hdcp_port_data
> > > > *data,
> > > > > > +			  struct hdcp2_ake_init *ake_data) {
> > > >
> > > >
> > > > One more input, can we make the data packet creation in a common
> > > > file since it is defined by protocol and should be same both for mei or gsc.
> > > >
> > > > mei and GSC specific stuff like headers and actual command to send
> > > > can be separated by respective interface but protocol part can be
> > > > kept
> > common.
> > > >
> > > > Regards,
> > > > Uma Shankar
> > >
> > > We actually discussed this over in a previous version to which Jani
> > > suggested to go with a Separate module which felt like a lot of
> > > rework considering they will only be used at two places.
> > > https://patchwork.freedesktop.org/patch/516449/?series=111876&rev=5
> >
> > It may be used now even by Xe driver as well. Can you create an
> > internal JIRA to plan the module and cleaning these definitions. For
> > now, we can go with this unless some strong objection by anyone.
> >
> 
> Hi,
> Sure I will create an internal task for HDCP cleanup and common code reword
> through header or module Whichever the community prefers

This sounds good, lets track the follow up task separately and plan.
We can merge this to unblock HDCP and GSC interface development work.

@jani.nikula@linux.intel.com Hope this is ok ?

Regards,
Uma Shankar

> Regards,
> Suraj Kandpal
> > Regards,
> > Uma Shankar
> >
> > > Regards,
> > > Suraj Kandpal
> > >
> > > >
> > > > > > +	struct wired_cmd_initiate_hdcp2_session_in session_init_in
> > = {
> > > > > > +{
> > > > > > +0 }
> > > > };
> > > > > > +	struct wired_cmd_initiate_hdcp2_session_out
> > > > > > +						session_init_out = { {
> > 0 } };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !ake_data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	session_init_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	session_init_in.header.command_id =
> > > > WIRED_INITIATE_HDCP2_SESSION;
> > > > > > +	session_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > > +	session_init_in.header.buffer_len =
> > > > > > +
> > > > > > 	WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN;
> > > > > > +
> > > > > > +	session_init_in.port.integrated_port_type = data->port_type;
> > > > > > +	session_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	session_init_in.port.attached_transcoder = (u8)data-
> > > > >hdcp_transcoder;
> > > > > > +	session_init_in.protocol = data->protocol;
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&session_init_in,
> > > > > > +				       sizeof(session_init_in),
> > > > > > +				       (u8 *)&session_init_out,
> > > > > > +				       sizeof(session_init_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (session_init_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS) {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> > Status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_INITIATE_HDCP2_SESSION,
> > > > > > +			    session_init_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	ake_data->msg_id = HDCP_2_2_AKE_INIT;
> > > > > > +	ake_data->tx_caps = session_init_out.tx_caps;
> > > > > > +	memcpy(ake_data->r_tx, session_init_out.r_tx,
> > > > HDCP_2_2_RTX_LEN);
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
> > > > > > +					 struct hdcp_port_data *data,
> > > > > > +					 struct hdcp2_ake_send_cert
> > > > *rx_cert,
> > > > > > +					 bool *km_stored,
> > > > > > +					 struct
> > hdcp2_ake_no_stored_km
> > > > > > +
> > 	*ek_pub_km,
> > > > > > +					 size_t *msg_sz)
> > > > > > +{
> > > > > > +	struct wired_cmd_verify_receiver_cert_in verify_rxcert_in =
> > > > > > +{
> > { 0 } };
> > > > > > +	struct wired_cmd_verify_receiver_cert_out verify_rxcert_out
> > =
> > > > > > +{ { 0
> > > > } };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km ||
> > > > !msg_sz)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	verify_rxcert_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	verify_rxcert_in.header.command_id =
> > > > WIRED_VERIFY_RECEIVER_CERT;
> > > > > > +	verify_rxcert_in.header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	verify_rxcert_in.header.buffer_len =
> > > > > > +
> > > > > > 	WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN;
> > > > > > +
> > > > > > +	verify_rxcert_in.port.integrated_port_type = data-
> > >port_type;
> > > > > > +	verify_rxcert_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	verify_rxcert_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	verify_rxcert_in.cert_rx = rx_cert->cert_rx;
> > > > > > +	memcpy(verify_rxcert_in.r_rx, &rx_cert->r_rx,
> > > > HDCP_2_2_RRX_LEN);
> > > > > > +	memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps,
> > > > > > +HDCP_2_2_RXCAPS_LEN);
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&verify_rxcert_in,
> > > > > > +				       sizeof(verify_rxcert_in),
> > > > > > +				       (u8 *)&verify_rxcert_out,
> > > > > > +				       sizeof(verify_rxcert_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed:
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (verify_rxcert_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS)
> > > > {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> > Status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_VERIFY_RECEIVER_CERT,
> > > > > > +			    verify_rxcert_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	*km_stored = !!verify_rxcert_out.km_stored;
> > > > > > +	if (verify_rxcert_out.km_stored) {
> > > > > > +		ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM;
> > > > > > +		*msg_sz = sizeof(struct hdcp2_ake_stored_km);
> > > > > > +	} else {
> > > > > > +		ek_pub_km->msg_id =
> > HDCP_2_2_AKE_NO_STORED_KM;
> > > > > > +		*msg_sz = sizeof(struct hdcp2_ake_no_stored_km);
> > > > > > +	}
> > > > > > +
> > > > > > +	memcpy(ek_pub_km->e_kpub_km,
> > &verify_rxcert_out.ekm_buff,
> > > > > > +	       sizeof(verify_rxcert_out.ekm_buff));
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_verify_hprime(struct device *dev, struct
> > > > > > +hdcp_port_data
> > > > *data,
> > > > > > +		       struct hdcp2_ake_send_hprime *rx_hprime) {
> > > > > > +	struct wired_cmd_ake_send_hprime_in send_hprime_in = { {
> > 0 } };
> > > > > > +	struct wired_cmd_ake_send_hprime_out send_hprime_out =
> > { { 0 }
> > > > };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !rx_hprime)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	send_hprime_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	send_hprime_in.header.command_id =
> > WIRED_AKE_SEND_HPRIME;
> > > > > > +	send_hprime_in.header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	send_hprime_in.header.buffer_len =
> > > > > > +WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN;
> > > > > > +
> > > > > > +	send_hprime_in.port.integrated_port_type = data-
> > >port_type;
> > > > > > +	send_hprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	send_hprime_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > > > > > +	       HDCP_2_2_H_PRIME_LEN);
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&send_hprime_in,
> > > > > > +				       sizeof(send_hprime_in),
> > > > > > +				       (u8 *)&send_hprime_out,
> > > > > > +				       sizeof(send_hprime_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (send_hprime_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS)
> > > > {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> > Status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_AKE_SEND_HPRIME,
> > > > > > send_hprime_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_store_pairing_info(struct device *dev, struct
> > > > > > +hdcp_port_data
> > > > *data,
> > > > > > +			    struct hdcp2_ake_send_pairing_info
> > *pairing_info)
> > > > {
> > > > > > +	struct wired_cmd_ake_send_pairing_info_in pairing_info_in
> > = {
> > > > > > +{
> > > > > > +0 }
> > > > };
> > > > > > +	struct wired_cmd_ake_send_pairing_info_out
> > pairing_info_out =
> > > > > > +{ {
> > > > 0 } };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !pairing_info)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	pairing_info_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	pairing_info_in.header.command_id =
> > > > WIRED_AKE_SEND_PAIRING_INFO;
> > > > > > +	pairing_info_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > > +	pairing_info_in.header.buffer_len =
> > > > > > +
> > > > > > 	WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN;
> > > > > > +
> > > > > > +	pairing_info_in.port.integrated_port_type = data->port_type;
> > > > > > +	pairing_info_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	pairing_info_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > > > > > +	       HDCP_2_2_E_KH_KM_LEN);
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&pairing_info_in,
> > > > > > +				       sizeof(pairing_info_in),
> > > > > > +				       (u8 *)&pairing_info_out,
> > > > > > +				       sizeof(pairing_info_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (pairing_info_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS) {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> > Status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_AKE_SEND_PAIRING_INFO,
> > > > > > +			    pairing_info_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_initiate_locality_check(struct device *dev,
> > > > > > +				 struct hdcp_port_data *data,
> > > > > > +				 struct hdcp2_lc_init *lc_init_data) {
> > > > > > +	struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
> > > > > > +	struct wired_cmd_init_locality_check_out lc_init_out = { { 0
> > > > > > +}
> > };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !lc_init_data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	lc_init_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	lc_init_in.header.command_id =
> > WIRED_INIT_LOCALITY_CHECK;
> > > > > > +	lc_init_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > > +	lc_init_in.header.buffer_len =
> > > > > > +WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN;
> > > > > > +
> > > > > > +	lc_init_in.port.integrated_port_type = data->port_type;
> > > > > > +	lc_init_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	lc_init_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&lc_init_in,
> > > > sizeof(lc_init_in),
> > > > > > +				       (u8 *)&lc_init_out,
> > sizeof(lc_init_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (lc_init_out.header.status != FW_HDCP_STATUS_SUCCESS) {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X Failed.
> > status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_INIT_LOCALITY_CHECK,
> > > > > > lc_init_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	lc_init_data->msg_id = HDCP_2_2_LC_INIT;
> > > > > > +	memcpy(lc_init_data->r_n, lc_init_out.r_n,
> > HDCP_2_2_RN_LEN);
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_verify_lprime(struct device *dev, struct
> > > > > > +hdcp_port_data
> > > > *data,
> > > > > > +		       struct hdcp2_lc_send_lprime *rx_lprime) {
> > > > > > +	struct wired_cmd_validate_locality_in verify_lprime_in = { {
> > > > > > +0
> > } };
> > > > > > +	struct wired_cmd_validate_locality_out verify_lprime_out = {
> > { 0 } };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !rx_lprime)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	verify_lprime_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	verify_lprime_in.header.command_id =
> > > > WIRED_VALIDATE_LOCALITY;
> > > > > > +	verify_lprime_in.header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	verify_lprime_in.header.buffer_len =
> > > > > > +
> > > > > > 	WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN;
> > > > > > +
> > > > > > +	verify_lprime_in.port.integrated_port_type = data-
> > >port_type;
> > > > > > +	verify_lprime_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	verify_lprime_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > > > > > +	       HDCP_2_2_L_PRIME_LEN);
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&verify_lprime_in,
> > > > > > +				       sizeof(verify_lprime_in),
> > > > > > +				       (u8 *)&verify_lprime_out,
> > > > > > +				       sizeof(verify_lprime_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (verify_lprime_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS)
> > > > {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> > status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_VALIDATE_LOCALITY,
> > > > > > +			    verify_lprime_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int gsc_hdcp_get_session_key(struct device *dev,
> > > > > > +				    struct hdcp_port_data *data,
> > > > > > +				    struct hdcp2_ske_send_eks
> > *ske_data) {
> > > > > > +	struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
> > > > > > +	struct wired_cmd_get_session_key_out get_skey_out = { { 0 }
> > };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data || !ske_data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	get_skey_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	get_skey_in.header.command_id =
> > WIRED_GET_SESSION_KEY;
> > > > > > +	get_skey_in.header.status = FW_HDCP_STATUS_SUCCESS;
> > > > > > +	get_skey_in.header.buffer_len =
> > > > > > WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN;
> > > > > > +
> > > > > > +	get_skey_in.port.integrated_port_type = data->port_type;
> > > > > > +	get_skey_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	get_skey_in.port.attached_transcoder = (u8)data-
> > > > >hdcp_transcoder;
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8 *)&get_skey_in,
> > > > > > sizeof(get_skey_in),
> > > > > > +				       (u8 *)&get_skey_out,
> > > > sizeof(get_skey_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (get_skey_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS) {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> > status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_GET_SESSION_KEY,
> > > > get_skey_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS;
> > > > > > +	memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks,
> > > > > > +	       HDCP_2_2_E_DKEY_KS_LEN);
> > > > > > +	memcpy(ske_data->riv, get_skey_out.r_iv,
> > HDCP_2_2_RIV_LEN);
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> > > > > > +					 struct hdcp_port_data *data,
> > > > > > +					 struct
> > > > hdcp2_rep_send_receiverid_list
> > > > > > +
> > 	*rep_topology,
> > > > > > +					 struct hdcp2_rep_send_ack
> > > > > > +
> > 	*rep_send_ack)
> > > > > > +{
> > > > > > +	struct wired_cmd_verify_repeater_in verify_repeater_in = { {
> > 0 } };
> > > > > > +	struct wired_cmd_verify_repeater_out verify_repeater_out =
> > { {
> > > > > > +0 }
> > > > };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !rep_topology || !rep_send_ack || !data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	verify_repeater_in.header.api_version =
> > HDCP_API_VERSION;
> > > > > > +	verify_repeater_in.header.command_id =
> > > > WIRED_VERIFY_REPEATER;
> > > > > > +	verify_repeater_in.header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	verify_repeater_in.header.buffer_len =
> > > > > > +
> > > > > > 	WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN;
> > > > > > +
> > > > > > +	verify_repeater_in.port.integrated_port_type = data-
> > >port_type;
> > > > > > +	verify_repeater_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	verify_repeater_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	memcpy(verify_repeater_in.rx_info, rep_topology->rx_info,
> > > > > > +	       HDCP_2_2_RXINFO_LEN);
> > > > > > +	memcpy(verify_repeater_in.seq_num_v, rep_topology-
> > > > >seq_num_v,
> > > > > > +	       HDCP_2_2_SEQ_NUM_LEN);
> > > > > > +	memcpy(verify_repeater_in.v_prime, rep_topology-
> > >v_prime,
> > > > > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > > > > +	memcpy(verify_repeater_in.receiver_ids, rep_topology-
> > > > >receiver_ids,
> > > > > > +	       HDCP_2_2_RECEIVER_IDS_MAX_LEN);
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&verify_repeater_in,
> > > > > > +				       sizeof(verify_repeater_in),
> > > > > > +				       (u8 *)&verify_repeater_out,
> > > > > > +				       sizeof(verify_repeater_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (verify_repeater_out.header.status !=
> > > > FW_HDCP_STATUS_SUCCESS) {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> > status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_VERIFY_REPEATER,
> > > > > > +			    verify_repeater_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	memcpy(rep_send_ack->v, verify_repeater_out.v,
> > > > > > +	       HDCP_2_2_V_PRIME_HALF_LEN);
> > > > > > +	rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK;
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int gsc_hdcp_verify_mprime(struct device *dev,
> > > > > > +				  struct hdcp_port_data *data,
> > > > > > +				  struct hdcp2_rep_stream_ready
> > > > *stream_ready) {
> > > > > > +	struct wired_cmd_repeater_auth_stream_req_in
> > > > *verify_mprime_in;
> > > > > > +	struct wired_cmd_repeater_auth_stream_req_out
> > > > > > +					verify_mprime_out = { { 0 } };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +	size_t cmd_size;
> > > > > > +
> > > > > > +	if (!dev || !stream_ready || !data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	cmd_size = struct_size(verify_mprime_in, streams, data->k);
> > > > > > +	if (cmd_size == SIZE_MAX)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	verify_mprime_in = kzalloc(cmd_size, GFP_KERNEL);
> > > > > > +	if (!verify_mprime_in)
> > > > > > +		return -ENOMEM;
> > > > > > +
> > > > > > +	verify_mprime_in->header.api_version =
> > HDCP_API_VERSION;
> > > > > > +	verify_mprime_in->header.command_id =
> > > > > > WIRED_REPEATER_AUTH_STREAM_REQ;
> > > > > > +	verify_mprime_in->header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	verify_mprime_in->header.buffer_len = cmd_size  -
> > > > > > +sizeof(verify_mprime_in->header);
> > > > > > +
> > > > > > +	verify_mprime_in->port.integrated_port_type = data-
> > >port_type;
> > > > > > +	verify_mprime_in->port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	verify_mprime_in->port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	memcpy(verify_mprime_in->m_prime, stream_ready-
> > >m_prime,
> > > > > > HDCP_2_2_MPRIME_LEN);
> > > > > > +	drm_hdcp_cpu_to_be24(verify_mprime_in->seq_num_m,
> > data-
> > > > > > >seq_num_m);
> > > > > > +
> > > > > > +	memcpy(verify_mprime_in->streams, data->streams,
> > > > > > +	       array_size(data->k, sizeof(*data->streams)));
> > > > > > +
> > > > > > +	verify_mprime_in->k = cpu_to_be16(data->k);
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)verify_mprime_in,
> > > > cmd_size,
> > > > > > +				       (u8 *)&verify_mprime_out,
> > > > > > +				       sizeof(verify_mprime_out));
> > > > > > +	kfree(verify_mprime_in);
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (verify_mprime_out.header.status !=
> > > > FW_HDCP_STATUS_SUCCESS) {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> > status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_REPEATER_AUTH_STREAM_REQ,
> > > > > > +			    verify_mprime_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int gsc_hdcp_enable_authentication(struct device *dev,
> > > > > > +					  struct hdcp_port_data
> > *data) {
> > > > > > +	struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
> > > > > > +	struct wired_cmd_enable_auth_out enable_auth_out = { { 0 }
> > };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	enable_auth_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	enable_auth_in.header.command_id =
> > WIRED_ENABLE_AUTH;
> > > > > > +	enable_auth_in.header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	enable_auth_in.header.buffer_len =
> > > > > > WIRED_CMD_BUF_LEN_ENABLE_AUTH_IN;
> > > > > > +
> > > > > > +	enable_auth_in.port.integrated_port_type = data-
> > >port_type;
> > > > > > +	enable_auth_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	enable_auth_in.port.attached_transcoder = (u8)data-
> > > > >hdcp_transcoder;
> > > > > > +	enable_auth_in.stream_type = data-
> > >streams[0].stream_type;
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&enable_auth_in,
> > > > > > +				       sizeof(enable_auth_in),
> > > > > > +				       (u8 *)&enable_auth_out,
> > > > > > +				       sizeof(enable_auth_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (enable_auth_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS)
> > > > {
> > > > > > +		drm_dbg_kms(&i915->drm, "FW cmd 0x%08X failed.
> > status:
> > > > > > 0x%X\n",
> > > > > > +			    WIRED_ENABLE_AUTH,
> > > > enable_auth_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static int
> > > > > > +gsc_hdcp_close_session(struct device *dev, struct
> > > > > > +hdcp_port_data
> > > > > > +*data) {
> > > > > > +	struct wired_cmd_close_session_in session_close_in = { { 0 }
> > };
> > > > > > +	struct wired_cmd_close_session_out session_close_out = { {
> > 0 } };
> > > > > > +	struct drm_i915_private *i915;
> > > > > > +	ssize_t byte;
> > > > > > +
> > > > > > +	if (!dev || !data)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	i915 = kdev_to_i915(dev);
> > > > > > +	if (!i915) {
> > > > > > +		dev_err(dev, "DRM not initialized, aborting
> > HDCP.\n");
> > > > > > +		return -ENODEV;
> > > > > > +	}
> > > > > > +
> > > > > > +	session_close_in.header.api_version = HDCP_API_VERSION;
> > > > > > +	session_close_in.header.command_id =
> > WIRED_CLOSE_SESSION;
> > > > > > +	session_close_in.header.status =
> > FW_HDCP_STATUS_SUCCESS;
> > > > > > +	session_close_in.header.buffer_len =
> > > > > > +
> > 	WIRED_CMD_BUF_LEN_CLOSE_SESSION_IN;
> > > > > > +
> > > > > > +	session_close_in.port.integrated_port_type = data-
> > >port_type;
> > > > > > +	session_close_in.port.physical_port = (u8)data->hdcp_ddi;
> > > > > > +	session_close_in.port.attached_transcoder =
> > > > > > +(u8)data->hdcp_transcoder;
> > > > > > +
> > > > > > +	byte = intel_hdcp_gsc_msg_send(i915, (u8
> > *)&session_close_in,
> > > > > > +				       sizeof(session_close_in),
> > > > > > +				       (u8 *)&session_close_out,
> > > > > > +				       sizeof(session_close_out));
> > > > > > +	if (byte < 0) {
> > > > > > +		drm_dbg_kms(&i915->drm,
> > "intel_hdcp_gsc_msg_send
> > > > failed.
> > > > > > %zd\n", byte);
> > > > > > +		return byte;
> > > > > > +	}
> > > > > > +
> > > > > > +	if (session_close_out.header.status !=
> > FW_HDCP_STATUS_SUCCESS)
> > > > {
> > > > > > +		drm_dbg_kms(&i915->drm, "Session Close Failed.
> > status:
> > > > 0x%X\n",
> > > > > > +			    session_close_out.header.status);
> > > > > > +		return -EIO;
> > > > > > +	}
> > > > > > +
> > > > > > +	return 0;
> > > > > > +}
> > > > > > +
> > > > > > +static const struct i915_hdcp_ops gsc_hdcp_ops = {
> > > > > > +	.initiate_hdcp2_session = gsc_hdcp_initiate_session,
> > > > > > +	.verify_receiver_cert_prepare_km =
> > > > > > +
> > 	gsc_hdcp_verify_receiver_cert_prepare_km,
> > > > > > +	.verify_hprime = gsc_hdcp_verify_hprime,
> > > > > > +	.store_pairing_info = gsc_hdcp_store_pairing_info,
> > > > > > +	.initiate_locality_check = gsc_hdcp_initiate_locality_check,
> > > > > > +	.verify_lprime = gsc_hdcp_verify_lprime,
> > > > > > +	.get_session_key = gsc_hdcp_get_session_key,
> > > > > > +	.repeater_check_flow_prepare_ack =
> > > > > > +
> > > > 	gsc_hdcp_repeater_check_flow_prepare_ack,
> > > > > > +	.verify_mprime = gsc_hdcp_verify_mprime,
> > > > > > +	.enable_hdcp_authentication =
> > gsc_hdcp_enable_authentication,
> > > > > > +	.close_hdcp_session = gsc_hdcp_close_session, };
> > > > > > +
> > > > > >  /*This function helps allocate memory for the command that we
> > > > > > will send to gsc cs */  static int
> > > > > > intel_hdcp_gsc_initialize_message(struct
> > > > > drm_i915_private *i915,
> > > > > >  					     struct intel_hdcp_gsc_message
> > > > > > *hdcp_message) @@ -58,7 +663,7 @@ static int
> > > > > > intel_hdcp_gsc_initialize_message(struct drm_i915_private *i915,
> > > > > >  	return err;
> > > > > >  }
> > > > > >
> > > > > > -int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private *i915)
> > > > > > +static int intel_hdcp_gsc_hdcp2_init(struct drm_i915_private
> > > > > > +*i915)
> > > > > >  {
> > > > > >  	struct intel_hdcp_gsc_message *hdcp_message;
> > > > > >  	int ret;
> > > > > > @@ -80,7 +685,7 @@ int intel_hdcp_gsc_hdcp2_init(struct
> > > > > > drm_i915_private
> > > > > *i915)
> > > > > >  	return ret;
> > > > > >  }
> > > > > >
> > > > > > -void intel_hdcp_gsc_free_message(struct drm_i915_private
> > > > > > *i915)
> > > > > > +static void intel_hdcp_gsc_free_message(struct
> > > > > > +drm_i915_private
> > > > > > +*i915)
> > > > > >  {
> > > > > >  	struct intel_hdcp_gsc_message *hdcp_message =
> > > > > >  					i915->display.hdcp.hdcp_message;
> > > > @@ -
> > > > > 89,6 +694,31 @@ void
> > > > > > intel_hdcp_gsc_free_message(struct drm_i915_private
> > > > > > *i915)
> > > > > >  	kfree(hdcp_message);
> > > > > >  }
> > > > > >
> > > > > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915) {
> > > > > > +	struct i915_hdcp_master *data;
> > > > > > +	int ret;
> > > > > > +
> > > > > > +	data = kzalloc(sizeof(struct i915_hdcp_master), GFP_KERNEL);
> > > > > > +	if (!data)
> > > > > > +		return -ENOMEM;
> > > > > > +
> > > > > > +	mutex_lock(&i915->display.hdcp.comp_mutex);
> > > > > > +	i915->display.hdcp.master = data;
> > > > > > +	i915->display.hdcp.master->hdcp_dev = i915->drm.dev;
> > > > > > +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> > > > > > +	ret = intel_hdcp_gsc_hdcp2_init(i915);
> > > > > > +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> > > > > > +
> > > > > > +	return ret;
> > > > > > +}
> > > > > > +
> > > > > > +void intel_hdcp_gsc_fini(struct drm_i915_private *i915) {
> > > > > > +	intel_hdcp_gsc_free_message(i915);
> > > > > > +	kfree(i915->display.hdcp.master); }
> > > > > > +
> > > > > >  static int intel_gsc_send_sync(struct drm_i915_private *i915,
> > > > > >  			       struct intel_gsc_mtl_header *header, u64 addr,
> > > > > >  			       size_t msg_out_len) @@ -133,7 +763,8 @@
> static int
> > > > > > intel_gsc_send_sync(struct drm_i915_private *i915,
> > > > > >   * will follow
> > > > > >   */
> > > > > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private
> > > > > > *i915,
> > > > > > u8
> > > > *msg_in,
> > > > > > -				size_t msg_in_len, u8 *msg_out,
> > size_t
> > > > > > msg_out_len)
> > > > > > +				size_t msg_in_len, u8 *msg_out,
> > > > > > +				size_t msg_out_len)
> > > > > >  {
> > > > > >  	struct intel_gt *gt = i915->media_gt;
> > > > > >  	struct intel_gsc_mtl_header *header; diff --git
> > > > > > a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > > b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > > index 09ffd7ec02cd..5cc9fd2e88f6 100644
> > > > > > --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > > +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> > > > > > @@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
> > > > > >  	void *hdcp_cmd;
> > > > > >  };
> > > > > >
> > > > > > +bool intel_hdcp_gsc_cs_required(struct drm_i915_private
> > > > > > +*i915);
> > > > > >  ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private
> > > > > > *i915,
> > > > > > u8
> > > > *msg_in,
> > > > > >  				size_t msg_in_len, u8 *msg_out,
> > > > > >  				size_t msg_out_len);
> > > > > > +int intel_hdcp_gsc_init(struct drm_i915_private *i915); void
> > > > > > +intel_hdcp_gsc_fini(struct drm_i915_private *i915);
> > > > > >
> > > > > >  #endif /* __INTEL_HDCP_GCS_H__ */
> > > > > > --
> > > > > > 2.25.1


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

end of thread, other threads:[~2023-03-20 14:11 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-01  9:08 [Intel-gfx] [PATCH v10 0/6] Enable HDCP2.x via GSC CS Suraj Kandpal
2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 1/6] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
2023-03-06 11:17   ` Shankar, Uma
2023-03-06 12:39     ` Kandpal, Suraj
2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 2/6] drm/i915/hdcp: Keep hdcp agonstic naming convention Suraj Kandpal
2023-03-06 11:38   ` Shankar, Uma
2023-03-06 12:50     ` Kandpal, Suraj
2023-03-07  6:40       ` Shankar, Uma
2023-03-07  6:48         ` Kandpal, Suraj
2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 3/6] i915/hdcp: HDCP2.x Refactoring to agnostic hdcp Suraj Kandpal
2023-03-06 12:00   ` Shankar, Uma
2023-03-06 12:51     ` Kandpal, Suraj
2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 4/6] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
2023-03-06 12:01   ` Shankar, Uma
2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 5/6] drm/i915/mtl: Add function to send command to GSC CS Suraj Kandpal
2023-03-06 12:32   ` Shankar, Uma
2023-03-06 12:54     ` Kandpal, Suraj
2023-02-01  9:08 ` [Intel-gfx] [PATCH v10 6/6] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
2023-03-06 12:34   ` Shankar, Uma
2023-03-07  6:45     ` Shankar, Uma
2023-03-07  6:50       ` Kandpal, Suraj
2023-03-09  7:52       ` Kandpal, Suraj
2023-03-16  8:12         ` Shankar, Uma
2023-03-20 12:09           ` Kandpal, Suraj
2023-03-20 14:10             ` Shankar, Uma
2023-02-01  9:45 ` [Intel-gfx] ✓ Fi.CI.BAT: success for Enable HDCP2.x via GSC CS (rev10) Patchwork
2023-02-01 10:51 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork

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.