Merge tag 'drm-intel-next-fixes-2016-05-25' of git://anongit.freedesktop.org/drm...
authorDave Airlie <airlied@redhat.com>
Fri, 27 May 2016 06:08:38 +0000 (16:08 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 27 May 2016 06:08:38 +0000 (16:08 +1000)
I see the main drm pull got merged, here's the first batch of fixes for
4.7 already. Fixes all around, a large portion cc: stable stuff.

[airlied: the DP++ stuff is a regression fix].
* tag 'drm-intel-next-fixes-2016-05-25' of git://anongit.freedesktop.org/drm-intel:
  drm/i915: Stop automatically retiring requests after a GPU hang
  drm/i915: Unify intel_ring_begin()
  drm/i915: Ignore stale wm register values on resume on ilk-bdw (v2)
  drm/i915/psr: Try to program link training times correctly
  drm/i915/bxt: Adjusting the error in horizontal timings retrieval
  drm/i915: Don't leave old junk in ilk active watermarks on readout
  drm/i915: s/DPPL/DPLL/ for SKL DPLLs
  drm/i915: Fix gen8 semaphores id for legacy mode
  drm/i915: Set crtc_state->lane_count for HDMI
  drm/i915/BXT: Retrieving the horizontal timing for DSI
  drm/i915: Protect gen7 irq_seqno_barrier with uncore lock
  drm/i915: Re-enable GGTT earlier during resume on pre-gen6 platforms
  drm/i915: Determine DP++ type 1 DVI adaptor presence based on VBT
  drm/i915: Enable/disable TMDS output buffers in DP++ adaptor as needed
  drm/i915: Respect DP++ adaptor TMDS clock limit
  drm: Add helper for DP++ adaptors

1  2 
Documentation/DocBook/gpu.tmpl
drivers/gpu/drm/Makefile
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_pm.c

@@@ -1615,17 -1615,18 +1615,23 @@@ void intel_crt_init(struct drm_device *
  !Pdrivers/gpu/drm/drm_fb_helper.c fbdev helpers
  !Edrivers/gpu/drm/drm_fb_helper.c
  !Iinclude/drm/drm_fb_helper.h
 +    </sect2>
 +    <sect2>
 +      <title>Framebuffer CMA Helper Functions Reference</title>
 +!Pdrivers/gpu/drm/drm_fb_cma_helper.c framebuffer cma helper functions
 +!Edrivers/gpu/drm/drm_fb_cma_helper.c
      </sect2>
      <sect2>
        <title>Display Port Helper Functions Reference</title>
  !Pdrivers/gpu/drm/drm_dp_helper.c dp helpers
  !Iinclude/drm/drm_dp_helper.h
  !Edrivers/gpu/drm/drm_dp_helper.c
+     </sect2>
+     <sect2>
+       <title>Display Port Dual Mode Adaptor Helper Functions Reference</title>
+ !Pdrivers/gpu/drm/drm_dp_dual_mode_helper.c dp dual mode helpers
+ !Iinclude/drm/drm_dp_dual_mode_helper.h
+ !Edrivers/gpu/drm/drm_dp_dual_mode_helper.c
      </sect2>
      <sect2>
        <title>Display Port MST Helper Functions Reference</title>
  !Pdrivers/gpu/drm/drm_crtc.c Tile group
      </sect2>
      <sect2>
 -      <title>Bridges</title>
 +      <title>Bridges</title>
        <sect3>
 -       <title>Overview</title>
 +        <title>Overview</title>
  !Pdrivers/gpu/drm/drm_bridge.c overview
        </sect3>
        <sect3>
 -       <title>Default bridge callback sequence</title>
 +        <title>Default bridge callback sequence</title>
  !Pdrivers/gpu/drm/drm_bridge.c bridge callbacks
        </sect3>
  !Edrivers/gpu/drm/drm_bridge.c
      </sect2>
 +    <sect2>
 +      <title>Panel Helper Reference</title>
 +!Iinclude/drm/drm_panel.h
 +!Edrivers/gpu/drm/drm_panel.c
 +!Pdrivers/gpu/drm/drm_panel.c drm panel
 +    </sect2>
    </sect1>
  
    <!-- Internals: kms properties -->
        </tr>
        <tr>
        <td rowspan="42" valign="top" >DRM</td>
 -      <td valign="top" >Generic</td>
 +      <td rowspan="2" valign="top" >Generic</td>
        <td valign="top" >“rotation”</td>
        <td valign="top" >BITMASK</td>
        <td valign="top" >{ 0, "rotate-0" },
        image along the specified axis prior to rotation</td>
        </tr>
        <tr>
 +      <td valign="top" >“scaling mode”</td>
 +      <td valign="top" >ENUM</td>
 +      <td valign="top" >{ "None", "Full", "Center", "Full aspect" }</td>
 +      <td valign="top" >Connector</td>
 +      <td valign="top" >Supported by: amdgpu, gma500, i915, nouveau and radeon.</td>
 +      </tr>
 +      <tr>
        <td rowspan="5" valign="top" >Connector</td>
        <td valign="top" >“EDID”</td>
        <td valign="top" >BLOB | IMMUTABLE</td>
        <td valign="top" >property to suggest an Y offset for a connector</td>
        </tr>
        <tr>
 -      <td rowspan="8" valign="top" >Optional</td>
 -      <td valign="top" >“scaling mode”</td>
 -      <td valign="top" >ENUM</td>
 -      <td valign="top" >{ "None", "Full", "Center", "Full aspect" }</td>
 -      <td valign="top" >Connector</td>
 -      <td valign="top" >TBD</td>
 -      </tr>
 -      <tr>
 +      <td rowspan="7" valign="top" >Optional</td>
        <td valign="top" >"aspect ratio"</td>
        <td valign="top" >ENUM</td>
        <td valign="top" >{ "None", "4:3", "16:9" }</td>
        <td valign="top" >Connector</td>
 -      <td valign="top" >DRM property to set aspect ratio from user space app.
 -              This enum is made generic to allow addition of custom aspect
 -              ratios.</td>
 +      <td valign="top" >TDB</td>
        </tr>
        <tr>
        <td valign="top" >“dirty”</td>
diff --combined drivers/gpu/drm/Makefile
@@@ -1,4 -1,4 +1,4 @@@
 -#
 +
  # Makefile for the drm device driver.  This driver provides support for the
  # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
  
@@@ -23,7 -23,7 +23,7 @@@ drm-$(CONFIG_AGP) += drm_agpsupport.
  
  drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \
                drm_plane_helper.o drm_dp_mst_topology.o drm_atomic_helper.o \
-               drm_kms_helper_common.o
+               drm_kms_helper_common.o drm_dp_dual_mode_helper.o
  
  drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o
  drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
@@@ -65,7 -65,6 +65,7 @@@ obj-$(CONFIG_DRM_ATMEL_HLCDC) += atmel-
  obj-$(CONFIG_DRM_RCAR_DU) += rcar-du/
  obj-$(CONFIG_DRM_SHMOBILE) +=shmobile/
  obj-y                 += omapdrm/
 +obj-$(CONFIG_DRM_SUN4I) += sun4i/
  obj-y                 += tilcdc/
  obj-$(CONFIG_DRM_QXL) += qxl/
  obj-$(CONFIG_DRM_BOCHS) += bochs/
@@@ -74,11 -73,8 +74,11 @@@ obj-$(CONFIG_DRM_MSM) += msm
  obj-$(CONFIG_DRM_TEGRA) += tegra/
  obj-$(CONFIG_DRM_STI) += sti/
  obj-$(CONFIG_DRM_IMX) += imx/
 +obj-$(CONFIG_DRM_MEDIATEK) += mediatek/
  obj-y                 += i2c/
  obj-y                 += panel/
  obj-y                 += bridge/
  obj-$(CONFIG_DRM_FSL_DCU) += fsl-dcu/
  obj-$(CONFIG_DRM_ETNAVIV) += etnaviv/
 +obj-$(CONFIG_DRM_ARCPGU)+= arc/
 +obj-y                 += hisilicon/
@@@ -476,6 -476,9 +476,6 @@@ static int i915_load_modeset_init(struc
  
        intel_modeset_gem_init(dev);
  
 -      /* Always safe in the mode setting case. */
 -      /* FIXME: do pre/post-mode set stuff in core KMS code */
 -      dev->vblank_disable_allowed = true;
        if (INTEL_INFO(dev)->num_pipes == 0)
                return 0;
  
@@@ -1183,6 -1186,12 +1183,12 @@@ static int i915_driver_init_hw(struct d
        if (ret)
                return ret;
  
+       ret = i915_ggtt_enable_hw(dev);
+       if (ret) {
+               DRM_ERROR("failed to enable GGTT\n");
+               goto out_ggtt;
+       }
        /* WARNING: Apparently we must kick fbdev drivers before vgacon,
         * otherwise the vga fbdev driver falls over. */
        ret = i915_kick_out_firmware_fb(dev_priv);
@@@ -734,9 -734,14 +734,14 @@@ int i915_suspend_switcheroo(struct drm_
  static int i915_drm_resume(struct drm_device *dev)
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
+       int ret;
  
        disable_rpm_wakeref_asserts(dev_priv);
  
+       ret = i915_ggtt_enable_hw(dev);
+       if (ret)
+               DRM_ERROR("failed to re-enable GGTT\n");
        intel_csr_ucode_resume(dev_priv);
  
        mutex_lock(&dev->struct_mutex);
@@@ -1759,8 -1764,10 +1764,8 @@@ static int __init i915_init(void
        if (i915.modeset == 0)
                driver.driver_features &= ~DRIVER_MODESET;
  
 -#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && i915.modeset == -1)
                driver.driver_features &= ~DRIVER_MODESET;
 -#endif
  
        if (!(driver.driver_features & DRIVER_MODESET)) {
                /* Silently fail loading to not upset userspace. */
@@@ -3482,6 -3482,7 +3482,7 @@@ bool intel_bios_is_valid_vbt(const voi
  bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv);
  bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin);
  bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port);
+ bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum port port);
  bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv, enum port *port);
  bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
                                     enum port port);
@@@ -3675,6 -3676,11 +3676,6 @@@ static inline i915_reg_t i915_vgacntrl_
                return VGACNTRL;
  }
  
 -static inline void __user *to_user_ptr(u64 address)
 -{
 -      return (void __user *)(uintptr_t)address;
 -}
 -
  static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m)
  {
        unsigned long j = msecs_to_jiffies(m);
@@@ -319,7 -319,7 +319,7 @@@ i915_gem_phys_pwrite(struct drm_i915_ge
  {
        struct drm_device *dev = obj->base.dev;
        void *vaddr = obj->phys_handle->vaddr + args->offset;
 -      char __user *user_data = to_user_ptr(args->data_ptr);
 +      char __user *user_data = u64_to_user_ptr(args->data_ptr);
        int ret = 0;
  
        /* We manually control the domain here and pretend that it
@@@ -600,7 -600,7 +600,7 @@@ i915_gem_shmem_pread(struct drm_device 
        int needs_clflush = 0;
        struct sg_page_iter sg_iter;
  
 -      user_data = to_user_ptr(args->data_ptr);
 +      user_data = u64_to_user_ptr(args->data_ptr);
        remain = args->size;
  
        obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
@@@ -687,7 -687,7 +687,7 @@@ i915_gem_pread_ioctl(struct drm_device 
                return 0;
  
        if (!access_ok(VERIFY_WRITE,
 -                     to_user_ptr(args->data_ptr),
 +                     u64_to_user_ptr(args->data_ptr),
                       args->size))
                return -EFAULT;
  
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -779,7 -779,7 +779,7 @@@ i915_gem_gtt_pwrite_fast(struct drm_dev
        if (ret)
                goto out_unpin;
  
 -      user_data = to_user_ptr(args->data_ptr);
 +      user_data = u64_to_user_ptr(args->data_ptr);
        remain = args->size;
  
        offset = i915_gem_obj_ggtt_offset(obj) + args->offset;
@@@ -903,7 -903,7 +903,7 @@@ i915_gem_shmem_pwrite(struct drm_devic
        int needs_clflush_before = 0;
        struct sg_page_iter sg_iter;
  
 -      user_data = to_user_ptr(args->data_ptr);
 +      user_data = u64_to_user_ptr(args->data_ptr);
        remain = args->size;
  
        obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
@@@ -1032,12 -1032,12 +1032,12 @@@ i915_gem_pwrite_ioctl(struct drm_devic
                return 0;
  
        if (!access_ok(VERIFY_READ,
 -                     to_user_ptr(args->data_ptr),
 +                     u64_to_user_ptr(args->data_ptr),
                       args->size))
                return -EFAULT;
  
        if (likely(!i915.prefault_disable)) {
 -              ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
 +              ret = fault_in_multipages_readable(u64_to_user_ptr(args->data_ptr),
                                                   args->size);
                if (ret)
                        return -EFAULT;
        if (ret)
                goto put_rpm;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -1456,7 -1456,10 +1456,10 @@@ i915_wait_request(struct drm_i915_gem_r
        if (ret)
                return ret;
  
-       __i915_gem_request_retire__upto(req);
+       /* If the GPU hung, we want to keep the requests to find the guilty. */
+       if (req->reset_counter == i915_reset_counter(&dev_priv->gpu_error))
+               __i915_gem_request_retire__upto(req);
        return 0;
  }
  
@@@ -1513,7 -1516,8 +1516,8 @@@ i915_gem_object_retire_request(struct d
        else if (obj->last_write_req == req)
                i915_gem_object_retire__write(obj);
  
-       __i915_gem_request_retire__upto(req);
+       if (req->reset_counter == i915_reset_counter(&req->i915->gpu_error))
+               __i915_gem_request_retire__upto(req);
  }
  
  /* A nonblocking variant of the above wait. This is a highly dangerous routine
@@@ -1607,7 -1611,7 +1611,7 @@@ i915_gem_set_domain_ioctl(struct drm_de
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -1655,7 -1659,7 +1659,7 @@@ i915_gem_sw_finish_ioctl(struct drm_dev
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -1699,10 -1703,10 +1703,10 @@@ i915_gem_mmap_ioctl(struct drm_device *
        if (args->flags & ~(I915_MMAP_WC))
                return -EINVAL;
  
 -      if (args->flags & I915_MMAP_WC && !cpu_has_pat)
 +      if (args->flags & I915_MMAP_WC && !boot_cpu_has(X86_FEATURE_PAT))
                return -ENODEV;
  
 -      obj = drm_gem_object_lookup(dev, file, args->handle);
 +      obj = drm_gem_object_lookup(file, args->handle);
        if (obj == NULL)
                return -ENOENT;
  
                struct mm_struct *mm = current->mm;
                struct vm_area_struct *vma;
  
 -              down_write(&mm->mmap_sem);
 +              if (down_write_killable(&mm->mmap_sem)) {
 +                      drm_gem_object_unreference_unlocked(obj);
 +                      return -EINTR;
 +              }
                vma = find_vma(mm, addr);
                if (vma)
                        vma->vm_page_prot =
@@@ -2020,6 -2021,9 +2024,6 @@@ static int i915_gem_object_create_mmap_
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
        int ret;
  
 -      if (drm_vma_node_has_offset(&obj->base.vma_node))
 -              return 0;
 -
        dev_priv->mm.shrinker_no_lock_stealing = true;
  
        ret = drm_gem_create_mmap_offset(&obj->base);
@@@ -2068,7 -2072,7 +2072,7 @@@ i915_gem_mmap_gtt(struct drm_file *file
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -3143,7 -3147,7 +3147,7 @@@ i915_gem_wait_ioctl(struct drm_device *
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->bo_handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->bo_handle));
        if (&obj->base == NULL) {
                mutex_unlock(&dev->struct_mutex);
                return -ENOENT;
@@@ -3937,7 -3941,7 +3941,7 @@@ int i915_gem_get_caching_ioctl(struct d
        struct drm_i915_gem_caching *args = data;
        struct drm_i915_gem_object *obj;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL)
                return -ENOENT;
  
@@@ -3998,7 -4002,7 +4002,7 @@@ int i915_gem_set_caching_ioctl(struct d
        if (ret)
                goto rpm_put;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -4368,7 -4372,7 +4372,7 @@@ i915_gem_busy_ioctl(struct drm_device *
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -4433,7 -4437,7 +4437,7 @@@ i915_gem_madvise_ioctl(struct drm_devic
        if (ret)
                return ret;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
 +      obj = to_intel_bo(drm_gem_object_lookup(file_priv, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@@ -4860,9 -4864,6 +4864,6 @@@ i915_gem_init_hw(struct drm_device *dev
        struct intel_engine_cs *engine;
        int ret, j;
  
-       if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
-               return -EIO;
        /* Double layer security blanket, see i915_gem_init() */
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
  
@@@ -1601,6 -1601,12 +1601,12 @@@ static void intel_ddi_pre_enable(struc
        enum port port = intel_ddi_get_encoder_port(intel_encoder);
        int type = intel_encoder->type;
  
+       if (type == INTEL_OUTPUT_HDMI) {
+               struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
+               intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
+       }
        intel_prepare_ddi_buffer(intel_encoder);
  
        if (type == INTEL_OUTPUT_EDP) {
@@@ -1667,6 -1673,12 +1673,12 @@@ static void intel_ddi_post_disable(stru
                                        DPLL_CTRL2_DDI_CLK_OFF(port)));
        else if (INTEL_INFO(dev)->gen < 9)
                I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
+       if (type == INTEL_OUTPUT_HDMI) {
+               struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
+               intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
+       }
  }
  
  static void intel_enable_ddi(struct intel_encoder *intel_encoder)
@@@ -2131,6 -2143,23 +2143,6 @@@ void intel_ddi_fdi_disable(struct drm_c
        I915_WRITE(FDI_RX_CTL(PIPE_A), val);
  }
  
 -bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
 -                               struct intel_crtc *intel_crtc)
 -{
 -      u32 temp;
 -
 -      if (intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
 -              temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
 -
 -              intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
 -
 -              if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
 -                      return true;
 -      }
 -
 -      return false;
 -}
 -
  void intel_ddi_get_config(struct intel_encoder *encoder,
                          struct intel_crtc_state *pipe_config)
  {
  
                if (intel_hdmi->infoframe_enabled(&encoder->base, pipe_config))
                        pipe_config->has_infoframe = true;
-               break;
+               /* fall through */
        case TRANS_DDI_MODE_SELECT_DVI:
+               pipe_config->lane_count = 4;
+               break;
        case TRANS_DDI_MODE_SELECT_FDI:
                break;
        case TRANS_DDI_MODE_SELECT_DP_SST:
                break;
        }
  
 -      pipe_config->has_audio =
 -              intel_ddi_is_audio_enabled(dev_priv, intel_crtc);
 +      if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
 +              temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
 +              if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
 +                      pipe_config->has_audio = true;
 +      }
  
        if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.bpp &&
            pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
