Re: [Intel-gfx] [PATCH v4 30/41] drm/i915: Initialize HDCP2.2 and its MEI interface
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
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
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
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
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
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