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@xxxxxxxxx> > Signed-off-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel -- Ville Syrjälä Intel OTC _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel