From: Sean Paul <[email protected]>

Instead of using intel_dig_port's encoder pipe to determine which
transcoder to toggle signalling on, use the cpu_transcoder field already
stored in intel_hdmi.

This is particularly important for MST.

Suggested-by: Ville Syrjälä <[email protected]>
Reviewed-by: Ramalingam C <[email protected]>
Signed-off-by: Sean Paul <[email protected]>
Link: 
https://patchwork.freedesktop.org/patch/msgid/[email protected]
 #v2
Link: 
https://patchwork.freedesktop.org/patch/msgid/[email protected]
 #v3

Changes in v2:
-Added to the set
Changes in v3:
-s/hdcp/hdmi/ in commit msg (Ram)
Changes in v4:
-Rebased on intel_de_(read|write) change
---
 drivers/gpu/drm/i915/display/intel_ddi.c         | 12 +++---------
 drivers/gpu/drm/i915/display/intel_ddi.h         |  2 ++
 .../gpu/drm/i915/display/intel_display_types.h   |  1 +
 drivers/gpu/drm/i915/display/intel_dp.c          |  1 +
 drivers/gpu/drm/i915/display/intel_hdcp.c        | 11 +++++++----
 drivers/gpu/drm/i915/display/intel_hdmi.c        | 16 +++++++++++-----
 6 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index fc84cd7c724fb..61984218961fa 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -2034,12 +2034,12 @@ void intel_ddi_disable_transcoder_func(const struct 
intel_crtc_state *crtc_state
 }
 
 int intel_ddi_toggle_hdcp_signalling(struct intel_encoder *intel_encoder,
+                                    enum transcoder cpu_transcoder,
                                     bool enable)
 {
        struct drm_device *dev = intel_encoder->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        intel_wakeref_t wakeref;
-       enum pipe pipe = 0;
        int ret = 0;
        u32 tmp;
 
@@ -2048,18 +2048,12 @@ int intel_ddi_toggle_hdcp_signalling(struct 
intel_encoder *intel_encoder,
        if (WARN_ON(!wakeref))
                return -ENXIO;
 
-       if (WARN_ON(!intel_encoder->get_hw_state(intel_encoder, &pipe))) {
-               ret = -EIO;
-               goto out;
-       }
-
-       tmp = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(pipe));
+       tmp = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder));
        if (enable)
                tmp |= TRANS_DDI_HDCP_SIGNALLING;
        else
                tmp &= ~TRANS_DDI_HDCP_SIGNALLING;
-       intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(pipe), tmp);
-out:
+       intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder), tmp);
        intel_display_power_put(dev_priv, intel_encoder->power_domain, wakeref);
        return ret;
 }
diff --git a/drivers/gpu/drm/i915/display/intel_ddi.h 
b/drivers/gpu/drm/i915/display/intel_ddi.h
index 167c6579d972e..5b22daf04060f 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.h
+++ b/drivers/gpu/drm/i915/display/intel_ddi.h
@@ -18,6 +18,7 @@ struct intel_crtc_state;
 struct intel_dp;
 struct intel_dpll_hw_state;
 struct intel_encoder;
+enum transcoder;
 
 void intel_ddi_fdi_post_disable(struct intel_encoder *intel_encoder,
                                const struct intel_crtc_state *old_crtc_state,
@@ -45,6 +46,7 @@ u8 intel_ddi_dp_voltage_max(struct intel_encoder *encoder);
 u8 intel_ddi_dp_pre_emphasis_max(struct intel_encoder *encoder,
                                 u8 voltage_swing);
 int intel_ddi_toggle_hdcp_signalling(struct intel_encoder *intel_encoder,
+                                    enum transcoder cpu_transcoder,
                                     bool enable);
 void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder);
 int cnl_calc_wrpll_link(struct drm_i915_private *dev_priv,
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index 283c622f8ba12..b9e4ba8071d29 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -306,6 +306,7 @@ struct intel_hdcp_shim {
 
        /* Enables HDCP signalling on the port */
        int (*toggle_signalling)(struct intel_digital_port *intel_dig_port,
+                                enum transcoder cpu_transcoder,
                                 bool enable);
 
        /* Ensures the link is still protected */
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 1c947218bc300..f601cdcd4c647 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -6120,6 +6120,7 @@ int intel_dp_hdcp_read_v_prime_part(struct 
intel_digital_port *intel_dig_port,
 
 static
 int intel_dp_hdcp_toggle_signalling(struct intel_digital_port *intel_dig_port,
+                                   enum transcoder cpu_transcoder,
                                    bool enable)
 {
        /* Not used for single stream DisplayPort setups */
diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c 
b/drivers/gpu/drm/i915/display/intel_hdcp.c
index f31a2f5d51a17..680d88566d992 100644
--- a/drivers/gpu/drm/i915/display/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
@@ -710,7 +710,7 @@ static int intel_hdcp_auth(struct intel_connector 
*connector)
                intel_de_write(dev_priv, HDCP_REP_CTL,
                               intel_hdcp_get_repeater_ctl(dev_priv, 
cpu_transcoder, port));
 
-       ret = shim->toggle_signalling(intel_dig_port, true);
+       ret = shim->toggle_signalling(intel_dig_port, cpu_transcoder, true);
        if (ret)
                return ret;
 
@@ -811,7 +811,8 @@ static int _intel_hdcp_disable(struct intel_connector 
*connector)
        intel_de_write(dev_priv, HDCP_REP_CTL,
                       intel_de_read(dev_priv, HDCP_REP_CTL) & ~repeater_ctl);
 
-       ret = hdcp->shim->toggle_signalling(intel_dig_port, false);
+       ret = hdcp->shim->toggle_signalling(intel_dig_port, cpu_transcoder,
+                                           false);
        if (ret) {
                drm_err(&dev_priv->drm, "Failed to disable HDCP signalling\n");
                return ret;
@@ -1584,7 +1585,8 @@ static int hdcp2_enable_encryption(struct intel_connector 
*connector)
        WARN_ON(intel_de_read(dev_priv, HDCP2_STATUS(dev_priv, cpu_transcoder, 
port)) &
                LINK_ENCRYPTION_STATUS);
        if (hdcp->shim->toggle_signalling) {
-               ret = hdcp->shim->toggle_signalling(intel_dig_port, true);
+               ret = hdcp->shim->toggle_signalling(intel_dig_port,
+                                                   cpu_transcoder, true);
                if (ret) {
                        drm_err(&dev_priv->drm,
                                "Failed to enable HDCP signalling. %d\n",
@@ -1634,7 +1636,8 @@ static int hdcp2_disable_encryption(struct 
intel_connector *connector)
                drm_dbg_kms(&dev_priv->drm, "Disable Encryption Timedout");
 
        if (hdcp->shim->toggle_signalling) {
-               ret = hdcp->shim->toggle_signalling(intel_dig_port, false);
+               ret = hdcp->shim->toggle_signalling(intel_dig_port,
+                                                   cpu_transcoder, false);
                if (ret) {
                        drm_err(&dev_priv->drm,
                                "Failed to disable HDCP signalling. %d\n",
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c 
b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 476ce1d9c557c..f1092066440f4 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -1456,7 +1456,8 @@ int intel_hdmi_hdcp_read_v_prime_part(struct 
intel_digital_port *intel_dig_port,
        return ret;
 }
 
-static int kbl_repositioning_enc_en_signal(struct intel_connector *connector)
+static int kbl_repositioning_enc_en_signal(struct intel_connector *connector,
+                                          enum transcoder cpu_transcoder)
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_digital_port *intel_dig_port = 
intel_attached_dig_port(connector);
@@ -1473,12 +1474,14 @@ static int kbl_repositioning_enc_en_signal(struct 
intel_connector *connector)
                usleep_range(25, 50);
        }
 
-       ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, false);
+       ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base,
+                                              cpu_transcoder, false);
        if (ret) {
                DRM_ERROR("Disable HDCP signalling failed (%d)\n", ret);
                return ret;
        }
-       ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, true);
+       ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base,
+                                              cpu_transcoder, true);
        if (ret) {
                DRM_ERROR("Enable HDCP signalling failed (%d)\n", ret);
                return ret;
@@ -1489,6 +1492,7 @@ static int kbl_repositioning_enc_en_signal(struct 
intel_connector *connector)
 
 static
 int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port 
*intel_dig_port,
+                                     enum transcoder cpu_transcoder,
                                      bool enable)
 {
        struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
@@ -1499,7 +1503,8 @@ int intel_hdmi_hdcp_toggle_signalling(struct 
intel_digital_port *intel_dig_port,
        if (!enable)
                usleep_range(6, 60); /* Bspec says >= 6us */
 
-       ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, enable);
+       ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base,
+                                              cpu_transcoder, enable);
        if (ret) {
                DRM_ERROR("%s HDCP signalling failed (%d)\n",
                          enable ? "Enable" : "Disable", ret);
@@ -1511,7 +1516,8 @@ int intel_hdmi_hdcp_toggle_signalling(struct 
intel_digital_port *intel_dig_port,
         * opportunity and enc_en signalling in KABYLAKE.
         */
        if (IS_KABYLAKE(dev_priv) && enable)
-               return kbl_repositioning_enc_en_signal(connector);
+               return kbl_repositioning_enc_en_signal(connector,
+                                                      cpu_transcoder);
 
        return 0;
 }
-- 
Sean Paul, Software Engineer, Google / Chromium OS

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to