Re: [Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface

2018-05-29 Thread Ramalingam C



On Tuesday 29 May 2018 02:12 PM, Daniel Vetter wrote:

On Tue, May 29, 2018 at 08:53:37AM +0200, Daniel Vetter wrote:

On Fri, May 25, 2018 at 04:42:52PM +0530, Ramalingam C wrote:


On Thursday 24 May 2018 01:36 PM, Daniel Vetter wrote:

On Mon, May 21, 2018 at 06:23:49PM +0530, Ramalingam C wrote:

Initialize HDCP2.2 support. This includes the mei interface
initialization along with required notifier registration.

v2:
mei interface handle is protected with mutex. [Chris Wilson]
v3:
Notifiers are used for the mei interface state.
v4:
Poll for mei client device state
Error msg for out of mem [Uma]
Inline req for init function removed [Uma]

Signed-off-by: Ramalingam C 
---
   drivers/gpu/drm/i915/intel_dp.c   |   3 +-
   drivers/gpu/drm/i915/intel_drv.h  |   5 +-
   drivers/gpu/drm/i915/intel_hdcp.c | 117 
+-
   drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
   4 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 62f82c4298ac..276eb49113e9 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port 
*intel_dig_port,
intel_dp_add_properties(intel_dp, connector);
if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {
-   int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim);
+   int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim,
+ false);
if (ret)
DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ac943ec73987..750fc19f 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -442,7 +442,7 @@ struct intel_hdcp {
/* mei interface related information */
struct mei_cl_device *cldev;
struct mei_hdcp_data mei_data;
-
+   struct notifier_block mei_cldev_nb;
struct delayed_work hdcp2_check_work;
   };
@@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector 
*connector,
 struct drm_connector_state *old_state,
 struct drm_connector_state *new_state);
   int intel_hdcp_init(struct intel_connector *connector,
-   const struct intel_hdcp_shim *hdcp_shim);
+   const struct intel_hdcp_shim *hdcp_shim,
+   bool hdcp2_supported);
   int intel_hdcp_enable(struct intel_connector *connector);
   int intel_hdcp_disable(struct intel_connector *connector);
   int intel_hdcp_check_link(struct intel_connector *connector);
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
b/drivers/gpu/drm/i915/intel_hdcp.c
index f3f935046c31..9948e4b4e203 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -11,6 +11,7 @@
   #include 
   #include 
   #include 
+#include 
   #include "intel_drv.h"
   #include "i915_reg.h"
@@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector 
*connector);
   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 int intel_hdcp_poll_ksv_fifo(struct intel_digital_port 
*intel_dig_port,
const struct intel_hdcp_shim *shim)
@@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, 
enum port port)
   }
   int intel_hdcp_init(struct intel_connector *connector,
-   const struct intel_hdcp_shim *hdcp_shim)
+   const struct intel_hdcp_shim *hdcp_shim,
+   bool hdcp2_supported)
   {
struct intel_hdcp *hdcp = >hdcp;
int ret;
+   if (!hdcp_shim)
+   return -EINVAL;
+
ret = drm_connector_attach_content_protection_property(
>base);
if (ret)
@@ -779,7 +785,12 @@ int intel_hdcp_init(struct intel_connector *connector,
hdcp->hdcp_shim = hdcp_shim;
mutex_init(>hdcp_mutex);
INIT_DELAYED_WORK(>hdcp_check_work, intel_hdcp_check_work);
+   INIT_DELAYED_WORK(>hdcp2_check_work, intel_hdcp2_check_work);
INIT_WORK(>hdcp_prop_work, intel_hdcp_prop_work);
+
+   if (hdcp2_supported)
+   intel_hdcp2_init(connector);
+
return 0;
   }
@@ -1637,3 +1648,107 @@ static void intel_hdcp2_check_work(struct work_struct 
*work)
schedule_delayed_work(>hdcp2_check_work,
  DRM_HDCP2_CHECK_PERIOD_MS);
   }
