Merge tag 'v3.9-rc3' into drm-intel-next-queued
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 19 Mar 2013 08:47:30 +0000 (09:47 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 19 Mar 2013 08:47:30 +0000 (09:47 +0100)
Backmerge so that I can merge Imre Deak's coalesced sg entries fixes,
which depend upon the new for_each_sg_page introduce in

commit a321e91b6d73ed011ffceed384c40d2785cf723b
Author: Imre Deak <imre.deak@intel.com>
Date:   Wed Feb 27 17:02:56 2013 -0800

    lib/scatterlist: add simple page iterator

The merge itself is just two trivial conflicts:

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
16 files changed:
1  2 
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_fb.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/video/fbmem.c
include/linux/pm.h

index 26487d18b02349c5a146ba7bb8790e5742919fe2,aae31489c89304f8d79ad2319bbb0ecb97897cef..7df83512161ee12e9f0a25ddd877e14c75a6554d
@@@ -772,23 -772,6 +772,23 @@@ static int i915_error_state(struct seq_
                                }
                        }
                }
 +
 +              obj = error->ring[i].ctx;
 +              if (obj) {
 +                      seq_printf(m, "%s --- HW Context = 0x%08x\n",
 +                                 dev_priv->ring[i].name,
 +                                 obj->gtt_offset);
 +                      offset = 0;
 +                      for (elt = 0; elt < PAGE_SIZE/16; elt += 4) {
 +                              seq_printf(m, "[%04x] %08x %08x %08x %08x\n",
 +                                         offset,
 +                                         obj->pages[0][elt],
 +                                         obj->pages[0][elt+1],
 +                                         obj->pages[0][elt+2],
 +                                         obj->pages[0][elt+3]);
 +                                      offset += 16;
 +                      }
 +              }
        }
  
        if (error->overlay)
@@@ -866,42 -849,76 +866,42 @@@ static const struct file_operations i91
        .release = i915_error_state_release,
  };
  
 -static ssize_t
 -i915_next_seqno_read(struct file *filp,
 -               char __user *ubuf,
 -               size_t max,
 -               loff_t *ppos)
 +static int
 +i915_next_seqno_get(void *data, u64 *val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        drm_i915_private_t *dev_priv = dev->dev_private;
 -      char buf[80];
 -      int len;
        int ret;
  
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
  
 -      len = snprintf(buf, sizeof(buf),
 -                     "next_seqno :  0x%x\n",
 -                     dev_priv->next_seqno);
 -
 +      *val = dev_priv->next_seqno;
        mutex_unlock(&dev->struct_mutex);
  
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 -
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_next_seqno_write(struct file *filp,
 -                    const char __user *ubuf,
 -                    size_t cnt,
 -                    loff_t *ppos)
 -{
 -      struct drm_device *dev = filp->private_data;
 -      char buf[20];
 -      u32 val = 1;
 +static int
 +i915_next_seqno_set(void *data, u64 val)
 +{
 +      struct drm_device *dev = data;
        int ret;
  
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 -
 -              ret = kstrtouint(buf, 0, &val);
 -              if (ret < 0)
 -                      return ret;
 -      }
 -
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
  
        ret = i915_gem_set_seqno(dev, val);
 -
        mutex_unlock(&dev->struct_mutex);
  
 -      return ret ?: cnt;
 +      return ret;
  }
  
 -static const struct file_operations i915_next_seqno_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_next_seqno_read,
 -      .write = i915_next_seqno_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_next_seqno_fops,
 +                      i915_next_seqno_get, i915_next_seqno_set,
 +                      "next_seqno :  0x%llx\n");
  
  static int i915_rstdby_delays(struct seq_file *m, void *unused)
  {
@@@ -1533,7 -1550,7 +1533,7 @@@ static const char *swizzle_string(unsig
        case I915_BIT_6_SWIZZLE_9_10_17:
                return "bit9/bit10/bit17";
        case I915_BIT_6_SWIZZLE_UNKNOWN:
-               return "unkown";
+               return "unknown";
        }
  
        return "bug";
@@@ -1663,51 -1680,105 +1663,51 @@@ static int i915_dpio_info(struct seq_fi
        return 0;
  }
  
 -static ssize_t
 -i915_wedged_read(struct file *filp,
 -               char __user *ubuf,
 -               size_t max,
 -               loff_t *ppos)
 +static int
 +i915_wedged_get(void *data, u64 *val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        drm_i915_private_t *dev_priv = dev->dev_private;
 -      char buf[80];
 -      int len;
 -
 -      len = snprintf(buf, sizeof(buf),
 -                     "wedged :  %d\n",
 -                     atomic_read(&dev_priv->gpu_error.reset_counter));
  
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 +      *val = atomic_read(&dev_priv->gpu_error.reset_counter);
  
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_wedged_write(struct file *filp,
 -                const char __user *ubuf,
 -                size_t cnt,
 -                loff_t *ppos)
 +static int
 +i915_wedged_set(void *data, u64 val)
  {
 -      struct drm_device *dev = filp->private_data;
 -      char buf[20];
 -      int val = 1;
 -
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 +      struct drm_device *dev = data;
  
 -              val = simple_strtoul(buf, NULL, 0);
 -      }
 -
 -      DRM_INFO("Manually setting wedged to %d\n", val);
 +      DRM_INFO("Manually setting wedged to %llu\n", val);
        i915_handle_error(dev, val);
  
 -      return cnt;
 +      return 0;
  }
  
 -static const struct file_operations i915_wedged_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_wedged_read,
 -      .write = i915_wedged_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_wedged_fops,
 +                      i915_wedged_get, i915_wedged_set,
 +                      "wedged :  %llu\n");
  
 -static ssize_t
 -i915_ring_stop_read(struct file *filp,
 -                  char __user *ubuf,
 -                  size_t max,
 -                  loff_t *ppos)
 +static int
 +i915_ring_stop_get(void *data, u64 *val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        drm_i915_private_t *dev_priv = dev->dev_private;
 -      char buf[20];
 -      int len;
 -
 -      len = snprintf(buf, sizeof(buf),
 -                     "0x%08x\n", dev_priv->gpu_error.stop_rings);
  
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 +      *val = dev_priv->gpu_error.stop_rings;
  
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_ring_stop_write(struct file *filp,
 -                   const char __user *ubuf,
 -                   size_t cnt,
 -                   loff_t *ppos)
 +static int
 +i915_ring_stop_set(void *data, u64 val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      char buf[20];
 -      int val = 0, ret;
 -
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 -
 -              val = simple_strtoul(buf, NULL, 0);
 -      }
 +      int ret;
  
 -      DRM_DEBUG_DRIVER("Stopping rings 0x%08x\n", val);
 +      DRM_DEBUG_DRIVER("Stopping rings 0x%08llx\n", val);
  
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
        dev_priv->gpu_error.stop_rings = val;
        mutex_unlock(&dev->struct_mutex);
  
 -      return cnt;
 +      return 0;
  }
  
 -static const struct file_operations i915_ring_stop_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_ring_stop_read,
 -      .write = i915_ring_stop_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_ring_stop_fops,
 +                      i915_ring_stop_get, i915_ring_stop_set,
 +                      "0x%08llx\n");
  
  #define DROP_UNBOUND 0x1
  #define DROP_BOUND 0x2
                  DROP_BOUND | \
                  DROP_RETIRE | \
                  DROP_ACTIVE)
 -static ssize_t
 -i915_drop_caches_read(struct file *filp,
 -                    char __user *ubuf,
 -                    size_t max,
 -                    loff_t *ppos)
 +static int
 +i915_drop_caches_get(void *data, u64 *val)
  {
 -      char buf[20];
 -      int len;
 -
 -      len = snprintf(buf, sizeof(buf), "0x%08x\n", DROP_ALL);
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 +      *val = DROP_ALL;
  
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_drop_caches_write(struct file *filp,
 -                     const char __user *ubuf,
 -                     size_t cnt,
 -                     loff_t *ppos)
 +static int
 +i915_drop_caches_set(void *data, u64 val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_gem_object *obj, *next;
 -      char buf[20];
 -      int val = 0, ret;
 -
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 -
 -              val = simple_strtoul(buf, NULL, 0);
 -      }
 +      int ret;
  
 -      DRM_DEBUG_DRIVER("Dropping caches: 0x%08x\n", val);
 +      DRM_DEBUG_DRIVER("Dropping caches: 0x%08llx\n", val);
  
        /* No need to check and wait for gpu resets, only libdrm auto-restarts
         * on ioctls on -EAGAIN. */
  unlock:
        mutex_unlock(&dev->struct_mutex);
  
 -      return ret ?: cnt;
 +      return ret;
  }
  
 -static const struct file_operations i915_drop_caches_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_drop_caches_read,
 -      .write = i915_drop_caches_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_drop_caches_fops,
 +                      i915_drop_caches_get, i915_drop_caches_set,
 +                      "0x%08llx\n");
  
 -static ssize_t
 -i915_max_freq_read(struct file *filp,
 -                 char __user *ubuf,
 -                 size_t max,
 -                 loff_t *ppos)
 +static int
 +i915_max_freq_get(void *data, u64 *val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        drm_i915_private_t *dev_priv = dev->dev_private;
 -      char buf[80];
 -      int len, ret;
 +      int ret;
  
        if (!(IS_GEN6(dev) || IS_GEN7(dev)))
                return -ENODEV;
        if (ret)
                return ret;
  
 -      len = snprintf(buf, sizeof(buf),
 -                     "max freq: %d\n", dev_priv->rps.max_delay * GT_FREQUENCY_MULTIPLIER);
 +      *val = dev_priv->rps.max_delay * GT_FREQUENCY_MULTIPLIER;
        mutex_unlock(&dev_priv->rps.hw_lock);
  
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 -
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_max_freq_write(struct file *filp,
 -                const char __user *ubuf,
 -                size_t cnt,
 -                loff_t *ppos)
 +static int
 +i915_max_freq_set(void *data, u64 val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      char buf[20];
 -      int val = 1, ret;
 +      int ret;
  
        if (!(IS_GEN6(dev) || IS_GEN7(dev)))
                return -ENODEV;
  
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 -
 -              val = simple_strtoul(buf, NULL, 0);
 -      }
 -
 -      DRM_DEBUG_DRIVER("Manually setting max freq to %d\n", val);
 +      DRM_DEBUG_DRIVER("Manually setting max freq to %llu\n", val);
  
        ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
        if (ret)
        /*
         * Turbo will still be enabled, but won't go above the set value.
         */
 -      dev_priv->rps.max_delay = val / GT_FREQUENCY_MULTIPLIER;
 -
 -      gen6_set_rps(dev, val / GT_FREQUENCY_MULTIPLIER);
 +      do_div(val, GT_FREQUENCY_MULTIPLIER);
 +      dev_priv->rps.max_delay = val;
 +      gen6_set_rps(dev, val);
        mutex_unlock(&dev_priv->rps.hw_lock);
  
 -      return cnt;
 +      return 0;
  }
  
 -static const struct file_operations i915_max_freq_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_max_freq_read,
 -      .write = i915_max_freq_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_max_freq_fops,
 +                      i915_max_freq_get, i915_max_freq_set,
 +                      "max freq: %llu\n");
  
 -static ssize_t
 -i915_min_freq_read(struct file *filp, char __user *ubuf, size_t max,
 -                 loff_t *ppos)
 +static int
 +i915_min_freq_get(void *data, u64 *val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        drm_i915_private_t *dev_priv = dev->dev_private;
 -      char buf[80];
 -      int len, ret;
 +      int ret;
  
        if (!(IS_GEN6(dev) || IS_GEN7(dev)))
                return -ENODEV;
        if (ret)
                return ret;
  
 -      len = snprintf(buf, sizeof(buf),
 -                     "min freq: %d\n", dev_priv->rps.min_delay * GT_FREQUENCY_MULTIPLIER);
 +      *val = dev_priv->rps.min_delay * GT_FREQUENCY_MULTIPLIER;
        mutex_unlock(&dev_priv->rps.hw_lock);
  
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 -
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_min_freq_write(struct file *filp, const char __user *ubuf, size_t cnt,
 -                  loff_t *ppos)
 +static int
 +i915_min_freq_set(void *data, u64 val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      char buf[20];
 -      int val = 1, ret;
 +      int ret;
  
        if (!(IS_GEN6(dev) || IS_GEN7(dev)))
                return -ENODEV;
  
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 -
 -              val = simple_strtoul(buf, NULL, 0);
 -      }
 -
 -      DRM_DEBUG_DRIVER("Manually setting min freq to %d\n", val);
 +      DRM_DEBUG_DRIVER("Manually setting min freq to %llu\n", val);
  
        ret = mutex_lock_interruptible(&dev_priv->rps.hw_lock);
        if (ret)
        /*
         * Turbo will still be enabled, but won't go below the set value.
         */
 -      dev_priv->rps.min_delay = val / GT_FREQUENCY_MULTIPLIER;
 -
 -      gen6_set_rps(dev, val / GT_FREQUENCY_MULTIPLIER);
 +      do_div(val, GT_FREQUENCY_MULTIPLIER);
 +      dev_priv->rps.min_delay = val;
 +      gen6_set_rps(dev, val);
        mutex_unlock(&dev_priv->rps.hw_lock);
  
 -      return cnt;
 +      return 0;
  }
  
 -static const struct file_operations i915_min_freq_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_min_freq_read,
 -      .write = i915_min_freq_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_min_freq_fops,
 +                      i915_min_freq_get, i915_min_freq_set,
 +                      "min freq: %llu\n");
  
 -static ssize_t
 -i915_cache_sharing_read(struct file *filp,
 -                 char __user *ubuf,
 -                 size_t max,
 -                 loff_t *ppos)
 +static int
 +i915_cache_sharing_get(void *data, u64 *val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        drm_i915_private_t *dev_priv = dev->dev_private;
 -      char buf[80];
        u32 snpcr;
 -      int len, ret;
 +      int ret;
  
        if (!(IS_GEN6(dev) || IS_GEN7(dev)))
                return -ENODEV;
        snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
        mutex_unlock(&dev_priv->dev->struct_mutex);
  
 -      len = snprintf(buf, sizeof(buf),
 -                     "%d\n", (snpcr & GEN6_MBC_SNPCR_MASK) >>
 -                     GEN6_MBC_SNPCR_SHIFT);
 +      *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT;
  
 -      if (len > sizeof(buf))
 -              len = sizeof(buf);
 -
 -      return simple_read_from_buffer(ubuf, max, ppos, buf, len);
 +      return 0;
  }
  
 -static ssize_t
 -i915_cache_sharing_write(struct file *filp,
 -                const char __user *ubuf,
 -                size_t cnt,
 -                loff_t *ppos)
 +static int
 +i915_cache_sharing_set(void *data, u64 val)
  {
 -      struct drm_device *dev = filp->private_data;
 +      struct drm_device *dev = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      char buf[20];
        u32 snpcr;
 -      int val = 1;
  
        if (!(IS_GEN6(dev) || IS_GEN7(dev)))
                return -ENODEV;
  
 -      if (cnt > 0) {
 -              if (cnt > sizeof(buf) - 1)
 -                      return -EINVAL;
 -
 -              if (copy_from_user(buf, ubuf, cnt))
 -                      return -EFAULT;
 -              buf[cnt] = 0;
 -
 -              val = simple_strtoul(buf, NULL, 0);
 -      }
 -
 -      if (val < 0 || val > 3)
 +      if (val > 3)
                return -EINVAL;
  
 -      DRM_DEBUG_DRIVER("Manually setting uncore sharing to %d\n", val);
 +      DRM_DEBUG_DRIVER("Manually setting uncore sharing to %llu\n", val);
  
        /* Update the cache sharing policy here as well */
        snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
        snpcr |= (val << GEN6_MBC_SNPCR_SHIFT);
        I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
  
 -      return cnt;
 +      return 0;
  }
  
 -static const struct file_operations i915_cache_sharing_fops = {
 -      .owner = THIS_MODULE,
 -      .open = simple_open,
 -      .read = i915_cache_sharing_read,
 -      .write = i915_cache_sharing_write,
 -      .llseek = default_llseek,
 -};
 +DEFINE_SIMPLE_ATTRIBUTE(i915_cache_sharing_fops,
 +                      i915_cache_sharing_get, i915_cache_sharing_set,
 +                      "%llu\n");
  
  /* As the drm_debugfs_init() routines are called before dev->dev_private is
   * allocated we need to hook into the minor for release. */
