Re: [Intel-gfx] [PATCH v3 32/40] drm/i915: Enable superior HDCP ver that is capable

2018-05-21 Thread Ramalingam C



On Friday 18 May 2018 06:19 PM, Shankar, Uma wrote:



-Original Message-
From: Intel-gfx [mailto:intel-gfx-boun...@lists.freedesktop.org] On Behalf Of
Ramalingam C
Sent: Tuesday, April 3, 2018 7:28 PM
To: intel-gfx@lists.freedesktop.org; dri-de...@lists.freedesktop.org;
seanp...@chromium.org; dan...@ffwll.ch; ch...@chris-wilson.co.uk;
jani.nik...@linux.intel.com; Winkler, Tomas ;
Usyskin, Alexander 
Cc: Vivi, Rodrigo 
Subject: [Intel-gfx] [PATCH v3 32/40] drm/i915: Enable superior HDCP ver that is
capable

Considering that HDCP2.2 is more secure than HDCP1.4, When a setup supports
HDCP2.2 and HDCP1.4, HDCP2.2 will be enabled.

v2:
  Included few optimization suggestions [Chris Wilson]
  Commit message is updated as per the rebased version.
v3:
  No changes.

Signed-off-by: Ramalingam C 
---
drivers/gpu/drm/i915/intel_hdcp.c | 76
+++
1 file changed, 69 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_hdcp.c
b/drivers/gpu/drm/i915/intel_hdcp.c
index 383e35689fbd..01701d7b7b07 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -27,6 +27,57 @@ static int _intel_hdcp2_disable(struct intel_connector
*connector);  static void intel_hdcp2_check_work(struct work_struct *work);
static int intel_hdcp2_check_link(struct intel_connector *connector);  static 
int
intel_hdcp2_init(struct intel_connector *connector);
+static inline
+int intel_hdcp_read_valid_bksv(struct intel_digital_port *intel_dig_port,
+  const struct intel_hdcp_shim *shim, u8 *bksv); 
static
struct
+intel_digital_port *conn_to_dig_port(struct intel_connector
+*connector);
+
+static inline

Don’t have it as inline.


+bool panel_supports_hdcp(struct intel_connector *connector) {
+   struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
+   struct intel_hdcp *hdcp = &connector->hdcp;
+   bool capable = false;
+   u8 bksv[5];
+
+   if (hdcp->hdcp_shim) {
+   if (hdcp->hdcp_shim->hdcp_capable) {
+   hdcp->hdcp_shim->hdcp_capable(intel_dig_port,
&capable);
+   } else {
+   if (!intel_hdcp_read_valid_bksv(intel_dig_port,
+   hdcp->hdcp_shim,
bksv))
+   capable = true;
+   }
+   }

Leave a blank line.


+   return capable;
+}
+
+static inline
+bool panel_supports_hdcp2(struct intel_connector *connector) {
+   struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
+   struct intel_hdcp *hdcp = &connector->hdcp;
+   bool capable = false;
+
+   if (hdcp->hdcp2_supported)
+   hdcp->hdcp_shim->hdcp_2_2_capable(intel_dig_port, &capable);

This looks a bit odd. We are going inside if hdcp2.2 is supported and checking 
for capable.
I guess it needs a bit of renaming to make them implicit(Supported and capable 
sounds
confusing). I believe supported is for platform and capable is for panel ?
As function name says, here we are checking the panel's hdcp2.2 
compliance if the platform supports it.

I will add Explicit comment here.

Ram



+
+   return capable;
+}
+
+/* Is HDCP1.4 capable on Platform and Panel */ static inline bool
+intel_hdcp_capable(struct intel_connector *connector) {
+   return (connector->hdcp.hdcp_shim &&
panel_supports_hdcp(connector));
+}
+
+/* Is HDCP2.2 capable on Platform and Panel */ static inline bool
+intel_hdcp2_capable(struct intel_connector *connector) {
+   return (connector->hdcp.hdcp2_supported &&
+   panel_supports_hdcp2(connector));
+}

