On Thu, Dec 13, 2018 at 09:31:08AM +0530, Ramalingam C wrote: > Add the HDCP2.2 initialization to the existing HDCP1.4 stack. > > 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] > v5: > Rebase as Part of reordering. > Component is used for the I915 and MEI_HDCP interface [Daniel] > v6: > HDCP2.2 uses the I915 component master to communicate with mei_hdcp > - [Daniel] > Required HDCP2.2 variables defined [Sean Paul] > v7: > intel_hdcp2.2_init returns void [Uma] > Realigning the codes. > v8: > Avoid using bool structure members. > MEI interface related changes are moved into separate patch. > Commit msg is updated accordingly. > intel_hdcp_exit is defined and used from i915_unload > v9: > Movement of the hdcp_check_link is moved to new patch [Daniel] > intel_hdcp2_exit is removed as mei_comp will be unbind in i915_unload. All concerns I had addressed. Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > > Signed-off-by: Ramalingam C <ramalingam.c@xxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_dp.c | 3 ++- > drivers/gpu/drm/i915/intel_drv.h | 15 ++++++++++++++- > drivers/gpu/drm/i915/intel_hdcp.c | 30 +++++++++++++++++++++++++++--- > drivers/gpu/drm/i915/intel_hdmi.c | 2 +- > 4 files changed, 44 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index e94faa0a42eb..aba884c64879 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -6902,7 +6902,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, &intel_dp_hdcp_shim); > + int ret = intel_hdcp_init(intel_connector, &intel_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 d08f08f607dd..dd9371647a8c 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -388,6 +388,17 @@ struct intel_hdcp { > u64 value; > struct delayed_work check_work; > struct work_struct prop_work; > + > + /* HDCP2.2 related definitions */ > + /* Flag indicates whether this connector supports HDCP2.2 or not. */ > + u8 hdcp2_supported; > + > + /* > + * Content Stream Type defined by content owner. TYPE0(0x0) content can > + * flow in the link protected by HDCP2.2 or HDCP1.4, where as TYPE1(0x1) > + * content can flow only through a link protected by HDCP2.2. > + */ > + u8 content_type; > }; > > struct intel_connector { > @@ -2038,12 +2049,14 @@ 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); > bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port); > bool intel_hdcp_capable(struct intel_connector *connector); > +bool is_hdcp2_supported(struct drm_i915_private *dev_priv); > > /* intel_psr.c */ > #define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support) > diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c > index 506b4cc6f46b..584d27f3c699 100644 > --- a/drivers/gpu/drm/i915/intel_hdcp.c > +++ b/drivers/gpu/drm/i915/intel_hdcp.c > @@ -833,14 +833,34 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port) > return INTEL_GEN(dev_priv) >= 9 && port < PORT_E; > } > > +bool is_hdcp2_supported(struct drm_i915_private *dev_priv) > +{ > + return ((INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv) || > + IS_KABYLAKE(dev_priv)) && IS_ENABLED(CONFIG_INTEL_MEI_HDCP)); > +} > + > +static void intel_hdcp2_init(struct intel_connector *connector) > +{ > + struct drm_i915_private *dev_priv = to_i915(connector->base.dev); > + struct intel_hdcp *hdcp = &connector->hdcp; > + > + WARN_ON(!is_hdcp2_supported(dev_priv)); > + > + /* TODO: MEI interface needs to be initialized here */ > + hdcp->hdcp2_supported = 1; > +} > + > int intel_hdcp_init(struct intel_connector *connector, > - const struct intel_hdcp_shim *shim) > + const struct intel_hdcp_shim *shim, > + bool hdcp2_supported) > { > struct intel_hdcp *hdcp = &connector->hdcp; > int ret; > > - ret = drm_connector_attach_content_protection_property( > - &connector->base); > + if (!shim) > + return -EINVAL; > + > + ret = drm_connector_attach_content_protection_property(&connector->base); > if (ret) > return ret; > > @@ -848,6 +868,10 @@ int intel_hdcp_init(struct intel_connector *connector, > mutex_init(&hdcp->mutex); > INIT_DELAYED_WORK(&hdcp->check_work, intel_hdcp_check_work); > INIT_WORK(&hdcp->prop_work, intel_hdcp_prop_work); > + > + if (hdcp2_supported) > + intel_hdcp2_init(connector); > + > return 0; > } > > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c > index 07e803a604bd..38fe0fdbf8d8 100644 > --- a/drivers/gpu/drm/i915/intel_hdmi.c > +++ b/drivers/gpu/drm/i915/intel_hdmi.c > @@ -2434,7 +2434,7 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, > > if (is_hdcp_supported(dev_priv, port)) { > int ret = intel_hdcp_init(intel_connector, > - &intel_hdmi_hdcp_shim); > + &intel_hdmi_hdcp_shim, false); > if (ret) > DRM_DEBUG_KMS("HDCP init failed, skipping.\n"); > } > -- > 2.7.4 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel