All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Paul <seanpaul@chromium.org>
To: dri-devel@lists.freedesktop.org
Subject: [PATCH 2/2] drm: Add Content Protection Desired property to drm
Date: Wed,  3 Dec 2014 11:57:41 -0800	[thread overview]
Message-ID: <1417636661-31579-2-git-send-email-seanpaul@chromium.org> (raw)
In-Reply-To: <1417636661-31579-1-git-send-email-seanpaul@chromium.org>

Add a new standard connector property to track whether content protection
(ex: hdcp) is desired by userspace. While there are 3 possible states for the
property, userspace should only change the value to desired or undesired.
Upon setting the value to desired, the driver is responsible for protecting
the link and setting the value to enabled. Disabling protection should happen
immediately.

Cc: Rob Clark <robdclark@gmail.com>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
---
 Documentation/DocBook/drm.tmpl | 19 +++++++++++++++++--
 drivers/gpu/drm/drm_crtc.c     | 14 ++++++++++++++
 drivers/gpu/drm/drm_sysfs.c    | 22 ++++++++++++++++++++++
 include/drm/drm_crtc.h         |  2 ++
 include/uapi/drm/drm_mode.h    |  5 +++++
 5 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index 85287cb..86633f2 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -2546,8 +2546,8 @@ void intel_crt_init(struct drm_device *dev)
 	<td valign="top" >Description/Restrictions</td>
 	</tr>
 	<tr>
-	<td rowspan="24" valign="top" >DRM</td>
-	<td rowspan="3" valign="top" >Generic</td>
+	<td rowspan="25" valign="top" >DRM</td>
+	<td rowspan="4" valign="top" >Generic</td>
 	<td valign="top" >“EDID”</td>
 	<td valign="top" >BLOB | IMMUTABLE</td>
 	<td valign="top" >0</td>
@@ -2562,6 +2562,21 @@ void intel_crt_init(struct drm_device *dev)
 	<td valign="top" >Contains DPMS operation mode value.</td>
 	</tr>
 	<tr>
+	<td valign="top" >“Content Protection”</td>
+	<td valign="top" >ENUM</td>
+	<td valign="top" >{ “Undesired”, “Desired”, “Enabled” }</td>
+	<td valign="top" >Connector</td>
+	<td valign="top" >Contains the current state of content protection on
+		the link. User space should set this property to "Desired" to
+		enable protection. Once the driver has authenticated the
+		connection, it shall set the value to "Enabled". To disable
+		protection, user space shall set the value to "Undesired", which
+		will tear down the encryption. If at any point the link becomes
+		unprotected, the driver shall transition from "Enabled" down to
+		"Desired" and may retry if appropriate.
+	</td>
+	</tr>
+	<tr>
 	<td valign="top" >“PATH”</td>
 	<td valign="top" >BLOB | IMMUTABLE</td>
 	<td valign="top" >0</td>
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index de79283..5df5b7b 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -77,6 +77,14 @@ static const struct drm_prop_enum_list drm_plane_type_enum_list[] =
 	{ DRM_PLANE_TYPE_CURSOR, "Cursor" },
 };
 
+static struct drm_prop_enum_list drm_cp_enum_list[] = {
+	{ DRM_MODE_CONTENT_PROTECTION_UNDESIRED, "Undesired" },
+	{ DRM_MODE_CONTENT_PROTECTION_DESIRED, "Desired" },
+	{ DRM_MODE_CONTENT_PROTECTION_ENABLED, "Enabled" },
+};
+
+DRM_ENUM_NAME_FN(drm_get_content_protection_name, drm_cp_enum_list)
+
 /*
  * Optional properties
  */
@@ -1319,6 +1327,7 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
 	struct drm_property *edid;
 	struct drm_property *dpms;
 	struct drm_property *dev_path;