static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
const struct intel_hdcp_shim *shim) @@ -
722,20 +773,27 @@ int intel_hdcp_init(struct intel_connector *connector,  int
intel_hdcp_enable(struct intel_connector *connector)  {
struct intel_hdcp *hdcp = &connector->hdcp;
-   int ret;
+   int ret = -EINVAL;

if (!hdcp->hdcp_shim)
return -ENOENT;

mutex_lock(&hdcp->hdcp_mutex);

-   ret = _intel_hdcp_enable(connector);
-   if (ret)
-   goto out;
+   /*
+* Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
+* is capable of HDCP2.2, it is preferred to use HDCP2.2.
+*/
+   if (intel_hdcp2_capable(connector))
+   ret = _intel_hdcp2_enable(connector);
+   else if (intel_hdcp_capable(connector))
+   ret = _intel_hdcp_enable(connector);
+
+   if (!ret) {
+   hdcp->hdcp_value =
DRM_MODE_CONTENT_PROTECTION_ENABLED;
+   schedule_work(&hdcp->hdcp_prop_work);
+   }

-   hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
-   schedule_work(&hdcp-&g

Re: [Intel-gfx] [PATCH v3 32/40] drm/i915: Enable superior HDCP ver that is capable

2018-05-18 Thread Shankar, Uma


>-Original Message-
>From: Intel-gfx [mailto:intel-gfx-boun...@lists.freedesktop.org] On Behalf Of
>Ramalingam C
>Sent: Tuesday, April 3, 2018 7:28 PM
>To: intel-gfx@lists.freedesktop.org; dri-de...@lists.freedesktop.org;
>seanp...@chromium.org; dan...@ffwll.ch; ch...@chris-wilson.co.uk;
>jani.nik...@linux.intel.com; Winkler, Tomas ;
>Usyskin, Alexander 
>Cc: Vivi, Rodrigo 
>Subject: [Intel-gfx] [PATCH v3 32/40] drm/i915: Enable superior HDCP ver that 
>is
>capable
>
>Considering that HDCP2.2 is more secure than HDCP1.4, When a setup supports
>HDCP2.2 and HDCP1.4, HDCP2.2 will be enabled.
>
>v2:
>  Included few optimization suggestions [Chris Wilson]
>  Commit message is updated as per the rebased version.
>v3:
>  No changes.
>
>Signed-off-by: Ramalingam C 
>---
> drivers/gpu/drm/i915/intel_hdcp.c | 76
>+++
> 1 file changed, 69 insertions(+), 7 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/intel_hdcp.c
>b/drivers/gpu/drm/i915/intel_hdcp.c
>index 383e35689fbd..01701d7b7b07 100644
>--- a/drivers/gpu/drm/i915/intel_hdcp.c
>+++ b/drivers/gpu/drm/i915/intel_hdcp.c
>@@ -27,6 +27,57 @@ static int _intel_hdcp2_disable(struct intel_connector
>*connector);  static void intel_hdcp2_check_work(struct work_struct *work);
>static int intel_hdcp2_check_link(struct intel_connector *connector);  static 
>int
>intel_hdcp2_init(struct intel_connector *connector);
>+static inline
>+int intel_hdcp_read_valid_bksv(struct intel_digital_port *intel_dig_port,
>+ const struct intel_hdcp_shim *shim, u8 *bksv); 
>static
>struct
>+intel_digital_port *conn_to_dig_port(struct intel_connector
>+*connector);
>+
>+static inline

Don’t have it as inline.

>+bool panel_supports_hdcp(struct intel_connector *connector) {
>+  struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
>+  struct intel_hdcp *hdcp = &connector->hdcp;
>+  bool capable = false;
>+  u8 bksv[5];
>+
>+  if (hdcp->hdcp_shim) {
>+  if (hdcp->hdcp_shim->hdcp_capable) {
>+  hdcp->hdcp_shim->hdcp_capable(intel_dig_port,
>&capable);
>+  } else {
>+  if (!intel_hdcp_read_valid_bksv(intel_dig_port,
>+  hdcp->hdcp_shim,
>bksv))
>+  capable = true;
>+  }
>+  }

Leave a blank line.

>+  return capable;
>+}
>+
>+static inline
>+bool panel_supports_hdcp2(struct intel_connector *connector) {
>+  struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
>+  struct intel_hdcp *hdcp = &connector->hdcp;
>+  bool capable = false;
>+
>+  if (hdcp->hdcp2_supported)
>+  hdcp->hdcp_shim->hdcp_2_2_capable(intel_dig_port, &capable);

This looks a bit odd. We are going inside if hdcp2.2 is supported and checking 
for capable.
I guess it needs a bit of renaming to make them implicit(Supported and capable 
sounds
confusing). I believe supported is for platform and capable is for panel ?

>+
>+  return capable;
>+}
>+
>+/* Is HDCP1.4 capable on Platform and Panel */ static inline bool
>+intel_hdcp_capable(struct intel_connector *connector) {
>+  return (connector->hdcp.hdcp_shim &&
>panel_supports_hdcp(connector));
>+}
>+
>+/* Is HDCP2.2 capable on Platform and Panel */ static inline bool
>+intel_hdcp2_capable(struct intel_connector *connector) {
>+  return (connector->hdcp.hdcp2_supported &&
>+  panel_supports_hdcp2(connector));
>+}
>
> static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
>   const struct intel_hdcp_shim *shim) @@ -
>722,20 +773,27 @@ int intel_hdcp_init(struct intel_connector *connector,  int
>intel_hdcp_enable(struct intel_connector *connector)  {
>   struct intel_hdcp *hdcp = &connector->hdcp;
>-  int ret;
>+  int ret = -EINVAL;
>
>   if (!hdcp->hdcp_shim)
>   return -ENOENT;
>
>   mutex_lock(&hdcp->hdcp_mutex);
>
>-  ret = _intel_hdcp_enable(connector);
>-  if (ret)
>-  goto out;
>+  /*
>+   * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
>+   * is capable of HDCP2.2, it is preferred to use HDCP2.2.
>+   */
>+  if (intel_hdcp2_capable(connector))
>+  ret = _intel_hdcp2_enable(connector);
>+  else if (intel_hdcp_capable(connector))
>+  ret = _intel_hdcp_enable(connector);
>+
>+  if (!ret) {
>+  hdcp->hdcp_val

[Intel-gfx] [PATCH v3 32/40] drm/i915: Enable superior HDCP ver that is capable

2018-04-03 Thread Ramalingam C
Considering that HDCP2.2 is more secure than HDCP1.4, When a setup
supports HDCP2.2 and HDCP1.4, HDCP2.2 will be enabled.

v2:
  Included few optimization suggestions [Chris Wilson]
  Commit message is updated as per the rebased version.
v3:
  No changes.

Signed-off-by: Ramalingam C 
---
 drivers/gpu/drm/i915/intel_hdcp.c | 76 +++
 1 file changed, 69 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
b/drivers/gpu/drm/i915/intel_hdcp.c
index 383e35689fbd..01701d7b7b07 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -27,6 +27,57 @@ static int _intel_hdcp2_disable(struct intel_connector 
*connector);
 static void intel_hdcp2_check_work(struct work_struct *work);
 static int intel_hdcp2_check_link(struct intel_connector *connector);
 static int intel_hdcp2_init(struct intel_connector *connector);
+static inline
+int intel_hdcp_read_valid_bksv(struct intel_digital_port *intel_dig_port,
+  const struct intel_hdcp_shim *shim, u8 *bksv);
+static
+struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector);
+
+static inline
+bool panel_supports_hdcp(struct intel_connector *connector)
+{
+   struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
+   struct intel_hdcp *hdcp = &connector->hdcp;
+   bool capable = false;
+   u8 bksv[5];
+
+   if (hdcp->hdcp_shim) {
+   if (hdcp->hdcp_shim->hdcp_capable) {
+   hdcp->hdcp_shim->hdcp_capable(intel_dig_port, &capable);
+   } else {
+   if (!intel_hdcp_read_valid_bksv(intel_dig_port,
+   hdcp->hdcp_shim, bksv))
+   capable = true;
+   }
+   }
+   return capable;
+}
+
+static inline
+bool panel_supports_hdcp2(struct intel_connector *connector)
+{
+   struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
+   struct intel_hdcp *hdcp = &connector->hdcp;
+   bool capable = false;
+
+   if (hdcp->hdcp2_supported)
+   hdcp->hdcp_shim->hdcp_2_2_capable(intel_dig_port, &capable);
+
+   return capable;
+}
+
+/* Is HDCP1.4 capable on Platform and Panel */
+static inline bool intel_hdcp_capable(struct intel_connector *connector)
+{
+   return (connector->hdcp.hdcp_shim && panel_supports_hdcp(connector));
+}
+
+/* Is HDCP2.2 capable on Platform and Panel */
+static inline bool intel_hdcp2_capable(struct intel_connector *connector)
+{
+   return (connector->hdcp.hdcp2_supported &&
+   panel_supports_hdcp2(connector));
+}
 
 static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
const struct intel_hdcp_shim *shim)
@@ -722,20 +773,27 @@ int intel_hdcp_init(struct intel_connector *connector,
 int intel_hdcp_enable(struct intel_connector *connector)
 {
struct intel_hdcp *hdcp = &connector->hdcp;
-   int ret;
+   int ret = -EINVAL;
 
if (!hdcp->hdcp_shim)
return -ENOENT;
 
mutex_lock(&hdcp->hdcp_mutex);
 
-   ret = _intel_hdcp_enable(connector);
-   if (ret)
-   goto out;
+   /*
+* Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
+* is capable of HDCP2.2, it is preferred to use HDCP2.2.
+*/
+   if (intel_hdcp2_capable(connector))
+   ret = _intel_hdcp2_enable(connector);
+   else if (intel_hdcp_capable(connector))
+   ret = _intel_hdcp_enable(connector);
+
+   if (!ret) {
+   hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
+   schedule_work(&hdcp->hdcp_prop_work);
+   }
 
-   hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
-   schedule_work(&hdcp->hdcp_prop_work);
-out:
mutex_unlock(&hdcp->hdcp_mutex);
return ret;
 }
@@ -752,10 +810,14 @@ int intel_hdcp_disable(struct intel_connector *connector)
 
if (hdcp->hdcp_value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
hdcp->hdcp_value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;
+   if (hdcp->hdcp2_supported)
+   _intel_hdcp2_disable(connector);
+
ret = _intel_hdcp_disable(connector);
}
 
mutex_unlock(&hdcp->hdcp_mutex);
+   cancel_delayed_work_sync(&hdcp->hdcp2_check_work);
cancel_delayed_work_sync(&hdcp->hdcp_check_work);
return ret;
 }
-- 
2.7.4

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx