]> Git Repo - linux.git/commitdiff
Merge drm/drm-next into drm-intel-next-queued
authorJoonas Lahtinen <[email protected]>
Wed, 20 Feb 2019 09:04:08 +0000 (11:04 +0200)
committerJoonas Lahtinen <[email protected]>
Wed, 20 Feb 2019 09:04:08 +0000 (11:04 +0200)
Doing a backmerge to be able to merge topic/mei-hdcp-2019-02-19 PR.

Signed-off-by: Joonas Lahtinen <[email protected]>
1  2 
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_pci.c
drivers/gpu/drm/i915/i915_trace.h
drivers/gpu/drm/i915/intel_atomic_plane.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_fbdev.c
drivers/gpu/drm/i915/intel_pm.c

index ca8fa4461fc9b70ffd3bf743e4f0dbc7048479f2,0bd890c04fe4f7c911bd9bde1a79af11af08ff5c..2aeea977283fa67c85afdc2e1b5cdbef3f9b3ba0
   *
   */
  
- #include <linux/debugfs.h>
  #include <linux/sort.h>
  #include <linux/sched/mm.h>
+ #include <drm/drm_debugfs.h>
+ #include <drm/drm_fourcc.h>
  #include "intel_drv.h"
  #include "intel_guc_submission.h"
  