+
+static int initialize_mei_hdcp_data(struct intel_connector *connector)
+{
+   struct intel_hdcp *hdcp = >hdcp;
+   struct 

Re: [Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface

2018-05-29 Thread Daniel Vetter
On Tue, May 29, 2018 at 08:53:37AM +0200, Daniel Vetter wrote:
> On Fri, May 25, 2018 at 04:42:52PM +0530, Ramalingam C wrote:
> > 
> > 
> > On Thursday 24 May 2018 01:36 PM, Daniel Vetter wrote:
> > > On Mon, May 21, 2018 at 06:23:49PM +0530, Ramalingam C wrote:
> > > > Initialize HDCP2.2 support. This includes the mei interface
> > > > initialization along with required notifier registration.
> > > > 
> > > > v2:
> > > >mei interface handle is protected with mutex. [Chris Wilson]
> > > > v3:
> > > >Notifiers are used for the mei interface state.
> > > > v4:
> > > >Poll for mei client device state
> > > >Error msg for out of mem [Uma]
> > > >Inline req for init function removed [Uma]
> > > > 
> > > > Signed-off-by: Ramalingam C 
> > > > ---
> > > >   drivers/gpu/drm/i915/intel_dp.c   |   3 +-
> > > >   drivers/gpu/drm/i915/intel_drv.h  |   5 +-
> > > >   drivers/gpu/drm/i915/intel_hdcp.c | 117 
> > > > +-
> > > >   drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
> > > >   4 files changed, 122 insertions(+), 5 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/i915/intel_dp.c 
> > > > b/drivers/gpu/drm/i915/intel_dp.c
> > > > index 62f82c4298ac..276eb49113e9 100644
> > > > --- a/drivers/gpu/drm/i915/intel_dp.c
> > > > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > > > @@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port 
> > > > *intel_dig_port,
> > > > intel_dp_add_properties(intel_dp, connector);
> > > > if (is_hdcp_supported(dev_priv, port) && 
> > > > !intel_dp_is_edp(intel_dp)) {
> > > > -   int ret = intel_hdcp_init(intel_connector, 
> > > > _dp_hdcp_shim);
> > > > +   int ret = intel_hdcp_init(intel_connector, 
> > > > _dp_hdcp_shim,
> > > > + false);
> > > > if (ret)
> > > > DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
> > > > }
> > > > diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> > > > b/drivers/gpu/drm/i915/intel_drv.h
> > > > index ac943ec73987..750fc19f 100644
> > > > --- a/drivers/gpu/drm/i915/intel_drv.h
> > > > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > > > @@ -442,7 +442,7 @@ struct intel_hdcp {
> > > > /* mei interface related information */
> > > > struct mei_cl_device *cldev;
> > > > struct mei_hdcp_data mei_data;
> > > > -
> > > > +   struct notifier_block mei_cldev_nb;
> > > > struct delayed_work hdcp2_check_work;
> > > >   };
> > > > @@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector 
> > > > *connector,
> > > >  struct drm_connector_state *old_state,
> > > >  struct drm_connector_state *new_state);
> > > >   int intel_hdcp_init(struct intel_connector *connector,
> > > > -   const struct intel_hdcp_shim *hdcp_shim);
> > > > +   const struct intel_hdcp_shim *hdcp_shim,
> > > > +   bool hdcp2_supported);
> > > >   int intel_hdcp_enable(struct intel_connector *connector);
> > > >   int intel_hdcp_disable(struct intel_connector *connector);
> > > >   int intel_hdcp_check_link(struct intel_connector *connector);
> > > > diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
> > > > b/drivers/gpu/drm/i915/intel_hdcp.c
> > > > index f3f935046c31..9948e4b4e203 100644
> > > > --- a/drivers/gpu/drm/i915/intel_hdcp.c
> > > > +++ b/drivers/gpu/drm/i915/intel_hdcp.c
> > > > @@ -11,6 +11,7 @@
> > > >   #include 
> > > >   #include 
> > > >   #include 
> > > > +#include 
> > > >   #include "intel_drv.h"
> > > >   #include "i915_reg.h"
> > > > @@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector 
> > > > *connector);
> > > >   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 int intel_hdcp_poll_ksv_fifo(struct intel_digital_port 
> > > > *intel_dig_port,
> > > > const struct intel_hdcp_shim *shim)
> > > > @@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private 
> > > > *dev_priv, enum port port)
> > > >   }
> > > >   int intel_hdcp_init(struct intel_connector *connector,
> > > > -   const struct intel_hdcp_shim *hdcp_shim)
> > > > +   const struct intel_hdcp_shim *hdcp_shim,
> > > > +   bool hdcp2_supported)
> > > >   {
> > > > struct intel_hdcp *hdcp = >hdcp;
> > > > int ret;
> > > > +   if (!hdcp_shim)
> > > > +   return -EINVAL;
> > > > +
> > > > ret = drm_connector_attach_content_protection_property(
> > > > >base);
> > > > if (ret)
> > > > @@ -779,7 +785,12 @@ int intel_hdcp_init(struct 

Re: [Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface

2018-05-29 Thread Daniel Vetter
On Fri, May 25, 2018 at 04:42:52PM +0530, Ramalingam C wrote:
> 
> 
> On Thursday 24 May 2018 01:36 PM, Daniel Vetter wrote:
> > On Mon, May 21, 2018 at 06:23:49PM +0530, Ramalingam C wrote:
> > > Initialize HDCP2.2 support. This includes the mei interface
> > > initialization along with required notifier registration.
> > > 
> > > v2:
> > >mei interface handle is protected with mutex. [Chris Wilson]
> > > v3:
> > >Notifiers are used for the mei interface state.
> > > v4:
> > >Poll for mei client device state
> > >Error msg for out of mem [Uma]
> > >Inline req for init function removed [Uma]
> > > 
> > > Signed-off-by: Ramalingam C 
> > > ---
> > >   drivers/gpu/drm/i915/intel_dp.c   |   3 +-
> > >   drivers/gpu/drm/i915/intel_drv.h  |   5 +-
> > >   drivers/gpu/drm/i915/intel_hdcp.c | 117 
> > > +-
> > >   drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
> > >   4 files changed, 122 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/intel_dp.c 
> > > b/drivers/gpu/drm/i915/intel_dp.c
> > > index 62f82c4298ac..276eb49113e9 100644
> > > --- a/drivers/gpu/drm/i915/intel_dp.c
> > > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > > @@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port 
> > > *intel_dig_port,
> > >   intel_dp_add_properties(intel_dp, connector);
> > >   if (is_hdcp_supported(dev_priv, port) && 
> > > !intel_dp_is_edp(intel_dp)) {
> > > - int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim);
> > > + int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim,
> > > +   false);
> > >   if (ret)
> > >   DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
> > >   }
> > > diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> > > b/drivers/gpu/drm/i915/intel_drv.h
> > > index ac943ec73987..750fc19f 100644
> > > --- a/drivers/gpu/drm/i915/intel_drv.h
> > > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > > @@ -442,7 +442,7 @@ struct intel_hdcp {
> > >   /* mei interface related information */
> > >   struct mei_cl_device *cldev;
> > >   struct mei_hdcp_data mei_data;
> > > -
> > > + struct notifier_block mei_cldev_nb;
> > >   struct delayed_work hdcp2_check_work;
> > >   };
> > > @@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector 
> > > *connector,
> > >struct drm_connector_state *old_state,
> > >struct drm_connector_state *new_state);
> > >   int intel_hdcp_init(struct intel_connector *connector,
> > > - const struct intel_hdcp_shim *hdcp_shim);
> > > + const struct intel_hdcp_shim *hdcp_shim,
> > > + bool hdcp2_supported);
> > >   int intel_hdcp_enable(struct intel_connector *connector);
> > >   int intel_hdcp_disable(struct intel_connector *connector);
> > >   int intel_hdcp_check_link(struct intel_connector *connector);
> > > diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
> > > b/drivers/gpu/drm/i915/intel_hdcp.c
> > > index f3f935046c31..9948e4b4e203 100644
> > > --- a/drivers/gpu/drm/i915/intel_hdcp.c
> > > +++ b/drivers/gpu/drm/i915/intel_hdcp.c
> > > @@ -11,6 +11,7 @@
> > >   #include 
> > >   #include 
> > >   #include 
> > > +#include 
> > >   #include "intel_drv.h"
> > >   #include "i915_reg.h"
> > > @@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector 
> > > *connector);
> > >   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 int intel_hdcp_poll_ksv_fifo(struct intel_digital_port 
> > > *intel_dig_port,
> > >   const struct intel_hdcp_shim *shim)
> > > @@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private 
> > > *dev_priv, enum port port)
> > >   }
> > >   int intel_hdcp_init(struct intel_connector *connector,
> > > - const struct intel_hdcp_shim *hdcp_shim)
> > > + const struct intel_hdcp_shim *hdcp_shim,
> > > + bool hdcp2_supported)
> > >   {
> > >   struct intel_hdcp *hdcp = >hdcp;
> > >   int ret;
> > > + if (!hdcp_shim)
> > > + return -EINVAL;
> > > +
> > >   ret = drm_connector_attach_content_protection_property(
> > >   >base);
> > >   if (ret)
> > > @@ -779,7 +785,12 @@ int intel_hdcp_init(struct intel_connector 
> > > *connector,
> > >   hdcp->hdcp_shim = hdcp_shim;
> > >   mutex_init(>hdcp_mutex);
> > >   INIT_DELAYED_WORK(>hdcp_check_work, 
> > > intel_hdcp_check_work);
> > > + INIT_DELAYED_WORK(>hdcp2_check_work, intel_hdcp2_check_work);
> > >   INIT_WORK(>hdcp_prop_work, 

Re: [Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface

2018-05-25 Thread Ramalingam C



On Thursday 24 May 2018 01:36 PM, Daniel Vetter wrote:

On Mon, May 21, 2018 at 06:23:49PM +0530, Ramalingam C wrote:

Initialize HDCP2.2 support. This includes the mei interface
initialization along with required notifier registration.

v2:
   mei interface handle is protected with mutex. [Chris Wilson]
v3:
   Notifiers are used for the mei interface state.
v4:
   Poll for mei client device state
   Error msg for out of mem [Uma]
   Inline req for init function removed [Uma]

Signed-off-by: Ramalingam C 
---
  drivers/gpu/drm/i915/intel_dp.c   |   3 +-
  drivers/gpu/drm/i915/intel_drv.h  |   5 +-
  drivers/gpu/drm/i915/intel_hdcp.c | 117 +-
  drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
  4 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 62f82c4298ac..276eb49113e9 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port 
*intel_dig_port,
intel_dp_add_properties(intel_dp, connector);
  
  	if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {

-   int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim);
+   int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim,
+ false);
if (ret)
DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ac943ec73987..750fc19f 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -442,7 +442,7 @@ struct intel_hdcp {
/* mei interface related information */
struct mei_cl_device *cldev;
struct mei_hdcp_data mei_data;
-
+   struct notifier_block mei_cldev_nb;
struct delayed_work hdcp2_check_work;
  };
  
@@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,

 struct drm_connector_state *old_state,
 struct drm_connector_state *new_state);
  int intel_hdcp_init(struct intel_connector *connector,
-   const struct intel_hdcp_shim *hdcp_shim);
+   const struct intel_hdcp_shim *hdcp_shim,
+   bool hdcp2_supported);
  int intel_hdcp_enable(struct intel_connector *connector);
  int intel_hdcp_disable(struct intel_connector *connector);
  int intel_hdcp_check_link(struct intel_connector *connector);
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
b/drivers/gpu/drm/i915/intel_hdcp.c
index f3f935046c31..9948e4b4e203 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -11,6 +11,7 @@
  #include 
  #include 
  #include 
+#include 
  
  #include "intel_drv.h"

  #include "i915_reg.h"
@@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector 
*connector);
  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 int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,