index 1ebed9670ab904193ab01b7bd89285fcc2f64362,0a8eceb7590244af233d153845a91c79e6662420..db3099845877288eb6cf1b5f14314b50bf109657
@@@ -121,7 -121,9 +121,7 @@@ MODULE_PARM_DESC(i915_enable_ppgtt
  unsigned int i915_preliminary_hw_support __read_mostly = 0;
  module_param_named(preliminary_hw_support, i915_preliminary_hw_support, int, 0600);
  MODULE_PARM_DESC(preliminary_hw_support,
 -              "Enable preliminary hardware support. "
 -              "Enable Haswell and ValleyView Support. "
 -              "(default: false)");
 +              "Enable preliminary hardware support. (default: false)");
  
  static struct drm_driver driver;
  extern int intel_agp_enabled;
@@@ -275,7 -277,6 +275,7 @@@ static const struct intel_device_info i
        .has_blt_ring = 1,
        .is_valleyview = 1,
        .display_mmio_offset = VLV_DISPLAY_BASE,
 +      .has_force_wake = 1,
  };
  
  static const struct intel_device_info intel_valleyview_d_info = {
        .has_blt_ring = 1,
        .is_valleyview = 1,
        .display_mmio_offset = VLV_DISPLAY_BASE,
 +      .has_force_wake = 1,
  };
  
  static const struct intel_device_info intel_haswell_d_info = {
@@@ -379,15 -379,15 +379,15 @@@ static const struct pci_device_id pciid
        INTEL_VGA_DEVICE(0x0A06, &intel_haswell_m_info), /* ULT GT1 mobile */
        INTEL_VGA_DEVICE(0x0A16, &intel_haswell_m_info), /* ULT GT2 mobile */
        INTEL_VGA_DEVICE(0x0A26, &intel_haswell_m_info), /* ULT GT2 mobile */
-       INTEL_VGA_DEVICE(0x0D12, &intel_haswell_d_info), /* CRW GT1 desktop */
+       INTEL_VGA_DEVICE(0x0D02, &intel_haswell_d_info), /* CRW GT1 desktop */
+       INTEL_VGA_DEVICE(0x0D12, &intel_haswell_d_info), /* CRW GT2 desktop */
        INTEL_VGA_DEVICE(0x0D22, &intel_haswell_d_info), /* CRW GT2 desktop */
-       INTEL_VGA_DEVICE(0x0D32, &intel_haswell_d_info), /* CRW GT2 desktop */
-       INTEL_VGA_DEVICE(0x0D1A, &intel_haswell_d_info), /* CRW GT1 server */
+       INTEL_VGA_DEVICE(0x0D0A, &intel_haswell_d_info), /* CRW GT1 server */
+       INTEL_VGA_DEVICE(0x0D1A, &intel_haswell_d_info), /* CRW GT2 server */
        INTEL_VGA_DEVICE(0x0D2A, &intel_haswell_d_info), /* CRW GT2 server */
-       INTEL_VGA_DEVICE(0x0D3A, &intel_haswell_d_info), /* CRW GT2 server */
-       INTEL_VGA_DEVICE(0x0D16, &intel_haswell_m_info), /* CRW GT1 mobile */
+       INTEL_VGA_DEVICE(0x0D06, &intel_haswell_m_info), /* CRW GT1 mobile */
+       INTEL_VGA_DEVICE(0x0D16, &intel_haswell_m_info), /* CRW GT2 mobile */
        INTEL_VGA_DEVICE(0x0D26, &intel_haswell_m_info), /* CRW GT2 mobile */
-       INTEL_VGA_DEVICE(0x0D36, &intel_haswell_m_info), /* CRW GT2 mobile */
        INTEL_VGA_DEVICE(0x0f30, &intel_valleyview_m_info),
        INTEL_VGA_DEVICE(0x0157, &intel_valleyview_m_info),
        INTEL_VGA_DEVICE(0x0155, &intel_valleyview_d_info),
@@@ -495,6 -495,7 +495,7 @@@ static int i915_drm_freeze(struct drm_d
                intel_modeset_disable(dev);
  
                drm_irq_uninstall(dev);
+               dev_priv->enable_hotplug_processing = false;
        }
  
        i915_save_state(dev);
@@@ -568,10 -569,20 +569,20 @@@ static int __i915_drm_thaw(struct drm_d
                error = i915_gem_init_hw(dev);
                mutex_unlock(&dev->struct_mutex);
  
+               /* We need working interrupts for modeset enabling ... */
+               drm_irq_install(dev);
                intel_modeset_init_hw(dev);
                intel_modeset_setup_hw_state(dev, false);
-               drm_irq_install(dev);
+               /*
+                * ... but also need to make sure that hotplug processing
+                * doesn't cause havoc. Like in the driver load code we don't
+                * bother with the tiny race here where we might loose hotplug
+                * notifications.
+                * */
                intel_hpd_init(dev);
+               dev_priv->enable_hotplug_processing = true;
        }
  
        intel_opregion_init(dev);
@@@ -1131,27 -1142,6 +1142,27 @@@ ilk_dummy_write(struct drm_i915_privat
        I915_WRITE_NOTRACE(MI_MODE, 0);
  }
  
 +static void
 +hsw_unclaimed_reg_clear(struct drm_i915_private *dev_priv, u32 reg)
 +{
 +      if (IS_HASWELL(dev_priv->dev) &&
 +          (I915_READ_NOTRACE(FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) {
 +              DRM_ERROR("Unknown unclaimed register before writing to %x\n",
 +                        reg);
 +              I915_WRITE_NOTRACE(FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
 +      }
 +}
 +
 +static void
 +hsw_unclaimed_reg_check(struct drm_i915_private *dev_priv, u32 reg)
 +{
 +      if (IS_HASWELL(dev_priv->dev) &&
 +          (I915_READ_NOTRACE(FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) {
 +              DRM_ERROR("Unclaimed write to %x\n", reg);
 +              I915_WRITE_NOTRACE(FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
 +      }
 +}
 +
  #define __i915_read(x, y) \
  u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
        u##x val = 0; \
@@@ -1188,12 -1178,18 +1199,12 @@@ void i915_write##x(struct drm_i915_priv
        } \
        if (IS_GEN5(dev_priv->dev)) \
                ilk_dummy_write(dev_priv); \
 -      if (IS_HASWELL(dev_priv->dev) && (I915_READ_NOTRACE(GEN7_ERR_INT) & ERR_INT_MMIO_UNCLAIMED)) { \
 -              DRM_ERROR("Unknown unclaimed register before writing to %x\n", reg); \
 -              I915_WRITE_NOTRACE(GEN7_ERR_INT, ERR_INT_MMIO_UNCLAIMED); \
 -      } \
 +      hsw_unclaimed_reg_clear(dev_priv, reg); \
        write##y(val, dev_priv->regs + reg); \
        if (unlikely(__fifo_ret)) { \
                gen6_gt_check_fifodbg(dev_priv); \
        } \
 -      if (IS_HASWELL(dev_priv->dev) && (I915_READ_NOTRACE(GEN7_ERR_INT) & ERR_INT_MMIO_UNCLAIMED)) { \
 -              DRM_ERROR("Unclaimed write to %x\n", reg); \
 -              writel(ERR_INT_MMIO_UNCLAIMED, dev_priv->regs + GEN7_ERR_INT);  \
 -      } \
 +      hsw_unclaimed_reg_check(dev_priv, reg); \
  }
  __i915_write(8, b)
  __i915_write(16, w)
index d554b2171df071380832b9ad6c7f95202821b2cc,0e207e6e0df8da27513ac3f14e90050532b557d0..30117dc522122bf79f82fcfc1a5cf14f7e58013c
@@@ -414,7 -414,7 +414,7 @@@ i915_gem_shmem_pread(struct drm_device 
        struct scatterlist *sg;
        int i;
  
 -      user_data = (char __user *) (uintptr_t) args->data_ptr;
 +      user_data = to_user_ptr(args->data_ptr);
        remain = args->size;
  
        obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
@@@ -522,7 -522,7 +522,7 @@@ i915_gem_pread_ioctl(struct drm_device 
                return 0;
  
        if (!access_ok(VERIFY_WRITE,
 -                     (char __user *)(uintptr_t)args->data_ptr,
 +                     to_user_ptr(args->data_ptr),
                       args->size))
                return -EFAULT;
  
@@@ -613,7 -613,7 +613,7 @@@ i915_gem_gtt_pwrite_fast(struct drm_dev
        if (ret)
                goto out_unpin;
  
 -      user_data = (char __user *) (uintptr_t) args->data_ptr;
 +      user_data = to_user_ptr(args->data_ptr);
        remain = args->size;
  
        offset = obj->gtt_offset + args->offset;
@@@ -735,7 -735,7 +735,7 @@@ i915_gem_shmem_pwrite(struct drm_devic
        int i;
        struct scatterlist *sg;
  
 -      user_data = (char __user *) (uintptr_t) args->data_ptr;
 +      user_data = to_user_ptr(args->data_ptr);
        remain = args->size;
  
        obj_do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
@@@ -867,11 -867,11 +867,11 @@@ i915_gem_pwrite_ioctl(struct drm_devic
                return 0;
  
        if (!access_ok(VERIFY_READ,
 -                     (char __user *)(uintptr_t)args->data_ptr,
 +                     to_user_ptr(args->data_ptr),
                       args->size))
                return -EFAULT;
  
 -      ret = fault_in_multipages_readable((char __user *)(uintptr_t)args->data_ptr,
 +      ret = fault_in_multipages_readable(to_user_ptr(args->data_ptr),
                                           args->size);
        if (ret)
                return -EFAULT;
@@@ -1618,7 -1618,7 +1618,7 @@@ i915_gem_object_truncate(struct drm_i91
         * To do this we must instruct the shmfs to drop all of its
         * backing pages, *now*.
         */
-       inode = obj->base.filp->f_path.dentry->d_inode;
+       inode = file_inode(obj->base.filp);
        shmem_truncate_range(inode, 0, (loff_t)-1);
  
        obj->madv = __I915_MADV_PURGED;
@@@ -1783,7 -1783,7 +1783,7 @@@ i915_gem_object_get_pages_gtt(struct dr
         *
         * Fail silently without starting the shrinker
         */
-       mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
+       mapping = file_inode(obj->base.filp)->i_mapping;
        gfp = mapping_gfp_mask(mapping);
        gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;
        gfp &= ~(__GFP_IO | __GFP_WAIT);
@@@ -3747,7 -3747,7 +3747,7 @@@ struct drm_i915_gem_object *i915_gem_al
                mask |= __GFP_DMA32;
        }
  
-       mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
+       mapping = file_inode(obj->base.filp)->i_mapping;
        mapping_set_gfp_mask(mapping, mask);
  
        i915_gem_object_init(obj, &i915_gem_object_ops);
@@@ -4010,16 -4010,7 +4010,16 @@@ int i915_gem_init(struct drm_device *de
        int ret;
  
        mutex_lock(&dev->struct_mutex);
 +
 +      if (IS_VALLEYVIEW(dev)) {
 +              /* VLVA0 (potential hack), BIOS isn't actually waking us */
 +              I915_WRITE(VLV_GTLC_WAKE_CTRL, 1);
 +              if (wait_for((I915_READ(VLV_GTLC_PW_STATUS) & 1) == 1, 10))
 +                      DRM_DEBUG_DRIVER("allow wake ack timed out\n");
 +      }
 +
        i915_gem_init_global_gtt(dev);
 +
        ret = i915_gem_init_hw(dev);
        mutex_unlock(&dev->struct_mutex);
        if (ret) {
@@@ -4241,7 -4232,7 +4241,7 @@@ void i915_gem_free_all_phys_object(stru
  void i915_gem_detach_phys_object(struct drm_device *dev,
                                 struct drm_i915_gem_object *obj)
  {
-       struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
+       struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;
        char *vaddr;
        int i;
        int page_count;
@@@ -4277,7 -4268,7 +4277,7 @@@ i915_gem_attach_phys_object(struct drm_
                            int id,
                            int align)
  {
-       struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
+       struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;
        drm_i915_private_t *dev_priv = dev->dev_private;
        int ret = 0;
        int page_count;
@@@ -4336,7 -4327,7 +4336,7 @@@ i915_gem_phys_pwrite(struct drm_device 
                     struct drm_file *file_priv)
  {
        void *vaddr = obj->phys_obj->handle->vaddr + args->offset;
 -      char __user *user_data = (char __user *) (uintptr_t) args->data_ptr;
 +      char __user *user_data = to_user_ptr(args->data_ptr);
  
        if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
                unsigned long unwritten;
index 63abf2fa1fa4007ad6a721fc2966277eacd04a79,3c7bb0410b517fe84ae696c720441d553f63cd7f..62285ff03083f69882c67afce241245845deb542
@@@ -60,30 -60,26 +60,30 @@@ ironlake_disable_display_irq(drm_i915_p
  void
  i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
  {
 -      if ((dev_priv->pipestat[pipe] & mask) != mask) {
 -              u32 reg = PIPESTAT(pipe);
 +      u32 reg = PIPESTAT(pipe);
 +      u32 pipestat = I915_READ(reg) & 0x7fff0000;
  
 -              dev_priv->pipestat[pipe] |= mask;
 -              /* Enable the interrupt, clear any pending status */
 -              I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16));
 -              POSTING_READ(reg);
 -      }
 +      if ((pipestat & mask) == mask)
 +              return;
 +
 +      /* Enable the interrupt, clear any pending status */
 +      pipestat |= mask | (mask >> 16);
 +      I915_WRITE(reg, pipestat);
 +      POSTING_READ(reg);
  }
  
  void
  i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
  {
 -      if ((dev_priv->pipestat[pipe] & mask) != 0) {
 -              u32 reg = PIPESTAT(pipe);
 +      u32 reg = PIPESTAT(pipe);
 +      u32 pipestat = I915_READ(reg) & 0x7fff0000;
  
 -              dev_priv->pipestat[pipe] &= ~mask;
 -              I915_WRITE(reg, dev_priv->pipestat[pipe]);
 -              POSTING_READ(reg);
 -      }
 +      if ((pipestat & mask) == 0)
 +              return;
 +
 +      pipestat &= ~mask;
 +      I915_WRITE(reg, pipestat);
 +      POSTING_READ(reg);
  }
  
  /**
@@@ -705,7 -701,7 +705,7 @@@ static irqreturn_t ivybridge_irq_handle
  {
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
-       u32 de_iir, gt_iir, de_ier, pm_iir;
+       u32 de_iir, gt_iir, de_ier, pm_iir, sde_ier;
        irqreturn_t ret = IRQ_NONE;
        int i;
  
        de_ier = I915_READ(DEIER);
        I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
  
+       /* Disable south interrupts. We'll only write to SDEIIR once, so further
+        * interrupts will will be stored on its back queue, and then we'll be
+        * able to process them after we restore SDEIER (as soon as we restore
+        * it, we'll get an interrupt if SDEIIR still has something to process
+        * due to its back queue). */
+       sde_ier = I915_READ(SDEIER);
+       I915_WRITE(SDEIER, 0);
+       POSTING_READ(SDEIER);
        gt_iir = I915_READ(GTIIR);
        if (gt_iir) {
                snb_gt_irq_handler(dev, dev_priv, gt_iir);
  
        I915_WRITE(DEIER, de_ier);
        POSTING_READ(DEIER);
+       I915_WRITE(SDEIER, sde_ier);
+       POSTING_READ(SDEIER);
  
        return ret;
  }
@@@ -782,7 -789,7 +793,7 @@@ static irqreturn_t ironlake_irq_handler
        struct drm_device *dev = (struct drm_device *) arg;
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        int ret = IRQ_NONE;
-       u32 de_iir, gt_iir, de_ier, pm_iir;
+       u32 de_iir, gt_iir, de_ier, pm_iir, sde_ier;
  
        atomic_inc(&dev_priv->irq_received);
  
        I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
        POSTING_READ(DEIER);
  
+       /* Disable south interrupts. We'll only write to SDEIIR once, so further
+        * interrupts will will be stored on its back queue, and then we'll be
+        * able to process them after we restore SDEIER (as soon as we restore
+        * it, we'll get an interrupt if SDEIIR still has something to process
+        * due to its back queue). */
+       sde_ier = I915_READ(SDEIER);
+       I915_WRITE(SDEIER, 0);
+       POSTING_READ(SDEIER);
        de_iir = I915_READ(DEIIR);
        gt_iir = I915_READ(GTIIR);
        pm_iir = I915_READ(GEN6_PMIIR);
  done:
        I915_WRITE(DEIER, de_ier);
        POSTING_READ(DEIER);
+       I915_WRITE(SDEIER, sde_ier);
+       POSTING_READ(SDEIER);
  
        return ret;
  }
@@@ -919,8 -937,6 +941,8 @@@ static void i915_error_work_func(struc
                for_each_ring(ring, dev_priv, i)
                        wake_up_all(&ring->irq_queue);
  
 +              intel_display_handle_reset(dev);
 +
                wake_up_all(&dev_priv->gpu_error.reset_queue);
        }
  }
@@@ -956,23 -972,24 +978,23 @@@ static void i915_get_extra_instdone(str
  
  #ifdef CONFIG_DEBUG_FS
  static struct drm_i915_error_object *
 -i915_error_object_create(struct drm_i915_private *dev_priv,
 -                       struct drm_i915_gem_object *src)
 +i915_error_object_create_sized(struct drm_i915_private *dev_priv,
 +                             struct drm_i915_gem_object *src,
 +                             const int num_pages)
  {
        struct drm_i915_error_object *dst;
 -      int i, count;
 +      int i;
        u32 reloc_offset;
  
        if (src == NULL || src->pages == NULL)
                return NULL;
  
 -      count = src->base.size / PAGE_SIZE;
 -
 -      dst = kmalloc(sizeof(*dst) + count * sizeof(u32 *), GFP_ATOMIC);
 +      dst = kmalloc(sizeof(*dst) + num_pages * sizeof(u32 *), GFP_ATOMIC);
        if (dst == NULL)
                return NULL;
  
        reloc_offset = src->gtt_offset;
 -      for (i = 0; i < count; i++) {
 +      for (i = 0; i < num_pages; i++) {
                unsigned long flags;
                void *d;
  
  
                reloc_offset += PAGE_SIZE;
        }
 -      dst->page_count = count;
 +      dst->page_count = num_pages;
        dst->gtt_offset = src->gtt_offset;
  
        return dst;
@@@ -1033,9 -1050,6 +1055,9 @@@ unwind
        kfree(dst);
        return NULL;
  }
 +#define i915_error_object_create(dev_priv, src) \
 +      i915_error_object_create_sized((dev_priv), (src), \
 +                                     (src)->base.size>>PAGE_SHIFT)
  
  static void
  i915_error_object_free(struct drm_i915_error_object *obj)
@@@ -1242,26 -1256,6 +1264,26 @@@ static void i915_record_ring_state(stru
        error->cpu_ring_tail[ring->id] = ring->tail;
  }
  
 +
 +static void i915_gem_record_active_context(struct intel_ring_buffer *ring,
 +                                         struct drm_i915_error_state *error,
 +                                         struct drm_i915_error_ring *ering)
 +{
 +      struct drm_i915_private *dev_priv = ring->dev->dev_private;
 +      struct drm_i915_gem_object *obj;
 +
 +      /* Currently render ring is the only HW context user */
 +      if (ring->id != RCS || !error->ccid)
 +              return;
 +
 +      list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list) {
 +              if ((error->ccid & PAGE_MASK) == obj->gtt_offset) {
 +                      ering->ctx = i915_error_object_create_sized(dev_priv,
 +                                                                  obj, 1);
 +              }
 +      }
 +}
 +
  static void i915_gem_record_rings(struct drm_device *dev,
                                  struct drm_i915_error_state *error)
  {
                error->ring[i].ringbuffer =
                        i915_error_object_create(dev_priv, ring->obj);
  
 +
 +              i915_gem_record_active_context(ring, error, &error->ring[i]);
 +
                count = 0;
                list_for_each_entry(request, &ring->request_list, list)
                        count++;
@@@ -1337,15 -1328,14 +1359,15 @@@ static void i915_capture_error_state(st
                return;
        }
  
 -      DRM_INFO("capturing error event; look for more information in"
 +      DRM_INFO("capturing error event; look for more information in "
                 "/sys/kernel/debug/dri/%d/i915_error_state\n",
                 dev->primary->index);
  
        kref_init(&error->ref);
        error->eir = I915_READ(EIR);
        error->pgtbl_er = I915_READ(PGTBL_ER);
 -      error->ccid = I915_READ(CCID);
 +      if (HAS_HW_CONTEXTS(dev))
 +              error->ccid = I915_READ(CCID);
  
        if (HAS_PCH_SPLIT(dev))
                error->ier = I915_READ(DEIER) | I915_READ(GTIER);
@@@ -1577,7 -1567,7 +1599,7 @@@ void i915_handle_error(struct drm_devic
        queue_work(dev_priv->wq, &dev_priv->gpu_error.work);
  }
  
 -static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
 +static void __always_unused i915_pageflip_stall_check(struct drm_device *dev, int pipe)
  {
        drm_i915_private_t *dev_priv = dev->dev_private;
        struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
@@@ -1787,37 -1777,6 +1809,37 @@@ static bool i915_hangcheck_ring_idle(st
        return false;
  }
  
 +static bool semaphore_passed(struct intel_ring_buffer *ring)
 +{
 +      struct drm_i915_private *dev_priv = ring->dev->dev_private;
 +      u32 acthd = intel_ring_get_active_head(ring) & HEAD_ADDR;
 +      struct intel_ring_buffer *signaller;
 +      u32 cmd, ipehr, acthd_min;
 +
 +      ipehr = I915_READ(RING_IPEHR(ring->mmio_base));
 +      if ((ipehr & ~(0x3 << 16)) !=
 +          (MI_SEMAPHORE_MBOX | MI_SEMAPHORE_COMPARE | MI_SEMAPHORE_REGISTER))
 +              return false;
 +
 +      /* ACTHD is likely pointing to the dword after the actual command,
 +       * so scan backwards until we find the MBOX.
 +       */
 +      acthd_min = max((int)acthd - 3 * 4, 0);
 +      do {
 +              cmd = ioread32(ring->virtual_start + acthd);
 +              if (cmd == ipehr)
 +                      break;
 +
 +              acthd -= 4;
 +              if (acthd < acthd_min)
 +                      return false;
 +      } while (1);
 +
 +      signaller = &dev_priv->ring[(ring->id + (((ipehr >> 17) & 1) + 1)) % 3];
 +      return i915_seqno_passed(signaller->get_seqno(signaller, false),
 +                               ioread32(ring->virtual_start+acthd+4)+1);
 +}
 +
  static bool kick_ring(struct intel_ring_buffer *ring)
  {
        struct drm_device *dev = ring->dev;
                I915_WRITE_CTL(ring, tmp);
                return true;
        }
 +
 +      if (INTEL_INFO(dev)->gen >= 6 &&
 +          tmp & RING_WAIT_SEMAPHORE &&
 +          semaphore_passed(ring)) {
 +              DRM_ERROR("Kicking stuck semaphore on %s\n",
 +                        ring->name);
 +              I915_WRITE_CTL(ring, tmp);
 +              return true;
 +      }
        return false;
  }
  
@@@ -2139,6 -2089,9 +2161,6 @@@ static int valleyview_irq_postinstall(s
                I915_DISPLAY_PIPE_A_VBLANK_INTERRUPT |
                I915_DISPLAY_PIPE_B_VBLANK_INTERRUPT;
  
 -      dev_priv->pipestat[0] = 0;
 -      dev_priv->pipestat[1] = 0;
 -
        /* Hack for broken MSIs on VLV */
        pci_write_config_dword(dev_priv->dev->pdev, 0x94, 0xfee00000);
        pci_read_config_word(dev->pdev, 0x98, &msid);
@@@ -2268,6 -2221,9 +2290,6 @@@ static int i8xx_irq_postinstall(struct 
  {
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
  
 -      dev_priv->pipestat[0] = 0;
 -      dev_priv->pipestat[1] = 0;
 -
        I915_WRITE16(EMR,
                     ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH));
  
        return 0;
  }
  
 +/*
 + * Returns true when a page flip has completed.
 + */
 +static bool i8xx_handle_vblank(struct drm_device *dev,
 +                             int pipe, u16 iir)
 +{
 +      drm_i915_private_t *dev_priv = dev->dev_private;
 +      u16 flip_pending = DISPLAY_PLANE_FLIP_PENDING(pipe);
 +
 +      if (!drm_handle_vblank(dev, pipe))
 +              return false;
 +
 +      if ((iir & flip_pending) == 0)
 +              return false;
 +
 +      intel_prepare_page_flip(dev, pipe);
 +
 +      /* We detect FlipDone by looking for the change in PendingFlip from '1'
 +       * to '0' on the following vblank, i.e. IIR has the Pendingflip
 +       * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence
 +       * the flip is completed (no longer pending). Since this doesn't raise
 +       * an interrupt per se, we watch for the change at vblank.
 +       */
 +      if (I915_READ16(ISR) & flip_pending)
 +              return false;
 +
 +      intel_finish_page_flip(dev, pipe);
 +
 +      return true;
 +}
 +
  static irqreturn_t i8xx_irq_handler(int irq, void *arg)
  {
        struct drm_device *dev = (struct drm_device *) arg;
                        notify_ring(dev, &dev_priv->ring[RCS]);
  
                if (pipe_stats[0] & PIPE_VBLANK_INTERRUPT_STATUS &&
 -                  drm_handle_vblank(dev, 0)) {
 -                      if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
 -                              intel_prepare_page_flip(dev, 0);
 -                              intel_finish_page_flip(dev, 0);
 -                              flip_mask &= ~I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT;
 -                      }
 -              }
 +                  i8xx_handle_vblank(dev, 0, iir))
 +                      flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(0);
  
                if (pipe_stats[1] & PIPE_VBLANK_INTERRUPT_STATUS &&
 -                  drm_handle_vblank(dev, 1)) {
 -                      if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) {
 -                              intel_prepare_page_flip(dev, 1);
 -                              intel_finish_page_flip(dev, 1);
 -                              flip_mask &= ~I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
 -                      }
 -              }
 +                  i8xx_handle_vblank(dev, 1, iir))
 +                      flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(1);
  
                iir = new_iir;
        }
@@@ -2429,6 -2364,9 +2451,6 @@@ static int i915_irq_postinstall(struct 
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
        u32 enable_mask;
  
 -      dev_priv->pipestat[0] = 0;
 -      dev_priv->pipestat[1] = 0;
 -
        I915_WRITE(EMR, ~(I915_ERROR_PAGE_TABLE | I915_ERROR_MEMORY_REFRESH));
  
        /* Unmask the interrupts that we always want on. */
@@@ -2495,37 -2433,6 +2517,37 @@@ static void i915_hpd_irq_setup(struct d
        }
  }
  
 +/*
 + * Returns true when a page flip has completed.
 + */
 +static bool i915_handle_vblank(struct drm_device *dev,
 +                             int plane, int pipe, u32 iir)
 +{
 +      drm_i915_private_t *dev_priv = dev->dev_private;
 +      u32 flip_pending = DISPLAY_PLANE_FLIP_PENDING(plane);
 +
 +      if (!drm_handle_vblank(dev, pipe))
 +              return false;
 +
 +      if ((iir & flip_pending) == 0)
 +              return false;
 +
 +      intel_prepare_page_flip(dev, plane);
 +
 +      /* We detect FlipDone by looking for the change in PendingFlip from '1'
 +       * to '0' on the following vblank, i.e. IIR has the Pendingflip
 +       * asserted following the MI_DISPLAY_FLIP, but ISR is deasserted, hence
 +       * the flip is completed (no longer pending). Since this doesn't raise
 +       * an interrupt per se, we watch for the change at vblank.
 +       */
 +      if (I915_READ(ISR) & flip_pending)
 +              return false;
 +
 +      intel_finish_page_flip(dev, pipe);
 +
 +      return true;
 +}
 +
  static irqreturn_t i915_irq_handler(int irq, void *arg)
  {
        struct drm_device *dev = (struct drm_device *) arg;
        u32 flip_mask =
                I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT |
                I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
 -      u32 flip[2] = {
 -              I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT,
 -              I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT
 -      };
        int pipe, ret = IRQ_NONE;
  
        atomic_inc(&dev_priv->irq_received);
                        int plane = pipe;
                        if (IS_MOBILE(dev))
                                plane = !plane;
 +
                        if (pipe_stats[pipe] & PIPE_VBLANK_INTERRUPT_STATUS &&
 -                          drm_handle_vblank(dev, pipe)) {
 -                              if (iir & flip[plane]) {
 -                                      intel_prepare_page_flip(dev, plane);
 -                                      intel_finish_page_flip(dev, pipe);
 -                                      flip_mask &= ~flip[plane];
 -                              }
 -                      }
 +                          i915_handle_vblank(dev, plane, pipe, iir))
 +                              flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(plane);
  
                        if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
                                blc_event = true;
@@@ -2688,13 -2603,13 +2710,13 @@@ static int i965_irq_postinstall(struct 
                               I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT);
  
        enable_mask = ~dev_priv->irq_mask;
 +      enable_mask &= ~(I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT |
 +                       I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT);
        enable_mask |= I915_USER_INTERRUPT;
  
        if (IS_G4X(dev))
                enable_mask |= I915_BSD_USER_INTERRUPT;
  
 -      dev_priv->pipestat[0] = 0;
 -      dev_priv->pipestat[1] = 0;
        i915_enable_pipestat(dev_priv, 0, PIPE_GMBUS_EVENT_ENABLE);
  
        /*
@@@ -2774,9 -2689,6 +2796,9 @@@ static irqreturn_t i965_irq_handler(in
        unsigned long irqflags;
        int irq_received;
        int ret = IRQ_NONE, pipe;
 +      u32 flip_mask =
 +              I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT |
 +              I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
  
        atomic_inc(&dev_priv->irq_received);
  
        for (;;) {
                bool blc_event = false;
  
 -              irq_received = iir != 0;
 +              irq_received = (iir & ~flip_mask) != 0;
  
                /* Can't rely on pipestat interrupt bit in iir as it might
                 * have been cleared after the pipestat interrupt was received.
                        I915_READ(PORT_HOTPLUG_STAT);
                }
  
 -              I915_WRITE(IIR, iir);
 +              I915_WRITE(IIR, iir & ~flip_mask);
                new_iir = I915_READ(IIR); /* Flush posted writes */
  
                if (iir & I915_USER_INTERRUPT)
                if (iir & I915_BSD_USER_INTERRUPT)
                        notify_ring(dev, &dev_priv->ring[VCS]);
  
 -              if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT)
 -                      intel_prepare_page_flip(dev, 0);
 -
 -              if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT)
 -                      intel_prepare_page_flip(dev, 1);
 -
                for_each_pipe(pipe) {
                        if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS &&
 -                          drm_handle_vblank(dev, pipe)) {
 -                              i915_pageflip_stall_check(dev, pipe);
 -                              intel_finish_page_flip(dev, pipe);
 -                      }
 +                          i915_handle_vblank(dev, pipe, pipe, iir))
 +                              flip_mask &= ~DISPLAY_PLANE_FLIP_PENDING(pipe);
  
                        if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
                                blc_event = true;
index f187b60739ed8e33a96540894e911f2e65465ae4,848992f67d56daa8910ce0e66210f51bddb2f604..176cf5c5850708e4344181f53da183dd9704e8a6
  #define GEN7_ERR_INT  0x44040
  #define   ERR_INT_MMIO_UNCLAIMED (1<<13)
  
 +#define FPGA_DBG              0x42300
 +#define   FPGA_DBG_RM_NOCLAIM (1<<31)
 +
  #define DERRMR                0x44050
  
  /* GM45+ chicken bits -- debug workaround bits that may be required
  #define   I915_USER_INTERRUPT                         (1<<1)
  #define   I915_ASLE_INTERRUPT                         (1<<0)
  #define   I915_BSD_USER_INTERRUPT                      (1<<25)
 +#define   DISPLAY_PLANE_FLIP_PENDING(plane) (1<<(11-(plane))) /* A and B only */
  #define EIR           0x020b0
  #define EMR           0x020b4
  #define ESR           0x020b8
  #define   ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16)
  #define   ADPA_USE_VGA_HVPOLARITY (1<<15)
  #define   ADPA_SETS_HVPOLARITY        0
- #define   ADPA_VSYNC_CNTL_DISABLE (1<<11)
+ #define   ADPA_VSYNC_CNTL_DISABLE (1<<10)
  #define   ADPA_VSYNC_CNTL_ENABLE 0
- #define   ADPA_HSYNC_CNTL_DISABLE (1<<10)
+ #define   ADPA_HSYNC_CNTL_DISABLE (1<<11)
  #define   ADPA_HSYNC_CNTL_ENABLE 0
  #define   ADPA_VSYNC_ACTIVE_HIGH (1<<4)
  #define   ADPA_VSYNC_ACTIVE_LOW       0
  #define   SDVOC_HOTPLUG_INT_STATUS_I915               (1 << 7)
  #define   SDVOB_HOTPLUG_INT_STATUS_I915               (1 << 6)
  
 -/* SDVO port control */
 -#define SDVOB                 0x61140
 -#define SDVOC                 0x61160
 -#define   SDVO_ENABLE         (1 << 31)
 -#define   SDVO_PIPE_B_SELECT  (1 << 30)
 -#define   SDVO_STALL_SELECT   (1 << 29)
 -#define   SDVO_INTERRUPT_ENABLE       (1 << 26)
 +/* SDVO and HDMI port control.
 + * The same register may be used for SDVO or HDMI */
 +#define GEN3_SDVOB    0x61140
 +#define GEN3_SDVOC    0x61160
 +#define GEN4_HDMIB    GEN3_SDVOB
 +#define GEN4_HDMIC    GEN3_SDVOC
 +#define PCH_SDVOB     0xe1140
 +#define PCH_HDMIB     PCH_SDVOB
 +#define PCH_HDMIC     0xe1150
 +#define PCH_HDMID     0xe1160
 +
 +/* Gen 3 SDVO bits: */
 +#define   SDVO_ENABLE                         (1 << 31)
 +#define   SDVO_PIPE_SEL(pipe)                 ((pipe) << 30)
 +#define   SDVO_PIPE_SEL_MASK                  (1 << 30)
 +#define   SDVO_PIPE_B_SELECT                  (1 << 30)
 +#define   SDVO_STALL_SELECT                   (1 << 29)
 +#define   SDVO_INTERRUPT_ENABLE                       (1 << 26)
  /**
   * 915G/GM SDVO pixel multiplier.
 - *
   * Programmed value is multiplier - 1, up to 5x.
 - *
   * \sa DPLL_MD_UDI_MULTIPLIER_MASK
   */
 -#define   SDVO_PORT_MULTIPLY_MASK     (7 << 23)
 +#define   SDVO_PORT_MULTIPLY_MASK             (7 << 23)
  #define   SDVO_PORT_MULTIPLY_SHIFT            23
 -#define   SDVO_PHASE_SELECT_MASK      (15 << 19)
 -#define   SDVO_PHASE_SELECT_DEFAULT   (6 << 19)
 -#define   SDVO_CLOCK_OUTPUT_INVERT    (1 << 18)
 -#define   SDVOC_GANG_MODE             (1 << 16)
 -#define   SDVO_ENCODING_SDVO          (0x0 << 10)
 -#define   SDVO_ENCODING_HDMI          (0x2 << 10)
 -/** Requird for HDMI operation */
 -#define   SDVO_NULL_PACKETS_DURING_VSYNC (1 << 9)
 -#define   SDVO_COLOR_RANGE_16_235     (1 << 8)
 -#define   SDVO_BORDER_ENABLE          (1 << 7)
 -#define   SDVO_AUDIO_ENABLE           (1 << 6)
 -/** New with 965, default is to be set */
 -#define   SDVO_VSYNC_ACTIVE_HIGH      (1 << 4)
 -/** New with 965, default is to be set */
 -#define   SDVO_HSYNC_ACTIVE_HIGH      (1 << 3)
 -#define   SDVOB_PCIE_CONCURRENCY      (1 << 3)
 -#define   SDVO_DETECTED                       (1 << 2)
 +#define   SDVO_PHASE_SELECT_MASK              (15 << 19)
 +#define   SDVO_PHASE_SELECT_DEFAULT           (6 << 19)
 +#define   SDVO_CLOCK_OUTPUT_INVERT            (1 << 18)
 +#define   SDVOC_GANG_MODE                     (1 << 16) /* Port C only */
 +#define   SDVO_BORDER_ENABLE                  (1 << 7) /* SDVO only */
 +#define   SDVOB_PCIE_CONCURRENCY              (1 << 3) /* Port B only */
 +#define   SDVO_DETECTED                               (1 << 2)
  /* Bits to be preserved when writing */
 -#define   SDVOB_PRESERVE_MASK ((1 << 17) | (1 << 16) | (1 << 14) | (1 << 26))
 -#define   SDVOC_PRESERVE_MASK ((1 << 17) | (1 << 26))
 +#define   SDVOB_PRESERVE_MASK ((1 << 17) | (1 << 16) | (1 << 14) | \
 +                             SDVO_INTERRUPT_ENABLE)
 +#define   SDVOC_PRESERVE_MASK ((1 << 17) | SDVO_INTERRUPT_ENABLE)
 +
 +/* Gen 4 SDVO/HDMI bits: */
 +#define   SDVO_COLOR_FORMAT_8bpc              (0 << 26)
 +#define   SDVO_ENCODING_SDVO                  (0 << 10)
 +#define   SDVO_ENCODING_HDMI                  (2 << 10)
 +#define   HDMI_MODE_SELECT_HDMI                       (1 << 9) /* HDMI only */
 +#define   HDMI_MODE_SELECT_DVI                        (0 << 9) /* HDMI only */
 +#define   HDMI_COLOR_RANGE_16_235             (1 << 8) /* HDMI only */
 +#define   SDVO_AUDIO_ENABLE                   (1 << 6)
 +/* VSYNC/HSYNC bits new with 965, default is to be set */
 +#define   SDVO_VSYNC_ACTIVE_HIGH              (1 << 4)
 +#define   SDVO_HSYNC_ACTIVE_HIGH              (1 << 3)
 +
 +/* Gen 5 (IBX) SDVO/HDMI bits: */
 +#define   HDMI_COLOR_FORMAT_12bpc             (3 << 26) /* HDMI only */
 +#define   SDVOB_HOTPLUG_ENABLE                        (1 << 23) /* SDVO only */
 +
 +/* Gen 6 (CPT) SDVO/HDMI bits: */
 +#define   SDVO_PIPE_SEL_CPT(pipe)             ((pipe) << 29)
 +#define   SDVO_PIPE_SEL_MASK_CPT              (3 << 29)
 +
  
  /* DVO port control */
  #define DVOA                  0x61120
  #define HSW_VIDEO_DIP_VSC_ECC_B               0x61344
  #define HSW_VIDEO_DIP_GCP_B           0x61210
  
 -#define HSW_TVIDEO_DIP_CTL(pipe) \
 -       _PIPE(pipe, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B)
 -#define HSW_TVIDEO_DIP_AVI_DATA(pipe) \
 -       _PIPE(pipe, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B)
 -#define HSW_TVIDEO_DIP_SPD_DATA(pipe) \
 -       _PIPE(pipe, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B)
 -#define HSW_TVIDEO_DIP_GCP(pipe) \
 -      _PIPE(pipe, HSW_VIDEO_DIP_GCP_A, HSW_VIDEO_DIP_GCP_B)
 +#define HSW_TVIDEO_DIP_CTL(trans) \
 +       _TRANSCODER(trans, HSW_VIDEO_DIP_CTL_A, HSW_VIDEO_DIP_CTL_B)
 +#define HSW_TVIDEO_DIP_AVI_DATA(trans) \
 +       _TRANSCODER(trans, HSW_VIDEO_DIP_AVI_DATA_A, HSW_VIDEO_DIP_AVI_DATA_B)
 +#define HSW_TVIDEO_DIP_SPD_DATA(trans) \
 +       _TRANSCODER(trans, HSW_VIDEO_DIP_SPD_DATA_A, HSW_VIDEO_DIP_SPD_DATA_B)
 +#define HSW_TVIDEO_DIP_GCP(trans) \
 +      _TRANSCODER(trans, HSW_VIDEO_DIP_GCP_A, HSW_VIDEO_DIP_GCP_B)
 +#define HSW_TVIDEO_DIP_VSC_DATA(trans) \
 +       _TRANSCODER(trans, HSW_VIDEO_DIP_VSC_DATA_A, HSW_VIDEO_DIP_VSC_DATA_B)
  
  #define _TRANS_HTOTAL_B          0xe1000
  #define _TRANS_HBLANK_B          0xe1004
  #define FDI_PLL_CTL_1           0xfe000
  #define FDI_PLL_CTL_2           0xfe004
  
 -/* or SDVOB */
 -#define HDMIB   0xe1140
 -#define  PORT_ENABLE    (1 << 31)
 -#define  TRANSCODER(pipe)       ((pipe) << 30)
 -#define  TRANSCODER_CPT(pipe)   ((pipe) << 29)
 -#define  TRANSCODER_MASK        (1 << 30)
 -#define  TRANSCODER_MASK_CPT    (3 << 29)
 -#define  COLOR_FORMAT_8bpc      (0)
 -#define  COLOR_FORMAT_12bpc     (3 << 26)
 -#define  SDVOB_HOTPLUG_ENABLE   (1 << 23)
 -#define  SDVO_ENCODING          (0)
 -#define  TMDS_ENCODING          (2 << 10)
 -#define  NULL_PACKET_VSYNC_ENABLE       (1 << 9)
 -/* CPT */
 -#define  HDMI_MODE_SELECT     (1 << 9)
 -#define  DVI_MODE_SELECT      (0)
 -#define  SDVOB_BORDER_ENABLE    (1 << 7)
 -#define  AUDIO_ENABLE           (1 << 6)
 -#define  VSYNC_ACTIVE_HIGH      (1 << 4)
 -#define  HSYNC_ACTIVE_HIGH      (1 << 3)
 -#define  PORT_DETECTED          (1 << 2)
 -
 -/* PCH SDVOB multiplex with HDMIB */
 -#define PCH_SDVOB     HDMIB
 -
 -#define HDMIC   0xe1150
 -#define HDMID   0xe1160
 -
  #define PCH_LVDS      0xe1180
  #define  LVDS_DETECTED        (1 << 1)
  
  #define  FORCEWAKE_ACK_VLV                    0x1300b4
  #define  FORCEWAKE_ACK_HSW                    0x130044
  #define  FORCEWAKE_ACK                                0x130090
 +#define  VLV_GTLC_WAKE_CTRL                   0x130090
 +#define  VLV_GTLC_PW_STATUS                   0x130094
  #define  FORCEWAKE_MT                         0xa188 /* multi-threaded */
  #define   FORCEWAKE_KERNEL                    0x1
  #define   FORCEWAKE_USER                      0x2
index b49df7d9d2356f5dbd4f0f6805dee5c8fd8d979e,8d0bac3c35d7df012225ea47e922c60b353a0915..bfcc58ffecbb2f7df4c9779d31455685ca452631
@@@ -1341,15 -1341,15 +1341,15 @@@ static void intel_disable_ddi(struct in
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t tmp;
  
 +      tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
 +      tmp &= ~((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) << (pipe * 4));
 +      I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
 +
        if (type == INTEL_OUTPUT_EDP) {
                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  
                ironlake_edp_backlight_off(intel_dp);
        }
 -
 -      tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
 -      tmp &= ~((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) << (pipe * 4));
 -      I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
  }
  
  int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
@@@ -1391,8 -1391,8 +1391,8 @@@ void intel_ddi_prepare_link_retrain(str
        struct intel_dp *intel_dp = &intel_dig_port->dp;
        struct drm_i915_private *dev_priv = encoder->dev->dev_private;
        enum port port = intel_dig_port->port;
-       bool wait;
        uint32_t val;
+       bool wait = false;
  
        if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
                val = I915_READ(DDI_BUF_CTL(port));
@@@ -1489,7 -1489,6 +1489,6 @@@ static const struct drm_encoder_funcs i
  static const struct drm_encoder_helper_funcs intel_ddi_helper_funcs = {
        .mode_fixup = intel_ddi_mode_fixup,
        .mode_set = intel_ddi_mode_set,
-       .disable = intel_encoder_noop,
  };
  
  void intel_ddi_init(struct drm_device *dev, enum port port)
        intel_dig_port->port_reversal = I915_READ(DDI_BUF_CTL(port)) &
                                        DDI_BUF_PORT_REVERSAL;
        if (hdmi_connector)
 -              intel_dig_port->hdmi.sdvox_reg = DDI_BUF_CTL(port);
 -      else
 -              intel_dig_port->hdmi.sdvox_reg = 0;
 +              intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
        intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
  
        intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
index 630a96770043e17dc52c3f182fc0e3cd437c0281,287b42c9d1a8250e56d8a72d1b527cbb7dc1ad38..f73fc3df2bf85d8e6bd3a3d7ec24fd6a53038a4c
@@@ -71,24 -71,8 +71,24 @@@ typedef struct intel_limit intel_limit_
  struct intel_limit {
        intel_range_t   dot, vco, n, m, m1, m2, p, p1;
        intel_p2_t          p2;
 -      bool (* find_pll)(const intel_limit_t *, struct drm_crtc *,
 -                      int, int, intel_clock_t *, intel_clock_t *);
 +      /**
 +       * find_pll() - Find the best values for the PLL
 +       * @limit: limits for the PLL
 +       * @crtc: current CRTC
 +       * @target: target frequency in kHz
 +       * @refclk: reference clock frequency in kHz
 +       * @match_clock: if provided, @best_clock P divider must
 +       *               match the P divider from @match_clock
 +       *               used for LVDS downclocking
 +       * @best_clock: best PLL values found
 +       *
 +       * Returns true on success, false on failure.
 +       */
 +      bool (*find_pll)(const intel_limit_t *limit,
 +                       struct drm_crtc *crtc,
 +                       int target, int refclk,
 +                       intel_clock_t *match_clock,
 +                       intel_clock_t *best_clock);
  };
  
  /* FDI */
@@@ -487,6 -471,7 +487,6 @@@ static const intel_limit_t *intel_ironl
  
        if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
                if (intel_is_dual_link_lvds(dev)) {
 -                      /* LVDS dual channel */
                        if (refclk == 100000)
                                limit = &intel_limits_ironlake_dual_lvds_100m;
                        else
@@@ -513,8 -498,10 +513,8 @@@ static const intel_limit_t *intel_g4x_l
  
        if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
                if (intel_is_dual_link_lvds(dev))
 -                      /* LVDS with dual channel */
                        limit = &intel_limits_g4x_dual_channel_lvds;
                else
 -                      /* LVDS with dual channel */
                        limit = &intel_limits_g4x_single_channel_lvds;
        } else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_HDMI) ||
                   intel_pipe_has_type(crtc, INTEL_OUTPUT_ANALOG)) {
@@@ -1340,14 -1327,14 +1340,14 @@@ static bool dp_pipe_enabled(struct drm_
  static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv,
                              enum pipe pipe, u32 val)
  {
 -      if ((val & PORT_ENABLE) == 0)
 +      if ((val & SDVO_ENABLE) == 0)
                return false;
  
        if (HAS_PCH_CPT(dev_priv->dev)) {
 -              if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
 +              if ((val & SDVO_PIPE_SEL_MASK_CPT) != SDVO_PIPE_SEL_CPT(pipe))
                        return false;
        } else {
 -              if ((val & TRANSCODER_MASK) != TRANSCODER(pipe))
 +              if ((val & SDVO_PIPE_SEL_MASK) != SDVO_PIPE_SEL(pipe))
                        return false;
        }
        return true;
@@@ -1405,7 -1392,7 +1405,7 @@@ static void assert_pch_hdmi_disabled(st
             "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n",
             reg, pipe_name(pipe));
  
 -      WARN(HAS_PCH_IBX(dev_priv->dev) && (val & PORT_ENABLE) == 0
 +      WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_ENABLE) == 0
             && (val & SDVO_PIPE_B_SELECT),
             "IBX PCH hdmi port still using transcoder B\n");
  }
@@@ -1432,9 -1419,9 +1432,9 @@@ static void assert_pch_ports_disabled(s
             "PCH LVDS enabled on transcoder %c, should be disabled\n",
             pipe_name(pipe));
  
 -      assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB);
 -      assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC);
 -      assert_pch_hdmi_disabled(dev_priv, pipe, HDMID);
 +      assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMIB);
 +      assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMIC);
 +      assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMID);
  }
  
  /**
@@@ -2014,18 -2001,29 +2014,29 @@@ void intel_unpin_fb_obj(struct drm_i915
  
  /* Computes the linear offset to the base tile and adjusts x, y. bytes per pixel
   * is assumed to be a power-of-two. */
- unsigned long intel_gen4_compute_offset_xtiled(int *x, int *y,
-                                              unsigned int bpp,
-                                              unsigned int pitch)
+ unsigned long intel_gen4_compute_page_offset(int *x, int *y,
+                                            unsigned int tiling_mode,
+                                            unsigned int cpp,
+                                            unsigned int pitch)
  {
-       int tile_rows, tiles;
+       if (tiling_mode != I915_TILING_NONE) {
+               unsigned int tile_rows, tiles;
  
-       tile_rows = *y / 8;
-       *y %= 8;
-       tiles = *x / (512/bpp);
-       *x %= 512/bpp;
+               tile_rows = *y / 8;
+               *y %= 8;
  
-       return tile_rows * pitch * 8 + tiles * 4096;
+               tiles = *x / (512/cpp);
+               *x %= 512/cpp;
+               return tile_rows * pitch * 8 + tiles * 4096;
+       } else {
+               unsigned int offset;
+               offset = *y * pitch + *x * cpp;
+               *y = 0;
+               *x = (offset & 4095) / cpp;
+               return offset & -4096;
+       }
  }
  
  static int i9xx_update_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb,
  
        if (INTEL_INFO(dev)->gen >= 4) {
                intel_crtc->dspaddr_offset =
-                       intel_gen4_compute_offset_xtiled(&x, &y,
-                                                        fb->bits_per_pixel / 8,
-                                                        fb->pitches[0]);
+                       intel_gen4_compute_page_offset(&x, &y, obj->tiling_mode,
+                                                      fb->bits_per_pixel / 8,
+                                                      fb->pitches[0]);
                linear_offset -= intel_crtc->dspaddr_offset;
        } else {
                intel_crtc->dspaddr_offset = linear_offset;
@@@ -2195,9 -2193,9 +2206,9 @@@ static int ironlake_update_plane(struc
  
        linear_offset = y * fb->pitches[0] + x * (fb->bits_per_pixel / 8);
        intel_crtc->dspaddr_offset =
-               intel_gen4_compute_offset_xtiled(&x, &y,
-                                                fb->bits_per_pixel / 8,
-                                                fb->pitches[0]);
+               intel_gen4_compute_page_offset(&x, &y, obj->tiling_mode,
+                                              fb->bits_per_pixel / 8,
+                                              fb->pitches[0]);
        linear_offset -= intel_crtc->dspaddr_offset;
  
        DRM_DEBUG_KMS("Writing base %08X %08lX %d %d %d\n",
@@@ -2231,44 -2229,6 +2242,44 @@@ intel_pipe_set_base_atomic(struct drm_c
        return dev_priv->display.update_plane(crtc, fb, x, y);
  }
  
 +void intel_display_handle_reset(struct drm_device *dev)
 +{
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +      struct drm_crtc *crtc;
 +
 +      /*
 +       * Flips in the rings have been nuked by the reset,
 +       * so complete all pending flips so that user space
 +       * will get its events and not get stuck.
 +       *
 +       * Also update the base address of all primary
 +       * planes to the the last fb to make sure we're
 +       * showing the correct fb after a reset.
 +       *
 +       * Need to make two loops over the crtcs so that we
 +       * don't try to grab a crtc mutex before the
 +       * pending_flip_queue really got woken up.
 +       */
 +
 +      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
 +              struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 +              enum plane plane = intel_crtc->plane;
 +
 +              intel_prepare_page_flip(dev, plane);
 +              intel_finish_page_flip_plane(dev, plane);
 +      }
 +
 +      list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
 +              struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 +
 +              mutex_lock(&crtc->mutex);
 +              if (intel_crtc->active)
 +                      dev_priv->display.update_plane(crtc, crtc->fb,
 +                                                     crtc->x, crtc->y);
 +              mutex_unlock(&crtc->mutex);
 +      }
 +}
 +
  static int
  intel_finish_fb(struct drm_framebuffer *old_fb)
  {
@@@ -2352,6 -2312,9 +2363,6 @@@ intel_pipe_set_base(struct drm_crtc *cr
                return ret;
        }
  
 -      if (crtc->fb)
 -              intel_finish_fb(crtc->fb);
 -
        ret = dev_priv->display.update_plane(crtc, fb, x, y);
        if (ret) {
                intel_unpin_fb_obj(to_intel_framebuffer(fb)->obj);
@@@ -3641,6 -3604,30 +3652,30 @@@ static void intel_crtc_dpms_overlay(str
         */
  }
  
+ /**
+  * i9xx_fixup_plane - ugly workaround for G45 to fire up the hardware
+  * cursor plane briefly if not already running after enabling the display
+  * plane.
+  * This workaround avoids occasional blank screens when self refresh is
+  * enabled.
+  */
+ static void
+ g4x_fixup_plane(struct drm_i915_private *dev_priv, enum pipe pipe)
+ {
+       u32 cntl = I915_READ(CURCNTR(pipe));
+       if ((cntl & CURSOR_MODE) == 0) {
+               u32 fw_bcl_self = I915_READ(FW_BLC_SELF);
+               I915_WRITE(FW_BLC_SELF, fw_bcl_self & ~FW_BLC_SELF_EN);
+               I915_WRITE(CURCNTR(pipe), CURSOR_MODE_64_ARGB_AX);
+               intel_wait_for_vblank(dev_priv->dev, pipe);
+               I915_WRITE(CURCNTR(pipe), cntl);
+               I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe)));
+               I915_WRITE(FW_BLC_SELF, fw_bcl_self);
+       }
+ }
  static void i9xx_crtc_enable(struct drm_crtc *crtc)
  {
        struct drm_device *dev = crtc->dev;
  
        intel_enable_pipe(dev_priv, pipe, false);
        intel_enable_plane(dev_priv, plane, pipe);
+       if (IS_G4X(dev))
+               g4x_fixup_plane(dev_priv, pipe);
  
        intel_crtc_load_lut(crtc);
        intel_update_fbc(dev);
@@@ -3775,10 -3764,6 +3812,6 @@@ void intel_crtc_update_dpms(struct drm_
        intel_crtc_update_sarea(crtc, enable);
  }
  
- static void intel_crtc_noop(struct drm_crtc *crtc)
- {
- }
  static void intel_crtc_disable(struct drm_crtc *crtc)
  {
        struct drm_device *dev = crtc->dev;
@@@ -3827,10 -3812,6 +3860,6 @@@ void intel_modeset_disable(struct drm_d
        }
  }
  
- void intel_encoder_noop(struct drm_encoder *encoder)
- {
- }
  void intel_encoder_destroy(struct drm_encoder *encoder)
  {
        struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
@@@ -4531,7 -4512,11 +4560,7 @@@ static void i8xx_update_pll(struct drm_
                        dpll |= PLL_P2_DIVIDE_BY_4;
        }
  
 -      if (intel_pipe_has_type(crtc, INTEL_OUTPUT_TVOUT))
 -              /* XXX: just matching BIOS for now */
 -              /*      dpll |= PLL_REF_INPUT_TVCLKINBC; */
 -              dpll |= 3;
 -      else if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
 +      if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
                 intel_panel_use_ssc(dev_priv) && num_connectors < 2)
                dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
        else
@@@ -6451,6 -6436,20 +6480,6 @@@ static void intel_crtc_gamma_set(struc
        intel_crtc_load_lut(crtc);
  }
  
 -/**
 - * Get a pipe with a simple mode set on it for doing load-based monitor
 - * detection.
 - *
 - * It will be up to the load-detect code to adjust the pipe as appropriate for
 - * its requirements.  The pipe will be connected to no other encoders.
 - *
 - * Currently this code will only succeed if there is a pipe with no encoders
 - * configured for it.  In the future, it could choose to temporarily disable
 - * some outputs to free up a pipe for its use.
 - *
 - * \return crtc, or NULL if no pipes are available.
 - */
 -
  /* VESA 640x480x72Hz mode to set on the pipe */
  static struct drm_display_mode load_detect_mode = {
        DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 31500, 640, 664,
@@@ -6955,6 -6954,7 +6984,6 @@@ static void do_intel_finish_page_flip(s
        drm_i915_private_t *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_unpin_work *work;
 -      struct drm_i915_gem_object *obj;
        unsigned long flags;
  
        /* Ignore early vblank irqs */
  
        spin_unlock_irqrestore(&dev->event_lock, flags);
  
 -      obj = work->old_fb_obj;
 -
        wake_up_all(&dev_priv->pending_flip_queue);
  
        queue_work(dev_priv->wq, &work->work);
@@@ -7280,8 -7282,8 +7309,8 @@@ static int intel_crtc_page_flip(struct 
  {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_framebuffer *intel_fb;
-       struct drm_i915_gem_object *obj;
+       struct drm_framebuffer *old_fb = crtc->fb;
+       struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_unpin_work *work;
        unsigned long flags;
  
        work->event = event;
        work->crtc = crtc;
-       intel_fb = to_intel_framebuffer(crtc->fb);
-       work->old_fb_obj = intel_fb->obj;
+       work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
        INIT_WORK(&work->work, intel_unpin_work_fn);
  
        ret = drm_vblank_get(dev, intel_crtc->pipe);
        intel_crtc->unpin_work = work;
        spin_unlock_irqrestore(&dev->event_lock, flags);
  
-       intel_fb = to_intel_framebuffer(fb);
-       obj = intel_fb->obj;
        if (atomic_read(&intel_crtc->unpin_work_count) >= 2)
                flush_workqueue(dev_priv->wq);
  
  
  cleanup_pending:
        atomic_dec(&intel_crtc->unpin_work_count);
+       crtc->fb = old_fb;
        drm_gem_object_unreference(&work->old_fb_obj->base);
        drm_gem_object_unreference(&obj->base);
        mutex_unlock(&dev->struct_mutex);
@@@ -7383,7 -7382,6 +7409,6 @@@ free_work
  static struct drm_crtc_helper_funcs intel_helper_funcs = {
        .mode_set_base_atomic = intel_pipe_set_base_atomic,
        .load_lut = intel_crtc_load_lut,
-       .disable = intel_crtc_noop,
  };
  
  bool intel_encoder_check_is_cloned(struct intel_encoder *encoder)
@@@ -8093,14 -8091,9 +8118,9 @@@ static int intel_crtc_set_config(struc
        BUG_ON(!set->crtc);
        BUG_ON(!set->crtc->helper_private);
  
-       if (!set->mode)
-               set->fb = NULL;
-       /* The fb helper likes to play gross jokes with ->mode_set_config.
-        * Unfortunately the crtc helper doesn't do much at all for this case,
-        * so we have to cope with this madness until the fb helper is fixed up. */
-       if (set->fb && set->num_connectors == 0)
-               return 0;
+       /* Enforce sane interface api - has been abused by the fb helper. */
+       BUG_ON(!set->mode && set->fb);
+       BUG_ON(set->fb && set->num_connectors == 0);
  
        if (set->fb) {
                DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
                        goto fail;
                }
        } else if (config->fb_changed) {
 +              intel_crtc_wait_for_pending_flips(set->crtc);
 +
                ret = intel_pipe_set_base(set->crtc,
                                          set->x, set->y, set->fb);
        }
@@@ -8352,20 -8343,20 +8372,20 @@@ static void intel_setup_outputs(struct 
                if (has_edp_a(dev))
                        intel_dp_init(dev, DP_A, PORT_A);
  
 -              if (I915_READ(HDMIB) & PORT_DETECTED) {
 +              if (I915_READ(PCH_HDMIB) & SDVO_DETECTED) {
                        /* PCH SDVOB multiplex with HDMIB */
                        found = intel_sdvo_init(dev, PCH_SDVOB, true);
                        if (!found)
 -                              intel_hdmi_init(dev, HDMIB, PORT_B);
 +                              intel_hdmi_init(dev, PCH_HDMIB, PORT_B);
                        if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
                                intel_dp_init(dev, PCH_DP_B, PORT_B);
                }
  
 -              if (I915_READ(HDMIC) & PORT_DETECTED)
 -                      intel_hdmi_init(dev, HDMIC, PORT_C);
 +              if (I915_READ(PCH_HDMIC) & SDVO_DETECTED)
 +                      intel_hdmi_init(dev, PCH_HDMIC, PORT_C);
  
 -              if (!dpd_is_edp && I915_READ(HDMID) & PORT_DETECTED)
 -                      intel_hdmi_init(dev, HDMID, PORT_D);
 +              if (!dpd_is_edp && I915_READ(PCH_HDMID) & SDVO_DETECTED)
 +                      intel_hdmi_init(dev, PCH_HDMID, PORT_D);
  
                if (I915_READ(PCH_DP_C) & DP_DETECTED)
                        intel_dp_init(dev, PCH_DP_C, PORT_C);
                if (I915_READ(VLV_DISPLAY_BASE + DP_C) & DP_DETECTED)
                        intel_dp_init(dev, VLV_DISPLAY_BASE + DP_C, PORT_C);
  
 -              if (I915_READ(VLV_DISPLAY_BASE + SDVOB) & PORT_DETECTED) {
 -                      intel_hdmi_init(dev, VLV_DISPLAY_BASE + SDVOB, PORT_B);
 +              if (I915_READ(VLV_DISPLAY_BASE + GEN4_HDMIB) & SDVO_DETECTED) {
 +                      intel_hdmi_init(dev, VLV_DISPLAY_BASE + GEN4_HDMIB,
 +                                      PORT_B);
                        if (I915_READ(VLV_DISPLAY_BASE + DP_B) & DP_DETECTED)
                                intel_dp_init(dev, VLV_DISPLAY_BASE + DP_B, PORT_B);
                }
  
 -              if (I915_READ(VLV_DISPLAY_BASE + SDVOC) & PORT_DETECTED)
 -                      intel_hdmi_init(dev, VLV_DISPLAY_BASE + SDVOC, PORT_C);
 +              if (I915_READ(VLV_DISPLAY_BASE + GEN4_HDMIC) & SDVO_DETECTED)
 +                      intel_hdmi_init(dev, VLV_DISPLAY_BASE + GEN4_HDMIC,
 +                                      PORT_C);
  
        } else if (SUPPORTS_DIGITAL_OUTPUTS(dev)) {
                bool found = false;
  
 -              if (I915_READ(SDVOB) & SDVO_DETECTED) {
 +              if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
                        DRM_DEBUG_KMS("probing SDVOB\n");
 -                      found = intel_sdvo_init(dev, SDVOB, true);
 +                      found = intel_sdvo_init(dev, GEN3_SDVOB, true);
                        if (!found && SUPPORTS_INTEGRATED_HDMI(dev)) {
                                DRM_DEBUG_KMS("probing HDMI on SDVOB\n");
 -                              intel_hdmi_init(dev, SDVOB, PORT_B);
 +                              intel_hdmi_init(dev, GEN4_HDMIB, PORT_B);
                        }
  
                        if (!found && SUPPORTS_INTEGRATED_DP(dev)) {
  
                /* Before G4X SDVOC doesn't have its own detect register */
  
 -              if (I915_READ(SDVOB) & SDVO_DETECTED) {
 +              if (I915_READ(GEN3_SDVOB) & SDVO_DETECTED) {
                        DRM_DEBUG_KMS("probing SDVOC\n");
 -                      found = intel_sdvo_init(dev, SDVOC, false);
 +                      found = intel_sdvo_init(dev, GEN3_SDVOC, false);
                }
  
 -              if (!found && (I915_READ(SDVOC) & SDVO_DETECTED)) {
 +              if (!found && (I915_READ(GEN3_SDVOC) & SDVO_DETECTED)) {
  
                        if (SUPPORTS_INTEGRATED_HDMI(dev)) {
                                DRM_DEBUG_KMS("probing HDMI on SDVOC\n");
 -                              intel_hdmi_init(dev, SDVOC, PORT_C);
 +                              intel_hdmi_init(dev, GEN4_HDMIC, PORT_C);
                        }
                        if (SUPPORTS_INTEGRATED_DP(dev)) {
                                DRM_DEBUG_KMS("probing DP_C\n");
@@@ -9334,23 -9323,15 +9354,23 @@@ intel_display_capture_error_state(struc
        for_each_pipe(i) {
                cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, i);
  
 -              error->cursor[i].control = I915_READ(CURCNTR(i));
 -              error->cursor[i].position = I915_READ(CURPOS(i));
 -              error->cursor[i].base = I915_READ(CURBASE(i));
 +              if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) {
 +                      error->cursor[i].control = I915_READ(CURCNTR(i));
 +                      error->cursor[i].position = I915_READ(CURPOS(i));
 +                      error->cursor[i].base = I915_READ(CURBASE(i));
 +              } else {
 +                      error->cursor[i].control = I915_READ(CURCNTR_IVB(i));
 +                      error->cursor[i].position = I915_READ(CURPOS_IVB(i));
 +                      error->cursor[i].base = I915_READ(CURBASE_IVB(i));
 +              }
  
                error->plane[i].control = I915_READ(DSPCNTR(i));
                error->plane[i].stride = I915_READ(DSPSTRIDE(i));
 -              error->plane[i].size = I915_READ(DSPSIZE(i));
 +              if (INTEL_INFO(dev)->gen <= 3)
 +                      error->plane[i].size = I915_READ(DSPSIZE(i));
                error->plane[i].pos = I915_READ(DSPPOS(i));
 -              error->plane[i].addr = I915_READ(DSPADDR(i));
 +              if (INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev))
 +                      error->plane[i].addr = I915_READ(DSPADDR(i));
                if (INTEL_INFO(dev)->gen >= 4) {
                        error->plane[i].surface = I915_READ(DSPSURF(i));
                        error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
@@@ -9392,11 -9373,9 +9412,11 @@@ intel_display_print_error_state(struct 
                seq_printf(m, "Plane [%d]:\n", i);
                seq_printf(m, "  CNTR: %08x\n", error->plane[i].control);
                seq_printf(m, "  STRIDE: %08x\n", error->plane[i].stride);
 -              seq_printf(m, "  SIZE: %08x\n", error->plane[i].size);
 +              if (INTEL_INFO(dev)->gen <= 3)
 +                      seq_printf(m, "  SIZE: %08x\n", error->plane[i].size);
                seq_printf(m, "  POS: %08x\n", error->plane[i].pos);
 -              seq_printf(m, "  ADDR: %08x\n", error->plane[i].addr);
 +              if (!IS_HASWELL(dev))
 +                      seq_printf(m, "  ADDR: %08x\n", error->plane[i].addr);
                if (INTEL_INFO(dev)->gen >= 4) {
                        seq_printf(m, "  SURF: %08x\n", error->plane[i].surface);
                        seq_printf(m, "  TILEOFF: %08x\n", error->plane[i].tile_offset);
index 3921d879a9165724dbf61dd0879410fc87f8806b,6f728e5ee79391d3bf726f971eb7b96af307df0d..662a185274e686eb89e735255cdf3b46deb5ad5b
@@@ -328,10 -328,29 +328,10 @@@ intel_dp_aux_wait_done(struct intel_dp 
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        struct drm_device *dev = intel_dig_port->base.base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      uint32_t ch_ctl = intel_dp->output_reg + 0x10;
 +      uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg;
        uint32_t status;
        bool done;
  
 -      if (IS_HASWELL(dev)) {
 -              switch (intel_dig_port->port) {
 -              case PORT_A:
 -                      ch_ctl = DPA_AUX_CH_CTL;
 -                      break;
 -              case PORT_B:
 -                      ch_ctl = PCH_DPB_AUX_CH_CTL;
 -                      break;
 -              case PORT_C:
 -                      ch_ctl = PCH_DPC_AUX_CH_CTL;
 -                      break;
 -              case PORT_D:
 -                      ch_ctl = PCH_DPD_AUX_CH_CTL;
 -                      break;
 -              default:
 -                      BUG();
 -              }
 -      }
 -
  #define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)
        if (has_aux_irq)
                done = wait_event_timeout(dev_priv->gmbus_wait_queue, C,
@@@ -351,10 -370,11 +351,10 @@@ intel_dp_aux_ch(struct intel_dp *intel_
                uint8_t *send, int send_bytes,
                uint8_t *recv, int recv_size)
  {
 -      uint32_t output_reg = intel_dp->output_reg;
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        struct drm_device *dev = intel_dig_port->base.base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 -      uint32_t ch_ctl = output_reg + 0x10;
 +      uint32_t ch_ctl = intel_dp->aux_ch_ctl_reg;
        uint32_t ch_data = ch_ctl + 4;
        int i, ret, recv_bytes;
        uint32_t status;
         */
        pm_qos_update_request(&dev_priv->pm_qos, 0);
  
 -      if (IS_HASWELL(dev)) {
 -              switch (intel_dig_port->port) {
 -              case PORT_A:
 -                      ch_ctl = DPA_AUX_CH_CTL;
 -                      ch_data = DPA_AUX_CH_DATA1;
 -                      break;
 -              case PORT_B:
 -                      ch_ctl = PCH_DPB_AUX_CH_CTL;
 -                      ch_data = PCH_DPB_AUX_CH_DATA1;
 -                      break;
 -              case PORT_C:
 -                      ch_ctl = PCH_DPC_AUX_CH_CTL;
 -                      ch_data = PCH_DPC_AUX_CH_DATA1;
 -                      break;
 -              case PORT_D:
 -                      ch_ctl = PCH_DPD_AUX_CH_CTL;
 -                      ch_data = PCH_DPD_AUX_CH_DATA1;
 -                      break;
 -              default:
 -                      BUG();
 -              }
 -      }
 -
        intel_dp_check_edp(intel_dp);
        /* The clock divider is based off the hrawclk,
         * and would like to run at 2MHz. So, take the
@@@ -728,7 -771,7 +728,7 @@@ intel_dp_mode_fixup(struct drm_encoder 
                 * CEA-861-E - 5.1 Default Encoding Parameters
                 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry
                 */
-               if (bpp != 18 && drm_mode_cea_vic(adjusted_mode) > 1)
+               if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
                        intel_dp->color_range = DP_COLOR_RANGE_16_235;
                else
                        intel_dp->color_range = 0;
@@@ -800,7 -843,7 +800,7 @@@ intel_dp_set_m_n(struct drm_crtc *crtc
        intel_link_compute_m_n(intel_crtc->bpp, lane_count,
                               mode->clock, adjusted_mode->clock, &m_n);
  
 -      if (IS_HASWELL(dev)) {
 +      if (HAS_DDI(dev)) {
                I915_WRITE(PIPE_DATA_M1(cpu_transcoder),
                           TU_SIZE(m_n.tu) | m_n.gmch_m);
                I915_WRITE(PIPE_DATA_N1(cpu_transcoder), m_n.gmch_n);
@@@ -967,7 -1010,7 +967,7 @@@ intel_dp_mode_set(struct drm_encoder *e
                intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
        }
  
 -      if (is_cpu_edp(intel_dp))
 +      if (is_cpu_edp(intel_dp) && !IS_VALLEYVIEW(dev))
                ironlake_set_pll_edp(crtc, adjusted_mode->clock);
  }
  
@@@ -1331,7 -1374,7 +1331,7 @@@ static bool intel_dp_get_hw_state(struc
        if (!(tmp & DP_PORT_EN))
                return false;
  
 -      if (is_cpu_edp(intel_dp) && IS_GEN7(dev)) {
 +      if (is_cpu_edp(intel_dp) && IS_GEN7(dev) && !IS_VALLEYVIEW(dev)) {
                *pipe = PORT_TO_PIPE_CPT(tmp);
        } else if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) {
                *pipe = PORT_TO_PIPE(tmp);
@@@ -1495,7 -1538,7 +1495,7 @@@ intel_dp_pre_emphasis_max(struct intel_
  {
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
  
 -      if (IS_HASWELL(dev)) {
 +      if (HAS_DDI(dev)) {
                switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
                case DP_TRAIN_VOLTAGE_SWING_400:
                        return DP_TRAIN_PRE_EMPHASIS_9_5;
@@@ -1703,7 -1746,7 +1703,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)) {
 +      if (HAS_DDI(dev)) {
                signal_levels = intel_hsw_signal_levels(train_set);
                mask = DDI_BUF_EMP_MASK;
        } else if (IS_GEN7(dev) && is_cpu_edp(intel_dp) && !IS_VALLEYVIEW(dev)) {
@@@ -1734,7 -1777,7 +1734,7 @@@ intel_dp_set_link_train(struct intel_d
        int ret;
        uint32_t temp;
  
 -      if (IS_HASWELL(dev)) {
 +      if (HAS_DDI(dev)) {
                temp = I915_READ(DP_TP_CTL(port));
  
                if (dp_train_pat & DP_LINK_SCRAMBLING_DISABLE)
@@@ -2258,16 -2301,6 +2258,16 @@@ g4x_dp_detect(struct intel_dp *intel_dp
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        uint32_t bit;
  
 +      /* Can't disconnect eDP, but you can close the lid... */
 +      if (is_edp(intel_dp)) {
 +              enum drm_connector_status status;
 +
 +              status = intel_panel_detect(dev);
 +              if (status == connector_status_unknown)
 +                      status = connector_status_connected;
 +              return status;
 +      }
 +
        switch (intel_dig_port->port) {
        case PORT_B:
                bit = PORTB_HOTPLUG_LIVE_STATUS;
@@@ -2529,7 -2562,6 +2529,6 @@@ void intel_dp_encoder_destroy(struct dr
  static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = {
        .mode_fixup = intel_dp_mode_fixup,
        .mode_set = intel_dp_mode_set,
-       .disable = intel_encoder_noop,
  };
  
  static const struct drm_connector_funcs intel_dp_connector_funcs = {
@@@ -2799,25 -2831,6 +2798,25 @@@ intel_dp_init_connector(struct intel_di
        else
                intel_connector->get_hw_state = intel_connector_get_hw_state;
  
 +      intel_dp->aux_ch_ctl_reg = intel_dp->output_reg + 0x10;
 +      if (HAS_DDI(dev)) {
 +              switch (intel_dig_port->port) {
 +              case PORT_A:
 +                      intel_dp->aux_ch_ctl_reg = DPA_AUX_CH_CTL;
 +                      break;
 +              case PORT_B:
 +                      intel_dp->aux_ch_ctl_reg = PCH_DPB_AUX_CH_CTL;
 +                      break;
 +              case PORT_C:
 +                      intel_dp->aux_ch_ctl_reg = PCH_DPC_AUX_CH_CTL;
 +                      break;
 +              case PORT_D:
 +                      intel_dp->aux_ch_ctl_reg = PCH_DPD_AUX_CH_CTL;
 +                      break;
 +              default:
 +                      BUG();
 +              }
 +      }
  
        /* Set up the DDC bus. */
        switch (port) {
index 010e998dda5fffb8cb81123765d57b17b8ad60dc,07ebac6fe8cace004082913a325da446ebb4b07d..e6f84d0db037feb0c68cb9709aca030731069b39
@@@ -347,7 -347,7 +347,7 @@@ struct dip_infoframe 
  } __attribute__((packed));
  
  struct intel_hdmi {
 -      u32 sdvox_reg;
 +      u32 hdmi_reg;
        int ddc_bus;
        uint32_t color_range;
        bool color_range_auto;
  
  struct intel_dp {
        uint32_t output_reg;
 +      uint32_t aux_ch_ctl_reg;
        uint32_t DP;
        uint8_t  link_configuration[DP_LINK_CONFIGURATION_SIZE];
        bool has_audio;
@@@ -444,7 -443,7 +444,7 @@@ extern void intel_attach_broadcast_rgb_
  
  extern void intel_crt_init(struct drm_device *dev);
  extern void intel_hdmi_init(struct drm_device *dev,
 -                          int sdvox_reg, enum port port);
 +                          int hdmi_reg, enum port port);
  extern void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
                                      struct intel_connector *intel_connector);
  extern struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder);
@@@ -526,7 -525,6 +526,6 @@@ extern void intel_modeset_disable(struc
  extern void intel_crtc_restore_mode(struct drm_crtc *crtc);
  extern void intel_crtc_load_lut(struct drm_crtc *crtc);
  extern void intel_crtc_update_dpms(struct drm_crtc *crtc);
- extern void intel_encoder_noop(struct drm_encoder *encoder);
  extern void intel_encoder_destroy(struct drm_encoder *encoder);
  extern void intel_encoder_dpms(struct intel_encoder *encoder, int mode);
  extern bool intel_encoder_check_is_cloned(struct intel_encoder *encoder);
@@@ -650,9 -648,10 +649,10 @@@ extern void intel_update_sprite_waterma
  extern void intel_update_linetime_watermarks(struct drm_device *dev, int pipe,
                         struct drm_display_mode *mode);
  
- extern unsigned long intel_gen4_compute_offset_xtiled(int *x, int *y,
-                                                     unsigned int bpp,
-                                                     unsigned int pitch);
+ extern unsigned long intel_gen4_compute_page_offset(int *x, int *y,
+                                                   unsigned int tiling_mode,
+                                                   unsigned int bpp,
+                                                   unsigned int pitch);
  
  extern int intel_sprite_set_colorkey(struct drm_device *dev, void *data,
                                     struct drm_file *file_priv);
@@@ -696,6 -695,4 +696,6 @@@ extern boo
  intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
  extern void intel_ddi_fdi_disable(struct drm_crtc *crtc);
  
 +extern void intel_display_handle_reset(struct drm_device *dev);
 +
  #endif /* __INTEL_DRV_H__ */
index 953ee7387d6a0c0d4f38c08ecfb3cdd125b000b0,981bdce3634ebcff3a8c11c80cd44d1ba838a229..510a96047ae4520a6755c72e0395f20fafe283ac
@@@ -57,9 -57,10 +57,10 @@@ static struct fb_ops intelfb_ops = 
        .fb_debug_leave = drm_fb_helper_debug_leave,
  };
  
- static int intelfb_create(struct intel_fbdev *ifbdev,
+ static int intelfb_create(struct drm_fb_helper *helper,
                          struct drm_fb_helper_surface_size *sizes)
  {
+       struct intel_fbdev *ifbdev = (struct intel_fbdev *)helper;
        struct drm_device *dev = ifbdev->helper.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct fb_info *info;
        }
        info->screen_size = size;
  
 -//    memset(info->screen_base, 0, size);
 -
        drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth);
        drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height);
  
@@@ -179,26 -182,10 +180,10 @@@ out
        return ret;
  }
  
- static int intel_fb_find_or_create_single(struct drm_fb_helper *helper,
-                                         struct drm_fb_helper_surface_size *sizes)
- {
-       struct intel_fbdev *ifbdev = (struct intel_fbdev *)helper;
-       int new_fb = 0;
-       int ret;
-       if (!helper->fb) {
-               ret = intelfb_create(ifbdev, sizes);
-               if (ret)
-                       return ret;
-               new_fb = 1;
-       }
-       return new_fb;
- }
  static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
        .gamma_set = intel_crtc_fb_gamma_set,
        .gamma_get = intel_crtc_fb_gamma_get,
-       .fb_probe = intel_fb_find_or_create_single,
+       .fb_probe = intelfb_create,
  };
  
  static void intel_fbdev_destroy(struct drm_device *dev,
index 4d222ec58b81d49cbef07373ed4a2e2ab0b3b2be,fa8ec4a26041c65ccf48ebba4bc8bd9ec9b30946..c882839cd51eade9fb12ad1aa645d0e52bbe2507
@@@ -50,7 -50,7 +50,7 @@@ assert_hdmi_port_disabled(struct intel_
  
        enabled_bits = HAS_DDI(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
  
 -      WARN(I915_READ(intel_hdmi->sdvox_reg) & enabled_bits,
 +      WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
             "HDMI port enabled, expecting disabled\n");
  }
  
@@@ -120,14 -120,13 +120,14 @@@ static u32 hsw_infoframe_enable(struct 
        }
  }
  
 -static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame, enum pipe pipe)
 +static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame,
 +                                enum transcoder cpu_transcoder)
  {
        switch (frame->type) {
        case DIP_TYPE_AVI:
 -              return HSW_TVIDEO_DIP_AVI_DATA(pipe);
 +              return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
        case DIP_TYPE_SPD:
 -              return HSW_TVIDEO_DIP_SPD_DATA(pipe);
 +              return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
        default:
                DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
                return 0;
@@@ -294,8 -293,8 +294,8 @@@ static void hsw_write_infoframe(struct 
        struct drm_device *dev = encoder->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 -      u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
 -      u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->pipe);
 +      u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->cpu_transcoder);
 +      u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->cpu_transcoder);
        unsigned int i, len = DIP_HEADER_SIZE + frame->len;
        u32 val = I915_READ(ctl_reg);
  
@@@ -349,7 -348,7 +349,7 @@@ static void intel_hdmi_set_avi_infofram
                        avi_if.body.avi.ITC_EC_Q_SC |= DIP_AVI_RGB_QUANT_RANGE_FULL;
        }
  
-       avi_if.body.avi.VIC = drm_mode_cea_vic(adjusted_mode);
+       avi_if.body.avi.VIC = drm_match_cea_mode(adjusted_mode);
  
        intel_set_infoframe(encoder, &avi_if);
  }
@@@ -569,7 -568,7 +569,7 @@@ static void hsw_set_infoframes(struct d
        struct drm_i915_private *dev_priv = encoder->dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 -      u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
 +      u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->cpu_transcoder);
        u32 val = I915_READ(reg);
  
        assert_hdmi_port_disabled(intel_hdmi);
@@@ -598,40 -597,40 +598,40 @@@ static void intel_hdmi_mode_set(struct 
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 -      u32 sdvox;
 +      u32 hdmi_val;
  
 -      sdvox = SDVO_ENCODING_HDMI;
 +      hdmi_val = SDVO_ENCODING_HDMI;
        if (!HAS_PCH_SPLIT(dev))
 -              sdvox |= intel_hdmi->color_range;
 +              hdmi_val |= intel_hdmi->color_range;
        if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
 -              sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
 +              hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
        if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
 -              sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
 +              hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
  
        if (intel_crtc->bpp > 24)
 -              sdvox |= COLOR_FORMAT_12bpc;
 +              hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
        else
 -              sdvox |= COLOR_FORMAT_8bpc;
 +              hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
  
        /* Required on CPT */
        if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
 -              sdvox |= HDMI_MODE_SELECT;
 +              hdmi_val |= HDMI_MODE_SELECT_HDMI;
  
        if (intel_hdmi->has_audio) {
                DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
                                 pipe_name(intel_crtc->pipe));
 -              sdvox |= SDVO_AUDIO_ENABLE;
 -              sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
 +              hdmi_val |= SDVO_AUDIO_ENABLE;
 +              hdmi_val |= HDMI_MODE_SELECT_HDMI;
                intel_write_eld(encoder, adjusted_mode);
        }
  
        if (HAS_PCH_CPT(dev))
 -              sdvox |= PORT_TRANS_SEL_CPT(intel_crtc->pipe);
 -      else if (intel_crtc->pipe == PIPE_B)
 -              sdvox |= SDVO_PIPE_B_SELECT;
 +              hdmi_val |= SDVO_PIPE_SEL_CPT(intel_crtc->pipe);
 +      else
 +              hdmi_val |= SDVO_PIPE_SEL(intel_crtc->pipe);
  
 -      I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
 -      POSTING_READ(intel_hdmi->sdvox_reg);
 +      I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
 +      POSTING_READ(intel_hdmi->hdmi_reg);
  
        intel_hdmi->set_infoframes(encoder, adjusted_mode);
  }
@@@ -644,7 -643,7 +644,7 @@@ static bool intel_hdmi_get_hw_state(str
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
        u32 tmp;
  
 -      tmp = I915_READ(intel_hdmi->sdvox_reg);
 +      tmp = I915_READ(intel_hdmi->hdmi_reg);
  
        if (!(tmp & SDVO_ENABLE))
                return false;
@@@ -661,7 -660,6 +661,7 @@@ static void intel_enable_hdmi(struct in
  {
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 +      struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
        struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
        u32 temp;
        u32 enable_bits = SDVO_ENABLE;
        if (intel_hdmi->has_audio)
                enable_bits |= SDVO_AUDIO_ENABLE;
  
 -      temp = I915_READ(intel_hdmi->sdvox_reg);
 +      temp = I915_READ(intel_hdmi->hdmi_reg);
  
        /* HW workaround for IBX, we need to move the port to transcoder A
 -       * before disabling it. */
 -      if (HAS_PCH_IBX(dev)) {
 -              struct drm_crtc *crtc = encoder->base.crtc;
 -              int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
 -
 -              /* Restore the transcoder select bit. */
 -              if (pipe == PIPE_B)
 -                      enable_bits |= SDVO_PIPE_B_SELECT;
 -      }
 +       * before disabling it, so restore the transcoder select bit here. */
 +      if (HAS_PCH_IBX(dev))
 +              enable_bits |= SDVO_PIPE_SEL(intel_crtc->pipe);
  
        /* HW workaround, need to toggle enable bit off and on for 12bpc, but
         * we do this anyway which shows more stable in testing.
         */
        if (HAS_PCH_SPLIT(dev)) {
 -              I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
 -              POSTING_READ(intel_hdmi->sdvox_reg);
 +              I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
 +              POSTING_READ(intel_hdmi->hdmi_reg);
        }
  
        temp |= enable_bits;
  
 -      I915_WRITE(intel_hdmi->sdvox_reg, temp);
 -      POSTING_READ(intel_hdmi->sdvox_reg);
 +      I915_WRITE(intel_hdmi->hdmi_reg, temp);
 +      POSTING_READ(intel_hdmi->hdmi_reg);
  
        /* HW workaround, need to write this twice for issue that may result
         * in first write getting masked.
         */
        if (HAS_PCH_SPLIT(dev)) {
 -              I915_WRITE(intel_hdmi->sdvox_reg, temp);
 -              POSTING_READ(intel_hdmi->sdvox_reg);
 +              I915_WRITE(intel_hdmi->hdmi_reg, temp);
 +              POSTING_READ(intel_hdmi->hdmi_reg);
        }
  }
  
@@@ -706,7 -710,7 +706,7 @@@ static void intel_disable_hdmi(struct i
        u32 temp;
        u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
  
 -      temp = I915_READ(intel_hdmi->sdvox_reg);
 +      temp = I915_READ(intel_hdmi->hdmi_reg);
  
        /* HW workaround for IBX, we need to move the port to transcoder A
         * before disabling it. */
  
                if (temp & SDVO_PIPE_B_SELECT) {
                        temp &= ~SDVO_PIPE_B_SELECT;
 -                      I915_WRITE(intel_hdmi->sdvox_reg, temp);
 -                      POSTING_READ(intel_hdmi->sdvox_reg);
 +                      I915_WRITE(intel_hdmi->hdmi_reg, temp);
 +                      POSTING_READ(intel_hdmi->hdmi_reg);
  
                        /* Again we need to write this twice. */
 -                      I915_WRITE(intel_hdmi->sdvox_reg, temp);
 -                      POSTING_READ(intel_hdmi->sdvox_reg);
 +                      I915_WRITE(intel_hdmi->hdmi_reg, temp);
 +                      POSTING_READ(intel_hdmi->hdmi_reg);
  
                        /* Transcoder selection bits only update
                         * effectively on vblank. */
         * we do this anyway which shows more stable in testing.
         */
        if (HAS_PCH_SPLIT(dev)) {
 -              I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
 -              POSTING_READ(intel_hdmi->sdvox_reg);
 +              I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
 +              POSTING_READ(intel_hdmi->hdmi_reg);
        }
  
        temp &= ~enable_bits;
  
 -      I915_WRITE(intel_hdmi->sdvox_reg, temp);
 -      POSTING_READ(intel_hdmi->sdvox_reg);
 +      I915_WRITE(intel_hdmi->hdmi_reg, temp);
 +      POSTING_READ(intel_hdmi->hdmi_reg);
  
        /* HW workaround, need to write this twice for issue that may result
         * in first write getting masked.
         */
        if (HAS_PCH_SPLIT(dev)) {
 -              I915_WRITE(intel_hdmi->sdvox_reg, temp);
 -              POSTING_READ(intel_hdmi->sdvox_reg);
 +              I915_WRITE(intel_hdmi->hdmi_reg, temp);
 +              POSTING_READ(intel_hdmi->hdmi_reg);
        }
  }
  
@@@ -777,8 -781,8 +777,8 @@@ bool intel_hdmi_mode_fixup(struct drm_e
        if (intel_hdmi->color_range_auto) {
                /* See CEA-861-E - 5.1 Default Encoding Parameters */
                if (intel_hdmi->has_hdmi_sink &&
-                   drm_mode_cea_vic(adjusted_mode) > 1)
+                   drm_match_cea_mode(adjusted_mode) > 1)
 -                      intel_hdmi->color_range = SDVO_COLOR_RANGE_16_235;
 +                      intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
                else
                        intel_hdmi->color_range = 0;
        }
        return true;
  }
  
- static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
- {
-       struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_digital_port *intel_dig_port = hdmi_to_dig_port(intel_hdmi);
-       uint32_t bit;
-       switch (intel_dig_port->port) {
-       case PORT_B:
-               bit = PORTB_HOTPLUG_LIVE_STATUS;
-               break;
-       case PORT_C:
-               bit = PORTC_HOTPLUG_LIVE_STATUS;
-               break;
-       default:
-               bit = 0;
-               break;
-       }
-       return I915_READ(PORT_HOTPLUG_STAT) & bit;
- }
  static enum drm_connector_status
  intel_hdmi_detect(struct drm_connector *connector, bool force)
  {
        struct edid *edid;
        enum drm_connector_status status = connector_status_disconnected;
  
-       if (IS_G4X(dev) && !g4x_hdmi_connected(intel_hdmi))
-               return status;
-       else if (HAS_PCH_SPLIT(dev) &&
-                !ibx_digital_port_connected(dev_priv, intel_dig_port))
-                return status;
        intel_hdmi->has_hdmi_sink = false;
        intel_hdmi->has_audio = false;
        intel_hdmi->rgb_quant_range_selectable = false;
@@@ -941,7 -916,7 +912,7 @@@ intel_hdmi_set_property(struct drm_conn
                        break;
                case INTEL_BROADCAST_RGB_LIMITED:
                        intel_hdmi->color_range_auto = false;
 -                      intel_hdmi->color_range = SDVO_COLOR_RANGE_16_235;
 +                      intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
                        break;
                default:
                        return -EINVAL;
@@@ -968,7 -943,6 +939,6 @@@ static void intel_hdmi_destroy(struct d
  static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
        .mode_fixup = intel_hdmi_mode_fixup,
        .mode_set = intel_hdmi_mode_set,
-       .disable = intel_encoder_noop,
  };
  
  static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
@@@ -1040,7 -1014,7 +1010,7 @@@ void intel_hdmi_init_connector(struct i
        } else if (IS_VALLEYVIEW(dev)) {
                intel_hdmi->write_infoframe = vlv_write_infoframe;
                intel_hdmi->set_infoframes = vlv_set_infoframes;
 -      } else if (IS_HASWELL(dev)) {
 +      } else if (HAS_DDI(dev)) {
                intel_hdmi->write_infoframe = hsw_write_infoframe;
                intel_hdmi->set_infoframes = hsw_set_infoframes;
        } else if (HAS_PCH_IBX(dev)) {
        }
  }
  
 -void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
 +void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
  {
        struct intel_digital_port *intel_dig_port;
        struct intel_encoder *intel_encoder;
        intel_encoder->cloneable = false;
  
        intel_dig_port->port = port;
 -      intel_dig_port->hdmi.sdvox_reg = sdvox_reg;
 +      intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
        intel_dig_port->dp.output_reg = 0;
  
        intel_hdmi_init_connector(intel_dig_port, intel_connector);
index 53bd5fd840281ca4f25cf3af15cb119b5e6e2382,3d1d97488cc95527c699dd6eb8b0c2ec78cc6adf..6ff145f97e90fa39444526dc5f35e3b27c43c7f5
@@@ -663,7 -663,6 +663,6 @@@ static int intel_lvds_set_property(stru
  static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = {
        .mode_fixup = intel_lvds_mode_fixup,
        .mode_set = intel_lvds_mode_set,
-       .disable = intel_encoder_noop,
  };
  
  static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = {
@@@ -1020,15 -1019,12 +1019,15 @@@ static bool intel_lvds_supported(struc
  {
        /* With the introduction of the PCH we gained a dedicated
         * LVDS presence pin, use it. */
 -      if (HAS_PCH_SPLIT(dev))
 +      if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
                return true;
  
        /* Otherwise LVDS was only attached to mobile products,
         * except for the inglorious 830gm */
 -      return IS_MOBILE(dev) && !IS_I830(dev);
 +      if (INTEL_INFO(dev)->gen <= 4 && IS_MOBILE(dev) && !IS_I830(dev))
 +              return true;
 +
 +      return false;
  }
  
  /**
index 44a23b9b8e5326bfc8e1d51196b5aae2e8e7849b,a1794c6df1bf1b80917f60e2145c39ae741aa478..c30e89a45236743e04eebb764893db1ddf517da3
@@@ -2574,7 -2574,7 +2574,7 @@@ static void gen6_enable_rps(struct drm_
        I915_WRITE(GEN6_RC_SLEEP, 0);
        I915_WRITE(GEN6_RC1e_THRESHOLD, 1000);
        I915_WRITE(GEN6_RC6_THRESHOLD, 50000);
-       I915_WRITE(GEN6_RC6p_THRESHOLD, 100000);
+       I915_WRITE(GEN6_RC6p_THRESHOLD, 150000);
        I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */
  
        /* Check if we are enabling RC6 */
@@@ -2821,7 -2821,7 +2821,7 @@@ static void ironlake_enable_rc6(struct 
        ret = intel_ring_idle(ring);
        dev_priv->mm.interruptible = was_interruptible;
        if (ret) {
 -              DRM_ERROR("failed to enable ironlake power power savings\n");
 +              DRM_ERROR("failed to enable ironlake power savings\n");
                ironlake_teardown_rc6(dev);
                return;
        }
@@@ -4076,7 -4076,7 +4076,7 @@@ void intel_set_power_well(struct drm_de
        bool is_enabled, enable_requested;
        uint32_t tmp;
  
 -      if (!IS_HASWELL(dev))
 +      if (!HAS_POWER_WELL(dev))
                return;
  
        tmp = I915_READ(HSW_PWR_WELL_DRIVER);
@@@ -4111,7 -4111,7 +4111,7 @@@ void intel_init_power_well(struct drm_d
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
  
 -      if (!IS_HASWELL(dev))
 +      if (!HAS_POWER_WELL(dev))
                return;
  
        /* For now, we need the power well to be always enabled. */
@@@ -4271,14 -4271,21 +4271,14 @@@ static void __gen6_gt_force_wake_reset(
  
  static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
  {
 -      u32 forcewake_ack;
 -
 -      if (IS_HASWELL(dev_priv->dev))
 -              forcewake_ack = FORCEWAKE_ACK_HSW;
 -      else
 -              forcewake_ack = FORCEWAKE_ACK;
 -
 -      if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1) == 0,
 +      if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK) & 1) == 0,
                            FORCEWAKE_ACK_TIMEOUT_MS))
                DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
  
 -      I915_WRITE_NOTRACE(FORCEWAKE, FORCEWAKE_KERNEL);
 +      I915_WRITE_NOTRACE(FORCEWAKE, 1);
        POSTING_READ(ECOBUS); /* something from same cacheline, but !FORCEWAKE */
  
 -      if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1),
 +      if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK) & 1),
                            FORCEWAKE_ACK_TIMEOUT_MS))
                DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
  
@@@ -4301,7 -4308,7 +4301,7 @@@ static void __gen6_gt_force_wake_mt_get
        else
                forcewake_ack = FORCEWAKE_MT_ACK;
  
 -      if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1) == 0,
 +      if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & FORCEWAKE_KERNEL) == 0,
                            FORCEWAKE_ACK_TIMEOUT_MS))
                DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
  
        /* something from same cacheline, but !FORCEWAKE_MT */
        POSTING_READ(ECOBUS);
  
 -      if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1),
 +      if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & FORCEWAKE_KERNEL),
                            FORCEWAKE_ACK_TIMEOUT_MS))
                DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
  
@@@ -4399,13 -4406,13 +4399,13 @@@ static void vlv_force_wake_reset(struc
  
  static void vlv_force_wake_get(struct drm_i915_private *dev_priv)
  {
 -      if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK_VLV) & 1) == 0,
 +      if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK_VLV) & FORCEWAKE_KERNEL) == 0,
                            FORCEWAKE_ACK_TIMEOUT_MS))
                DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
  
        I915_WRITE_NOTRACE(FORCEWAKE_VLV, _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
  
 -      if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK_VLV) & 1),
 +      if (wait_for_atomic((I915_READ_NOTRACE(FORCEWAKE_ACK_VLV) & FORCEWAKE_KERNEL),
                            FORCEWAKE_ACK_TIMEOUT_MS))
                DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
  
index 38b8511ca5984982fd83305165cfe80f4eb1ca20,d07a8cdf998ec4b1eadda9aa9906a8053f25b1ee..53005260cd1d8968a8e1ed33f38a31219fb45b77
@@@ -246,11 -246,11 +246,11 @@@ static void intel_sdvo_write_sdvox(stru
                return;
        }
  
 -      if (intel_sdvo->sdvo_reg == SDVOB) {
 -              cval = I915_READ(SDVOC);
 -      } else {
 -              bval = I915_READ(SDVOB);
 -      }
 +      if (intel_sdvo->sdvo_reg == GEN3_SDVOB)
 +              cval = I915_READ(GEN3_SDVOC);
 +      else
 +              bval = I915_READ(GEN3_SDVOB);
 +
        /*
         * Write the registers twice for luck. Sometimes,
         * writing them only once doesn't appear to 'stick'.
         */
        for (i = 0; i < 2; i++)
        {
 -              I915_WRITE(SDVOB, bval);
 -              I915_READ(SDVOB);
 -              I915_WRITE(SDVOC, cval);
 -              I915_READ(SDVOC);
 +              I915_WRITE(GEN3_SDVOB, bval);
 +              I915_READ(GEN3_SDVOB);
 +              I915_WRITE(GEN3_SDVOC, cval);
 +              I915_READ(GEN3_SDVOC);
        }
  }
  
@@@ -451,7 -451,7 +451,7 @@@ static bool intel_sdvo_write_cmd(struc
        int i, ret = true;
  
          /* Would be simpler to allocate both in one go ? */        
 -      buf = (u8 *)kzalloc(args_len * 2 + 2, GFP_KERNEL);
 +      buf = kzalloc(args_len * 2 + 2, GFP_KERNEL);
        if (!buf)
                return false;
  
@@@ -1076,11 -1076,9 +1076,11 @@@ static bool intel_sdvo_mode_fixup(struc
  
        if (intel_sdvo->color_range_auto) {
                /* See CEA-861-E - 5.1 Default Encoding Parameters */
 +              /* FIXME: This bit is only valid when using TMDS encoding and 8
 +               * bit per color mode. */
                if (intel_sdvo->has_hdmi_monitor &&
-                   drm_mode_cea_vic(adjusted_mode) > 1)
+                   drm_match_cea_mode(adjusted_mode) > 1)
 -                      intel_sdvo->color_range = SDVO_COLOR_RANGE_16_235;
 +                      intel_sdvo->color_range = HDMI_COLOR_RANGE_16_235;
                else
                        intel_sdvo->color_range = 0;
        }
@@@ -1184,10 -1182,10 +1184,10 @@@ static void intel_sdvo_mode_set(struct 
        } else {
                sdvox = I915_READ(intel_sdvo->sdvo_reg);
                switch (intel_sdvo->sdvo_reg) {
 -              case SDVOB:
 +              case GEN3_SDVOB:
                        sdvox &= SDVOB_PRESERVE_MASK;
                        break;
 -              case SDVOC:
 +              case GEN3_SDVOC:
                        sdvox &= SDVOC_PRESERVE_MASK;
                        break;
                }
        }
  
        if (INTEL_PCH_TYPE(dev) >= PCH_CPT)
 -              sdvox |= TRANSCODER_CPT(intel_crtc->pipe);
 +              sdvox |= SDVO_PIPE_SEL_CPT(intel_crtc->pipe);
        else
 -              sdvox |= TRANSCODER(intel_crtc->pipe);
 +              sdvox |= SDVO_PIPE_SEL(intel_crtc->pipe);
  
        if (intel_sdvo->has_hdmi_audio)
                sdvox |= SDVO_AUDIO_ENABLE;
@@@ -1307,9 -1305,15 +1307,9 @@@ static void intel_enable_sdvo(struct in
        temp = I915_READ(intel_sdvo->sdvo_reg);
        if ((temp & SDVO_ENABLE) == 0) {
                /* HW workaround for IBX, we need to move the port
 -               * to transcoder A before disabling it. */
 -              if (HAS_PCH_IBX(dev)) {
 -                      struct drm_crtc *crtc = encoder->base.crtc;
 -                      int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
 -
 -                      /* Restore the transcoder select bit. */
 -                      if (pipe == PIPE_B)
 -                              temp |= SDVO_PIPE_B_SELECT;
 -              }
 +               * to transcoder A before disabling it, so restore it here. */
 +              if (HAS_PCH_IBX(dev))
 +                      temp |= SDVO_PIPE_SEL(intel_crtc->pipe);
  
                intel_sdvo_write_sdvox(intel_sdvo, temp | SDVO_ENABLE);
        }
@@@ -1928,9 -1932,7 +1928,9 @@@ intel_sdvo_set_property(struct drm_conn
                        break;
                case INTEL_BROADCAST_RGB_LIMITED:
                        intel_sdvo->color_range_auto = false;
 -                      intel_sdvo->color_range = SDVO_COLOR_RANGE_16_235;
 +                      /* FIXME: this bit is only valid when using TMDS
 +                       * encoding and 8 bit per color mode. */
 +                      intel_sdvo->color_range = HDMI_COLOR_RANGE_16_235;
                        break;
                default:
                        return -EINVAL;
@@@ -2041,7 -2043,6 +2041,6 @@@ done
  static const struct drm_encoder_helper_funcs intel_sdvo_helper_funcs = {
        .mode_fixup = intel_sdvo_mode_fixup,
        .mode_set = intel_sdvo_mode_set,
-       .disable = intel_encoder_noop,
  };
  
  static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
diff --combined drivers/video/fbmem.c
index 2af7153da2e412b791a003b57bf875fe249a850b,7c254084b6a044da4658071a864e9dabbfdd16dc..ccd44b0c77a0708a584525a0d075bd5d53553922
@@@ -727,7 -727,7 +727,7 @@@ static const struct file_operations fb_
   */
  static struct fb_info *file_fb_info(struct file *file)
  {
-       struct inode *inode = file->f_path.dentry->d_inode;
+       struct inode *inode = file_inode(file);
        int fbidx = iminor(inode);
        struct fb_info *info = registered_fb[fbidx];
  
@@@ -1645,11 -1645,6 +1645,11 @@@ static int do_register_framebuffer(stru
        if (!fb_info->modelist.prev || !fb_info->modelist.next)
                INIT_LIST_HEAD(&fb_info->modelist);
  
 +      if (fb_info->skip_vt_switch)
 +              pm_vt_switch_required(fb_info->dev, false);
 +      else
 +              pm_vt_switch_required(fb_info->dev, true);
 +
        fb_var_to_videomode(&mode, &fb_info->var);
        fb_add_videomode(&mode, &fb_info->modelist);
        registered_fb[i] = fb_info;
@@@ -1684,8 -1679,6 +1684,8 @@@ static int do_unregister_framebuffer(st
        if (ret)
                return -EINVAL;
  
 +      pm_vt_switch_unregister(fb_info->dev);
 +
        unlink_framebuffer(fb_info);
        if (fb_info->pixmap.addr &&
            (fb_info->pixmap.flags & FB_PIXMAP_DEFAULT))
diff --combined include/linux/pm.h
index e5da2f353e8fcd21c88e04c4ee1a664557ab7813,e5d7230332a4e4d9e369a0971aec86d7fdf36035..a224c7f5c377e796969a6d96b684d96b7779c9b5
  /*
   * Callbacks for platform drivers to implement.
   */
- extern void (*pm_idle)(void);
  extern void (*pm_power_off)(void);
  extern void (*pm_power_off_prepare)(void);
  
 +struct device; /* we have a circular dep with device.h */
 +#ifdef CONFIG_VT_CONSOLE_SLEEP
 +extern void pm_vt_switch_required(struct device *dev, bool required);
 +extern void pm_vt_switch_unregister(struct device *dev);
 +#else
 +static inline void pm_vt_switch_required(struct device *dev, bool required)
 +{
 +}
 +static inline void pm_vt_switch_unregister(struct device *dev)
 +{
 +}
 +#endif /* CONFIG_VT_CONSOLE_SLEEP */
 +
  /*
   * Device power management
   */
@@@ -551,6 -537,7 +550,7 @@@ struct dev_pm_info 
        unsigned int            irq_safe:1;
        unsigned int            use_autosuspend:1;
        unsigned int            timer_autosuspends:1;
+       unsigned int            memalloc_noio:1;
        enum rpm_request        request;
        enum rpm_status         runtime_status;
        int                     runtime_error;