All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS
@ 2022-12-13  7:01 Suraj Kandpal
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 1/7] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
                   ` (11 more replies)
  0 siblings, 12 replies; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 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

Anshuman Gupta (3):
  drm/i915/hdcp: Keep cp fw agonstic naming convention
  drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
  drm/i915/hdcp: Refactor HDCP API structures

Suraj Kandpal (4):
  drm/i915/gsc: Create GSC request submission mechanism
  drm/i915/hdcp: Fill wired_cmd_in structures at a single place
  drm/i915/mtl: Adding function to send command to GSC CS
  drm/i915/mtl: Add HDCP GSC interface

 drivers/gpu/drm/i915/Makefile                 |   1 +
 .../gpu/drm/i915/display/intel_display_core.h |   3 +-
 .../drm/i915/display/intel_display_types.h    |   2 +-
 drivers/gpu/drm/i915/display/intel_hdcp.c     |  94 ++-
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 708 +++++++++++++++++
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  28 +
 drivers/gpu/drm/i915/gt/intel_gpu_commands.h  |   2 +
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.c     |  62 +-
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h     |   3 +
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h   |  42 +
 drivers/misc/mei/hdcp/mei_hdcp.c              | 190 +----
 drivers/misc/mei/hdcp/mei_hdcp.h              | 355 +--------
 include/drm/i915_cp_fw_hdcp_interface.h       | 736 ++++++++++++++++++
 include/drm/i915_mei_hdcp_interface.h         | 184 -----
 14 files changed, 1670 insertions(+), 740 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_fwif.h
 create mode 100644 include/drm/i915_cp_fw_hdcp_interface.h
 delete mode 100644 include/drm/i915_mei_hdcp_interface.h

-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 1/7] drm/i915/gsc: Create GSC request submission mechanism
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention Suraj Kandpal
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 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.

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>
---
 drivers/gpu/drm/i915/gt/intel_gpu_commands.h |  2 +
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.c    | 62 +++++++++++++++++++-
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h    |  3 +
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h  | 41 +++++++++++++
 4 files changed, 105 insertions(+), 3 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h

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.c b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.c
index e73d4440c5e8..f00e88fdb5d2 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.c
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.c
@@ -30,6 +30,35 @@ bool intel_gsc_uc_fw_init_done(struct intel_gsc_uc *gsc)
 	return fw_status & GSC_FW_INIT_COMPLETE_BIT;
 }
 
+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;
+}
+
 static int emit_gsc_fw_load(struct i915_request *rq, struct intel_gsc_uc *gsc)
 {
 	u32 offset = i915_ggtt_offset(gsc->local);
@@ -49,7 +78,12 @@ static int emit_gsc_fw_load(struct i915_request *rq, struct intel_gsc_uc *gsc)
 	return 0;
 }
 
-static int gsc_fw_load(struct intel_gsc_uc *gsc)
+/*
+ * Our submissions to GSC are going to be either a FW load or an heci pkt, but
+ * all the request emission logic is the same so we can use a common func and
+ * just add the correct cmd
+ */
+static int submit_to_gsc_fw(struct intel_gsc_uc *gsc, struct gsc_heci_pkt *pkt)
 {
 	struct intel_context *ce = gsc->ce;
 	struct i915_request *rq;
@@ -68,7 +102,11 @@ static int gsc_fw_load(struct intel_gsc_uc *gsc)
 			goto out_rq;
 	}
 
-	err = emit_gsc_fw_load(rq, gsc);
+	if (pkt)
+		err = emit_gsc_heci_pkt(rq, pkt);
+	else
+		err = emit_gsc_fw_load(rq, gsc);
+
 	if (err)
 		goto out_rq;
 
@@ -89,12 +127,30 @@ static int gsc_fw_load(struct intel_gsc_uc *gsc)
 
 	if (err)
 		drm_err(&gsc_uc_to_gt(gsc)->i915->drm,
-			"Request submission for GSC load failed (%d)\n",
+			"Request submission for GSC failed (%d)\n",
 			err);
 
 	return err;
 }
 
+static int gsc_fw_load(struct intel_gsc_uc *gsc)
+{
+	return submit_to_gsc_fw(gsc, NULL);
+}
+
+int intel_gsc_fw_heci_send(struct intel_gsc_uc *gsc, u64 addr_in, u32 size_in,
+			   u64 addr_out, u32 size_out)
+{
+	struct gsc_heci_pkt pkt = {
+	.addr_in = addr_in,
+	.size_in = size_in,
+	.addr_out = addr_out,
+	.size_out = size_out
+	};
+
+	return submit_to_gsc_fw(gsc, &pkt);
+}
+
 static int gsc_fw_load_prepare(struct intel_gsc_uc *gsc)
 {
 	struct intel_gt *gt = gsc_uc_to_gt(gsc);
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..4a75c3dec669 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,7 @@ 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);
+int intel_gsc_fw_heci_send(struct intel_gsc_uc *gsc, u64 addr_in, u32 size_in,
+			   u64 addr_out, u32 size_out);
+
 #endif
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
new file mode 100644
index 000000000000..1c2a04d092a8
--- /dev/null
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2021 Intel Corporation
+ */
+
+#ifndef _INTEL_GSC_FWIF_H_
+#define _INTEL_GSC_FWIF_H_
+
+#include <linux/types.h>
+
+struct intel_gsc_mtl_header {
+	u32 validity_marker;
+#define GSC_HECI_VALIDITY_MARKER 0xA578875A
+
+	u8 gsc_address;
+#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;
+
+#endif
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 1/7] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13 10:32   ` Jani Nikula
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w Suraj Kandpal
                   ` (9 subsequent siblings)
  11 siblings, 1 reply; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 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_cp_fw_hdcp_interface.h

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>
Acked-by: Tomas Winkler <tomas.winkler@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_types.h          | 2 +-
 drivers/misc/mei/hdcp/mei_hdcp.c                            | 2 +-
 ...915_mei_hdcp_interface.h => i915_cp_fw_hdcp_interface.h} | 6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)
 rename include/drm/{i915_mei_hdcp_interface.h => i915_cp_fw_hdcp_interface.h} (97%)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 32e8b2fc3cc6..52d93e89b4c6 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_cp_fw_hdcp_interface.h>
 #include <media/cec-notifier.h>
 
 #include "i915_vma.h"
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index e889a8bd7ac8..7e3cd3fd7f7b 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_cp_fw_hdcp_interface.h>
 
 #include "mei_hdcp.h"
 
diff --git a/include/drm/i915_mei_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
similarity index 97%
rename from include/drm/i915_mei_hdcp_interface.h
rename to include/drm/i915_cp_fw_hdcp_interface.h
index f441cbcd95a4..e5dc6b985b2f 100644
--- a/include/drm/i915_mei_hdcp_interface.h
+++ b/include/drm/i915_cp_fw_hdcp_interface.h
@@ -6,8 +6,8 @@
  * Ramalingam C <ramalingam.c@intel.com>
  */
 
-#ifndef _I915_MEI_HDCP_INTERFACE_H_
-#define _I915_MEI_HDCP_INTERFACE_H_
+#ifndef _I915_CP_FW_HDCP_INTERFACE_H_
+#define _I915_CP_FW_HDCP_INTERFACE_H_
 
 #include <linux/mutex.h>
 #include <linux/device.h>
@@ -181,4 +181,4 @@ struct i915_hdcp_comp_master {
 	struct mutex mutex;
 };
 
-#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
+#endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 1/7] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13 10:24   ` Jani Nikula
  2022-12-13 10:40   ` Jani Nikula
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 4/7] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
                   ` (8 subsequent siblings)
  11 siblings, 2 replies; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi, Tomas Winkler

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

As now we have more then one type of content protection
secrity firmware. Let change the i915_cp_fw_hdcp_interface.h
header naming convention to suit generic f/w type.
%s/MEI_/FW_
%s/mei_fw/cp_fw
%s/mei_dev/fw_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_fw_master
%s/i915_hdcp_component_ops/i915_hdcp_fw_ops

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>
---
 .../gpu/drm/i915/display/intel_display_core.h |  3 +-
 drivers/gpu/drm/i915/display/intel_hdcp.c     | 66 ++++++++---------
 drivers/misc/mei/hdcp/mei_hdcp.c              | 12 ++--
 include/drm/i915_cp_fw_hdcp_interface.h       | 70 +++++++++----------
 4 files changed, 76 insertions(+), 75 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 57ddce3ba02b..a769cc8e2745 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -16,6 +16,7 @@
 #include <drm/drm_connector.h>
 #include <drm/drm_modeset_lock.h>
 
+#include "i915/i915_cp_fw_hdcp_interface.h"
 #include "intel_cdclk.h"
 #include "intel_display.h"
 #include "intel_display_power.h"
@@ -368,7 +369,7 @@ struct intel_display {
 	} gmbus;
 
 	struct {
-		struct i915_hdcp_comp_master *master;
+		struct i915_hdcp_fw_master *master;
 		bool comp_added;
 
 		/* Mutex to protect the above hdcp component related values. */
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
index 6406fd487ee5..e856b10948ab 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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_master *)data;
+	dev_priv->display.hdcp.master->fw_dev = mei_kdev;
 	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
 
 	return 0;
@@ -2168,25 +2168,25 @@ static const struct component_ops i915_hdcp_component_ops = {
 	.unbind = i915_hdcp_component_unbind,
 };
 
-static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
+static enum cp_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
 {
 	switch (port) {
 	case PORT_A:
-		return MEI_DDI_A;
+		return FW_DDI_A;
 	case PORT_B ... PORT_F:
-		return (enum mei_fw_ddi)port;
+		return (enum cp_fw_ddi)port;
 	default:
-		return MEI_DDI_INVALID_PORT;
+		return FW_DDI_INVALID_PORT;
 	}
 }
 
-static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
+static enum cp_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
 {
 	switch (cpu_transcoder) {
 	case TRANSCODER_A ... TRANSCODER_D:
-		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
+		return (enum cp_fw_tc)(cpu_transcoder | 0x10);
 	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
-		return MEI_INVALID_TRANSCODER;
+		return FW_INVALID_TRANSCODER;
 	}
 }
 
@@ -2206,14 +2206,14 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
 		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
 		 * with zero(INVALID PORT index).
 		 */
-		data->fw_ddi = MEI_DDI_INVALID_PORT;
+		data->fw_ddi = FW_DDI_INVALID_PORT;
 
 	/*
 	 * As associated transcoder is set and modified at modeset, here fw_tc
 	 * is initialized to zero (invalid transcoder index). This will be
 	 * retained for <Gen12 forever.
 	 */
