Bits to enable/disable and check state for D2D moved from
XELPDP_PORT_BUF_CTL1 to DDI_BUF_CTL (now named DDI_CTL_DE in the spec).
Make the functions mtl_ddi_disable_d2d() and mtl_ddi_enable_d2d generic
to work with multiple reg location and bitfield layout.

v2: Set/Clear XE2LPD_DDI_BUF_D2D_LINK_ENABLE in saved_port_bits when
    enabling/disabling D2D so DDI_BUF_CTL is correctly programmed in
    other places without overriding these bits (Clint)

Reviewed-by: Matt Roper <matthew.d.ro...@intel.com>
Signed-off-by: Lucas De Marchi <lucas.demar...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_ddi.c | 46 +++++++++++++++++-------
 drivers/gpu/drm/i915/i915_reg.h          |  2 ++
 2 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c 
b/drivers/gpu/drm/i915/display/intel_ddi.c
index 75a2da5d0c9e..53d8f13f8471 100644
--- a/drivers/gpu/drm/i915/display/intel_ddi.c
+++ b/drivers/gpu/drm/i915/display/intel_ddi.c
@@ -2355,14 +2355,25 @@ static void
 mtl_ddi_enable_d2d(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+       struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
        enum port port = encoder->port;
+       i915_reg_t reg;
+       u32 set_bits, wait_bits;
+
+       if (DISPLAY_VER(dev_priv) >= 20) {
+               reg = DDI_BUF_CTL(port);
+               set_bits = XE2LPD_DDI_BUF_D2D_LINK_ENABLE;
+               wait_bits = XE2LPD_DDI_BUF_D2D_LINK_STATE;
+               dig_port->saved_port_bits |= XE2LPD_DDI_BUF_D2D_LINK_ENABLE;
+       } else {
+               reg = XELPDP_PORT_BUF_CTL1(port);
+               set_bits = XELPDP_PORT_BUF_D2D_LINK_ENABLE;
+               wait_bits = XELPDP_PORT_BUF_D2D_LINK_STATE;
+       }
 
-       intel_de_rmw(dev_priv, XELPDP_PORT_BUF_CTL1(port), 0,
-                    XELPDP_PORT_BUF_D2D_LINK_ENABLE);
-
-       if (wait_for_us((intel_de_read(dev_priv, XELPDP_PORT_BUF_CTL1(port)) &
-                        XELPDP_PORT_BUF_D2D_LINK_STATE), 100)) {
-               drm_err(&dev_priv->drm, "Timeout waiting for D2D Link enable 
for PORT_BUF_CTL %c\n",
+       intel_de_rmw(dev_priv, reg, 0, set_bits);
+       if (wait_for_us(intel_de_read(dev_priv, reg) & wait_bits, 100)) {
+               drm_err(&dev_priv->drm, "Timeout waiting for D2D Link enable 
for DDI/PORT_BUF_CTL %c\n",
                        port_name(port));
        }
 }
@@ -2808,14 +2819,25 @@ static void
 mtl_ddi_disable_d2d_link(struct intel_encoder *encoder)
 {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+       struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
        enum port port = encoder->port;
+       i915_reg_t reg;
+       u32 clr_bits, wait_bits;
+
+       if (DISPLAY_VER(dev_priv) >= 20) {
+               reg = DDI_BUF_CTL(port);
+               clr_bits = XE2LPD_DDI_BUF_D2D_LINK_ENABLE;
+               wait_bits = XE2LPD_DDI_BUF_D2D_LINK_STATE;
+               dig_port->saved_port_bits &= ~XE2LPD_DDI_BUF_D2D_LINK_ENABLE;
+       } else {
+               reg = XELPDP_PORT_BUF_CTL1(port);
+               clr_bits = XELPDP_PORT_BUF_D2D_LINK_ENABLE;
+               wait_bits = XELPDP_PORT_BUF_D2D_LINK_STATE;
+       }
 
-       intel_de_rmw(dev_priv, XELPDP_PORT_BUF_CTL1(port),
-                    XELPDP_PORT_BUF_D2D_LINK_ENABLE, 0);
-
-       if (wait_for_us(!(intel_de_read(dev_priv, XELPDP_PORT_BUF_CTL1(port)) &
-                         XELPDP_PORT_BUF_D2D_LINK_STATE), 100))
-               drm_err(&dev_priv->drm, "Timeout waiting for D2D Link disable 
for PORT_BUF_CTL %c\n",
+       intel_de_rmw(dev_priv, reg, clr_bits, 0);
+       if (wait_for_us(!(intel_de_read(dev_priv, reg) & wait_bits), 100))
+               drm_err(&dev_priv->drm, "Timeout waiting for D2D Link disable 
for DDI/PORT_BUF_CTL %c\n",
                        port_name(port));
 }
 
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index e00e4d569ba9..2f5dd5361263 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -5678,6 +5678,8 @@ enum skl_power_gate {
 /* Known as DDI_CTL_DE in MTL+ */
 #define DDI_BUF_CTL(port) _MMIO_PORT(port, _DDI_BUF_CTL_A, _DDI_BUF_CTL_B)
 #define  DDI_BUF_CTL_ENABLE                    (1 << 31)
+#define  XE2LPD_DDI_BUF_D2D_LINK_ENABLE                REG_BIT(29)
+#define  XE2LPD_DDI_BUF_D2D_LINK_STATE         REG_BIT(28)
 #define  DDI_BUF_TRANS_SELECT(n)       ((n) << 24)
 #define  DDI_BUF_EMP_MASK                      (0xf << 24)
 #define  DDI_BUF_PHY_LINK_RATE(r)              ((r) << 20)
-- 
2.40.1

Reply via email to