Commit 88363177 authored by Suraj Kandpal's avatar Suraj Kandpal Committed by Uma Shankar
Browse files

drm/i915/mtl: Add HDCP GSC interface



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

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

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

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

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

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

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: default avatarAnshuman Gupta <anshuman.gupta@intel.com>
Signed-off-by: default avatarSuraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: default avatarUma Shankar <uma.shankar@intel.com>
Signed-off-by: default avatarUma Shankar <uma.shankar@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230316092927.668980-7-suraj.kandpal@intel.com
parent 18fd7f8a
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include "intel_display_power_well.h"
#include "intel_display_types.h"
#include "intel_hdcp.h"
#include "intel_hdcp_gsc.h"
#include "intel_hdcp_regs.h"
#include "intel_pcode.h"

@@ -203,13 +204,20 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
	struct intel_hdcp *hdcp = &connector->hdcp;
	struct intel_gt *gt = dev_priv->media_gt;
	struct intel_gsc_uc *gsc = &gt->uc.gsc;
	bool capable = false;

	/* I915 support for HDCP2.2 */
	if (!hdcp->hdcp2_supported)
		return false;

	/* MEI interface is solid */
	/* If MTL+ make sure gsc is loaded and proxy is setup */
	if (intel_hdcp_gsc_cs_required(dev_priv))
		if (!intel_uc_fw_is_running(&gsc->fw))
			return false;

	/* MEI/GSC interface is solid depending on which is used */
	mutex_lock(&dev_priv->display.hdcp.comp_mutex);
	if (!dev_priv->display.hdcp.comp_added ||  !dev_priv->display.hdcp.master) {
		mutex_unlock(&dev_priv->display.hdcp.comp_mutex);
@@ -2233,6 +2241,9 @@ static int initialize_hdcp_port_data(struct intel_connector *connector,

static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
{
	if (intel_hdcp_gsc_cs_required(dev_priv))
		return true;

	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
		return false;

@@ -2254,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);
	if (intel_hdcp_gsc_cs_required(dev_priv))
		ret = intel_hdcp_gsc_init(dev_priv);
	else
		ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_ops,
					  I915_COMPONENT_HDCP);

	if (ret < 0) {
		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
		drm_dbg_kms(&dev_priv->drm, "Failed at fw component add(%d)\n",
			    ret);
		mutex_lock(&dev_priv->display.hdcp.comp_mutex);
		dev_priv->display.hdcp.comp_added = false;
@@ -2484,6 +2499,9 @@ 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);

	if (intel_hdcp_gsc_cs_required(dev_priv))
		intel_hdcp_gsc_fini(dev_priv);
	else
		component_del(dev_priv->drm.dev, &i915_hdcp_ops);
}

+634 −3

File changed.

Preview size limit exceeded, changes collapsed.

+3 −0
Original line number Diff line number Diff line
@@ -16,8 +16,11 @@ struct intel_hdcp_gsc_message {
	void *hdcp_cmd;
};

bool intel_hdcp_gsc_cs_required(struct drm_i915_private *i915);
ssize_t intel_hdcp_gsc_msg_send(struct drm_i915_private *i915, u8 *msg_in,
				size_t msg_in_len, u8 *msg_out,
				size_t msg_out_len);
int intel_hdcp_gsc_init(struct drm_i915_private *i915);
void intel_hdcp_gsc_fini(struct drm_i915_private *i915);

#endif /* __INTEL_HDCP_GCS_H__ */