-	data->fw_tc = MEI_INVALID_TRANSCODER;
+	data->fw_tc = FW_INVALID_TRANSCODER;
 
 	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
 	data->protocol = (u8)shim->protocol;
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index 7e3cd3fd7f7b..7ca8b739cd31 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -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_fw_ops mei_hdcp_ops = {
 	.owner = THIS_MODULE,
 	.initiate_hdcp2_session = mei_hdcp_initiate_session,
 	.verify_receiver_cert_prepare_km =
@@ -735,13 +735,13 @@ 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 =
+	struct i915_hdcp_fw_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->fw_dev = dev;
 	ret = component_bind_all(dev, comp_master);
 	if (ret < 0)
 		return ret;
@@ -752,7 +752,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 =
+	struct i915_hdcp_fw_master *comp_master =
 						mei_cldev_get_drvdata(cldev);
 
 	dev_dbg(dev, "%s\n", __func__);
@@ -801,7 +801,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_fw_master *comp_master;
 	struct component_match *master_match;
 	int ret;
 
@@ -846,7 +846,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 =
+	struct i915_hdcp_fw_master *comp_master =
 						mei_cldev_get_drvdata(cldev);
 	int ret;
 
diff --git a/include/drm/i915_cp_fw_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
index e5dc6b985b2f..3abfe6d414b8 100644
--- a/include/drm/i915_cp_fw_hdcp_interface.h
+++ b/include/drm/i915_cp_fw_hdcp_interface.h
@@ -41,38 +41,38 @@ enum hdcp_wired_protocol {
 	HDCP_PROTOCOL_DP
 };
 
-enum mei_fw_ddi {
-	MEI_DDI_INVALID_PORT = 0x0,
+enum cp_fw_ddi {
+	FW_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,
+	FW_DDI_B = 1,
+	FW_DDI_C,
+	FW_DDI_D,
+	FW_DDI_E,
+	FW_DDI_F,
+	FW_DDI_A = 7,
+	FW_DDI_RANGE_END = FW_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
+ * @FW_INVALID_TRANSCODER: Index for Invalid transcoder
+ * @FW_TRANSCODER_EDP: Index for EDP Transcoder
+ * @FW_TRANSCODER_DSI0: Index for DSI0 Transcoder
+ * @FW_TRANSCODER_DSI1: Index for DSI1 Transcoder
+ * @FW_TRANSCODER_A: Index for Transcoder A
+ * @FW_TRANSCODER_B: Index for Transcoder B
+ * @FW_TRANSCODER_C: Index for Transcoder C
+ * @FW_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 cp_fw_tc {
+	FW_INVALID_TRANSCODER = 0x00,
+	FW_TRANSCODER_EDP,
+	FW_TRANSCODER_DSI0,
+	FW_TRANSCODER_DSI1,
+	FW_TRANSCODER_A = 0x10,
+	FW_TRANSCODER_B,
+	FW_TRANSCODER_C,
+	FW_TRANSCODER_D
 };
 
 /**
@@ -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 cp_fw_ddi fw_ddi;
+	enum cp_fw_tc fw_tc;
 	u8 port_type;
 	u8 protocol;
 	u16 k;
@@ -119,7 +119,7 @@ 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_fw_ops {
 	/**
 	 * @owner: mei_hdcp module
 	 */
@@ -168,14 +168,14 @@ 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.
+ * struct i915_hdcp_fw_master - Used for communication between i915
+ * and cp fw hdcp intf driver like mei_hdcp for the HDCP2.2 services
+ * @fw_dev: device that provide the HDCP2.2 service from CP FW interface.
  * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
  */
-struct i915_hdcp_comp_master {
-	struct device *mei_dev;
-	const struct i915_hdcp_component_ops *ops;
+struct i915_hdcp_fw_master {
+	struct device *fw_dev;
+	const struct i915_hdcp_fw_ops *ops;
 
 	/* To protect the above members. */
 	struct mutex mutex;
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 4/7] drm/i915/hdcp: Refactor HDCP API structures
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (2 preceding siblings ...)
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place Suraj Kandpal
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 UTC (permalink / raw)
  To: intel-gfx; +Cc: Rodrigo Vivi, Tomas Winkler

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

It requires to move intel specific HDCP API structures to
i915_cp_fw_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>
---
 .../gpu/drm/i915/display/intel_display_core.h |   2 +-
 drivers/misc/mei/hdcp/mei_hdcp.c              |  44 +--
 drivers/misc/mei/hdcp/mei_hdcp.h              | 355 +-----------------
 include/drm/i915_cp_fw_hdcp_interface.h       | 354 +++++++++++++++++
 4 files changed, 378 insertions(+), 377 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index a769cc8e2745..0f6d14e55fbb 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -15,8 +15,8 @@
 
 #include <drm/drm_connector.h>
 #include <drm/drm_modeset_lock.h>
+#include <drm/i915_cp_fw_hdcp_interface.h>
 
-#include "i915/i915_cp_fw_hdcp_interface.h"
 #include "intel_cdclk.h"
 #include "intel_display.h"
 #include "intel_display_power.h"
diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index 7ca8b739cd31..51e3edac565d 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..968f7e4f7102 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.h
+++ b/drivers/misc/mei/hdcp/mei_hdcp.h
@@ -10,359 +10,6 @@
 #define __MEI_HDCP_H__
 
 #include <drm/display/drm_hdcp.h>
+#include <drm/i915_cp_fw_hdcp_interface.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_cp_fw_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
index 3abfe6d414b8..fa06a6cb0bca 100644
--- a/include/drm/i915_cp_fw_hdcp_interface.h
+++ b/include/drm/i915_cp_fw_hdcp_interface.h
@@ -181,4 +181,358 @@ struct i915_hdcp_fw_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_CP_FW_HDCP_INTERFACE_H_ */
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (3 preceding siblings ...)
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 4/7] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13 10:43   ` Jani Nikula
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 6/7] drm/i915/mtl: Adding function to send command to GSC CS Suraj Kandpal
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 UTC (permalink / raw)
  To: intel-gfx

Need to fill wired cmd in structures at a single place as they remain same
for both gsc and mei

Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
---
 drivers/misc/mei/hdcp/mei_hdcp.c        | 154 ++----------------
 include/drm/i915_cp_fw_hdcp_interface.h | 198 ++++++++++++++++++++++++
 2 files changed, 212 insertions(+), 140 deletions(-)

diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
index 51e3edac565d..a4c255be74df 100644
--- a/drivers/misc/mei/hdcp/mei_hdcp.c
+++ b/drivers/misc/mei/hdcp/mei_hdcp.c
@@ -50,17 +50,7 @@ mei_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
 
 	cldev = to_mei_cl_device(dev);
 
-	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->fw_ddi;
-	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
-	session_init_in.protocol = data->protocol;
-
+	i915_cp_fw_fill_session_in(&session_init_in, data);
 	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
 			      sizeof(session_init_in));
 	if (byte < 0) {
@@ -119,21 +109,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
 		return -EINVAL;
 
 	cldev = to_mei_cl_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 = 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->fw_ddi;
-	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
-
-	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);
-
+	i915_cp_fw_fill_rxcert_in(&verify_rxcert_in, rx_cert, data);
 	byte = mei_cldev_send(cldev, (u8 *)&verify_rxcert_in,
 			      sizeof(verify_rxcert_in));
 	if (byte < 0) {
@@ -192,18 +168,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
 
 	cldev = to_mei_cl_device(dev);
 
-	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->fw_ddi;
-	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
-
-	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
-	       HDCP_2_2_H_PRIME_LEN);
-
+	i915_cp_fw_fill_hprime_in(&send_hprime_in, rx_hprime, data);
 	byte = mei_cldev_send(cldev, (u8 *)&send_hprime_in,
 			      sizeof(send_hprime_in));
 	if (byte < 0) {
@@ -248,20 +213,8 @@ mei_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
 		return -EINVAL;
 
 	cldev = to_mei_cl_device(dev);
-
-	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->fw_ddi;
-	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
-
-	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
-	       HDCP_2_2_E_KH_KM_LEN);
-
+	i915_cp_fw_fill_pairing_info_in(&pairing_info_in, pairing_info,
+					data);
 	byte = mei_cldev_send(cldev, (u8 *)&pairing_info_in,
 			      sizeof(pairing_info_in));
 	if (byte < 0) {
@@ -308,16 +261,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
 		return -EINVAL;
 
 	cldev = to_mei_cl_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 = 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->fw_ddi;
-	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
-
+	i915_cp_fw_fill_locality_check_in(&lc_init_in, data);
 	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
 	if (byte < 0) {
 		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte);
@@ -364,19 +308,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
 
 	cldev = to_mei_cl_device(dev);
 
-	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->fw_ddi;
-	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
-
-	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
-	       HDCP_2_2_L_PRIME_LEN);
-
+	i915_cp_fw_fill_validate_locality_in(&verify_lprime_in, rx_lprime,
+					     data);
 	byte = mei_cldev_send(cldev, (u8 *)&verify_lprime_in,
 			      sizeof(verify_lprime_in));
 	if (byte < 0) {
@@ -423,15 +356,7 @@ static int mei_hdcp_get_session_key(struct device *dev,
 
 	cldev = to_mei_cl_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 = 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->fw_ddi;
-	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
-
+	i915_cp_fw_fill_session_key_in(&get_skey_in, data);
 	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in));
 	if (byte < 0) {
 		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte);
@@ -487,25 +412,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
 
 	cldev = to_mei_cl_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 = 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->fw_ddi;
-	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
-
-	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);
-
+	i915_cp_fw_fill_repeater_in(&verify_repeater_in, rep_topology, data);
 	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,
 			      sizeof(verify_repeater_in));
 	if (byte < 0) {
@@ -566,23 +473,8 @@ static int mei_hdcp_verify_mprime(struct device *dev,
 	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->fw_ddi;
-	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
-
-	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);
-
+	i915_cp_fw_fill_auth_stream_req_in(verify_mprime_in, stream_ready,
+					   cmd_size, data);
 	byte = mei_cldev_send(cldev, (u8 *)verify_mprime_in, cmd_size);
 	kfree(verify_mprime_in);
 	if (byte < 0) {
@@ -628,16 +520,7 @@ static int mei_hdcp_enable_authentication(struct device *dev,
 
 	cldev = to_mei_cl_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 = 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->fw_ddi;
-	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
-	enable_auth_in.stream_type = data->streams[0].stream_type;
-
+	i915_cp_fw_fill_enable_auth_in(&enable_auth_in, data);
 	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in,
 			      sizeof(enable_auth_in));
 	if (byte < 0) {
@@ -682,16 +565,7 @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
 
 	cldev = to_mei_cl_device(dev);
 
-	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->fw_ddi;
-	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
-
+	i915_cp_fw_fill_close_session_in(&session_close_in, data);
 	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
 			      sizeof(session_close_in));
 	if (byte < 0) {
diff --git a/include/drm/i915_cp_fw_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
index fa06a6cb0bca..e1edad1d26e5 100644
--- a/include/drm/i915_cp_fw_hdcp_interface.h
+++ b/include/drm/i915_cp_fw_hdcp_interface.h
@@ -535,4 +535,202 @@ struct wired_cmd_repeater_auth_stream_req_out {
 	struct hdcp_cmd_header	header;
 	struct hdcp_port_id	port;
 } __packed;
+
+static inline void
+i915_cp_fw_fill_session_in(struct wired_cmd_initiate_hdcp2_session_in *session_init_in,
+			   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 = 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->fw_ddi;
+	session_init_in->port.attached_transcoder = (u8)data->fw_tc;
+	session_init_in->protocol = data->protocol;
+}
+
+static inline void
+i915_cp_fw_fill_rxcert_in(struct wired_cmd_verify_receiver_cert_in *verify_rxcert_in,
+			  struct hdcp2_ake_send_cert *rx_cert,
+			  struct hdcp_port_data *data)
+{
+	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->fw_ddi;
+	verify_rxcert_in->port.attached_transcoder = (u8)data->fw_tc;
+
+	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);
+}
+
+static inline void
+i915_cp_fw_fill_hprime_in(struct wired_cmd_ake_send_hprime_in *send_hprime_in,
+			  struct hdcp2_ake_send_hprime *rx_hprime,
+			  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 = 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->fw_ddi;
+	send_hprime_in->port.attached_transcoder = (u8)data->fw_tc;
+
+	memcpy(send_hprime_in->h_prime, rx_hprime->h_prime,
+	       HDCP_2_2_H_PRIME_LEN);
+}
+
+static inline void
+i915_cp_fw_fill_pairing_info_in(struct wired_cmd_ake_send_pairing_info_in *pairing_info_in,
+				struct hdcp2_ake_send_pairing_info *pairing_info,
+				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 = 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->fw_ddi;
+	pairing_info_in->port.attached_transcoder = (u8)data->fw_tc;
+
+	memcpy(pairing_info_in->e_kh_km, pairing_info->e_kh_km,
+	       HDCP_2_2_E_KH_KM_LEN);
+}
+
+static inline void
+i915_cp_fw_fill_locality_check_in(struct wired_cmd_init_locality_check_in *lc_init_in,
+				  struct hdcp_port_data *data)
+{
+	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->fw_ddi;
+	lc_init_in->port.attached_transcoder = (u8)data->fw_tc;
+}
+
+static inline void
+i915_cp_fw_fill_validate_locality_in(struct wired_cmd_validate_locality_in *verify_lprime_in,
+				     struct hdcp2_lc_send_lprime *rx_lprime,
+				     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 = 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->fw_ddi;
+	verify_lprime_in->port.attached_transcoder = (u8)data->fw_tc;
+
+	memcpy(verify_lprime_in->l_prime, rx_lprime->l_prime,
+	       HDCP_2_2_L_PRIME_LEN);
+}
+
+static inline void
+i915_cp_fw_fill_session_key_in(struct wired_cmd_get_session_key_in *get_skey_in,
+			       struct hdcp_port_data *data)
+{
+	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->fw_ddi;
+	get_skey_in->port.attached_transcoder = (u8)data->fw_tc;
+}
+
+static inline void
+i915_cp_fw_fill_repeater_in(struct wired_cmd_verify_repeater_in *verify_repeater_in,
+			    struct hdcp2_rep_send_receiverid_list *rep_topology,
+			    struct hdcp_port_data *data)
+{
+	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->fw_ddi;
+	verify_repeater_in->port.attached_transcoder = (u8)data->fw_tc;
+
+	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);
+}
+
+static inline void
+i915_cp_fw_fill_auth_stream_req_in(struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in,
+				   struct hdcp2_rep_stream_ready *stream_ready, ssize_t cmd_size,
+				   struct hdcp_port_data *data)
+{
+	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->fw_ddi;
+	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
+
+	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);
+}
+
+static inline void
+i915_cp_fw_fill_enable_auth_in(struct wired_cmd_enable_auth_in *enable_auth_in,
+			       struct hdcp_port_data *data)
+{
+	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->fw_ddi;
+	enable_auth_in->port.attached_transcoder = (u8)data->fw_tc;
+	enable_auth_in->stream_type = data->streams[0].stream_type;
+}
+
+static inline void
+i915_cp_fw_fill_close_session_in(struct wired_cmd_close_session_in *session_close_in,
+				 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 = 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->fw_ddi;
+	session_close_in->port.attached_transcoder = (u8)data->fw_tc;
+}
 #endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 6/7] drm/i915/mtl: Adding function to send command to GSC CS
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (4 preceding siblings ...)
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13 10:47   ` Jani Nikula
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 7/7] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
                   ` (5 subsequent siblings)
  11 siblings, 1 reply; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 UTC (permalink / raw)
  To: intel-gfx

Adding 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.

Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@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>
---
 drivers/gpu/drm/i915/Makefile                 |   1 +
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 207 ++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  28 +++
 drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h   |   1 +
 4 files changed, 237 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 dfa211451a1d..42b8c3430365 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -250,6 +250,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_hdcp_gsc.c b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
new file mode 100644
index 000000000000..aea3a1158c75
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
@@ -0,0 +1,207 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2021, Intel Corporation.
+ */
+
+#include "i915_drv.h"
+#include "gt/uc/intel_gsc_fw.h"
+#include "gt/uc/intel_gsc_fwif.h"
+#include "gem/i915_gem_region.h"
+#include "i915_utils.h"
+#include "display/intel_hdcp_gsc.h"
+
+struct intel_hdcp_gsc_message {
+	struct drm_i915_gem_object *obj;
+	struct i915_vma *vma;
+	void *hdcp_cmd;
+};
+
+/*This function helps allocate memory for the command that we will send to gsc cs */
+static int intel_initialize_hdcp_gsc_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;
+
+	hdcp_message->obj = NULL;
+	hdcp_message->hdcp_cmd = NULL;
+	hdcp_message->vma = NULL;
+
+	/* allocate object of one page for HDCP command memory and store it */
+	obj = i915_gem_object_create_shmem(gt->i915, PAGE_SIZE);
+
+	if (IS_ERR(obj)) {
+		drm_err(&gt->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(gt->i915, obj, true));
+	if (IS_ERR(cmd)) {
+		drm_err(&gt->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->obj = obj;
+	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;
+}
+
+static void intel_free_hdcp_gsc_message(struct intel_hdcp_gsc_message *hdcp_message)
+{
+	struct drm_i915_gem_object *obj = fetch_and_zero(&hdcp_message->obj);
+
+	if (!obj)
+		return;
+
+	if (hdcp_message->vma)
+		i915_vma_unpin(fetch_and_zero(&hdcp_message->vma));
+
+	i915_gem_object_unpin_map(obj);
+	i915_gem_object_put(obj);
+	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_fw_heci_send(&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 & INTEL_GSC_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;
+	u32 reply_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 = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
+
+	if (!hdcp_message)
+		return -ENOMEM;
+
+	ret = intel_initialize_hdcp_gsc_message(i915, hdcp_message);
+
+	if (ret) {
+		drm_err(&i915->drm,
+			"Could not initialize hdcp_message\n");
+		goto err;
+	}
+
+	header = hdcp_message->hdcp_cmd;
+	addr = i915_ggtt_offset(hdcp_message->vma);
+
+	memset(header, 0, sizeof(*header));
+	header->validity_marker = GSC_HECI_VALIDITY_MARKER;
+	header->gsc_address = HECI_MEADDRESS_HDCP;
+	header->host_session_handle = 0;
+	header->header_version = MTL_GSC_HEADER_VERSION;
+	header->message_size = msg_in_len + sizeof(*header);
+
+	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:
+	intel_free_hdcp_gsc_message(hdcp_message);
+	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..9f3e3880fe0a
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2021 Intel Corporation
+ */
+
+#ifndef __INTEL_HDCP_GSC_H__
+#define __INTEL_HDCP_GSC_H__
+
+#include <linux/types.h>
+#include <linux/err.h>
+/*
+ * FIXME: Spec states that we need to create a random
+ * host session everytime we send message for now creating
+ * a static host session to avoid clashes not using this
+ * header as of now as we see an error if we use anything
+ * other than 0 as host session
+ */
+#define GSC_HDCP_HOST_HANDLE	0x12233FFEEDD00000
+
+struct drm_i915_private;
+
+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_gsc_hdcp_init(struct drm_i915_private *i915);
+int intel_gsc_hdcp_fini(struct drm_i915_private *i915);
+
+#endif /* __INTEL_HDCP_GCS_H__ */
diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
index 1c2a04d092a8..19b98c75367a 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
@@ -34,6 +34,7 @@ struct intel_gsc_mtl_header {
 	 * Bits 16-31: Extension Size
 	 */
 	u32 flags;
+#define INTEL_GSC_MSG_PENDING	1
 
 	u32 status;
 } __packed;
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 7/7] drm/i915/mtl: Add HDCP GSC interface
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (5 preceding siblings ...)
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 6/7] drm/i915/mtl: Adding function to send command to GSC CS Suraj Kandpal
@ 2022-12-13  7:01 ` Suraj Kandpal
  2022-12-13 10:54   ` Jani Nikula
  2022-12-13  7:29 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable HDCP2.x via GSC CS (rev2) Patchwork
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 24+ messages in thread
From: Suraj Kandpal @ 2022-12-13  7:01 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

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>
---
 drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
 drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 503 +++++++++++++++++-
 2 files changed, 524 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
index e856b10948ab..efdaa938df48 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -25,6 +25,8 @@
 #include "intel_hdcp.h"
 #include "intel_hdcp_regs.h"
 #include "intel_pcode.h"
+#include "intel_connector.h"
+#include "display/intel_hdcp_gsc.h"
 
 #define KEY_LOAD_TRIES	5
 #define HDCP2_LC_RETRY_CNT			3
@@ -203,13 +205,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 (DISPLAY_VER(dev_priv) >= 14)
+		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,7 +2244,7 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
 
 static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
 {
-	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
+	if (DISPLAY_VER(dev_priv) < 14 && !IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
 		return false;
 
 	return (DISPLAY_VER(dev_priv) >= 10 ||
@@ -2256,10 +2265,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_component_ops,
-				  I915_COMPONENT_HDCP);
+
+	if (DISPLAY_VER(dev_priv) >= 14)
+		ret = intel_gsc_hdcp_init(dev_priv);
+	else
+		ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_component_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;
@@ -2485,7 +2498,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_component_ops);
+	if (DISPLAY_VER(dev_priv) >= 14)
+		intel_gsc_hdcp_fini(dev_priv);
+	else
+		component_del(dev_priv->drm.dev, &i915_hdcp_component_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 aea3a1158c75..380ebbabb9ff 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
@@ -3,6 +3,7 @@
  * Copyright 2021, Intel Corporation.
  */
 
+#include <drm/i915_cp_fw_hdcp_interface.h>
 #include "i915_drv.h"
 #include "gt/uc/intel_gsc_fw.h"
 #include "gt/uc/intel_gsc_fwif.h"
@@ -16,6 +17,505 @@ struct intel_hdcp_gsc_message {
 	void *hdcp_cmd;
 };
 
+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;
+	}
+
+	i915_cp_fw_fill_session_in(&session_init_in, data);
+	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;
+	}
+
+	i915_cp_fw_fill_rxcert_in(&verify_rxcert_in, rx_cert, data);
+	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;
+	}
+
+	i915_cp_fw_fill_hprime_in(&send_hprime_in, rx_hprime, data);
+	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;
+	}
+
+	i915_cp_fw_fill_pairing_info_in(&pairing_info_in, pairing_info,
+					data);
+	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;
+	}
+
+	i915_cp_fw_fill_locality_check_in(&lc_init_in, data);
+	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;
+	}
+
+	i915_cp_fw_fill_validate_locality_in(&verify_lprime_in, rx_lprime,
+					     data);
+	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;
+	}
+
+	i915_cp_fw_fill_session_key_in(&get_skey_in, data);
+	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;
+	}
+
+	i915_cp_fw_fill_repeater_in(&verify_repeater_in, rep_topology, data);
+	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;
+
+	i915_cp_fw_fill_auth_stream_req_in(verify_mprime_in, stream_ready,
+					   cmd_size, data);
+	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;
+	}
+
+	i915_cp_fw_fill_enable_auth_in(&enable_auth_in, data);
+	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;
+	}
+
+	i915_cp_fw_fill_close_session_in(&session_close_in, data);
+	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_fw_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,
+};
+
+int intel_gsc_hdcp_init(struct drm_i915_private *i915)
+{
+	struct i915_hdcp_fw_master *data;
+
+	data = kzalloc(sizeof(struct i915_hdcp_fw_master), GFP_KERNEL);
+	if (!data)
+		return -ENOMEM;
+
+	mutex_lock(&i915->display.hdcp.comp_mutex);
+	i915->display.hdcp.master = data;
+	i915->display.hdcp.master->fw_dev = i915->drm.dev;
+	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
+	mutex_unlock(&i915->display.hdcp.comp_mutex);
+
+	return 0;
+}
+
+int intel_gsc_hdcp_fini(struct drm_i915_private *i915)
+{
+	/* TODO: decrease GSC f/w reference count. */
+	kfree(i915->display.hdcp.master);
+	return 0;
+}
+
 /*This function helps allocate memory for the command that we will send to gsc cs */
 static int intel_initialize_hdcp_gsc_message(struct drm_i915_private *i915,
 					     struct intel_hdcp_gsc_message *hdcp_message)
@@ -127,7 +627,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;
-- 
2.25.1


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

* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable HDCP2.x via GSC CS (rev2)
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (6 preceding siblings ...)
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 7/7] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
@ 2022-12-13  7:29 ` Patchwork
  2022-12-13  7:29 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 24+ messages in thread
From: Patchwork @ 2022-12-13  7:29 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-gfx

== Series Details ==

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

== Summary ==

Error: dim checkpatch failed
d39a03598736 drm/i915/gsc: Create GSC request submission mechanism
Traceback (most recent call last):
  File "scripts/spdxcheck.py", line 11, in <module>
    import git
ModuleNotFoundError: No module named 'git'
-:140: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#140: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 147 lines checked
6482b09862f4 drm/i915/hdcp: Keep cp fw agonstic naming convention
-:45: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#45: 
rename from include/drm/i915_mei_hdcp_interface.h

total: 0 errors, 1 warnings, 0 checks, 31 lines checked
7256f15a75cb drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
43b094c874c5 drm/i915/hdcp: Refactor HDCP API structures
217fef3c6b6a drm/i915/hdcp: Fill wired_cmd_in structures at a single place
fefe94c18264 drm/i915/mtl: Adding function to send command to GSC CS
Traceback (most recent call last):
  File "scripts/spdxcheck.py", line 11, in <module>
    import git
ModuleNotFoundError: No module named 'git'
Traceback (most recent call last):
  File "scripts/spdxcheck.py", line 11, in <module>
    import git
ModuleNotFoundError: No module named 'git'
-:35: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#35: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 249 lines checked
47a6013f0896 drm/i915/mtl: Add HDCP GSC interface
-:592: CHECK:ALLOC_SIZEOF_STRUCT: Prefer kzalloc(sizeof(*data)...) over kzalloc(sizeof(struct i915_hdcp_fw_master)...)
#592: FILE: drivers/gpu/drm/i915/display/intel_hdcp_gsc.c:499:
+	data = kzalloc(sizeof(struct i915_hdcp_fw_master), GFP_KERNEL);

total: 0 errors, 0 warnings, 1 checks, 586 lines checked



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

* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for Enable HDCP2.x via GSC CS (rev2)
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (7 preceding siblings ...)
  2022-12-13  7:29 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable HDCP2.x via GSC CS (rev2) Patchwork
@ 2022-12-13  7:29 ` Patchwork
  2022-12-13  7:40 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 24+ messages in thread
From: Patchwork @ 2022-12-13  7:29 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-gfx

== Series Details ==

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

== Summary ==

Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.



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

* [Intel-gfx] ✗ Fi.CI.BAT: failure for Enable HDCP2.x via GSC CS (rev2)
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (8 preceding siblings ...)
  2022-12-13  7:29 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
@ 2022-12-13  7:40 ` Patchwork
  2022-12-13  9:28 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
  2022-12-14  6:23 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
  11 siblings, 0 replies; 24+ messages in thread
From: Patchwork @ 2022-12-13  7:40 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-gfx

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from CI_DRM_12498 -> Patchwork_111876v2
====================================================

Summary
-------

  **FAILURE**

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

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

Participating hosts (39 -> 19)
------------------------------

  ERROR: It appears as if the changes made in Patchwork_111876v2 prevented too many machines from booting.

  Missing    (20): fi-kbl-soraka bat-dg1-6 bat-dg1-5 bat-adlp-6 fi-skl-6600u fi-bsw-n3050 bat-dg2-8 bat-adlm-1 bat-dg2-9 fi-bwr-2160 bat-adln-1 bat-atsm-1 bat-jsl-3 bat-rplp-1 bat-dg2-11 fi-bsw-nick bat-dg1-7 bat-kbl-2 bat-adlp-9 bat-adlp-4 

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_suspend@basic-s3@smem:
    - fi-rkl-11600:       NOTRUN -> [INCOMPLETE][1] ([i915#6179])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-rkl-11600/igt@gem_exec_suspend@basic-s3@smem.html

  * igt@kms_chamelium@common-hpd-after-suspend:
    - fi-hsw-4770:        NOTRUN -> [SKIP][2] ([fdo#109271] / [fdo#111827])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-hsw-4770/igt@kms_chamelium@common-hpd-after-suspend.html

  
#### Possible fixes ####

  * igt@gem_exec_gttfill@basic:
    - fi-pnv-d510:        [FAIL][3] ([i915#7229]) -> [PASS][4]
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/fi-pnv-d510/igt@gem_exec_gttfill@basic.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-pnv-d510/igt@gem_exec_gttfill@basic.html

  * igt@i915_selftest@live@hangcheck:
    - fi-hsw-4770:        [INCOMPLETE][5] ([i915#4785]) -> [PASS][6]
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html

  
#### Warnings ####

  * igt@i915_suspend@basic-s3-without-i915:
    - fi-rkl-11600:       [INCOMPLETE][7] ([i915#4817]) -> [FAIL][8] ([fdo#103375])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html

  
  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#4785]: https://gitlab.freedesktop.org/drm/intel/issues/4785
  [i915#4817]: https://gitlab.freedesktop.org/drm/intel/issues/4817
  [i915#6179]: https://gitlab.freedesktop.org/drm/intel/issues/6179
  [i915#7229]: https://gitlab.freedesktop.org/drm/intel/issues/7229


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

  * Linux: CI_DRM_12498 -> Patchwork_111876v2

  CI-20190529: 20190529
  CI_DRM_12498: 76c062e92f2d28ab3d6a1b122cae8931e55b4fd9 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7091: b8015f920c9f469d3733854263cb878373c1df51 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_111876v2: 76c062e92f2d28ab3d6a1b122cae8931e55b4fd9 @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

5af5aee5e720 drm/i915/mtl: Add HDCP GSC interface
9984069eb8cd drm/i915/mtl: Adding function to send command to GSC CS
ab28a96f815b drm/i915/hdcp: Fill wired_cmd_in structures at a single place
06dbf3976bd8 drm/i915/hdcp: Refactor HDCP API structures
93132565111b drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
9344448e085f drm/i915/hdcp: Keep cp fw agonstic naming convention
6a20065a698a drm/i915/gsc: Create GSC request submission mechanism

== Logs ==

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

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

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

* [Intel-gfx] ✓ Fi.CI.BAT: success for Enable HDCP2.x via GSC CS (rev2)
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (9 preceding siblings ...)
  2022-12-13  7:40 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
@ 2022-12-13  9:28 ` Patchwork
  2022-12-14  6:23 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
  11 siblings, 0 replies; 24+ messages in thread
From: Patchwork @ 2022-12-13  9:28 UTC (permalink / raw)
  To: Suraj Kandpal; +Cc: intel-gfx

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from CI_DRM_12498 -> Patchwork_111876v2
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

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

Participating hosts (39 -> 39)
------------------------------

  No changes in participating hosts

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

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

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_suspend@basic-s3@smem:
    - fi-rkl-11600:       NOTRUN -> [INCOMPLETE][1] ([i915#6179])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-rkl-11600/igt@gem_exec_suspend@basic-s3@smem.html

  * igt@kms_chamelium@common-hpd-after-suspend:
    - fi-hsw-4770:        NOTRUN -> [SKIP][2] ([fdo#109271] / [fdo#111827])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-hsw-4770/igt@kms_chamelium@common-hpd-after-suspend.html

  
#### Possible fixes ####

  * igt@gem_exec_gttfill@basic:
    - fi-pnv-d510:        [FAIL][3] ([i915#7229]) -> [PASS][4]
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/fi-pnv-d510/igt@gem_exec_gttfill@basic.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-pnv-d510/igt@gem_exec_gttfill@basic.html

  * igt@i915_selftest@live@hangcheck:
    - fi-hsw-4770:        [INCOMPLETE][5] ([i915#4785]) -> [PASS][6]
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-hsw-4770/igt@i915_selftest@live@hangcheck.html

  * igt@i915_selftest@live@slpc:
    - {bat-adlp-9}:       [DMESG-FAIL][7] ([i915#6367]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/bat-adlp-9/igt@i915_selftest@live@slpc.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/bat-adlp-9/igt@i915_selftest@live@slpc.html

  
#### Warnings ####

  * igt@i915_suspend@basic-s3-without-i915:
    - fi-rkl-11600:       [INCOMPLETE][9] ([i915#4817]) -> [FAIL][10] ([fdo#103375])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.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#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#4785]: https://gitlab.freedesktop.org/drm/intel/issues/4785
  [i915#4817]: https://gitlab.freedesktop.org/drm/intel/issues/4817
  [i915#6179]: https://gitlab.freedesktop.org/drm/intel/issues/6179
  [i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367
  [i915#7229]: https://gitlab.freedesktop.org/drm/intel/issues/7229


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

  * Linux: CI_DRM_12498 -> Patchwork_111876v2

  CI-20190529: 20190529
  CI_DRM_12498: 76c062e92f2d28ab3d6a1b122cae8931e55b4fd9 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7091: b8015f920c9f469d3733854263cb878373c1df51 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_111876v2: 76c062e92f2d28ab3d6a1b122cae8931e55b4fd9 @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

5af5aee5e720 drm/i915/mtl: Add HDCP GSC interface
9984069eb8cd drm/i915/mtl: Adding function to send command to GSC CS
ab28a96f815b drm/i915/hdcp: Fill wired_cmd_in structures at a single place
06dbf3976bd8 drm/i915/hdcp: Refactor HDCP API structures
93132565111b drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
9344448e085f drm/i915/hdcp: Keep cp fw agonstic naming convention
6a20065a698a drm/i915/gsc: Create GSC request submission mechanism

== Logs ==

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

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

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

* Re: [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w Suraj Kandpal
@ 2022-12-13 10:24   ` Jani Nikula
  2022-12-13 10:32     ` Kandpal, Suraj
  2022-12-13 10:40   ` Jani Nikula
  1 sibling, 1 reply; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 10:24 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx; +Cc: Tomas Winkler, Rodrigo Vivi

On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> From: Anshuman Gupta <anshuman.gupta@intel.com>
>
> As now we have more then one type of content protection
> secrity firmware. Let change the i915_cp_fw_hdcp_interface.h
> header naming convention to suit generic f/w type.
> %s/MEI_/FW_
> %s/mei_fw/cp_fw
> %s/mei_dev/fw_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_fw_master
> %s/i915_hdcp_component_ops/i915_hdcp_fw_ops
>
> 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>
> ---
>  .../gpu/drm/i915/display/intel_display_core.h |  3 +-
>  drivers/gpu/drm/i915/display/intel_hdcp.c     | 66 ++++++++---------
>  drivers/misc/mei/hdcp/mei_hdcp.c              | 12 ++--
>  include/drm/i915_cp_fw_hdcp_interface.h       | 70 +++++++++----------
>  4 files changed, 76 insertions(+), 75 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 57ddce3ba02b..a769cc8e2745 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -16,6 +16,7 @@
>  #include <drm/drm_connector.h>
>  #include <drm/drm_modeset_lock.h>
>  
> +#include "i915/i915_cp_fw_hdcp_interface.h"

What's with the i915/ subdir?

Anyway, please prefer forward declarations over includes in headers.

>  #include "intel_cdclk.h"
>  #include "intel_display.h"
>  #include "intel_display_power.h"
> @@ -368,7 +369,7 @@ struct intel_display {
>  	} gmbus;
>  
>  	struct {
> -		struct i915_hdcp_comp_master *master;
> +		struct i915_hdcp_fw_master *master;
>  		bool comp_added;
>  
>  		/* Mutex to protect the above hdcp component related values. */
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 6406fd487ee5..e856b10948ab 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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_master *)data;
> +	dev_priv->display.hdcp.master->fw_dev = mei_kdev;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
>  
>  	return 0;
> @@ -2168,25 +2168,25 @@ static const struct component_ops i915_hdcp_component_ops = {
>  	.unbind = i915_hdcp_component_unbind,
>  };
>  
> -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> +static enum cp_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
>  {
>  	switch (port) {
>  	case PORT_A:
> -		return MEI_DDI_A;
> +		return FW_DDI_A;
>  	case PORT_B ... PORT_F:
> -		return (enum mei_fw_ddi)port;
> +		return (enum cp_fw_ddi)port;
>  	default:
> -		return MEI_DDI_INVALID_PORT;
> +		return FW_DDI_INVALID_PORT;
>  	}
>  }
>  
> -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
> +static enum cp_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
>  {
>  	switch (cpu_transcoder) {
>  	case TRANSCODER_A ... TRANSCODER_D:
> -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> +		return (enum cp_fw_tc)(cpu_transcoder | 0x10);
>  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> -		return MEI_INVALID_TRANSCODER;
> +		return FW_INVALID_TRANSCODER;
>  	}
>  }
>  
> @@ -2206,14 +2206,14 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
>  		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
>  		 * with zero(INVALID PORT index).
>  		 */
> -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> +		data->fw_ddi = FW_DDI_INVALID_PORT;
>  
>  	/*
>  	 * As associated transcoder is set and modified at modeset, here fw_tc
>  	 * is initialized to zero (invalid transcoder index). This will be
>  	 * retained for <Gen12 forever.
>  	 */
> -	data->fw_tc = MEI_INVALID_TRANSCODER;
> +	data->fw_tc = FW_INVALID_TRANSCODER;
>  
>  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
>  	data->protocol = (u8)shim->protocol;
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> index 7e3cd3fd7f7b..7ca8b739cd31 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> @@ -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_fw_ops mei_hdcp_ops = {
>  	.owner = THIS_MODULE,
>  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
>  	.verify_receiver_cert_prepare_km =
> @@ -735,13 +735,13 @@ 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 =
> +	struct i915_hdcp_fw_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->fw_dev = dev;
>  	ret = component_bind_all(dev, comp_master);
>  	if (ret < 0)
>  		return ret;
> @@ -752,7 +752,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 =
> +	struct i915_hdcp_fw_master *comp_master =
>  						mei_cldev_get_drvdata(cldev);
>  
>  	dev_dbg(dev, "%s\n", __func__);
> @@ -801,7 +801,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_fw_master *comp_master;
>  	struct component_match *master_match;
>  	int ret;
>  
> @@ -846,7 +846,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 =
> +	struct i915_hdcp_fw_master *comp_master =
>  						mei_cldev_get_drvdata(cldev);
>  	int ret;
>  
> diff --git a/include/drm/i915_cp_fw_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
> index e5dc6b985b2f..3abfe6d414b8 100644
> --- a/include/drm/i915_cp_fw_hdcp_interface.h
> +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> @@ -41,38 +41,38 @@ enum hdcp_wired_protocol {
>  	HDCP_PROTOCOL_DP
>  };
>  
> -enum mei_fw_ddi {
> -	MEI_DDI_INVALID_PORT = 0x0,
> +enum cp_fw_ddi {
> +	FW_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,
> +	FW_DDI_B = 1,
> +	FW_DDI_C,
> +	FW_DDI_D,
> +	FW_DDI_E,
> +	FW_DDI_F,
> +	FW_DDI_A = 7,
> +	FW_DDI_RANGE_END = FW_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
> + * @FW_INVALID_TRANSCODER: Index for Invalid transcoder
> + * @FW_TRANSCODER_EDP: Index for EDP Transcoder
> + * @FW_TRANSCODER_DSI0: Index for DSI0 Transcoder
> + * @FW_TRANSCODER_DSI1: Index for DSI1 Transcoder
> + * @FW_TRANSCODER_A: Index for Transcoder A
> + * @FW_TRANSCODER_B: Index for Transcoder B
> + * @FW_TRANSCODER_C: Index for Transcoder C
> + * @FW_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 cp_fw_tc {
> +	FW_INVALID_TRANSCODER = 0x00,
> +	FW_TRANSCODER_EDP,
> +	FW_TRANSCODER_DSI0,
> +	FW_TRANSCODER_DSI1,
> +	FW_TRANSCODER_A = 0x10,
> +	FW_TRANSCODER_B,
> +	FW_TRANSCODER_C,
> +	FW_TRANSCODER_D
>  };
>  
>  /**
> @@ -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 cp_fw_ddi fw_ddi;
> +	enum cp_fw_tc fw_tc;
>  	u8 port_type;
>  	u8 protocol;
>  	u16 k;
> @@ -119,7 +119,7 @@ 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_fw_ops {
>  	/**
>  	 * @owner: mei_hdcp module
>  	 */
> @@ -168,14 +168,14 @@ 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.
> + * struct i915_hdcp_fw_master - Used for communication between i915
> + * and cp fw hdcp intf driver like mei_hdcp for the HDCP2.2 services
> + * @fw_dev: device that provide the HDCP2.2 service from CP FW interface.
>   * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
>   */
> -struct i915_hdcp_comp_master {
> -	struct device *mei_dev;
> -	const struct i915_hdcp_component_ops *ops;
> +struct i915_hdcp_fw_master {
> +	struct device *fw_dev;
> +	const struct i915_hdcp_fw_ops *ops;
>  
>  	/* To protect the above members. */
>  	struct mutex mutex;

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention Suraj Kandpal
@ 2022-12-13 10:32   ` Jani Nikula
  2022-12-13 10:40     ` Kandpal, Suraj
  0 siblings, 1 reply; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 10:32 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx; +Cc: Tomas Winkler, Rodrigo Vivi

On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> From: Anshuman Gupta <anshuman.gupta@intel.com>
>
> Change the include/drm/i915_mei_hdcp_interface.h to
> include/drm/i915_cp_fw_hdcp_interface.h

If you want to make an hdcp interface naming agnostic to the
implementation details, why do we have to have "fw" in the naming, at
all?

Why is "cp" duplicated?

You're calling the file "i915 Content Protection Firmware High-bandwidth
Digital Content Protection Interface".

Why are the names *impossible* to pronounce?

I'd just make this "i915_hdcp_interface".


BR,
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>
> Acked-by: Tomas Winkler <tomas.winkler@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_types.h          | 2 +-
>  drivers/misc/mei/hdcp/mei_hdcp.c                            | 2 +-
>  ...915_mei_hdcp_interface.h => i915_cp_fw_hdcp_interface.h} | 6 +++---
>  3 files changed, 5 insertions(+), 5 deletions(-)
>  rename include/drm/{i915_mei_hdcp_interface.h => i915_cp_fw_hdcp_interface.h} (97%)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 32e8b2fc3cc6..52d93e89b4c6 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_cp_fw_hdcp_interface.h>
>  #include <media/cec-notifier.h>
>  
>  #include "i915_vma.h"
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> index e889a8bd7ac8..7e3cd3fd7f7b 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_cp_fw_hdcp_interface.h>
>  
>  #include "mei_hdcp.h"
>  
> diff --git a/include/drm/i915_mei_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
> similarity index 97%
> rename from include/drm/i915_mei_hdcp_interface.h
> rename to include/drm/i915_cp_fw_hdcp_interface.h
> index f441cbcd95a4..e5dc6b985b2f 100644
> --- a/include/drm/i915_mei_hdcp_interface.h
> +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> @@ -6,8 +6,8 @@
>   * Ramalingam C <ramalingam.c@intel.com>
>   */
>  
> -#ifndef _I915_MEI_HDCP_INTERFACE_H_
> -#define _I915_MEI_HDCP_INTERFACE_H_
> +#ifndef _I915_CP_FW_HDCP_INTERFACE_H_
> +#define _I915_CP_FW_HDCP_INTERFACE_H_
>  
>  #include <linux/mutex.h>
>  #include <linux/device.h>
> @@ -181,4 +181,4 @@ struct i915_hdcp_comp_master {
>  	struct mutex mutex;
>  };
>  
> -#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
> +#endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
  2022-12-13 10:24   ` Jani Nikula
@ 2022-12-13 10:32     ` Kandpal, Suraj
  0 siblings, 0 replies; 24+ messages in thread
From: Kandpal, Suraj @ 2022-12-13 10:32 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo

> 
> On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> > From: Anshuman Gupta <anshuman.gupta@intel.com>
> >
> > As now we have more then one type of content protection secrity
> > firmware. Let change the i915_cp_fw_hdcp_interface.h header naming
> > convention to suit generic f/w type.
> > %s/MEI_/FW_
> > %s/mei_fw/cp_fw
> > %s/mei_dev/fw_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_fw_master
> > %s/i915_hdcp_component_ops/i915_hdcp_fw_ops
> >
> > 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>
> > ---
> >  .../gpu/drm/i915/display/intel_display_core.h |  3 +-
> >  drivers/gpu/drm/i915/display/intel_hdcp.c     | 66 ++++++++---------
> >  drivers/misc/mei/hdcp/mei_hdcp.c              | 12 ++--
> >  include/drm/i915_cp_fw_hdcp_interface.h       | 70 +++++++++----------
> >  4 files changed, 76 insertions(+), 75 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > index 57ddce3ba02b..a769cc8e2745 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > @@ -16,6 +16,7 @@
> >  #include <drm/drm_connector.h>
> >  #include <drm/drm_modeset_lock.h>
> >
> > +#include "i915/i915_cp_fw_hdcp_interface.h"
> 
> What's with the i915/ subdir?
> 
> Anyway, please prefer forward declarations over includes in headers.
> 

Yes that does not belong there will fix that

Regards,
Suraj Kandpal
> >  #include "intel_cdclk.h"
> >  #include "intel_display.h"
> >  #include "intel_display_power.h"
> > @@ -368,7 +369,7 @@ struct intel_display {
> >  	} gmbus;
> >
> >  	struct {
> > -		struct i915_hdcp_comp_master *master;
> > +		struct i915_hdcp_fw_master *master;
> >  		bool comp_added;
> >
> >  		/* Mutex to protect the above hdcp component related values.
> */
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index 6406fd487ee5..e856b10948ab 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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_master *)data;
> > +	dev_priv->display.hdcp.master->fw_dev = mei_kdev;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >
> >  	return 0;
> > @@ -2168,25 +2168,25 @@ static const struct component_ops
> i915_hdcp_component_ops = {
> >  	.unbind = i915_hdcp_component_unbind,  };
> >
> > -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> > +static enum cp_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> >  {
> >  	switch (port) {
> >  	case PORT_A:
> > -		return MEI_DDI_A;
> > +		return FW_DDI_A;
> >  	case PORT_B ... PORT_F:
> > -		return (enum mei_fw_ddi)port;
> > +		return (enum cp_fw_ddi)port;
> >  	default:
> > -		return MEI_DDI_INVALID_PORT;
> > +		return FW_DDI_INVALID_PORT;
> >  	}
> >  }
> >
> > -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder
> > cpu_transcoder)
> > +static enum cp_fw_tc intel_get_mei_fw_tc(enum transcoder
> > +cpu_transcoder)
> >  {
> >  	switch (cpu_transcoder) {
> >  	case TRANSCODER_A ... TRANSCODER_D:
> > -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> > +		return (enum cp_fw_tc)(cpu_transcoder | 0x10);
> >  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> > -		return MEI_INVALID_TRANSCODER;
> > +		return FW_INVALID_TRANSCODER;
> >  	}
> >  }
> >
> > @@ -2206,14 +2206,14 @@ static int initialize_hdcp_port_data(struct
> intel_connector *connector,
> >  		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
> >  		 * with zero(INVALID PORT index).
> >  		 */
> > -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> > +		data->fw_ddi = FW_DDI_INVALID_PORT;
> >
> >  	/*
> >  	 * As associated transcoder is set and modified at modeset, here fw_tc
> >  	 * is initialized to zero (invalid transcoder index). This will be
> >  	 * retained for <Gen12 forever.
> >  	 */
> > -	data->fw_tc = MEI_INVALID_TRANSCODER;
> > +	data->fw_tc = FW_INVALID_TRANSCODER;
> >
> >  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
> >  	data->protocol = (u8)shim->protocol; diff --git
> > a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> > index 7e3cd3fd7f7b..7ca8b739cd31 100644
> > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> > @@ -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_fw_ops mei_hdcp_ops = {
> >  	.owner = THIS_MODULE,
> >  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
> >  	.verify_receiver_cert_prepare_km =
> > @@ -735,13 +735,13 @@ 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 =
> > +	struct i915_hdcp_fw_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->fw_dev = dev;
> >  	ret = component_bind_all(dev, comp_master);
> >  	if (ret < 0)
> >  		return ret;
> > @@ -752,7 +752,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 =
> > +	struct i915_hdcp_fw_master *comp_master =
> >
> 	mei_cldev_get_drvdata(cldev);
> >
> >  	dev_dbg(dev, "%s\n", __func__);
> > @@ -801,7 +801,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_fw_master *comp_master;
> >  	struct component_match *master_match;
> >  	int ret;
> >
> > @@ -846,7 +846,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 =
> > +	struct i915_hdcp_fw_master *comp_master =
> >
> 	mei_cldev_get_drvdata(cldev);
> >  	int ret;
> >
> > diff --git a/include/drm/i915_cp_fw_hdcp_interface.h
> > b/include/drm/i915_cp_fw_hdcp_interface.h
> > index e5dc6b985b2f..3abfe6d414b8 100644
> > --- a/include/drm/i915_cp_fw_hdcp_interface.h
> > +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> > @@ -41,38 +41,38 @@ enum hdcp_wired_protocol {
> >  	HDCP_PROTOCOL_DP
> >  };
> >
> > -enum mei_fw_ddi {
> > -	MEI_DDI_INVALID_PORT = 0x0,
> > +enum cp_fw_ddi {
> > +	FW_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,
> > +	FW_DDI_B = 1,
> > +	FW_DDI_C,
> > +	FW_DDI_D,
> > +	FW_DDI_E,
> > +	FW_DDI_F,
> > +	FW_DDI_A = 7,
> > +	FW_DDI_RANGE_END = FW_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
> > + * @FW_INVALID_TRANSCODER: Index for Invalid transcoder
> > + * @FW_TRANSCODER_EDP: Index for EDP Transcoder
> > + * @FW_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > + * @FW_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > + * @FW_TRANSCODER_A: Index for Transcoder A
> > + * @FW_TRANSCODER_B: Index for Transcoder B
> > + * @FW_TRANSCODER_C: Index for Transcoder C
> > + * @FW_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 cp_fw_tc {
> > +	FW_INVALID_TRANSCODER = 0x00,
> > +	FW_TRANSCODER_EDP,
> > +	FW_TRANSCODER_DSI0,
> > +	FW_TRANSCODER_DSI1,
> > +	FW_TRANSCODER_A = 0x10,
> > +	FW_TRANSCODER_B,
> > +	FW_TRANSCODER_C,
> > +	FW_TRANSCODER_D
> >  };
> >
> >  /**
> > @@ -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 cp_fw_ddi fw_ddi;
> > +	enum cp_fw_tc fw_tc;
> >  	u8 port_type;
> >  	u8 protocol;
> >  	u16 k;
> > @@ -119,7 +119,7 @@ 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_fw_ops {
> >  	/**
> >  	 * @owner: mei_hdcp module
> >  	 */
> > @@ -168,14 +168,14 @@ 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.
> > + * struct i915_hdcp_fw_master - Used for communication between i915
> > + * and cp fw hdcp intf driver like mei_hdcp for the HDCP2.2 services
> > + * @fw_dev: device that provide the HDCP2.2 service from CP FW interface.
> >   * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
> >   */
> > -struct i915_hdcp_comp_master {
> > -	struct device *mei_dev;
> > -	const struct i915_hdcp_component_ops *ops;
> > +struct i915_hdcp_fw_master {
> > +	struct device *fw_dev;
> > +	const struct i915_hdcp_fw_ops *ops;
> >
> >  	/* To protect the above members. */
> >  	struct mutex mutex;
> 
> --
> Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention
  2022-12-13 10:32   ` Jani Nikula
@ 2022-12-13 10:40     ` Kandpal, Suraj
  0 siblings, 0 replies; 24+ messages in thread
From: Kandpal, Suraj @ 2022-12-13 10:40 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo

> 
> If you want to make an hdcp interface naming agnostic to the implementation
> details, why do we have to have "fw" in the naming, at all?
> 
> Why is "cp" duplicated?
> 
> You're calling the file "i915 Content Protection Firmware High-bandwidth Digital
> Content Protection Interface".
> 
> Why are the names *impossible* to pronounce?
> 
> I'd just make this "i915_hdcp_interface".
> 
Makes sense switching too i915_hdcp_interface and removing the duplicated
cp and fw

Regards,
Suraj Kandpal
> 
> BR,
> 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>
> > Acked-by: Tomas Winkler <tomas.winkler@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_display_types.h          | 2 +-
> >  drivers/misc/mei/hdcp/mei_hdcp.c                            | 2 +-
> >  ...915_mei_hdcp_interface.h => i915_cp_fw_hdcp_interface.h} | 6
> > +++---
> >  3 files changed, 5 insertions(+), 5 deletions(-)  rename
> > include/drm/{i915_mei_hdcp_interface.h => i915_cp_fw_hdcp_interface.h}
> > (97%)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> > b/drivers/gpu/drm/i915/display/intel_display_types.h
> > index 32e8b2fc3cc6..52d93e89b4c6 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_cp_fw_hdcp_interface.h>
> >  #include <media/cec-notifier.h>
> >
> >  #include "i915_vma.h"
> > diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
> > b/drivers/misc/mei/hdcp/mei_hdcp.c
> > index e889a8bd7ac8..7e3cd3fd7f7b 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_cp_fw_hdcp_interface.h>
> >
> >  #include "mei_hdcp.h"
> >
> > diff --git a/include/drm/i915_mei_hdcp_interface.h
> > b/include/drm/i915_cp_fw_hdcp_interface.h
> > similarity index 97%
> > rename from include/drm/i915_mei_hdcp_interface.h
> > rename to include/drm/i915_cp_fw_hdcp_interface.h
> > index f441cbcd95a4..e5dc6b985b2f 100644
> > --- a/include/drm/i915_mei_hdcp_interface.h
> > +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> > @@ -6,8 +6,8 @@
> >   * Ramalingam C <ramalingam.c@intel.com>
> >   */
> >
> > -#ifndef _I915_MEI_HDCP_INTERFACE_H_
> > -#define _I915_MEI_HDCP_INTERFACE_H_
> > +#ifndef _I915_CP_FW_HDCP_INTERFACE_H_ #define
> > +_I915_CP_FW_HDCP_INTERFACE_H_
> >
> >  #include <linux/mutex.h>
> >  #include <linux/device.h>
> > @@ -181,4 +181,4 @@ struct i915_hdcp_comp_master {
> >  	struct mutex mutex;
> >  };
> >
> > -#endif /* _I915_MEI_HDCP_INTERFACE_H_ */
> > +#endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */
> 
> --
> Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w Suraj Kandpal
  2022-12-13 10:24   ` Jani Nikula
@ 2022-12-13 10:40   ` Jani Nikula
  2022-12-13 10:45     ` Kandpal, Suraj
  1 sibling, 1 reply; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 10:40 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx; +Cc: Tomas Winkler, Rodrigo Vivi

On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> From: Anshuman Gupta <anshuman.gupta@intel.com>
>
> As now we have more then one type of content protection
> secrity firmware. Let change the i915_cp_fw_hdcp_interface.h
> header naming convention to suit generic f/w type.
> %s/MEI_/FW_
> %s/mei_fw/cp_fw
> %s/mei_dev/fw_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_fw_master
> %s/i915_hdcp_component_ops/i915_hdcp_fw_ops

Why not drop the fw part here too? Just take a step further and make the
interface agnostic to being about firmware.

fw_dev -> hdcp_dev
enum cp_fw_ddi -> enum hdcp_port
enum cp_fw_tc -> enum hdcp_transcoder

enumerator values accordingly, with a sensible prefix.

For naming, try saying the names aloud, as if you were discussing this
on the phone with someone. "enum cp_fw_tc" just does not work.


BR,
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>
> ---
>  .../gpu/drm/i915/display/intel_display_core.h |  3 +-
>  drivers/gpu/drm/i915/display/intel_hdcp.c     | 66 ++++++++---------
>  drivers/misc/mei/hdcp/mei_hdcp.c              | 12 ++--
>  include/drm/i915_cp_fw_hdcp_interface.h       | 70 +++++++++----------
>  4 files changed, 76 insertions(+), 75 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 57ddce3ba02b..a769cc8e2745 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -16,6 +16,7 @@
>  #include <drm/drm_connector.h>
>  #include <drm/drm_modeset_lock.h>
>  
> +#include "i915/i915_cp_fw_hdcp_interface.h"
>  #include "intel_cdclk.h"
>  #include "intel_display.h"
>  #include "intel_display_power.h"
> @@ -368,7 +369,7 @@ struct intel_display {
>  	} gmbus;
>  
>  	struct {
> -		struct i915_hdcp_comp_master *master;
> +		struct i915_hdcp_fw_master *master;
>  		bool comp_added;
>  
>  		/* Mutex to protect the above hdcp component related values. */
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 6406fd487ee5..e856b10948ab 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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_master *)data;
> +	dev_priv->display.hdcp.master->fw_dev = mei_kdev;
>  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
>  
>  	return 0;
> @@ -2168,25 +2168,25 @@ static const struct component_ops i915_hdcp_component_ops = {
>  	.unbind = i915_hdcp_component_unbind,
>  };
>  
> -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> +static enum cp_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
>  {
>  	switch (port) {
>  	case PORT_A:
> -		return MEI_DDI_A;
> +		return FW_DDI_A;
>  	case PORT_B ... PORT_F:
> -		return (enum mei_fw_ddi)port;
> +		return (enum cp_fw_ddi)port;
>  	default:
> -		return MEI_DDI_INVALID_PORT;
> +		return FW_DDI_INVALID_PORT;
>  	}
>  }
>  
> -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
> +static enum cp_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
>  {
>  	switch (cpu_transcoder) {
>  	case TRANSCODER_A ... TRANSCODER_D:
> -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> +		return (enum cp_fw_tc)(cpu_transcoder | 0x10);
>  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> -		return MEI_INVALID_TRANSCODER;
> +		return FW_INVALID_TRANSCODER;
>  	}
>  }
>  
> @@ -2206,14 +2206,14 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
>  		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
>  		 * with zero(INVALID PORT index).
>  		 */
> -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> +		data->fw_ddi = FW_DDI_INVALID_PORT;
>  
>  	/*
>  	 * As associated transcoder is set and modified at modeset, here fw_tc
>  	 * is initialized to zero (invalid transcoder index). This will be
>  	 * retained for <Gen12 forever.
>  	 */
> -	data->fw_tc = MEI_INVALID_TRANSCODER;
> +	data->fw_tc = FW_INVALID_TRANSCODER;
>  
>  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
>  	data->protocol = (u8)shim->protocol;
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> index 7e3cd3fd7f7b..7ca8b739cd31 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> @@ -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_fw_ops mei_hdcp_ops = {
>  	.owner = THIS_MODULE,
>  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
>  	.verify_receiver_cert_prepare_km =
> @@ -735,13 +735,13 @@ 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 =
> +	struct i915_hdcp_fw_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->fw_dev = dev;
>  	ret = component_bind_all(dev, comp_master);
>  	if (ret < 0)
>  		return ret;
> @@ -752,7 +752,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 =
> +	struct i915_hdcp_fw_master *comp_master =
>  						mei_cldev_get_drvdata(cldev);
>  
>  	dev_dbg(dev, "%s\n", __func__);
> @@ -801,7 +801,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_fw_master *comp_master;
>  	struct component_match *master_match;
>  	int ret;
>  
> @@ -846,7 +846,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 =
> +	struct i915_hdcp_fw_master *comp_master =
>  						mei_cldev_get_drvdata(cldev);
>  	int ret;
>  
> diff --git a/include/drm/i915_cp_fw_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
> index e5dc6b985b2f..3abfe6d414b8 100644
> --- a/include/drm/i915_cp_fw_hdcp_interface.h
> +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> @@ -41,38 +41,38 @@ enum hdcp_wired_protocol {
>  	HDCP_PROTOCOL_DP
>  };
>  
> -enum mei_fw_ddi {
> -	MEI_DDI_INVALID_PORT = 0x0,
> +enum cp_fw_ddi {
> +	FW_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,
> +	FW_DDI_B = 1,
> +	FW_DDI_C,
> +	FW_DDI_D,
> +	FW_DDI_E,
> +	FW_DDI_F,
> +	FW_DDI_A = 7,
> +	FW_DDI_RANGE_END = FW_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
> + * @FW_INVALID_TRANSCODER: Index for Invalid transcoder
> + * @FW_TRANSCODER_EDP: Index for EDP Transcoder
> + * @FW_TRANSCODER_DSI0: Index for DSI0 Transcoder
> + * @FW_TRANSCODER_DSI1: Index for DSI1 Transcoder
> + * @FW_TRANSCODER_A: Index for Transcoder A
> + * @FW_TRANSCODER_B: Index for Transcoder B
> + * @FW_TRANSCODER_C: Index for Transcoder C
> + * @FW_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 cp_fw_tc {
> +	FW_INVALID_TRANSCODER = 0x00,
> +	FW_TRANSCODER_EDP,
> +	FW_TRANSCODER_DSI0,
> +	FW_TRANSCODER_DSI1,
> +	FW_TRANSCODER_A = 0x10,
> +	FW_TRANSCODER_B,
> +	FW_TRANSCODER_C,
> +	FW_TRANSCODER_D
>  };
>  
>  /**
> @@ -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 cp_fw_ddi fw_ddi;
> +	enum cp_fw_tc fw_tc;
>  	u8 port_type;
>  	u8 protocol;
>  	u16 k;
> @@ -119,7 +119,7 @@ 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_fw_ops {
>  	/**
>  	 * @owner: mei_hdcp module
>  	 */
> @@ -168,14 +168,14 @@ 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.
> + * struct i915_hdcp_fw_master - Used for communication between i915
> + * and cp fw hdcp intf driver like mei_hdcp for the HDCP2.2 services
> + * @fw_dev: device that provide the HDCP2.2 service from CP FW interface.
>   * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
>   */
> -struct i915_hdcp_comp_master {
> -	struct device *mei_dev;
> -	const struct i915_hdcp_component_ops *ops;
> +struct i915_hdcp_fw_master {
> +	struct device *fw_dev;
> +	const struct i915_hdcp_fw_ops *ops;
>  
>  	/* To protect the above members. */
>  	struct mutex mutex;

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place Suraj Kandpal
@ 2022-12-13 10:43   ` Jani Nikula
  2022-12-13 10:50     ` Kandpal, Suraj
  0 siblings, 1 reply; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 10:43 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx

On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> Need to fill wired cmd in structures at a single place as they remain same
> for both gsc and mei

To be blunt, I think it's a horrible idea to put a massive amount of
inlines in a header. Just please no.

BR,
Jani.

>
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> ---
>  drivers/misc/mei/hdcp/mei_hdcp.c        | 154 ++----------------
>  include/drm/i915_cp_fw_hdcp_interface.h | 198 ++++++++++++++++++++++++
>  2 files changed, 212 insertions(+), 140 deletions(-)
>
> diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> index 51e3edac565d..a4c255be74df 100644
> --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> @@ -50,17 +50,7 @@ mei_hdcp_initiate_session(struct device *dev, struct hdcp_port_data *data,
>  
>  	cldev = to_mei_cl_device(dev);
>  
> -	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->fw_ddi;
> -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
> -	session_init_in.protocol = data->protocol;
> -
> +	i915_cp_fw_fill_session_in(&session_init_in, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
>  			      sizeof(session_init_in));
>  	if (byte < 0) {
> @@ -119,21 +109,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct device *dev,
>  		return -EINVAL;
>  
>  	cldev = to_mei_cl_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 = 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->fw_ddi;
> -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> -	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);
> -
> +	i915_cp_fw_fill_rxcert_in(&verify_rxcert_in, rx_cert, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&verify_rxcert_in,
>  			      sizeof(verify_rxcert_in));
>  	if (byte < 0) {
> @@ -192,18 +168,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct hdcp_port_data *data,
>  
>  	cldev = to_mei_cl_device(dev);
>  
> -	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->fw_ddi;
> -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> -	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> -	       HDCP_2_2_H_PRIME_LEN);
> -
> +	i915_cp_fw_fill_hprime_in(&send_hprime_in, rx_hprime, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&send_hprime_in,
>  			      sizeof(send_hprime_in));
>  	if (byte < 0) {
> @@ -248,20 +213,8 @@ mei_hdcp_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
>  		return -EINVAL;
>  
>  	cldev = to_mei_cl_device(dev);
> -
> -	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->fw_ddi;
> -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> -	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> -	       HDCP_2_2_E_KH_KM_LEN);
> -
> +	i915_cp_fw_fill_pairing_info_in(&pairing_info_in, pairing_info,
> +					data);
>  	byte = mei_cldev_send(cldev, (u8 *)&pairing_info_in,
>  			      sizeof(pairing_info_in));
>  	if (byte < 0) {
> @@ -308,16 +261,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
>  		return -EINVAL;
>  
>  	cldev = to_mei_cl_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 = 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->fw_ddi;
> -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> +	i915_cp_fw_fill_locality_check_in(&lc_init_in, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
>  	if (byte < 0) {
>  		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte);
> @@ -364,19 +308,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct hdcp_port_data *data,
>  
>  	cldev = to_mei_cl_device(dev);
>  
> -	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->fw_ddi;
> -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> -	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> -	       HDCP_2_2_L_PRIME_LEN);
> -
> +	i915_cp_fw_fill_validate_locality_in(&verify_lprime_in, rx_lprime,
> +					     data);
>  	byte = mei_cldev_send(cldev, (u8 *)&verify_lprime_in,
>  			      sizeof(verify_lprime_in));
>  	if (byte < 0) {
> @@ -423,15 +356,7 @@ static int mei_hdcp_get_session_key(struct device *dev,
>  
>  	cldev = to_mei_cl_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 = 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->fw_ddi;
> -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> +	i915_cp_fw_fill_session_key_in(&get_skey_in, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in, sizeof(get_skey_in));
>  	if (byte < 0) {
>  		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte);
> @@ -487,25 +412,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
>  
>  	cldev = to_mei_cl_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 = 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->fw_ddi;
> -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> -	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);
> -
> +	i915_cp_fw_fill_repeater_in(&verify_repeater_in, rep_topology, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,
>  			      sizeof(verify_repeater_in));
>  	if (byte < 0) {
> @@ -566,23 +473,8 @@ static int mei_hdcp_verify_mprime(struct device *dev,
>  	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->fw_ddi;
> -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> -
> -	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);
> -
> +	i915_cp_fw_fill_auth_stream_req_in(verify_mprime_in, stream_ready,
> +					   cmd_size, data);
>  	byte = mei_cldev_send(cldev, (u8 *)verify_mprime_in, cmd_size);
>  	kfree(verify_mprime_in);
>  	if (byte < 0) {
> @@ -628,16 +520,7 @@ static int mei_hdcp_enable_authentication(struct device *dev,
>  
>  	cldev = to_mei_cl_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 = 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->fw_ddi;
> -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
> -	enable_auth_in.stream_type = data->streams[0].stream_type;
> -
> +	i915_cp_fw_fill_enable_auth_in(&enable_auth_in, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in,
>  			      sizeof(enable_auth_in));
>  	if (byte < 0) {
> @@ -682,16 +565,7 @@ mei_hdcp_close_session(struct device *dev, struct hdcp_port_data *data)
>  
>  	cldev = to_mei_cl_device(dev);
>  
> -	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->fw_ddi;
> -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
> -
> +	i915_cp_fw_fill_close_session_in(&session_close_in, data);
>  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
>  			      sizeof(session_close_in));
>  	if (byte < 0) {
> diff --git a/include/drm/i915_cp_fw_hdcp_interface.h b/include/drm/i915_cp_fw_hdcp_interface.h
> index fa06a6cb0bca..e1edad1d26e5 100644
> --- a/include/drm/i915_cp_fw_hdcp_interface.h
> +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> @@ -535,4 +535,202 @@ struct wired_cmd_repeater_auth_stream_req_out {
>  	struct hdcp_cmd_header	header;
>  	struct hdcp_port_id	port;
>  } __packed;
> +
> +static inline void
> +i915_cp_fw_fill_session_in(struct wired_cmd_initiate_hdcp2_session_in *session_init_in,
> +			   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 = 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->fw_ddi;
> +	session_init_in->port.attached_transcoder = (u8)data->fw_tc;
> +	session_init_in->protocol = data->protocol;
> +}
> +
> +static inline void
> +i915_cp_fw_fill_rxcert_in(struct wired_cmd_verify_receiver_cert_in *verify_rxcert_in,
> +			  struct hdcp2_ake_send_cert *rx_cert,
> +			  struct hdcp_port_data *data)
> +{
> +	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->fw_ddi;
> +	verify_rxcert_in->port.attached_transcoder = (u8)data->fw_tc;
> +
> +	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);
> +}
> +
> +static inline void
> +i915_cp_fw_fill_hprime_in(struct wired_cmd_ake_send_hprime_in *send_hprime_in,
> +			  struct hdcp2_ake_send_hprime *rx_hprime,
> +			  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 = 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->fw_ddi;
> +	send_hprime_in->port.attached_transcoder = (u8)data->fw_tc;
> +
> +	memcpy(send_hprime_in->h_prime, rx_hprime->h_prime,
> +	       HDCP_2_2_H_PRIME_LEN);
> +}
> +
> +static inline void
> +i915_cp_fw_fill_pairing_info_in(struct wired_cmd_ake_send_pairing_info_in *pairing_info_in,
> +				struct hdcp2_ake_send_pairing_info *pairing_info,
> +				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 = 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->fw_ddi;
> +	pairing_info_in->port.attached_transcoder = (u8)data->fw_tc;
> +
> +	memcpy(pairing_info_in->e_kh_km, pairing_info->e_kh_km,
> +	       HDCP_2_2_E_KH_KM_LEN);
> +}
> +
> +static inline void
> +i915_cp_fw_fill_locality_check_in(struct wired_cmd_init_locality_check_in *lc_init_in,
> +				  struct hdcp_port_data *data)
> +{
> +	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->fw_ddi;
> +	lc_init_in->port.attached_transcoder = (u8)data->fw_tc;
> +}
> +
> +static inline void
> +i915_cp_fw_fill_validate_locality_in(struct wired_cmd_validate_locality_in *verify_lprime_in,
> +				     struct hdcp2_lc_send_lprime *rx_lprime,
> +				     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 = 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->fw_ddi;
> +	verify_lprime_in->port.attached_transcoder = (u8)data->fw_tc;
> +
> +	memcpy(verify_lprime_in->l_prime, rx_lprime->l_prime,
> +	       HDCP_2_2_L_PRIME_LEN);
> +}
> +
> +static inline void
> +i915_cp_fw_fill_session_key_in(struct wired_cmd_get_session_key_in *get_skey_in,
> +			       struct hdcp_port_data *data)
> +{
> +	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->fw_ddi;
> +	get_skey_in->port.attached_transcoder = (u8)data->fw_tc;
> +}
> +
> +static inline void
> +i915_cp_fw_fill_repeater_in(struct wired_cmd_verify_repeater_in *verify_repeater_in,
> +			    struct hdcp2_rep_send_receiverid_list *rep_topology,
> +			    struct hdcp_port_data *data)
> +{
> +	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->fw_ddi;
> +	verify_repeater_in->port.attached_transcoder = (u8)data->fw_tc;
> +
> +	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);
> +}
> +
> +static inline void
> +i915_cp_fw_fill_auth_stream_req_in(struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in,
> +				   struct hdcp2_rep_stream_ready *stream_ready, ssize_t cmd_size,
> +				   struct hdcp_port_data *data)
> +{
> +	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->fw_ddi;
> +	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> +
> +	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);
> +}
> +
> +static inline void
> +i915_cp_fw_fill_enable_auth_in(struct wired_cmd_enable_auth_in *enable_auth_in,
> +			       struct hdcp_port_data *data)
> +{
> +	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->fw_ddi;
> +	enable_auth_in->port.attached_transcoder = (u8)data->fw_tc;
> +	enable_auth_in->stream_type = data->streams[0].stream_type;
> +}
> +
> +static inline void
> +i915_cp_fw_fill_close_session_in(struct wired_cmd_close_session_in *session_close_in,
> +				 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 = 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->fw_ddi;
> +	session_close_in->port.attached_transcoder = (u8)data->fw_tc;
> +}
>  #endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w
  2022-12-13 10:40   ` Jani Nikula
@ 2022-12-13 10:45     ` Kandpal, Suraj
  0 siblings, 0 replies; 24+ messages in thread
From: Kandpal, Suraj @ 2022-12-13 10:45 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx; +Cc: Winkler, Tomas, Vivi, Rodrigo

> Subject: Re: [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to
> agnotic cp f/w
> 
> On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> > From: Anshuman Gupta <anshuman.gupta@intel.com>
> >
> > As now we have more then one type of content protection secrity
> > firmware. Let change the i915_cp_fw_hdcp_interface.h header naming
> > convention to suit generic f/w type.
> > %s/MEI_/FW_
> > %s/mei_fw/cp_fw
> > %s/mei_dev/fw_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_fw_master
> > %s/i915_hdcp_component_ops/i915_hdcp_fw_ops
> 
> Why not drop the fw part here too? Just take a step further and make the
> interface agnostic to being about firmware.
I kept the fw part here as the previous names had it with mei naming and still interact
with fw but the below names make more sense ill get that changed.

Regards,
Suraj Kandpal
> 
> fw_dev -> hdcp_dev
> enum cp_fw_ddi -> enum hdcp_port
> enum cp_fw_tc -> enum hdcp_transcoder
> 
> enumerator values accordingly, with a sensible prefix.
> 
> For naming, try saying the names aloud, as if you were discussing this on the
> phone with someone. "enum cp_fw_tc" just does not work.
> 
> 
> BR,
> 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>
> > ---
> >  .../gpu/drm/i915/display/intel_display_core.h |  3 +-
> >  drivers/gpu/drm/i915/display/intel_hdcp.c     | 66 ++++++++---------
> >  drivers/misc/mei/hdcp/mei_hdcp.c              | 12 ++--
> >  include/drm/i915_cp_fw_hdcp_interface.h       | 70 +++++++++----------
> >  4 files changed, 76 insertions(+), 75 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h
> > b/drivers/gpu/drm/i915/display/intel_display_core.h
> > index 57ddce3ba02b..a769cc8e2745 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> > @@ -16,6 +16,7 @@
> >  #include <drm/drm_connector.h>
> >  #include <drm/drm_modeset_lock.h>
> >
> > +#include "i915/i915_cp_fw_hdcp_interface.h"
> >  #include "intel_cdclk.h"
> >  #include "intel_display.h"
> >  #include "intel_display_power.h"
> > @@ -368,7 +369,7 @@ struct intel_display {
> >  	} gmbus;
> >
> >  	struct {
> > -		struct i915_hdcp_comp_master *master;
> > +		struct i915_hdcp_fw_master *master;
> >  		bool comp_added;
> >
> >  		/* Mutex to protect the above hdcp component related values.
> */
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index 6406fd487ee5..e856b10948ab 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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_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->fw_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_fw_master *)data;
> > +	dev_priv->display.hdcp.master->fw_dev = mei_kdev;
> >  	mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
> >
> >  	return 0;
> > @@ -2168,25 +2168,25 @@ static const struct component_ops
> i915_hdcp_component_ops = {
> >  	.unbind = i915_hdcp_component_unbind,  };
> >
> > -static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> > +static enum cp_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
> >  {
> >  	switch (port) {
> >  	case PORT_A:
> > -		return MEI_DDI_A;
> > +		return FW_DDI_A;
> >  	case PORT_B ... PORT_F:
> > -		return (enum mei_fw_ddi)port;
> > +		return (enum cp_fw_ddi)port;
> >  	default:
> > -		return MEI_DDI_INVALID_PORT;
> > +		return FW_DDI_INVALID_PORT;
> >  	}
> >  }
> >
> > -static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder
> > cpu_transcoder)
> > +static enum cp_fw_tc intel_get_mei_fw_tc(enum transcoder
> > +cpu_transcoder)
> >  {
> >  	switch (cpu_transcoder) {
> >  	case TRANSCODER_A ... TRANSCODER_D:
> > -		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
> > +		return (enum cp_fw_tc)(cpu_transcoder | 0x10);
> >  	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
> > -		return MEI_INVALID_TRANSCODER;
> > +		return FW_INVALID_TRANSCODER;
> >  	}
> >  }
> >
> > @@ -2206,14 +2206,14 @@ static int initialize_hdcp_port_data(struct
> intel_connector *connector,
> >  		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
> >  		 * with zero(INVALID PORT index).
> >  		 */
> > -		data->fw_ddi = MEI_DDI_INVALID_PORT;
> > +		data->fw_ddi = FW_DDI_INVALID_PORT;
> >
> >  	/*
> >  	 * As associated transcoder is set and modified at modeset, here fw_tc
> >  	 * is initialized to zero (invalid transcoder index). This will be
> >  	 * retained for <Gen12 forever.
> >  	 */
> > -	data->fw_tc = MEI_INVALID_TRANSCODER;
> > +	data->fw_tc = FW_INVALID_TRANSCODER;
> >
> >  	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
> >  	data->protocol = (u8)shim->protocol; diff --git
> > a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c
> > index 7e3cd3fd7f7b..7ca8b739cd31 100644
> > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> > @@ -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_fw_ops mei_hdcp_ops = {
> >  	.owner = THIS_MODULE,
> >  	.initiate_hdcp2_session = mei_hdcp_initiate_session,
> >  	.verify_receiver_cert_prepare_km =
> > @@ -735,13 +735,13 @@ 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 =
> > +	struct i915_hdcp_fw_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->fw_dev = dev;
> >  	ret = component_bind_all(dev, comp_master);
> >  	if (ret < 0)
> >  		return ret;
> > @@ -752,7 +752,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 =
> > +	struct i915_hdcp_fw_master *comp_master =
> >
> 	mei_cldev_get_drvdata(cldev);
> >
> >  	dev_dbg(dev, "%s\n", __func__);
> > @@ -801,7 +801,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_fw_master *comp_master;
> >  	struct component_match *master_match;
> >  	int ret;
> >
> > @@ -846,7 +846,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 =
> > +	struct i915_hdcp_fw_master *comp_master =
> >
> 	mei_cldev_get_drvdata(cldev);
> >  	int ret;
> >
> > diff --git a/include/drm/i915_cp_fw_hdcp_interface.h
> > b/include/drm/i915_cp_fw_hdcp_interface.h
> > index e5dc6b985b2f..3abfe6d414b8 100644
> > --- a/include/drm/i915_cp_fw_hdcp_interface.h
> > +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> > @@ -41,38 +41,38 @@ enum hdcp_wired_protocol {
> >  	HDCP_PROTOCOL_DP
> >  };
> >
> > -enum mei_fw_ddi {
> > -	MEI_DDI_INVALID_PORT = 0x0,
> > +enum cp_fw_ddi {
> > +	FW_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,
> > +	FW_DDI_B = 1,
> > +	FW_DDI_C,
> > +	FW_DDI_D,
> > +	FW_DDI_E,
> > +	FW_DDI_F,
> > +	FW_DDI_A = 7,
> > +	FW_DDI_RANGE_END = FW_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
> > + * @FW_INVALID_TRANSCODER: Index for Invalid transcoder
> > + * @FW_TRANSCODER_EDP: Index for EDP Transcoder
> > + * @FW_TRANSCODER_DSI0: Index for DSI0 Transcoder
> > + * @FW_TRANSCODER_DSI1: Index for DSI1 Transcoder
> > + * @FW_TRANSCODER_A: Index for Transcoder A
> > + * @FW_TRANSCODER_B: Index for Transcoder B
> > + * @FW_TRANSCODER_C: Index for Transcoder C
> > + * @FW_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 cp_fw_tc {
> > +	FW_INVALID_TRANSCODER = 0x00,
> > +	FW_TRANSCODER_EDP,
> > +	FW_TRANSCODER_DSI0,
> > +	FW_TRANSCODER_DSI1,
> > +	FW_TRANSCODER_A = 0x10,
> > +	FW_TRANSCODER_B,
> > +	FW_TRANSCODER_C,
> > +	FW_TRANSCODER_D
> >  };
> >
> >  /**
> > @@ -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 cp_fw_ddi fw_ddi;
> > +	enum cp_fw_tc fw_tc;
> >  	u8 port_type;
> >  	u8 protocol;
> >  	u16 k;
> > @@ -119,7 +119,7 @@ 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_fw_ops {
> >  	/**
> >  	 * @owner: mei_hdcp module
> >  	 */
> > @@ -168,14 +168,14 @@ 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.
> > + * struct i915_hdcp_fw_master - Used for communication between i915
> > + * and cp fw hdcp intf driver like mei_hdcp for the HDCP2.2 services
> > + * @fw_dev: device that provide the HDCP2.2 service from CP FW interface.
> >   * @hdcp_ops: Ops implemented by mei_hdcp driver, used by i915 driver.
> >   */
> > -struct i915_hdcp_comp_master {
> > -	struct device *mei_dev;
> > -	const struct i915_hdcp_component_ops *ops;
> > +struct i915_hdcp_fw_master {
> > +	struct device *fw_dev;
> > +	const struct i915_hdcp_fw_ops *ops;
> >
> >  	/* To protect the above members. */
> >  	struct mutex mutex;
> 
> --
> Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 6/7] drm/i915/mtl: Adding function to send command to GSC CS
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 6/7] drm/i915/mtl: Adding function to send command to GSC CS Suraj Kandpal
@ 2022-12-13 10:47   ` Jani Nikula
  0 siblings, 0 replies; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 10:47 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx

On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> Adding 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.
>
> Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@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>
> ---
>  drivers/gpu/drm/i915/Makefile                 |   1 +
>  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 207 ++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_hdcp_gsc.h |  28 +++
>  drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h   |   1 +
>  4 files changed, 237 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 dfa211451a1d..42b8c3430365 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -250,6 +250,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_hdcp_gsc.c b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> new file mode 100644
> index 000000000000..aea3a1158c75
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> @@ -0,0 +1,207 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright 2021, Intel Corporation.
> + */
> +
> +#include "i915_drv.h"
> +#include "gt/uc/intel_gsc_fw.h"
> +#include "gt/uc/intel_gsc_fwif.h"
> +#include "gem/i915_gem_region.h"
> +#include "i915_utils.h"
> +#include "display/intel_hdcp_gsc.h"

Please sort.

> +
> +struct intel_hdcp_gsc_message {
> +	struct drm_i915_gem_object *obj;
> +	struct i915_vma *vma;
> +	void *hdcp_cmd;
> +};
> +
> +/*This function helps allocate memory for the command that we will send to gsc cs */
> +static int intel_initialize_hdcp_gsc_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;
> +
> +	hdcp_message->obj = NULL;
> +	hdcp_message->hdcp_cmd = NULL;
> +	hdcp_message->vma = NULL;
> +
> +	/* allocate object of one page for HDCP command memory and store it */
> +	obj = i915_gem_object_create_shmem(gt->i915, PAGE_SIZE);
> +
> +	if (IS_ERR(obj)) {
> +		drm_err(&gt->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(gt->i915, obj, true));
> +	if (IS_ERR(cmd)) {
> +		drm_err(&gt->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->obj = obj;
> +	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;
> +}
> +
> +static void intel_free_hdcp_gsc_message(struct intel_hdcp_gsc_message *hdcp_message)
> +{
> +	struct drm_i915_gem_object *obj = fetch_and_zero(&hdcp_message->obj);
> +
> +	if (!obj)
> +		return;
> +
> +	if (hdcp_message->vma)
> +		i915_vma_unpin(fetch_and_zero(&hdcp_message->vma));
> +
> +	i915_gem_object_unpin_map(obj);
> +	i915_gem_object_put(obj);
> +	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_fw_heci_send(&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 & INTEL_GSC_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;
> +	u32 reply_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 = kzalloc(sizeof(*hdcp_message), GFP_KERNEL);
> +
> +	if (!hdcp_message)
> +		return -ENOMEM;
> +
> +	ret = intel_initialize_hdcp_gsc_message(i915, hdcp_message);
> +
> +	if (ret) {
> +		drm_err(&i915->drm,
> +			"Could not initialize hdcp_message\n");
> +		goto err;
> +	}
> +
> +	header = hdcp_message->hdcp_cmd;
> +	addr = i915_ggtt_offset(hdcp_message->vma);
> +
> +	memset(header, 0, sizeof(*header));
> +	header->validity_marker = GSC_HECI_VALIDITY_MARKER;
> +	header->gsc_address = HECI_MEADDRESS_HDCP;
> +	header->host_session_handle = 0;
> +	header->header_version = MTL_GSC_HEADER_VERSION;
> +	header->message_size = msg_in_len + sizeof(*header);
> +
> +	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:
> +	intel_free_hdcp_gsc_message(hdcp_message);
> +	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..9f3e3880fe0a
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
> @@ -0,0 +1,28 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2021 Intel Corporation
> + */
> +
> +#ifndef __INTEL_HDCP_GSC_H__
> +#define __INTEL_HDCP_GSC_H__
> +
> +#include <linux/types.h>
> +#include <linux/err.h>
> +/*
> + * FIXME: Spec states that we need to create a random
> + * host session everytime we send message for now creating
> + * a static host session to avoid clashes not using this
> + * header as of now as we see an error if we use anything
> + * other than 0 as host session
> + */
> +#define GSC_HDCP_HOST_HANDLE	0x12233FFEEDD00000

This is unused.

> +
> +struct drm_i915_private;
> +
> +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_gsc_hdcp_init(struct drm_i915_private *i915);
> +int intel_gsc_hdcp_fini(struct drm_i915_private *i915);

The function naming needs to match file name.

intel_hdcp_gsc.[ch] -> intel_hdcp_gsc_xxx().

BR,
Jani.

> +
> +#endif /* __INTEL_HDCP_GCS_H__ */
> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
> index 1c2a04d092a8..19b98c75367a 100644
> --- a/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
> +++ b/drivers/gpu/drm/i915/gt/uc/intel_gsc_fwif.h
> @@ -34,6 +34,7 @@ struct intel_gsc_mtl_header {
>  	 * Bits 16-31: Extension Size
>  	 */
>  	u32 flags;
> +#define INTEL_GSC_MSG_PENDING	1
>  
>  	u32 status;
>  } __packed;

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place
  2022-12-13 10:43   ` Jani Nikula
@ 2022-12-13 10:50     ` Kandpal, Suraj
  2022-12-13 11:08       ` Jani Nikula
  0 siblings, 1 reply; 24+ messages in thread
From: Kandpal, Suraj @ 2022-12-13 10:50 UTC (permalink / raw)
  To: Jani Nikula, intel-gfx

> 
> On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> > Need to fill wired cmd in structures at a single place as they remain
> > same for both gsc and mei
> 
> To be blunt, I think it's a horrible idea to put a massive amount of inlines in a
> header. Just please no.
I see what you are saying here but these lines end up getting duplicated both in
mei_hdcp.c and intel_gsc_hdcp.c so wanted to get these in a single place so if there is
a change in future I have the same place to change
if you have any other suggestion that would be great or else ill have to go back to duplicating these
lines in the aforementioned files

Regards,
Suraj Kandpal
> 
> BR,
> Jani.
> 
> >
> > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
> > ---
> >  drivers/misc/mei/hdcp/mei_hdcp.c        | 154 ++----------------
> >  include/drm/i915_cp_fw_hdcp_interface.h | 198
> > ++++++++++++++++++++++++
> >  2 files changed, 212 insertions(+), 140 deletions(-)
> >
> > diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
> > b/drivers/misc/mei/hdcp/mei_hdcp.c
> > index 51e3edac565d..a4c255be74df 100644
> > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
> > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
> > @@ -50,17 +50,7 @@ mei_hdcp_initiate_session(struct device *dev,
> > struct hdcp_port_data *data,
> >
> >  	cldev = to_mei_cl_device(dev);
> >
> > -	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->fw_ddi;
> > -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > -	session_init_in.protocol = data->protocol;
> > -
> > +	i915_cp_fw_fill_session_in(&session_init_in, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
> >  			      sizeof(session_init_in));
> >  	if (byte < 0) {
> > @@ -119,21 +109,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct
> device *dev,
> >  		return -EINVAL;
> >
> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
> > -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > -	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);
> > -
> > +	i915_cp_fw_fill_rxcert_in(&verify_rxcert_in, rx_cert, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&verify_rxcert_in,
> >  			      sizeof(verify_rxcert_in));
> >  	if (byte < 0) {
> > @@ -192,18 +168,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct
> > hdcp_port_data *data,
> >
> >  	cldev = to_mei_cl_device(dev);
> >
> > -	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->fw_ddi;
> > -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > -	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
> > -	       HDCP_2_2_H_PRIME_LEN);
> > -
> > +	i915_cp_fw_fill_hprime_in(&send_hprime_in, rx_hprime, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&send_hprime_in,
> >  			      sizeof(send_hprime_in));
> >  	if (byte < 0) {
> > @@ -248,20 +213,8 @@ mei_hdcp_store_pairing_info(struct device *dev,
> struct hdcp_port_data *data,
> >  		return -EINVAL;
> >
> >  	cldev = to_mei_cl_device(dev);
> > -
> > -	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->fw_ddi;
> > -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > -	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
> > -	       HDCP_2_2_E_KH_KM_LEN);
> > -
> > +	i915_cp_fw_fill_pairing_info_in(&pairing_info_in, pairing_info,
> > +					data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&pairing_info_in,
> >  			      sizeof(pairing_info_in));
> >  	if (byte < 0) {
> > @@ -308,16 +261,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
> >  		return -EINVAL;
> >
> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
> > -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > +	i915_cp_fw_fill_locality_check_in(&lc_init_in, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
> >  	if (byte < 0) {
> >  		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); @@ -
> 364,19
> > +308,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct
> > hdcp_port_data *data,
> >
> >  	cldev = to_mei_cl_device(dev);
> >
> > -	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->fw_ddi;
> > -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > -	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
> > -	       HDCP_2_2_L_PRIME_LEN);
> > -
> > +	i915_cp_fw_fill_validate_locality_in(&verify_lprime_in, rx_lprime,
> > +					     data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&verify_lprime_in,
> >  			      sizeof(verify_lprime_in));
> >  	if (byte < 0) {
> > @@ -423,15 +356,7 @@ static int mei_hdcp_get_session_key(struct device
> > *dev,
> >
> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
> > -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > +	i915_cp_fw_fill_session_key_in(&get_skey_in, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in,
> sizeof(get_skey_in));
> >  	if (byte < 0) {
> >  		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); @@ -
> 487,25
> > +412,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
> >
> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
> > -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > -	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);
> > -
> > +	i915_cp_fw_fill_repeater_in(&verify_repeater_in, rep_topology,
> > +data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,
> >  			      sizeof(verify_repeater_in));
> >  	if (byte < 0) {
> > @@ -566,23 +473,8 @@ static int mei_hdcp_verify_mprime(struct device *dev,
> >  	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->fw_ddi;
> > -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > -
> > -	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);
> > -
> > +	i915_cp_fw_fill_auth_stream_req_in(verify_mprime_in, stream_ready,
> > +					   cmd_size, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)verify_mprime_in, cmd_size);
> >  	kfree(verify_mprime_in);
> >  	if (byte < 0) {
> > @@ -628,16 +520,7 @@ static int mei_hdcp_enable_authentication(struct
> > device *dev,
> >
> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
> > -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
> > -	enable_auth_in.stream_type = data->streams[0].stream_type;
> > -
> > +	i915_cp_fw_fill_enable_auth_in(&enable_auth_in, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in,
> >  			      sizeof(enable_auth_in));
> >  	if (byte < 0) {
> > @@ -682,16 +565,7 @@ mei_hdcp_close_session(struct device *dev, struct
> > hdcp_port_data *data)
> >
> >  	cldev = to_mei_cl_device(dev);
> >
> > -	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->fw_ddi;
> > -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
> > -
> > +	i915_cp_fw_fill_close_session_in(&session_close_in, data);
> >  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
> >  			      sizeof(session_close_in));
> >  	if (byte < 0) {
> > diff --git a/include/drm/i915_cp_fw_hdcp_interface.h
> > b/include/drm/i915_cp_fw_hdcp_interface.h
> > index fa06a6cb0bca..e1edad1d26e5 100644
> > --- a/include/drm/i915_cp_fw_hdcp_interface.h
> > +++ b/include/drm/i915_cp_fw_hdcp_interface.h
> > @@ -535,4 +535,202 @@ struct wired_cmd_repeater_auth_stream_req_out {
> >  	struct hdcp_cmd_header	header;
> >  	struct hdcp_port_id	port;
> >  } __packed;
> > +
> > +static inline void
> > +i915_cp_fw_fill_session_in(struct wired_cmd_initiate_hdcp2_session_in
> *session_init_in,
> > +			   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 = 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->fw_ddi;
> > +	session_init_in->port.attached_transcoder = (u8)data->fw_tc;
> > +	session_init_in->protocol = data->protocol; }
> > +
> > +static inline void
> > +i915_cp_fw_fill_rxcert_in(struct wired_cmd_verify_receiver_cert_in
> *verify_rxcert_in,
> > +			  struct hdcp2_ake_send_cert *rx_cert,
> > +			  struct hdcp_port_data *data)
> > +{
> > +	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->fw_ddi;
> > +	verify_rxcert_in->port.attached_transcoder = (u8)data->fw_tc;
> > +
> > +	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); }
> > +
> > +static inline void
> > +i915_cp_fw_fill_hprime_in(struct wired_cmd_ake_send_hprime_in
> *send_hprime_in,
> > +			  struct hdcp2_ake_send_hprime *rx_hprime,
> > +			  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 = 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->fw_ddi;
> > +	send_hprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > +
> > +	memcpy(send_hprime_in->h_prime, rx_hprime->h_prime,
> > +	       HDCP_2_2_H_PRIME_LEN);
> > +}
> > +
> > +static inline void
> > +i915_cp_fw_fill_pairing_info_in(struct wired_cmd_ake_send_pairing_info_in
> *pairing_info_in,
> > +				struct hdcp2_ake_send_pairing_info
> *pairing_info,
> > +				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 = 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->fw_ddi;
> > +	pairing_info_in->port.attached_transcoder = (u8)data->fw_tc;
> > +
> > +	memcpy(pairing_info_in->e_kh_km, pairing_info->e_kh_km,
> > +	       HDCP_2_2_E_KH_KM_LEN);
> > +}
> > +
> > +static inline void
> > +i915_cp_fw_fill_locality_check_in(struct wired_cmd_init_locality_check_in
> *lc_init_in,
> > +				  struct hdcp_port_data *data)
> > +{
> > +	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->fw_ddi;
> > +	lc_init_in->port.attached_transcoder = (u8)data->fw_tc; }
> > +
> > +static inline void
> > +i915_cp_fw_fill_validate_locality_in(struct wired_cmd_validate_locality_in
> *verify_lprime_in,
> > +				     struct hdcp2_lc_send_lprime *rx_lprime,
> > +				     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 = 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->fw_ddi;
> > +	verify_lprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > +
> > +	memcpy(verify_lprime_in->l_prime, rx_lprime->l_prime,
> > +	       HDCP_2_2_L_PRIME_LEN);
> > +}
> > +
> > +static inline void
> > +i915_cp_fw_fill_session_key_in(struct wired_cmd_get_session_key_in
> *get_skey_in,
> > +			       struct hdcp_port_data *data) {
> > +	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->fw_ddi;
> > +	get_skey_in->port.attached_transcoder = (u8)data->fw_tc; }
> > +
> > +static inline void
> > +i915_cp_fw_fill_repeater_in(struct wired_cmd_verify_repeater_in
> *verify_repeater_in,
> > +			    struct hdcp2_rep_send_receiverid_list
> *rep_topology,
> > +			    struct hdcp_port_data *data)
> > +{
> > +	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->fw_ddi;
> > +	verify_repeater_in->port.attached_transcoder = (u8)data->fw_tc;
> > +
> > +	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); }
> > +
> > +static inline void
> > +i915_cp_fw_fill_auth_stream_req_in(struct
> wired_cmd_repeater_auth_stream_req_in *verify_mprime_in,
> > +				   struct hdcp2_rep_stream_ready
> *stream_ready, ssize_t cmd_size,
> > +				   struct hdcp_port_data *data)
> > +{
> > +	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->fw_ddi;
> > +	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
> > +
> > +	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); }
> > +
> > +static inline void
> > +i915_cp_fw_fill_enable_auth_in(struct wired_cmd_enable_auth_in
> *enable_auth_in,
> > +			       struct hdcp_port_data *data) {
> > +	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->fw_ddi;
> > +	enable_auth_in->port.attached_transcoder = (u8)data->fw_tc;
> > +	enable_auth_in->stream_type = data->streams[0].stream_type; }
> > +
> > +static inline void
> > +i915_cp_fw_fill_close_session_in(struct wired_cmd_close_session_in
> *session_close_in,
> > +				 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 = 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->fw_ddi;
> > +	session_close_in->port.attached_transcoder = (u8)data->fw_tc; }
> >  #endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */
> 
> --
> Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 7/7] drm/i915/mtl: Add HDCP GSC interface
  2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 7/7] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
@ 2022-12-13 10:54   ` Jani Nikula
  0 siblings, 0 replies; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 10:54 UTC (permalink / raw)
  To: Suraj Kandpal, intel-gfx; +Cc: Tomas Winkler, Rodrigo Vivi

On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
> 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
>
> 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>
> ---
>  drivers/gpu/drm/i915/display/intel_hdcp.c     |  28 +-
>  drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 503 +++++++++++++++++-
>  2 files changed, 524 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index e856b10948ab..efdaa938df48 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -25,6 +25,8 @@
>  #include "intel_hdcp.h"
>  #include "intel_hdcp_regs.h"
>  #include "intel_pcode.h"
> +#include "intel_connector.h"
> +#include "display/intel_hdcp_gsc.h"

Please keep sorted.

>  
>  #define KEY_LOAD_TRIES	5
>  #define HDCP2_LC_RETRY_CNT			3
> @@ -203,13 +205,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 (DISPLAY_VER(dev_priv) >= 14)

This should be abstracted to avoid duplicating DISPLAY_VER(dev_priv) >=
14.

> +		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,7 +2244,7 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,
>  
>  static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
>  {
> -	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
> +	if (DISPLAY_VER(dev_priv) < 14 && !IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
>  		return false;
>  
>  	return (DISPLAY_VER(dev_priv) >= 10 ||
> @@ -2256,10 +2265,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_component_ops,
> -				  I915_COMPONENT_HDCP);
> +
> +	if (DISPLAY_VER(dev_priv) >= 14)
> +		ret = intel_gsc_hdcp_init(dev_priv);
> +	else
> +		ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_component_ops,
> +					  I915_COMPONENT_HDCP);

Ditto.

>  	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;
> @@ -2485,7 +2498,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_component_ops);
> +	if (DISPLAY_VER(dev_priv) >= 14)
> +		intel_gsc_hdcp_fini(dev_priv);
> +	else
> +		component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);

Ditto.

>  }
>  
>  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 aea3a1158c75..380ebbabb9ff 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp_gsc.c
> @@ -3,6 +3,7 @@
>   * Copyright 2021, Intel Corporation.
>   */
>  
> +#include <drm/i915_cp_fw_hdcp_interface.h>

Blank line between <> and "" includes.

>  #include "i915_drv.h"
>  #include "gt/uc/intel_gsc_fw.h"
>  #include "gt/uc/intel_gsc_fwif.h"
> @@ -16,6 +17,505 @@ struct intel_hdcp_gsc_message {
>  	void *hdcp_cmd;
>  };
>  
> +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;
> +	}
> +
> +	i915_cp_fw_fill_session_in(&session_init_in, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_rxcert_in(&verify_rxcert_in, rx_cert, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_hprime_in(&send_hprime_in, rx_hprime, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_pairing_info_in(&pairing_info_in, pairing_info,
> +					data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_locality_check_in(&lc_init_in, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_validate_locality_in(&verify_lprime_in, rx_lprime,
> +					     data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_session_key_in(&get_skey_in, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_repeater_in(&verify_repeater_in, rep_topology, data);
> +	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;
> +
> +	i915_cp_fw_fill_auth_stream_req_in(verify_mprime_in, stream_ready,
> +					   cmd_size, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_enable_auth_in(&enable_auth_in, data);
> +	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;
> +	}
> +
> +	i915_cp_fw_fill_close_session_in(&session_close_in, data);
> +	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_fw_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,
> +};
> +
> +int intel_gsc_hdcp_init(struct drm_i915_private *i915)
> +{
> +	struct i915_hdcp_fw_master *data;
> +
> +	data = kzalloc(sizeof(struct i915_hdcp_fw_master), GFP_KERNEL);
> +	if (!data)
> +		return -ENOMEM;
> +
> +	mutex_lock(&i915->display.hdcp.comp_mutex);
> +	i915->display.hdcp.master = data;
> +	i915->display.hdcp.master->fw_dev = i915->drm.dev;
> +	i915->display.hdcp.master->ops = &gsc_hdcp_ops;
> +	mutex_unlock(&i915->display.hdcp.comp_mutex);
> +
> +	return 0;
> +}
> +
> +int intel_gsc_hdcp_fini(struct drm_i915_private *i915)
> +{
> +	/* TODO: decrease GSC f/w reference count. */
> +	kfree(i915->display.hdcp.master);
> +	return 0;
> +}

The previous patch adds the header and the declarations for the
functions and this one adds the definitions. They should go together,
hand in hand.

> +
>  /*This function helps allocate memory for the command that we will send to gsc cs */
>  static int intel_initialize_hdcp_gsc_message(struct drm_i915_private *i915,
>  					     struct intel_hdcp_gsc_message *hdcp_message)
> @@ -127,7 +627,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;

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* Re: [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place
  2022-12-13 10:50     ` Kandpal, Suraj
@ 2022-12-13 11:08       ` Jani Nikula
  0 siblings, 0 replies; 24+ messages in thread
From: Jani Nikula @ 2022-12-13 11:08 UTC (permalink / raw)
  To: Kandpal, Suraj, intel-gfx; +Cc: Rodrigo Vivi

On Tue, 13 Dec 2022, "Kandpal, Suraj" <suraj.kandpal@intel.com> wrote:
>> 
>> On Tue, 13 Dec 2022, Suraj Kandpal <suraj.kandpal@intel.com> wrote:
>> > Need to fill wired cmd in structures at a single place as they remain
>> > same for both gsc and mei
>> 
>> To be blunt, I think it's a horrible idea to put a massive amount of inlines in a
>> header. Just please no.
> I see what you are saying here but these lines end up getting duplicated both in
> mei_hdcp.c and intel_gsc_hdcp.c so wanted to get these in a single place so if there is
> a change in future I have the same place to change
> if you have any other suggestion that would be great or else ill have to go back to duplicating these
> lines in the aforementioned files

I don't have the time to figure this out for you, but massive amounts of
static inlines in headers really aren't the way to avoid duplicating
this much code. It's not an abstraction, it's just a clunky way to avoid
copy-paste.

Also, the header is no longer self-contained, i.e. it assumes whoever
includes it also includes a bunch of *other* kernel headers to work.


BR,
Jani.


>
> Regards,
> Suraj Kandpal
>> 
>> BR,
>> Jani.
>> 
>> >
>> > Cc: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
>> > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
>> > ---
>> >  drivers/misc/mei/hdcp/mei_hdcp.c        | 154 ++----------------
>> >  include/drm/i915_cp_fw_hdcp_interface.h | 198
>> > ++++++++++++++++++++++++
>> >  2 files changed, 212 insertions(+), 140 deletions(-)
>> >
>> > diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c
>> > b/drivers/misc/mei/hdcp/mei_hdcp.c
>> > index 51e3edac565d..a4c255be74df 100644
>> > --- a/drivers/misc/mei/hdcp/mei_hdcp.c
>> > +++ b/drivers/misc/mei/hdcp/mei_hdcp.c
>> > @@ -50,17 +50,7 @@ mei_hdcp_initiate_session(struct device *dev,
>> > struct hdcp_port_data *data,
>> >
>> >  	cldev = to_mei_cl_device(dev);
>> >
>> > -	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->fw_ddi;
>> > -	session_init_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -	session_init_in.protocol = data->protocol;
>> > -
>> > +	i915_cp_fw_fill_session_in(&session_init_in, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&session_init_in,
>> >  			      sizeof(session_init_in));
>> >  	if (byte < 0) {
>> > @@ -119,21 +109,7 @@ mei_hdcp_verify_receiver_cert_prepare_km(struct
>> device *dev,
>> >  		return -EINVAL;
>> >
>> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
>> > -	verify_rxcert_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > -	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);
>> > -
>> > +	i915_cp_fw_fill_rxcert_in(&verify_rxcert_in, rx_cert, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&verify_rxcert_in,
>> >  			      sizeof(verify_rxcert_in));
>> >  	if (byte < 0) {
>> > @@ -192,18 +168,7 @@ mei_hdcp_verify_hprime(struct device *dev, struct
>> > hdcp_port_data *data,
>> >
>> >  	cldev = to_mei_cl_device(dev);
>> >
>> > -	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->fw_ddi;
>> > -	send_hprime_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > -	memcpy(send_hprime_in.h_prime, rx_hprime->h_prime,
>> > -	       HDCP_2_2_H_PRIME_LEN);
>> > -
>> > +	i915_cp_fw_fill_hprime_in(&send_hprime_in, rx_hprime, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&send_hprime_in,
>> >  			      sizeof(send_hprime_in));
>> >  	if (byte < 0) {
>> > @@ -248,20 +213,8 @@ mei_hdcp_store_pairing_info(struct device *dev,
>> struct hdcp_port_data *data,
>> >  		return -EINVAL;
>> >
>> >  	cldev = to_mei_cl_device(dev);
>> > -
>> > -	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->fw_ddi;
>> > -	pairing_info_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > -	memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km,
>> > -	       HDCP_2_2_E_KH_KM_LEN);
>> > -
>> > +	i915_cp_fw_fill_pairing_info_in(&pairing_info_in, pairing_info,
>> > +					data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&pairing_info_in,
>> >  			      sizeof(pairing_info_in));
>> >  	if (byte < 0) {
>> > @@ -308,16 +261,7 @@ mei_hdcp_initiate_locality_check(struct device *dev,
>> >  		return -EINVAL;
>> >
>> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
>> > -	lc_init_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > +	i915_cp_fw_fill_locality_check_in(&lc_init_in, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&lc_init_in, sizeof(lc_init_in));
>> >  	if (byte < 0) {
>> >  		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); @@ -
>> 364,19
>> > +308,8 @@ mei_hdcp_verify_lprime(struct device *dev, struct
>> > hdcp_port_data *data,
>> >
>> >  	cldev = to_mei_cl_device(dev);
>> >
>> > -	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->fw_ddi;
>> > -	verify_lprime_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > -	memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime,
>> > -	       HDCP_2_2_L_PRIME_LEN);
>> > -
>> > +	i915_cp_fw_fill_validate_locality_in(&verify_lprime_in, rx_lprime,
>> > +					     data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&verify_lprime_in,
>> >  			      sizeof(verify_lprime_in));
>> >  	if (byte < 0) {
>> > @@ -423,15 +356,7 @@ static int mei_hdcp_get_session_key(struct device
>> > *dev,
>> >
>> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
>> > -	get_skey_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > +	i915_cp_fw_fill_session_key_in(&get_skey_in, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&get_skey_in,
>> sizeof(get_skey_in));
>> >  	if (byte < 0) {
>> >  		dev_dbg(dev, "mei_cldev_send failed. %zd\n", byte); @@ -
>> 487,25
>> > +412,7 @@ mei_hdcp_repeater_check_flow_prepare_ack(struct device *dev,
>> >
>> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
>> > -	verify_repeater_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > -	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);
>> > -
>> > +	i915_cp_fw_fill_repeater_in(&verify_repeater_in, rep_topology,
>> > +data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&verify_repeater_in,
>> >  			      sizeof(verify_repeater_in));
>> >  	if (byte < 0) {
>> > @@ -566,23 +473,8 @@ static int mei_hdcp_verify_mprime(struct device *dev,
>> >  	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->fw_ddi;
>> > -	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > -	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);
>> > -
>> > +	i915_cp_fw_fill_auth_stream_req_in(verify_mprime_in, stream_ready,
>> > +					   cmd_size, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)verify_mprime_in, cmd_size);
>> >  	kfree(verify_mprime_in);
>> >  	if (byte < 0) {
>> > @@ -628,16 +520,7 @@ static int mei_hdcp_enable_authentication(struct
>> > device *dev,
>> >
>> >  	cldev = to_mei_cl_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 = 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->fw_ddi;
>> > -	enable_auth_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -	enable_auth_in.stream_type = data->streams[0].stream_type;
>> > -
>> > +	i915_cp_fw_fill_enable_auth_in(&enable_auth_in, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&enable_auth_in,
>> >  			      sizeof(enable_auth_in));
>> >  	if (byte < 0) {
>> > @@ -682,16 +565,7 @@ mei_hdcp_close_session(struct device *dev, struct
>> > hdcp_port_data *data)
>> >
>> >  	cldev = to_mei_cl_device(dev);
>> >
>> > -	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->fw_ddi;
>> > -	session_close_in.port.attached_transcoder = (u8)data->fw_tc;
>> > -
>> > +	i915_cp_fw_fill_close_session_in(&session_close_in, data);
>> >  	byte = mei_cldev_send(cldev, (u8 *)&session_close_in,
>> >  			      sizeof(session_close_in));
>> >  	if (byte < 0) {
>> > diff --git a/include/drm/i915_cp_fw_hdcp_interface.h
>> > b/include/drm/i915_cp_fw_hdcp_interface.h
>> > index fa06a6cb0bca..e1edad1d26e5 100644
>> > --- a/include/drm/i915_cp_fw_hdcp_interface.h
>> > +++ b/include/drm/i915_cp_fw_hdcp_interface.h
>> > @@ -535,4 +535,202 @@ struct wired_cmd_repeater_auth_stream_req_out {
>> >  	struct hdcp_cmd_header	header;
>> >  	struct hdcp_port_id	port;
>> >  } __packed;
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_session_in(struct wired_cmd_initiate_hdcp2_session_in
>> *session_init_in,
>> > +			   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 = 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->fw_ddi;
>> > +	session_init_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +	session_init_in->protocol = data->protocol; }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_rxcert_in(struct wired_cmd_verify_receiver_cert_in
>> *verify_rxcert_in,
>> > +			  struct hdcp2_ake_send_cert *rx_cert,
>> > +			  struct hdcp_port_data *data)
>> > +{
>> > +	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->fw_ddi;
>> > +	verify_rxcert_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +
>> > +	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); }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_hprime_in(struct wired_cmd_ake_send_hprime_in
>> *send_hprime_in,
>> > +			  struct hdcp2_ake_send_hprime *rx_hprime,
>> > +			  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 = 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->fw_ddi;
>> > +	send_hprime_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +
>> > +	memcpy(send_hprime_in->h_prime, rx_hprime->h_prime,
>> > +	       HDCP_2_2_H_PRIME_LEN);
>> > +}
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_pairing_info_in(struct wired_cmd_ake_send_pairing_info_in
>> *pairing_info_in,
>> > +				struct hdcp2_ake_send_pairing_info
>> *pairing_info,
>> > +				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 = 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->fw_ddi;
>> > +	pairing_info_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +
>> > +	memcpy(pairing_info_in->e_kh_km, pairing_info->e_kh_km,
>> > +	       HDCP_2_2_E_KH_KM_LEN);
>> > +}
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_locality_check_in(struct wired_cmd_init_locality_check_in
>> *lc_init_in,
>> > +				  struct hdcp_port_data *data)
>> > +{
>> > +	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->fw_ddi;
>> > +	lc_init_in->port.attached_transcoder = (u8)data->fw_tc; }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_validate_locality_in(struct wired_cmd_validate_locality_in
>> *verify_lprime_in,
>> > +				     struct hdcp2_lc_send_lprime *rx_lprime,
>> > +				     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 = 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->fw_ddi;
>> > +	verify_lprime_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +
>> > +	memcpy(verify_lprime_in->l_prime, rx_lprime->l_prime,
>> > +	       HDCP_2_2_L_PRIME_LEN);
>> > +}
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_session_key_in(struct wired_cmd_get_session_key_in
>> *get_skey_in,
>> > +			       struct hdcp_port_data *data) {
>> > +	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->fw_ddi;
>> > +	get_skey_in->port.attached_transcoder = (u8)data->fw_tc; }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_repeater_in(struct wired_cmd_verify_repeater_in
>> *verify_repeater_in,
>> > +			    struct hdcp2_rep_send_receiverid_list
>> *rep_topology,
>> > +			    struct hdcp_port_data *data)
>> > +{
>> > +	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->fw_ddi;
>> > +	verify_repeater_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +
>> > +	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); }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_auth_stream_req_in(struct
>> wired_cmd_repeater_auth_stream_req_in *verify_mprime_in,
>> > +				   struct hdcp2_rep_stream_ready
>> *stream_ready, ssize_t cmd_size,
>> > +				   struct hdcp_port_data *data)
>> > +{
>> > +	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->fw_ddi;
>> > +	verify_mprime_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +
>> > +	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); }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_enable_auth_in(struct wired_cmd_enable_auth_in
>> *enable_auth_in,
>> > +			       struct hdcp_port_data *data) {
>> > +	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->fw_ddi;
>> > +	enable_auth_in->port.attached_transcoder = (u8)data->fw_tc;
>> > +	enable_auth_in->stream_type = data->streams[0].stream_type; }
>> > +
>> > +static inline void
>> > +i915_cp_fw_fill_close_session_in(struct wired_cmd_close_session_in
>> *session_close_in,
>> > +				 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 = 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->fw_ddi;
>> > +	session_close_in->port.attached_transcoder = (u8)data->fw_tc; }
>> >  #endif /* _I915_CP_FW_HDCP_INTERFACE_H_ */
>> 
>> --
>> Jani Nikula, Intel Open Source Graphics Center

-- 
Jani Nikula, Intel Open Source Graphics Center

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

* [Intel-gfx] ✗ Fi.CI.IGT: failure for Enable HDCP2.x via GSC CS (rev2)
  2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
                   ` (10 preceding siblings ...)
  2022-12-13  9:28 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
@ 2022-12-14  6:23 ` Patchwork
  11 siblings, 0 replies; 24+ messages in thread
From: Patchwork @ 2022-12-14  6:23 UTC (permalink / raw)
  To: Kandpal, Suraj; +Cc: intel-gfx

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

== Series Details ==

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

== Summary ==

CI Bug Log - changes from CI_DRM_12498_full -> Patchwork_111876v2_full
====================================================

Summary
-------

  **FAILURE**

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

  

Participating hosts (14 -> 14)
------------------------------

  No changes in participating hosts

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

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

### IGT changes ###

#### Possible regressions ####

  * igt@perf_pmu@busy-accuracy-2@vecs0:
    - shard-glk:          [PASS][1] -> [FAIL][2] +5 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk5/igt@perf_pmu@busy-accuracy-2@vecs0.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk8/igt@perf_pmu@busy-accuracy-2@vecs0.html

  * igt@perf_pmu@cpu-hotplug:
    - shard-glk:          [PASS][3] -> [TIMEOUT][4]
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk5/igt@perf_pmu@cpu-hotplug.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk8/igt@perf_pmu@cpu-hotplug.html

  
New tests
---------

  New tests have been introduced between CI_DRM_12498_full and Patchwork_111876v2_full:

### New IGT tests (25) ###

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-linear-to-linear:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-linear-to-x:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-linear-to-y:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-linear-to-y-rc_ccs:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-linear-to-y-rc_ccs-cc:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-x-to-linear:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-x-to-x:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-x-to-y:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-x-to-y-rc_ccs:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-x-to-y-rc_ccs-cc:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-cc-to-linear:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-cc-to-x:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-cc-to-y:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-cc-to-y-rc_ccs:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-cc-to-y-rc_ccs-cc:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-to-linear:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-to-x:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-to-y:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-to-y-rc_ccs:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-rc_ccs-to-y-rc_ccs-cc:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-to-linear:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-to-x:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-to-y:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-to-y-rc_ccs:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  * igt@kms_flip_tiling@flip-change-tiling@hdmi-a-1-pipe-d-y-to-y-rc_ccs-cc:
    - Statuses : 1 pass(s)
    - Exec time: [0.0] s

  

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

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

### CI changes ###

#### Issues hit ####

  * boot:
    - shard-apl:          ([PASS][5], [PASS][6], [PASS][7], [PASS][8], [PASS][9], [PASS][10], [PASS][11], [PASS][12], [PASS][13], [PASS][14], [PASS][15], [PASS][16], [PASS][17], [PASS][18], [PASS][19], [PASS][20], [PASS][21], [PASS][22], [PASS][23], [PASS][24], [PASS][25], [PASS][26], [PASS][27], [PASS][28], [PASS][29]) -> ([PASS][30], [PASS][31], [PASS][32], [PASS][33], [PASS][34], [PASS][35], [PASS][36], [PASS][37], [PASS][38], [PASS][39], [PASS][40], [PASS][41], [PASS][42], [PASS][43], [PASS][44], [PASS][45], [PASS][46], [PASS][47], [PASS][48], [PASS][49], [PASS][50], [PASS][51], [PASS][52], [PASS][53], [FAIL][54]) ([i915#4386])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/boot.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/boot.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/boot.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/boot.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl2/boot.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/boot.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/boot.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl2/boot.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl2/boot.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl2/boot.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/boot.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl8/boot.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl8/boot.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl8/boot.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl8/boot.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/boot.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/boot.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/boot.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/boot.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/boot.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/boot.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/boot.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/boot.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/boot.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/boot.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl1/boot.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl1/boot.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl1/boot.html
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl8/boot.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl8/boot.html
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl8/boot.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl8/boot.html
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl6/boot.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl6/boot.html
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl6/boot.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl6/boot.html
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl6/boot.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl6/boot.html
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl3/boot.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl3/boot.html
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl3/boot.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl3/boot.html
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl3/boot.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/boot.html
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/boot.html
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/boot.html
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/boot.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl1/boot.html
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl1/boot.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl1/boot.html

  
#### Possible fixes ####

  * boot:
    - shard-snb:          ([PASS][55], [PASS][56], [PASS][57], [PASS][58], [PASS][59], [PASS][60], [PASS][61], [PASS][62], [PASS][63], [PASS][64], [PASS][65], [PASS][66], [PASS][67], [PASS][68], [FAIL][69], [PASS][70], [PASS][71], [PASS][72], [PASS][73], [PASS][74], [PASS][75], [PASS][76], [PASS][77], [PASS][78], [PASS][79]) ([i915#4338]) -> ([PASS][80], [PASS][81], [PASS][82], [PASS][83], [PASS][84], [PASS][85], [PASS][86], [PASS][87], [PASS][88], [PASS][89], [PASS][90], [PASS][91], [PASS][92], [PASS][93], [PASS][94], [PASS][95], [PASS][96], [PASS][97], [PASS][98], [PASS][99], [PASS][100], [PASS][101], [PASS][102], [PASS][103], [PASS][104])
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb7/boot.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb5/boot.html
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-snb4/boot.html
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb7/boot.html
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [91]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [92]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [93]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [94]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [95]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [96]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb5/boot.html
   [97]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [98]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [99]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [100]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [101]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [102]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [103]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html
   [104]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/boot.html

  

### IGT changes ###

#### Issues hit ####

  * igt@gem_create@create-massive:
    - shard-snb:          NOTRUN -> [DMESG-WARN][105] ([i915#4991])
   [105]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/igt@gem_create@create-massive.html

  * igt@gem_exec_balancer@parallel-out-fence:
    - shard-iclb:         [PASS][106] -> [SKIP][107] ([i915#4525])
   [106]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb2/igt@gem_exec_balancer@parallel-out-fence.html
   [107]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb8/igt@gem_exec_balancer@parallel-out-fence.html

  * igt@gem_exec_fair@basic-flow@rcs0:
    - shard-tglb:         [PASS][108] -> [FAIL][109] ([i915#2842]) +1 similar issue
   [108]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-tglb7/igt@gem_exec_fair@basic-flow@rcs0.html
   [109]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb2/igt@gem_exec_fair@basic-flow@rcs0.html

  * igt@gem_exec_fair@basic-none-rrul@rcs0:
    - shard-tglb:         NOTRUN -> [FAIL][110] ([i915#2842])
   [110]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@gem_exec_fair@basic-none-rrul@rcs0.html

  * igt@gem_huc_copy@huc-copy:
    - shard-tglb:         [PASS][111] -> [SKIP][112] ([i915#2190])
   [111]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-tglb5/igt@gem_huc_copy@huc-copy.html
   [112]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb6/igt@gem_huc_copy@huc-copy.html

  * igt@gem_lmem_swapping@heavy-random:
    - shard-tglb:         NOTRUN -> [SKIP][113] ([i915#4613])
   [113]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@gem_lmem_swapping@heavy-random.html

  * igt@gem_lmem_swapping@heavy-verify-multi:
    - shard-skl:          NOTRUN -> [SKIP][114] ([fdo#109271] / [i915#4613])
   [114]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl1/igt@gem_lmem_swapping@heavy-verify-multi.html

  * igt@gem_userptr_blits@access-control:
    - shard-skl:          NOTRUN -> [SKIP][115] ([fdo#109271]) +25 similar issues
   [115]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl1/igt@gem_userptr_blits@access-control.html

  * igt@i915_pm_dc@dc6-dpms:
    - shard-tglb:         NOTRUN -> [FAIL][116] ([i915#3989] / [i915#454])
   [116]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@i915_pm_dc@dc6-dpms.html

  * igt@i915_pm_dc@dc9-dpms:
    - shard-iclb:         [PASS][117] -> [SKIP][118] ([i915#4281])
   [117]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb8/igt@i915_pm_dc@dc9-dpms.html
   [118]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb3/igt@i915_pm_dc@dc9-dpms.html

  * igt@i915_suspend@basic-s3-without-i915:
    - shard-glk:          [PASS][119] -> [FAIL][120] ([fdo#103375])
   [119]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk5/igt@i915_suspend@basic-s3-without-i915.html
   [120]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk8/igt@i915_suspend@basic-s3-without-i915.html

  * igt@kms_atomic@crtc-invalid-params:
    - shard-iclb:         [PASS][121] -> [DMESG-WARN][122] ([i915#7507])
   [121]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb2/igt@kms_atomic@crtc-invalid-params.html
   [122]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@kms_atomic@crtc-invalid-params.html

  * igt@kms_big_fb@4-tiled-32bpp-rotate-90:
    - shard-tglb:         NOTRUN -> [SKIP][123] ([i915#5286]) +1 similar issue
   [123]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_big_fb@4-tiled-32bpp-rotate-90.html

  * igt@kms_big_fb@x-tiled-32bpp-rotate-270:
    - shard-tglb:         NOTRUN -> [SKIP][124] ([fdo#111614])
   [124]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html

  * igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip:
    - shard-tglb:         NOTRUN -> [SKIP][125] ([fdo#111615])
   [125]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_big_fb@yf-tiled-max-hw-stride-32bpp-rotate-0-hflip-async-flip.html

  * igt@kms_big_joiner@invalid-modeset:
    - shard-tglb:         NOTRUN -> [SKIP][126] ([i915#2705])
   [126]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_big_joiner@invalid-modeset.html

  * igt@kms_ccs@pipe-a-crc-primary-rotation-180-4_tiled_dg2_rc_ccs:
    - shard-tglb:         NOTRUN -> [SKIP][127] ([i915#3689] / [i915#6095]) +1 similar issue
   [127]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_ccs@pipe-a-crc-primary-rotation-180-4_tiled_dg2_rc_ccs.html

  * igt@kms_ccs@pipe-b-ccs-on-another-bo-y_tiled_gen12_mc_ccs:
    - shard-tglb:         NOTRUN -> [SKIP][128] ([i915#3689] / [i915#3886])
   [128]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_ccs@pipe-b-ccs-on-another-bo-y_tiled_gen12_mc_ccs.html

  * igt@kms_ccs@pipe-b-crc-primary-rotation-180-y_tiled_gen12_rc_ccs_cc:
    - shard-apl:          NOTRUN -> [SKIP][129] ([fdo#109271] / [i915#3886]) +1 similar issue
   [129]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/igt@kms_ccs@pipe-b-crc-primary-rotation-180-y_tiled_gen12_rc_ccs_cc.html

  * igt@kms_ccs@pipe-b-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs_cc:
    - shard-skl:          NOTRUN -> [SKIP][130] ([fdo#109271] / [i915#3886])
   [130]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl1/igt@kms_ccs@pipe-b-crc-sprite-planes-basic-y_tiled_gen12_rc_ccs_cc.html

  * igt@kms_ccs@pipe-d-bad-pixel-format-y_tiled_gen12_mc_ccs:
    - shard-tglb:         NOTRUN -> [SKIP][131] ([i915#3689]) +1 similar issue
   [131]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_ccs@pipe-d-bad-pixel-format-y_tiled_gen12_mc_ccs.html

  * igt@kms_ccs@pipe-d-random-ccs-data-yf_tiled_ccs:
    - shard-tglb:         NOTRUN -> [SKIP][132] ([fdo#111615] / [i915#3689])
   [132]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_ccs@pipe-d-random-ccs-data-yf_tiled_ccs.html

  * igt@kms_chamelium@dp-edid-stress-resolution-4k:
    - shard-snb:          NOTRUN -> [SKIP][133] ([fdo#109271] / [fdo#111827]) +1 similar issue
   [133]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/igt@kms_chamelium@dp-edid-stress-resolution-4k.html

  * igt@kms_chamelium@dp-mode-timings:
    - shard-apl:          NOTRUN -> [SKIP][134] ([fdo#109271] / [fdo#111827]) +1 similar issue
   [134]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/igt@kms_chamelium@dp-mode-timings.html

  * igt@kms_chamelium@vga-hpd-without-ddc:
    - shard-tglb:         NOTRUN -> [SKIP][135] ([fdo#109284] / [fdo#111827])
   [135]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_chamelium@vga-hpd-without-ddc.html

  * igt@kms_content_protection@legacy@pipe-a-dp-1:
    - shard-apl:          NOTRUN -> [TIMEOUT][136] ([i915#7173])
   [136]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/igt@kms_content_protection@legacy@pipe-a-dp-1.html

  * igt@kms_cursor_crc@cursor-rapid-movement-32x32:
    - shard-tglb:         NOTRUN -> [SKIP][137] ([i915#3555])
   [137]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_cursor_crc@cursor-rapid-movement-32x32.html

  * igt@kms_flip@2x-flip-vs-blocking-wf-vblank@ac-hdmi-a1-hdmi-a2:
    - shard-glk:          [PASS][138] -> [FAIL][139] ([i915#2122])
   [138]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk1/igt@kms_flip@2x-flip-vs-blocking-wf-vblank@ac-hdmi-a1-hdmi-a2.html
   [139]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk4/igt@kms_flip@2x-flip-vs-blocking-wf-vblank@ac-hdmi-a1-hdmi-a2.html

  * igt@kms_flip@2x-modeset-vs-vblank-race-interruptible:
    - shard-tglb:         NOTRUN -> [SKIP][140] ([fdo#109274] / [fdo#111825] / [i915#3637])
   [140]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_flip@2x-modeset-vs-vblank-race-interruptible.html

  * igt@kms_flip@flip-vs-expired-vblank@c-edp1:
    - shard-skl:          [PASS][141] -> [FAIL][142] ([i915#79]) +1 similar issue
   [141]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl1/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html
   [142]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl1/igt@kms_flip@flip-vs-expired-vblank@c-edp1.html

  * igt@kms_flip@plain-flip-ts-check@b-edp1:
    - shard-skl:          [PASS][143] -> [FAIL][144] ([i915#2122]) +1 similar issue
   [143]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl1/igt@kms_flip@plain-flip-ts-check@b-edp1.html
   [144]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl6/igt@kms_flip@plain-flip-ts-check@b-edp1.html

  * igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode:
    - shard-tglb:         NOTRUN -> [SKIP][145] ([i915#2587] / [i915#2672]) +1 similar issue
   [145]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-default-mode:
    - shard-iclb:         NOTRUN -> [SKIP][146] ([i915#2672]) +3 similar issues
   [146]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling@pipe-a-valid-mode:
    - shard-iclb:         NOTRUN -> [SKIP][147] ([i915#2587] / [i915#2672]) +4 similar issues
   [147]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb8/igt@kms_flip_scaled_crc@flip-32bpp-yftileccs-to-64bpp-yftile-upscaling@pipe-a-valid-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling@pipe-a-default-mode:
    - shard-iclb:         NOTRUN -> [SKIP][148] ([i915#3555]) +1 similar issue
   [148]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@kms_flip_scaled_crc@flip-64bpp-linear-to-32bpp-linear-downscaling@pipe-a-default-mode.html

  * igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode:
    - shard-iclb:         NOTRUN -> [SKIP][149] ([i915#2672] / [i915#3555])
   [149]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb8/igt@kms_flip_scaled_crc@flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling@pipe-a-valid-mode.html

  * igt@kms_force_connector_basic@force-load-detect:
    - shard-tglb:         NOTRUN -> [SKIP][150] ([fdo#109285])
   [150]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-render:
    - shard-tglb:         NOTRUN -> [SKIP][151] ([i915#6497]) +1 similar issue
   [151]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-render.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt:
    - shard-tglb:         NOTRUN -> [SKIP][152] ([fdo#109280] / [fdo#111825]) +6 similar issues
   [152]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt.html

  * igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-render:
    - shard-apl:          NOTRUN -> [SKIP][153] ([fdo#109271]) +36 similar issues
   [153]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-spr-indfb-draw-render.html

  * igt@kms_plane_alpha_blend@alpha-basic@pipe-a-edp-1:
    - shard-skl:          NOTRUN -> [FAIL][154] ([i915#4573]) +2 similar issues
   [154]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl1/igt@kms_plane_alpha_blend@alpha-basic@pipe-a-edp-1.html

  * igt@kms_plane_lowres@tiling-y@pipe-c-edp-1:
    - shard-tglb:         NOTRUN -> [SKIP][155] ([i915#3536]) +3 similar issues
   [155]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_plane_lowres@tiling-y@pipe-c-edp-1.html

  * igt@kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-5@pipe-a-edp-1:
    - shard-iclb:         [PASS][156] -> [SKIP][157] ([i915#5176]) +2 similar issues
   [156]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb1/igt@kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-5@pipe-a-edp-1.html
   [157]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@kms_plane_scaling@plane-downscale-with-pixel-format-factor-0-5@pipe-a-edp-1.html

  * igt@kms_plane_scaling@plane-downscale-with-rotation-factor-0-25@pipe-b-edp-1:
    - shard-tglb:         NOTRUN -> [SKIP][158] ([i915#5176]) +3 similar issues
   [158]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_plane_scaling@plane-downscale-with-rotation-factor-0-25@pipe-b-edp-1.html

  * igt@kms_plane_scaling@plane-upscale-with-modifiers-factor-0-25@pipe-a-vga-1:
    - shard-snb:          NOTRUN -> [SKIP][159] ([fdo#109271]) +61 similar issues
   [159]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-snb4/igt@kms_plane_scaling@plane-upscale-with-modifiers-factor-0-25@pipe-a-vga-1.html

  * igt@kms_psr2_su@frontbuffer-xrgb8888:
    - shard-iclb:         NOTRUN -> [SKIP][160] ([fdo#109642] / [fdo#111068] / [i915#658])
   [160]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb8/igt@kms_psr2_su@frontbuffer-xrgb8888.html

  * igt@kms_psr@psr2_primary_render:
    - shard-iclb:         [PASS][161] -> [SKIP][162] ([fdo#109441]) +1 similar issue
   [161]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb2/igt@kms_psr@psr2_primary_render.html
   [162]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb8/igt@kms_psr@psr2_primary_render.html

  * igt@kms_selftest@all:
    - shard-tglb:         NOTRUN -> [SKIP][163] ([i915#6433])
   [163]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_selftest@all.html

  * igt@kms_writeback@writeback-pixel-formats:
    - shard-tglb:         NOTRUN -> [SKIP][164] ([i915#2437])
   [164]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@kms_writeback@writeback-pixel-formats.html

  * igt@sysfs_clients@split-50:
    - shard-apl:          NOTRUN -> [SKIP][165] ([fdo#109271] / [i915#2994])
   [165]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/igt@sysfs_clients@split-50.html

  
#### Possible fixes ####

  * igt@drm_read@short-buffer-nonblock:
    - {shard-rkl}:        [SKIP][166] ([i915#4098]) -> [PASS][167]
   [166]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@drm_read@short-buffer-nonblock.html
   [167]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@drm_read@short-buffer-nonblock.html

  * igt@fbdev@read:
    - {shard-rkl}:        [SKIP][168] ([i915#2582]) -> [PASS][169]
   [168]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@fbdev@read.html
   [169]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@fbdev@read.html

  * igt@gem_ctx_persistence@engines-hang@bcs0:
    - {shard-rkl}:        [SKIP][170] ([i915#6252]) -> [PASS][171]
   [170]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@gem_ctx_persistence@engines-hang@bcs0.html
   [171]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@gem_ctx_persistence@engines-hang@bcs0.html

  * igt@gem_ctx_shared@q-smoketest-all:
    - shard-glk:          [DMESG-WARN][172] ([i915#118]) -> [PASS][173]
   [172]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk8/igt@gem_ctx_shared@q-smoketest-all.html
   [173]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk2/igt@gem_ctx_shared@q-smoketest-all.html

  * igt@gem_eio@in-flight-suspend:
    - {shard-dg1}:        [FAIL][174] ([i915#7052]) -> [PASS][175]
   [174]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-dg1-15/igt@gem_eio@in-flight-suspend.html
   [175]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-dg1-12/igt@gem_eio@in-flight-suspend.html

  * igt@gem_exec_balancer@fairslice:
    - {shard-rkl}:        [SKIP][176] ([i915#6259]) -> [PASS][177]
   [176]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@gem_exec_balancer@fairslice.html
   [177]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@gem_exec_balancer@fairslice.html

  * igt@gem_exec_balancer@parallel-balancer:
    - shard-iclb:         [SKIP][178] ([i915#4525]) -> [PASS][179]
   [178]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb5/igt@gem_exec_balancer@parallel-balancer.html
   [179]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb1/igt@gem_exec_balancer@parallel-balancer.html

  * igt@gem_exec_fair@basic-none-share@rcs0:
    - shard-tglb:         [FAIL][180] ([i915#2842]) -> [PASS][181]
   [180]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-tglb3/igt@gem_exec_fair@basic-none-share@rcs0.html
   [181]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb7/igt@gem_exec_fair@basic-none-share@rcs0.html

  * igt@gem_exec_fair@basic-pace-share@rcs0:
    - shard-glk:          [FAIL][182] ([i915#2842]) -> [PASS][183]
   [182]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk3/igt@gem_exec_fair@basic-pace-share@rcs0.html
   [183]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk3/igt@gem_exec_fair@basic-pace-share@rcs0.html

  * igt@gem_exec_reloc@basic-write-read-noreloc:
    - {shard-rkl}:        [SKIP][184] ([i915#3281]) -> [PASS][185] +5 similar issues
   [184]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-2/igt@gem_exec_reloc@basic-write-read-noreloc.html
   [185]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-5/igt@gem_exec_reloc@basic-write-read-noreloc.html

  * igt@gem_pread@snoop:
    - {shard-rkl}:        [SKIP][186] ([i915#3282]) -> [PASS][187] +5 similar issues
   [186]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-4/igt@gem_pread@snoop.html
   [187]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-5/igt@gem_pread@snoop.html

  * igt@gem_workarounds@suspend-resume-fd:
    - shard-tglb:         [INCOMPLETE][188] -> [PASS][189]
   [188]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-tglb1/igt@gem_workarounds@suspend-resume-fd.html
   [189]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb5/igt@gem_workarounds@suspend-resume-fd.html

  * igt@gen9_exec_parse@allowed-single:
    - shard-apl:          [DMESG-WARN][190] ([i915#5566] / [i915#716]) -> [PASS][191]
   [190]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/igt@gen9_exec_parse@allowed-single.html
   [191]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl2/igt@gen9_exec_parse@allowed-single.html

  * igt@gen9_exec_parse@batch-invalid-length:
    - {shard-rkl}:        [SKIP][192] ([i915#2527]) -> [PASS][193]
   [192]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-4/igt@gen9_exec_parse@batch-invalid-length.html
   [193]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-5/igt@gen9_exec_parse@batch-invalid-length.html

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

  * igt@i915_pm_dc@dc6-psr:
    - shard-iclb:         [FAIL][196] ([i915#3989] / [i915#454]) -> [PASS][197]
   [196]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb3/igt@i915_pm_dc@dc6-psr.html
   [197]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb5/igt@i915_pm_dc@dc6-psr.html

  * igt@i915_pm_rpm@modeset-lpsp:
    - {shard-rkl}:        [SKIP][198] ([i915#1397]) -> [PASS][199]
   [198]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@i915_pm_rpm@modeset-lpsp.html
   [199]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@i915_pm_rpm@modeset-lpsp.html

  * igt@kms_async_flips@alternate-sync-async-flip@pipe-b-edp-1:
    - shard-skl:          [FAIL][200] ([i915#2521]) -> [PASS][201] +1 similar issue
   [200]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl1/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-edp-1.html
   [201]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl6/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-edp-1.html

  * igt@kms_async_flips@alternate-sync-async-flip@pipe-b-hdmi-a-1:
    - shard-glk:          [FAIL][202] ([i915#2521]) -> [PASS][203] +1 similar issue
   [202]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk8/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-hdmi-a-1.html
   [203]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk4/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-hdmi-a-1.html

  * igt@kms_cursor_legacy@cursor-vs-flip@atomic-transitions:
    - shard-skl:          [DMESG-WARN][204] ([i915#1982]) -> [PASS][205] +2 similar issues
   [204]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl4/igt@kms_cursor_legacy@cursor-vs-flip@atomic-transitions.html
   [205]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl6/igt@kms_cursor_legacy@cursor-vs-flip@atomic-transitions.html

  * igt@kms_dp_aux_dev:
    - {shard-rkl}:        [SKIP][206] ([i915#1257]) -> [PASS][207]
   [206]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@kms_dp_aux_dev.html
   [207]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@kms_dp_aux_dev.html

  * igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-edp1:
    - shard-skl:          [FAIL][208] ([i915#2122]) -> [PASS][209] +1 similar issue
   [208]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl6/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-edp1.html
   [209]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl7/igt@kms_flip@flip-vs-absolute-wf_vblank-interruptible@c-edp1.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1:
    - shard-skl:          [FAIL][210] ([i915#79]) -> [PASS][211]
   [210]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl6/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html
   [211]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl7/igt@kms_flip@flip-vs-expired-vblank-interruptible@b-edp1.html

  * igt@kms_flip@flip-vs-suspend-interruptible@a-edp1:
    - shard-skl:          [INCOMPLETE][212] ([i915#4839]) -> [PASS][213]
   [212]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl1/igt@kms_flip@flip-vs-suspend-interruptible@a-edp1.html
   [213]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl1/igt@kms_flip@flip-vs-suspend-interruptible@a-edp1.html

  * igt@kms_flip@flip-vs-suspend-interruptible@c-hdmi-a4:
    - {shard-dg1}:        [FAIL][214] ([fdo#103375]) -> [PASS][215] +1 similar issue
   [214]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-dg1-15/igt@kms_flip@flip-vs-suspend-interruptible@c-hdmi-a4.html
   [215]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-dg1-12/igt@kms_flip@flip-vs-suspend-interruptible@c-hdmi-a4.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite:
    - {shard-rkl}:        [SKIP][216] ([i915#1849] / [i915#4098]) -> [PASS][217] +10 similar issues
   [216]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html
   [217]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@psr-suspend:
    - shard-skl:          [INCOMPLETE][218] ([i915#7255]) -> [PASS][219]
   [218]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl4/igt@kms_frontbuffer_tracking@psr-suspend.html
   [219]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl7/igt@kms_frontbuffer_tracking@psr-suspend.html

  * igt@kms_properties@plane-properties-atomic:
    - {shard-rkl}:        [SKIP][220] ([i915#1849]) -> [PASS][221] +1 similar issue
   [220]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@kms_properties@plane-properties-atomic.html
   [221]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@kms_properties@plane-properties-atomic.html

  * igt@kms_psr@psr2_primary_blt:
    - shard-iclb:         [SKIP][222] ([fdo#109441]) -> [PASS][223] +1 similar issue
   [222]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb1/igt@kms_psr@psr2_primary_blt.html
   [223]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@kms_psr@psr2_primary_blt.html

  * igt@kms_psr@sprite_plane_onoff:
    - {shard-rkl}:        [SKIP][224] ([i915#1072]) -> [PASS][225] +3 similar issues
   [224]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@kms_psr@sprite_plane_onoff.html
   [225]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@kms_psr@sprite_plane_onoff.html

  * igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
    - shard-skl:          [SKIP][226] ([fdo#109271]) -> [PASS][227]
   [226]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-skl6/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
   [227]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-skl7/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
    - shard-iclb:         [SKIP][228] ([i915#5519]) -> [PASS][229]
   [228]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb8/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
   [229]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb3/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html

  * igt@kms_vblank@pipe-a-accuracy-idle:
    - shard-glk:          [FAIL][230] ([i915#43]) -> [PASS][231]
   [230]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-glk8/igt@kms_vblank@pipe-a-accuracy-idle.html
   [231]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-glk2/igt@kms_vblank@pipe-a-accuracy-idle.html

  * igt@kms_vblank@pipe-a-wait-forked-busy-hang:
    - {shard-rkl}:        [SKIP][232] ([i915#1845] / [i915#4098]) -> [PASS][233] +21 similar issues
   [232]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@kms_vblank@pipe-a-wait-forked-busy-hang.html
   [233]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@kms_vblank@pipe-a-wait-forked-busy-hang.html

  * igt@perf@gen12-mi-rpc:
    - {shard-rkl}:        [SKIP][234] ([fdo#109289]) -> [PASS][235]
   [234]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-rkl-5/igt@perf@gen12-mi-rpc.html
   [235]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-rkl-6/igt@perf@gen12-mi-rpc.html

  * igt@sysfs_heartbeat_interval@nopreempt@vcs1:
    - shard-tglb:         [FAIL][236] ([i915#6015]) -> [PASS][237]
   [236]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-tglb3/igt@sysfs_heartbeat_interval@nopreempt@vcs1.html
   [237]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-tglb7/igt@sysfs_heartbeat_interval@nopreempt@vcs1.html

  
#### Warnings ####

  * igt@i915_pm_dc@dc3co-vpb-simulation:
    - shard-iclb:         [SKIP][238] ([i915#658]) -> [SKIP][239] ([i915#588])
   [238]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb1/igt@i915_pm_dc@dc3co-vpb-simulation.html
   [239]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@i915_pm_dc@dc3co-vpb-simulation.html

  * igt@kms_plane_alpha_blend@alpha-basic@pipe-c-dp-1:
    - shard-apl:          [FAIL][240] ([i915#4573]) -> [DMESG-FAIL][241] ([IGT#6]) +1 similar issue
   [240]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/igt@kms_plane_alpha_blend@alpha-basic@pipe-c-dp-1.html
   [241]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl3/igt@kms_plane_alpha_blend@alpha-basic@pipe-c-dp-1.html

  * igt@kms_psr2_sf@overlay-plane-move-continuous-sf:
    - shard-iclb:         [SKIP][242] ([i915#2920]) -> [SKIP][243] ([i915#658])
   [242]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb2/igt@kms_psr2_sf@overlay-plane-move-continuous-sf.html
   [243]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb8/igt@kms_psr2_sf@overlay-plane-move-continuous-sf.html

  * igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-big-fb:
    - shard-iclb:         [SKIP][244] ([i915#658]) -> [SKIP][245] ([i915#2920])
   [244]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-iclb1/igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-big-fb.html
   [245]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-iclb2/igt@kms_psr2_sf@primary-plane-update-sf-dmg-area-big-fb.html

  * igt@runner@aborted:
    - shard-apl:          ([FAIL][246], [FAIL][247], [FAIL][248]) ([fdo#109271] / [i915#3002] / [i915#4312]) -> ([FAIL][249], [FAIL][250]) ([i915#3002] / [i915#4312])
   [246]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl3/igt@runner@aborted.html
   [247]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl1/igt@runner@aborted.html
   [248]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12498/shard-apl6/igt@runner@aborted.html
   [249]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl8/igt@runner@aborted.html
   [250]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_111876v2/shard-apl8/igt@runner@aborted.html

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

  [IGT#6]: https://gitlab.freedesktop.org/drm/igt-gpu-tools/issues/6
  [fdo#103375]: https://bugs.freedesktop.org/show_bug.cgi?id=103375
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [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#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#109308]: https://bugs.freedesktop.org/show_bug.cgi?id=109308
  [fdo#109309]: https://bugs.freedesktop.org/show_bug.cgi?id=109309
  [fdo#109312]: https://bugs.freedesktop.org/show_bug.cgi?id=109312
  [fdo#109313]: https://bugs.freedesktop.org/show_bug.cgi?id=109313
  [fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [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#111644]: https://bugs.freedesktop.org/show_bug.cgi?id=111644
  [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#112054]: https://bugs.freedesktop.org/show_bug.cgi?id=112054
  [fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#118]: https://gitlab.freedesktop.org/drm/intel/issues/118
  [i915#1257]: https://gitlab.freedesktop.org/drm/intel/issues/1257
  [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#1902]: https://gitlab.freedesktop.org/drm/intel/issues/1902
  [i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
  [i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2232]: https://gitlab.freedesktop.org/drm/intel/issues/2232
  [i915#2436]: https://gitlab.freedesktop.org/drm/intel/issues/2436
  [i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
  [i915#2521]: https://gitlab.freedesktop.org/drm/intel/issues/2521
  [i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
  [i915#2532]: https://gitlab.freedesktop.org/drm/intel/issues/2532
  [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#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#2994]: https://gitlab.freedesktop.org/drm/intel/issues/2994
  [i915#3002]: https://gitlab.freedesktop.org/drm/intel/issues/3002
  [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#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
  [i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
  [i915#3301]: https://gitlab.freedesktop.org/drm/intel/issues/3301
  [i915#3323]: https://gitlab.freedesktop.org/drm/intel/issues/3323
  [i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
  [i915#3536]: https://gitlab.freedesktop.org/drm/intel/issues/3536
  [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#3639]: https://gitlab.freedesktop.org/drm/intel/issues/3639
  [i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
  [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#3989]: https://gitlab.freedesktop.org/drm/intel/issues/3989
  [i915#404]: https://gitlab.freedesktop.org/drm/intel/issues/404
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
  [i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
  [i915#43]: https://gitlab.freedesktop.org/drm/intel/issues/43
  [i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
  [i915#4338]: https://gitlab.freedesktop.org/drm/intel/issues/4338
  [i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349
  [i915#4386]: https://gitlab.freedesktop.org/drm/intel/issues/4386
  [i915#4387]: https://gitlab.freedesktop.org/drm/intel/issues/4387
  [i915#4525]: https://gitlab.freedesktop.org/drm/intel/issues/4525
  [i915#454]: https://gitlab.freedesktop.org/drm/intel/issues/454
  [i915#4573]: https://gitlab.freedesktop.org/drm/intel/issues/4573
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4839]: https://gitlab.freedesktop.org/drm/intel/issues/4839
  [i915#4991]: https://gitlab.freedesktop.org/drm/intel/issues/4991
  [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#5288]: https://gitlab.freedesktop.org/drm/intel/issues/5288
  [i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
  [i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
  [i915#5327]: https://gitlab.freedesktop.org/drm/intel/issues/5327
  [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#5519]: https://gitlab.freedesktop.org/drm/intel/issues/5519
  [i915#5566]: https://gitlab.freedesktop.org/drm/intel/issues/5566
  [i915#5723]: https://gitlab.freedesktop.org/drm/intel/issues/5723
  [i915#588]: https://gitlab.freedesktop.org/drm/intel/issues/588
  [i915#6015]: https://gitlab.freedesktop.org/drm/intel/issues/6015
  [i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
  [i915#6117]: https://gitlab.freedesktop.org/drm/intel/issues/6117
  [i915#6245]: https://gitlab.freedesktop.org/drm/intel/issues/6245
  [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#6259]: https://gitlab.freedesktop.org/drm/intel/issues/6259
  [i915#6301]: https://gitlab.freedesktop.org/drm/intel/issues/6301
  [i915#6334]: https://gitlab.freedesktop.org/drm/intel/issues/6334
  [i915#6344]: https://gitlab.freedesktop.org/drm/intel/issues/6344
  [i915#6403]: https://gitlab.freedesktop.org/drm/intel/issues/6403
  [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#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
  [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#7052]: https://gitlab.freedesktop.org/drm/intel/issues/7052
  [i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
  [i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
  [i915#716]: https://gitlab.freedesktop.org/drm/intel/issues/716
  [i915#7173]: https://gitlab.freedesktop.org/drm/intel/issues/7173
  [i915#7255]: https://gitlab.freedesktop.org/drm/intel/issues/7255
  [i915#7276]: https://gitlab.freedesktop.org/drm/intel/issues/7276
  [i915#7507]: https://gitlab.freedesktop.org/drm/intel/issues/7507
  [i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
  [i915#7651]: https://gitlab.freedesktop.org/drm/intel/issues/7651
  [i915#7672]: https://gitlab.freedesktop.org/drm/intel/issues/7672
  [i915#7673]: https://gitlab.freedesktop.org/drm/intel/issues/7673
  [i915#7681]: https://gitlab.freedesktop.org/drm/intel/issues/7681
  [i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79


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

  * Linux: CI_DRM_12498 -> Patchwork_111876v2

  CI-20190529: 20190529
  CI_DRM_12498: 76c062e92f2d28ab3d6a1b122cae8931e55b4fd9 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_7091: b8015f920c9f469d3733854263cb878373c1df51 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_111876v2: 76c062e92f2d28ab3d6a1b122cae8931e55b4fd9 @ git://anongit.freedesktop.org/gfx-ci/linux
  piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit

== Logs ==

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

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

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

end of thread, other threads:[~2022-12-14  6:23 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-13  7:01 [Intel-gfx] [PATCH v2 0/7] Enable HDCP2.x via GSC CS Suraj Kandpal
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 1/7] drm/i915/gsc: Create GSC request submission mechanism Suraj Kandpal
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 2/7] drm/i915/hdcp: Keep cp fw agonstic naming convention Suraj Kandpal
2022-12-13 10:32   ` Jani Nikula
2022-12-13 10:40     ` Kandpal, Suraj
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 3/7] drm/i915/hdcp: HDCP2.x Refactoring to agnotic cp f/w Suraj Kandpal
2022-12-13 10:24   ` Jani Nikula
2022-12-13 10:32     ` Kandpal, Suraj
2022-12-13 10:40   ` Jani Nikula
2022-12-13 10:45     ` Kandpal, Suraj
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 4/7] drm/i915/hdcp: Refactor HDCP API structures Suraj Kandpal
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 5/7] drm/i915/hdcp: Fill wired_cmd_in structures at a single place Suraj Kandpal
2022-12-13 10:43   ` Jani Nikula
2022-12-13 10:50     ` Kandpal, Suraj
2022-12-13 11:08       ` Jani Nikula
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 6/7] drm/i915/mtl: Adding function to send command to GSC CS Suraj Kandpal
2022-12-13 10:47   ` Jani Nikula
2022-12-13  7:01 ` [Intel-gfx] [PATCH v2 7/7] drm/i915/mtl: Add HDCP GSC interface Suraj Kandpal
2022-12-13 10:54   ` Jani Nikula
2022-12-13  7:29 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Enable HDCP2.x via GSC CS (rev2) Patchwork
2022-12-13  7:29 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-12-13  7:40 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2022-12-13  9:28 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2022-12-14  6:23 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " 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.