|
@@ -998,6 +998,53 @@ static bool dp_pipe_enabled(struct drm_i915_private *dev_priv, enum pipe pipe,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv,
|
|
|
+ enum pipe pipe, u32 val)
|
|
|
+{
|
|
|
+ if ((val & PORT_ENABLE) == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (HAS_PCH_CPT(dev_priv->dev)) {
|
|
|
+ if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ if ((val & TRANSCODER_MASK) != TRANSCODER(pipe))
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+static bool lvds_pipe_enabled(struct drm_i915_private *dev_priv,
|
|
|
+ enum pipe pipe, u32 val)
|
|
|
+{
|
|
|
+ if ((val & LVDS_PORT_EN) == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (HAS_PCH_CPT(dev_priv->dev)) {
|
|
|
+ if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ if ((val & LVDS_PIPE_MASK) != LVDS_PIPE(pipe))
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv,
|
|
|
+ enum pipe pipe, u32 val)
|
|
|
+{
|
|
|
+ if ((val & ADPA_DAC_ENABLE) == 0)
|
|
|
+ return false;
|
|
|
+ if (HAS_PCH_CPT(dev_priv->dev)) {
|
|
|
+ if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ if ((val & ADPA_PIPE_SELECT_MASK) != ADPA_PIPE_SELECT(pipe))
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
|
|
|
enum pipe pipe, int reg, u32 port_sel)
|
|
|
{
|
|
@@ -1011,7 +1058,7 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
|
|
|
enum pipe pipe, int reg)
|
|
|
{
|
|
|
u32 val = I915_READ(reg);
|
|
|
- WARN(HDMI_PIPE_ENABLED(val, pipe),
|
|
|
+ WARN(hdmi_pipe_enabled(dev_priv, val, pipe),
|
|
|
"PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
|
|
|
reg, pipe_name(pipe));
|
|
|
}
|
|
@@ -1028,13 +1075,13 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
|
|
|
|
|
|
reg = PCH_ADPA;
|
|
|
val = I915_READ(reg);
|
|
|
- WARN(ADPA_PIPE_ENABLED(val, pipe),
|
|
|
+ WARN(adpa_pipe_enabled(dev_priv, val, pipe),
|
|
|
"PCH VGA enabled on transcoder %c, should be disabled\n",
|
|
|
pipe_name(pipe));
|
|
|
|
|
|
reg = PCH_LVDS;
|
|
|
val = I915_READ(reg);
|
|
|
- WARN(LVDS_PIPE_ENABLED(val, pipe),
|
|
|
+ WARN(lvds_pipe_enabled(dev_priv, val, pipe),
|
|
|
"PCH LVDS enabled on transcoder %c, should be disabled\n",
|
|
|
pipe_name(pipe));
|
|
|
|
|
@@ -1370,7 +1417,7 @@ static void disable_pch_hdmi(struct drm_i915_private *dev_priv,
|
|
|
enum pipe pipe, int reg)
|
|
|
{
|
|
|
u32 val = I915_READ(reg);
|
|
|
- if (HDMI_PIPE_ENABLED(val, pipe)) {
|
|
|
+ if (hdmi_pipe_enabled(dev_priv, val, pipe)) {
|
|
|
DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n",
|
|
|
reg, pipe);
|
|
|
I915_WRITE(reg, val & ~PORT_ENABLE);
|
|
@@ -1392,12 +1439,13 @@ static void intel_disable_pch_ports(struct drm_i915_private *dev_priv,
|
|
|
|
|
|
reg = PCH_ADPA;
|
|
|
val = I915_READ(reg);
|
|
|
- if (ADPA_PIPE_ENABLED(val, pipe))
|
|
|
+ if (adpa_pipe_enabled(dev_priv, val, pipe))
|
|
|
I915_WRITE(reg, val & ~ADPA_DAC_ENABLE);
|
|
|
|
|
|
reg = PCH_LVDS;
|
|
|
val = I915_READ(reg);
|
|
|
- if (LVDS_PIPE_ENABLED(val, pipe)) {
|
|
|
+ if (lvds_pipe_enabled(dev_priv, val, pipe)) {
|
|
|
+ DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val);
|
|
|
I915_WRITE(reg, val & ~LVDS_PORT_EN);
|
|
|
POSTING_READ(reg);
|
|
|
udelay(100);
|