Message ID | 20190708112116.1780-5-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | HDCP2.2 Phase II | expand |
On Mon, 8 Jul 2019 16:51:14 +0530 Ramalingam C <ramalingam.c@intel.com> wrote: > drm function is defined and exported to update a connector's > content protection property state and to generate a uevent along > with it. > > Need ACK for the uevent from userspace consumer. > > v2: > Update only when state is different from old one. > v3: > KDoc is added [Daniel] > v4: > KDoc is extended bit more [pekka] > v5: > Uevent usage is documented at kdoc of "Content Protection" also > [pekka] > > Signed-off-by: Ramalingam C <ramalingam.c@intel.com> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> > --- > drivers/gpu/drm/drm_connector.c | 17 +++++++++++++---- > drivers/gpu/drm/drm_hdcp.c | 34 +++++++++++++++++++++++++++++++++ > include/drm/drm_hdcp.h | 2 ++ > 3 files changed, 49 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c > index 732f6645643d..6de906ef10b3 100644 > --- a/drivers/gpu/drm/drm_connector.c > +++ b/drivers/gpu/drm/drm_connector.c > @@ -947,10 +947,19 @@ static const struct drm_prop_enum_list hdmi_colorspaces[] = { > * - If the state is DESIRED, kernel should attempt to re-authenticate the > * link whenever possible. This includes across disable/enable, dpms, > * hotplug, downstream device changes, link status failures, etc.. > - * - Userspace is responsible for polling the property to determine when > - * 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). > + * - Kernel sends uevent with the connector id and property id through > + * @drm_hdcp_update_content_protection, upon below kernel triggered > + * scenarios: > + * DESIRED -> ENABLED (authentication success) > + * ENABLED -> DESIRED (termination of authentication) > + * - Please note no uevents for userspace triggered property state changes, > + * which can't fail such as > + * DESIRED/ENABLED -> UNDESIRED > + * UNDESIRED -> DESIRED > + * - Userspace is responsible for polling the property or listen to uevents > + * to determine when 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). Yes! This doc is exactly what I hoped to see. Good job. This is also exactly how https://gitlab.freedesktop.org/wayland/weston/merge_requests/48 deals with this in userspace. That MR still has some open issues, but I think nothing related to the uevent. Thanks, pq > * > * HDCP Content Type: > * This Enum property is used by the userspace to declare the content type > diff --git a/drivers/gpu/drm/drm_hdcp.c b/drivers/gpu/drm/drm_hdcp.c > index ce235fd1c844..77433ee3d652 100644 > --- a/drivers/gpu/drm/drm_hdcp.c > +++ b/drivers/gpu/drm/drm_hdcp.c > @@ -374,6 +374,10 @@ DRM_ENUM_NAME_FN(drm_get_hdcp_content_type_name, > * > * The content protection will be set to &drm_connector_state.content_protection > * > + * When kernel triggered content protection state change like DESIRED->ENABLED > + * and ENABLED->DESIRED, will use drm_hdcp_update_content_protection() to update > + * the content protection state of a connector. > + * > * Returns: > * Zero on success, negative errno on failure. > */ > @@ -414,3 +418,33 @@ int drm_connector_attach_content_protection_property( > return 0; > } > EXPORT_SYMBOL(drm_connector_attach_content_protection_property); > + > +/** > + * drm_hdcp_update_content_protection - Updates the content protection state > + * of a connector > + * > + * @connector: drm_connector on which content protection state needs an update > + * @val: New state of the content protection property > + * > + * This function can be used by display drivers, to update the kernel triggered > + * content protection state changes of a drm_connector such as DESIRED->ENABLED > + * and ENABLED->DESIRED. No uevent for DESIRED->UNDESIRED or ENABLED->UNDESIRED, > + * as userspace is triggering such state change and kernel performs it without > + * fail.This function update the new state of the property into the connector's > + * state and generate an uevent to notify the userspace. > + */ > +void drm_hdcp_update_content_protection(struct drm_connector *connector, > + u64 val) > +{ > + struct drm_device *dev = connector->dev; > + struct drm_connector_state *state = connector->state; > + > + WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); > + if (state->content_protection == val) > + return; > + > + state->content_protection = val; > + drm_sysfs_connector_status_event(connector, > + dev->mode_config.content_protection_property); > +} > +EXPORT_SYMBOL(drm_hdcp_update_content_protection); > diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h > index 2970abdfaf12..dd864ac9ce85 100644 > --- a/include/drm/drm_hdcp.h > +++ b/include/drm/drm_hdcp.h > @@ -292,4 +292,6 @@ bool drm_hdcp_check_ksvs_revoked(struct drm_device *dev, > u8 *ksvs, u32 ksv_count); > int drm_connector_attach_content_protection_property( > struct drm_connector *connector, bool hdcp_content_type); > +void drm_hdcp_update_content_protection(struct drm_connector *connector, > + u64 val); > #endif
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 732f6645643d..6de906ef10b3 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -947,10 +947,19 @@ static const struct drm_prop_enum_list hdmi_colorspaces[] = { * - If the state is DESIRED, kernel should attempt to re-authenticate the * link whenever possible. This includes across disable/enable, dpms, * hotplug, downstream device changes, link status failures, etc.. - * - Userspace is responsible for polling the property to determine when - * 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). + * - Kernel sends uevent with the connector id and property id through + * @drm_hdcp_update_content_protection, upon below kernel triggered + * scenarios: + * DESIRED -> ENABLED (authentication success) + * ENABLED -> DESIRED (termination of authentication) + * - Please note no uevents for userspace triggered property state changes, + * which can't fail such as + * DESIRED/ENABLED -> UNDESIRED + * UNDESIRED -> DESIRED + * - Userspace is responsible for polling the property or listen to uevents + * to determine when 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). * * HDCP Content Type: * This Enum property is used by the userspace to declare the content type diff --git a/drivers/gpu/drm/drm_hdcp.c b/drivers/gpu/drm/drm_hdcp.c index ce235fd1c844..77433ee3d652 100644 --- a/drivers/gpu/drm/drm_hdcp.c +++ b/drivers/gpu/drm/drm_hdcp.c @@ -374,6 +374,10 @@ DRM_ENUM_NAME_FN(drm_get_hdcp_content_type_name, * * The content protection will be set to &drm_connector_state.content_protection * + * When kernel triggered content protection state change like DESIRED->ENABLED + * and ENABLED->DESIRED, will use drm_hdcp_update_content_protection() to update + * the content protection state of a connector. + * * Returns: * Zero on success, negative errno on failure. */ @@ -414,3 +418,33 @@ int drm_connector_attach_content_protection_property( return 0; } EXPORT_SYMBOL(drm_connector_attach_content_protection_property); + +/** + * drm_hdcp_update_content_protection - Updates the content protection state + * of a connector + * + * @connector: drm_connector on which content protection state needs an update + * @val: New state of the content protection property + * + * This function can be used by display drivers, to update the kernel triggered + * content protection state changes of a drm_connector such as DESIRED->ENABLED + * and ENABLED->DESIRED. No uevent for DESIRED->UNDESIRED or ENABLED->UNDESIRED, + * as userspace is triggering such state change and kernel performs it without + * fail.This function update the new state of the property into the connector's + * state and generate an uevent to notify the userspace. + */ +void drm_hdcp_update_content_protection(struct drm_connector *connector, + u64 val) +{ + struct drm_device *dev = connector->dev; + struct drm_connector_state *state = connector->state; + + WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); + if (state->content_protection == val) + return; + + state->content_protection = val; + drm_sysfs_connector_status_event(connector, + dev->mode_config.content_protection_property); +} +EXPORT_SYMBOL(drm_hdcp_update_content_protection); diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h index 2970abdfaf12..dd864ac9ce85 100644 --- a/include/drm/drm_hdcp.h +++ b/include/drm/drm_hdcp.h @@ -292,4 +292,6 @@ bool drm_hdcp_check_ksvs_revoked(struct drm_device *dev, u8 *ksvs, u32 ksv_count); int drm_connector_attach_content_protection_property( struct drm_connector *connector, bool hdcp_content_type); +void drm_hdcp_update_content_protection(struct drm_connector *connector, + u64 val); #endif