[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 dri-devel
mailing list