const struct intel_hdcp_shim *shim)
@@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, 
enum port port)
  }
  
  int intel_hdcp_init(struct intel_connector *connector,

-   const struct intel_hdcp_shim *hdcp_shim)
+   const struct intel_hdcp_shim *hdcp_shim,
+   bool hdcp2_supported)
  {
struct intel_hdcp *hdcp = >hdcp;
int ret;
  
+	if (!hdcp_shim)

+   return -EINVAL;
+
ret = drm_connector_attach_content_protection_property(
>base);
if (ret)
@@ -779,7 +785,12 @@ int intel_hdcp_init(struct intel_connector *connector,
hdcp->hdcp_shim = hdcp_shim;
mutex_init(>hdcp_mutex);
INIT_DELAYED_WORK(>hdcp_check_work, intel_hdcp_check_work);
+   INIT_DELAYED_WORK(>hdcp2_check_work, intel_hdcp2_check_work);
INIT_WORK(>hdcp_prop_work, intel_hdcp_prop_work);
+
+   if (hdcp2_supported)
+   intel_hdcp2_init(connector);
+
return 0;
  }
  
@@ -1637,3 +1648,107 @@ static void intel_hdcp2_check_work(struct work_struct *work)

schedule_delayed_work(>hdcp2_check_work,
  DRM_HDCP2_CHECK_PERIOD_MS);
  }
