Merge tag 'drm-intel-next-2014-10-03-no-ppgtt' of git://anongit.freedesktop.org/drm...
authorDave Airlie <airlied@redhat.com>
Tue, 28 Oct 2014 02:37:58 +0000 (12:37 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 28 Oct 2014 02:37:58 +0000 (12:37 +1000)
Ok, new attempt, this time around with full ppgtt disabled again.

drm-intel-next-2014-10-03:
- first batch of skl stage 1 enabling
- fixes from Rodrigo to the PSR, fbc and sink crc code
- kerneldoc for the frontbuffer tracking code, runtime pm code and the basic
  interrupt enable/disable functions
- smaller stuff all over
drm-intel-next-2014-09-19:
- bunch more i830M fixes from Ville
- full ppgtt now again enabled by default
- more ppgtt fixes from Michel Thierry and Chris Wilson
- plane config work from Gustavo Padovan
- spinlock clarifications
- piles of smaller improvements all over, as usual

* tag 'drm-intel-next-2014-10-03-no-ppgtt' of git://anongit.freedesktop.org/drm-intel: (114 commits)
  Revert "drm/i915: Enable full PPGTT on gen7"
  drm/i915: Update DRIVER_DATE to 20141003
  drm/i915: Remove the duplicated logic between the two shrink phases
  drm/i915: kerneldoc for interrupt enable/disable functions
  drm/i915: Use dev_priv instead of dev in irq setup functions
  drm/i915: s/pm._irqs_disabled/pm.irqs_enabled/
  drm/i915: Clear TX FIFO reset master override bits on chv
  drm/i915: Make sure hardware uses the correct swing margin/deemph bits on chv
  drm/i915: make sink_crc return -EIO on aux read/write failure
  drm/i915: Constify send buffer for intel_dp_aux_ch
  drm/i915: De-magic the PSR AUX message
  drm/i915: Reinstate error level message for non-simulated gpu hangs
  drm/i915: Kerneldoc for intel_runtime_pm.c
  drm/i915: Call runtime_pm_disable directly
  drm/i915: Move intel_display_set_init_power to intel_runtime_pm.c
  drm/i915: Bikeshed rpm functions name a bit.
  drm/i915: Extract intel_runtime_pm.c
  drm/i915: Remove intel_modeset_suspend_hw
  drm/i915: spelling fixes for frontbuffer tracking kerneldoc
  drm/i915: Tighting frontbuffer tracking around flips
  ...

1  2 
drivers/gpu/drm/i915/i915_cmd_parser.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_ringbuffer.c

@@@ -709,13 -709,11 +709,13 @@@ int i915_cmd_parser_init_ring(struct in
        BUG_ON(!validate_cmds_sorted(ring, cmd_tables, cmd_table_count));
        BUG_ON(!validate_regs_sorted(ring));
  
 -      ret = init_hash_table(ring, cmd_tables, cmd_table_count);
 -      if (ret) {
 -              DRM_ERROR("CMD: cmd_parser_init failed!\n");
 -              fini_hash_table(ring);
 -              return ret;
 +      if (hash_empty(ring->cmd_hash)) {
 +              ret = init_hash_table(ring, cmd_tables, cmd_table_count);
 +              if (ret) {
 +                      DRM_ERROR("CMD: cmd_parser_init failed!\n");
 +                      fini_hash_table(ring);
 +                      return ret;
 +              }
        }
  
        ring->needs_cmd_parser = true;
@@@ -847,12 -845,7 +847,7 @@@ bool i915_needs_cmd_parser(struct intel
        if (!ring->needs_cmd_parser)
                return false;
  
-       /*
-        * XXX: VLV is Gen7 and therefore has cmd_tables, but has PPGTT
-        * disabled. That will cause all of the parser's PPGTT checks to
-        * fail. For now, disable parsing when PPGTT is off.
-        */
-       if (USES_PPGTT(ring->dev))
+       if (!USES_PPGTT(ring->dev))
                return false;
  
        return (i915.enable_cmd_parser == 1);
@@@ -888,8 -881,10 +883,10 @@@ static bool check_cmd(const struct inte
                 * OACONTROL writes to only MI_LOAD_REGISTER_IMM commands.
                 */
                if (reg_addr == OACONTROL) {
-                       if (desc->cmd.value == MI_LOAD_REGISTER_MEM)
+                       if (desc->cmd.value == MI_LOAD_REGISTER_MEM) {
+                               DRM_DEBUG_DRIVER("CMD: Rejected LRM to OACONTROL\n");
                                return false;
+                       }
  
                        if (desc->cmd.value == MI_LOAD_REGISTER_IMM(1))
                                *oacontrol_set = (cmd[2] != 0);
@@@ -35,13 -35,21 +35,21 @@@ static void chv_setup_private_ppat(stru
  
  static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt)
  {
-       if (enable_ppgtt == 0 || !HAS_ALIASING_PPGTT(dev))
+       bool has_aliasing_ppgtt;
+       bool has_full_ppgtt;
+       has_aliasing_ppgtt = INTEL_INFO(dev)->gen >= 6;
+       has_full_ppgtt = INTEL_INFO(dev)->gen >= 7;
+       if (IS_GEN8(dev))
+               has_full_ppgtt = false; /* XXX why? */
+       if (enable_ppgtt == 0 || !has_aliasing_ppgtt)
                return 0;
  
        if (enable_ppgtt == 1)
                return 1;
  
-       if (enable_ppgtt == 2 && HAS_PPGTT(dev))
+       if (enable_ppgtt == 2 && has_full_ppgtt)
                return 2;
  
  #ifdef CONFIG_INTEL_IOMMU
@@@ -59,7 -67,7 +67,7 @@@
                return 0;
        }
  
-       return HAS_ALIASING_PPGTT(dev) ? 1 : 0;
+       return has_aliasing_ppgtt ? 1 : 0;
  }
  
  
@@@ -1092,7 -1100,7 +1100,7 @@@ static int __hw_ppgtt_init(struct drm_d
  
        if (INTEL_INFO(dev)->gen < 8)
                return gen6_ppgtt_init(ppgtt);
-       else if (IS_GEN8(dev))
+       else if (IS_GEN8(dev) || IS_GEN9(dev))
                return gen8_ppgtt_init(ppgtt, dev_priv->gtt.base.total);
        else
                BUG();
@@@ -1273,16 -1281,6 +1281,16 @@@ void i915_check_and_clear_faults(struc
        POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS]));
  }
  
 +static void i915_ggtt_flush(struct drm_i915_private *dev_priv)
 +{
 +      if (INTEL_INFO(dev_priv->dev)->gen < 6) {
 +              intel_gtt_chipset_flush();
 +      } else {
 +              I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
 +              POSTING_READ(GFX_FLSH_CNTL_GEN6);
 +      }
 +}
 +
  void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
                                       dev_priv->gtt.base.start,
                                       dev_priv->gtt.base.total,
                                       true);
 +
 +      i915_ggtt_flush(dev_priv);
  }
  
  void i915_gem_restore_gtt_mappings(struct drm_device *dev)
                gen6_write_pdes(container_of(vm, struct i915_hw_ppgtt, base));
        }
  
 -      i915_gem_chipset_flush(dev);
 +      i915_ggtt_flush(dev_priv);
  }
  
  int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj)
