Message ID | 20240226051017.1652970-2-suraj.kandpal@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
On 2/26/2024 10:40 AM, Suraj Kandpal wrote: > Create a remote HDCP capability shim function which can read the > remote monitor HDCP capability when in MST configuration. > > --v2 > -Add an assertion to make sure only mst encoder call this remote_cap > function [Ankit] > > --v3 > -rename remote_hdcp_cap to remote_hdcp_capability [Jani] > > --v4 > -fix hdcp2_prerequisite check condition > -Move intel_dp_hdcp_get_remote_capability to dp_mst shim instead of > having it in dp shim [Ankit] > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com> LGTM. Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> > --- > .../drm/i915/display/intel_display_types.h | 4 +++ > drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 27 +++++++++++++++++++ > drivers/gpu/drm/i915/display/intel_hdcp.c | 16 +++++++++++ > drivers/gpu/drm/i915/display/intel_hdcp.h | 3 +++ > 4 files changed, 50 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > index b6f86129c0bc..8ce986fadd9a 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > @@ -531,6 +531,10 @@ struct intel_hdcp_shim { > /* HDCP2.2 Link Integrity Check */ > int (*check_2_2_link)(struct intel_digital_port *dig_port, > struct intel_connector *connector); > + > + /* HDCP remote sink cap */ > + int (*get_remote_hdcp_capability)(struct intel_connector *connector, > + bool *hdcp_capable, bool *hdcp2_capable); > }; > > struct intel_hdcp { > diff --git a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > index bf90e9024feb..eab6e9fab4e6 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > @@ -672,6 +672,32 @@ int intel_dp_hdcp2_get_capability(struct intel_connector *connector, > return _intel_dp_hdcp2_get_capability(aux, capable); > } > > +static > +int intel_dp_hdcp_get_remote_capability(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable) > +{ > + struct drm_i915_private *i915 = to_i915(connector->base.dev); > + struct drm_dp_aux *aux = &connector->port->aux; > + u8 bcaps; > + int ret; > + > + if (!intel_encoder_is_mst(connector->encoder)) > + return -EINVAL; > + > + ret = _intel_dp_hdcp2_get_capability(aux, hdcp2_capable); > + if (ret) > + return ret; > + > + ret = intel_dp_hdcp_read_bcaps(aux, i915, &bcaps); > + if (ret) > + return ret; > + > + *hdcp_capable = bcaps & DP_BCAPS_HDCP_CAPABLE; > + > + return 0; > +} > + > static const struct intel_hdcp_shim intel_dp_hdcp_shim = { > .write_an_aksv = intel_dp_hdcp_write_an_aksv, > .read_bksv = intel_dp_hdcp_read_bksv, > @@ -820,6 +846,7 @@ static const struct intel_hdcp_shim intel_dp_mst_hdcp_shim = { > .stream_2_2_encryption = intel_dp_mst_hdcp2_stream_encryption, > .check_2_2_link = intel_dp_mst_hdcp2_check_link, > .hdcp_2_2_get_capability = intel_dp_hdcp2_get_capability, > + .get_remote_hdcp_capability = intel_dp_hdcp_get_remote_capability, > .protocol = HDCP_PROTOCOL_DP, > }; > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c > index c1a32f9f1199..801b8f0495bb 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c > @@ -205,6 +205,22 @@ bool intel_hdcp2_get_capability(struct intel_connector *connector) > return capable; > } > > +void intel_hdcp_get_remote_capability(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable) > +{ > + struct intel_hdcp *hdcp = &connector->hdcp; > + > + if (!hdcp->shim->get_remote_hdcp_capability) > + return; > + > + hdcp->shim->get_remote_hdcp_capability(connector, hdcp_capable, > + hdcp2_capable); > + > + if (!intel_hdcp2_prerequisite(connector)) > + *hdcp2_capable = false; > +} > + > static bool intel_hdcp_in_use(struct drm_i915_private *i915, > enum transcoder cpu_transcoder, enum port port) > { > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.h b/drivers/gpu/drm/i915/display/intel_hdcp.h > index aeefb3c13d2c..477f2d2bb120 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdcp.h > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.h > @@ -40,6 +40,9 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state, > bool is_hdcp_supported(struct drm_i915_private *i915, enum port port); > bool intel_hdcp_get_capability(struct intel_connector *connector); > bool intel_hdcp2_get_capability(struct intel_connector *connector); > +void intel_hdcp_get_remote_capability(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable); > void intel_hdcp_component_init(struct drm_i915_private *i915); > void intel_hdcp_component_fini(struct drm_i915_private *i915); > void intel_hdcp_cleanup(struct intel_connector *connector);
On 2/26/2024 10:40 AM, Suraj Kandpal wrote: > Create a remote HDCP capability shim function which can read the > remote monitor HDCP capability when in MST configuration. > > --v2 > -Add an assertion to make sure only mst encoder call this remote_cap > function [Ankit] > > --v3 > -rename remote_hdcp_cap to remote_hdcp_capability [Jani] > > --v4 > -fix hdcp2_prerequisite check condition > -Move intel_dp_hdcp_get_remote_capability to dp_mst shim instead of > having it in dp shim [Ankit] > > Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> > --- > .../drm/i915/display/intel_display_types.h | 4 +++ > drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 27 +++++++++++++++++++ > drivers/gpu/drm/i915/display/intel_hdcp.c | 16 +++++++++++ > drivers/gpu/drm/i915/display/intel_hdcp.h | 3 +++ > 4 files changed, 50 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > index b6f86129c0bc..8ce986fadd9a 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > @@ -531,6 +531,10 @@ struct intel_hdcp_shim { > /* HDCP2.2 Link Integrity Check */ > int (*check_2_2_link)(struct intel_digital_port *dig_port, > struct intel_connector *connector); > + > + /* HDCP remote sink cap */ > + int (*get_remote_hdcp_capability)(struct intel_connector *connector, > + bool *hdcp_capable, bool *hdcp2_capable); > }; > > struct intel_hdcp { > diff --git a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > index bf90e9024feb..eab6e9fab4e6 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > @@ -672,6 +672,32 @@ int intel_dp_hdcp2_get_capability(struct intel_connector *connector, > return _intel_dp_hdcp2_get_capability(aux, capable); > } > > +static > +int intel_dp_hdcp_get_remote_capability(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable) > +{ > + struct drm_i915_private *i915 = to_i915(connector->base.dev); > + struct drm_dp_aux *aux = &connector->port->aux; > + u8 bcaps; > + int ret; > + > + if (!intel_encoder_is_mst(connector->encoder)) > + return -EINVAL; > + > + ret = _intel_dp_hdcp2_get_capability(aux, hdcp2_capable); > + if (ret) > + return ret; > + > + ret = intel_dp_hdcp_read_bcaps(aux, i915, &bcaps); > + if (ret) > + return ret; > + > + *hdcp_capable = bcaps & DP_BCAPS_HDCP_CAPABLE; > + > + return 0; > +} > + > static const struct intel_hdcp_shim intel_dp_hdcp_shim = { > .write_an_aksv = intel_dp_hdcp_write_an_aksv, > .read_bksv = intel_dp_hdcp_read_bksv, > @@ -820,6 +846,7 @@ static const struct intel_hdcp_shim intel_dp_mst_hdcp_shim = { > .stream_2_2_encryption = intel_dp_mst_hdcp2_stream_encryption, > .check_2_2_link = intel_dp_mst_hdcp2_check_link, > .hdcp_2_2_get_capability = intel_dp_hdcp2_get_capability, > + .get_remote_hdcp_capability = intel_dp_hdcp_get_remote_capability, > .protocol = HDCP_PROTOCOL_DP, > }; > > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c > index c1a32f9f1199..801b8f0495bb 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdcp.c > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c > @@ -205,6 +205,22 @@ bool intel_hdcp2_get_capability(struct intel_connector *connector) > return capable; > } > > +void intel_hdcp_get_remote_capability(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable) > +{ > + struct intel_hdcp *hdcp = &connector->hdcp; > + > + if (!hdcp->shim->get_remote_hdcp_capability) > + return; > + > + hdcp->shim->get_remote_hdcp_capability(connector, hdcp_capable, > + hdcp2_capable); > + > + if (!intel_hdcp2_prerequisite(connector)) > + *hdcp2_capable = false; > +} > + > static bool intel_hdcp_in_use(struct drm_i915_private *i915, > enum transcoder cpu_transcoder, enum port port) > { > diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.h b/drivers/gpu/drm/i915/display/intel_hdcp.h > index aeefb3c13d2c..477f2d2bb120 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdcp.h > +++ b/drivers/gpu/drm/i915/display/intel_hdcp.h > @@ -40,6 +40,9 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state, > bool is_hdcp_supported(struct drm_i915_private *i915, enum port port); > bool intel_hdcp_get_capability(struct intel_connector *connector); > bool intel_hdcp2_get_capability(struct intel_connector *connector); > +void intel_hdcp_get_remote_capability(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable); > void intel_hdcp_component_init(struct drm_i915_private *i915); > void intel_hdcp_component_fini(struct drm_i915_private *i915); > void intel_hdcp_cleanup(struct intel_connector *connector);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index b6f86129c0bc..8ce986fadd9a 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -531,6 +531,10 @@ struct intel_hdcp_shim { /* HDCP2.2 Link Integrity Check */ int (*check_2_2_link)(struct intel_digital_port *dig_port, struct intel_connector *connector); + + /* HDCP remote sink cap */ + int (*get_remote_hdcp_capability)(struct intel_connector *connector, + bool *hdcp_capable, bool *hdcp2_capable); }; struct intel_hdcp { diff --git a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c index bf90e9024feb..eab6e9fab4e6 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c @@ -672,6 +672,32 @@ int intel_dp_hdcp2_get_capability(struct intel_connector *connector, return _intel_dp_hdcp2_get_capability(aux, capable); } +static +int intel_dp_hdcp_get_remote_capability(struct intel_connector *connector, + bool *hdcp_capable, + bool *hdcp2_capable) +{ + struct drm_i915_private *i915 = to_i915(connector->base.dev); + struct drm_dp_aux *aux = &connector->port->aux; + u8 bcaps; + int ret; + + if (!intel_encoder_is_mst(connector->encoder)) + return -EINVAL; + + ret = _intel_dp_hdcp2_get_capability(aux, hdcp2_capable); + if (ret) + return ret; + + ret = intel_dp_hdcp_read_bcaps(aux, i915, &bcaps); + if (ret) + return ret; + + *hdcp_capable = bcaps & DP_BCAPS_HDCP_CAPABLE; + + return 0; +} + static const struct intel_hdcp_shim intel_dp_hdcp_shim = { .write_an_aksv = intel_dp_hdcp_write_an_aksv, .read_bksv = intel_dp_hdcp_read_bksv, @@ -820,6 +846,7 @@ static const struct intel_hdcp_shim intel_dp_mst_hdcp_shim = { .stream_2_2_encryption = intel_dp_mst_hdcp2_stream_encryption, .check_2_2_link = intel_dp_mst_hdcp2_check_link, .hdcp_2_2_get_capability = intel_dp_hdcp2_get_capability, + .get_remote_hdcp_capability = intel_dp_hdcp_get_remote_capability, .protocol = HDCP_PROTOCOL_DP, }; diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c index c1a32f9f1199..801b8f0495bb 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c @@ -205,6 +205,22 @@ bool intel_hdcp2_get_capability(struct intel_connector *connector) return capable; } +void intel_hdcp_get_remote_capability(struct intel_connector *connector, + bool *hdcp_capable, + bool *hdcp2_capable) +{ + struct intel_hdcp *hdcp = &connector->hdcp; + + if (!hdcp->shim->get_remote_hdcp_capability) + return; + + hdcp->shim->get_remote_hdcp_capability(connector, hdcp_capable, + hdcp2_capable); + + if (!intel_hdcp2_prerequisite(connector)) + *hdcp2_capable = false; +} + static bool intel_hdcp_in_use(struct drm_i915_private *i915, enum transcoder cpu_transcoder, enum port port) { diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.h b/drivers/gpu/drm/i915/display/intel_hdcp.h index aeefb3c13d2c..477f2d2bb120 100644 --- a/drivers/gpu/drm/i915/display/intel_hdcp.h +++ b/drivers/gpu/drm/i915/display/intel_hdcp.h @@ -40,6 +40,9 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state, bool is_hdcp_supported(struct drm_i915_private *i915, enum port port); bool intel_hdcp_get_capability(struct intel_connector *connector); bool intel_hdcp2_get_capability(struct intel_connector *connector); +void intel_hdcp_get_remote_capability(struct intel_connector *connector, + bool *hdcp_capable, + bool *hdcp2_capable); void intel_hdcp_component_init(struct drm_i915_private *i915); void intel_hdcp_component_fini(struct drm_i915_private *i915); void intel_hdcp_cleanup(struct intel_connector *connector);
Create a remote HDCP capability shim function which can read the remote monitor HDCP capability when in MST configuration. --v2 -Add an assertion to make sure only mst encoder call this remote_cap function [Ankit] --v3 -rename remote_hdcp_cap to remote_hdcp_capability [Jani] --v4 -fix hdcp2_prerequisite check condition -Move intel_dp_hdcp_get_remote_capability to dp_mst shim instead of having it in dp shim [Ankit] Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com> --- .../drm/i915/display/intel_display_types.h | 4 +++ drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 27 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_hdcp.c | 16 +++++++++++ drivers/gpu/drm/i915/display/intel_hdcp.h | 3 +++ 4 files changed, 50 insertions(+)