[Intel-gfx] [PATCH] drm/i915/hdcp: add intel_atomic_state argument to hdcp_enable function

Kandpal, Suraj suraj.kandpal at intel.com
Thu May 11 04:41:56 UTC 2023


> On Thu, 04 May 2023, Suraj Kandpal <suraj.kandpal at intel.com> wrote:
> > Since topology state is being added to drm_atomic_state now all
> > drm_modeset_lock required are being taken from core this raises an
> > issue when we try to loop over connector and assign vcpi id to our
> > streams as we did not have atomic state to derive acquire_ctx from
> > hence we fill in stream info if dpmst encoder is found before enabling
> > hdcp.
> >
> > Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
> > Signed-off-by: Suraj Kandpal <suraj.kandpal at intel.com>
> 
> The subject implies you're just passing an extra parameter, but that's really
> not the case. You're doing something else, and to achieve that, you also pass
> an extra parameter.
> 
> One approach might be to have a separate patch to change the parameters
> only, and it might be sensible to actually pass all the
> intel_encoder->enable() parameters i.e.
> 
> (struct intel_atomic_state *state,
>  struct intel_encoder *encoder,
>  const struct intel_crtc_state *pipe_config,  const struct drm_connector_state
> *conn_state)
> 

Sure Jani will break the patch into two and pass all the intel_encoder->enable() params

