[RFC v1 13/20] drm/hdcp: Updating DRM Property val with HDCP state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Implemented drm_hdcp_update_change() for updating the current
status to the hdcp_property value.

This will update the error status flag incase of encryption failure.
Whenever there is a HDCP state change KOBJ_UEVENT will be broadcasted
to notify the awaiting userspace consumers.

Signed-off-by: Ramalingam C <ramalingam.c@xxxxxxxxx>
---
 drivers/gpu/drm/drm_hdcp.c | 40 ++++++++++++++++++++++++++++++++++++++++
 include/drm/drm_hdcp.h     |  3 +++
 2 files changed, 43 insertions(+)

diff --git a/drivers/gpu/drm/drm_hdcp.c b/drivers/gpu/drm/drm_hdcp.c
index 9b3bf92..9785ab6 100644
--- a/drivers/gpu/drm/drm_hdcp.c
+++ b/drivers/gpu/drm/drm_hdcp.c
@@ -30,6 +30,46 @@
 #include <drm/drm_hdcp.h>
 #include <drm/drm_dp_helper.h>
 
+/*
+ * drm_hdcp_update_change:
+ *		Updating the HDCP property val along with uevent
+ *
+ * @hdcp:	ptr to hdcp instance
+ * @enabled:	status of HDCP encryption
+ * @status:	Error status bits, if auth failed.
+ * @mute:	uevent is mute or not
+ */
+static void drm_hdcp_update_change(struct drm_hdcp *hdcp, bool enabled,
+						uint64_t status, bool mute)
+{
+	struct drm_connector *connector = hdcp->connector;
+	char event_str[30];
+	uint64_t temp_state;
+
+	/* Mutex has to be acquired before entering this function */
+	WARN_ON(!mutex_is_locked(&hdcp->mutex));
+	temp_state = connector->hdcp_state;
+
+	if (enabled) {
+		temp_state &= ~(DRM_HDCP_ENABLE | DRM_HDCP_TYPE_MASK
+						| DRM_HDCP_STATUS_MASK);
+		temp_state |= hdcp->req_state;
+	} else {
+		temp_state &= DRM_HDCP_VER_SUPPORT_MASK;
+		temp_state |= (status & DRM_HDCP_STATUS_MASK);
+	}
+
+	connector->hdcp_state = temp_state;
+
+	if (!mute) {
+		sprintf(event_str, "HDCP=0x%llx", connector->hdcp_state);
+
+		/* Generating the uevent with custom string */
+		drm_sysfs_generate_uevent(hdcp->connector->dev, event_str);
+	}
+}
+
+
 int drm_hdcp_enable(struct drm_connector *connector, uint8_t stream_type)
 {
 	struct drm_hdcp *hdcp = connector->hdcp;
diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h
index eb7149b..d5adbf5 100644
--- a/include/drm/drm_hdcp.h
+++ b/include/drm/drm_hdcp.h
@@ -163,6 +163,9 @@ struct drm_hdcp {
 #define DRM_HDCP_TYPE_SHIFT			4
 #define DRM_HDCP_TYPE_MASK			(0xFFULL<<DRM_HDCP_TYPE_SHIFT)
 
+#define DRM_HDCP_STATUS_SHIFT			20
+#define DRM_HDCP_STATUS_MASK			(0xFULL<<DRM_HDCP_STATUS_SHIFT)
+
 /* Functions exported */
 extern int drm_hdcp_init(struct drm_connector *connector,
 					struct drm_hdcp *hdcp,
-- 
2.7.4

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




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux