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@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) {
} else if (property == config->writeback_fb_id_property) { /* Writeback framebuffer is one-shot, write and forget */ *val = 0;*val = state->cp_content_type;
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