@@@ -1280,11 -1281,14 +1281,11 @@@ static int i915_hangcheck_info(struct s
        intel_wakeref_t wakeref;
        enum intel_engine_id id;
  
 +      seq_printf(m, "Reset flags: %lx\n", dev_priv->gpu_error.flags);
        if (test_bit(I915_WEDGED, &dev_priv->gpu_error.flags))
 -              seq_puts(m, "Wedged\n");
 +              seq_puts(m, "\tWedged\n");
        if (test_bit(I915_RESET_BACKOFF, &dev_priv->gpu_error.flags))
 -              seq_puts(m, "Reset in progress: struct_mutex backoff\n");
 -      if (waitqueue_active(&dev_priv->gpu_error.wait_queue))
 -              seq_puts(m, "Waiter holding struct mutex\n");
 -      if (waitqueue_active(&dev_priv->gpu_error.reset_queue))
 -              seq_puts(m, "struct_mutex blocked for reset\n");
 +              seq_puts(m, "\tDevice (global) reset in progress\n");
  
        if (!i915_modparams.enable_hangcheck) {
                seq_puts(m, "Hangcheck disabled\n");
@@@ -2019,9 -2023,11 +2020,9 @@@ static const char *rps_power_to_str(uns
  static int i915_rps_boost_info(struct seq_file *m, void *data)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      struct drm_device *dev = &dev_priv->drm;
        struct intel_rps *rps = &dev_priv->gt_pm.rps;
        u32 act_freq = rps->cur_freq;
        intel_wakeref_t wakeref;
 -      struct drm_file *file;
  
        with_intel_runtime_pm_if_in_use(dev_priv, wakeref) {
                if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                   intel_gpu_freq(dev_priv, rps->efficient_freq),
                   intel_gpu_freq(dev_priv, rps->boost_freq));
  
 -      mutex_lock(&dev->filelist_mutex);
 -      list_for_each_entry_reverse(file, &dev->filelist, lhead) {
 -              struct drm_i915_file_private *file_priv = file->driver_priv;
 -              struct task_struct *task;
 -
 -              rcu_read_lock();
 -              task = pid_task(file->pid, PIDTYPE_PID);
 -              seq_printf(m, "%s [%d]: %d boosts\n",
 -                         task ? task->comm : "<unknown>",
 -                         task ? task->pid : -1,
 -                         atomic_read(&file_priv->rps_client.boosts));
 -              rcu_read_unlock();
 -      }
 -      seq_printf(m, "Kernel (anonymous) boosts: %d\n",
 -                 atomic_read(&rps->boosts));
 -      mutex_unlock(&dev->filelist_mutex);
 +      seq_printf(m, "Wait boosts: %d\n", atomic_read(&rps->boosts));
  
        if (INTEL_GEN(dev_priv) >= 6 &&
            rps->enabled &&
@@@ -2586,6 -2607,7 +2587,6 @@@ static in
  i915_edp_psr_debug_set(void *data, u64 val)
  {
        struct drm_i915_private *dev_priv = data;
 -      struct drm_modeset_acquire_ctx ctx;
        intel_wakeref_t wakeref;
        int ret;
  
  
        wakeref = intel_runtime_pm_get(dev_priv);
  
 -      drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
 -
 -retry:
 -      ret = intel_psr_set_debugfs_mode(dev_priv, &ctx, val);
 -      if (ret == -EDEADLK) {
 -              ret = drm_modeset_backoff(&ctx);
 -              if (!ret)
 -                      goto retry;
 -      }
 -
 -      drm_modeset_drop_locks(&ctx);
 -      drm_modeset_acquire_fini(&ctx);
 +      ret = intel_psr_debug_set(dev_priv, val);
  
        intel_runtime_pm_put(dev_priv, wakeref);
  
@@@ -3844,9 -3877,16 +3845,9 @@@ i915_wedged_set(void *data, u64 val
  {
        struct drm_i915_private *i915 = data;
  
 -      /*
 -       * There is no safeguard against this debugfs entry colliding
 -       * with the hangcheck calling same i915_handle_error() in
 -       * parallel, causing an explosion. For now we assume that the
 -       * test harness is responsible enough not to inject gpu hangs
 -       * while it is writing to 'i915_wedged'
 -       */
 -
 -      if (i915_reset_backoff(&i915->gpu_error))
 -              return -EAGAIN;
 +      /* Flush any previous reset before applying for a new one */
 +      wait_event(i915->gpu_error.reset_queue,
 +                 !test_bit(I915_RESET_BACKOFF, &i915->gpu_error.flags));
  
        i915_handle_error(i915, val, I915_ERROR_CAPTURE,
                          "Manually set wedged engine mask = %llx", val);
index 5c1b9d44b7d341604a97b55a27dd8288eece2e08,6728ea5c71d4c2916a37daa20ec767252a96d0ff..b421bc7a2e261c4c802d1eeeac5c642d6a913a9f
@@@ -26,6 -26,7 +26,7 @@@
   */
  
  #include <drm/drm_vma_manager.h>
+ #include <drm/drm_pci.h>
  #include <drm/i915_drm.h>
  #include <linux/dma-fence-array.h>
  #include <linux/kthread.h>
@@@ -36,6 -37,7 +37,7 @@@
  #include <linux/swap.h>
  #include <linux/pci.h>
  #include <linux/dma-buf.h>
+ #include <linux/mman.h>
  
  #include "i915_drv.h"
  #include "i915_gem_clflush.h"
@@@ -98,6 -100,47 +100,6 @@@ static void i915_gem_info_remove_obj(st
        spin_unlock(&dev_priv->mm.object_stat_lock);
  }
  
 -static int
 -i915_gem_wait_for_error(struct i915_gpu_error *error)
 -{
 -      int ret;
 -
 -      might_sleep();
 -
 -      /*
 -       * Only wait 10 seconds for the gpu reset to complete to avoid hanging
 -       * userspace. If it takes that long something really bad is going on and
 -       * we should simply try to bail out and fail as gracefully as possible.
 -       */
 -      ret = wait_event_interruptible_timeout(error->reset_queue,
 -                                             !i915_reset_backoff(error),
 -                                             I915_RESET_TIMEOUT);
 -      if (ret == 0) {
 -              DRM_ERROR("Timed out waiting for the gpu reset to complete\n");
 -              return -EIO;
 -      } else if (ret < 0) {
 -              return ret;
 -      } else {
 -              return 0;
 -      }
 -}
 -
 -int i915_mutex_lock_interruptible(struct drm_device *dev)
 -{
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 -      int ret;
 -
 -      ret = i915_gem_wait_for_error(&dev_priv->gpu_error);
 -      if (ret)
 -              return ret;
 -
 -      ret = mutex_lock_interruptible(&dev->struct_mutex);
 -      if (ret)
 -              return ret;
 -
 -      return 0;
 -}
 -
  static u32 __i915_gem_park(struct drm_i915_private *i915)
  {
        intel_wakeref_t wakeref;
@@@ -416,7 -459,8 +418,7 @@@ int i915_gem_object_unbind(struct drm_i
  static long
  i915_gem_object_wait_fence(struct dma_fence *fence,
                           unsigned int flags,
 -                         long timeout,
 -                         struct intel_rps_client *rps_client)
 +                         long timeout)
  {
        struct i915_request *rq;
  
        if (i915_request_completed(rq))
                goto out;
  
 -      /*
 -       * This client is about to stall waiting for the GPU. In many cases
 -       * this is undesirable and limits the throughput of the system, as
 -       * many clients cannot continue processing user input/output whilst
 -       * blocked. RPS autotuning may take tens of milliseconds to respond
 -       * to the GPU load and thus incurs additional latency for the client.
 -       * We can circumvent that by promoting the GPU frequency to maximum
 -       * before we wait. This makes the GPU throttle up much more quickly
 -       * (good for benchmarks and user experience, e.g. window animations),
 -       * but at a cost of spending more power processing the workload
 -       * (bad for battery). Not all clients even want their results
 -       * immediately and for them we should just let the GPU select its own
 -       * frequency to maximise efficiency. To prevent a single client from
 -       * forcing the clocks too high for the whole system, we only allow
 -       * each client to waitboost once in a busy period.
 -       */
 -      if (rps_client && !i915_request_started(rq)) {
 -              if (INTEL_GEN(rq->i915) >= 6)
 -                      gen6_rps_boost(rq, rps_client);
 -      }
 -
        timeout = i915_request_wait(rq, flags, timeout);
  
  out:
  static long
  i915_gem_object_wait_reservation(struct reservation_object *resv,
                                 unsigned int flags,
 -                               long timeout,
 -                               struct intel_rps_client *rps_client)
 +                               long timeout)
  {
        unsigned int seq = __read_seqcount_begin(&resv->seq);
        struct dma_fence *excl;
  
                for (i = 0; i < count; i++) {
                        timeout = i915_gem_object_wait_fence(shared[i],
 -                                                           flags, timeout,
 -                                                           rps_client);
 +                                                           flags, timeout);
                        if (timeout < 0)
                                break;
  
        }
  
        if (excl && timeout >= 0)
 -              timeout = i915_gem_object_wait_fence(excl, flags, timeout,
 -                                                   rps_client);
 +              timeout = i915_gem_object_wait_fence(excl, flags, timeout);
  
        dma_fence_put(excl);
  
@@@ -584,19 -652,30 +586,19 @@@ i915_gem_object_wait_priority(struct dr
   * @obj: i915 gem object
   * @flags: how to wait (under a lock, for all rendering or just for writes etc)
   * @timeout: how long to wait
 - * @rps_client: client (user process) to charge for any waitboosting
   */
  int
  i915_gem_object_wait(struct drm_i915_gem_object *obj,
                     unsigned int flags,
 -                   long timeout,
 -                   struct intel_rps_client *rps_client)
 +                   long timeout)
  {
        might_sleep();
        GEM_BUG_ON(timeout < 0);
  
 -      timeout = i915_gem_object_wait_reservation(obj->resv,
 -                                                 flags, timeout,
 -                                                 rps_client);
 +      timeout = i915_gem_object_wait_reservation(obj->resv, flags, timeout);
        return timeout < 0 ? timeout : 0;
  }
  
 -static struct intel_rps_client *to_rps_client(struct drm_file *file)
 -{
 -      struct drm_i915_file_private *fpriv = file->driver_priv;
 -
 -      return &fpriv->rps_client;
 -}
 -
  static int
  i915_gem_phys_pwrite(struct drm_i915_gem_object *obj,
                     struct drm_i915_gem_pwrite *args,
@@@ -802,7 -881,8 +804,7 @@@ int i915_gem_obj_prepare_shmem_read(str
        ret = i915_gem_object_wait(obj,
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_LOCKED,
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 NULL);
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                return ret;
  
@@@ -854,7 -934,8 +856,7 @@@ int i915_gem_obj_prepare_shmem_write(st
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_LOCKED |
                                   I915_WAIT_ALL,
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 NULL);
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                return ret;
  
@@@ -1116,7 -1197,8 +1118,7 @@@ i915_gem_pread_ioctl(struct drm_device 
  
        ret = i915_gem_object_wait(obj,
                                   I915_WAIT_INTERRUPTIBLE,
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 to_rps_client(file));
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                goto out;
  
@@@ -1415,7 -1497,8 +1417,7 @@@ i915_gem_pwrite_ioctl(struct drm_devic
        ret = i915_gem_object_wait(obj,
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_ALL,
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 to_rps_client(file));
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                goto err;
  
@@@ -1513,7 -1596,8 +1515,7 @@@ i915_gem_set_domain_ioctl(struct drm_de
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_PRIORITY |
                                   (write_domain ? I915_WAIT_ALL : 0),
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 to_rps_client(file));
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (err)
                goto out;
  
@@@ -1803,7 -1887,6 +1805,7 @@@ vm_fault_t i915_gem_fault(struct vm_fau
        intel_wakeref_t wakeref;
        struct i915_vma *vma;
        pgoff_t page_offset;
 +      int srcu;
        int ret;
  
        /* Sanity check that we allow writing into this object */
         */
        ret = i915_gem_object_wait(obj,
                                   I915_WAIT_INTERRUPTIBLE,
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 NULL);
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                goto err;
  
                goto err_unlock;
        }
  
 -
        /* Now pin it into the GTT as needed */
        vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
                                       PIN_MAPPABLE |
        if (ret)
                goto err_unpin;
  
 +      srcu = i915_reset_trylock(dev_priv);
 +      if (srcu < 0) {
 +              ret = srcu;
 +              goto err_fence;
 +      }
 +
        /* Finally, remap it using the new GTT offset */
        ret = remap_io_mapping(area,
                               area->vm_start + (vma->ggtt_view.partial.offset << PAGE_SHIFT),
                               min_t(u64, vma->size, area->vm_end - area->vm_start),
                               &ggtt->iomap);
        if (ret)
 -              goto err_fence;
 +              goto err_reset;
  
        /* Mark as being mmapped into userspace for later revocation */
        assert_rpm_wakelock_held(dev_priv);
  
        i915_vma_set_ggtt_write(vma);
  
 +err_reset:
 +      i915_reset_unlock(dev_priv, srcu);
  err_fence:
        i915_vma_unpin_fence(vma);
  err_unpin:
@@@ -3153,7 -3230,8 +3155,7 @@@ i915_gem_wait_ioctl(struct drm_device *
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_PRIORITY |
                                   I915_WAIT_ALL,
 -                                 to_wait_timeout(args->timeout_ns),
 -                                 to_rps_client(file));
 +                                 to_wait_timeout(args->timeout_ns));
  
        if (args->timeout_ns > 0) {
                args->timeout_ns -= ktime_to_ns(ktime_sub(ktime_get(), start));
@@@ -3222,7 -3300,7 +3224,7 @@@ wait_for_timelines(struct drm_i915_priv
                 * stalls, so allow the gpu to boost to maximum clocks.
                 */
                if (flags & I915_WAIT_FOR_IDLE_BOOST)
 -                      gen6_rps_boost(rq, NULL);
 +                      gen6_rps_boost(rq);
  
                timeout = i915_request_wait(rq, flags, timeout);
                i915_request_put(rq);
@@@ -3317,7 -3395,8 +3319,7 @@@ i915_gem_object_set_to_wc_domain(struc
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_LOCKED |
                                   (write ? I915_WAIT_ALL : 0),
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 NULL);
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                return ret;
  
@@@ -3379,7 -3458,8 +3381,7 @@@ i915_gem_object_set_to_gtt_domain(struc
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_LOCKED |
                                   (write ? I915_WAIT_ALL : 0),
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 NULL);
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                return ret;
  
@@@ -3494,7 -3574,8 +3496,7 @@@ restart
                                           I915_WAIT_INTERRUPTIBLE |
                                           I915_WAIT_LOCKED |
                                           I915_WAIT_ALL,
 -                                         MAX_SCHEDULE_TIMEOUT,
 -                                         NULL);
 +                                         MAX_SCHEDULE_TIMEOUT);
                if (ret)
                        return ret;
  
@@@ -3632,7 -3713,8 +3634,7 @@@ int i915_gem_set_caching_ioctl(struct d
  
        ret = i915_gem_object_wait(obj,
                                   I915_WAIT_INTERRUPTIBLE,
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 to_rps_client(file));
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                goto out;
  
@@@ -3758,7 -3840,8 +3760,7 @@@ i915_gem_object_set_to_cpu_domain(struc
                                   I915_WAIT_INTERRUPTIBLE |
                                   I915_WAIT_LOCKED |
                                   (write ? I915_WAIT_ALL : 0),
 -                                 MAX_SCHEDULE_TIMEOUT,
 -                                 NULL);
 +                                 MAX_SCHEDULE_TIMEOUT);
        if (ret)
                return ret;
  
@@@ -5261,7 -5344,6 +5263,7 @@@ int i915_gem_init_early(struct drm_i915
        init_waitqueue_head(&dev_priv->gpu_error.wait_queue);
        init_waitqueue_head(&dev_priv->gpu_error.reset_queue);
        mutex_init(&dev_priv->gpu_error.wedge_mutex);
 +      init_srcu_struct(&dev_priv->gpu_error.reset_backoff_srcu);
  
        atomic_set(&dev_priv->mm.bsd_engine_dispatch_index, 0);
  
@@@ -5294,8 -5376,6 +5296,8 @@@ void i915_gem_cleanup_early(struct drm_
        GEM_BUG_ON(atomic_read(&dev_priv->mm.free_count));
        WARN_ON(dev_priv->mm.object_count);
  
 +      cleanup_srcu_struct(&dev_priv->gpu_error.reset_backoff_srcu);
 +
        kmem_cache_destroy(dev_priv->priorities);
        kmem_cache_destroy(dev_priv->dependencies);
        kmem_cache_destroy(dev_priv->requests);
index 292e31cb8fb141b063daaa92ef02300e4022b01d,441d2674b2725227116b5cd852779e86920f5fa0..92bb32ed27fb815a1a4427690685d1dc657e9b81
@@@ -31,6 -31,8 +31,8 @@@
  #include <linux/sysrq.h>
  #include <linux/slab.h>
  #include <linux/circ_buf.h>
+ #include <drm/drm_irq.h>
+ #include <drm/drm_drv.h>
  #include <drm/i915_drm.h>
  #include "i915_drv.h"
  #include "i915_trace.h"
@@@ -1691,9 -1693,7 +1693,9 @@@ static void display_pipe_crc_irq_handle
  {
        struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe];
        struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
 -      u32 crcs[5];
 +      u32 crcs[5] = { crc0, crc1, crc2, crc3, crc4 };
 +
 +      trace_intel_pipe_crc(crtc, crcs);
  
        spin_lock(&pipe_crc->lock);
        /*
        }
        spin_unlock(&pipe_crc->lock);
  
 -      crcs[0] = crc0;
 -      crcs[1] = crc1;
 -      crcs[2] = crc2;
 -      crcs[3] = crc3;
 -      crcs[4] = crc4;
        drm_crtc_add_crc_entry(&crtc->base, true,
                                drm_crtc_accurate_vblank_count(&crtc->base),
                                crcs);
index e1529a5a0af49830a552cffa2895792a30ed1aa5,66f82f3f050f34aa1a6756800b2436ceab50c9ab..c4d6b8da9b032fb41e66296d1d458ef54e8dd0dd
@@@ -26,6 -26,8 +26,8 @@@
  #include <linux/vgaarb.h>
  #include <linux/vga_switcheroo.h>
  
+ #include <drm/drm_drv.h>
  #include "i915_active.h"
  #include "i915_drv.h"
  #include "i915_selftest.h"
@@@ -73,7 -75,7 +75,7 @@@
                   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
        }
  #define GLK_COLORS \
 -      .color = { .degamma_lut_size = 0, .gamma_lut_size = 1024, \
 +      .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
                   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
                                        DRM_COLOR_LUT_EQUAL_CHANNELS, \
        }
@@@ -646,8 -648,7 +648,8 @@@ static const struct intel_device_info i
        }, \
        GEN(11), \
        .ddb_size = 2048, \
 -      .has_logical_ring_elsq = 1
 +      .has_logical_ring_elsq = 1, \
 +      .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024 }
  
  static const struct intel_device_info intel_icelake_11_info = {
        GEN11_FEATURES,
index b3b4d78d1dc098d65a0d9e11aa2e360899aafc88,eab313c3163c91e97e6d1e4449e12d963ca6773f..0d9cedb892b0cbe22a17d7ef6aa06dd2b9b1ea24
@@@ -6,6 -6,8 +6,8 @@@
  #include <linux/types.h>
  #include <linux/tracepoint.h>
  
+ #include <drm/drm_drv.h>
  #include "i915_drv.h"
  #include "intel_drv.h"
  #include "intel_ringbuffer.h"
  
  /* watermark/fifo updates */
  
 +TRACE_EVENT(intel_pipe_enable,
 +          TP_PROTO(struct drm_i915_private *dev_priv, enum pipe pipe),
 +          TP_ARGS(dev_priv, pipe),
 +
 +          TP_STRUCT__entry(
 +                           __array(u32, frame, 3)
 +                           __array(u32, scanline, 3)
 +                           __field(enum pipe, pipe)
 +                           ),
 +
 +          TP_fast_assign(
 +                         enum pipe _pipe;
 +                         for_each_pipe(dev_priv, _pipe) {
 +                                 __entry->frame[_pipe] =
 +                                         dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, _pipe);
 +                                 __entry->scanline[_pipe] =
 +                                         intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, _pipe));
 +                         }
 +                         __entry->pipe = pipe;
 +                         ),
 +
 +          TP_printk("pipe %c enable, pipe A: frame=%u, scanline=%u, pipe B: frame=%u, scanline=%u, pipe C: frame=%u, scanline=%u",
 +                    pipe_name(__entry->pipe),
 +                    __entry->frame[PIPE_A], __entry->scanline[PIPE_A],
 +                    __entry->frame[PIPE_B], __entry->scanline[PIPE_B],
 +                    __entry->frame[PIPE_C], __entry->scanline[PIPE_C])
 +);
 +
 +TRACE_EVENT(intel_pipe_disable,
 +          TP_PROTO(struct drm_i915_private *dev_priv, enum pipe pipe),
 +          TP_ARGS(dev_priv, pipe),
 +
 +          TP_STRUCT__entry(
 +                           __array(u32, frame, 3)
 +                           __array(u32, scanline, 3)
 +                           __field(enum pipe, pipe)
 +                           ),
 +
 +          TP_fast_assign(
 +                         enum pipe _pipe;
 +                         for_each_pipe(dev_priv, _pipe) {
 +                                 __entry->frame[_pipe] =
 +                                         dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, _pipe);
 +                                 __entry->scanline[_pipe] =
 +                                         intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, _pipe));
 +                         }
 +                         __entry->pipe = pipe;
 +                         ),
 +
 +          TP_printk("pipe %c disable, pipe A: frame=%u, scanline=%u, pipe B: frame=%u, scanline=%u, pipe C: frame=%u, scanline=%u",
 +                    pipe_name(__entry->pipe),
 +                    __entry->frame[PIPE_A], __entry->scanline[PIPE_A],
 +                    __entry->frame[PIPE_B], __entry->scanline[PIPE_B],
 +                    __entry->frame[PIPE_C], __entry->scanline[PIPE_C])
 +);
 +
 +TRACE_EVENT(intel_pipe_crc,
 +          TP_PROTO(struct intel_crtc *crtc, const u32 *crcs),
 +          TP_ARGS(crtc, crcs),
 +
 +          TP_STRUCT__entry(
 +                           __field(enum pipe, pipe)
 +                           __field(u32, frame)
 +                           __field(u32, scanline)
 +                           __array(u32, crcs, 5)
 +                           ),
 +
 +          TP_fast_assign(
 +                         __entry->pipe = crtc->pipe;
 +                         __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
 +                                                                                     crtc->pipe);
 +                         __entry->scanline = intel_get_crtc_scanline(crtc);
 +                         memcpy(__entry->crcs, crcs, sizeof(__entry->crcs));
 +                         ),
 +
 +          TP_printk("pipe %c, frame=%u, scanline=%u crc=%08x %08x %08x %08x %08x",
 +                    pipe_name(__entry->pipe), __entry->frame, __entry->scanline,
 +                    __entry->crcs[0], __entry->crcs[1], __entry->crcs[2],
 +                    __entry->crcs[3], __entry->crcs[4])
 +);
 +
  TRACE_EVENT(intel_cpu_fifo_underrun,
            TP_PROTO(struct drm_i915_private *dev_priv, enum pipe pipe),
            TP_ARGS(dev_priv, pipe),
index 021b94b78862f1f9249ec677e5cbf984f327eddb,db09659044397b17fe61731e0a37b7d0fc6e470b..7961cf0e695160e23686663c20c21cad63d337ed
@@@ -32,7 -32,9 +32,9 @@@
   */
  
  #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_fourcc.h>
  #include <drm/drm_plane_helper.h>
  #include "intel_drv.h"
  
  struct intel_plane *intel_plane_alloc(void)
@@@ -119,7 -121,6 +121,7 @@@ int intel_plane_atomic_check_with_state
  
        new_crtc_state->active_planes &= ~BIT(plane->id);
        new_crtc_state->nv12_planes &= ~BIT(plane->id);
 +      new_crtc_state->c8_planes &= ~BIT(plane->id);
        new_plane_state->base.visible = false;
  
        if (!new_plane_state->base.crtc && !old_plane_state->base.crtc)
            new_plane_state->base.fb->format->format == DRM_FORMAT_NV12)
                new_crtc_state->nv12_planes |= BIT(plane->id);
  
 +      if (new_plane_state->base.visible &&
 +          new_plane_state->base.fb->format->format == DRM_FORMAT_C8)
 +              new_crtc_state->c8_planes |= BIT(plane->id);
 +
        if (new_plane_state->base.visible || old_plane_state->base.visible)
                new_crtc_state->update_planes |= BIT(plane->id);
  
@@@ -217,35 -214,6 +219,35 @@@ skl_next_plane_to_commit(struct intel_a
        return NULL;
  }
  
 +void intel_update_plane(struct intel_plane *plane,
 +                      const struct intel_crtc_state *crtc_state,
 +                      const struct intel_plane_state *plane_state)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +
 +      trace_intel_update_plane(&plane->base, crtc);
 +      plane->update_plane(plane, crtc_state, plane_state);
 +}
 +
 +void intel_update_slave(struct intel_plane *plane,
 +                      const struct intel_crtc_state *crtc_state,
 +                      const struct intel_plane_state *plane_state)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +
 +      trace_intel_update_plane(&plane->base, crtc);
 +      plane->update_slave(plane, crtc_state, plane_state);
 +}
 +
 +void intel_disable_plane(struct intel_plane *plane,
 +                       const struct intel_crtc_state *crtc_state)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +
 +      trace_intel_disable_plane(&plane->base, crtc);
 +      plane->disable_plane(plane, crtc_state);
 +}
 +
  void skl_update_planes_on_crtc(struct intel_atomic_state *state,
                               struct intel_crtc *crtc)
  {
                        intel_atomic_get_new_plane_state(state, plane);
  
                if (new_plane_state->base.visible) {
 -                      trace_intel_update_plane(&plane->base, crtc);
 -                      plane->update_plane(plane, new_crtc_state, new_plane_state);
 +                      intel_update_plane(plane, new_crtc_state, new_plane_state);
                } else if (new_plane_state->slave) {
                        struct intel_plane *master =
                                new_plane_state->linked_plane;
                        new_plane_state =
                                intel_atomic_get_new_plane_state(state, master);
  
 -                      trace_intel_update_plane(&plane->base, crtc);
 -                      plane->update_slave(plane, new_crtc_state, new_plane_state);
 +                      intel_update_slave(plane, new_crtc_state, new_plane_state);
                } else {
 -                      trace_intel_disable_plane(&plane->base, crtc);
 -                      plane->disable_plane(plane, new_crtc_state);
 +                      intel_disable_plane(plane, new_crtc_state);
                }
        }
  }
@@@ -309,10 -280,13 +311,10 @@@ void i9xx_update_planes_on_crtc(struct 
                    !(update_mask & BIT(plane->id)))
                        continue;
  
 -              if (new_plane_state->base.visible) {
 -                      trace_intel_update_plane(&plane->base, crtc);
 -                      plane->update_plane(plane, new_crtc_state, new_plane_state);
 -              } else {
 -                      trace_intel_disable_plane(&plane->base, crtc);
 -                      plane->disable_plane(plane, new_crtc_state);
 -              }
 +              if (new_plane_state->base.visible)
 +                      intel_update_plane(plane, new_crtc_state, new_plane_state);
 +              else
 +                      intel_disable_plane(plane, new_crtc_state);
        }
  }
  
