[PATCH 2/2] drm: Add Content Protection Desired property to drm

Ville Syrjälä ville.syrjala at linux.intel.com
Wed Dec 3 13:31:47 PST 2014


On Wed, Dec 03, 2014 at 11:57:41AM -0800, Sean Paul wrote:
> 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.

Having a magic part r/w part r/o property doesn't sound very appealing
to me. I'm thinking it would be cleaner to just have two properties for
such things.

> 
> Cc: Rob Clark <robdclark at gmail.com>
> Signed-off-by: Sean Paul <seanpaul at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel OTC


More information about the dri-devel mailing list