+	struct drm_property *content_protection;
 
 	/*
 	 * Standard properties (apply to all connectors)
@@ -1339,6 +1348,11 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
 				       "PATH", 0);
 	dev->mode_config.path_property = dev_path;
 
+	content_protection = drm_property_create_enum(dev, 0,
+			"Content Protection", drm_cp_enum_list,
+			ARRAY_SIZE(drm_cp_enum_list));
+	dev->mode_config.content_protection_property = content_protection;
+
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index cc3d6d6..b4019b5 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -214,6 +214,27 @@ static ssize_t enabled_show(struct device *device,
 			"disabled");
 }
 
+static ssize_t content_protection_show(struct device *device,
+				struct device_attribute *attr, char *buf)
+{
+	struct drm_connector *connector = to_drm_connector(device);
+	struct drm_device *dev = connector->dev;
+	struct drm_property *prop;
+	uint64_t cp;
+	int ret;
+
+	prop = dev->mode_config.content_protection_property;
+	if (!prop)
+		return 0;
+
+	ret = drm_object_property_get_value(&connector->base, prop, &cp);
+	if (ret)
+		return 0;
+
+	return snprintf(buf, PAGE_SIZE, "%s\n",
+			drm_get_content_protection_name((int)cp));
+}
+
 static ssize_t edid_show(struct file *filp, struct kobject *kobj,
 			 struct bin_attribute *attr, char *buf, loff_t off,
 			 size_t count)
@@ -344,6 +365,7 @@ static struct device_attribute connector_attrs[] = {
 	__ATTR_RO(enabled),
 	__ATTR_RO(dpms),
 	__ATTR_RO(modes),
+	__ATTR_RO(content_protection),
 };
 
 /* These attributes are for both DVI-I connectors and all types of tv-out. */
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index dd2c16e..b185f13 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1023,6 +1023,7 @@ struct drm_mode_config {
 	struct drm_property *path_property;
 	struct drm_property *plane_type_property;
 	struct drm_property *rotation_property;
+	struct drm_property *content_protection_property;
 
 	/* DVI-I properties */
 	struct drm_property *dvi_i_subconnector_property;
@@ -1171,6 +1172,7 @@ extern void drm_encoder_cleanup(struct drm_encoder *encoder);
 extern const char *drm_get_connector_status_name(enum drm_connector_status status);
 extern const char *drm_get_subpixel_order_name(enum subpixel_order order);
 extern const char *drm_get_dpms_name(int val);
+extern const char *drm_get_content_protection_name(int val);
 extern const char *drm_get_dvi_i_subconnector_name(int val);
 extern const char *drm_get_dvi_i_select_name(int val);
 extern const char *drm_get_tv_subconnector_name(int val);
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index 86574b0..e1f0e41 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -81,6 +81,11 @@
 #define DRM_MODE_DPMS_SUSPEND	2
 #define DRM_MODE_DPMS_OFF	3
 
+/* Content Protection Flags */
+#define DRM_MODE_CONTENT_PROTECTION_UNDESIRED   0
+#define DRM_MODE_CONTENT_PROTECTION_DESIRED     1
+#define DRM_MODE_CONTENT_PROTECTION_ENABLED     2
+
 /* Scaling mode options */
 #define DRM_MODE_SCALE_NONE		0 /* Unmodified timing (display or
 					     software can still scale) */
-- 
2.2.0.rc0.207.ga3a616c

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2014-12-03 19:57 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-03 19:57 [PATCH 1/2] drm/Documentation: Fix rowspan value in drm-kms-properties Sean Paul
2014-12-03 19:57 ` Sean Paul [this message]
2014-12-03 21:31   ` [PATCH 2/2] drm: Add Content Protection Desired property to drm Ville Syrjälä
2014-12-04 10:03     ` Daniel Vetter
2014-12-04 15:47       ` Rob Clark
2014-12-04 19:03       ` [PATCH v2 2/2] drm: Add Content Protection properties " Sean Paul
2016-12-20 18:36         ` Daniel Vetter
2014-12-04 10:03 ` [PATCH 1/2] drm/Documentation: Fix rowspan value in drm-kms-properties Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1417636661-31579-2-git-send-email-seanpaul@chromium.org \
    --to=seanpaul@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.