[PATCH 05/11] drm/i915/hdcp: Add new remote capability check shim function

Jani Nikula jani.nikula at linux.intel.com
Fri Feb 9 09:31:04 UTC 2024


On Sun, 04 Feb 2024, Suraj Kandpal <suraj.kandpal at intel.com> wrote:
> Create a remote HDCP capability shim function which can read the
> remote monitor HDCP capability when in MST configuration.
>
> --v2
> -Add an assertion to make sure only mst encoder call this remote_cap
> function [Ankit]
>
> Signed-off-by: Suraj Kandpal <suraj.kandpal at intel.com>
> ---
>  .../drm/i915/display/intel_display_types.h    |  4 +++
>  drivers/gpu/drm/i915/display/intel_dp_hdcp.c  | 26 +++++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_hdcp.c     | 16 ++++++++++++
>  drivers/gpu/drm/i915/display/intel_hdcp.h     |  3 +++
>  4 files changed, 49 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index ae2e8cff9d69..7e7a370a3b30 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -532,6 +532,10 @@ struct intel_hdcp_shim {
>  	/* HDCP2.2 Link Integrity Check */
>  	int (*check_2_2_link)(struct intel_digital_port *dig_port,
>  			      struct intel_connector *connector);
> +
> +	/* HDCP remote sink cap */
> +	int (*remote_hdcp_cap)(struct intel_connector *connector,
> +			       bool *hdcp_capable, bool *hdcp2_capable);
>  };
>  
>  struct intel_hdcp {
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c
> index ef1a4c90c225..ccd274200f92 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c
> @@ -668,6 +668,31 @@ int intel_dp_hdcp2_capable(struct intel_connector *connector,
>  	return _intel_dp_hdcp2_capable(aux, capable);
>  }
>  
> +static
> +int intel_dp_hdcp_remote_cap(struct intel_connector *connector,
> +			     bool *hdcp_capable, bool *hdcp2_capable)
> +{
> +	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> +	struct drm_dp_aux *aux = &connector->port->aux;
> +	u8 bcaps;
> +	int ret;
> +
> +	if (!intel_encoder_is_mst(connector->encoder))
> +		return -EINVAL;
> +
> +	ret =  _intel_dp_hdcp2_capable(aux, hdcp2_capable);
> +	if (ret)
> +		return ret;
> +
> +	ret = intel_dp_hdcp_read_bcaps(aux, i915, &bcaps);
> +	if (ret)
> +		return ret;
> +
> +	*hdcp_capable = bcaps & DP_BCAPS_HDCP_CAPABLE;
> +
> +	return 0;
> +}
> +
>  static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
>  	.write_an_aksv = intel_dp_hdcp_write_an_aksv,
>  	.read_bksv = intel_dp_hdcp_read_bksv,
> @@ -685,6 +710,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
>  	.config_stream_type = intel_dp_hdcp2_config_stream_type,
>  	.check_2_2_link = intel_dp_hdcp2_check_link,
>  	.hdcp_2_2_capable = intel_dp_hdcp2_capable,
> +	.remote_hdcp_cap = intel_dp_hdcp_remote_cap,

Please either call these _cap or _capable, don't mix.

Arguably a function called "capable" sounds like a predicate function
that should return the value. In code,

     if (capable(foo))

is misleading if that's checking the status of the capability read, not
the actual capability.

So maybe these should be called "get capability" or something.

BR,
Jani.


>  	.protocol = HDCP_PROTOCOL_DP,
>  };
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
> index 4593ac10e2fa..2b739249b60c 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
> @@ -205,6 +205,22 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
>  	return capable;
>  }
>  
> +void intel_hdcp_remote_cap(struct intel_connector *connector,
> +			   bool *hdcp_capable,
> +			   bool *hdcp2_capable)
> +{
> +	struct intel_hdcp *hdcp = &connector->hdcp;
> +
> +	/* Remote Sink's capability for HDCP */
> +	if (!hdcp->shim->remote_hdcp_cap)
> +		return;
> +
> +	hdcp->shim->remote_hdcp_cap(connector, hdcp_capable, hdcp2_capable);
> +
> +	if (intel_hdcp2_prerequisite(connector))
> +		*hdcp2_capable = false;
> +}
> +
>  static bool intel_hdcp_in_use(struct drm_i915_private *i915,
>  			      enum transcoder cpu_transcoder, enum port port)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.h b/drivers/gpu/drm/i915/display/intel_hdcp.h
> index a9c784fd9ba5..213d286ca3fa 100644
> --- a/drivers/gpu/drm/i915/display/intel_hdcp.h
> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.h
> @@ -40,6 +40,9 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
>  bool is_hdcp_supported(struct drm_i915_private *i915, enum port port);
>  bool intel_hdcp_capable(struct intel_connector *connector);
>  bool intel_hdcp2_capable(struct intel_connector *connector);
> +void intel_hdcp_remote_cap(struct intel_connector *connector,
> +			   bool *hdcp_capable,
> +			   bool *hdcp2_capable);
>  void intel_hdcp_component_init(struct drm_i915_private *i915);
>  void intel_hdcp_component_fini(struct drm_i915_private *i915);
>  void intel_hdcp_cleanup(struct intel_connector *connector);

-- 
Jani Nikula, Intel


More information about the Intel-gfx mailing list