index e53d33edc85d7b282dc37e030112096713b2e2e1,ccb616351bba725052ea3a752cc5263744d58af2..415d8968f2c58a75d808d6cab7243c2d3df0c1bf
   *    Eric Anholt <[email protected]>
   */
  
- #include <linux/module.h>
- #include <linux/input.h>
  #include <linux/i2c.h>
+ #include <linux/input.h>
+ #include <linux/intel-iommu.h>
  #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/reservation.h>
  #include <linux/slab.h>
  #include <linux/vgaarb.h>
- #include <drm/drm_edid.h>
- #include <drm/i915_drm.h>
  #include <drm/drm_atomic.h>
  #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_atomic_uapi.h>
  #include <drm/drm_dp_helper.h>
- #include <drm/drm_crtc_helper.h>
+ #include <drm/drm_edid.h>
+ #include <drm/drm_fourcc.h>
  #include <drm/drm_plane_helper.h>
+ #include <drm/drm_probe_helper.h>
  #include <drm/drm_rect.h>
- #include <drm/drm_atomic_uapi.h>
- #include <linux/intel-iommu.h>
- #include <linux/reservation.h>
+ #include <drm/i915_drm.h>
+ #include "i915_drv.h"
+ #include "i915_gem_clflush.h"
+ #include "i915_trace.h"
+ #include "intel_drv.h"
+ #include "intel_dsi.h"
+ #include "intel_frontbuffer.h"
  
  #include "intel_drv.h"
  #include "intel_dsi.h"
