Merge drm-upstream/drm-next into drm-intel-next-queued
authorJani Nikula <jani.nikula@intel.com>
Thu, 28 Sep 2017 12:56:49 +0000 (15:56 +0300)
committerJani Nikula <jani.nikula@intel.com>
Thu, 28 Sep 2017 12:56:49 +0000 (15:56 +0300)
Need MST sideband message transaction to power up/down nodes.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
1  2 
drivers/gpu/drm/i915/gvt/cmd_parser.c
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_userptr.c
drivers/gpu/drm/i915/i915_gpu_error.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/selftests/i915_random.c
drivers/media/v4l2-core/videobuf2-dma-contig.c

index 23a9bbbb65650749f949cbde224769f35a73fc67,21c36e256884fb8414352d5ffdd1f3baaa6606a3..2c0ccbb817dcff539b0523e0c25df9daaa870884
@@@ -1576,11 -1576,11 +1576,11 @@@ static int batch_buffer_needs_scan(stru
        return 1;
  }
  
 -static uint32_t find_bb_size(struct parser_exec_state *s)
 +static int find_bb_size(struct parser_exec_state *s)
  {
        unsigned long gma = 0;
        struct cmd_info *info;
 -      uint32_t bb_size = 0;
 +      int bb_size = 0;
        uint32_t cmd_len = 0;
        bool met_bb_end = false;
        struct intel_vgpu *vgpu = s->vgpu;
@@@ -1637,8 -1637,6 +1637,8 @@@ static int perform_bb_shadow(struct par
  
        /* get the size of the batch buffer */
        bb_size = find_bb_size(s);
 +      if (bb_size < 0)
 +              return -EINVAL;
  
        /* allocate shadow batch buffer */
        entry_obj = kmalloc(sizeof(*entry_obj), GFP_KERNEL);
@@@ -2605,8 -2603,7 +2605,8 @@@ static int shadow_workload_ring_buffer(
  {
        struct intel_vgpu *vgpu = workload->vgpu;
        unsigned long gma_head, gma_tail, gma_top, guest_rb_size;
 -      u32 *cs;
 +      void *shadow_ring_buffer_va;
 +      int ring_id = workload->ring_id;
        int ret;
  
        guest_rb_size = _RING_CTL_BUF_SIZE(workload->rb_ctl);
        gma_tail = workload->rb_start + workload->rb_tail;
        gma_top = workload->rb_start + guest_rb_size;
  
 -      /* allocate shadow ring buffer */
 -      cs = intel_ring_begin(workload->req, workload->rb_len / sizeof(u32));
 -      if (IS_ERR(cs))
 -              return PTR_ERR(cs);
 +      if (workload->rb_len > vgpu->reserve_ring_buffer_size[ring_id]) {
 +              void *va = vgpu->reserve_ring_buffer_va[ring_id];
 +              /* realloc the new ring buffer if needed */
 +              vgpu->reserve_ring_buffer_va[ring_id] =
 +                      krealloc(va, workload->rb_len, GFP_KERNEL);
 +              if (!vgpu->reserve_ring_buffer_va[ring_id]) {
 +                      gvt_vgpu_err("fail to alloc reserve ring buffer\n");
 +                      return -ENOMEM;
 +              }
 +              vgpu->reserve_ring_buffer_size[ring_id] = workload->rb_len;
 +      }
 +
 +      shadow_ring_buffer_va = vgpu->reserve_ring_buffer_va[ring_id];
  
        /* get shadow ring buffer va */
 -      workload->shadow_ring_buffer_va = cs;
 +      workload->shadow_ring_buffer_va = shadow_ring_buffer_va;
  
        /* head > tail --> copy head <-> top */
        if (gma_head > gma_tail) {
                ret = copy_gma_to_hva(vgpu, vgpu->gtt.ggtt_mm,
 -                                    gma_head, gma_top, cs);
 +                                    gma_head, gma_top, shadow_ring_buffer_va);
                if (ret < 0) {
                        gvt_vgpu_err("fail to copy guest ring buffer\n");
                        return ret;
                }
 -              cs += ret / sizeof(u32);
 +              shadow_ring_buffer_va += ret;
                gma_head = workload->rb_start;
        }
  
        /* copy head or start <-> tail */
 -      ret = copy_gma_to_hva(vgpu, vgpu->gtt.ggtt_mm, gma_head, gma_tail, cs);
 +      ret = copy_gma_to_hva(vgpu, vgpu->gtt.ggtt_mm, gma_head, gma_tail,
 +                              shadow_ring_buffer_va);
        if (ret < 0) {
                gvt_vgpu_err("fail to copy guest ring buffer\n");
                return ret;
        }
 -      cs += ret / sizeof(u32);
 -      intel_ring_advance(workload->req, cs);
        return 0;
  }
  
@@@ -2725,7 -2714,7 +2725,7 @@@ static int shadow_indirect_ctx(struct i
  unmap_src:
        i915_gem_object_unpin_map(obj);
  put_obj:
-       i915_gem_object_put(wa_ctx->indirect_ctx.obj);
+       i915_gem_object_put(obj);
        return ret;
  }
  
index 86c799ac4b8533eb9afc669c7f5feec060940d40,e4d4b6b41e26157e3f7c86a22bd906445be2e717..b4a6ac60e7c611faa93a25baaba9767bcf23e9e4
@@@ -28,6 -28,7 +28,7 @@@
  
  #include <linux/debugfs.h>
  #include <linux/sort.h>
+ #include <linux/sched/mm.h>
  #include "intel_drv.h"
  
  static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
@@@ -66,7 -67,7 +67,7 @@@ static int i915_capabilities(struct seq
  #undef PRINT_FLAG
  
        kernel_param_lock(THIS_MODULE);
 -#define PRINT_PARAM(T, x) seq_print_param(m, #x, #T, &i915.x);
 +#define PRINT_PARAM(T, x, ...) seq_print_param(m, #x, #T, &i915_modparams.x);
        I915_PARAMS_FOR_EACH(PRINT_PARAM);
  #undef PRINT_PARAM
        kernel_param_unlock(THIS_MODULE);
@@@ -1266,7 -1267,7 +1267,7 @@@ static int i915_hangcheck_info(struct s
        if (waitqueue_active(&dev_priv->gpu_error.reset_queue))
                seq_puts(m, "struct_mutex blocked for reset\n");
  
 -      if (!i915.enable_hangcheck) {
 +      if (!i915_modparams.enable_hangcheck) {
                seq_puts(m, "Hangcheck disabled\n");
                return 0;
        }
@@@ -1421,9 -1422,6 +1422,9 @@@ static int i915_forcewake_domains(struc
        struct intel_uncore_forcewake_domain *fw_domain;
        unsigned int tmp;
  
 +      seq_printf(m, "user.bypass_count = %u\n",
 +                 i915->uncore.user_forcewake.count);
 +
        for_each_fw_domain(fw_domain, i915, tmp)
                seq_printf(m, "%s.wake_count = %u\n",
                           intel_uncore_forcewake_domain_to_str(fw_domain->id),
@@@ -1701,7 -1699,7 +1702,7 @@@ static int i915_ips_status(struct seq_f
        intel_runtime_pm_get(dev_priv);
  
        seq_printf(m, "Enabled by kernel parameter: %s\n",
 -                 yesno(i915.enable_ips));
 +                 yesno(i915_modparams.enable_ips));
  
        if (INTEL_GEN(dev_priv) >= 8) {
                seq_puts(m, "Currently: unknown\n");
@@@ -2016,7 -2014,7 +2017,7 @@@ static int i915_dump_lrc(struct seq_fil
        enum intel_engine_id id;
        int ret;
  
 -      if (!i915.enable_execlists) {
 +      if (!i915_modparams.enable_execlists) {
                seq_printf(m, "Logical Ring Contexts are disabled\n");
                return 0;
        }
@@@ -2445,8 -2443,12 +2446,8 @@@ static void i915_guc_client_info(struc
  
        seq_printf(m, "\tPriority %d, GuC stage index: %u, PD offset 0x%x\n",
                client->priority, client->stage_id, client->proc_desc_offset);
 -      seq_printf(m, "\tDoorbell id %d, offset: 0x%lx, cookie 0x%x\n",
 -              client->doorbell_id, client->doorbell_offset, client->doorbell_cookie);
 -      seq_printf(m, "\tWQ size %d, offset: 0x%x, tail %d\n",
 -              client->wq_size, client->wq_offset, client->wq_tail);
 -
 -      seq_printf(m, "\tWork queue full: %u\n", client->no_wq_space);
 +      seq_printf(m, "\tDoorbell id %d, offset: 0x%lx\n",
 +              client->doorbell_id, client->doorbell_offset);
  
        for_each_engine(engine, dev_priv, id) {
                u64 submissions = client->submissions[id];
@@@ -2592,7 -2594,7 +2593,7 @@@ static int i915_guc_log_control_get(voi
        if (!dev_priv->guc.log.vma)
                return -EINVAL;
  
 -      *val = i915.guc_log_level;
 +      *val = i915_modparams.guc_log_level;
  
        return 0;
  }
@@@ -3310,9 -3312,7 +3311,9 @@@ static int i915_engine_info(struct seq_
                seq_printf(m, "\tBBADDR: 0x%08x_%08x\n",
                           upper_32_bits(addr), lower_32_bits(addr));
  
 -              if (i915.enable_execlists) {
 +              if (i915_modparams.enable_execlists) {
 +                      const u32 *hws = &engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX];
 +                      struct intel_engine_execlists * const execlists = &engine->execlists;
                        u32 ptr, read, write;
                        unsigned int idx;
  
                        ptr = I915_READ(RING_CONTEXT_STATUS_PTR(engine));
                        read = GEN8_CSB_READ_PTR(ptr);
                        write = GEN8_CSB_WRITE_PTR(ptr);
 -                      seq_printf(m, "\tExeclist CSB read %d, write %d, interrupt posted? %s\n",
 -                                 read, write,
 +                      seq_printf(m, "\tExeclist CSB read %d [%d cached], write %d [%d from hws], interrupt posted? %s\n",
 +                                 read, execlists->csb_head,
 +                                 write,
 +                                 intel_read_status_page(engine, intel_hws_csb_write_index(engine->i915)),
                                   yesno(test_bit(ENGINE_IRQ_EXECLIST,
                                                  &engine->irq_posted)));
                        if (read >= GEN8_CSB_ENTRIES)
                                write += GEN8_CSB_ENTRIES;
                        while (read < write) {
                                idx = ++read % GEN8_CSB_ENTRIES;
 -                              seq_printf(m, "\tExeclist CSB[%d]: 0x%08x, context: %d\n",
 +                              seq_printf(m, "\tExeclist CSB[%d]: 0x%08x [0x%08x in hwsp], context: %d [%d in hwsp]\n",
                                           idx,
                                           I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, idx)),
 -                                         I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, idx)));
 +                                         hws[idx * 2],
 +                                         I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, idx)),
 +                                         hws[idx * 2 + 1]);
                        }
  
                        rcu_read_lock();
 -                      for (idx = 0; idx < ARRAY_SIZE(engine->execlist_port); idx++) {
 +                      for (idx = 0; idx < execlists_num_ports(execlists); idx++) {
                                unsigned int count;
  
 -                              rq = port_unpack(&engine->execlist_port[idx],
 -                                               &count);
 +                              rq = port_unpack(&execlists->port[idx], &count);
                                if (rq) {
                                        seq_printf(m, "\t\tELSP[%d] count=%d, ",
                                                   idx, count);
                        rcu_read_unlock();
  
                        spin_lock_irq(&engine->timeline->lock);
 -                      for (rb = engine->execlist_first; rb; rb = rb_next(rb)){
 +                      for (rb = execlists->first; rb; rb = rb_next(rb)) {
                                struct i915_priolist *p =
                                        rb_entry(rb, typeof(*p), node);
  
@@@ -3406,7 -3403,7 +3407,7 @@@ static int i915_semaphore_status(struc
        enum intel_engine_id id;
        int j, ret;
  
 -      if (!i915.semaphores) {
 +      if (!i915_modparams.semaphores) {
                seq_puts(m, "Semaphores are disabled\n");
                return 0;
        }
@@@ -3526,57 -3523,6 +3527,57 @@@ static int i915_wa_registers(struct seq
        return 0;
  }
  
 +static int i915_ipc_status_show(struct seq_file *m, void *data)
 +{
 +      struct drm_i915_private *dev_priv = m->private;
 +
 +      seq_printf(m, "Isochronous Priority Control: %s\n",
 +                      yesno(dev_priv->ipc_enabled));
 +      return 0;
 +}
 +
 +static int i915_ipc_status_open(struct inode *inode, struct file *file)
 +{
 +      struct drm_i915_private *dev_priv = inode->i_private;
 +
 +      if (!HAS_IPC(dev_priv))
 +              return -ENODEV;
 +
 +      return single_open(file, i915_ipc_status_show, dev_priv);
 +}
 +
 +static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf,
 +                                   size_t len, loff_t *offp)
 +{
 +      struct seq_file *m = file->private_data;
 +      struct drm_i915_private *dev_priv = m->private;
 +      int ret;
 +      bool enable;
 +
 +      ret = kstrtobool_from_user(ubuf, len, &enable);
 +      if (ret < 0)
 +              return ret;
 +
 +      intel_runtime_pm_get(dev_priv);
 +      if (!dev_priv->ipc_enabled && enable)
 +              DRM_INFO("Enabling IPC: WM will be proper only after next commit\n");
 +      dev_priv->wm.distrust_bios_wm = true;
 +      dev_priv->ipc_enabled = enable;
 +      intel_enable_ipc(dev_priv);
 +      intel_runtime_pm_put(dev_priv);
 +
 +      return len;
 +}
 +
 +static const struct file_operations i915_ipc_status_fops = {
 +      .owner = THIS_MODULE,
 +      .open = i915_ipc_status_open,
 +      .read = seq_read,
 +      .llseek = seq_lseek,
 +      .release = single_release,
 +      .write = i915_ipc_status_write
 +};
 +
  static int i915_ddb_info(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@@ -4360,16 -4306,16 +4361,16 @@@ i915_drop_caches_set(void *data, u64 va
                mutex_unlock(&dev->struct_mutex);
        }
  
-       lockdep_set_current_reclaim_state(GFP_KERNEL);
+       fs_reclaim_acquire(GFP_KERNEL);
        if (val & DROP_BOUND)
-               i915_gem_shrink(dev_priv, LONG_MAX, I915_SHRINK_BOUND);
+               i915_gem_shrink(dev_priv, LONG_MAX, NULL, I915_SHRINK_BOUND);
  
        if (val & DROP_UNBOUND)
-               i915_gem_shrink(dev_priv, LONG_MAX, I915_SHRINK_UNBOUND);
+               i915_gem_shrink(dev_priv, LONG_MAX, NULL, I915_SHRINK_UNBOUND);
  
        if (val & DROP_SHRINK_ALL)
                i915_gem_shrink_all(dev_priv);
-       lockdep_clear_current_reclaim_state();
+       fs_reclaim_release(GFP_KERNEL);
  
        if (val & DROP_FREED) {
                synchronize_rcu();
@@@ -4728,26 -4674,26 +4729,26 @@@ static int i915_sseu_status(struct seq_
  
  static int i915_forcewake_open(struct inode *inode, struct file *file)
  {
 -      struct drm_i915_private *dev_priv = inode->i_private;
 +      struct drm_i915_private *i915 = inode->i_private;
  
 -      if (INTEL_GEN(dev_priv) < 6)
 +      if (INTEL_GEN(i915) < 6)
                return 0;
  
 -      intel_runtime_pm_get(dev_priv);
 -      intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
 +      intel_runtime_pm_get(i915);
 +      intel_uncore_forcewake_user_get(i915);
  
        return 0;
  }
  
  static int i915_forcewake_release(struct inode *inode, struct file *file)
  {
 -      struct drm_i915_private *dev_priv = inode->i_private;
 +      struct drm_i915_private *i915 = inode->i_private;
  
 -      if (INTEL_GEN(dev_priv) < 6)
 +      if (INTEL_GEN(i915) < 6)
                return 0;
  
 -      intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 -      intel_runtime_pm_put(dev_priv);
 +      intel_uncore_forcewake_user_put(i915);
 +      intel_runtime_pm_put(i915);
  
        return 0;
  }
@@@ -4913,8 -4859,7 +4914,8 @@@ static const struct i915_debugfs_files 
        {"i915_dp_test_type", &i915_displayport_test_type_fops},
        {"i915_dp_test_active", &i915_displayport_test_active_fops},
        {"i915_guc_log_control", &i915_guc_log_control_fops},
 -      {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops}
 +      {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops},
 +      {"i915_ipc_status", &i915_ipc_status_fops}
  };
  
  int i915_debugfs_register(struct drm_i915_private *dev_priv)
index 59fd4bceec7bfbb15d321db6f8abb48267f4ba42,b1fa81348ee915b89bb3ab63145aca496966234e..8e4280838f1416673f65735a5b1ad0fd8ad2543b
@@@ -93,7 -93,7 +93,7 @@@
  #define I915_STATE_WARN(condition, format...) ({                      \
        int __ret_warn_on = !!(condition);                              \
        if (unlikely(__ret_warn_on))                                    \
 -              if (!WARN(i915.verbose_state_checks, format))           \
 +              if (!WARN(i915_modparams.verbose_state_checks, format)) \
                        DRM_ERROR(format);                              \
        unlikely(__ret_warn_on);                                        \
  })
@@@ -126,7 -126,7 +126,7 @@@ static inline uint_fixed_16_16_t u32_to
  {
        uint_fixed_16_16_t fp;
  
 -      WARN_ON(val >> 16);
 +      WARN_ON(val > U16_MAX);
  
        fp.val = val << 16;
        return fp;
@@@ -163,8 -163,8 +163,8 @@@ static inline uint_fixed_16_16_t max_fi
  static inline uint_fixed_16_16_t clamp_u64_to_fixed16(uint64_t val)
  {
        uint_fixed_16_16_t fp;
 -      WARN_ON(val >> 32);
 -      fp.val = clamp_t(uint32_t, val, 0, ~0);
 +      WARN_ON(val > U32_MAX);
 +      fp.val = (uint32_t) val;
        return fp;
  }
  
@@@ -181,8 -181,8 +181,8 @@@ static inline uint32_t mul_round_up_u32
  
        intermediate_val = (uint64_t) val * mul.val;
        intermediate_val = DIV_ROUND_UP_ULL(intermediate_val, 1 << 16);
 -      WARN_ON(intermediate_val >> 32);
 -      return clamp_t(uint32_t, intermediate_val, 0, ~0);
 +      WARN_ON(intermediate_val > U32_MAX);
 +      return (uint32_t) intermediate_val;
  }
  
  static inline uint_fixed_16_16_t mul_fixed16(uint_fixed_16_16_t val,
@@@ -211,8 -211,8 +211,8 @@@ static inline uint32_t div_round_up_u32
  
        interm_val = (uint64_t)val << 16;
        interm_val = DIV_ROUND_UP_ULL(interm_val, d.val);
 -      WARN_ON(interm_val >> 32);
 -      return clamp_t(uint32_t, interm_val, 0, ~0);
 +      WARN_ON(interm_val > U32_MAX);
 +      return (uint32_t) interm_val;
  }
  
  static inline uint_fixed_16_16_t mul_u32_fixed16(uint32_t val,
@@@ -725,8 -725,7 +725,7 @@@ struct drm_i915_display_funcs 
                            struct drm_atomic_state *old_state);
        void (*crtc_disable)(struct intel_crtc_state *old_crtc_state,
                             struct drm_atomic_state *old_state);
-       void (*update_crtcs)(struct drm_atomic_state *state,
-                            unsigned int *crtc_vblank_mask);
+       void (*update_crtcs)(struct drm_atomic_state *state);
        void (*audio_codec_enable)(struct drm_connector *connector,
                                   struct intel_encoder *encoder,
                                   const struct drm_display_mode *adjusted_mode);
@@@ -777,6 -776,7 +776,6 @@@ struct intel_csr 
        func(has_fpga_dbg); \
        func(has_full_ppgtt); \
        func(has_full_48bit_ppgtt); \
 -      func(has_gmbus_irq); \
        func(has_gmch_display); \
        func(has_guc); \
        func(has_guc_ct); \
        func(cursor_needs_physical); \
        func(hws_needs_physical); \
        func(overlay_needs_physical); \
 -      func(supports_tv);
 +      func(supports_tv); \
 +      func(has_ipc);
  
  struct sseu_dev_info {
        u8 slice_mask;
@@@ -852,28 -851,21 +851,28 @@@ enum intel_platform 
  };
  
  struct intel_device_info {
 -      u32 display_mmio_offset;
        u16 device_id;
 -      u8 num_pipes;
 -      u8 num_sprites[I915_MAX_PIPES];
 -      u8 num_scalers[I915_MAX_PIPES];
 -      u8 gen;
        u16 gen_mask;
 -      enum intel_platform platform;
 +
 +      u8 gen;
        u8 gt; /* GT number, 0 if undefined */
 -      u8 ring_mask; /* Rings supported by the HW */
        u8 num_rings;
 +      u8 ring_mask; /* Rings supported by the HW */
 +
 +      enum intel_platform platform;
 +      u32 platform_mask;
 +
 +      u32 display_mmio_offset;
 +
 +      u8 num_pipes;
 +      u8 num_sprites[I915_MAX_PIPES];
 +      u8 num_scalers[I915_MAX_PIPES];
 +
  #define DEFINE_FLAG(name) u8 name:1
        DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
  #undef DEFINE_FLAG
        u16 ddb_size; /* in blocks */
 +
        /* Register offsets for the various display pipes and transcoders */
        int pipe_offsets[I915_MAX_TRANSCODERS];
        int trans_offsets[I915_MAX_TRANSCODERS];
@@@ -1008,8 -1000,7 +1007,8 @@@ struct i915_gpu_state 
                        u32 seqno;
                        u32 head;
                        u32 tail;
 -              } *requests, execlist[2];
 +              } *requests, execlist[EXECLIST_MAX_PORTS];
 +              unsigned int num_ports;
  
                struct drm_i915_error_waiter {
                        char comm[TASK_COMM_LEN];
@@@ -1187,14 -1178,6 +1186,14 @@@ struct i915_psr 
        bool y_cord_support;
        bool colorimetry_support;
        bool alpm;
 +
 +      void (*enable_source)(struct intel_dp *,
 +                            const struct intel_crtc_state *);
 +      void (*disable_source)(struct intel_dp *,
 +                             const struct intel_crtc_state *);
 +      void (*enable_sink)(struct intel_dp *);
 +      void (*activate)(struct intel_dp *);
 +      void (*setup_vsc)(struct intel_dp *, const struct intel_crtc_state *);
  };
  
  enum intel_pch {
@@@ -1853,20 -1836,6 +1852,20 @@@ struct skl_wm_level 
        uint8_t plane_res_l;
  };
  
 +/* Stores plane specific WM parameters */
 +struct skl_wm_params {
 +      bool x_tiled, y_tiled;
 +      bool rc_surface;
 +      uint32_t width;
 +      uint8_t cpp;
 +      uint32_t plane_pixel_rate;
 +      uint32_t y_min_scanlines;
 +      uint32_t plane_bytes_per_line;
 +      uint_fixed_16_16_t plane_blocks_per_line;
 +      uint_fixed_16_16_t y_tile_minimum;
 +      uint32_t linetime_us;
 +};
 +
  /*
   * This struct helps tracking the state needed for runtime PM, which puts the
   * device in PCI D3 state. Notice that when this happens, nothing on the
@@@ -2362,8 -2331,6 +2361,8 @@@ struct drm_i915_private 
        DECLARE_HASHTABLE(mm_structs, 7);
        struct mutex mm_lock;
  
 +      struct intel_ppat ppat;
 +
        /* Kernel Modesetting */
  
        struct intel_crtc *plane_to_crtc_mapping[I915_MAX_PIPES];
@@@ -2844,8 -2811,8 +2843,8 @@@ static inline struct scatterlist *__sg_
  #define for_each_sgt_dma(__dmap, __iter, __sgt)                               \
        for ((__iter) = __sgt_iter((__sgt)->sgl, true);                 \
             ((__dmap) = (__iter).dma + (__iter).curr);                 \
 -           (((__iter).curr += PAGE_SIZE) < (__iter).max) ||           \
 -           ((__iter) = __sgt_iter(__sg_next((__iter).sgp), true), 0))
 +           (((__iter).curr += PAGE_SIZE) >= (__iter).max) ?           \
 +           (__iter) = __sgt_iter(__sg_next((__iter).sgp), true), 0 : 0)
  
  /**
   * for_each_sgt_page - iterate over the pages of the given sg_table
        for ((__iter) = __sgt_iter((__sgt)->sgl, false);                \
             ((__pp) = (__iter).pfn == 0 ? NULL :                       \
              pfn_to_page((__iter).pfn + ((__iter).curr >> PAGE_SHIFT))); \
 -           (((__iter).curr += PAGE_SIZE) < (__iter).max) ||           \
 -           ((__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0))
 +           (((__iter).curr += PAGE_SIZE) >= (__iter).max) ?           \
 +           (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0)
 +
 +static inline unsigned int i915_sg_segment_size(void)
 +{
 +      unsigned int size = swiotlb_max_segment();
 +
 +      if (size == 0)
 +              return SCATTERLIST_MAX_SEGMENT;
 +
 +      size = rounddown(size, PAGE_SIZE);
 +      /* swiotlb_max_segment_size can return 1 byte when it means one page. */
 +      if (size < PAGE_SIZE)
 +              size = PAGE_SIZE;
 +
 +      return size;
 +}
  
  static inline const struct intel_device_info *
  intel_info(const struct drm_i915_private *dev_priv)
  #define INTEL_REVID(dev_priv) ((dev_priv)->drm.pdev->revision)
  
  #define GEN_FOREVER (0)
 +
 +#define INTEL_GEN_MASK(s, e) ( \
 +      BUILD_BUG_ON_ZERO(!__builtin_constant_p(s)) + \
 +      BUILD_BUG_ON_ZERO(!__builtin_constant_p(e)) + \
 +      GENMASK((e) != GEN_FOREVER ? (e) - 1 : BITS_PER_LONG - 1, \
 +              (s) != GEN_FOREVER ? (s) - 1 : 0) \
 +)
 +
  /*
   * Returns true if Gen is in inclusive range [Start, End].
   *
   * Use GEN_FOREVER for unbound start and or end.
   */
 -#define IS_GEN(dev_priv, s, e) ({ \
 -      unsigned int __s = (s), __e = (e); \
 -      BUILD_BUG_ON(!__builtin_constant_p(s)); \
 -      BUILD_BUG_ON(!__builtin_constant_p(e)); \
 -      if ((__s) != GEN_FOREVER) \
 -              __s = (s) - 1; \
 -      if ((__e) == GEN_FOREVER) \
 -              __e = BITS_PER_LONG - 1; \
 -      else \
 -              __e = (e) - 1; \
 -      !!((dev_priv)->info.gen_mask & GENMASK((__e), (__s))); \
 -})
 +#define IS_GEN(dev_priv, s, e) \
 +      (!!((dev_priv)->info.gen_mask & INTEL_GEN_MASK((s), (e))))
  
  /*
   * Return true if revision is in range [since,until] inclusive.
  #define IS_REVID(p, since, until) \
        (INTEL_REVID(p) >= (since) && INTEL_REVID(p) <= (until))
  
 -#define IS_I830(dev_priv)     ((dev_priv)->info.platform == INTEL_I830)
 -#define IS_I845G(dev_priv)    ((dev_priv)->info.platform == INTEL_I845G)
 -#define IS_I85X(dev_priv)     ((dev_priv)->info.platform == INTEL_I85X)
 -#define IS_I865G(dev_priv)    ((dev_priv)->info.platform == INTEL_I865G)
 -#define IS_I915G(dev_priv)    ((dev_priv)->info.platform == INTEL_I915G)
 -#define IS_I915GM(dev_priv)   ((dev_priv)->info.platform == INTEL_I915GM)
 -#define IS_I945G(dev_priv)    ((dev_priv)->info.platform == INTEL_I945G)
 -#define IS_I945GM(dev_priv)   ((dev_priv)->info.platform == INTEL_I945GM)
 -#define IS_I965G(dev_priv)    ((dev_priv)->info.platform == INTEL_I965G)
 -#define IS_I965GM(dev_priv)   ((dev_priv)->info.platform == INTEL_I965GM)
 -#define IS_G45(dev_priv)      ((dev_priv)->info.platform == INTEL_G45)
 -#define IS_GM45(dev_priv)     ((dev_priv)->info.platform == INTEL_GM45)
 +#define IS_PLATFORM(dev_priv, p) ((dev_priv)->info.platform_mask & BIT(p))
 +
 +#define IS_I830(dev_priv)     IS_PLATFORM(dev_priv, INTEL_I830)
 +#define IS_I845G(dev_priv)    IS_PLATFORM(dev_priv, INTEL_I845G)
 +#define IS_I85X(dev_priv)     IS_PLATFORM(dev_priv, INTEL_I85X)
 +#define IS_I865G(dev_priv)    IS_PLATFORM(dev_priv, INTEL_I865G)
 +#define IS_I915G(dev_priv)    IS_PLATFORM(dev_priv, INTEL_I915G)
 +#define IS_I915GM(dev_priv)   IS_PLATFORM(dev_priv, INTEL_I915GM)
 +#define IS_I945G(dev_priv)    IS_PLATFORM(dev_priv, INTEL_I945G)
 +#define IS_I945GM(dev_priv)   IS_PLATFORM(dev_priv, INTEL_I945GM)
 +#define IS_I965G(dev_priv)    IS_PLATFORM(dev_priv, INTEL_I965G)
 +#define IS_I965GM(dev_priv)   IS_PLATFORM(dev_priv, INTEL_I965GM)
 +#define IS_G45(dev_priv)      IS_PLATFORM(dev_priv, INTEL_G45)
 +#define IS_GM45(dev_priv)     IS_PLATFORM(dev_priv, INTEL_GM45)
  #define IS_G4X(dev_priv)      (IS_G45(dev_priv) || IS_GM45(dev_priv))
  #define IS_PINEVIEW_G(dev_priv)       (INTEL_DEVID(dev_priv) == 0xa001)
  #define IS_PINEVIEW_M(dev_priv)       (INTEL_DEVID(dev_priv) == 0xa011)
 -#define IS_PINEVIEW(dev_priv) ((dev_priv)->info.platform == INTEL_PINEVIEW)
 -#define IS_G33(dev_priv)      ((dev_priv)->info.platform == INTEL_G33)
 +#define IS_PINEVIEW(dev_priv) IS_PLATFORM(dev_priv, INTEL_PINEVIEW)
 +#define IS_G33(dev_priv)      IS_PLATFORM(dev_priv, INTEL_G33)
  #define IS_IRONLAKE_M(dev_priv)       (INTEL_DEVID(dev_priv) == 0x0046)
 -#define IS_IVYBRIDGE(dev_priv)        ((dev_priv)->info.platform == INTEL_IVYBRIDGE)
 +#define IS_IVYBRIDGE(dev_priv)        IS_PLATFORM(dev_priv, INTEL_IVYBRIDGE)
  #define IS_IVB_GT1(dev_priv)  (IS_IVYBRIDGE(dev_priv) && \
                                 (dev_priv)->info.gt == 1)
 -#define IS_VALLEYVIEW(dev_priv)       ((dev_priv)->info.platform == INTEL_VALLEYVIEW)
 -#define IS_CHERRYVIEW(dev_priv)       ((dev_priv)->info.platform == INTEL_CHERRYVIEW)
 -#define IS_HASWELL(dev_priv)  ((dev_priv)->info.platform == INTEL_HASWELL)
 -#define IS_BROADWELL(dev_priv)        ((dev_priv)->info.platform == INTEL_BROADWELL)
 -#define IS_SKYLAKE(dev_priv)  ((dev_priv)->info.platform == INTEL_SKYLAKE)
 -#define IS_BROXTON(dev_priv)  ((dev_priv)->info.platform == INTEL_BROXTON)
 -#define IS_KABYLAKE(dev_priv) ((dev_priv)->info.platform == INTEL_KABYLAKE)
 -#define IS_GEMINILAKE(dev_priv)       ((dev_priv)->info.platform == INTEL_GEMINILAKE)
 -#define IS_COFFEELAKE(dev_priv)       ((dev_priv)->info.platform == INTEL_COFFEELAKE)
 -#define IS_CANNONLAKE(dev_priv)       ((dev_priv)->info.platform == INTEL_CANNONLAKE)
 +#define IS_VALLEYVIEW(dev_priv)       IS_PLATFORM(dev_priv, INTEL_VALLEYVIEW)
 +#define IS_CHERRYVIEW(dev_priv)       IS_PLATFORM(dev_priv, INTEL_CHERRYVIEW)
 +#define IS_HASWELL(dev_priv)  IS_PLATFORM(dev_priv, INTEL_HASWELL)
 +#define IS_BROADWELL(dev_priv)        IS_PLATFORM(dev_priv, INTEL_BROADWELL)
 +#define IS_SKYLAKE(dev_priv)  IS_PLATFORM(dev_priv, INTEL_SKYLAKE)
 +#define IS_BROXTON(dev_priv)  IS_PLATFORM(dev_priv, INTEL_BROXTON)
 +#define IS_KABYLAKE(dev_priv) IS_PLATFORM(dev_priv, INTEL_KABYLAKE)
 +#define IS_GEMINILAKE(dev_priv)       IS_PLATFORM(dev_priv, INTEL_GEMINILAKE)
 +#define IS_COFFEELAKE(dev_priv)       IS_PLATFORM(dev_priv, INTEL_COFFEELAKE)
 +#define IS_CANNONLAKE(dev_priv)       IS_PLATFORM(dev_priv, INTEL_CANNONLAKE)
  #define IS_MOBILE(dev_priv)   ((dev_priv)->info.is_mobile)
  #define IS_HSW_EARLY_SDV(dev_priv) (IS_HASWELL(dev_priv) && \
                                    (INTEL_DEVID(dev_priv) & 0xFF00) == 0x0C00)
                                 (dev_priv)->info.gt == 3)
  #define IS_CFL_ULT(dev_priv)  (IS_COFFEELAKE(dev_priv) && \
                                 (INTEL_DEVID(dev_priv) & 0x00F0) == 0x00A0)
 +#define IS_CFL_GT2(dev_priv)  (IS_COFFEELAKE(dev_priv) && \
 +                               (dev_priv)->info.gt == 2)
  
  #define IS_ALPHA_SUPPORT(intel_info) ((intel_info)->is_alpha_support)
  
  
  #define HAS_LOGICAL_RING_CONTEXTS(dev_priv) \
                ((dev_priv)->info.has_logical_ring_contexts)
 -#define USES_PPGTT(dev_priv)          (i915.enable_ppgtt)
 -#define USES_FULL_PPGTT(dev_priv)     (i915.enable_ppgtt >= 2)
 -#define USES_FULL_48BIT_PPGTT(dev_priv)       (i915.enable_ppgtt == 3)
 +#define USES_PPGTT(dev_priv)          (i915_modparams.enable_ppgtt)
 +#define USES_FULL_PPGTT(dev_priv)     (i915_modparams.enable_ppgtt >= 2)
 +#define USES_FULL_48BIT_PPGTT(dev_priv)       (i915_modparams.enable_ppgtt == 3)
  
  #define HAS_OVERLAY(dev_priv)          ((dev_priv)->info.has_overlay)
  #define OVERLAY_NEEDS_PHYSICAL(dev_priv) \
   * even when in MSI mode. This results in spurious interrupt warnings if the
   * legacy irq no. is shared with another device. The kernel then disables that
   * interrupt source and so prevents the other device from working properly.
 + *
 + * Since we don't enable MSI anymore on gen4, we can always use GMBUS/AUX
 + * interrupts.
   */
 -#define HAS_AUX_IRQ(dev_priv)   ((dev_priv)->info.gen >= 5)
 -#define HAS_GMBUS_IRQ(dev_priv) ((dev_priv)->info.has_gmbus_irq)
 +#define HAS_AUX_IRQ(dev_priv)   true
 +#define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
  
  /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
   * rows, which changed the alignment requirements and fence programming.
  #define HAS_RUNTIME_PM(dev_priv) ((dev_priv)->info.has_runtime_pm)
  #define HAS_64BIT_RELOC(dev_priv) ((dev_priv)->info.has_64bit_reloc)
  
 +#define HAS_IPC(dev_priv)              ((dev_priv)->info.has_ipc)
 +
  /*
   * For now, anything with a GuC requires uCode loading, and then supports
   * command submission once loaded. But these are logically independent
@@@ -3289,7 -3234,7 +3288,7 @@@ static inline void i915_queue_hangcheck
  {
        unsigned long delay;
  
 -      if (unlikely(!i915.enable_hangcheck))
 +      if (unlikely(!i915_modparams.enable_hangcheck))
                return;
  
        /* Don't continually defer the hangcheck so that it is always run at
@@@ -3322,8 -3267,6 +3321,8 @@@ static inline bool intel_vgpu_active(st
        return dev_priv->vgpu.active;
  }
  
 +u32 i915_pipestat_enable_mask(struct drm_i915_private *dev_priv,
 +                            enum pipe pipe);
  void
  i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
                     u32 status_mask);
@@@ -3829,6 -3772,7 +3828,7 @@@ i915_gem_object_create_internal(struct 
  /* i915_gem_shrinker.c */
  unsigned long i915_gem_shrink(struct drm_i915_private *dev_priv,
                              unsigned long target,
+                             unsigned long *nr_scanned,
                              unsigned flags);
  #define I915_SHRINK_PURGEABLE 0x1
  #define I915_SHRINK_UNBOUND 0x2
@@@ -4416,12 -4360,4 +4416,12 @@@ int remap_io_mapping(struct vm_area_str
                     unsigned long addr, unsigned long pfn, unsigned long size,
                     struct io_mapping *iomap);
  
 +static inline int intel_hws_csb_write_index(struct drm_i915_private *i915)
 +{
 +      if (INTEL_GEN(i915) >= 10)
 +              return CNL_HWS_CSB_WRITE_INDEX;
 +      else
 +              return I915_HWS_CSB_WRITE_INDEX;
 +}
 +
  #endif
index 49bf5ddfa7fd5ceb065c03dbd48eb8e91e57124c,8f074c7f625328dd3a199ba93e7d4b8d096d776e..73eeb6b1f1cd6682bab4e6eea6c5aca44128d259
@@@ -179,7 -179,7 +179,7 @@@ i915_gem_object_get_pages_phys(struct d
         * the alignment of the buddy allocation will naturally match.
         */
        phys = drm_pci_alloc(obj->base.dev,
 -                           obj->base.size,
 +                           roundup_pow_of_two(obj->base.size),
                             roundup_pow_of_two(obj->base.size));
        if (!phys)
                return ERR_PTR(-ENOMEM);
@@@ -694,10 -694,10 +694,10 @@@ flush_write_domain(struct drm_i915_gem_
  
        switch (obj->base.write_domain) {
        case I915_GEM_DOMAIN_GTT:
 -              if (INTEL_GEN(dev_priv) >= 6 && !HAS_LLC(dev_priv)) {
 +              if (!HAS_LLC(dev_priv)) {
                        intel_runtime_pm_get(dev_priv);
                        spin_lock_irq(&dev_priv->uncore.lock);
 -                      POSTING_READ_FW(RING_ACTHD(dev_priv->engine[RCS]->mmio_base));
 +                      POSTING_READ_FW(RING_HEAD(dev_priv->engine[RCS]->mmio_base));
                        spin_unlock_irq(&dev_priv->uncore.lock);
                        intel_runtime_pm_put(dev_priv);
                }
@@@ -2303,7 -2303,7 +2303,7 @@@ i915_gem_object_get_pages_gtt(struct dr
        struct sgt_iter sgt_iter;
        struct page *page;
        unsigned long last_pfn = 0;     /* suppress gcc warning */
 -      unsigned int max_segment;
 +      unsigned int max_segment = i915_sg_segment_size();
        gfp_t noreclaim;
        int ret;
  
        GEM_BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
        GEM_BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
  
 -      max_segment = swiotlb_max_segment();
 -      if (!max_segment)
 -              max_segment = rounddown(UINT_MAX, PAGE_SIZE);
 -
        st = kmalloc(sizeof(*st), GFP_KERNEL);
        if (st == NULL)
                return ERR_PTR(-ENOMEM);
@@@ -2352,7 -2356,7 +2352,7 @@@ rebuild_st
                                goto err_sg;
                        }
  
-                       i915_gem_shrink(dev_priv, 2 * page_count, *s++);
+                       i915_gem_shrink(dev_priv, 2 * page_count, NULL, *s++);
                        cond_resched();
  
                        /* We've tried hard to allocate the memory by reaping
@@@ -2539,7 -2543,7 +2539,7 @@@ static void *i915_gem_object_map(const 
  
        if (n_pages > ARRAY_SIZE(stack_pages)) {
                /* Too big for stack -- allocate temporary array instead */
-               pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_TEMPORARY);
+               pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL);
                if (!pages)
                        return NULL;
        }
@@@ -2815,8 -2819,8 +2815,8 @@@ i915_gem_reset_prepare_engine(struct in
         * Turning off the engine->irq_tasklet until the reset is over
         * prevents the race.
         */
 -      tasklet_kill(&engine->irq_tasklet);
 -      tasklet_disable(&engine->irq_tasklet);
 +      tasklet_kill(&engine->execlists.irq_tasklet);
 +      tasklet_disable(&engine->execlists.irq_tasklet);
  
        if (engine->irq_seqno_barrier)
                engine->irq_seqno_barrier(engine);
@@@ -2995,7 -2999,7 +2995,7 @@@ void i915_gem_reset(struct drm_i915_pri
  
  void i915_gem_reset_finish_engine(struct intel_engine_cs *engine)
  {
 -      tasklet_enable(&engine->irq_tasklet);
 +      tasklet_enable(&engine->execlists.irq_tasklet);
        kthread_unpark(engine->breadcrumbs.signaler);
  }
  
@@@ -3022,6 -3026,9 +3022,6 @@@ static void nop_submit_request(struct d
  
  static void engine_set_wedged(struct intel_engine_cs *engine)
  {
 -      struct drm_i915_gem_request *request;
 -      unsigned long flags;
 -
        /* We need to be sure that no thread is running the old callback as
         * we install the nop handler (otherwise we would submit a request
         * to hardware that will never complete). In order to prevent this
        engine->submit_request = nop_submit_request;
  
        /* Mark all executing requests as skipped */
 -      spin_lock_irqsave(&engine->timeline->lock, flags);
 -      list_for_each_entry(request, &engine->timeline->requests, link)
 -              if (!i915_gem_request_completed(request))
 -                      dma_fence_set_error(&request->fence, -EIO);
 -      spin_unlock_irqrestore(&engine->timeline->lock, flags);
 -
 -      /*
 -       * Clear the execlists queue up before freeing the requests, as those
 -       * are the ones that keep the context and ringbuffer backing objects
 -       * pinned in place.
 -       */
 -
 -      if (i915.enable_execlists) {
 -              struct execlist_port *port = engine->execlist_port;
 -              unsigned long flags;
 -              unsigned int n;
 -
 -              spin_lock_irqsave(&engine->timeline->lock, flags);
 -
 -              for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++)
 -                      i915_gem_request_put(port_request(&port[n]));
 -              memset(engine->execlist_port, 0, sizeof(engine->execlist_port));
 -              engine->execlist_queue = RB_ROOT;
 -              engine->execlist_first = NULL;
 -
 -              spin_unlock_irqrestore(&engine->timeline->lock, flags);
 -
 -              /* The port is checked prior to scheduling a tasklet, but
 -               * just in case we have suspended the tasklet to do the
 -               * wedging make sure that when it wakes, it decides there
 -               * is no work to do by clearing the irq_posted bit.
 -               */
 -              clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
 -      }
 +      engine->cancel_requests(engine);
  
        /* Mark all pending requests as complete so that any concurrent
         * (lockless) lookup doesn't try and wait upon the request as we
@@@ -4738,7 -4778,7 +4738,7 @@@ bool intel_sanitize_semaphores(struct d
                return false;
  
        /* TODO: make semaphores and Execlists play nicely together */
 -      if (i915.enable_execlists)
 +      if (i915_modparams.enable_execlists)
                return false;
  
        if (value >= 0)
@@@ -4759,7 -4799,7 +4759,7 @@@ int i915_gem_init(struct drm_i915_priva
  
        dev_priv->mm.unordered_timeline = dma_fence_context_alloc(1);
  
 -      if (!i915.enable_execlists) {
 +      if (!i915_modparams.enable_execlists) {
                dev_priv->gt.resume = intel_legacy_submission_resume;
                dev_priv->gt.cleanup_engine = intel_engine_cleanup;
        } else {
@@@ -4987,7 -5027,7 +4987,7 @@@ int i915_gem_freeze_late(struct drm_i91
         * the objects as well, see i915_gem_freeze()
         */
  
-       i915_gem_shrink(dev_priv, -1UL, I915_SHRINK_UNBOUND);
+       i915_gem_shrink(dev_priv, -1UL, NULL, I915_SHRINK_UNBOUND);
        i915_gem_drain_freed_objects(dev_priv);
  
        mutex_lock(&dev_priv->drm.struct_mutex);
index fa18677cdb543eba5826459d305dab7042a646ea,ca0eab343644da776dbe5651174fe31823d9dd8e..d733c4d5a5002c047fed386a9531081a80373197
@@@ -58,7 -58,6 +58,7 @@@ enum 
  
  #define __EXEC_HAS_RELOC      BIT(31)
  #define __EXEC_VALIDATED      BIT(30)
 +#define __EXEC_INTERNAL_FLAGS (~0u << 30)
  #define UPDATE                        PIN_OFFSET_FIXED
  
  #define BATCH_OFFSET_BIAS (256*1024)
@@@ -299,7 -298,7 +299,7 @@@ static int eb_create(struct i915_execbu
                         * as possible to perform the allocation and warn
                         * if it fails.
                         */
-                       flags = GFP_TEMPORARY;
+                       flags = GFP_KERNEL;
                        if (size > 1)
                                flags |= __GFP_NORETRY | __GFP_NOWARN;
  
@@@ -680,7 -679,7 +680,7 @@@ static int eb_select_context(struct i91
  static int eb_lookup_vmas(struct i915_execbuffer *eb)
  {
        struct radix_tree_root *handles_vma = &eb->ctx->handles_vma;
 -      struct drm_i915_gem_object *uninitialized_var(obj);
 +      struct drm_i915_gem_object *obj;
        unsigned int i;
        int err;
  
                        goto err_obj;
                }
  
 +              /* transfer ref to ctx */
                vma->open_count++;
                list_add(&lut->obj_link, &obj->lut_list);
                list_add(&lut->ctx_link, &eb->ctx->handles_list);
                lut->ctx = eb->ctx;
                lut->handle = handle;
  
 -              /* transfer ref to ctx */
 -              obj = NULL;
 -
  add_vma:
                err = eb_add_vma(eb, i, vma);
                if (unlikely(err))
 -                      goto err_obj;
 +                      goto err_vma;
  
                GEM_BUG_ON(vma != eb->vma[i]);
                GEM_BUG_ON(vma->exec_flags != &eb->flags[i]);
        return eb_reserve(eb);
  
  err_obj:
 -      if (obj)
 -              i915_gem_object_put(obj);
 +      i915_gem_object_put(obj);
  err_vma:
        eb->vma[i] = NULL;
        return err;
@@@ -1523,7 -1525,7 +1523,7 @@@ static int eb_copy_relocations(const st
                urelocs = u64_to_user_ptr(eb->exec[i].relocs_ptr);
                size = nreloc * sizeof(*relocs);
  
-               relocs = kvmalloc_array(size, 1, GFP_TEMPORARY);
+               relocs = kvmalloc_array(size, 1, GFP_KERNEL);
                if (!relocs) {
                        kvfree(relocs);
                        err = -ENOMEM;
@@@ -1585,7 -1587,7 +1585,7 @@@ static int eb_prefault_relocations(cons
        const unsigned int count = eb->buffer_count;
        unsigned int i;
  
 -      if (unlikely(i915.prefault_disable))
 +      if (unlikely(i915_modparams.prefault_disable))
                return 0;
  
        for (i = 0; i < count; i++) {
@@@ -2085,7 -2087,7 +2085,7 @@@ get_fence_array(struct drm_i915_gem_exe
                return ERR_PTR(-EFAULT);
  
        fences = kvmalloc_array(args->num_cliprects, sizeof(*fences),
-                               __GFP_NOWARN | GFP_TEMPORARY);
+                               __GFP_NOWARN | GFP_KERNEL);
        if (!fences)
                return ERR_PTR(-ENOMEM);
  
@@@ -2186,7 -2188,6 +2186,7 @@@ i915_gem_do_execbuffer(struct drm_devic
        int out_fence_fd = -1;
        int err;
  
 +      BUILD_BUG_ON(__EXEC_INTERNAL_FLAGS & ~__I915_EXEC_ILLEGAL_FLAGS);
        BUILD_BUG_ON(__EXEC_OBJECT_INTERNAL_FLAGS &
                     ~__EXEC_OBJECT_UNKNOWN_FLAGS);
  
@@@ -2472,9 -2473,9 +2472,9 @@@ i915_gem_execbuffer(struct drm_device *
  
        /* Copy in the exec list from userland */
        exec_list = kvmalloc_array(args->buffer_count, sizeof(*exec_list),
-                                  __GFP_NOWARN | GFP_TEMPORARY);
+                                  __GFP_NOWARN | GFP_KERNEL);
        exec2_list = kvmalloc_array(args->buffer_count + 1, sz,
-                                   __GFP_NOWARN | GFP_TEMPORARY);
+                                   __GFP_NOWARN | GFP_KERNEL);
        if (exec_list == NULL || exec2_list == NULL) {
                DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
                          args->buffer_count);
@@@ -2552,7 -2553,7 +2552,7 @@@ i915_gem_execbuffer2(struct drm_device 
  
        /* Allocate an extra slot for use by the command parser */
        exec2_list = kvmalloc_array(args->buffer_count + 1, sz,
-                                   __GFP_NOWARN | GFP_TEMPORARY);
+                                   __GFP_NOWARN | GFP_KERNEL);
        if (exec2_list == NULL) {
                DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
                          args->buffer_count);
index ecb5e8cd37ba9ba4d2bfce40955d45680f202fb6,40d446ba0b852c7f349e93104b40a1b29fb0061e..64d785262d1447b18b9b7e5362e6ce3cc0017184
@@@ -180,7 -180,7 +180,7 @@@ int intel_sanitize_enable_ppgtt(struct 
                return 0;
        }
  
 -      if (INTEL_GEN(dev_priv) >= 8 && i915.enable_execlists) {
 +      if (INTEL_GEN(dev_priv) >= 8 && i915_modparams.enable_execlists) {
                if (has_full_48bit_ppgtt)
                        return 3;
  
@@@ -230,13 -230,13 +230,13 @@@ static gen8_pte_t gen8_pte_encode(dma_a
  
        switch (level) {
        case I915_CACHE_NONE:
 -              pte |= PPAT_UNCACHED_INDEX;
 +              pte |= PPAT_UNCACHED;
                break;
        case I915_CACHE_WT:
 -              pte |= PPAT_DISPLAY_ELLC_INDEX;
 +              pte |= PPAT_DISPLAY_ELLC;
                break;
        default:
 -              pte |= PPAT_CACHED_INDEX;
 +              pte |= PPAT_CACHED;
                break;
        }
  
@@@ -249,9 -249,9 +249,9 @@@ static gen8_pde_t gen8_pde_encode(cons
        gen8_pde_t pde = _PAGE_PRESENT | _PAGE_RW;
        pde |= addr;
        if (level != I915_CACHE_NONE)
 -              pde |= PPAT_CACHED_PDE_INDEX;
 +              pde |= PPAT_CACHED_PDE;
        else
 -              pde |= PPAT_UNCACHED_INDEX;
 +              pde |= PPAT_UNCACHED;
        return pde;
  }
  
@@@ -1168,22 -1168,19 +1168,22 @@@ static int gen8_ppgtt_alloc_pd(struct i
        unsigned int pde;
  
        gen8_for_each_pde(pt, pd, start, length, pde) {
 +              int count = gen8_pte_count(start, length);
 +
                if (pt == vm->scratch_pt) {
                        pt = alloc_pt(vm);
                        if (IS_ERR(pt))
                                goto unwind;
  
 -                      gen8_initialize_pt(vm, pt);
 +                      if (count < GEN8_PTES)
 +                              gen8_initialize_pt(vm, pt);
  
                        gen8_ppgtt_set_pde(vm, pd, pt, pde);
                        pd->used_pdes++;
                        GEM_BUG_ON(pd->used_pdes > I915_PDES);
                }
  
 -              pt->used_ptes += gen8_pte_count(start, length);
 +              pt->used_ptes += count;
        }
        return 0;
  
@@@ -1972,7 -1969,7 +1972,7 @@@ int i915_ppgtt_init_hw(struct drm_i915_
        /* In the case of execlists, PPGTT is enabled by the context descriptor
         * and the PDPs are contained within the context itself.  We don't
         * need to do anything here. */
 -      if (i915.enable_execlists)
 +      if (i915_modparams.enable_execlists)
                return 0;
  
        if (!USES_PPGTT(dev_priv))
@@@ -2131,7 -2128,7 +2131,7 @@@ int i915_gem_gtt_prepare_pages(struct d
                 */
                GEM_BUG_ON(obj->mm.pages == pages);
        } while (i915_gem_shrink(to_i915(obj->base.dev),
-                                obj->base.size >> PAGE_SHIFT,
+                                obj->base.size >> PAGE_SHIFT, NULL,
                                 I915_SHRINK_BOUND |
                                 I915_SHRINK_UNBOUND |
                                 I915_SHRINK_ACTIVE));
@@@ -2819,209 -2816,41 +2819,209 @@@ static int ggtt_probe_common(struct i91
        return 0;
  }
  
 -static void cnl_setup_private_ppat(struct drm_i915_private *dev_priv)
 +static struct intel_ppat_entry *
 +__alloc_ppat_entry(struct intel_ppat *ppat, unsigned int index, u8 value)
 +{
 +      struct intel_ppat_entry *entry = &ppat->entries[index];
 +
 +      GEM_BUG_ON(index >= ppat->max_entries);
 +      GEM_BUG_ON(test_bit(index, ppat->used));
 +
 +      entry->ppat = ppat;
 +      entry->value = value;
 +      kref_init(&entry->ref);
 +      set_bit(index, ppat->used);
 +      set_bit(index, ppat->dirty);
 +
 +      return entry;
 +}
 +
 +static void __free_ppat_entry(struct intel_ppat_entry *entry)
 +{
 +      struct intel_ppat *ppat = entry->ppat;
 +      unsigned int index = entry - ppat->entries;
 +
 +      GEM_BUG_ON(index >= ppat->max_entries);
 +      GEM_BUG_ON(!test_bit(index, ppat->used));
 +
 +      entry->value = ppat->clear_value;
 +      clear_bit(index, ppat->used);
 +      set_bit(index, ppat->dirty);
 +}
 +
 +/**
 + * intel_ppat_get - get a usable PPAT entry
 + * @i915: i915 device instance
 + * @value: the PPAT value required by the caller
 + *
 + * The function tries to search if there is an existing PPAT entry which
 + * matches with the required value. If perfectly matched, the existing PPAT
 + * entry will be used. If only partially matched, it will try to check if
 + * there is any available PPAT index. If yes, it will allocate a new PPAT
 + * index for the required entry and update the HW. If not, the partially
 + * matched entry will be used.
 + */
 +const struct intel_ppat_entry *
 +intel_ppat_get(struct drm_i915_private *i915, u8 value)
 +{
 +      struct intel_ppat *ppat = &i915->ppat;
 +      struct intel_ppat_entry *entry;
 +      unsigned int scanned, best_score;
 +      int i;
 +
 +      GEM_BUG_ON(!ppat->max_entries);
 +
 +      scanned = best_score = 0;
 +      for_each_set_bit(i, ppat->used, ppat->max_entries) {
 +              unsigned int score;
 +
 +              score = ppat->match(ppat->entries[i].value, value);
 +              if (score > best_score) {
 +                      entry = &ppat->entries[i];
 +                      if (score == INTEL_PPAT_PERFECT_MATCH) {
 +                              kref_get(&entry->ref);
 +                              return entry;
 +                      }
 +                      best_score = score;
 +              }
 +              scanned++;
 +      }
 +
 +      if (scanned == ppat->max_entries) {
 +              if (!best_score)
 +                      return ERR_PTR(-ENOSPC);
 +
 +              kref_get(&entry->ref);
 +              return entry;
 +      }
 +
 +      i = find_first_zero_bit(ppat->used, ppat->max_entries);
 +      entry = __alloc_ppat_entry(ppat, i, value);
 +      ppat->update_hw(i915);
 +      return entry;
 +}
 +
 +static void release_ppat(struct kref *kref)
 +{
 +      struct intel_ppat_entry *entry =
 +              container_of(kref, struct intel_ppat_entry, ref);
 +      struct drm_i915_private *i915 = entry->ppat->i915;
 +
 +      __free_ppat_entry(entry);
 +      entry->ppat->update_hw(i915);
 +}
 +
 +/**
 + * intel_ppat_put - put back the PPAT entry got from intel_ppat_get()
 + * @entry: an intel PPAT entry
 + *
 + * Put back the PPAT entry got from intel_ppat_get(). If the PPAT index of the
 + * entry is dynamically allocated, its reference count will be decreased. Once
 + * the reference count becomes into zero, the PPAT index becomes free again.
 + */
 +void intel_ppat_put(const struct intel_ppat_entry *entry)
 +{
 +      struct intel_ppat *ppat = entry->ppat;
 +      unsigned int index = entry - ppat->entries;
 +
 +      GEM_BUG_ON(!ppat->max_entries);
 +
 +      kref_put(&ppat->entries[index].ref, release_ppat);
 +}
 +
 +static void cnl_private_pat_update_hw(struct drm_i915_private *dev_priv)
 +{
 +      struct intel_ppat *ppat = &dev_priv->ppat;
 +      int i;
 +
 +      for_each_set_bit(i, ppat->dirty, ppat->max_entries) {
 +              I915_WRITE(GEN10_PAT_INDEX(i), ppat->entries[i].value);
 +              clear_bit(i, ppat->dirty);
 +      }
 +}
 +
 +static void bdw_private_pat_update_hw(struct drm_i915_private *dev_priv)
 +{
 +      struct intel_ppat *ppat = &dev_priv->ppat;
 +      u64 pat = 0;
 +      int i;
 +
 +      for (i = 0; i < ppat->max_entries; i++)
 +              pat |= GEN8_PPAT(i, ppat->entries[i].value);
 +
 +      bitmap_clear(ppat->dirty, 0, ppat->max_entries);
 +
 +      I915_WRITE(GEN8_PRIVATE_PAT_LO, lower_32_bits(pat));
 +      I915_WRITE(GEN8_PRIVATE_PAT_HI, upper_32_bits(pat));
 +}
 +
 +static unsigned int bdw_private_pat_match(u8 src, u8 dst)
  {
 +      unsigned int score = 0;
 +      enum {
 +              AGE_MATCH = BIT(0),
 +              TC_MATCH = BIT(1),
 +              CA_MATCH = BIT(2),
 +      };
 +
 +      /* Cache attribute has to be matched. */
 +      if (GEN8_PPAT_GET_CA(src) != GEN8_PPAT_GET_CA(dst))
 +              return 0;
 +
 +      score |= CA_MATCH;
 +
 +      if (GEN8_PPAT_GET_TC(src) == GEN8_PPAT_GET_TC(dst))
 +              score |= TC_MATCH;
 +
 +      if (GEN8_PPAT_GET_AGE(src) == GEN8_PPAT_GET_AGE(dst))
 +              score |= AGE_MATCH;
 +
 +      if (score == (AGE_MATCH | TC_MATCH | CA_MATCH))
 +              return INTEL_PPAT_PERFECT_MATCH;
 +
 +      return score;
 +}
 +
 +static unsigned int chv_private_pat_match(u8 src, u8 dst)
 +{
 +      return (CHV_PPAT_GET_SNOOP(src) == CHV_PPAT_GET_SNOOP(dst)) ?
 +              INTEL_PPAT_PERFECT_MATCH : 0;
 +}
 +
 +static void cnl_setup_private_ppat(struct intel_ppat *ppat)
 +{
 +      ppat->max_entries = 8;
 +      ppat->update_hw = cnl_private_pat_update_hw;
 +      ppat->match = bdw_private_pat_match;
 +      ppat->clear_value = GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3);
 +
        /* XXX: spec is unclear if this is still needed for CNL+ */
 -      if (!USES_PPGTT(dev_priv)) {
 -              I915_WRITE(GEN10_PAT_INDEX(0), GEN8_PPAT_UC);
 +      if (!USES_PPGTT(ppat->i915)) {
 +              __alloc_ppat_entry(ppat, 0, GEN8_PPAT_UC);
                return;
        }
  
 -      I915_WRITE(GEN10_PAT_INDEX(0), GEN8_PPAT_WB | GEN8_PPAT_LLC);
 -      I915_WRITE(GEN10_PAT_INDEX(1), GEN8_PPAT_WC | GEN8_PPAT_LLCELLC);
 -      I915_WRITE(GEN10_PAT_INDEX(2), GEN8_PPAT_WT | GEN8_PPAT_LLCELLC);
 -      I915_WRITE(GEN10_PAT_INDEX(3), GEN8_PPAT_UC);
 -      I915_WRITE(GEN10_PAT_INDEX(4), GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(0));
 -      I915_WRITE(GEN10_PAT_INDEX(5), GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(1));
 -      I915_WRITE(GEN10_PAT_INDEX(6), GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2));
 -      I915_WRITE(GEN10_PAT_INDEX(7), GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3));
 +      __alloc_ppat_entry(ppat, 0, GEN8_PPAT_WB | GEN8_PPAT_LLC);
 +      __alloc_ppat_entry(ppat, 1, GEN8_PPAT_WC | GEN8_PPAT_LLCELLC);
 +      __alloc_ppat_entry(ppat, 2, GEN8_PPAT_WT | GEN8_PPAT_LLCELLC);
 +      __alloc_ppat_entry(ppat, 3, GEN8_PPAT_UC);
 +      __alloc_ppat_entry(ppat, 4, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(0));
 +      __alloc_ppat_entry(ppat, 5, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(1));
 +      __alloc_ppat_entry(ppat, 6, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2));
 +      __alloc_ppat_entry(ppat, 7, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3));
  }
  
  /* The GGTT and PPGTT need a private PPAT setup in order to handle cacheability
   * bits. When using advanced contexts each context stores its own PAT, but
   * writing this data shouldn't be harmful even in those cases. */
 -static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv)
 +static void bdw_setup_private_ppat(struct intel_ppat *ppat)
  {
 -      u64 pat;
 +      ppat->max_entries = 8;
 +      ppat->update_hw = bdw_private_pat_update_hw;
 +      ppat->match = bdw_private_pat_match;
 +      ppat->clear_value = GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3);
  
 -      pat = GEN8_PPAT(0, GEN8_PPAT_WB | GEN8_PPAT_LLC)     | /* for normal objects, no eLLC */
 -            GEN8_PPAT(1, GEN8_PPAT_WC | GEN8_PPAT_LLCELLC) | /* for something pointing to ptes? */
 -            GEN8_PPAT(2, GEN8_PPAT_WT | GEN8_PPAT_LLCELLC) | /* for scanout with eLLC */
 -            GEN8_PPAT(3, GEN8_PPAT_UC)                     | /* Uncached objects, mostly for scanout */
 -            GEN8_PPAT(4, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(0)) |
 -            GEN8_PPAT(5, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(1)) |
 -            GEN8_PPAT(6, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2)) |
 -            GEN8_PPAT(7, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3));
 -
 -      if (!USES_PPGTT(dev_priv))
 +      if (!USES_PPGTT(ppat->i915)) {
                /* Spec: "For GGTT, there is NO pat_sel[2:0] from the entry,
                 * so RTL will always use the value corresponding to
                 * pat_sel = 000".
                 * So we can still hold onto all our assumptions wrt cpu
                 * clflushing on LLC machines.
                 */
 -              pat = GEN8_PPAT(0, GEN8_PPAT_UC);
 +              __alloc_ppat_entry(ppat, 0, GEN8_PPAT_UC);
 +              return;
 +      }
  
 -      /* XXX: spec defines this as 2 distinct registers. It's unclear if a 64b
 -       * write would work. */
 -      I915_WRITE(GEN8_PRIVATE_PAT_LO, pat);
 -      I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
 +      __alloc_ppat_entry(ppat, 0, GEN8_PPAT_WB | GEN8_PPAT_LLC);      /* for normal objects, no eLLC */
 +      __alloc_ppat_entry(ppat, 1, GEN8_PPAT_WC | GEN8_PPAT_LLCELLC);  /* for something pointing to ptes? */
 +      __alloc_ppat_entry(ppat, 2, GEN8_PPAT_WT | GEN8_PPAT_LLCELLC);  /* for scanout with eLLC */
 +      __alloc_ppat_entry(ppat, 3, GEN8_PPAT_UC);                      /* Uncached objects, mostly for scanout */
 +      __alloc_ppat_entry(ppat, 4, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(0));
 +      __alloc_ppat_entry(ppat, 5, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(1));
 +      __alloc_ppat_entry(ppat, 6, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2));
 +      __alloc_ppat_entry(ppat, 7, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3));
  }
  
 -static void chv_setup_private_ppat(struct drm_i915_private *dev_priv)
 +static void chv_setup_private_ppat(struct intel_ppat *ppat)
  {
 -      u64 pat;
 +      ppat->max_entries = 8;
 +      ppat->update_hw = bdw_private_pat_update_hw;
 +      ppat->match = chv_private_pat_match;
 +      ppat->clear_value = CHV_PPAT_SNOOP;
  
        /*
         * Map WB on BDW to snooped on CHV.
         * Which means we must set the snoop bit in PAT entry 0
         * in order to keep the global status page working.
         */
 -      pat = GEN8_PPAT(0, CHV_PPAT_SNOOP) |
 -            GEN8_PPAT(1, 0) |
 -            GEN8_PPAT(2, 0) |
 -            GEN8_PPAT(3, 0) |
 -            GEN8_PPAT(4, CHV_PPAT_SNOOP) |
 -            GEN8_PPAT(5, CHV_PPAT_SNOOP) |
 -            GEN8_PPAT(6, CHV_PPAT_SNOOP) |
 -            GEN8_PPAT(7, CHV_PPAT_SNOOP);
  
 -      I915_WRITE(GEN8_PRIVATE_PAT_LO, pat);
 -      I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
 +      __alloc_ppat_entry(ppat, 0, CHV_PPAT_SNOOP);
 +      __alloc_ppat_entry(ppat, 1, 0);
 +      __alloc_ppat_entry(ppat, 2, 0);
 +      __alloc_ppat_entry(ppat, 3, 0);
 +      __alloc_ppat_entry(ppat, 4, CHV_PPAT_SNOOP);
 +      __alloc_ppat_entry(ppat, 5, CHV_PPAT_SNOOP);
 +      __alloc_ppat_entry(ppat, 6, CHV_PPAT_SNOOP);
 +      __alloc_ppat_entry(ppat, 7, CHV_PPAT_SNOOP);
  }
  
  static void gen6_gmch_remove(struct i915_address_space *vm)
        cleanup_scratch_page(vm);
  }
  
 +static void setup_private_pat(struct drm_i915_private *dev_priv)
 +{
 +      struct intel_ppat *ppat = &dev_priv->ppat;
 +      int i;
 +
 +      ppat->i915 = dev_priv;
 +
 +      if (INTEL_GEN(dev_priv) >= 10)
 +              cnl_setup_private_ppat(ppat);
 +      else if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
 +              chv_setup_private_ppat(ppat);
 +      else
 +              bdw_setup_private_ppat(ppat);
 +
 +      GEM_BUG_ON(ppat->max_entries > INTEL_MAX_PPAT_ENTRIES);
 +
 +      for_each_clear_bit(i, ppat->used, ppat->max_entries) {
 +              ppat->entries[i].value = ppat->clear_value;
 +              ppat->entries[i].ppat = ppat;
 +              set_bit(i, ppat->dirty);
 +      }
 +
 +      ppat->update_hw(dev_priv);
 +}
 +
  static int gen8_gmch_probe(struct i915_ggtt *ggtt)
  {
        struct drm_i915_private *dev_priv = ggtt->base.i915;
        }
  
        ggtt->base.total = (size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
 -
 -      if (INTEL_GEN(dev_priv) >= 10)
 -              cnl_setup_private_ppat(dev_priv);
 -      else if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
 -              chv_setup_private_ppat(dev_priv);
 -      else
 -              bdw_setup_private_ppat(dev_priv);
 -
        ggtt->base.cleanup = gen6_gmch_remove;
        ggtt->base.bind_vma = ggtt_bind_vma;
        ggtt->base.unbind_vma = ggtt_unbind_vma;
  
        ggtt->invalidate = gen6_ggtt_invalidate;
  
 +      setup_private_pat(dev_priv);
 +
        return ggtt_probe_common(ggtt, size);
  }
  
@@@ -3292,7 -3095,7 +3292,7 @@@ int i915_ggtt_probe_hw(struct drm_i915_
         * currently don't have any bits spare to pass in this upper
         * restriction!
         */
 -      if (HAS_GUC(dev_priv) && i915.enable_guc_loading) {
 +      if (HAS_GUC(dev_priv) && i915_modparams.enable_guc_loading) {
                ggtt->base.total = min_t(u64, ggtt->base.total, GUC_GGTT_TOP);
                ggtt->mappable_end = min(ggtt->mappable_end, ggtt->base.total);
        }
@@@ -3429,10 -3232,13 +3429,10 @@@ void i915_gem_restore_gtt_mappings(stru
        ggtt->base.closed = false;
  
        if (INTEL_GEN(dev_priv) >= 8) {
 -              if (INTEL_GEN(dev_priv) >= 10)
 -                      cnl_setup_private_ppat(dev_priv);
 -              else if (IS_CHERRYVIEW(dev_priv) || IS_GEN9_LP(dev_priv))
 -                      chv_setup_private_ppat(dev_priv);
 -              else
 -                      bdw_setup_private_ppat(dev_priv);
 +              struct intel_ppat *ppat = &dev_priv->ppat;
  
 +              bitmap_set(ppat->dirty, 0, ppat->max_entries);
 +              dev_priv->ppat.update_hw(dev_priv);
                return;
        }
  
@@@ -3499,7 -3305,7 +3499,7 @@@ intel_rotate_pages(struct intel_rotatio
        /* Allocate a temporary list of source pages for random access. */
        page_addr_list = kvmalloc_array(n_pages,
                                        sizeof(dma_addr_t),
-                                       GFP_TEMPORARY);
+                                       GFP_KERNEL);
        if (!page_addr_list)
                return ERR_PTR(ret);
  
index 15547c8f7d3fa164d6c031186d832f224d24f2ed,709efe2357eac9948ba71a76e11c02ace9f6ae4c..2d4996de733120b155a613f5f60137b3afcecbcb
@@@ -49,7 -49,7 +49,7 @@@ struct i915_mmu_notifier 
        spinlock_t lock;
        struct hlist_node node;
        struct mmu_notifier mn;
-       struct rb_root objects;
+       struct rb_root_cached objects;
        struct workqueue_struct *wq;
  };
  
@@@ -123,7 -123,7 +123,7 @@@ static void i915_gem_userptr_mn_invalid
        struct interval_tree_node *it;
        LIST_HEAD(cancelled);
  
-       if (RB_EMPTY_ROOT(&mn->objects))
+       if (RB_EMPTY_ROOT(&mn->objects.rb_root))
                return;
  
        /* interval ranges are inclusive, but invalidate range is exclusive */
@@@ -172,7 -172,7 +172,7 @@@ i915_mmu_notifier_create(struct mm_stru
  
        spin_lock_init(&mn->lock);
        mn->mn.ops = &i915_gem_userptr_notifier;
-       mn->objects = RB_ROOT;
+       mn->objects = RB_ROOT_CACHED;
        mn->wq = alloc_workqueue("i915-userptr-release", WQ_UNBOUND, 0);
        if (mn->wq == NULL) {
                kfree(mn);
@@@ -399,42 -399,64 +399,42 @@@ struct get_pages_work 
        struct task_struct *task;
  };
  
 -#if IS_ENABLED(CONFIG_SWIOTLB)
 -#define swiotlb_active() swiotlb_nr_tbl()
 -#else
 -#define swiotlb_active() 0
 -#endif
 -
 -static int
 -st_set_pages(struct sg_table **st, struct page **pvec, int num_pages)
 -{
 -      struct scatterlist *sg;
 -      int ret, n;
 -
 -      *st = kmalloc(sizeof(**st), GFP_KERNEL);
 -      if (*st == NULL)
 -              return -ENOMEM;
 -
 -      if (swiotlb_active()) {
 -              ret = sg_alloc_table(*st, num_pages, GFP_KERNEL);
 -              if (ret)
 -                      goto err;
 -
 -              for_each_sg((*st)->sgl, sg, num_pages, n)
 -                      sg_set_page(sg, pvec[n], PAGE_SIZE, 0);
 -      } else {
 -              ret = sg_alloc_table_from_pages(*st, pvec, num_pages,
 -                                              0, num_pages << PAGE_SHIFT,
 -                                              GFP_KERNEL);
 -              if (ret)
 -                      goto err;
 -      }
 -
 -      return 0;
 -
 -err:
 -      kfree(*st);
 -      *st = NULL;
 -      return ret;
 -}
 -
  static struct sg_table *
 -__i915_gem_userptr_set_pages(struct drm_i915_gem_object *obj,
 -                           struct page **pvec, int num_pages)
 +__i915_gem_userptr_alloc_pages(struct drm_i915_gem_object *obj,
 +                             struct page **pvec, int num_pages)
  {
 -      struct sg_table *pages;
 +      unsigned int max_segment = i915_sg_segment_size();
 +      struct sg_table *st;
        int ret;
  
 -      ret = st_set_pages(&pages, pvec, num_pages);
 -      if (ret)
 +      st = kmalloc(sizeof(*st), GFP_KERNEL);
 +      if (!st)
 +              return ERR_PTR(-ENOMEM);
 +
 +alloc_table:
 +      ret = __sg_alloc_table_from_pages(st, pvec, num_pages,
 +                                        0, num_pages << PAGE_SHIFT,
 +                                        max_segment,
 +                                        GFP_KERNEL);
 +      if (ret) {
 +              kfree(st);
                return ERR_PTR(ret);
 +      }
  
 -      ret = i915_gem_gtt_prepare_pages(obj, pages);
 +      ret = i915_gem_gtt_prepare_pages(obj, st);
        if (ret) {
 -              sg_free_table(pages);
 -              kfree(pages);
 +              sg_free_table(st);
 +
 +              if (max_segment > PAGE_SIZE) {
 +                      max_segment = PAGE_SIZE;
 +                      goto alloc_table;
 +              }
 +
 +              kfree(st);
                return ERR_PTR(ret);
        }
  
 -      return pages;
 +      return st;
  }
  
  static int
@@@ -485,7 -507,7 +485,7 @@@ __i915_gem_userptr_get_pages_worker(str
        ret = -ENOMEM;
        pinned = 0;
  
-       pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_TEMPORARY);
+       pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
        if (pvec != NULL) {
                struct mm_struct *mm = obj->userptr.mm->mm;
                unsigned int flags = 0;
                struct sg_table *pages = ERR_PTR(ret);
  
                if (pinned == npages) {
 -                      pages = __i915_gem_userptr_set_pages(obj, pvec, npages);
 +                      pages = __i915_gem_userptr_alloc_pages(obj, pvec,
 +                                                             npages);
                        if (!IS_ERR(pages)) {
                                __i915_gem_object_set_pages(obj, pages);
                                pinned = 0;
@@@ -622,7 -643,7 +622,7 @@@ i915_gem_userptr_get_pages(struct drm_i
  
        if (mm == current->mm) {
                pvec = kvmalloc_array(num_pages, sizeof(struct page *),
-                                     GFP_TEMPORARY |
+                                     GFP_KERNEL |
                                      __GFP_NORETRY |
                                      __GFP_NOWARN);
                if (pvec) /* defer to worker if malloc fails */
                pages = __i915_gem_userptr_get_pages_schedule(obj);
                active = pages == ERR_PTR(-EAGAIN);
        } else {
 -              pages = __i915_gem_userptr_set_pages(obj, pvec, num_pages);
 +              pages = __i915_gem_userptr_alloc_pages(obj, pvec, num_pages);
                active = !IS_ERR(pages);
        }
        if (active)
@@@ -813,9 -834,7 +813,9 @@@ int i915_gem_init_userptr(struct drm_i9
        hash_init(dev_priv->mm_structs);
  
        dev_priv->mm.userptr_wq =
 -              alloc_workqueue("i915-userptr-acquire", WQ_HIGHPRI, 0);
 +              alloc_workqueue("i915-userptr-acquire",
 +                              WQ_HIGHPRI | WQ_MEM_RECLAIM,
 +                              0);
        if (!dev_priv->mm.userptr_wq)
                return -ENOMEM;
  
index 9f7b351621f3b7ed40846ecee57457dcc901e885,0c779671fe2df976eceba035b45df01e9dc82f64..c14552ab270bc34a8d67936e74b7a0b72e05b2e9
@@@ -396,8 -396,6 +396,8 @@@ static void error_print_context(struct 
  static void error_print_engine(struct drm_i915_error_state_buf *m,
                               const struct drm_i915_error_engine *ee)
  {
 +      int n;
 +
        err_printf(m, "%s command stream:\n", engine_str(ee->engine_id));
        err_printf(m, "  START: 0x%08x\n", ee->start);
        err_printf(m, "  HEAD:  0x%08x [0x%08x]\n", ee->head, ee->rq_head);
                   jiffies_to_msecs(jiffies - ee->hangcheck_timestamp));
        err_printf(m, "  engine reset count: %u\n", ee->reset_count);
  
 -      error_print_request(m, "  ELSP[0]: ", &ee->execlist[0]);
 -      error_print_request(m, "  ELSP[1]: ", &ee->execlist[1]);
 +      for (n = 0; n < ee->num_ports; n++) {
 +              err_printf(m, "  ELSP[%d]:", n);
 +              error_print_request(m, " ", &ee->execlist[n]);
 +      }
 +
        error_print_context(m, "  Active context: ", &ee->context);
  }
  
@@@ -572,7 -567,7 +572,7 @@@ static __always_inline void err_print_p
  static void err_print_params(struct drm_i915_error_state_buf *m,
                             const struct i915_params *p)
  {
 -#define PRINT(T, x) err_print_param(m, #x, #T, &p->x);
 +#define PRINT(T, x, ...) err_print_param(m, #x, #T, &p->x);
        I915_PARAMS_FOR_EACH(PRINT);
  #undef PRINT
  }
@@@ -792,16 -787,16 +792,16 @@@ int i915_error_state_buf_init(struct dr
         */
        ebuf->size = count + 1 > PAGE_SIZE ? count + 1 : PAGE_SIZE;
        ebuf->buf = kmalloc(ebuf->size,
-                               GFP_TEMPORARY | __GFP_NORETRY | __GFP_NOWARN);
+                               GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN);
  
        if (ebuf->buf == NULL) {
                ebuf->size = PAGE_SIZE;
-               ebuf->buf = kmalloc(ebuf->size, GFP_TEMPORARY);
+               ebuf->buf = kmalloc(ebuf->size, GFP_KERNEL);
        }
  
        if (ebuf->buf == NULL) {
                ebuf->size = 128;
-               ebuf->buf = kmalloc(ebuf->size, GFP_TEMPORARY);
+               ebuf->buf = kmalloc(ebuf->size, GFP_KERNEL);
        }
  
        if (ebuf->buf == NULL)
@@@ -866,7 -861,7 +866,7 @@@ void __i915_gpu_state_free(struct kref 
        kfree(error->overlay);
        kfree(error->display);
  
 -#define FREE(T, x) free_param(#T, &error->params.x);
 +#define FREE(T, x, ...) free_param(#T, &error->params.x);
        I915_PARAMS_FOR_EACH(FREE);
  #undef FREE
  
@@@ -1332,19 -1327,17 +1332,19 @@@ static void engine_record_requests(stru
  static void error_record_engine_execlists(struct intel_engine_cs *engine,
                                          struct drm_i915_error_engine *ee)
  {
 -      const struct execlist_port *port = engine->execlist_port;
 +      const struct intel_engine_execlists * const execlists = &engine->execlists;
        unsigned int n;
  
 -      for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++) {
 -              struct drm_i915_gem_request *rq = port_request(&port[n]);
 +      for (n = 0; n < execlists_num_ports(execlists); n++) {
 +              struct drm_i915_gem_request *rq = port_request(&execlists->port[n]);
  
                if (!rq)
                        break;
  
                record_request(rq, &ee->execlist[n]);
        }
 +
 +      ee->num_ports = n;
  }
  
  static void record_context(struct drm_i915_error_context *e,
@@@ -1561,7 -1554,7 +1561,7 @@@ static void i915_gem_capture_guc_log_bu
                                            struct i915_gpu_state *error)
  {
        /* Capturing log buf contents won't be useful if logging was disabled */
 -      if (!dev_priv->guc.log.vma || (i915.guc_log_level < 0))
 +      if (!dev_priv->guc.log.vma || (i915_modparams.guc_log_level < 0))
                return;
  
        error->guc_log = i915_error_object_create(dev_priv,
@@@ -1703,8 -1696,8 +1703,8 @@@ static int capture(void *data
                ktime_to_timeval(ktime_sub(ktime_get(),
                                           error->i915->gt.last_init_time));
  
 -      error->params = i915;
 -#define DUP(T, x) dup_param(#T, &error->params.x);
 +      error->params = i915_modparams;
 +#define DUP(T, x, ...) dup_param(#T, &error->params.x);
        I915_PARAMS_FOR_EACH(DUP);
  #undef DUP
  
@@@ -1758,7 -1751,7 +1758,7 @@@ void i915_capture_error_state(struct dr
        struct i915_gpu_state *error;
        unsigned long flags;
  
 -      if (!i915.error_capture)
 +      if (!i915_modparams.error_capture)
                return;
  
        if (READ_ONCE(dev_priv->gpu_error.first_error))
index aa9ccc3ecff9fc3da67374d8a21a01f8554a1d04,f780f39e0758c646dae633ce93306892c667f480..c4b224a3a0ee4349187d3d8cd582b9e8b41e0682
@@@ -3701,7 -3701,7 +3701,7 @@@ void intel_prepare_reset(struct drm_i91
  
  
        /* reset doesn't touch the display */
 -      if (!i915.force_reset_modeset_test &&
 +      if (!i915_modparams.force_reset_modeset_test &&
            !gpu_reset_clobbers_display(dev_priv))
                return;
  
@@@ -3757,7 -3757,7 +3757,7 @@@ void intel_finish_reset(struct drm_i915
        int ret;
  
        /* reset doesn't touch the display */
 -      if (!i915.force_reset_modeset_test &&
 +      if (!i915_modparams.force_reset_modeset_test &&
            !gpu_reset_clobbers_display(dev_priv))
                return;
  
@@@ -4956,8 -4956,7 +4956,8 @@@ void hsw_enable_ips(struct intel_crtc *
        assert_plane_enabled(dev_priv, crtc->plane);
        if (IS_BROADWELL(dev_priv)) {
                mutex_lock(&dev_priv->rps.hw_lock);
 -              WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0xc0000000));
 +              WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL,
 +                                              IPS_ENABLE | IPS_PCODE_CONTROL));
                mutex_unlock(&dev_priv->rps.hw_lock);
                /* Quoting Art Runyan: "its not safe to expect any particular
                 * value in IPS_CTL bit 31 after enabling IPS through the
@@@ -6313,7 -6312,7 +6313,7 @@@ static void hsw_compute_ips_config(stru
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
  
 -      pipe_config->ips_enabled = i915.enable_ips &&
 +      pipe_config->ips_enabled = i915_modparams.enable_ips &&
                hsw_crtc_supports_ips(crtc) &&
                pipe_config_supports_ips(dev_priv, pipe_config);
  }
@@@ -6494,8 -6493,8 +6494,8 @@@ intel_link_compute_m_n(int bits_per_pix
  
  static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
  {
 -      if (i915.panel_use_ssc >= 0)
 -              return i915.panel_use_ssc != 0;
 +      if (i915_modparams.panel_use_ssc >= 0)
 +              return i915_modparams.panel_use_ssc != 0;
        return dev_priv->vbt.lvds_use_ssc
                && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
  }
@@@ -9310,11 -9309,11 +9310,11 @@@ static bool haswell_get_pipe_config(str
        pipe_config->gamma_mode =
                I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK;
  
 -      if (IS_BROADWELL(dev_priv) || dev_priv->info.gen >= 9) {
 +      if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9) {
                u32 tmp = I915_READ(PIPEMISC(crtc->pipe));
                bool clrspace_yuv = tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV;
  
 -              if (IS_GEMINILAKE(dev_priv) || dev_priv->info.gen >= 10) {
 +              if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
                        bool blend_mode_420 = tmp &
                                              PIPEMISC_YUV420_MODE_FULL_BLEND;
  
@@@ -10224,7 -10223,7 +10224,7 @@@ int intel_dotclock_calculate(int link_f
        if (!m_n->link_n)
                return 0;
  
 -      return div_u64((u64)m_n->link_m * link_freq, m_n->link_n);
 +      return div_u64(mul_u32_u32(m_n->link_m, link_freq), m_n->link_n);
  }
  
  static void ironlake_pch_clock_get(struct intel_crtc *crtc,
@@@ -12084,7 -12083,7 +12084,7 @@@ static int intel_atomic_check(struct dr
                        return ret;
                }
  
 -              if (i915.fastboot &&
 +              if (i915_modparams.fastboot &&
                    intel_pipe_config_compare(dev_priv,
                                        to_intel_crtc_state(old_crtc_state),
                                        pipe_config, true)) {
@@@ -12137,73 -12136,10 +12137,10 @@@ u32 intel_crtc_get_vblank_counter(struc
        return dev->driver->get_vblank_counter(dev, crtc->pipe);
  }
  
- static void intel_atomic_wait_for_vblanks(struct drm_device *dev,
-                                         struct drm_i915_private *dev_priv,
-                                         unsigned crtc_mask)
- {
-       unsigned last_vblank_count[I915_MAX_PIPES];
-       enum pipe pipe;
-       int ret;
-       if (!crtc_mask)
-               return;
-       for_each_pipe(dev_priv, pipe) {
-               struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv,
-                                                                 pipe);
-               if (!((1 << pipe) & crtc_mask))
-                       continue;
-               ret = drm_crtc_vblank_get(&crtc->base);
-               if (WARN_ON(ret != 0)) {
-                       crtc_mask &= ~(1 << pipe);
-                       continue;
-               }
-               last_vblank_count[pipe] = drm_crtc_vblank_count(&crtc->base);
-       }
-       for_each_pipe(dev_priv, pipe) {
-               struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv,
-                                                                 pipe);
-               long lret;
-               if (!((1 << pipe) & crtc_mask))
-                       continue;
-               lret = wait_event_timeout(dev->vblank[pipe].queue,
-                               last_vblank_count[pipe] !=
-                                       drm_crtc_vblank_count(&crtc->base),
-                               msecs_to_jiffies(50));
-               WARN(!lret, "pipe %c vblank wait timed out\n", pipe_name(pipe));
-               drm_crtc_vblank_put(&crtc->base);
-       }
- }
- static bool needs_vblank_wait(struct intel_crtc_state *crtc_state)
- {
-       /* fb updated, need to unpin old fb */
-       if (crtc_state->fb_changed)
-               return true;
-       /* wm changes, need vblank before final wm's */
-       if (crtc_state->update_wm_post)
-               return true;
-       if (crtc_state->wm.need_postvbl_update)
-               return true;
-       return false;
- }
  static void intel_update_crtc(struct drm_crtc *crtc,
                              struct drm_atomic_state *state,
                              struct drm_crtc_state *old_crtc_state,
-                             struct drm_crtc_state *new_crtc_state,
-                             unsigned int *crtc_vblank_mask)
+                             struct drm_crtc_state *new_crtc_state)
  {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        }
  
        drm_atomic_helper_commit_planes_on_crtc(old_crtc_state);
-       if (needs_vblank_wait(pipe_config))
-               *crtc_vblank_mask |= drm_crtc_mask(crtc);
  }
  
- static void intel_update_crtcs(struct drm_atomic_state *state,
-                              unsigned int *crtc_vblank_mask)
+ static void intel_update_crtcs(struct drm_atomic_state *state)
  {
        struct drm_crtc *crtc;
        struct drm_crtc_state *old_crtc_state, *new_crtc_state;
                        continue;
  
                intel_update_crtc(crtc, state, old_crtc_state,
-                                 new_crtc_state, crtc_vblank_mask);
+                                 new_crtc_state);
        }
  }
  
- static void skl_update_crtcs(struct drm_atomic_state *state,
-                            unsigned int *crtc_vblank_mask)
+ static void skl_update_crtcs(struct drm_atomic_state *state)
  {
        struct drm_i915_private *dev_priv = to_i915(state->dev);
        struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
                                vbl_wait = true;
  
                        intel_update_crtc(crtc, state, old_crtc_state,
-                                         new_crtc_state, crtc_vblank_mask);
+                                         new_crtc_state);
  
                        if (vbl_wait)
                                intel_wait_for_vblank(dev_priv, pipe);
@@@ -12367,8 -12298,8 +12299,7 @@@ static void intel_atomic_commit_tail(st
        struct drm_crtc_state *old_crtc_state, *new_crtc_state;
        struct drm_crtc *crtc;
        struct intel_crtc_state *intel_cstate;
 -      bool hw_check = intel_state->modeset;
        u64 put_domains[I915_MAX_PIPES] = {};
-       unsigned crtc_vblank_mask = 0;
        int i;
  
        intel_atomic_commit_fence_wait(intel_state);
  
                if (needs_modeset(new_crtc_state) ||
                    to_intel_crtc_state(new_crtc_state)->update_pipe) {
 -                      hw_check = true;
  
                        put_domains[to_intel_crtc(crtc)->pipe] =
                                modeset_get_crtc_power_domains(crtc,
        }
  
        /* Now enable the clocks, plane, pipe, and connectors that we set up. */
-       dev_priv->display.update_crtcs(state, &crtc_vblank_mask);
+       dev_priv->display.update_crtcs(state);
  
        /* FIXME: We should call drm_atomic_helper_commit_hw_done() here
         * already, but still need the state for the delayed optimization. To
         * - switch over to the vblank wait helper in the core after that since
         *   we don't need out special handling any more.
         */
-       if (!state->legacy_cursor_update)
-               intel_atomic_wait_for_vblanks(dev, dev_priv, crtc_vblank_mask);
+       drm_atomic_helper_wait_for_flip_done(dev, state);
  
        /*
         * Now that the vblank has passed, we can go ahead and program the
@@@ -13133,6 -13064,14 +13063,14 @@@ intel_legacy_cursor_update(struct drm_p
                goto slow;
  
        old_plane_state = plane->state;
+       /*
+        * Don't do an async update if there is an outstanding commit modifying
+        * the plane.  This prevents our async update's changes from getting
+        * overridden by a previous synchronous update's state.
+        */
+       if (old_plane_state->commit &&
+           !try_wait_for_completion(&old_plane_state->commit->hw_done))
+               goto slow;
  
        /*
         * If any parameters change that may affect watermarks,
        }
  
        old_fb = old_plane_state->fb;
-       old_vma = to_intel_plane_state(old_plane_state)->vma;
  
        i915_gem_track_fb(intel_fb_obj(old_fb), intel_fb_obj(fb),
                          intel_plane->frontbuffer_bit);
  
        /* Swap plane state */
-       new_plane_state->fence = old_plane_state->fence;
-       *to_intel_plane_state(old_plane_state) = *to_intel_plane_state(new_plane_state);
-       new_plane_state->fence = NULL;
-       new_plane_state->fb = old_fb;
-       to_intel_plane_state(new_plane_state)->vma = NULL;
+       plane->state = new_plane_state;
  
        if (plane->state->visible) {
                trace_intel_update_plane(plane, to_intel_crtc(crtc));
                intel_plane->disable_plane(intel_plane, to_intel_crtc(crtc));
        }
  
+       old_vma = fetch_and_zero(&to_intel_plane_state(old_plane_state)->vma);
        if (old_vma)
                intel_unpin_fb_vma(old_vma);
  
  out_unlock:
        mutex_unlock(&dev_priv->drm.struct_mutex);
  out_free:
-       intel_plane_destroy_state(plane, new_plane_state);
+       if (ret)
+               intel_plane_destroy_state(plane, new_plane_state);
+       else
+               intel_plane_destroy_state(plane, old_plane_state);
        return ret;
  
  slow:
@@@ -14280,7 -14218,7 +14217,7 @@@ void intel_init_display_hooks(struct dr
                dev_priv->display.fdi_link_train = hsw_fdi_link_train;
        }
  
 -      if (dev_priv->info.gen >= 9)
 +      if (INTEL_GEN(dev_priv) >= 9)
                dev_priv->display.update_crtcs = skl_update_crtcs;
        else
                dev_priv->display.update_crtcs = intel_update_crtcs;
@@@ -15254,7 -15192,6 +15191,7 @@@ void intel_display_resume(struct drm_de
        if (!ret)
                ret = __intel_display_resume(dev, state, &ctx);
  
 +      intel_enable_ipc(dev_priv);
        drm_modeset_drop_locks(&ctx);
        drm_modeset_acquire_fini(&ctx);
  
index ea0f5dbc0eb7d22e90ed5ba10962270ba9cfebb6,222c511bea494585b08d9a6c41701065517526bd..b85872cc7fbe0ff5ec7503b09bb9956f160a9954
@@@ -41,6 -41,11 +41,6 @@@ u64 i915_prandom_u64_state(struct rnd_s
        return x;
  }
  
 -static inline u32 i915_prandom_u32_max_state(u32 ep_ro, struct rnd_state *state)
 -{
 -      return upper_32_bits((u64)prandom_u32_state(state) * ep_ro);
 -}
 -
  void i915_random_reorder(unsigned int *order, unsigned int count,
                         struct rnd_state *state)
  {
@@@ -57,7 -62,7 +57,7 @@@ unsigned int *i915_random_order(unsigne
  {
        unsigned int *order, i;
  
-       order = kmalloc_array(count, sizeof(*order), GFP_TEMPORARY);
+       order = kmalloc_array(count, sizeof(*order), GFP_KERNEL);
        if (!order)
                return order;
  
index 2405077fdc716aadad9bebd238ad21c8cf178cfa,9f389f36566de38eade18dfe008be0c314908346..a9806ba6116dec553be8f06141b5e6d314a8996c
@@@ -352,7 -352,7 +352,7 @@@ static int vb2_dc_dmabuf_ops_mmap(struc
        return vb2_dc_mmap(dbuf->priv, vma);
  }
  
- static struct dma_buf_ops vb2_dc_dmabuf_ops = {
+ static const struct dma_buf_ops vb2_dc_dmabuf_ops = {
        .attach = vb2_dc_dmabuf_ops_attach,
        .detach = vb2_dc_dmabuf_ops_detach,
        .map_dma_buf = vb2_dc_dmabuf_ops_map,
@@@ -479,7 -479,7 +479,7 @@@ static void *vb2_dc_get_userptr(struct 
  {
        struct vb2_dc_buf *buf;
        struct frame_vector *vec;
 -      unsigned long offset;
 +      unsigned int offset;
        int n_pages, i;
        int ret = 0;
        struct sg_table *sgt;
        buf->dev = dev;
        buf->dma_dir = dma_dir;
  
 -      offset = vaddr & ~PAGE_MASK;
 +      offset = lower_32_bits(offset_in_page(vaddr));
-       vec = vb2_create_framevec(vaddr, size, dma_dir == DMA_FROM_DEVICE);
+       vec = vb2_create_framevec(vaddr, size, dma_dir == DMA_FROM_DEVICE ||
+                                              dma_dir == DMA_BIDIRECTIONAL);
        if (IS_ERR(vec)) {
                ret = PTR_ERR(vec);
                goto fail_buf;