Message ID | 20240202063852.1076862-6-suraj.kandpal@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | HDCP Type1 MST fixes | expand |
On 2/2/2024 12:08 PM, Suraj Kandpal wrote: > Create a remote HDCP capability shim function which can read the > remote monitor HDCP capability when in MST configuration. > > 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 | 22 +++++++++++++++++++ > drivers/gpu/drm/i915/display/intel_hdcp.c | 16 ++++++++++++++ > drivers/gpu/drm/i915/display/intel_hdcp.h | 3 +++ > 4 files changed, 45 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > index ae2e8cff9d69..7e7a370a3b30 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > @@ -532,6 +532,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 (*remote_hdcp_cap)(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 261de01aa5d8..56019b29fb49 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c > @@ -666,6 +666,27 @@ int intel_dp_hdcp2_capable(struct intel_connector *connector, > return _intel_dp_hdcp2_capable(aux, capable); > } > > +static > +int intel_dp_hdcp_remote_cap(struct intel_connector *connector, > + bool *hdcp_capable, bool *hdcp2_capable) > +{ We should perhaps have an assert here to check this is only called for MST case. Regards, Ankit > + struct drm_dp_aux *aux = &connector->port->aux; > + u8 bcaps; > + int ret; > + > + ret = _intel_dp_hdcp2_capable(aux, hdcp2_capable); > + if (ret) > + return ret; > + > + ret = intel_dp_hdcp_read_bcaps(aux, &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, > @@ -683,6 +704,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = { > .config_stream_type = intel_dp_hdcp2_config_stream_type, > .check_2_2_link = intel_dp_hdcp2_check_link, > .hdcp_2_2_capable = intel_dp_hdcp2_capable, > + .remote_hdcp_cap = intel_dp_hdcp_remote_cap, > .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 4593ac10e2fa..2b739249b60c 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_capable(struct intel_connector *connector) > return capable; > } > > +void intel_hdcp_remote_cap(struct intel_connector *connector, > + bool *hdcp_capable, > + bool *hdcp2_capable) > +{ > + struct intel_hdcp *hdcp = &connector->hdcp; > + > + /* Remote Sink's capability for HDCP */ > + if (!hdcp->shim->remote_hdcp_cap) > + return; > + > + hdcp->shim->remote_hdcp_cap(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 a9c784fd9ba5..213d286ca3fa 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_capable(struct intel_connector *connector); > bool intel_hdcp2_capable(struct intel_connector *connector); > +void intel_hdcp_remote_cap(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 ae2e8cff9d69..7e7a370a3b30 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -532,6 +532,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 (*remote_hdcp_cap)(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 261de01aa5d8..56019b29fb49 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_hdcp.c +++ b/drivers/gpu/drm/i915/display/intel_dp_hdcp.c @@ -666,6 +666,27 @@ int intel_dp_hdcp2_capable(struct intel_connector *connector, return _intel_dp_hdcp2_capable(aux, capable); } +static +int intel_dp_hdcp_remote_cap(struct intel_connector *connector, + bool *hdcp_capable, bool *hdcp2_capable) +{ + struct drm_dp_aux *aux = &connector->port->aux; + u8 bcaps; + int ret; + + ret = _intel_dp_hdcp2_capable(aux, hdcp2_capable); + if (ret) + return ret; + + ret = intel_dp_hdcp_read_bcaps(aux, &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, @@ -683,6 +704,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = { .config_stream_type = intel_dp_hdcp2_config_stream_type, .check_2_2_link = intel_dp_hdcp2_check_link, .hdcp_2_2_capable = intel_dp_hdcp2_capable, + .remote_hdcp_cap = intel_dp_hdcp_remote_cap, .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 4593ac10e2fa..2b739249b60c 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_capable(struct intel_connector *connector) return capable; } +void intel_hdcp_remote_cap(struct intel_connector *connector, + bool *hdcp_capable, + bool *hdcp2_capable) +{ + struct intel_hdcp *hdcp = &connector->hdcp; + + /* Remote Sink's capability for HDCP */ + if (!hdcp->shim->remote_hdcp_cap) + return; + + hdcp->shim->remote_hdcp_cap(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 a9c784fd9ba5..213d286ca3fa 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_capable(struct intel_connector *connector); bool intel_hdcp2_capable(struct intel_connector *connector); +void intel_hdcp_remote_cap(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. 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 | 22 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_hdcp.c | 16 ++++++++++++++ drivers/gpu/drm/i915/display/intel_hdcp.h | 3 +++ 4 files changed, 45 insertions(+)