@@@ -1764,7 -1760,6 +1772,6 @@@ static int setup_scratch_page(struct dr
        page = alloc_page(GFP_KERNEL | GFP_DMA32 | __GFP_ZERO);
        if (page == NULL)
                return -ENOMEM;
-       get_page(page);
        set_pages_uc(page, 1);
  
  #ifdef CONFIG_INTEL_IOMMU
@@@ -1789,7 -1784,6 +1796,6 @@@ static void teardown_scratch_page(struc
        set_pages_wb(page, 1);
        pci_unmap_page(dev->pdev, dev_priv->gtt.base.scratch.addr,
                       PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
-       put_page(page);
        __free_page(page);
  }
  
@@@ -1859,6 -1853,18 +1865,18 @@@ static size_t chv_get_stolen_size(u16 g
                return (gmch_ctrl - 0x17 + 9) << 22;
  }
  
+ static size_t gen9_get_stolen_size(u16 gen9_gmch_ctl)
+ {
+       gen9_gmch_ctl >>= BDW_GMCH_GMS_SHIFT;
+       gen9_gmch_ctl &= BDW_GMCH_GMS_MASK;
+       if (gen9_gmch_ctl < 0xf0)
+               return gen9_gmch_ctl << 25; /* 32 MB units */
+       else
+               /* 4MB increments starting at 0xf0 for 4MB */
+               return (gen9_gmch_ctl - 0xf0 + 1) << 22;
+ }
  static int ggtt_probe_common(struct drm_device *dev,
                             size_t gtt_size)
  {
@@@ -1955,7 -1961,10 +1973,10 @@@ static int gen8_gmch_probe(struct drm_d
  
        pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
  
-       if (IS_CHERRYVIEW(dev)) {
+       if (INTEL_INFO(dev)->gen >= 9) {
+               *stolen = gen9_get_stolen_size(snb_gmch_ctl);
+               gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
+       } else if (IS_CHERRYVIEW(dev)) {
                *stolen = chv_get_stolen_size(snb_gmch_ctl);
                gtt_size = chv_get_total_gtt_size(snb_gmch_ctl);
        } else {
@@@ -2127,6 -2136,7 +2148,7 @@@ static struct i915_vma *__i915_gem_vma_
        vma->obj = obj;
  
        switch (INTEL_INFO(vm->dev)->gen) {
+       case 9:
        case 8:
        case 7:
        case 6:
@@@ -225,7 -225,7 +225,7 @@@ intel_dp_mode_valid(struct drm_connecto
  }
  
  static uint32_t
- pack_aux(uint8_t *src, int src_bytes)
+ pack_aux(const uint8_t *src, int src_bytes)
  {
        int     i;
        uint32_t v = 0;
@@@ -661,6 -661,16 +661,16 @@@ static uint32_t vlv_get_aux_clock_divid
        return index ? 0 : 100;
  }
  
+ static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
+ {
+       /*
+        * SKL doesn't need us to program the AUX clock divider (Hardware will
+        * derive the clock from CDCLK automatically). We still implement the
+        * get_aux_clock_divider vfunc to plug-in into the existing code.
+        */
+       return index ? 0 : 1;
+ }
  static uint32_t i9xx_get_aux_send_ctl(struct intel_dp *intel_dp,
                                      bool has_aux_irq,
                                      int send_bytes,
               (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT);
  }
  
+ static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp,
+                                     bool has_aux_irq,
+                                     int send_bytes,
+                                     uint32_t unused)
+ {
+       return DP_AUX_CH_CTL_SEND_BUSY |
+              DP_AUX_CH_CTL_DONE |
+              (has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
+              DP_AUX_CH_CTL_TIME_OUT_ERROR |
+              DP_AUX_CH_CTL_TIME_OUT_1600us |
+              DP_AUX_CH_CTL_RECEIVE_ERROR |
+              (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
+              DP_AUX_CH_CTL_SYNC_PULSE_SKL(32);
+ }
  static int
  intel_dp_aux_ch(struct intel_dp *intel_dp,
-               uint8_t *send, int send_bytes,
+               const uint8_t *send, int send_bytes,
                uint8_t *recv, int recv_size)
  {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
@@@ -925,7 -950,16 +950,16 @@@ intel_dp_aux_init(struct intel_dp *inte
                BUG();
        }
  
-       if (!HAS_DDI(dev))
+       /*
+        * The AUX_CTL register is usually DP_CTL + 0x10.
+        *
+        * On Haswell and Broadwell though:
+        *   - Both port A DDI_BUF_CTL and DDI_AUX_CTL are on the CPU
+        *   - Port B/C/D AUX channels are on the PCH, DDI_BUF_CTL on the CPU
+        *
+        * Skylake moves AUX_CTL back next to DDI_BUF_CTL, on the CPU.
+        */
+       if (!IS_HASWELL(dev) && !IS_BROADWELL(dev))
                intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
  
        intel_dp->aux.name = name;
@@@ -1819,7 -1853,7 +1853,7 @@@ static bool intel_dp_get_hw_state(struc
        u32 tmp;
  
        power_domain = intel_display_port_power_domain(encoder);
-       if (!intel_display_power_enabled(dev_priv, power_domain))
+       if (!intel_display_power_is_enabled(dev_priv, power_domain))
                return false;
  
        tmp = I915_READ(intel_dp->output_reg);
@@@ -1907,10 -1941,6 +1941,10 @@@ static void intel_dp_get_config(struct 
  
        pipe_config->adjusted_mode.flags |= flags;
  
 +      if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
 +          tmp & DP_COLOR_RANGE_16_235)
 +              pipe_config->limited_color_range = true;
 +
        pipe_config->has_dp_encoder = true;
  
        intel_dp_get_m_n(crtc, pipe_config);
@@@ -1995,10 -2025,8 +2029,8 @@@ static void intel_edp_psr_write_vsc(str
        POSTING_READ(ctl_reg);
  }
  
- static void intel_edp_psr_setup(struct intel_dp *intel_dp)
+ static void intel_edp_psr_setup_vsc(struct intel_dp *intel_dp)
  {
-       struct drm_device *dev = intel_dp_to_dev(intel_dp);
-       struct drm_i915_private *dev_priv = dev->dev_private;
        struct edp_vsc_psr psr_vsc;
  
        /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */
        psr_vsc.sdp_header.HB2 = 0x2;
        psr_vsc.sdp_header.HB3 = 0x8;
        intel_edp_psr_write_vsc(intel_dp, &psr_vsc);
-       /* Avoid continuous PSR exit by masking memup and hpd */
-       I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP |
-                  EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP);
  }
  
  static void intel_edp_psr_enable_sink(struct intel_dp *intel_dp)
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t aux_clock_divider;
        int precharge = 0x3;
-       int msg_size = 5;       /* Header(4) + Message(1) */
        bool only_standby = false;
+       static const uint8_t aux_msg[] = {
+               [0] = DP_AUX_NATIVE_WRITE << 4,
+               [1] = DP_SET_POWER >> 8,
+               [2] = DP_SET_POWER & 0xff,
+               [3] = 1 - 1,
+               [4] = DP_SET_POWER_D0,
+       };
+       int i;
+       BUILD_BUG_ON(sizeof(aux_msg) > 20);
  
        aux_clock_divider = intel_dp->get_aux_clock_divider(intel_dp, 0);
  
                                   DP_PSR_ENABLE | DP_PSR_MAIN_LINK_ACTIVE);
  
        /* Setup AUX registers */
-       I915_WRITE(EDP_PSR_AUX_DATA1(dev), EDP_PSR_DPCD_COMMAND);
-       I915_WRITE(EDP_PSR_AUX_DATA2(dev), EDP_PSR_DPCD_NORMAL_OPERATION);
+       for (i = 0; i < sizeof(aux_msg); i += 4)
+               I915_WRITE(EDP_PSR_AUX_DATA1(dev) + i,
+                          pack_aux(&aux_msg[i], sizeof(aux_msg) - i));
        I915_WRITE(EDP_PSR_AUX_CTL(dev),
                   DP_AUX_CH_CTL_TIME_OUT_400us |
-                  (msg_size << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
+                  (sizeof(aux_msg) << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
                   (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) |
                   (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT));
  }
@@@ -2131,10 -2166,7 +2170,7 @@@ static void intel_edp_psr_do_enable(str
        WARN_ON(dev_priv->psr.active);
        lockdep_assert_held(&dev_priv->psr.lock);
  
-       /* Enable PSR on the panel */
-       intel_edp_psr_enable_sink(intel_dp);
-       /* Enable PSR on the host */
+       /* Enable/Re-enable PSR on the host */
        intel_edp_psr_enable_source(intel_dp);
  
        dev_priv->psr.active = true;
@@@ -2158,17 -2190,25 +2194,25 @@@ void intel_edp_psr_enable(struct intel_
        mutex_lock(&dev_priv->psr.lock);
        if (dev_priv->psr.enabled) {
                DRM_DEBUG_KMS("PSR already in use\n");
-               mutex_unlock(&dev_priv->psr.lock);
-               return;
+               goto unlock;
        }
  
+       if (!intel_edp_psr_match_conditions(intel_dp))
+               goto unlock;
        dev_priv->psr.busy_frontbuffer_bits = 0;
  
-       /* Setup PSR once */
-       intel_edp_psr_setup(intel_dp);
+       intel_edp_psr_setup_vsc(intel_dp);
  
-       if (intel_edp_psr_match_conditions(intel_dp))
-               dev_priv->psr.enabled = intel_dp;
+       /* Avoid continuous PSR exit by masking memup and hpd */
+       I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP |
+                  EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP);
+       /* Enable PSR on the panel */
+       intel_edp_psr_enable_sink(intel_dp);
+       dev_priv->psr.enabled = intel_dp;
+ unlock:
        mutex_unlock(&dev_priv->psr.lock);
  }
  
@@@ -2209,6 -2249,17 +2253,17 @@@ static void intel_edp_psr_work(struct w
                container_of(work, typeof(*dev_priv), psr.work.work);
        struct intel_dp *intel_dp = dev_priv->psr.enabled;
  
+       /* We have to make sure PSR is ready for re-enable
+        * otherwise it keeps disabled until next full enable/disable cycle.
+        * PSR might take some time to get fully disabled
+        * and be ready for re-enable.
+        */
+       if (wait_for((I915_READ(EDP_PSR_STATUS_CTL(dev_priv->dev)) &
+                     EDP_PSR_STATUS_STATE_MASK) == 0, 50)) {
+               DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n");
+               return;
+       }
        mutex_lock(&dev_priv->psr.lock);
        intel_dp = dev_priv->psr.enabled;
  
@@@ -2680,6 -2731,15 +2735,15 @@@ static void chv_pre_enable_dp(struct in
  
        mutex_lock(&dev_priv->dpio_lock);
  
+       /* allow hardware to manage TX FIFO reset source */
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
+       val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
+       val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
        /* Deassert soft data lane reset*/
        val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
        val |= CHV_PCS_REQ_SOFTRESET_EN;
@@@ -2836,7 -2896,9 +2900,9 @@@ intel_dp_voltage_max(struct intel_dp *i
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
        enum port port = dp_to_dig_port(intel_dp)->port;
  
-       if (IS_VALLEYVIEW(dev))
+       if (INTEL_INFO(dev)->gen >= 9)
+               return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
+       else if (IS_VALLEYVIEW(dev))
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
        else if (IS_GEN7(dev) && port == PORT_A)
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
@@@ -2852,7 -2914,18 +2918,18 @@@ intel_dp_pre_emphasis_max(struct intel_
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
        enum port port = dp_to_dig_port(intel_dp)->port;
  
-       if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
+       if (INTEL_INFO(dev)->gen >= 9) {
+               switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
+               case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
+                       return DP_TRAIN_PRE_EMPH_LEVEL_3;
+               case DP_TRAIN_VOLTAGE_SWING_LEVEL_1:
+                       return DP_TRAIN_PRE_EMPH_LEVEL_2;
+               case DP_TRAIN_VOLTAGE_SWING_LEVEL_2:
+                       return DP_TRAIN_PRE_EMPH_LEVEL_1;
+               default:
+                       return DP_TRAIN_PRE_EMPH_LEVEL_0;
+               }
+       } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_LEVEL_0:
                        return DP_TRAIN_PRE_EMPH_LEVEL_3;
@@@ -3088,12 -3161,26 +3165,26 @@@ static uint32_t intel_chv_signal_levels
        /* Clear calc init */
        val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
        val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
+       val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
        vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
  
        val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
        val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
+       val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
        vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
  
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
+       val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
+       val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
+       val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
+       val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
        /* Program swing deemph */
        for (i = 0; i < 4; i++) {
                val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
@@@ -3334,7 -3421,7 +3425,7 @@@ intel_dp_set_signal_levels(struct intel
        uint32_t signal_levels, mask;
        uint8_t train_set = intel_dp->train_set[0];
  
-       if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
+       if (IS_HASWELL(dev) || IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) {
                signal_levels = intel_hsw_signal_levels(train_set);
                mask = DDI_BUF_EMP_MASK;
        } else if (IS_CHERRYVIEW(dev)) {
@@@ -3801,26 -3888,48 +3892,48 @@@ int intel_dp_sink_crc(struct intel_dp *
        struct drm_device *dev = intel_dig_port->base.base.dev;
        struct intel_crtc *intel_crtc =
                to_intel_crtc(intel_dig_port->base.base.crtc);
-       u8 buf[1];
+       u8 buf;
+       int test_crc_count;
+       int attempts = 6;
  
-       if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, buf) < 0)
+       if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
                return -EIO;
  
-       if (!(buf[0] & DP_TEST_CRC_SUPPORTED))
+       if (!(buf & DP_TEST_CRC_SUPPORTED))
                return -ENOTTY;
  
+       if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
+               return -EIO;
        if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
-                              DP_TEST_SINK_START) < 0)
+                               buf | DP_TEST_SINK_START) < 0)
+               return -EIO;
+       if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK_MISC, &buf) < 0)
                return -EIO;
+       test_crc_count = buf & DP_TEST_COUNT_MASK;
  
-       /* Wait 2 vblanks to be sure we will have the correct CRC value */
-       intel_wait_for_vblank(dev, intel_crtc->pipe);
-       intel_wait_for_vblank(dev, intel_crtc->pipe);
+       do {
+               if (drm_dp_dpcd_readb(&intel_dp->aux,
+                                     DP_TEST_SINK_MISC, &buf) < 0)
+                       return -EIO;
+               intel_wait_for_vblank(dev, intel_crtc->pipe);
+       } while (--attempts && (buf & DP_TEST_COUNT_MASK) == test_crc_count);
+       if (attempts == 0) {
+               DRM_ERROR("Panel is unable to calculate CRC after 6 vblanks\n");
+               return -EIO;
+       }
  
        if (drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_CRC_R_CR, crc, 6) < 0)
                return -EIO;
  
-       drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK, 0);
+       if (drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_SINK, &buf) < 0)
+               return -EIO;
+       if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_SINK,
+                              buf & ~DP_TEST_SINK_START) < 0)
+               return -EIO;
        return 0;
  }
  
@@@ -5057,7 -5166,9 +5170,9 @@@ intel_dp_init_connector(struct intel_di
        intel_dp->pps_pipe = INVALID_PIPE;
  
        /* intel_dp vfuncs */
-       if (IS_VALLEYVIEW(dev))
+       if (INTEL_INFO(dev)->gen >= 9)
+               intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
+       else if (IS_VALLEYVIEW(dev))
                intel_dp->get_aux_clock_divider = vlv_get_aux_clock_divider;
        else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
        else
                intel_dp->get_aux_clock_divider = i9xx_get_aux_clock_divider;
  
-       intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
+       if (INTEL_INFO(dev)->gen >= 9)
+               intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl;
+       else
+               intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
  
        /* Preserve the current hw state. */
        intel_dp->DP = I915_READ(intel_dp->output_reg);
@@@ -690,7 -690,7 +690,7 @@@ static bool intel_hdmi_get_hw_state(str
        u32 tmp;
  
        power_domain = intel_display_port_power_domain(encoder);
-       if (!intel_display_power_enabled(dev_priv, power_domain))
+       if (!intel_display_power_is_enabled(dev_priv, power_domain))
                return false;
  
        tmp = I915_READ(intel_hdmi->hdmi_reg);
@@@ -712,8 -712,7 +712,8 @@@ static void intel_hdmi_get_config(struc
                                  struct intel_crtc_config *pipe_config)
  {
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 -      struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
 +      struct drm_device *dev = encoder->base.dev;
 +      struct drm_i915_private *dev_priv = dev->dev_private;
        u32 tmp, flags = 0;
        int dotclock;
  
        if (tmp & HDMI_MODE_SELECT_HDMI)
                pipe_config->has_hdmi_sink = true;
  
 -      if (tmp & HDMI_MODE_SELECT_HDMI)
 +      if (tmp & SDVO_AUDIO_ENABLE)
                pipe_config->has_audio = true;
  
 +      if (!HAS_PCH_SPLIT(dev) &&
 +          tmp & HDMI_COLOR_RANGE_16_235)
 +              pipe_config->limited_color_range = true;
 +
        pipe_config->adjusted_mode.flags |= flags;
  
        if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
@@@ -1405,6 -1400,15 +1405,15 @@@ static void chv_hdmi_pre_enable(struct 
  
        mutex_lock(&dev_priv->dpio_lock);
  
+       /* allow hardware to manage TX FIFO reset source */
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
+       val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
+       val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
        /* Deassert soft data lane reset*/
        val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
        val |= CHV_PCS_REQ_SOFTRESET_EN;
        /* Clear calc init */
        val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
        val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
+       val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
        vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
  
        val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
        val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
+       val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
        vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
  
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
+       val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
+       val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
+       val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
+       val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
        /* FIXME: Program the support xxx V-dB */
        /* Use 800mV-0dB */
        for (i = 0; i < 4; i++) {
@@@ -729,8 -729,12 +729,12 @@@ static int bdw_init_workarounds(struct 
         * workaround for for a possible hang in the unlikely event a TLB
         * invalidation occurs during a PSD flush.
         */
+       /* WaDisableFenceDestinationToSLM:bdw (GT3 pre-production) */
        intel_ring_emit_wa(ring, HDC_CHICKEN0,
-                          _MASKED_BIT_ENABLE(HDC_FORCE_NON_COHERENT));
+                          _MASKED_BIT_ENABLE(HDC_FORCE_NON_COHERENT |
+                                             (IS_BDW_GT3(dev) ?
+                                              HDC_FENCE_DEST_SLM_DISABLE : 0)
+                                  ));
  
        /* Wa4x4STCOptimizationDisable:bdw */
        intel_ring_emit_wa(ring, CACHE_MODE_1,
@@@ -812,7 -816,7 +816,7 @@@ static int init_render_ring(struct inte
         *
         * WaDisableAsyncFlipPerfMode:snb,ivb,hsw,vlv,bdw,chv
         */
-       if (INTEL_INFO(dev)->gen >= 6)
+       if (INTEL_INFO(dev)->gen >= 6 && INTEL_INFO(dev)->gen < 9)
                I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE));
  
        /* Required for the hardware to program scanline values for waiting */
@@@ -1186,7 -1190,7 +1190,7 @@@ gen5_ring_get_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return false;
  
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@@ -1217,7 -1221,7 +1221,7 @@@ i9xx_ring_get_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
+       if (!intel_irqs_enabled(dev_priv))
                return false;
  
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@@ -1254,7 -1258,7 +1258,7 @@@ i8xx_ring_get_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
+       if (!intel_irqs_enabled(dev_priv))
                return false;
  
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@@ -1388,8 -1392,8 +1392,8 @@@ gen6_ring_get_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
-              return false;
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
+               return false;
  
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
        if (ring->irq_refcount++ == 0) {
@@@ -1431,7 -1435,7 +1435,7 @@@ hsw_vebox_get_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return false;
  
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@@ -1451,9 -1455,6 +1455,6 @@@ hsw_vebox_put_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
-               return;
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
        if (--ring->irq_refcount == 0) {
                I915_WRITE_IMR(ring, ~0);
@@@ -1469,7 -1470,7 +1470,7 @@@ gen8_ring_get_irq(struct intel_engine_c
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
  
-       if (!dev->irq_enabled)
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return false;
  
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@@ -1568,7 -1569,7 +1569,7 @@@ i830_dispatch_execbuffer(struct intel_e
                 */
                intel_ring_emit(ring, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
                intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
 -              intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 1024);
 +              intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 4096);
                intel_ring_emit(ring, cs_offset);
                intel_ring_emit(ring, 4096);
                intel_ring_emit(ring, offset);
@@@ -2229,6 -2230,7 +2230,7 @@@ static int gen6_ring_flush(struct intel
                           u32 invalidate, u32 flush)
  {
        struct drm_device *dev = ring->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t cmd;
        int ret;
  
        }
        intel_ring_advance(ring);
  
-       if (IS_GEN7(dev) && !invalidate && flush)
-               return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN);
+       if (!invalidate && flush) {
+               if (IS_GEN7(dev))
+                       return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN);
+               else if (IS_BROADWELL(dev))
+                       dev_priv->fbc.need_sw_cache_clean = true;
+       }
  
        return 0;
  }