@@@ -8026,6 -8026,9 +8026,6 @@@ static void i9xx_get_pfit_config(struc
  
        pipe_config->gmch_pfit.control = tmp;
        pipe_config->gmch_pfit.pgm_ratios = I915_READ(PFIT_PGM_RATIOS);
 -      if (INTEL_INFO(dev)->gen < 5)
 -              pipe_config->gmch_pfit.lvds_border_bits =
 -                      I915_READ(LVDS) & LVDS_BORDER_ENABLE;
  }
  
  static void vlv_crtc_clock_get(struct intel_crtc *crtc,
@@@ -9678,8 -9681,6 +9678,8 @@@ static void broadwell_set_cdclk(struct 
        sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ, data);
        mutex_unlock(&dev_priv->rps.hw_lock);
  
 +      I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
 +
        intel_update_cdclk(dev);
  
        WARN(cdclk != dev_priv->cdclk_freq,
@@@ -12005,6 -12006,9 +12005,9 @@@ static int intel_crtc_atomic_check(stru
                        DRM_DEBUG_KMS("No valid intermediate pipe watermarks are possible\n");
                        return ret;
                }
+       } else if (dev_priv->display.compute_intermediate_wm) {
+               if (HAS_PCH_SPLIT(dev_priv) && INTEL_GEN(dev_priv) < 9)
+                       pipe_config->wm.intermediate = pipe_config->wm.optimal.ilk;
        }
  
        if (INTEL_INFO(dev)->gen >= 9) {
@@@ -12031,16 -12035,11 +12034,16 @@@ static void intel_modeset_update_connec
        struct intel_connector *connector;
  
        for_each_intel_connector(dev, connector) {
 +              if (connector->base.state->crtc)
 +                      drm_connector_unreference(&connector->base);
 +
                if (connector->base.encoder) {
                        connector->base.state->best_encoder =
                                connector->base.encoder;
                        connector->base.state->crtc =
                                connector->base.encoder->crtc;
 +
 +                      drm_connector_reference(&connector->base);
                } else {
                        connector->base.state->best_encoder = NULL;
                        connector->base.state->crtc = NULL;
@@@ -12923,7 -12922,7 +12926,7 @@@ verify_crtc_state(struct drm_crtc *crtc
        bool active;
  
        old_state = old_crtc_state->state;
 -      __drm_atomic_helper_crtc_destroy_state(crtc, old_crtc_state);
 +      __drm_atomic_helper_crtc_destroy_state(old_crtc_state);
        pipe_config = to_intel_crtc_state(old_crtc_state);
        memset(pipe_config, 0, sizeof(*pipe_config));
        pipe_config->base.crtc = crtc;
@@@ -13435,7 -13434,7 +13438,7 @@@ static int intel_atomic_check(struct dr
  
  static int intel_atomic_prepare_commit(struct drm_device *dev,
                                       struct drm_atomic_state *state,
 -                                     bool async)
 +                                     bool nonblock)
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_plane_state *plane_state;
        struct drm_crtc *crtc;
        int i, ret;
  
 -      if (async) {
 -              DRM_DEBUG_KMS("i915 does not yet support async commit\n");
 +      if (nonblock) {
 +              DRM_DEBUG_KMS("i915 does not yet support nonblocking commit\n");
                return -EINVAL;
        }
  
        ret = drm_atomic_helper_prepare_planes(dev, state);
        mutex_unlock(&dev->struct_mutex);
  
 -      if (!ret && !async) {
 +      if (!ret && !nonblock) {
                for_each_plane_in_state(state, plane, plane_state, i) {
                        struct intel_plane_state *intel_plane_state =
                                to_intel_plane_state(plane_state);
@@@ -13561,21 -13560,21 +13564,21 @@@ static bool needs_vblank_wait(struct in
   * intel_atomic_commit - commit validated state object
   * @dev: DRM device
   * @state: the top-level driver state object
 - * @async: asynchronous commit
 + * @nonblock: nonblocking commit
   *
   * This function commits a top-level state object that has been validated
   * with drm_atomic_helper_check().
   *
   * FIXME:  Atomic modeset support for i915 is not yet complete.  At the moment
   * we can only handle plane-related operations and do not yet support
 - * asynchronous commit.
 + * nonblocking commit.
   *
   * RETURNS
   * Zero for success or -errno.
   */
  static int intel_atomic_commit(struct drm_device *dev,
                               struct drm_atomic_state *state,
 -                             bool async)
 +                             bool nonblock)
  {
        struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long put_domains[I915_MAX_PIPES] = {};
        unsigned crtc_vblank_mask = 0;
  
 -      ret = intel_atomic_prepare_commit(dev, state, async);
 +      ret = intel_atomic_prepare_commit(dev, state, nonblock);
        if (ret) {
                DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
                return ret;
@@@ -14882,7 -14881,8 +14885,7 @@@ intel_user_framebuffer_create(struct dr
        struct drm_i915_gem_object *obj;
        struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
  
 -      obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
 -                                              mode_cmd.handles[0]));
 +      obj = to_intel_bo(drm_gem_object_lookup(filp, mode_cmd.handles[0]));
        if (&obj->base == NULL)
                return ERR_PTR(-ENOENT);
  
@@@ -15759,7 -15759,7 +15762,7 @@@ static void intel_modeset_readout_hw_st
                struct intel_crtc_state *crtc_state = crtc->config;
                int pixclk = 0;
  
 -              __drm_atomic_helper_crtc_destroy_state(&crtc->base, &crtc_state->base);
 +              __drm_atomic_helper_crtc_destroy_state(&crtc_state->base);
                memset(crtc_state, 0, sizeof(*crtc_state));
                crtc_state->base.crtc = &crtc->base;
  
@@@ -15990,6 -15990,9 +15993,9 @@@ retry
  
                state->acquire_ctx = &ctx;
  
+               /* ignore any reset values/BIOS leftovers in the WM registers */
+               to_intel_atomic_state(state)->skip_intermediate_wm = true;
                for_each_crtc_in_state(state, crtc, crtc_state, i) {
                        /*
                         * Force recalculation even if we restore
@@@ -33,6 -33,7 +33,7 @@@
  #include <drm/drm_crtc.h>
  #include <drm/drm_crtc_helper.h>
  #include <drm/drm_fb_helper.h>
+ #include <drm/drm_dp_dual_mode_helper.h>
  #include <drm/drm_dp_mst_helper.h>
  #include <drm/drm_rect.h>
  #include <drm/drm_atomic.h>
@@@ -753,6 -754,10 +754,10 @@@ struct cxsr_latency 
  struct intel_hdmi {
        i915_reg_t hdmi_reg;
        int ddc_bus;
+       struct {
+               enum drm_dp_dual_mode_type type;
+               int max_tmds_clock;
+       } dp_dual_mode;
        bool limited_color_range;
        bool color_range_auto;
        bool has_hdmi_sink;
@@@ -883,7 -888,7 +888,7 @@@ struct intel_dp_mst_encoder 
        struct intel_encoder base;
        enum pipe pipe;
        struct intel_digital_port *primary;
 -      void *port; /* store this opaque as its illegal to dereference it */
 +      struct intel_connector *connector;
  };
  
  static inline enum dpio_channel
@@@ -1070,6 -1075,8 +1075,6 @@@ void intel_ddi_set_pipe_settings(struc
  void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
  bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
  void intel_ddi_fdi_disable(struct drm_crtc *crtc);
 -bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
 -                               struct intel_crtc *intel_crtc);
  void intel_ddi_get_config(struct intel_encoder *encoder,
                          struct intel_crtc_state *pipe_config);
  struct intel_encoder *
@@@ -1401,6 -1408,7 +1406,7 @@@ void intel_hdmi_init_connector(struct i
  struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
  bool intel_hdmi_compute_config(struct intel_encoder *encoder,
                               struct intel_crtc_state *pipe_config);
+ void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable);
  
  
  /* intel_lvds.c */
@@@ -3904,6 -3904,8 +3904,8 @@@ static void ilk_pipe_wm_get_hw_state(st
        if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                hw->wm_linetime[pipe] = I915_READ(PIPE_WM_LINETIME(pipe));
  
+       memset(active, 0, sizeof(*active));
        active->pipe_enabled = intel_crtc->active;
  
        if (active->pipe_enabled) {
@@@ -6738,12 -6740,6 +6740,12 @@@ static void broadwell_init_clock_gating
        misccpctl = I915_READ(GEN7_MISCCPCTL);
        I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE);
        I915_WRITE(GEN8_L3SQCREG1, BDW_WA_L3SQCREG1_DEFAULT);
 +      /*
 +       * Wait at least 100 clocks before re-enabling clock gating. See
 +       * the definition of L3SQCREG1 in BSpec.
 +       */
 +      POSTING_READ(GEN8_L3SQCREG1);
 +      udelay(1);
        I915_WRITE(GEN7_MISCCPCTL, misccpctl);
  
        /*