+
+static int initialize_mei_hdcp_data(struct intel_connector *connector)
+{
+   struct intel_hdcp *hdcp = >hdcp;
+   struct mei_hdcp_data *data = >mei_data;
+   enum port port;
+
+   if (connector->encoder) {
+   port = connector->encoder->port;
+   data->port = 

Re: [Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface

2018-05-24 Thread Daniel Vetter
On Mon, May 21, 2018 at 06:23:49PM +0530, Ramalingam C wrote:
> Initialize HDCP2.2 support. This includes the mei interface
> initialization along with required notifier registration.
> 
> v2:
>   mei interface handle is protected with mutex. [Chris Wilson]
> v3:
>   Notifiers are used for the mei interface state.
> v4:
>   Poll for mei client device state
>   Error msg for out of mem [Uma]
>   Inline req for init function removed [Uma]
> 
> Signed-off-by: Ramalingam C 
> ---
>  drivers/gpu/drm/i915/intel_dp.c   |   3 +-
>  drivers/gpu/drm/i915/intel_drv.h  |   5 +-
>  drivers/gpu/drm/i915/intel_hdcp.c | 117 
> +-
>  drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
>  4 files changed, 122 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 62f82c4298ac..276eb49113e9 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port 
> *intel_dig_port,
>   intel_dp_add_properties(intel_dp, connector);
>  
>   if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {
> - int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim);
> + int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim,
> +   false);
>   if (ret)
>   DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
>   }
> diff --git a/drivers/gpu/drm/i915/intel_drv.h 
> b/drivers/gpu/drm/i915/intel_drv.h
> index ac943ec73987..750fc19f 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -442,7 +442,7 @@ struct intel_hdcp {
>   /* mei interface related information */
>   struct mei_cl_device *cldev;
>   struct mei_hdcp_data mei_data;
> -
> + struct notifier_block mei_cldev_nb;
>   struct delayed_work hdcp2_check_work;
>  };
>  
> @@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector 
> *connector,
>struct drm_connector_state *old_state,
>struct drm_connector_state *new_state);
>  int intel_hdcp_init(struct intel_connector *connector,
> - const struct intel_hdcp_shim *hdcp_shim);
> + const struct intel_hdcp_shim *hdcp_shim,
> + bool hdcp2_supported);
>  int intel_hdcp_enable(struct intel_connector *connector);
>  int intel_hdcp_disable(struct intel_connector *connector);
>  int intel_hdcp_check_link(struct intel_connector *connector);
> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
> b/drivers/gpu/drm/i915/intel_hdcp.c
> index f3f935046c31..9948e4b4e203 100644
> --- a/drivers/gpu/drm/i915/intel_hdcp.c
> +++ b/drivers/gpu/drm/i915/intel_hdcp.c
> @@ -11,6 +11,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include "intel_drv.h"
>  #include "i915_reg.h"
> @@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector 
> *connector);
>  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 int intel_hdcp_poll_ksv_fifo(struct intel_digital_port 
> *intel_dig_port,
>   const struct intel_hdcp_shim *shim)
> @@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private 
> *dev_priv, enum port port)
>  }
>  
>  int intel_hdcp_init(struct intel_connector *connector,
> - const struct intel_hdcp_shim *hdcp_shim)
> + const struct intel_hdcp_shim *hdcp_shim,
> + bool hdcp2_supported)
>  {
>   struct intel_hdcp *hdcp = >hdcp;
>   int ret;
>  
> + if (!hdcp_shim)
> + return -EINVAL;
> +
>   ret = drm_connector_attach_content_protection_property(
>   >base);
>   if (ret)
> @@ -779,7 +785,12 @@ int intel_hdcp_init(struct intel_connector *connector,
>   hdcp->hdcp_shim = hdcp_shim;
>   mutex_init(>hdcp_mutex);
>   INIT_DELAYED_WORK(>hdcp_check_work, intel_hdcp_check_work);
> + INIT_DELAYED_WORK(>hdcp2_check_work, intel_hdcp2_check_work);
>   INIT_WORK(>hdcp_prop_work, intel_hdcp_prop_work);
> +
> + if (hdcp2_supported)
> + intel_hdcp2_init(connector);
> +
>   return 0;
>  }
>  
> @@ -1637,3 +1648,107 @@ static void intel_hdcp2_check_work(struct work_struct 
> *work)
>   schedule_delayed_work(>hdcp2_check_work,
> DRM_HDCP2_CHECK_PERIOD_MS);
>  }
> +
> +static int initialize_mei_hdcp_data(struct intel_connector *connector)
> +{
> + struct intel_hdcp *hdcp = >hdcp;
> + struct mei_hdcp_data *data = >mei_data;
> + enum port port;
> +
> + if (connector->encoder) {
> +

[Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface

2018-05-21 Thread Ramalingam C
Initialize HDCP2.2 support. This includes the mei interface
initialization along with required notifier registration.

v2:
  mei interface handle is protected with mutex. [Chris Wilson]
v3:
  Notifiers are used for the mei interface state.
v4:
  Poll for mei client device state
  Error msg for out of mem [Uma]
  Inline req for init function removed [Uma]

Signed-off-by: Ramalingam C 
---
 drivers/gpu/drm/i915/intel_dp.c   |   3 +-
 drivers/gpu/drm/i915/intel_drv.h  |   5 +-
 drivers/gpu/drm/i915/intel_hdcp.c | 117 +-
 drivers/gpu/drm/i915/intel_hdmi.c |   2 +-
 4 files changed, 122 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 62f82c4298ac..276eb49113e9 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -6368,7 +6368,8 @@ intel_dp_init_connector(struct intel_digital_port 
*intel_dig_port,
intel_dp_add_properties(intel_dp, connector);
 
if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) {
-   int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim);
+   int ret = intel_hdcp_init(intel_connector, _dp_hdcp_shim,
+ false);
if (ret)
DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ac943ec73987..750fc19f 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -442,7 +442,7 @@ struct intel_hdcp {
/* mei interface related information */
struct mei_cl_device *cldev;
struct mei_hdcp_data mei_data;
-
+   struct notifier_block mei_cldev_nb;
struct delayed_work hdcp2_check_work;
 };
 
@@ -1940,7 +1940,8 @@ void intel_hdcp_atomic_check(struct drm_connector 
*connector,
 struct drm_connector_state *old_state,
 struct drm_connector_state *new_state);
 int intel_hdcp_init(struct intel_connector *connector,
-   const struct intel_hdcp_shim *hdcp_shim);
+   const struct intel_hdcp_shim *hdcp_shim,
+   bool hdcp2_supported);
 int intel_hdcp_enable(struct intel_connector *connector);
 int intel_hdcp_disable(struct intel_connector *connector);
 int intel_hdcp_check_link(struct intel_connector *connector);
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c 
b/drivers/gpu/drm/i915/intel_hdcp.c
index f3f935046c31..9948e4b4e203 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -11,6 +11,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "intel_drv.h"
 #include "i915_reg.h"
@@ -25,6 +26,7 @@ static int _intel_hdcp2_enable(struct intel_connector 
*connector);
 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 int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
const struct intel_hdcp_shim *shim)
@@ -766,11 +768,15 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, 
enum port port)
 }
 
 int intel_hdcp_init(struct intel_connector *connector,
-   const struct intel_hdcp_shim *hdcp_shim)
+   const struct intel_hdcp_shim *hdcp_shim,
+   bool hdcp2_supported)
 {
struct intel_hdcp *hdcp = >hdcp;
int ret;
 
+   if (!hdcp_shim)
+   return -EINVAL;
+
ret = drm_connector_attach_content_protection_property(
>base);
if (ret)
@@ -779,7 +785,12 @@ int intel_hdcp_init(struct intel_connector *connector,
hdcp->hdcp_shim = hdcp_shim;
mutex_init(>hdcp_mutex);
INIT_DELAYED_WORK(>hdcp_check_work, intel_hdcp_check_work);
+   INIT_DELAYED_WORK(>hdcp2_check_work, intel_hdcp2_check_work);
INIT_WORK(>hdcp_prop_work, intel_hdcp_prop_work);
+
+   if (hdcp2_supported)
+   intel_hdcp2_init(connector);
+
return 0;
 }
 
@@ -1637,3 +1648,107 @@ static void intel_hdcp2_check_work(struct work_struct 
*work)
schedule_delayed_work(>hdcp2_check_work,
  DRM_HDCP2_CHECK_PERIOD_MS);
 }
+
+static int initialize_mei_hdcp_data(struct intel_connector *connector)
+{
+   struct intel_hdcp *hdcp = >hdcp;
+   struct mei_hdcp_data *data = >mei_data;
+   enum port port;
+
+   if (connector->encoder) {
+   port = connector->encoder->port;
+   data->port = GET_MEI_DDI_INDEX(port);
+   }
+
+   data->port_type = INTEGRATED;
+   data->protocol = hdcp->hdcp_shim->hdcp_protocol();
+
+   data->k = 1;
+   if