@@@ -1821,8 -1830,6 +1830,8 @@@ static void intel_enable_pipe(const str
                /* FIXME: assert CPU port conditions for SNB+ */
        }
  
 +      trace_intel_pipe_enable(dev_priv, pipe);
 +
        reg = PIPECONF(cpu_transcoder);
        val = I915_READ(reg);
        if (val & PIPECONF_ENABLE) {
@@@ -1862,8 -1869,6 +1871,8 @@@ static void intel_disable_pipe(const st
         */
        assert_planes_disabled(crtc);
  
 +      trace_intel_pipe_disable(dev_priv, pipe);
 +
        reg = PIPECONF(cpu_transcoder);
        val = I915_READ(reg);
        if ((val & PIPECONF_ENABLE) == 0)
@@@ -2820,7 -2825,8 +2829,7 @@@ static void intel_plane_disable_noatomi
        if (plane->id == PLANE_PRIMARY)
                intel_pre_disable_primary_noatomic(&crtc->base);
  
 -      trace_intel_disable_plane(&plane->base, crtc);
 -      plane->disable_plane(plane, crtc_state);
 +      intel_disable_plane(plane, crtc_state);
  }
  
  static void
@@@ -3224,10 -3230,9 +3233,10 @@@ static u32 i9xx_plane_ctl_crtc(const st
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        u32 dspcntr = 0;
  
 -      dspcntr |= DISPPLANE_GAMMA_ENABLE;
 +      if (crtc_state->gamma_enable)
 +              dspcntr |= DISPPLANE_GAMMA_ENABLE;
  
 -      if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
 +      if (crtc_state->csc_enable)
                dspcntr |= DISPPLANE_PIPE_CSC_ENABLE;
  
        if (INTEL_GEN(dev_priv) < 5)
@@@ -3454,7 -3459,7 +3463,7 @@@ static void i9xx_disable_plane(struct i
         *
         * On pre-g4x there is no way to gamma correct the
         * pipe bottom color but we'll keep on doing this
 -       * anyway.
 +       * anyway so that the crtc state readout works correctly.
         */
        dspcntr = i9xx_plane_ctl_crtc(crtc_state);
  
@@@ -3705,11 -3710,8 +3714,11 @@@ u32 skl_plane_ctl_crtc(const struct int
        if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
                return plane_ctl;
  
 -      plane_ctl |= PLANE_CTL_PIPE_GAMMA_ENABLE;
 -      plane_ctl |= PLANE_CTL_PIPE_CSC_ENABLE;
 +      if (crtc_state->gamma_enable)
 +              plane_ctl |= PLANE_CTL_PIPE_GAMMA_ENABLE;
 +
 +      if (crtc_state->csc_enable)
 +              plane_ctl |= PLANE_CTL_PIPE_CSC_ENABLE;
  
        return plane_ctl;
  }
@@@ -3761,11 -3763,8 +3770,11 @@@ u32 glk_plane_color_ctl_crtc(const stru
        if (INTEL_GEN(dev_priv) >= 11)
                return plane_color_ctl;
  
 -      plane_color_ctl |= PLANE_COLOR_PIPE_GAMMA_ENABLE;
 -      plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE;
 +      if (crtc_state->gamma_enable)
 +              plane_color_ctl |= PLANE_COLOR_PIPE_GAMMA_ENABLE;
 +
 +      if (crtc_state->csc_enable)
 +              plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE;
  
        return plane_color_ctl;
  }
@@@ -3922,6 -3921,9 +3931,6 @@@ void intel_finish_reset(struct drm_i915
                 * The display has been reset as well,
                 * so need a full re-initialization.
                 */
 -              intel_runtime_pm_disable_interrupts(dev_priv);
 -              intel_runtime_pm_enable_interrupts(dev_priv);
 -
                intel_pps_unlock_regs_wa(dev_priv);
                intel_modeset_init_hw(dev);
                intel_init_clock_gating(dev_priv);
@@@ -3962,6 -3964,12 +3971,6 @@@ static void icl_set_pipe_chicken(struc
         */
        tmp |= PER_PIXEL_ALPHA_BYPASS_EN;
  
 -      /*
 -       * W/A for underruns with linear/X-tiled with
 -       * WM1+ disabled.
 -       */
 -      tmp |= PM_FILL_MAINTAIN_DBUF_FULLNESS;
 -
        I915_WRITE(PIPE_CHICKEN(pipe), tmp);
  }
  
@@@ -4000,6 -4008,16 +4009,6 @@@ static void intel_update_pipe_config(co
                        ironlake_pfit_disable(old_crtc_state);
        }
  
 -      /*
 -       * We don't (yet) allow userspace to control the pipe background color,
 -       * so force it to black, but apply pipe gamma and CSC so that its
 -       * handling will match how we program our planes.
 -       */
 -      if (INTEL_GEN(dev_priv) >= 9)
 -              I915_WRITE(SKL_BOTTOM_COLOR(crtc->pipe),
 -                         SKL_BOTTOM_COLOR_GAMMA_ENABLE |
 -                         SKL_BOTTOM_COLOR_CSC_ENABLE);
 -
        if (INTEL_GEN(dev_priv) >= 11)
                icl_set_pipe_chicken(crtc);
  }
@@@ -5585,7 -5603,7 +5594,7 @@@ static void intel_crtc_disable_planes(s
                    !(update_mask & BIT(plane->id)))
                        continue;
  
 -              plane->disable_plane(plane, new_crtc_state);
 +              intel_disable_plane(plane, new_crtc_state);
  
                if (old_plane_state->base.visible)
                        fb_bits |= plane->frontbuffer_bit;
@@@ -5736,14 -5754,6 +5745,14 @@@ static void intel_encoders_update_pipe(
        }
  }
  
 +static void intel_disable_primary_plane(const struct intel_crtc_state *crtc_state)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_plane *plane = to_intel_plane(crtc->base.primary);
 +
 +      plane->disable_plane(plane, crtc_state);
 +}
 +
  static void ironlake_crtc_enable(struct intel_crtc_state *pipe_config,
                                 struct drm_atomic_state *old_state)
  {
         */
        intel_color_load_luts(pipe_config);
        intel_color_commit(pipe_config);
 +      /* update DSPCNTR to configure gamma for pipe bottom color */
 +      intel_disable_primary_plane(pipe_config);
  
        if (dev_priv->display.initial_watermarks != NULL)
                dev_priv->display.initial_watermarks(old_intel_state, pipe_config);
@@@ -5939,9 -5947,6 +5948,9 @@@ static void haswell_crtc_enable(struct 
         */
        intel_color_load_luts(pipe_config);
        intel_color_commit(pipe_config);
 +      /* update DSPCNTR to configure gamma/csc for pipe bottom color */
 +      if (INTEL_GEN(dev_priv) < 9)
 +              intel_disable_primary_plane(pipe_config);
  
        if (INTEL_GEN(dev_priv) >= 11)
                icl_set_pipe_chicken(intel_crtc);
@@@ -6299,8 -6304,6 +6308,8 @@@ static void valleyview_crtc_enable(stru
  
        intel_color_load_luts(pipe_config);
        intel_color_commit(pipe_config);
 +      /* update DSPCNTR to configure gamma for pipe bottom color */
 +      intel_disable_primary_plane(pipe_config);
  
        dev_priv->display.initial_watermarks(old_intel_state,
                                             pipe_config);
@@@ -6358,8 -6361,6 +6367,8 @@@ static void i9xx_crtc_enable(struct int
  
        intel_color_load_luts(pipe_config);
        intel_color_commit(pipe_config);
 +      /* update DSPCNTR to configure gamma for pipe bottom color */
 +      intel_disable_primary_plane(pipe_config);
  
        if (dev_priv->display.initial_watermarks != NULL)
                dev_priv->display.initial_watermarks(old_intel_state,
@@@ -7700,8 -7701,6 +7709,8 @@@ static void i9xx_set_pipeconf(const str
             crtc_state->limited_color_range)
                pipeconf |= PIPECONF_COLOR_RANGE_SELECT;
  
 +      pipeconf |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
 +
        I915_WRITE(PIPECONF(crtc->pipe), pipeconf);
        POSTING_READ(PIPECONF(crtc->pipe));
  }
@@@ -8109,24 -8108,6 +8118,24 @@@ static void intel_get_crtc_ycbcr_config
        pipe_config->output_format = output;
  }
  
 +static void i9xx_get_pipe_color_config(struct intel_crtc_state *crtc_state)
 +{
 +      struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 +      struct intel_plane *plane = to_intel_plane(crtc->base.primary);
 +      struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 +      enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
 +      u32 tmp;
 +
 +      tmp = I915_READ(DSPCNTR(i9xx_plane));
 +
 +      if (tmp & DISPPLANE_GAMMA_ENABLE)
 +              crtc_state->gamma_enable = true;
 +
 +      if (!HAS_GMCH(dev_priv) &&
 +          tmp & DISPPLANE_PIPE_CSC_ENABLE)
 +              crtc_state->csc_enable = true;
 +}
 +
  static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
                                 struct intel_crtc_state *pipe_config)
  {
            (tmp & PIPECONF_COLOR_RANGE_SELECT))
                pipe_config->limited_color_range = true;
  
 +      pipe_config->gamma_mode = (tmp & PIPECONF_GAMMA_MODE_MASK_I9XX) >>
 +              PIPECONF_GAMMA_MODE_SHIFT;
 +
 +      i9xx_get_pipe_color_config(pipe_config);
 +
        if (INTEL_GEN(dev_priv) < 4)
                pipe_config->double_wide = tmp & PIPECONF_DOUBLE_WIDE;
  
@@@ -8716,8 -8692,6 +8725,8 @@@ static void ironlake_set_pipeconf(cons
        if (crtc_state->limited_color_range)
                val |= PIPECONF_COLOR_RANGE_SELECT;
  
 +      val |= PIPECONF_GAMMA_MODE(crtc_state->gamma_mode);
 +
        I915_WRITE(PIPECONF(pipe), val);
        POSTING_READ(PIPECONF(pipe));
  }
@@@ -9252,11 -9226,6 +9261,11 @@@ static bool ironlake_get_pipe_config(st
        if (tmp & PIPECONF_COLOR_RANGE_SELECT)
                pipe_config->limited_color_range = true;
  
 +      pipe_config->gamma_mode = (tmp & PIPECONF_GAMMA_MODE_MASK_ILK) >>
 +              PIPECONF_GAMMA_MODE_SHIFT;
 +
 +      i9xx_get_pipe_color_config(pipe_config);
 +
        if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) {
                struct intel_shared_dpll *pll;
                enum intel_dpll_id pll_id;
@@@ -9891,18 -9860,6 +9900,18 @@@ static bool haswell_get_pipe_config(str
        pipe_config->gamma_mode =
                I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK;
  
 +      if (INTEL_GEN(dev_priv) >= 9) {
 +              u32 tmp = I915_READ(SKL_BOTTOM_COLOR(crtc->pipe));
 +
 +              if (tmp & SKL_BOTTOM_COLOR_GAMMA_ENABLE)
 +                      pipe_config->gamma_enable = true;
 +
 +              if (tmp & SKL_BOTTOM_COLOR_CSC_ENABLE)
 +                      pipe_config->csc_enable = true;
 +      } else {
 +              i9xx_get_pipe_color_config(pipe_config);
 +      }
 +
        power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
        if (intel_display_power_get_if_enabled(dev_priv, power_domain)) {
                WARN_ON(power_domain_mask & BIT_ULL(power_domain));
@@@ -10073,12 -10030,7 +10082,12 @@@ i845_cursor_max_stride(struct intel_pla
  
  static u32 i845_cursor_ctl_crtc(const struct intel_crtc_state *crtc_state)
  {
 -      return CURSOR_GAMMA_ENABLE;
 +      u32 cntl = 0;
 +
 +      if (crtc_state->gamma_enable)
 +              cntl |= CURSOR_GAMMA_ENABLE;
 +
 +      return cntl;
  }
  
  static u32 i845_cursor_ctl(const struct intel_crtc_state *crtc_state,
@@@ -10232,10 -10184,9 +10241,10 @@@ static u32 i9xx_cursor_ctl_crtc(const s
        if (INTEL_GEN(dev_priv) >= 11)
                return cntl;
  
 -      cntl |= MCURSOR_GAMMA_ENABLE;
 +      if (crtc_state->gamma_enable)
 +              cntl = MCURSOR_GAMMA_ENABLE;
  
 -      if (HAS_DDI(dev_priv))
 +      if (crtc_state->csc_enable)
                cntl |= MCURSOR_PIPE_CSC_ENABLE;
  
        if (INTEL_GEN(dev_priv) < 5 && !IS_G4X(dev_priv))
@@@ -11228,6 -11179,12 +11237,6 @@@ static int intel_crtc_atomic_check(stru
                ret = intel_color_check(pipe_config);
                if (ret)
                        return ret;
 -
 -              /*
 -               * Changing color management on Intel hardware is
 -               * handled as part of planes update.
 -               */
 -              crtc_state->planes_changed = true;
        }
  
        ret = 0;
@@@ -12132,10 -12089,6 +12141,10 @@@ intel_pipe_config_compare(struct drm_i9
  
                PIPE_CONF_CHECK_I(scaler_state.scaler_id);
                PIPE_CONF_CHECK_CLOCK_FUZZY(pixel_rate);
 +
 +              PIPE_CONF_CHECK_X(gamma_mode);
 +              PIPE_CONF_CHECK_BOOL(gamma_enable);
 +              PIPE_CONF_CHECK_BOOL(csc_enable);
        }
  
        PIPE_CONF_CHECK_BOOL(double_wide);
@@@ -12218,15 -12171,12 +12227,15 @@@ static void verify_wm_state(struct drm_
                            struct drm_crtc_state *new_state)
  {
        struct drm_i915_private *dev_priv = to_i915(crtc->dev);
 -      struct skl_ddb_allocation hw_ddb, *sw_ddb;
 -      struct skl_pipe_wm hw_wm, *sw_wm;
 -      struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
 +      struct skl_hw_state {
 +              struct skl_ddb_entry ddb_y[I915_MAX_PLANES];
 +              struct skl_ddb_entry ddb_uv[I915_MAX_PLANES];
 +              struct skl_ddb_allocation ddb;
 +              struct skl_pipe_wm wm;
 +      } *hw;
 +      struct skl_ddb_allocation *sw_ddb;
 +      struct skl_pipe_wm *sw_wm;
        struct skl_ddb_entry *hw_ddb_entry, *sw_ddb_entry;
 -      struct skl_ddb_entry hw_ddb_y[I915_MAX_PLANES];
 -      struct skl_ddb_entry hw_ddb_uv[I915_MAX_PLANES];
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        const enum pipe pipe = intel_crtc->pipe;
        int plane, level, max_level = ilk_wm_max_level(dev_priv);
        if (INTEL_GEN(dev_priv) < 9 || !new_state->active)
                return;
  
 -      skl_pipe_wm_get_hw_state(intel_crtc, &hw_wm);
 +      hw = kzalloc(sizeof(*hw), GFP_KERNEL);
 +      if (!hw)
 +              return;
 +
 +      skl_pipe_wm_get_hw_state(intel_crtc, &hw->wm);
        sw_wm = &to_intel_crtc_state(new_state)->wm.skl.optimal;
  
 -      skl_pipe_ddb_get_hw_state(intel_crtc, hw_ddb_y, hw_ddb_uv);
 +      skl_pipe_ddb_get_hw_state(intel_crtc, hw->ddb_y, hw->ddb_uv);
  
 -      skl_ddb_get_hw_state(dev_priv, &hw_ddb);
 +      skl_ddb_get_hw_state(dev_priv, &hw->ddb);
        sw_ddb = &dev_priv->wm.skl_hw.ddb;
  
 -      if (INTEL_GEN(dev_priv) >= 11)
 -              if (hw_ddb.enabled_slices != sw_ddb->enabled_slices)
 -                      DRM_ERROR("mismatch in DBUF Slices (expected %u, got %u)\n",
 -                                sw_ddb->enabled_slices,
 -                                hw_ddb.enabled_slices);
 +      if (INTEL_GEN(dev_priv) >= 11 &&
 +          hw->ddb.enabled_slices != sw_ddb->enabled_slices)
 +              DRM_ERROR("mismatch in DBUF Slices (expected %u, got %u)\n",
 +                        sw_ddb->enabled_slices,
 +                        hw->ddb.enabled_slices);
 +
        /* planes */
        for_each_universal_plane(dev_priv, pipe, plane) {
 -              hw_plane_wm = &hw_wm.planes[plane];
 +              struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
 +
 +              hw_plane_wm = &hw->wm.planes[plane];
                sw_plane_wm = &sw_wm->planes[plane];
  
                /* Watermarks */
                }
  
                /* DDB */
 -              hw_ddb_entry = &hw_ddb_y[plane];
 +              hw_ddb_entry = &hw->ddb_y[plane];
                sw_ddb_entry = &to_intel_crtc_state(new_state)->wm.skl.plane_ddb_y[plane];
  
                if (!skl_ddb_entry_equal(hw_ddb_entry, sw_ddb_entry)) {
         * once the plane becomes visible, we can skip this check
         */
        if (1) {
 -              hw_plane_wm = &hw_wm.planes[PLANE_CURSOR];
 +              struct skl_plane_wm *hw_plane_wm, *sw_plane_wm;
 +
 +              hw_plane_wm = &hw->wm.planes[PLANE_CURSOR];
                sw_plane_wm = &sw_wm->planes[PLANE_CURSOR];
  
                /* Watermarks */
                }
  
                /* DDB */
 -              hw_ddb_entry = &hw_ddb_y[PLANE_CURSOR];
 +              hw_ddb_entry = &hw->ddb_y[PLANE_CURSOR];
                sw_ddb_entry = &to_intel_crtc_state(new_state)->wm.skl.plane_ddb_y[PLANE_CURSOR];
  
                if (!skl_ddb_entry_equal(hw_ddb_entry, sw_ddb_entry)) {
                                  hw_ddb_entry->start, hw_ddb_entry->end);
                }
        }
 +
 +      kfree(hw);
  }
  
  static void
@@@ -13567,7 -13506,7 +13576,7 @@@ static int do_rps_boost(struct wait_que
         * vblank without our intervention, so leave RPS alone.
         */
        if (!i915_request_started(rq))
 -              gen6_rps_boost(rq, NULL);
 +              gen6_rps_boost(rq);
        i915_request_put(rq);
  
        drm_crtc_vblank_put(wait->crtc);
@@@ -14100,11 -14039,14 +14109,11 @@@ intel_legacy_cursor_update(struct drm_p
         */
        crtc_state->active_planes = new_crtc_state->active_planes;
  
 -      if (plane->state->visible) {
 -              trace_intel_update_plane(plane, to_intel_crtc(crtc));
 -              intel_plane->update_plane(intel_plane, crtc_state,
 -                                        to_intel_plane_state(plane->state));
 -      } else {
 -              trace_intel_disable_plane(plane, to_intel_crtc(crtc));
 -              intel_plane->disable_plane(intel_plane, crtc_state);
 -      }
 +      if (plane->state->visible)
 +              intel_update_plane(intel_plane, crtc_state,
 +                                 to_intel_plane_state(plane->state));
 +      else
 +              intel_disable_plane(intel_plane, crtc_state);
  
        intel_plane_unpin_fb(to_intel_plane_state(old_plane_state));
  
index b4e29b823b04d82b032922dadf9c18ae50ca9f85,15db41394b9ed75d9de8545c8a0faff9efbc9a9b..eec4ed93c335e3485805ab28fbc6aa281ec0d1ad
  #include <drm/i915_drm.h>
  #include "i915_drv.h"
  #include <drm/drm_crtc.h>
- #include <drm/drm_crtc_helper.h>
  #include <drm/drm_encoder.h>
  #include <drm/drm_fb_helper.h>
  #include <drm/drm_dp_dual_mode_helper.h>
  #include <drm/drm_dp_mst_helper.h>
+ #include <drm/drm_probe_helper.h>
  #include <drm/drm_rect.h>
+ #include <drm/drm_vblank.h>
  #include <drm/drm_atomic.h>
  #include <media/cec-notifier.h>
  
@@@ -941,13 -942,9 +942,13 @@@ struct intel_crtc_state 
        /* Gamma mode programmed on the pipe */
        u32 gamma_mode;
  
 +      /* CSC mode programmed on the pipe */
 +      u32 csc_mode;
 +
        /* bitmask of visible planes (enum plane_id) */
        u8 active_planes;
        u8 nv12_planes;
 +      u8 c8_planes;
  
        /* bitmask of planes that will be updated during the commit */
        u8 update_planes;
        /* Output down scaling is done in LSPCON device */
        bool lspcon_downsampling;
  
 +      /* enable pipe gamma? */
 +      bool gamma_enable;
 +
 +      /* enable pipe csc? */
 +      bool csc_enable;
 +
        /* Display Stream compression state */
        struct {
                bool compression_enable;
@@@ -998,6 -989,9 +999,6 @@@ struct intel_crtc 
  
        struct intel_crtc_state *config;
  
 -      /* global reset count when the last flip was submitted */
 -      unsigned int reset_count;
 -
        /* Access to these should be protected by dev_priv->irq_lock. */
        bool cpu_fifo_underrun_disabled;
        bool pch_fifo_underrun_disabled;
@@@ -2084,9 -2078,9 +2085,9 @@@ void intel_psr_enable(struct intel_dp *
                      const struct intel_crtc_state *crtc_state);
  void intel_psr_disable(struct intel_dp *intel_dp,
                      const struct intel_crtc_state *old_crtc_state);
 -int intel_psr_set_debugfs_mode(struct drm_i915_private *dev_priv,
 -                             struct drm_modeset_acquire_ctx *ctx,
 -                             u64 value);
 +void intel_psr_update(struct intel_dp *intel_dp,
 +                    const struct intel_crtc_state *crtc_state);
 +int intel_psr_debug_set(struct drm_i915_private *dev_priv, u64 value);
  void intel_psr_invalidate(struct drm_i915_private *dev_priv,
                          unsigned frontbuffer_bits,
                          enum fb_op_origin origin);
@@@ -2266,7 -2260,7 +2267,7 @@@ void intel_suspend_gt_powersave(struct 
  void gen6_rps_busy(struct drm_i915_private *dev_priv);
  void gen6_rps_reset_ei(struct drm_i915_private *dev_priv);
  void gen6_rps_idle(struct drm_i915_private *dev_priv);
 -void gen6_rps_boost(struct i915_request *rq, struct intel_rps_client *rps);
 +void gen6_rps_boost(struct i915_request *rq);
  void g4x_wm_get_hw_state(struct drm_i915_private *dev_priv);
  void vlv_wm_get_hw_state(struct drm_i915_private *dev_priv);
  void ilk_wm_get_hw_state(struct drm_i915_private *dev_priv);
@@@ -2378,14 -2372,6 +2379,14 @@@ int intel_atomic_setup_scalers(struct d
                               struct intel_crtc_state *crtc_state);
  
  /* intel_atomic_plane.c */
 +void intel_update_plane(struct intel_plane *plane,
 +                      const struct intel_crtc_state *crtc_state,
 +                      const struct intel_plane_state *plane_state);
 +void intel_update_slave(struct intel_plane *plane,
 +                      const struct intel_crtc_state *crtc_state,
 +                      const struct intel_plane_state *plane_state);
 +void intel_disable_plane(struct intel_plane *plane,
 +                       const struct intel_crtc_state *crtc_state);
  struct intel_plane *intel_plane_alloc(void);
  void intel_plane_free(struct intel_plane *plane);
  struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plane);
index fc02e6f813092676c03f1995d7f48a3353b66247,376ffe842e2678d1f31ee68acd38908cff8a85d9..e8f694b57b8ac857528824051ddcc42016e86239
@@@ -39,6 -39,8 +39,8 @@@
  
  #include <drm/drm_crtc.h>
  #include <drm/drm_fb_helper.h>
+ #include <drm/drm_fourcc.h>
  #include "intel_drv.h"
  #include "intel_frontbuffer.h"
  #include <drm/i915_drm.h>
@@@ -336,8 -338,8 +338,8 @@@ static bool intel_fb_initial_config(str
                                    bool *enabled, int width, int height)
  {
        struct drm_i915_private *dev_priv = to_i915(fb_helper->dev);
 -      unsigned long conn_configured, conn_seq, mask;
        unsigned int count = min(fb_helper->connector_count, BITS_PER_LONG);
 +      unsigned long conn_configured, conn_seq;
        int i, j;
        bool *save_enabled;
        bool fallback = true, ret = true;
                drm_modeset_backoff(&ctx);
  
        memcpy(save_enabled, enabled, count);
 -      mask = GENMASK(count - 1, 0);
 +      conn_seq = GENMASK(count - 1, 0);
        conn_configured = 0;
  retry:
 -      conn_seq = conn_configured;
        for (i = 0; i < count; i++) {
                struct drm_fb_helper_connector *fb_conn;
                struct drm_connector *connector;
                if (conn_configured & BIT(i))
                        continue;
  
 -              if (conn_seq == 0 && !connector->has_tile)
 +              /* First pass, only consider tiled connectors */
 +              if (conn_seq == GENMASK(count - 1, 0) && !connector->has_tile)
                        continue;
  
                if (connector->status == connector_status_connected)
                conn_configured |= BIT(i);
        }
  
 -      if ((conn_configured & mask) != mask && conn_configured != conn_seq)
 +      if (conn_configured != conn_seq) { /* repeat until no more are found */
 +              conn_seq = conn_configured;
                goto retry;
 +      }
  
        /*
         * If the BIOS didn't enable everything it could, fall back to have the
index c7ec9b16904621488ecebf6887aa7180f1b8da4c,54307f1df6cf26bb855a7291c7f1aec0b5cdc475..4c0e43caa5cdd71fbe6b06de482e8702f47426b7
   */
  
  #include <linux/cpufreq.h>
+ #include <linux/module.h>
  #include <linux/pm_runtime.h>
+ #include <drm/drm_atomic_helper.h>
+ #include <drm/drm_fourcc.h>
  #include <drm/drm_plane_helper.h>
  #include "i915_drv.h"
  #include "intel_drv.h"
  #include "../../../platform/x86/intel_ips.h"
- #include <linux/module.h>
- #include <drm/drm_atomic_helper.h>
  
  /**
   * DOC: RC6
@@@ -335,12 -338,12 +338,12 @@@ static void chv_set_memory_pm5(struct d
  
        mutex_lock(&dev_priv->pcu_lock);
  
 -      val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
 +      val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
        if (enable)
                val |= DSP_MAXFIFO_PM5_ENABLE;
        else
                val &= ~DSP_MAXFIFO_PM5_ENABLE;
 -      vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
 +      vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
  
        mutex_unlock(&dev_priv->pcu_lock);
  }
@@@ -4463,13 -4466,6 +4466,13 @@@ skl_allocate_pipe_ddb(struct intel_crtc
                for_each_plane_id_on_crtc(intel_crtc, plane_id) {
                        wm = &cstate->wm.skl.optimal.planes[plane_id];
                        memset(&wm->wm[level], 0, sizeof(wm->wm[level]));
 +
 +                      /* W/A for underruns with WM1+ disabled */
 +                      if (IS_ICELAKE(dev_priv) &&
 +                          level == 1 && wm->wm[0].plane_en) {
 +                              wm->wm[level].plane_res_b = wm->wm[0].plane_res_b;
 +                              wm->wm[level].ignore_lines = true;
 +                      }
                }
        }
  
@@@ -5060,12 -5056,11 +5063,12 @@@ static void skl_write_wm_level(struct d
  {
        u32 val = 0;
  
 -      if (level->plane_en) {
 +      if (level->plane_en)
                val |= PLANE_WM_EN;
 -              val |= level->plane_res_b;
 -              val |= level->plane_res_l << PLANE_WM_LINES_SHIFT;
 -      }
 +      if (level->ignore_lines)
 +              val |= PLANE_WM_IGNORE_LINES;
 +      val |= level->plane_res_b;
 +      val |= level->plane_res_l << PLANE_WM_LINES_SHIFT;
  
        I915_WRITE_FW(reg, val);
  }
@@@ -5131,7 -5126,6 +5134,7 @@@ bool skl_wm_level_equals(const struct s
                         const struct skl_wm_level *l2)
  {
        return l1->plane_en == l2->plane_en &&
 +              l1->ignore_lines == l2->ignore_lines &&
                l1->plane_res_l == l2->plane_res_l &&
                l1->plane_res_b == l2->plane_res_b;
  }
@@@ -5275,11 -5269,6 +5278,11 @@@ skl_compute_ddb(struct intel_atomic_sta
        return 0;
  }
  
 +static char enast(bool enable)
 +{
 +      return enable ? '*' : ' ';
 +}
 +
  static void
  skl_print_wm_changes(struct intel_atomic_state *state)
  {
        struct intel_crtc *crtc;
        int i;
  
 +      if ((drm_debug & DRM_UT_KMS) == 0)
 +              return;
 +
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
 +              const struct skl_pipe_wm *old_pipe_wm, *new_pipe_wm;
 +
 +              old_pipe_wm = &old_crtc_state->wm.skl.optimal;
 +              new_pipe_wm = &new_crtc_state->wm.skl.optimal;
 +
                for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
                        enum plane_id plane_id = plane->id;
                        const struct skl_ddb_entry *old, *new;
                        if (skl_ddb_entry_equal(old, new))
                                continue;
  
 -                      DRM_DEBUG_KMS("[PLANE:%d:%s] ddb (%d - %d) -> (%d - %d)\n",
 +                      DRM_DEBUG_KMS("[PLANE:%d:%s] ddb (%4d - %4d) -> (%4d - %4d), size %4d -> %4d\n",
 +                                    plane->base.base.id, plane->base.name,
 +                                    old->start, old->end, new->start, new->end,
 +                                    skl_ddb_entry_size(old), skl_ddb_entry_size(new));
 +              }
 +
 +              for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane) {
 +                      enum plane_id plane_id = plane->id;
 +                      const struct skl_plane_wm *old_wm, *new_wm;
 +
 +                      old_wm = &old_pipe_wm->planes[plane_id];
 +                      new_wm = &new_pipe_wm->planes[plane_id];
 +
 +                      if (skl_plane_wm_equals(dev_priv, old_wm, new_wm))
 +                              continue;
 +
 +                      DRM_DEBUG_KMS("[PLANE:%d:%s]   level %cwm0,%cwm1,%cwm2,%cwm3,%cwm4,%cwm5,%cwm6,%cwm7,%ctwm"
 +                                    " -> %cwm0,%cwm1,%cwm2,%cwm3,%cwm4,%cwm5,%cwm6,%cwm7,%ctwm\n",
 +                                    plane->base.base.id, plane->base.name,
 +                                    enast(old_wm->wm[0].plane_en), enast(old_wm->wm[1].plane_en),
 +                                    enast(old_wm->wm[2].plane_en), enast(old_wm->wm[3].plane_en),
 +                                    enast(old_wm->wm[4].plane_en), enast(old_wm->wm[5].plane_en),
 +                                    enast(old_wm->wm[6].plane_en), enast(old_wm->wm[7].plane_en),
 +                                    enast(old_wm->trans_wm.plane_en),
 +                                    enast(new_wm->wm[0].plane_en), enast(new_wm->wm[1].plane_en),
 +                                    enast(new_wm->wm[2].plane_en), enast(new_wm->wm[3].plane_en),
 +                                    enast(new_wm->wm[4].plane_en), enast(new_wm->wm[5].plane_en),
 +                                    enast(new_wm->wm[6].plane_en), enast(new_wm->wm[7].plane_en),
 +                                    enast(new_wm->trans_wm.plane_en));
 +
 +                      DRM_DEBUG_KMS("[PLANE:%d:%s]   lines %c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d"
 +                                    " -> %c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d,%c%3d\n",
 +                                    plane->base.base.id, plane->base.name,
 +                                    enast(old_wm->wm[0].ignore_lines), old_wm->wm[0].plane_res_l,
 +                                    enast(old_wm->wm[1].ignore_lines), old_wm->wm[1].plane_res_l,
 +                                    enast(old_wm->wm[2].ignore_lines), old_wm->wm[2].plane_res_l,
 +                                    enast(old_wm->wm[3].ignore_lines), old_wm->wm[3].plane_res_l,
 +                                    enast(old_wm->wm[4].ignore_lines), old_wm->wm[4].plane_res_l,
 +                                    enast(old_wm->wm[5].ignore_lines), old_wm->wm[5].plane_res_l,
 +                                    enast(old_wm->wm[6].ignore_lines), old_wm->wm[6].plane_res_l,
 +                                    enast(old_wm->wm[7].ignore_lines), old_wm->wm[7].plane_res_l,
 +                                    enast(old_wm->trans_wm.ignore_lines), old_wm->trans_wm.plane_res_l,
 +
 +                                    enast(new_wm->wm[0].ignore_lines), new_wm->wm[0].plane_res_l,
 +                                    enast(new_wm->wm[1].ignore_lines), new_wm->wm[1].plane_res_l,
 +                                    enast(new_wm->wm[2].ignore_lines), new_wm->wm[2].plane_res_l,
 +                                    enast(new_wm->wm[3].ignore_lines), new_wm->wm[3].plane_res_l,
 +                                    enast(new_wm->wm[4].ignore_lines), new_wm->wm[4].plane_res_l,
 +                                    enast(new_wm->wm[5].ignore_lines), new_wm->wm[5].plane_res_l,
 +                                    enast(new_wm->wm[6].ignore_lines), new_wm->wm[6].plane_res_l,
 +                                    enast(new_wm->wm[7].ignore_lines), new_wm->wm[7].plane_res_l,
 +                                    enast(new_wm->trans_wm.ignore_lines), new_wm->trans_wm.plane_res_l);
 +
 +                      DRM_DEBUG_KMS("[PLANE:%d:%s]  blocks %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d"
 +                                    " -> %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d\n",
 +                                    plane->base.base.id, plane->base.name,
 +                                    old_wm->wm[0].plane_res_b, old_wm->wm[1].plane_res_b,
 +                                    old_wm->wm[2].plane_res_b, old_wm->wm[3].plane_res_b,
 +                                    old_wm->wm[4].plane_res_b, old_wm->wm[5].plane_res_b,
 +                                    old_wm->wm[6].plane_res_b, old_wm->wm[7].plane_res_b,
 +                                    old_wm->trans_wm.plane_res_b,
 +                                    new_wm->wm[0].plane_res_b, new_wm->wm[1].plane_res_b,
 +                                    new_wm->wm[2].plane_res_b, new_wm->wm[3].plane_res_b,
 +                                    new_wm->wm[4].plane_res_b, new_wm->wm[5].plane_res_b,
 +                                    new_wm->wm[6].plane_res_b, new_wm->wm[7].plane_res_b,
 +                                    new_wm->trans_wm.plane_res_b);
 +
 +                      DRM_DEBUG_KMS("[PLANE:%d:%s] min_ddb %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d"
 +                                    " -> %4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d,%4d\n",
                                      plane->base.base.id, plane->base.name,
 -                                    old->start, old->end,
 -                                    new->start, new->end);
 +                                    old_wm->wm[0].min_ddb_alloc, old_wm->wm[1].min_ddb_alloc,
 +                                    old_wm->wm[2].min_ddb_alloc, old_wm->wm[3].min_ddb_alloc,
 +                                    old_wm->wm[4].min_ddb_alloc, old_wm->wm[5].min_ddb_alloc,
 +                                    old_wm->wm[6].min_ddb_alloc, old_wm->wm[7].min_ddb_alloc,
 +                                    old_wm->trans_wm.min_ddb_alloc,
 +                                    new_wm->wm[0].min_ddb_alloc, new_wm->wm[1].min_ddb_alloc,
 +                                    new_wm->wm[2].min_ddb_alloc, new_wm->wm[3].min_ddb_alloc,
 +                                    new_wm->wm[4].min_ddb_alloc, new_wm->wm[5].min_ddb_alloc,
 +                                    new_wm->wm[6].min_ddb_alloc, new_wm->wm[7].min_ddb_alloc,
 +                                    new_wm->trans_wm.min_ddb_alloc);
                }
        }
  }
@@@ -5704,7 -5609,6 +5707,7 @@@ static inline void skl_wm_level_from_re
                                             struct skl_wm_level *level)
  {
        level->plane_en = val & PLANE_WM_EN;
 +      level->ignore_lines = val & PLANE_WM_IGNORE_LINES;
        level->plane_res_b = val & PLANE_WM_BLOCKS_MASK;
        level->plane_res_l = (val >> PLANE_WM_LINES_SHIFT) &
                PLANE_WM_LINES_MASK;
@@@ -6082,7 -5986,7 +6085,7 @@@ void vlv_wm_get_hw_state(struct drm_i91
        if (IS_CHERRYVIEW(dev_priv)) {
                mutex_lock(&dev_priv->pcu_lock);
  
 -              val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
 +              val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
                if (val & DSP_MAXFIFO_PM5_ENABLE)
                        wm->level = VLV_WM_LEVEL_PM5;
  
@@@ -6787,7 -6691,8 +6790,7 @@@ void gen6_rps_idle(struct drm_i915_priv
        mutex_unlock(&dev_priv->pcu_lock);
  }
  
 -void gen6_rps_boost(struct i915_request *rq,
 -                  struct intel_rps_client *rps_client)
 +void gen6_rps_boost(struct i915_request *rq)
  {
        struct intel_rps *rps = &rq->i915->gt_pm.rps;
        unsigned long flags;
        if (READ_ONCE(rps->cur_freq) < rps->boost_freq)
                schedule_work(&rps->work);
  
 -      atomic_inc(rps_client ? &rps_client->boosts : &rps->boosts);
 +      atomic_inc(&rps->boosts);
  }
  
  int intel_set_rps(struct drm_i915_private *dev_priv, u8 val)
This page took 0.158404 seconds and 4 git commands to generate.