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@xxxxxxxxx> > --- > 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx