[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