[Intel-gfx] [PATCH 01/10] drm: Add CP content type property

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Tue Mar 5 14:39:03 UTC 2019


Op 26-02-2019 om 08:36 schreef Ramalingam C:
> This patch adds a DRM ENUM property to the selected connectors.
> This property is used for pass the protected content's type
> from userspace to kernel HDCP authentication.
>
> Type of the stream is decided by the protected content providers as
> Type 0/1.
>
> Type 0 content can be rendered on any HDCP protected display wires.
> But Type 1 content can be rendered only on HDCP2.2 protected paths.
>
> So upon a content protection request with Type 1 as Content type from
> userspace, Kernel will declare success only if the HDCP2.2
> authentication is successful.
>
> Signed-off-by: Ramalingam C <ramalingam.c at intel.com>
> ---
>  drivers/gpu/drm/drm_atomic_uapi.c | 10 ++++++
>  drivers/gpu/drm/drm_connector.c   | 64 +++++++++++++++++++++++++++++++++++++++
>  include/drm/drm_connector.h       | 15 +++++++++
>  include/uapi/drm/drm_mode.h       |  4 +++
>  4 files changed, 93 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index 4eb81f10bc54..5289486565ce 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -746,6 +746,14 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
>  			return -EINVAL;
>  		}
>  		state->content_protection = val;
> +	} else if (property == connector->cp_content_type_property) {
> +		if (state->content_protection !=
> +		    DRM_MODE_CONTENT_PROTECTION_UNDESIRED &&
> +		    state->cp_content_type != val) {
> +			DRM_DEBUG_KMS("Disable CP, then change Type\n");
> +			return -EINVAL;
> +		}
> +		state->cp_content_type = val;

You can't add checks in atomic_set_property.

Until we have the full state, we can't do any checks. This has to be done in the .atomic_check() callback.

Lets say atomic commit consists of the following:
Set Content_Protection to desired.
Set Content Type to Type 1.
atomic setprop will fail

Plus the check itself is bogus. We should be able to change HDCP strictness without a modeset, the same way
we enable and disable HDCP 1.4 with a fastset.

>  	} else if (property == connector->colorspace_property) {
>  		state->colorspace = val;
>  	} else if (property == config->writeback_fb_id_property) {
> @@ -822,6 +830,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
>  		*val = state->scaling_mode;
>  	} else if (property == connector->content_protection_property) {
>  		*val = state->content_protection;
> +	} else if (property == connector->cp_content_type_property) {
> +		*val = state->cp_content_type;
>  	} else if (property == config->writeback_fb_id_property) {
>  		/* Writeback framebuffer is one-shot, write and forget */
>  		*val = 0;
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 07d65a16c623..5d7738e1e977 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -853,6 +853,13 @@ static const struct drm_prop_enum_list hdmi_colorspaces[] = {
>  	{ DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER, "DCI-P3_RGB_Theater" },
>  };
>  
> +static struct drm_prop_enum_list drm_cp_content_type_enum_list[] = {
> +	{ DRM_MODE_CP_CONTENT_TYPE0, "Type 0" },
> +	{ DRM_MODE_CP_CONTENT_TYPE1, "Type 1" },
> +};
> +
> +DRM_ENUM_NAME_FN(drm_get_cp_content_type_name, drm_cp_content_type_enum_list)
> +
>  /**
>   * DOC: standard connector properties
>   *
> @@ -958,6 +965,25 @@ static const struct drm_prop_enum_list hdmi_colorspaces[] = {
>   *	  the value transitions from ENABLED to DESIRED. This signifies the link
>   *	  is no longer protected and userspace should take appropriate action
>   *	  (whatever that might be).
> + * CP_Content_Type:
> + *	This property is used by the userspace to configure the kernel with
> + *	upcoming stream's content type. Content Type of a stream is decided by
> + *	the owner of the stream, as Type 0 or Type 1.
> + *
> + *	The value of the property can be one the below:
> + *	  - DRM_MODE_CP_CONTENT_TYPE0 = 0
> + *		Type 0 streams can be transmitted on a link which is encrypted
> + *		with HDCP 1.4 or HDCP 2.2.
> + *	  - DRM_MODE_CP_CONTENT_TYPE1 = 1
> + *		Type 1 streams can be transmitted on a link which is encrypted
> + *		only with HDCP2.2.
> + *
> + *	Please note this content type is introduced at HDCP2.2 and used in its
> + *	authentication process.
> + *
> + *	Guideline for programming:
> + *	  - Property state can be changed only when "Content Protection state is
> + *		DRM_MODE_CONTENT_PROTECTION_UNDESIRED.

Why? We may need to force a modeset, but this looks like a silly restriction to expose this to userspace.

If userspace doesn't want a modeset, it can clear the DRM_MODE_ATOMIC_ALLOW_MODESET flag on atomic commit.

the intel_atomic_check() callback can force a modeset if required, and atomic core can fail if userspace didn't request it.

~Maarten



More information about the Intel-gfx mailing list