> > ---
> >  drivers/gpu/drm/i915/display/intel_ddi.c    |  3 +-
> >  drivers/gpu/drm/i915/display/intel_dp_mst.c |  2 +-
> >  drivers/gpu/drm/i915/display/intel_hdcp.c   | 50 ++++++++++++++++++---
> >  drivers/gpu/drm/i915/display/intel_hdcp.h   |  3 +-
> >  4 files changed, 49 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> > b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 29e4bfab4635..182b8815b20d 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3264,9 +3264,10 @@ static void intel_enable_ddi(struct
> intel_atomic_state *state,
> >  	/* Enable hdcp if it's desired */
> >  	if (conn_state->content_protection ==
> >  	    DRM_MODE_CONTENT_PROTECTION_DESIRED)
> > -		intel_hdcp_enable(to_intel_connector(conn_state-
> >connector),
> > +		intel_hdcp_enable(state, to_intel_connector(conn_state-
> >connector),
> >  				  crtc_state,
> >  				  (u8)conn_state->hdcp_content_type);
> > +
> >  }
> >
> >  static void intel_disable_ddi_dp(struct intel_atomic_state *state,
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > index 2c49d9ab86a2..c92b00ceaae0 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> > @@ -800,7 +800,7 @@ static void intel_mst_enable_dp(struct
> intel_atomic_state *state,
> >  	/* Enable hdcp if it's desired */
> >  	if (conn_state->content_protection ==
> >  	    DRM_MODE_CONTENT_PROTECTION_DESIRED)
> > -		intel_hdcp_enable(to_intel_connector(conn_state-
> >connector),
> > +		intel_hdcp_enable(state, to_intel_connector(conn_state-
> >connector),
> >  				  pipe_config,
> >  				  (u8)conn_state->hdcp_content_type);
> >  }
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > index e1dc3d96e708..c8cdf25914f7 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> > @@ -30,7 +30,8 @@
> >  #define KEY_LOAD_TRIES	5
> >  #define HDCP2_LC_RETRY_CNT			3
> >
> > -static int intel_conn_to_vcpi(struct intel_connector *connector)
> > +static int intel_conn_to_vcpi(struct intel_connector *connector,
> > +			      struct drm_atomic_state *state)
> >  {
> >  	struct drm_dp_mst_topology_mgr *mgr;
> >  	struct drm_dp_mst_atomic_payload *payload; @@ -42,7 +43,7 @@
> static
> > int intel_conn_to_vcpi(struct intel_connector *connector)
> >  		return 0;
> >  	mgr = connector->port->mgr;
> >
> > -	drm_modeset_lock(&mgr->base.lock, NULL);
> > +	drm_modeset_lock(&mgr->base.lock, state->acquire_ctx);
> 
> The return value must be checked and handled for ctx != NULL. Please git
> grep for examples.
> 
> >  	mst_state = to_drm_dp_mst_topology_state(mgr->base.state);
> >  	payload = drm_atomic_get_mst_payload_state(mst_state,
> connector->port);
> >  	if (drm_WARN_ON(mgr->dev, !payload)) @@ -54,7 +55,6 @@ static
> int
> > intel_conn_to_vcpi(struct intel_connector *connector)
> >  		goto out;
> >  	}
> >  out:
> > -	drm_modeset_unlock(&mgr->base.lock);
> >  	return vcpi;
> >  }
> >
> > @@ -99,7 +99,6 @@ intel_hdcp_required_content_stream(struct
> intel_digital_port *dig_port)
> >  		if (!enforce_type0 && !dig_port->hdcp_mst_type1_capable)
> >  			enforce_type0 = true;
> >
> > -		data->streams[data->k].stream_id =
> intel_conn_to_vcpi(connector);
> >  		data->k++;
> >
> >  		/* if there is only one active stream */ @@ -122,6 +121,41
> @@
> > intel_hdcp_required_content_stream(struct intel_digital_port *dig_port)
> >  	return 0;
> >  }
> >
> > +static int
> > +intel_hdcp_get_content_stream_id(struct intel_digital_port *dig_port,
> > +				 struct intel_atomic_state *state)
> 
> To me it seems like this *sets* the stream id, not get. This doesn't return any
> id.
> 

Right will change the name.

> > +{
> > +	struct drm_connector_list_iter conn_iter;
> > +	struct intel_digital_port *conn_dig_port;
> > +	struct intel_connector *connector;
> > +	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
> > +	struct hdcp_port_data *data = &dig_port->hdcp_port_data;
> > +
> > +	data->k = 0;
> > +
> > +	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
> > +	for_each_intel_connector_iter(connector, &conn_iter) {
> > +		if (connector->base.status ==
> connector_status_disconnected)
> > +			continue;
> > +
> > +		if
> (!intel_encoder_is_mst(intel_attached_encoder(connector)))
> > +			continue;
> > +
> > +		conn_dig_port = intel_attached_dig_port(connector);
> > +		if (conn_dig_port != dig_port)
> > +			continue;
> > +
> > +		data->streams[data->k].stream_id =
> intel_conn_to_vcpi(connector, &state->base);
> > +		data->k++;
> > +
> > +		/* if there is only one active stream */
> > +		if (dig_port->dp.active_mst_links <= 1)
> > +			break;
> > +	}
> > +	drm_connector_list_iter_end(&conn_iter);
> > +
> > +	return 0;
> 
> This is 95% copy-paste of intel_hdcp_required_content_stream().
> 
> > +}
> >  static int intel_hdcp_prepare_streams(struct intel_connector
> > *connector)  {
> >  	struct intel_digital_port *dig_port =
> > intel_attached_dig_port(connector);
> > @@ -2333,7 +2367,8 @@ int intel_hdcp_init(struct intel_connector
> *connector,
> >  	return 0;
> >  }
> >
> > -int intel_hdcp_enable(struct intel_connector *connector,
> > +int intel_hdcp_enable(struct intel_atomic_state *state,
> > +		      struct intel_connector *connector,
> >  		      const struct intel_crtc_state *pipe_config, u8
> content_type)
> > {
> >  	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
> @@
> > -2374,6 +2409,9 @@ int intel_hdcp_enable(struct intel_connector
> *connector,
> >  	 * is capable of HDCP2.2, it is preferred to use HDCP2.2.
> >  	 */
> >  	if (intel_hdcp2_capable(connector)) {
> > +		if (intel_crtc_has_type(pipe_config,
> INTEL_OUTPUT_DP_MST))
> > +			intel_hdcp_get_content_stream_id(dig_port, state);
> > +
> 
> The call chain below already leads to:
> 
> _intel_hdcp2_enable()
> hdcp2_authenticate_and_encrypt()
> intel_hdcp_prepare_streams()
> intel_hdcp_required_content_stream() (for MST)
> 
> and as I said, that's almost the same as what you're adding as
> intel_hdcp_get_content_stream_id().
> 
> So I don't get the point of doing almost exactly the same thing twice here.
> 

So the issue here is I want to pass intel_atomic_state to conn_to_vcpi() which was
called in intel_hdcp_required_content_stream() but I cannot get the atomic_state here
as intel_hdcp2_enable gets called in places other than intel_hdcp_enable where its not possible
to derive intel_atomic_state.
But I do see the point and will try to remove redundant code.

Regards,
Suraj Kandpa;
> >  		ret = _intel_hdcp2_enable(connector);
> >  		if (!ret)
> >  			check_link_interval =
> DRM_HDCP2_CHECK_PERIOD_MS; @@ -2486,7
> > +2524,7 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
> >  	}
> >
> >  	if (desired_and_not_enabled || content_protection_type_changed)
> > -		intel_hdcp_enable(connector,
> > +		intel_hdcp_enable(state, connector,
> >  				  crtc_state,
> >  				  (u8)conn_state->hdcp_content_type);
> >  }
> > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.h
> > b/drivers/gpu/drm/i915/display/intel_hdcp.h
> > index 8f53b0c7fe5c..a6f4bf93f9bf 100644
> > --- a/drivers/gpu/drm/i915/display/intel_hdcp.h
> > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.h
> > @@ -28,7 +28,8 @@ void intel_hdcp_atomic_check(struct drm_connector
> > *connector,  int intel_hdcp_init(struct intel_connector *connector,
> >  		    struct intel_digital_port *dig_port,
> >  		    const struct intel_hdcp_shim *hdcp_shim); -int
> > intel_hdcp_enable(struct intel_connector *connector,
> > +int intel_hdcp_enable(struct intel_atomic_state *state,
> > +		      struct intel_connector *connector,
> >  		      const struct intel_crtc_state *pipe_config, u8
> content_type);
> > int intel_hdcp_disable(struct intel_connector *connector);  void
> > intel_hdcp_update_pipe(struct intel_atomic_state *state,
> 
> --
> Jani Nikula, Intel Open Source Graphics Center


More information about the Intel-gfx mailing list