]> Git Repo - linux.git/commitdiff
Merge tag 'drm-intel-gt-next-2021-01-14' of git://anongit.freedesktop.org/drm/drm...
authorDave Airlie <[email protected]>
Fri, 15 Jan 2021 05:03:36 +0000 (15:03 +1000)
committerDave Airlie <[email protected]>
Fri, 15 Jan 2021 05:03:36 +0000 (15:03 +1000)
UAPI Changes:
- Deprecate I915_PMU_LAST and optimize state tracking (Tvrtko)

  Avoid relying on last item ABI marker in i915_drm.h, add a
  comment to mark as deprecated.

Cross-subsystem Changes:

Core Changes:

Driver Changes:

- Restore clear residuals security mitigations for Ivybridge and
  Baytrail (Chris)
- Close #1858: Allow sysadmin to choose applied GPU security mitigations
  through i915.mitigations=... similar to CPU (Chris)
- Fix for #2024: GPU hangs on HSW GT1 (Chris)
- Fix for #2707: Driver hang when editing UVs in Blender (Chris, Ville)
- Fix for #2797: False positive GuC loading error message (Chris)
- Fix for #2859: Missing GuC firmware for older Cometlakes (Chris)
- Lessen probability of GPU hang due to DMAR faults [reason 7,
  next page table ptr is invalid] on Tigerlake (Chris)
- Fix REVID macros for TGL to fetch correct stepping (Aditya)
- Limit frequency drop to RPe on parking (Chris, Edward)
- Limit W/A 1406941453 to TGL, RKL and DG1 (Swathi)
- Make W/A 22010271021 permanent on DG1 (Lucas)
- Implement W/A 16011163337 to prevent a HS/DS hang on DG1 (Swathi)
- Only disable preemption on gen8 render engines (Chris)
- Disable arbitration around Braswell's PDP updates (Chris)
- Disable arbitration on no-preempt requests (Chris)
- Check for arbitration after writing start seqno before busywaiting (Chris)
- Retain default context state across shrinking (Venkata, CQ)
- Fix mismatch between misplaced vma check and vma insert for 32-bit
  addressing userspaces (Chris, CQ)
- Propagate error for vmap() failure instead kernel NULL deref (Chris)
- Propagate error from cancelled submit due to context closure
  immediately (Chris)
- Fix RCU race on HWSP tracking per request (Chris)
- Clear CMD parser shadow and GPU reloc batches (Matt A)

- Populate logical context during first pin (Maarten)
- Optimistically prune dma-resv from the shrinker (Chris)
- Fix for virtual engine ownership race (Chris)
- Remove timeslice suppression to restore fairness for virtual engines (Chris)
- Rearrange IVB/HSW workarounds properly between GT and engine (Chris)
- Taint the reset mutex with the shrinker (Chris)
- Replace direct submit with direct call to tasklet (Chris)
- Multiple corrections to virtual engine dequeue and breadcrumbs code (Chris)
- Avoid wakeref from potentially hard IRQ context in PMU (Tvrtko)
- Use raw clock for RC6 time estimation in PMU (Tvrtko)
- Differentiate OOM failures from invalid map types (Chris)
- Fix Gen9 to have 64 MOCS entries similar to Gen11 (Chris)
- Ignore repeated attempts to suspend request flow across reset (Chris)
- Remove livelock from "do_idle_maps" VT-d W/A (Chris)
- Cancel the preemption timeout early in case engine reset fails (Chris)
- Code flow optimization in the scheduling code (Chris)
- Clear the execlists timers upon reset (Chris)
- Drain the breadcrumbs just once (Chris, Matt A)
- Track the overall GT awake/busy time (Chris)
- Tweak submission tasklet flushing to avoid starvation (Chris)
- Track timelines created using the HWSP to restore on resume (Chris)
- Use cmpxchg64 for 32b compatilibity for active tracking (Chris)
- Prefer recycling an idle GGTT fence to avoid GPU wait (Chris)

- Restructure GT code organization for clearer split between GuC
  and execlists (Chris, Daniele, John, Matt A)
- Remove GuC code that will remain unused by new interfaces (Matt B)
- Restructure the CS timestamp clocks code to local to GT (Chris)
- Fix error return paths in perf code (Zhang)
- Replace idr_init() by idr_init_base() in perf (Deepak)
- Fix shmem_pin_map error path (Colin)
- Drop redundant free_work worker for GEM contexts (Chris, Mika)
- Increase readability and understandability of intel_workarounds.c (Lucas)
- Defer enabling the breadcrumb interrupt to after submission (Chris)
- Deal with buddy alloc block sizes beyond 4G (Venkata, Chris)
- Encode fence specific waitqueue behaviour into the wait.flags (Chris)
- Don't cancel the breadcrumb interrupt shadow too early (Chris)
- Cancel submitted requests upon context reset (Chris)
- Use correct locks in GuC code (Tvrtko)
- Prevent use of engine->wa_ctx after error (Chris, Matt R)

- Fix build warning on 32-bit (Arnd)
- Avoid memory leak if platform would have more than 16 W/A (Tvrtko)
- Avoid unnecessary #if CONFIG_PM in PMU code (Chris, Tvrtko)
- Improve debugging output (Chris, Tvrtko, Matt R)
- Make file local variables static (Jani)
- Avoid uint*_t types in i915 (Jani)
- Selftest improvements (Chris, Matt A, Dan)
- Documentation fixes (Chris, Jose)

Signed-off-by: Dave Airlie <[email protected]>
# Conflicts:
# drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
# drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
# drivers/gpu/drm/i915/gt/intel_lrc.c
# drivers/gpu/drm/i915/gvt/mmio_context.h
# drivers/gpu/drm/i915/i915_drv.h
From: Joonas Lahtinen <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
12 files changed:
1  2 
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/gt/intel_reset.c
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/mmio_context.h
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_perf.c
drivers/gpu/drm/i915/i915_pmu.c
drivers/gpu/drm/i915/i915_pmu.h
drivers/gpu/drm/i915/i915_request.c
drivers/gpu/drm/i915/intel_device_info.c

index eb0d710cff8cdc13309ef38f24749c0095412161,0a0214341bb7d4ccf108d00168b53bff4a58ef4e..d6ac946d040702793fe5bf13413a1b394ce59ffc
@@@ -38,6 -38,7 +38,7 @@@ i915-y += i915_drv.o 
          i915_config.o \
          i915_irq.o \
          i915_getparam.o \
+         i915_mitigations.o \
          i915_params.o \
          i915_pci.o \
          i915_scatterlist.o \
@@@ -58,6 -59,7 +59,7 @@@
  
  # core library code
  i915-y += \
+       dma_resv_utils.o \
        i915_memcpy.o \
        i915_mm.o \
        i915_sw_fence.o \
@@@ -82,6 -84,7 +84,7 @@@ gt-y += 
        gt/gen6_engine_cs.o \
        gt/gen6_ppgtt.o \
        gt/gen7_renderclear.o \
+       gt/gen8_engine_cs.o \
        gt/gen8_ppgtt.o \
        gt/intel_breadcrumbs.o \
        gt/intel_context.o \
@@@ -91,6 -94,7 +94,7 @@@
        gt/intel_engine_heartbeat.o \
        gt/intel_engine_pm.o \
        gt/intel_engine_user.o \
+       gt/intel_execlists_submission.o \
        gt/intel_ggtt.o \
        gt/intel_ggtt_fencing.o \
        gt/intel_gt.o \
        gt/intel_mocs.o \
        gt/intel_ppgtt.o \
        gt/intel_rc6.o \
+       gt/intel_region_lmem.o \
        gt/intel_renderstate.o \
        gt/intel_reset.o \
        gt/intel_ring.o \
@@@ -166,7 -171,6 +171,6 @@@ i915-y += 
          i915_scheduler.o \
          i915_trace_points.o \
          i915_vma.o \
-         intel_region_lmem.o \
          intel_wopcm.o
  
  # general-purpose microcontroller (GuC) support
@@@ -197,7 -201,6 +201,7 @@@ i915-y += 
        display/intel_combo_phy.o \
        display/intel_connector.o \
        display/intel_csr.o \
 +      display/intel_cursor.o \
        display/intel_display.o \
        display/intel_display_power.o \
        display/intel_dpio_phy.o \
        display/intel_quirks.o \
        display/intel_sprite.o \
        display/intel_tc.o \
 -      display/intel_vga.o
 +      display/intel_vga.o \
 +      display/i9xx_plane.o
  i915-$(CONFIG_ACPI) += \
        display/intel_acpi.o \
        display/intel_opregion.o
@@@ -285,7 -287,15 +289,7 @@@ obj-$(CONFIG_DRM_I915_GVT_KVMGT) += gvt
  
  # exclude some broken headers from the test coverage
  no-header-test := \
 -      display/intel_vbt_defs.h \
 -      gvt/execlist.h \
 -      gvt/fb_decoder.h \
 -      gvt/gtt.h \
 -      gvt/gvt.h \
 -      gvt/interrupt.h \
 -      gvt/mmio_context.h \
 -      gvt/mpt.h \
 -      gvt/scheduler.h
 +      display/intel_vbt_defs.h
  
  extra-$(CONFIG_DRM_I915_WERROR) += \
        $(patsubst %.h,%.hdrtest, $(filter-out $(no-header-test), \
index 3654c955e6be8c7713b1a8cb9f4a9f0bab98bb7b,b516b2c0528dc2012889641b1b266d62c1c39e34..9d177297db7949b3da568b04381e3efaf5405e52
@@@ -40,20 -40,19 +40,19 @@@ static void rmw_clear_fw(struct intel_u
        intel_uncore_rmw_fw(uncore, reg, clr, 0);
  }
  
- static void engine_skip_context(struct i915_request *rq)
+ static void skip_context(struct i915_request *rq)
  {
-       struct intel_engine_cs *engine = rq->engine;
        struct intel_context *hung_ctx = rq->context;
  
-       if (!i915_request_is_active(rq))
-               return;
+       list_for_each_entry_from_rcu(rq, &hung_ctx->timeline->requests, link) {
+               if (!i915_request_is_active(rq))
+                       return;
  
-       lockdep_assert_held(&engine->active.lock);
-       list_for_each_entry_continue(rq, &engine->active.requests, sched.link)
                if (rq->context == hung_ctx) {
                        i915_request_set_error_once(rq, -EIO);
                        __i915_request_skip(rq);
                }
+       }
  }
  
  static void client_mark_guilty(struct i915_gem_context *ctx, bool banned)
@@@ -160,7 -159,7 +159,7 @@@ void __i915_request_reset(struct i915_r
                i915_request_set_error_once(rq, -EIO);
                __i915_request_skip(rq);
                if (mark_guilty(rq))
-                       engine_skip_context(rq);
+                       skip_context(rq);
        } else {
                i915_request_set_error_once(rq, -EAGAIN);
                mark_innocent(rq);
@@@ -231,7 -230,7 +230,7 @@@ static int g4x_do_reset(struct intel_g
                              GRDOM_MEDIA | GRDOM_RESET_ENABLE);
        ret =  wait_for_atomic(g4x_reset_complete(pdev), 50);
        if (ret) {
-               drm_dbg(&gt->i915->drm, "Wait for media reset failed\n");
+               GT_TRACE(gt, "Wait for media reset failed\n");
                goto out;
        }
  
                              GRDOM_RENDER | GRDOM_RESET_ENABLE);
        ret =  wait_for_atomic(g4x_reset_complete(pdev), 50);
        if (ret) {
-               drm_dbg(&gt->i915->drm, "Wait for render reset failed\n");
+               GT_TRACE(gt, "Wait for render reset failed\n");
                goto out;
        }
  
@@@ -265,7 -264,7 +264,7 @@@ static int ilk_do_reset(struct intel_g
                                           5000, 0,
                                           NULL);
        if (ret) {
-               drm_dbg(&gt->i915->drm, "Wait for render reset failed\n");
+               GT_TRACE(gt, "Wait for render reset failed\n");
                goto out;
        }
  
                                           5000, 0,
                                           NULL);
        if (ret) {
-               drm_dbg(&gt->i915->drm, "Wait for media reset failed\n");
+               GT_TRACE(gt, "Wait for media reset failed\n");
                goto out;
        }
  
@@@ -305,9 -304,9 +304,9 @@@ static int gen6_hw_domain_reset(struct 
                                           500, 0,
                                           NULL);
        if (err)
-               drm_dbg(&gt->i915->drm,
-                       "Wait for 0x%08x engines reset failed\n",
-                       hw_domain_mask);
+               GT_TRACE(gt,
+                        "Wait for 0x%08x engines reset failed\n",
+                        hw_domain_mask);
  
        return err;
  }
@@@ -407,8 -406,7 +406,7 @@@ static int gen11_lock_sfc(struct intel_
                return 0;
  
        if (ret) {
-               drm_dbg(&engine->i915->drm,
-                       "Wait for SFC forced lock ack failed\n");
+               ENGINE_TRACE(engine, "Wait for SFC forced lock ack failed\n");
                return ret;
        }
  
@@@ -499,6 -497,9 +497,9 @@@ static int gen8_engine_reset_prepare(st
        u32 request, mask, ack;
        int ret;
  
+       if (I915_SELFTEST_ONLY(should_fail(&engine->reset_timeout, 1)))
+               return -ETIMEDOUT;
        ack = intel_uncore_read_fw(uncore, reg);
        if (ack & RESET_CTL_CAT_ERROR) {
                /*
@@@ -754,8 -755,10 +755,10 @@@ static int gt_reset(struct intel_gt *gt
        if (err)
                return err;
  
+       local_bh_disable();
        for_each_engine(engine, gt, id)
                __intel_engine_reset(engine, stalled_mask & engine->mask);
+       local_bh_enable();
  
        intel_ggtt_restore_fences(gt->ggtt);
  
@@@ -833,9 -836,11 +836,11 @@@ static void __intel_gt_set_wedged(struc
        set_bit(I915_WEDGED, &gt->reset.flags);
  
        /* Mark all executing requests as skipped */
+       local_bh_disable();
        for_each_engine(engine, gt, id)
                if (engine->reset.cancel)
                        engine->reset.cancel(engine);
+       local_bh_enable();
  
        reset_finish(gt, awake);
  
@@@ -1110,20 -1115,7 +1115,7 @@@ static inline int intel_gt_reset_engine
        return __intel_gt_reset(engine->gt, engine->mask);
  }
  
- /**
-  * intel_engine_reset - reset GPU engine to recover from a hang
-  * @engine: engine to reset
-  * @msg: reason for GPU reset; or NULL for no drm_notice()
-  *
-  * Reset a specific GPU engine. Useful if a hang is detected.
-  * Returns zero on successful reset or otherwise an error code.
-  *
-  * Procedure is:
-  *  - identifies the request that caused the hang and it is dropped
-  *  - reset engine (which will force the engine to idle)
-  *  - re-init/configure engine
-  */
- int intel_engine_reset(struct intel_engine_cs *engine, const char *msg)
+ int __intel_engine_reset_bh(struct intel_engine_cs *engine, const char *msg)
  {
        struct intel_gt *gt = engine->gt;
        bool uses_guc = intel_engine_in_guc_submission_mode(engine);
                ret = intel_guc_reset_engine(&engine->gt->uc.guc, engine);
        if (ret) {
                /* If we fail here, we expect to fallback to a global reset */
-               drm_dbg(&gt->i915->drm, "%sFailed to reset %s, ret=%d\n",
-                       uses_guc ? "GuC " : "", engine->name, ret);
+               ENGINE_TRACE(engine, "Failed to reset, err: %d\n", ret);
                goto out;
        }
  
        return ret;
  }
  
+ /**
+  * intel_engine_reset - reset GPU engine to recover from a hang
+  * @engine: engine to reset
+  * @msg: reason for GPU reset; or NULL for no drm_notice()
+  *
+  * Reset a specific GPU engine. Useful if a hang is detected.
+  * Returns zero on successful reset or otherwise an error code.
+  *
+  * Procedure is:
+  *  - identifies the request that caused the hang and it is dropped
+  *  - reset engine (which will force the engine to idle)
+  *  - re-init/configure engine
+  */
+ int intel_engine_reset(struct intel_engine_cs *engine, const char *msg)
+ {
+       int err;
+       local_bh_disable();
+       err = __intel_engine_reset_bh(engine, msg);
+       local_bh_enable();
+       return err;
+ }
  static void intel_gt_reset_global(struct intel_gt *gt,
                                  u32 engine_mask,
                                  const char *reason)
  
        kobject_uevent_env(kobj, KOBJ_CHANGE, error_event);
  
-       drm_dbg(&gt->i915->drm, "resetting chip, engines=%x\n", engine_mask);
+       GT_TRACE(gt, "resetting chip, engines=%x\n", engine_mask);
        kobject_uevent_env(kobj, KOBJ_CHANGE, reset_event);
  
        /* Use a watchdog to ensure that our reset completes */
        intel_wedge_on_timeout(&w, gt, 5 * HZ) {
 -              intel_prepare_reset(gt->i915);
 +              intel_display_prepare_reset(gt->i915);
  
                /* Flush everyone using a resource about to be clobbered */
                synchronize_srcu_expedited(&gt->reset.backoff_srcu);
  
                intel_gt_reset(gt, engine_mask, reason);
  
 -              intel_finish_reset(gt->i915);
 +              intel_display_finish_reset(gt->i915);
        }
  
        if (!test_bit(I915_WEDGED, &gt->reset.flags))
@@@ -1260,18 -1275,20 +1275,20 @@@ void intel_gt_handle_error(struct intel
         * single reset fails.
         */
        if (intel_has_reset_engine(gt) && !intel_gt_is_wedged(gt)) {
+               local_bh_disable();
                for_each_engine_masked(engine, gt, engine_mask, tmp) {
                        BUILD_BUG_ON(I915_RESET_MODESET >= I915_RESET_ENGINE);
                        if (test_and_set_bit(I915_RESET_ENGINE + engine->id,
                                             &gt->reset.flags))
                                continue;
  
-                       if (intel_engine_reset(engine, msg) == 0)
+                       if (__intel_engine_reset_bh(engine, msg) == 0)
                                engine_mask &= ~engine->mask;
  
                        clear_and_wake_up_bit(I915_RESET_ENGINE + engine->id,
                                              &gt->reset.flags);
                }
+               local_bh_enable();
        }
  
        if (!engine_mask)
@@@ -1380,6 -1397,17 +1397,17 @@@ void intel_gt_init_reset(struct intel_g
        mutex_init(&gt->reset.mutex);
        init_srcu_struct(&gt->reset.backoff_srcu);
  
+       /*
+        * While undesirable to wait inside the shrinker, complain anyway.
+        *
+        * If we have to wait during shrinking, we guarantee forward progress
+        * by forcing the reset. Therefore during the reset we must not
+        * re-enter the shrinker. By declaring that we take the reset mutex
+        * within the shrinker, we forbid ourselves from performing any
+        * fs-reclaim or taking related locks during reset.
+        */
+       i915_gem_shrinker_taints_mutex(gt->i915, &gt->reset.mutex);
        /* no GPU until we are ready! */
        __set_bit(I915_WEDGED, &gt->reset.flags);
  }
index eaba80975f42af3b333f1686b894e08536477dc0,4ddc9c8474709f76f453ab48823d4d0969c40edc..0d124ced5f94008ed4864bb17c15b0dd1b29009c
@@@ -1651,7 -1651,7 +1651,7 @@@ static int edp_psr_imr_iir_write(struc
        return 0;
  }
  
- /**
+ /*
   * FixMe:
   * If guest fills non-priv batch buffer on ApolloLake/Broxton as Mesa i965 did:
   * 717e7539124d (i965: Use a WC map and memcpy for the batch instead of pwrite.)
@@@ -3120,10 -3120,9 +3120,10 @@@ static int init_skl_mmio_info(struct in
        MMIO_DFH(TRVATTL3PTRDW(2), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(TRVATTL3PTRDW(3), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
        MMIO_DFH(TRVADR, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
 -      MMIO_DFH(TRTTE, D_SKL_PLUS, F_CMD_ACCESS,
 -              NULL, gen9_trtte_write);
 -      MMIO_DH(_MMIO(0x4dfc), D_SKL_PLUS, NULL, gen9_trtt_chicken_write);
 +      MMIO_DFH(TRTTE, D_SKL_PLUS, F_CMD_ACCESS | F_PM_SAVE,
 +               NULL, gen9_trtte_write);
 +      MMIO_DFH(_MMIO(0x4dfc), D_SKL_PLUS, F_PM_SAVE,
 +               NULL, gen9_trtt_chicken_write);
  
        MMIO_D(_MMIO(0x46430), D_SKL_PLUS);
  
@@@ -3672,39 -3671,3 +3672,39 @@@ default_rw
                intel_vgpu_default_mmio_read(vgpu, offset, pdata, bytes) :
                intel_vgpu_default_mmio_write(vgpu, offset, pdata, bytes);
  }
 +
 +void intel_gvt_restore_fence(struct intel_gvt *gvt)
 +{
 +      struct intel_vgpu *vgpu;
 +      int i, id;
 +
 +      idr_for_each_entry(&(gvt)->vgpu_idr, vgpu, id) {
 +              mmio_hw_access_pre(gvt->gt);
 +              for (i = 0; i < vgpu_fence_sz(vgpu); i++)
 +                      intel_vgpu_write_fence(vgpu, i, vgpu_vreg64(vgpu, fence_num_to_offset(i)));
 +              mmio_hw_access_post(gvt->gt);
 +      }
 +}
 +
 +static int mmio_pm_restore_handler(struct intel_gvt *gvt, u32 offset, void *data)
 +{
 +      struct intel_vgpu *vgpu = data;
 +      struct drm_i915_private *dev_priv = gvt->gt->i915;
 +
 +      if (gvt->mmio.mmio_attribute[offset >> 2] & F_PM_SAVE)
 +              intel_uncore_write(&dev_priv->uncore, _MMIO(offset), vgpu_vreg(vgpu, offset));
 +
 +      return 0;
 +}
 +
 +void intel_gvt_restore_mmio(struct intel_gvt *gvt)
 +{
 +      struct intel_vgpu *vgpu;
 +      int id;
 +
 +      idr_for_each_entry(&(gvt)->vgpu_idr, vgpu, id) {
 +              mmio_hw_access_pre(gvt->gt);
 +              intel_gvt_for_each_tracked_mmio(gvt, mmio_pm_restore_handler, vgpu);
 +              mmio_hw_access_post(gvt->gt);
 +      }
 +}
index 1421d3a704126fd1e85f33eda1b41ab7643a14cd,412b96ee688354519990f5df789880bb70a7f6eb..b6b69777af4953fb2db84d54b990517d7881f7d3
  #ifndef __GVT_RENDER_H__
  #define __GVT_RENDER_H__
  
 +#include <linux/types.h>
 +
 +#include "gt/intel_engine_types.h"
+ #include "gt/intel_lrc_reg.h"
 +#include "i915_reg.h"
 +
 +struct i915_request;
 +struct intel_context;
 +struct intel_engine_cs;
 +struct intel_gvt;
 +struct intel_vgpu;
  
  struct engine_mmio {
        enum intel_engine_id id;
index a61e9b095896596a7e260c9cb310e3a6264722d0,3a8d843d79669a86565d2c728002036d16fdb805..de8e0e44cfb6a6f8794874dba04200a86c84a59c
@@@ -45,6 -45,7 +45,7 @@@
  #include "i915_debugfs.h"
  #include "i915_debugfs_params.h"
  #include "i915_irq.h"
+ #include "i915_scheduler.h"
  #include "i915_trace.h"
  #include "intel_pm.h"
  #include "intel_sideband.h"
@@@ -378,6 -379,308 +379,6 @@@ static int i915_gem_object_info(struct 
        return 0;
  }
  
 -static void gen8_display_interrupt_info(struct seq_file *m)
 -{
 -      struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      enum pipe pipe;
 -
 -      for_each_pipe(dev_priv, pipe) {
 -              enum intel_display_power_domain power_domain;
 -              intel_wakeref_t wakeref;
 -
 -              power_domain = POWER_DOMAIN_PIPE(pipe);
 -              wakeref = intel_display_power_get_if_enabled(dev_priv,
 -                                                           power_domain);
 -              if (!wakeref) {
 -                      seq_printf(m, "Pipe %c power disabled\n",
 -                                 pipe_name(pipe));
 -                      continue;
 -              }
 -              seq_printf(m, "Pipe %c IMR:\t%08x\n",
 -                         pipe_name(pipe),
 -                         I915_READ(GEN8_DE_PIPE_IMR(pipe)));
 -              seq_printf(m, "Pipe %c IIR:\t%08x\n",
 -                         pipe_name(pipe),
 -                         I915_READ(GEN8_DE_PIPE_IIR(pipe)));
 -              seq_printf(m, "Pipe %c IER:\t%08x\n",
 -                         pipe_name(pipe),
 -                         I915_READ(GEN8_DE_PIPE_IER(pipe)));
 -
 -              intel_display_power_put(dev_priv, power_domain, wakeref);
 -      }
 -
 -      seq_printf(m, "Display Engine port interrupt mask:\t%08x\n",
 -                 I915_READ(GEN8_DE_PORT_IMR));
 -      seq_printf(m, "Display Engine port interrupt identity:\t%08x\n",
 -                 I915_READ(GEN8_DE_PORT_IIR));
 -      seq_printf(m, "Display Engine port interrupt enable:\t%08x\n",
 -                 I915_READ(GEN8_DE_PORT_IER));
 -
 -      seq_printf(m, "Display Engine misc interrupt mask:\t%08x\n",
 -                 I915_READ(GEN8_DE_MISC_IMR));
 -      seq_printf(m, "Display Engine misc interrupt identity:\t%08x\n",
 -                 I915_READ(GEN8_DE_MISC_IIR));
 -      seq_printf(m, "Display Engine misc interrupt enable:\t%08x\n",
 -                 I915_READ(GEN8_DE_MISC_IER));
 -
 -      seq_printf(m, "PCU interrupt mask:\t%08x\n",
 -                 I915_READ(GEN8_PCU_IMR));
 -      seq_printf(m, "PCU interrupt identity:\t%08x\n",
 -                 I915_READ(GEN8_PCU_IIR));
 -      seq_printf(m, "PCU interrupt enable:\t%08x\n",
 -                 I915_READ(GEN8_PCU_IER));
 -}
 -
 -static int i915_interrupt_info(struct seq_file *m, void *data)
 -{
 -      struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      struct intel_engine_cs *engine;
 -      intel_wakeref_t wakeref;
 -      int i, pipe;
 -
 -      wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 -
 -      if (IS_CHERRYVIEW(dev_priv)) {
 -              intel_wakeref_t pref;
 -
 -              seq_printf(m, "Master Interrupt Control:\t%08x\n",
 -                         I915_READ(GEN8_MASTER_IRQ));
 -
 -              seq_printf(m, "Display IER:\t%08x\n",
 -                         I915_READ(VLV_IER));
 -              seq_printf(m, "Display IIR:\t%08x\n",
 -                         I915_READ(VLV_IIR));
 -              seq_printf(m, "Display IIR_RW:\t%08x\n",
 -                         I915_READ(VLV_IIR_RW));
 -              seq_printf(m, "Display IMR:\t%08x\n",
 -                         I915_READ(VLV_IMR));
 -              for_each_pipe(dev_priv, pipe) {
 -                      enum intel_display_power_domain power_domain;
 -
 -                      power_domain = POWER_DOMAIN_PIPE(pipe);
 -                      pref = intel_display_power_get_if_enabled(dev_priv,
 -                                                                power_domain);
 -                      if (!pref) {
 -                              seq_printf(m, "Pipe %c power disabled\n",
 -                                         pipe_name(pipe));
 -                              continue;
 -                      }
 -
 -                      seq_printf(m, "Pipe %c stat:\t%08x\n",
 -                                 pipe_name(pipe),
 -                                 I915_READ(PIPESTAT(pipe)));
 -
 -                      intel_display_power_put(dev_priv, power_domain, pref);
 -              }
 -
 -              pref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
 -              seq_printf(m, "Port hotplug:\t%08x\n",
 -                         I915_READ(PORT_HOTPLUG_EN));
 -              seq_printf(m, "DPFLIPSTAT:\t%08x\n",
 -                         I915_READ(VLV_DPFLIPSTAT));
 -              seq_printf(m, "DPINVGTT:\t%08x\n",
 -                         I915_READ(DPINVGTT));
 -              intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, pref);
 -
 -              for (i = 0; i < 4; i++) {
 -                      seq_printf(m, "GT Interrupt IMR %d:\t%08x\n",
 -                                 i, I915_READ(GEN8_GT_IMR(i)));
 -                      seq_printf(m, "GT Interrupt IIR %d:\t%08x\n",
 -                                 i, I915_READ(GEN8_GT_IIR(i)));
 -                      seq_printf(m, "GT Interrupt IER %d:\t%08x\n",
 -                                 i, I915_READ(GEN8_GT_IER(i)));
 -              }
 -
 -              seq_printf(m, "PCU interrupt mask:\t%08x\n",
 -                         I915_READ(GEN8_PCU_IMR));
 -              seq_printf(m, "PCU interrupt identity:\t%08x\n",
 -                         I915_READ(GEN8_PCU_IIR));
 -              seq_printf(m, "PCU interrupt enable:\t%08x\n",
 -                         I915_READ(GEN8_PCU_IER));
 -      } else if (INTEL_GEN(dev_priv) >= 11) {
 -              if (HAS_MASTER_UNIT_IRQ(dev_priv))
 -                      seq_printf(m, "Master Unit Interrupt Control:  %08x\n",
 -                                 I915_READ(DG1_MSTR_UNIT_INTR));
 -
 -              seq_printf(m, "Master Interrupt Control:  %08x\n",
 -                         I915_READ(GEN11_GFX_MSTR_IRQ));
 -
 -              seq_printf(m, "Render/Copy Intr Enable:   %08x\n",
 -                         I915_READ(GEN11_RENDER_COPY_INTR_ENABLE));
 -              seq_printf(m, "VCS/VECS Intr Enable:      %08x\n",
 -                         I915_READ(GEN11_VCS_VECS_INTR_ENABLE));
 -              seq_printf(m, "GUC/SG Intr Enable:\t   %08x\n",
 -                         I915_READ(GEN11_GUC_SG_INTR_ENABLE));
 -              seq_printf(m, "GPM/WGBOXPERF Intr Enable: %08x\n",
 -                         I915_READ(GEN11_GPM_WGBOXPERF_INTR_ENABLE));
 -              seq_printf(m, "Crypto Intr Enable:\t   %08x\n",
 -                         I915_READ(GEN11_CRYPTO_RSVD_INTR_ENABLE));
 -              seq_printf(m, "GUnit/CSME Intr Enable:\t   %08x\n",
 -                         I915_READ(GEN11_GUNIT_CSME_INTR_ENABLE));
 -
 -              seq_printf(m, "Display Interrupt Control:\t%08x\n",
 -                         I915_READ(GEN11_DISPLAY_INT_CTL));
 -
 -              gen8_display_interrupt_info(m);
 -      } else if (INTEL_GEN(dev_priv) >= 8) {
 -              seq_printf(m, "Master Interrupt Control:\t%08x\n",
 -                         I915_READ(GEN8_MASTER_IRQ));
 -
 -              for (i = 0; i < 4; i++) {
 -                      seq_printf(m, "GT Interrupt IMR %d:\t%08x\n",
 -                                 i, I915_READ(GEN8_GT_IMR(i)));
 -                      seq_printf(m, "GT Interrupt IIR %d:\t%08x\n",
 -                                 i, I915_READ(GEN8_GT_IIR(i)));
 -                      seq_printf(m, "GT Interrupt IER %d:\t%08x\n",
 -                                 i, I915_READ(GEN8_GT_IER(i)));
 -              }
 -
 -              gen8_display_interrupt_info(m);
 -      } else if (IS_VALLEYVIEW(dev_priv)) {
 -              intel_wakeref_t pref;
 -
 -              seq_printf(m, "Display IER:\t%08x\n",
 -                         I915_READ(VLV_IER));
 -              seq_printf(m, "Display IIR:\t%08x\n",
 -                         I915_READ(VLV_IIR));
 -              seq_printf(m, "Display IIR_RW:\t%08x\n",
 -                         I915_READ(VLV_IIR_RW));
 -              seq_printf(m, "Display IMR:\t%08x\n",
 -                         I915_READ(VLV_IMR));
 -              for_each_pipe(dev_priv, pipe) {
 -                      enum intel_display_power_domain power_domain;
 -
 -                      power_domain = POWER_DOMAIN_PIPE(pipe);
 -                      pref = intel_display_power_get_if_enabled(dev_priv,
 -                                                                power_domain);
 -                      if (!pref) {
 -                              seq_printf(m, "Pipe %c power disabled\n",
 -                                         pipe_name(pipe));
 -                              continue;
 -                      }
 -
 -                      seq_printf(m, "Pipe %c stat:\t%08x\n",
 -                                 pipe_name(pipe),
 -                                 I915_READ(PIPESTAT(pipe)));
 -                      intel_display_power_put(dev_priv, power_domain, pref);
 -              }
 -
 -              seq_printf(m, "Master IER:\t%08x\n",
 -                         I915_READ(VLV_MASTER_IER));
 -
 -              seq_printf(m, "Render IER:\t%08x\n",
 -                         I915_READ(GTIER));
 -              seq_printf(m, "Render IIR:\t%08x\n",
 -                         I915_READ(GTIIR));
 -              seq_printf(m, "Render IMR:\t%08x\n",
 -                         I915_READ(GTIMR));
 -
 -              seq_printf(m, "PM IER:\t\t%08x\n",
 -                         I915_READ(GEN6_PMIER));
 -              seq_printf(m, "PM IIR:\t\t%08x\n",
 -                         I915_READ(GEN6_PMIIR));
 -              seq_printf(m, "PM IMR:\t\t%08x\n",
 -                         I915_READ(GEN6_PMIMR));
 -
 -              pref = intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
 -              seq_printf(m, "Port hotplug:\t%08x\n",
 -                         I915_READ(PORT_HOTPLUG_EN));
 -              seq_printf(m, "DPFLIPSTAT:\t%08x\n",
 -                         I915_READ(VLV_DPFLIPSTAT));
 -              seq_printf(m, "DPINVGTT:\t%08x\n",
 -                         I915_READ(DPINVGTT));
 -              intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, pref);
 -
 -      } else if (!HAS_PCH_SPLIT(dev_priv)) {
 -              seq_printf(m, "Interrupt enable:    %08x\n",
 -                         I915_READ(GEN2_IER));
 -              seq_printf(m, "Interrupt identity:  %08x\n",
 -                         I915_READ(GEN2_IIR));
 -              seq_printf(m, "Interrupt mask:      %08x\n",
 -                         I915_READ(GEN2_IMR));
 -              for_each_pipe(dev_priv, pipe)
 -                      seq_printf(m, "Pipe %c stat:         %08x\n",
 -                                 pipe_name(pipe),
 -                                 I915_READ(PIPESTAT(pipe)));
 -      } else {
 -              seq_printf(m, "North Display Interrupt enable:          %08x\n",
 -                         I915_READ(DEIER));
 -              seq_printf(m, "North Display Interrupt identity:        %08x\n",
 -                         I915_READ(DEIIR));
 -              seq_printf(m, "North Display Interrupt mask:            %08x\n",
 -                         I915_READ(DEIMR));
 -              seq_printf(m, "South Display Interrupt enable:          %08x\n",
 -                         I915_READ(SDEIER));
 -              seq_printf(m, "South Display Interrupt identity:        %08x\n",
 -                         I915_READ(SDEIIR));
 -              seq_printf(m, "South Display Interrupt mask:            %08x\n",
 -                         I915_READ(SDEIMR));
 -              seq_printf(m, "Graphics Interrupt enable:               %08x\n",
 -                         I915_READ(GTIER));
 -              seq_printf(m, "Graphics Interrupt identity:             %08x\n",
 -                         I915_READ(GTIIR));
 -              seq_printf(m, "Graphics Interrupt mask:         %08x\n",
 -                         I915_READ(GTIMR));
 -      }
 -
 -      if (INTEL_GEN(dev_priv) >= 11) {
 -              seq_printf(m, "RCS Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_RCS0_RSVD_INTR_MASK));
 -              seq_printf(m, "BCS Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_BCS_RSVD_INTR_MASK));
 -              seq_printf(m, "VCS0/VCS1 Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_VCS0_VCS1_INTR_MASK));
 -              seq_printf(m, "VCS2/VCS3 Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_VCS2_VCS3_INTR_MASK));
 -              seq_printf(m, "VECS0/VECS1 Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_VECS0_VECS1_INTR_MASK));
 -              seq_printf(m, "GUC/SG Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_GUC_SG_INTR_MASK));
 -              seq_printf(m, "GPM/WGBOXPERF Intr Mask: %08x\n",
 -                         I915_READ(GEN11_GPM_WGBOXPERF_INTR_MASK));
 -              seq_printf(m, "Crypto Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_CRYPTO_RSVD_INTR_MASK));
 -              seq_printf(m, "Gunit/CSME Intr Mask:\t %08x\n",
 -                         I915_READ(GEN11_GUNIT_CSME_INTR_MASK));
 -
 -      } else if (INTEL_GEN(dev_priv) >= 6) {
 -              for_each_uabi_engine(engine, dev_priv) {
 -                      seq_printf(m,
 -                                 "Graphics Interrupt mask (%s):       %08x\n",
 -                                 engine->name, ENGINE_READ(engine, RING_IMR));
 -              }
 -      }
 -
 -      intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 -
 -      return 0;
 -}
 -
 -static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
 -{
 -      struct drm_i915_private *i915 = node_to_i915(m->private);
 -      unsigned int i;
 -
 -      seq_printf(m, "Total fences = %d\n", i915->ggtt.num_fences);
 -
 -      rcu_read_lock();
 -      for (i = 0; i < i915->ggtt.num_fences; i++) {
 -              struct i915_fence_reg *reg = &i915->ggtt.fence_regs[i];
 -              struct i915_vma *vma = reg->vma;
 -
 -              seq_printf(m, "Fence %d, pin count = %d, object = ",
 -                         i, atomic_read(&reg->pin_count));
 -              if (!vma)
 -                      seq_puts(m, "unused");
 -              else
 -                      i915_debugfs_describe_obj(m, vma->obj);
 -              seq_putc(m, '\n');
 -      }
 -      rcu_read_unlock();
 -
 -      return 0;
 -}
 -
  #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
  static ssize_t gpu_state_read(struct file *file, char __user *ubuf,
                              size_t count, loff_t *pos)
@@@ -500,7 -803,7 +501,7 @@@ static int i915_frequency_info(struct s
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                u32 rpmodectl, freq_sts;
  
 -              rpmodectl = I915_READ(GEN6_RP_CONTROL);
 +              rpmodectl = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CONTROL);
                seq_printf(m, "Video Turbo Mode: %s\n",
                           yesno(rpmodectl & GEN6_RP_MEDIA_TURBO));
                seq_printf(m, "HW control enabled: %s\n",
                u32 pm_ier, pm_imr, pm_isr, pm_iir, pm_mask;
                int max_freq;
  
 -              rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
 +              rp_state_limits = intel_uncore_read(&dev_priv->uncore, GEN6_RP_STATE_LIMITS);
                if (IS_GEN9_LP(dev_priv)) {
 -                      rp_state_cap = I915_READ(BXT_RP_STATE_CAP);
 -                      gt_perf_status = I915_READ(BXT_GT_PERF_STATUS);
 +                      rp_state_cap = intel_uncore_read(&dev_priv->uncore, BXT_RP_STATE_CAP);
 +                      gt_perf_status = intel_uncore_read(&dev_priv->uncore, BXT_GT_PERF_STATUS);
                } else {
 -                      rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
 -                      gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
 +                      rp_state_cap = intel_uncore_read(&dev_priv->uncore, GEN6_RP_STATE_CAP);
 +                      gt_perf_status = intel_uncore_read(&dev_priv->uncore, GEN6_GT_PERF_STATUS);
                }
  
                /* RPSTAT1 is in the GT power well */
                intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
  
 -              reqf = I915_READ(GEN6_RPNSWREQ);
 +              reqf = intel_uncore_read(&dev_priv->uncore, GEN6_RPNSWREQ);
                if (INTEL_GEN(dev_priv) >= 9)
                        reqf >>= 23;
                else {
                }
                reqf = intel_gpu_freq(rps, reqf);
  
 -              rpmodectl = I915_READ(GEN6_RP_CONTROL);
 -              rpinclimit = I915_READ(GEN6_RP_UP_THRESHOLD);
 -              rpdeclimit = I915_READ(GEN6_RP_DOWN_THRESHOLD);
 -
 -              rpstat = I915_READ(GEN6_RPSTAT1);
 -              rpupei = I915_READ(GEN6_RP_CUR_UP_EI) & GEN6_CURICONT_MASK;
 -              rpcurup = I915_READ(GEN6_RP_CUR_UP) & GEN6_CURBSYTAVG_MASK;
 -              rpprevup = I915_READ(GEN6_RP_PREV_UP) & GEN6_CURBSYTAVG_MASK;
 -              rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK;
 -              rpcurdown = I915_READ(GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK;
 -              rpprevdown = I915_READ(GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK;
 +              rpmodectl = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CONTROL);
 +              rpinclimit = intel_uncore_read(&dev_priv->uncore, GEN6_RP_UP_THRESHOLD);
 +              rpdeclimit = intel_uncore_read(&dev_priv->uncore, GEN6_RP_DOWN_THRESHOLD);
 +
 +              rpstat = intel_uncore_read(&dev_priv->uncore, GEN6_RPSTAT1);
 +              rpupei = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_UP_EI) & GEN6_CURICONT_MASK;
 +              rpcurup = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_UP) & GEN6_CURBSYTAVG_MASK;
 +              rpprevup = intel_uncore_read(&dev_priv->uncore, GEN6_RP_PREV_UP) & GEN6_CURBSYTAVG_MASK;
 +              rpdownei = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK;
 +              rpcurdown = intel_uncore_read(&dev_priv->uncore, GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK;
 +              rpprevdown = intel_uncore_read(&dev_priv->uncore, GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK;
                cagf = intel_rps_read_actual_frequency(rps);
  
                intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
  
                if (INTEL_GEN(dev_priv) >= 11) {
 -                      pm_ier = I915_READ(GEN11_GPM_WGBOXPERF_INTR_ENABLE);
 -                      pm_imr = I915_READ(GEN11_GPM_WGBOXPERF_INTR_MASK);
 +                      pm_ier = intel_uncore_read(&dev_priv->uncore, GEN11_GPM_WGBOXPERF_INTR_ENABLE);
 +                      pm_imr = intel_uncore_read(&dev_priv->uncore, GEN11_GPM_WGBOXPERF_INTR_MASK);
                        /*
                         * The equivalent to the PM ISR & IIR cannot be read
                         * without affecting the current state of the system
                        pm_isr = 0;
                        pm_iir = 0;
                } else if (INTEL_GEN(dev_priv) >= 8) {
 -                      pm_ier = I915_READ(GEN8_GT_IER(2));
 -                      pm_imr = I915_READ(GEN8_GT_IMR(2));
 -                      pm_isr = I915_READ(GEN8_GT_ISR(2));
 -                      pm_iir = I915_READ(GEN8_GT_IIR(2));
 +                      pm_ier = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IER(2));
 +                      pm_imr = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IMR(2));
 +                      pm_isr = intel_uncore_read(&dev_priv->uncore, GEN8_GT_ISR(2));
 +                      pm_iir = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IIR(2));
                } else {
 -                      pm_ier = I915_READ(GEN6_PMIER);
 -                      pm_imr = I915_READ(GEN6_PMIMR);
 -                      pm_isr = I915_READ(GEN6_PMISR);
 -                      pm_iir = I915_READ(GEN6_PMIIR);
 +                      pm_ier = intel_uncore_read(&dev_priv->uncore, GEN6_PMIER);
 +                      pm_imr = intel_uncore_read(&dev_priv->uncore, GEN6_PMIMR);
 +                      pm_isr = intel_uncore_read(&dev_priv->uncore, GEN6_PMISR);
 +                      pm_iir = intel_uncore_read(&dev_priv->uncore, GEN6_PMIIR);
                }
 -              pm_mask = I915_READ(GEN6_PMINTRMSK);
 +              pm_mask = intel_uncore_read(&dev_priv->uncore, GEN6_PMINTRMSK);
  
                seq_printf(m, "Video Turbo Mode: %s\n",
                           yesno(rpmodectl & GEN6_RP_MEDIA_TURBO));
                seq_printf(m, "RPDECLIMIT: 0x%08x\n", rpdeclimit);
                seq_printf(m, "RPNSWREQ: %dMHz\n", reqf);
                seq_printf(m, "CAGF: %dMHz\n", cagf);
-               seq_printf(m, "RP CUR UP EI: %d (%dns)\n",
+               seq_printf(m, "RP CUR UP EI: %d (%lldns)\n",
                           rpupei,
                           intel_gt_pm_interval_to_ns(&dev_priv->gt, rpupei));
-               seq_printf(m, "RP CUR UP: %d (%dun)\n",
+               seq_printf(m, "RP CUR UP: %d (%lldun)\n",
                           rpcurup,
                           intel_gt_pm_interval_to_ns(&dev_priv->gt, rpcurup));
-               seq_printf(m, "RP PREV UP: %d (%dns)\n",
+               seq_printf(m, "RP PREV UP: %d (%lldns)\n",
                           rpprevup,
                           intel_gt_pm_interval_to_ns(&dev_priv->gt, rpprevup));
                seq_printf(m, "Up threshold: %d%%\n",
                           rps->power.up_threshold);
  
-               seq_printf(m, "RP CUR DOWN EI: %d (%dns)\n",
+               seq_printf(m, "RP CUR DOWN EI: %d (%lldns)\n",
                           rpdownei,
                           intel_gt_pm_interval_to_ns(&dev_priv->gt,
                                                      rpdownei));
-               seq_printf(m, "RP CUR DOWN: %d (%dns)\n",
+               seq_printf(m, "RP CUR DOWN: %d (%lldns)\n",
                           rpcurdown,
                           intel_gt_pm_interval_to_ns(&dev_priv->gt,
                                                      rpcurdown));
-               seq_printf(m, "RP PREV DOWN: %d (%dns)\n",
+               seq_printf(m, "RP PREV DOWN: %d (%lldns)\n",
                           rpprevdown,
                           intel_gt_pm_interval_to_ns(&dev_priv->gt,
                                                      rpprevdown));
        return 0;
  }
  
 -static int i915_ring_freq_table(struct seq_file *m, void *unused)
 -{
 -      struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      struct intel_rps *rps = &dev_priv->gt.rps;
 -      unsigned int max_gpu_freq, min_gpu_freq;
 -      intel_wakeref_t wakeref;
 -      int gpu_freq, ia_freq;
 -
 -      if (!HAS_LLC(dev_priv))
 -              return -ENODEV;
 -
 -      min_gpu_freq = rps->min_freq;
 -      max_gpu_freq = rps->max_freq;
 -      if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 -              /* Convert GT frequency to 50 HZ units */
 -              min_gpu_freq /= GEN9_FREQ_SCALER;
 -              max_gpu_freq /= GEN9_FREQ_SCALER;
 -      }
 -
 -      seq_puts(m, "GPU freq (MHz)\tEffective CPU freq (MHz)\tEffective Ring freq (MHz)\n");
 -
 -      wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 -      for (gpu_freq = min_gpu_freq; gpu_freq <= max_gpu_freq; gpu_freq++) {
 -              ia_freq = gpu_freq;
 -              sandybridge_pcode_read(dev_priv,
 -                                     GEN6_PCODE_READ_MIN_FREQ_TABLE,
 -                                     &ia_freq, NULL);
 -              seq_printf(m, "%d\t\t%d\t\t\t\t%d\n",
 -                         intel_gpu_freq(rps,
 -                                        (gpu_freq *
 -                                         (IS_GEN9_BC(dev_priv) ||
 -                                          INTEL_GEN(dev_priv) >= 10 ?
 -                                          GEN9_FREQ_SCALER : 1))),
 -                         ((ia_freq >> 0) & 0xff) * 100,
 -                         ((ia_freq >> 8) & 0xff) * 100);
 -      }
 -      intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
 -
 -      return 0;
 -}
 -
 -static void describe_ctx_ring(struct seq_file *m, struct intel_ring *ring)
 -{
 -      seq_printf(m, " (ringbuffer, space: %d, head: %u, tail: %u, emit: %u)",
 -                 ring->space, ring->head, ring->tail, ring->emit);
 -}
 -
 -static int i915_context_status(struct seq_file *m, void *unused)
 -{
 -      struct drm_i915_private *i915 = node_to_i915(m->private);
 -      struct i915_gem_context *ctx, *cn;
 -
 -      spin_lock(&i915->gem.contexts.lock);
 -      list_for_each_entry_safe(ctx, cn, &i915->gem.contexts.list, link) {
 -              struct i915_gem_engines_iter it;
 -              struct intel_context *ce;
 -
 -              if (!kref_get_unless_zero(&ctx->ref))
 -                      continue;
 -
 -              spin_unlock(&i915->gem.contexts.lock);
 -
 -              seq_puts(m, "HW context ");
 -              if (ctx->pid) {
 -                      struct task_struct *task;
 -
 -                      task = get_pid_task(ctx->pid, PIDTYPE_PID);
 -                      if (task) {
 -                              seq_printf(m, "(%s [%d]) ",
 -                                         task->comm, task->pid);
 -                              put_task_struct(task);
 -                      }
 -              } else if (IS_ERR(ctx->file_priv)) {
 -                      seq_puts(m, "(deleted) ");
 -              } else {
 -                      seq_puts(m, "(kernel) ");
 -              }
 -
 -              seq_putc(m, ctx->remap_slice ? 'R' : 'r');
 -              seq_putc(m, '\n');
 -
 -              for_each_gem_engine(ce,
 -                                  i915_gem_context_lock_engines(ctx), it) {
 -                      if (intel_context_pin_if_active(ce)) {
 -                              seq_printf(m, "%s: ", ce->engine->name);
 -                              if (ce->state)
 -                                      i915_debugfs_describe_obj(m, ce->state->obj);
 -                              describe_ctx_ring(m, ce->ring);
 -                              seq_putc(m, '\n');
 -                              intel_context_unpin(ce);
 -                      }
 -              }
 -              i915_gem_context_unlock_engines(ctx);
 -
 -              seq_putc(m, '\n');
 -
 -              spin_lock(&i915->gem.contexts.lock);
 -              list_safe_reset_next(ctx, cn, link);
 -              i915_gem_context_put(ctx);
 -      }
 -      spin_unlock(&i915->gem.contexts.lock);
 -
 -      return 0;
 -}
 -
  static const char *swizzle_string(unsigned swizzle)
  {
        switch (swizzle) {
@@@ -786,6 -1194,20 +787,6 @@@ static int i915_swizzle_info(struct seq
        return 0;
  }
  
 -static const char *rps_power_to_str(unsigned int power)
 -{
 -      static const char * const strings[] = {
 -              [LOW_POWER] = "low power",
 -              [BETWEEN] = "mixed",
 -              [HIGH_POWER] = "high power",
 -      };
 -
 -      if (power >= ARRAY_SIZE(strings) || !strings[power])
 -              return "unknown";
 -
 -      return strings[power];
 -}
 -
  static int i915_rps_boost_info(struct seq_file *m, void *data)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
                   intel_gpu_freq(rps, rps->efficient_freq),
                   intel_gpu_freq(rps, rps->boost_freq));
  
-       seq_printf(m, "Wait boosts: %d\n", atomic_read(&rps->boosts));
+       seq_printf(m, "Wait boosts: %d\n", READ_ONCE(rps->boosts));
  
 -      if (INTEL_GEN(dev_priv) >= 6 && intel_rps_is_active(rps)) {
 -              u32 rpup, rpupei;
 -              u32 rpdown, rpdownei;
 -
 -              intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
 -              rpup = I915_READ_FW(GEN6_RP_CUR_UP) & GEN6_RP_EI_MASK;
 -              rpupei = I915_READ_FW(GEN6_RP_CUR_UP_EI) & GEN6_RP_EI_MASK;
 -              rpdown = I915_READ_FW(GEN6_RP_CUR_DOWN) & GEN6_RP_EI_MASK;
 -              rpdownei = I915_READ_FW(GEN6_RP_CUR_DOWN_EI) & GEN6_RP_EI_MASK;
 -              intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
 -
 -              seq_printf(m, "\nRPS Autotuning (current \"%s\" window):\n",
 -                         rps_power_to_str(rps->power.mode));
 -              seq_printf(m, "  Avg. up: %d%% [above threshold? %d%%]\n",
 -                         rpup && rpupei ? 100 * rpup / rpupei : 0,
 -                         rps->power.up_threshold);
 -              seq_printf(m, "  Avg. down: %d%% [below threshold? %d%%]\n",
 -                         rpdown && rpdownei ? 100 * rpdown / rpdownei : 0,
 -                         rps->power.down_threshold);
 -      } else {
 -              seq_puts(m, "\nRPS Autotuning inactive\n");
 -      }
 -
 -      return 0;
 -}
 -
 -static int i915_llc(struct seq_file *m, void *data)
 -{
 -      struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      const bool edram = INTEL_GEN(dev_priv) > 8;
 -
 -      seq_printf(m, "LLC: %s\n", yesno(HAS_LLC(dev_priv)));
 -      seq_printf(m, "%s: %uMB\n", edram ? "eDRAM" : "eLLC",
 -                 dev_priv->edram_size_mb);
 -
        return 0;
  }
  
@@@ -824,7 -1281,7 +825,7 @@@ static int i915_runtime_pm_status(struc
                seq_puts(m, "Runtime power management not supported\n");
  
        seq_printf(m, "Runtime power status: %s\n",
 -                 enableddisabled(!dev_priv->power_domains.wakeref));
 +                 enableddisabled(!dev_priv->power_domains.init_wakeref));
  
        seq_printf(m, "GPU idle: %s\n", yesno(!dev_priv->gt.awake));
        seq_printf(m, "IRQs disabled: %s\n",
  
  static int i915_engine_info(struct seq_file *m, void *unused)
  {
-       struct drm_i915_private *dev_priv = node_to_i915(m->private);
+       struct drm_i915_private *i915 = node_to_i915(m->private);
        struct intel_engine_cs *engine;
        intel_wakeref_t wakeref;
        struct drm_printer p;
  
-       wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
+       wakeref = intel_runtime_pm_get(&i915->runtime_pm);
  
-       seq_printf(m, "GT awake? %s [%d]\n",
-                  yesno(dev_priv->gt.awake),
-                  atomic_read(&dev_priv->gt.wakeref.count));
-       seq_printf(m, "CS timestamp frequency: %u Hz\n",
-                  RUNTIME_INFO(dev_priv)->cs_timestamp_frequency_hz);
+       seq_printf(m, "GT awake? %s [%d], %llums\n",
+                  yesno(i915->gt.awake),
+                  atomic_read(&i915->gt.wakeref.count),
+                  ktime_to_ms(intel_gt_get_awake_time(&i915->gt)));
+       seq_printf(m, "CS timestamp frequency: %u Hz, %d ns\n",
+                  i915->gt.clock_frequency,
+                  i915->gt.clock_period_ns);
  
        p = drm_seq_file_printer(m);
-       for_each_uabi_engine(engine, dev_priv)
+       for_each_uabi_engine(engine, i915)
                intel_engine_dump(engine, &p, "%s\n", engine->name);
  
-       intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
+       intel_gt_show_timelines(&i915->gt, &p, i915_request_show_with_schedule);
+       intel_runtime_pm_put(&i915->runtime_pm, wakeref);
  
        return 0;
  }
  
 -static int i915_shrinker_info(struct seq_file *m, void *unused)
 -{
 -      struct drm_i915_private *i915 = node_to_i915(m->private);
 -
 -      seq_printf(m, "seeks = %d\n", i915->mm.shrinker.seeks);
 -      seq_printf(m, "batch = %lu\n", i915->mm.shrinker.batch);
 -
 -      return 0;
 -}
 -
  static int i915_wa_registers(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *i915 = node_to_i915(m->private);
@@@ -945,7 -1416,7 +950,7 @@@ i915_perf_noa_delay_set(void *data, u6
         * This would lead to infinite waits as we're doing timestamp
         * difference on the CS with only 32bits.
         */
-       if (i915_cs_timestamp_ns_to_ticks(i915, val) > U32_MAX)
+       if (intel_gt_ns_to_clock_interval(&i915->gt, val) > U32_MAX)
                return -EINVAL;
  
        atomic64_set(&i915->perf.noa_programming_delay, val);
@@@ -1063,6 -1534,55 +1068,6 @@@ DEFINE_SIMPLE_ATTRIBUTE(i915_drop_cache
                        i915_drop_caches_get, i915_drop_caches_set,
                        "0x%08llx\n");
  
 -static int
 -i915_cache_sharing_get(void *data, u64 *val)
 -{
 -      struct drm_i915_private *dev_priv = data;
 -      intel_wakeref_t wakeref;
 -      u32 snpcr = 0;
 -
 -      if (!(IS_GEN_RANGE(dev_priv, 6, 7)))
 -              return -ENODEV;
 -
 -      with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref)
 -              snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
 -
 -      *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT;
 -
 -      return 0;
 -}
 -
 -static int
 -i915_cache_sharing_set(void *data, u64 val)
 -{
 -      struct drm_i915_private *dev_priv = data;
 -      intel_wakeref_t wakeref;
 -
 -      if (!(IS_GEN_RANGE(dev_priv, 6, 7)))
 -              return -ENODEV;
 -
 -      if (val > 3)
 -              return -EINVAL;
 -
 -      drm_dbg(&dev_priv->drm,
 -              "Manually setting uncore sharing to %llu\n", val);
 -      with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
 -              u32 snpcr;
 -
 -              /* Update the cache sharing policy here as well */
 -              snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
 -              snpcr &= ~GEN6_MBC_SNPCR_MASK;
 -              snpcr |= val << GEN6_MBC_SNPCR_SHIFT;
 -              I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
 -      }
 -
 -      return 0;
 -}
 -
 -DEFINE_SIMPLE_ATTRIBUTE(i915_cache_sharing_fops,
 -                      i915_cache_sharing_get, i915_cache_sharing_set,
 -                      "%llu\n");
 -
  static int i915_sseu_status(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *i915 = node_to_i915(m->private);
@@@ -1106,10 -1626,16 +1111,10 @@@ static const struct file_operations i91
  static const struct drm_info_list i915_debugfs_list[] = {
        {"i915_capabilities", i915_capabilities, 0},
        {"i915_gem_objects", i915_gem_object_info, 0},
 -      {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
 -      {"i915_gem_interrupt", i915_interrupt_info, 0},
        {"i915_frequency_info", i915_frequency_info, 0},
 -      {"i915_ring_freq_table", i915_ring_freq_table, 0},
 -      {"i915_context_status", i915_context_status, 0},
        {"i915_swizzle_info", i915_swizzle_info, 0},
 -      {"i915_llc", i915_llc, 0},
        {"i915_runtime_pm_status", i915_runtime_pm_status, 0},
        {"i915_engine_info", i915_engine_info, 0},
 -      {"i915_shrinker_info", i915_shrinker_info, 0},
        {"i915_wa_registers", i915_wa_registers, 0},
        {"i915_sseu_status", i915_sseu_status, 0},
        {"i915_rps_boost_info", i915_rps_boost_info, 0},
@@@ -1122,6 -1648,7 +1127,6 @@@ static const struct i915_debugfs_files 
  } i915_debugfs_files[] = {
        {"i915_perf_noa_delay", &i915_perf_noa_delay_fops},
        {"i915_wedged", &i915_wedged_fops},
 -      {"i915_cache_sharing", &i915_cache_sharing_fops},
        {"i915_gem_drop_caches", &i915_drop_caches_fops},
  #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
        {"i915_error_state", &i915_error_state_fops},
index 643a899b3b44937f5ed4524a31bdc7341d9ce649,8a0d2daab7257a91ba205865b4071dc2009906a5..f5666b44ea9dac8b64a46d15be6be9f5b1d27edb
@@@ -410,6 -410,7 +410,7 @@@ static int i915_driver_mmio_probe(struc
  
        /* Try to make sure MCHBAR is enabled before poking at it */
        intel_setup_mchbar(dev_priv);
+       intel_device_info_runtime_init(dev_priv);
  
        ret = intel_gt_init_mmio(&dev_priv->gt);
        if (ret)
@@@ -516,8 -517,6 +517,6 @@@ static int i915_driver_hw_probe(struct 
        if (i915_inject_probe_failure(dev_priv))
                return -ENODEV;
  
-       intel_device_info_runtime_init(dev_priv);
        if (HAS_PPGTT(dev_priv)) {
                if (intel_vgpu_active(dev_priv) &&
                    !intel_vgpu_has_full_ppgtt(dev_priv)) {
  
        pci_set_master(pdev);
  
 -      cpu_latency_qos_add_request(&dev_priv->pm_qos, PM_QOS_DEFAULT_VALUE);
 -
        intel_gt_init_workarounds(dev_priv);
  
        /* On the 945G/GM, the chipset reports the MSI capability on the
  err_msi:
        if (pdev->msi_enabled)
                pci_disable_msi(pdev);
 -      cpu_latency_qos_remove_request(&dev_priv->pm_qos);
  err_mem_regions:
        intel_memory_regions_driver_release(dev_priv);
  err_ggtt:
@@@ -645,6 -647,8 +644,6 @@@ static void i915_driver_hw_remove(struc
  
        if (pdev->msi_enabled)
                pci_disable_msi(pdev);
 -
 -      cpu_latency_qos_remove_request(&dev_priv->pm_qos);
  }
  
  /**
@@@ -733,7 -737,6 +732,7 @@@ static void i915_driver_unregister(stru
         * events.
         */
        drm_kms_helper_poll_fini(&dev_priv->drm);
 +      drm_atomic_helper_shutdown(&dev_priv->drm);
  
        intel_gt_driver_unregister(&dev_priv->gt);
        acpi_video_unregister();
@@@ -936,6 -939,8 +935,6 @@@ void i915_driver_remove(struct drm_i915
  
        i915_gem_suspend(i915);
  
 -      drm_atomic_helper_shutdown(&i915->drm);
 -
        intel_gvt_driver_remove(i915);
  
        intel_modeset_driver_remove(i915);
@@@ -1046,8 -1051,6 +1045,8 @@@ static void intel_shutdown_encoders(str
  
  void i915_driver_shutdown(struct drm_i915_private *i915)
  {
 +      disable_rpm_wakeref_asserts(&i915->runtime_pm);
 +
        i915_gem_suspend(i915);
  
        drm_kms_helper_poll_disable(&i915->drm);
  
        intel_suspend_encoders(i915);
        intel_shutdown_encoders(i915);
 +
 +      enable_rpm_wakeref_asserts(&i915->runtime_pm);
  }
  
  static bool suspend_to_idle(struct drm_i915_private *dev_priv)
@@@ -1269,8 -1270,6 +1268,8 @@@ static int i915_drm_resume(struct drm_d
  
        intel_power_domains_enable(dev_priv);
  
 +      intel_gvt_resume(dev_priv);
 +
        enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
  
        return 0;
index 2688f3e3e3491034fa99d4577912f1dc26273dd8,dee01f743f6555888769d0e263ed97d65d4ad35f..e3d58299b323f2d325b748e9a0a4c09b66c5d54f
@@@ -79,9 -79,9 +79,9 @@@
  #include "gem/i915_gem_shrinker.h"
  #include "gem/i915_gem_stolen.h"
  
- #include "gt/intel_lrc.h"
  #include "gt/intel_engine.h"
  #include "gt/intel_gt_types.h"
+ #include "gt/intel_region_lmem.h"
  #include "gt/intel_workarounds.h"
  #include "gt/uc/intel_uc.h"
  
  #include "i915_vma.h"
  #include "i915_irq.h"
  
- #include "intel_region_lmem.h"
  
  /* General customization:
   */
@@@ -416,7 -415,6 +415,7 @@@ struct intel_fbc 
                u16 gen9_wa_cfb_stride;
                u16 interval;
                s8 fence_id;
 +              bool psr2_active;
        } state_cache;
  
        /*
@@@ -509,6 -507,7 +508,6 @@@ struct i915_psr 
        bool dc3co_enabled;
        u32 dc3co_exit_delay;
        struct delayed_work dc3co_work;
 -      bool force_mode_changed;
        struct drm_dp_vsc_sdp vsc;
  };
  
@@@ -892,6 -891,9 +891,6 @@@ struct drm_i915_private 
  
        bool display_irqs_enabled;
  
 -      /* To control wakeup latency, e.g. for irq-driven dp aux transfers. */
 -      struct pm_qos_request pm_qos;
 -
        /* Sideband mailbox protection */
        struct mutex sb_lock;
        struct pm_qos_request sb_qos;
                struct i915_gem_contexts {
                        spinlock_t lock; /* locks list */
                        struct list_head list;
-                       struct llist_head free_list;
-                       struct work_struct free_work;
                } contexts;
  
                /*
@@@ -1557,7 -1556,6 +1553,7 @@@ extern const struct i915_rev_steppings 
        (IS_ICELAKE(p) && IS_REVID(p, since, until))
  
  #define EHL_REVID_A0            0x0
 +#define EHL_REVID_B0            0x1
  
  #define IS_JSL_EHL_REVID(p, since, until) \
        (IS_JSL_EHL(p) && IS_REVID(p, since, until))
@@@ -1570,16 -1568,30 +1566,30 @@@ enum 
        TGL_REVID_D0,
  };
  
- extern const struct i915_rev_steppings tgl_uy_revids[];
- extern const struct i915_rev_steppings tgl_revids[];
+ #define TGL_UY_REVIDS_SIZE    4
+ #define TGL_REVIDS_SIZE               2
+ extern const struct i915_rev_steppings tgl_uy_revids[TGL_UY_REVIDS_SIZE];
+ extern const struct i915_rev_steppings tgl_revids[TGL_REVIDS_SIZE];
  
  static inline const struct i915_rev_steppings *
  tgl_revids_get(struct drm_i915_private *dev_priv)
  {
-       if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv))
-               return &tgl_uy_revids[INTEL_REVID(dev_priv)];
-       else
-               return &tgl_revids[INTEL_REVID(dev_priv)];
+       u8 revid = INTEL_REVID(dev_priv);
+       u8 size;
+       const struct i915_rev_steppings *tgl_revid_tbl;
+       if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) {
+               tgl_revid_tbl = tgl_uy_revids;
+               size = ARRAY_SIZE(tgl_uy_revids);
+       } else {
+               tgl_revid_tbl = tgl_revids;
+               size = ARRAY_SIZE(tgl_revids);
+       }
+       revid = min_t(u8, revid, size - 1);
+       return &tgl_revid_tbl[revid];
  }
  
  #define IS_TGL_DISP_REVID(p, since, until) \
  
  #define IS_TGL_UY_GT_REVID(p, since, until) \
        ((IS_TGL_U(p) || IS_TGL_Y(p)) && \
-        tgl_uy_revids[INTEL_REVID(p)].gt_stepping >= (since) && \
-        tgl_uy_revids[INTEL_REVID(p)].gt_stepping <= (until))
+        tgl_revids_get(p)->gt_stepping >= (since) && \
+        tgl_revids_get(p)->gt_stepping <= (until))
  
  #define IS_TGL_GT_REVID(p, since, until) \
        (IS_TIGERLAKE(p) && \
         !(IS_TGL_U(p) || IS_TGL_Y(p)) && \
-        tgl_revids[INTEL_REVID(p)].gt_stepping >= (since) && \
-        tgl_revids[INTEL_REVID(p)].gt_stepping <= (until))
+        tgl_revids_get(p)->gt_stepping >= (since) && \
+        tgl_revids_get(p)->gt_stepping <= (until))
  
  #define RKL_REVID_A0          0x0
  #define RKL_REVID_B0          0x1
                (INTEL_INFO(dev_priv)->has_logical_ring_contexts)
  #define HAS_LOGICAL_RING_ELSQ(dev_priv) \
                (INTEL_INFO(dev_priv)->has_logical_ring_elsq)
- #define HAS_LOGICAL_RING_PREEMPTION(dev_priv) \
-               (INTEL_INFO(dev_priv)->has_logical_ring_preemption)
  
  #define HAS_MASTER_UNIT_IRQ(dev_priv) (INTEL_INFO(dev_priv)->has_master_unit_irq)
  
@@@ -1968,6 -1978,43 +1976,6 @@@ mkwrite_device_info(struct drm_i915_pri
  int i915_reg_read_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file);
  
 -#define __I915_REG_OP(op__, dev_priv__, ...) \
 -      intel_uncore_##op__(&(dev_priv__)->uncore, __VA_ARGS__)
 -
 -#define I915_READ(reg__)       __I915_REG_OP(read, dev_priv, (reg__))
 -#define I915_WRITE(reg__, val__) __I915_REG_OP(write, dev_priv, (reg__), (val__))
 -
 -#define POSTING_READ(reg__)   __I915_REG_OP(posting_read, dev_priv, (reg__))
 -
 -/* These are untraced mmio-accessors that are only valid to be used inside
 - * critical sections, such as inside IRQ handlers, where forcewake is explicitly
 - * controlled.
 - *
 - * Think twice, and think again, before using these.
 - *
 - * As an example, these accessors can possibly be used between:
 - *
 - * spin_lock_irq(&dev_priv->uncore.lock);
 - * intel_uncore_forcewake_get__locked();
 - *
 - * and
 - *
 - * intel_uncore_forcewake_put__locked();
 - * spin_unlock_irq(&dev_priv->uncore.lock);
 - *
 - *
 - * Note: some registers may not need forcewake held, so
 - * intel_uncore_forcewake_{get,put} can be omitted, see
 - * intel_uncore_forcewake_for_reg().
 - *
 - * Certain architectures will die if the same cacheline is concurrently accessed
 - * by different clients (e.g. on Ivybridge). Access to registers should
 - * therefore generally be serialised, by either the dev_priv->uncore.lock or
 - * a more localised lock guarding all access to that bank of registers.
 - */
 -#define I915_READ_FW(reg__) __I915_REG_OP(read_fw, dev_priv, (reg__))
 -#define I915_WRITE_FW(reg__, val__) __I915_REG_OP(write_fw, dev_priv, (reg__), (val__))
 -
  /* i915_mm.c */
  int remap_io_mapping(struct vm_area_struct *vma,
                     unsigned long addr, unsigned long pfn, unsigned long size,
@@@ -1990,16 -2037,4 +1998,4 @@@ i915_coherent_map_type(struct drm_i915_
        return HAS_LLC(i915) ? I915_MAP_WB : I915_MAP_WC;
  }
  
- static inline u64 i915_cs_timestamp_ns_to_ticks(struct drm_i915_private *i915, u64 val)
- {
-       return DIV_ROUND_UP_ULL(val * RUNTIME_INFO(i915)->cs_timestamp_frequency_hz,
-                               1000000000);
- }
- static inline u64 i915_cs_timestamp_ticks_to_ns(struct drm_i915_private *i915, u64 val)
- {
-       return div_u64(val * 1000000000,
-                      RUNTIME_INFO(i915)->cs_timestamp_frequency_hz);
- }
  #endif
index 649c26518d26dd6e811e56a11030051240549d00,eb77e0da6378f57a16b2e0905b558e77e764fe7b..112ba5f2ce90e9334e0733769dd533901ce9719d
  #include "gem/i915_gem_context.h"
  #include "gt/intel_engine_pm.h"
  #include "gt/intel_engine_user.h"
+ #include "gt/intel_execlists_submission.h"
+ #include "gt/intel_gpu_commands.h"
  #include "gt/intel_gt.h"
- #include "gt/intel_lrc_reg.h"
+ #include "gt/intel_gt_clock_utils.h"
+ #include "gt/intel_lrc.h"
  #include "gt/intel_ring.h"
  
  #include "i915_drv.h"
@@@ -625,8 -628,7 +628,8 @@@ static int append_oa_sample(struct i915
  }
  
  /**
 - * Copies all buffered OA reports into userspace read() buffer.
 + * gen8_append_oa_reports - Copies all buffered OA reports into
 + *                        userspace read() buffer.
   * @stream: An i915-perf stream opened for OA metrics
   * @buf: destination buffer given by userspace
   * @count: the number of bytes userspace wants to read
@@@ -910,21 -912,15 +913,21 @@@ static int gen8_oa_read(struct i915_per
                                       DRM_I915_PERF_RECORD_OA_REPORT_LOST);
                if (ret)
                        return ret;
 -              intel_uncore_write(uncore, oastatus_reg,
 -                                 oastatus & ~GEN8_OASTATUS_REPORT_LOST);
 +
 +              intel_uncore_rmw(uncore, oastatus_reg,
 +                               GEN8_OASTATUS_COUNTER_OVERFLOW |
 +                               GEN8_OASTATUS_REPORT_LOST,
 +                               IS_GEN_RANGE(uncore->i915, 8, 11) ?
 +                               (GEN8_OASTATUS_HEAD_POINTER_WRAP |
 +                                GEN8_OASTATUS_TAIL_POINTER_WRAP) : 0);
        }
  
        return gen8_append_oa_reports(stream, buf, count, offset);
  }
  
  /**
 - * Copies all buffered OA reports into userspace read() buffer.
 + * gen7_append_oa_reports - Copies all buffered OA reports into
 + *                        userspace read() buffer.
   * @stream: An i915-perf stream opened for OA metrics
   * @buf: destination buffer given by userspace
   * @count: the number of bytes userspace wants to read
@@@ -1635,7 -1631,8 +1638,8 @@@ static int alloc_noa_wait(struct i915_p
        struct drm_i915_gem_object *bo;
        struct i915_vma *vma;
        const u64 delay_ticks = 0xffffffffffffffff -
-               i915_cs_timestamp_ns_to_ticks(i915, atomic64_read(&stream->perf->noa_programming_delay));
+               intel_gt_ns_to_clock_interval(stream->perf->i915->ggtt.vm.gt,
+                                             atomic64_read(&stream->perf->noa_programming_delay));
        const u32 base = stream->engine->mmio_base;
  #define CS_GPR(x) GEN8_RING_CS_GPR(base, x)
        u32 *batch, *ts0, *cs, *jump;
@@@ -3234,7 -3231,7 +3238,7 @@@ static long i915_perf_config_locked(str
  }
  
  /**
 - * i915_perf_ioctl - support ioctl() usage with i915 perf stream FDs
 + * i915_perf_ioctl_locked - support ioctl() usage with i915 perf stream FDs
   * @stream: An i915 perf stream
   * @cmd: the ioctl request
   * @arg: the ioctl data
@@@ -3516,7 -3513,8 +3520,8 @@@ err
  
  static u64 oa_exponent_to_ns(struct i915_perf *perf, int exponent)
  {
-       return i915_cs_timestamp_ticks_to_ns(perf->i915, 2ULL << exponent);
+       return intel_gt_clock_interval_to_ns(perf->i915->ggtt.vm.gt,
+                                            2ULL << exponent);
  }
  
  /**
@@@ -4370,11 -4368,11 +4375,11 @@@ void i915_perf_init(struct drm_i915_pri
        if (perf->ops.enable_metric_set) {
                mutex_init(&perf->lock);
  
-               oa_sample_rate_hard_limit =
-                       RUNTIME_INFO(i915)->cs_timestamp_frequency_hz / 2;
+               /* Choose a representative limit */
+               oa_sample_rate_hard_limit = i915->gt.clock_frequency / 2;
  
                mutex_init(&perf->metrics_lock);
-               idr_init(&perf->metrics_idr);
+               idr_init_base(&perf->metrics_idr, 1);
  
                /* We set up some ratelimit state to potentially throttle any
                 * _NOTES about spurious, invalid OA reports which we don't
index d76685ce03998143a090a52e787f799bcfc19a5b,7af4fabe5594e63d51c2f83777749148f089b9b7..2b88c0baa1bf5e684faf4f409cc14a6967279372
@@@ -4,6 -4,7 +4,6 @@@
   * Copyright © 2017-2018 Intel Corporation
   */
  
 -#include <linux/irq.h>
  #include <linux/pm_runtime.h>
  
  #include "gt/intel_engine.h"
@@@ -26,8 -27,6 +26,6 @@@
         BIT(I915_SAMPLE_WAIT) | \
         BIT(I915_SAMPLE_SEMA))
  
- #define ENGINE_SAMPLE_BITS (1 << I915_PMU_SAMPLE_BITS)
  static cpumask_t i915_pmu_cpumask;
  static unsigned int i915_pmu_target_cpu = -1;
  
@@@ -56,17 -55,42 +54,42 @@@ static bool is_engine_config(u64 config
        return config < __I915_PMU_OTHER(0);
  }
  
- static unsigned int config_enabled_bit(u64 config)
+ static unsigned int other_bit(const u64 config)
+ {
+       unsigned int val;
+       switch (config) {
+       case I915_PMU_ACTUAL_FREQUENCY:
+               val =  __I915_PMU_ACTUAL_FREQUENCY_ENABLED;
+               break;
+       case I915_PMU_REQUESTED_FREQUENCY:
+               val = __I915_PMU_REQUESTED_FREQUENCY_ENABLED;
+               break;
+       case I915_PMU_RC6_RESIDENCY:
+               val = __I915_PMU_RC6_RESIDENCY_ENABLED;
+               break;
+       default:
+               /*
+                * Events that do not require sampling, or tracking state
+                * transitions between enabled and disabled can be ignored.
+                */
+               return -1;
+       }
+       return I915_ENGINE_SAMPLE_COUNT + val;
+ }
+ static unsigned int config_bit(const u64 config)
  {
        if (is_engine_config(config))
                return engine_config_sample(config);
        else
-               return ENGINE_SAMPLE_BITS + (config - __I915_PMU_OTHER(0));
+               return other_bit(config);
  }
  
- static u64 config_enabled_mask(u64 config)
+ static u64 config_mask(u64 config)
  {
-       return BIT_ULL(config_enabled_bit(config));
+       return BIT_ULL(config_bit(config));
  }
  
  static bool is_engine_event(struct perf_event *event)
        return is_engine_config(event->attr.config);
  }
  
- static unsigned int event_enabled_bit(struct perf_event *event)
+ static unsigned int event_bit(struct perf_event *event)
  {
-       return config_enabled_bit(event->attr.config);
+       return config_bit(event->attr.config);
  }
  
  static bool pmu_needs_timer(struct i915_pmu *pmu, bool gpu_active)
  {
        struct drm_i915_private *i915 = container_of(pmu, typeof(*i915), pmu);
-       u64 enable;
+       u32 enable;
  
        /*
         * Only some counters need the sampling timer.
         * Mask out all the ones which do not need the timer, or in
         * other words keep all the ones that could need the timer.
         */
-       enable &= config_enabled_mask(I915_PMU_ACTUAL_FREQUENCY) |
-                 config_enabled_mask(I915_PMU_REQUESTED_FREQUENCY) |
+       enable &= config_mask(I915_PMU_ACTUAL_FREQUENCY) |
+                 config_mask(I915_PMU_REQUESTED_FREQUENCY) |
                  ENGINE_SAMPLE_MASK;
  
        /*
@@@ -137,11 -161,9 +160,9 @@@ static u64 __get_rc6(struct intel_gt *g
        return val;
  }
  
- #if IS_ENABLED(CONFIG_PM)
- static inline s64 ktime_since(const ktime_t kt)
+ static inline s64 ktime_since_raw(const ktime_t kt)
  {
-       return ktime_to_ns(ktime_sub(ktime_get(), kt));
+       return ktime_to_ns(ktime_sub(ktime_get_raw(), kt));
  }
  
  static u64 get_rc6(struct intel_gt *gt)
                 * on top of the last known real value, as the approximated RC6
                 * counter value.
                 */
-               val = ktime_since(pmu->sleep_last);
+               val = ktime_since_raw(pmu->sleep_last);
                val += pmu->sample[__I915_SAMPLE_RC6].cur;
        }
  
        return val;
  }
  
- static void park_rc6(struct drm_i915_private *i915)
+ static void init_rc6(struct i915_pmu *pmu)
  {
-       struct i915_pmu *pmu = &i915->pmu;
+       struct drm_i915_private *i915 = container_of(pmu, typeof(*i915), pmu);
+       intel_wakeref_t wakeref;
  
-       if (pmu->enable & config_enabled_mask(I915_PMU_RC6_RESIDENCY))
+       with_intel_runtime_pm(i915->gt.uncore->rpm, wakeref) {
                pmu->sample[__I915_SAMPLE_RC6].cur = __get_rc6(&i915->gt);
-       pmu->sleep_last = ktime_get();
+               pmu->sample[__I915_SAMPLE_RC6_LAST_REPORTED].cur =
+                                       pmu->sample[__I915_SAMPLE_RC6].cur;
+               pmu->sleep_last = ktime_get_raw();
+       }
  }
  
- #else
- static u64 get_rc6(struct intel_gt *gt)
+ static void park_rc6(struct drm_i915_private *i915)
  {
-       return __get_rc6(gt);
- }
- static void park_rc6(struct drm_i915_private *i915) {}
+       struct i915_pmu *pmu = &i915->pmu;
  
- #endif
+       pmu->sample[__I915_SAMPLE_RC6].cur = __get_rc6(&i915->gt);
+       pmu->sleep_last = ktime_get_raw();
+ }
  
  static void __i915_pmu_maybe_start_timer(struct i915_pmu *pmu)
  {
@@@ -343,8 -365,8 +364,8 @@@ add_sample_mult(struct i915_pmu_sample 
  static bool frequency_sampling_enabled(struct i915_pmu *pmu)
  {
        return pmu->enable &
-              (config_enabled_mask(I915_PMU_ACTUAL_FREQUENCY) |
-               config_enabled_mask(I915_PMU_REQUESTED_FREQUENCY));
+              (config_mask(I915_PMU_ACTUAL_FREQUENCY) |
+               config_mask(I915_PMU_REQUESTED_FREQUENCY));
  }
  
  static void
@@@ -362,7 -384,7 +383,7 @@@ frequency_sample(struct intel_gt *gt, u
        if (!intel_gt_pm_get_if_awake(gt))
                return;
  
-       if (pmu->enable & config_enabled_mask(I915_PMU_ACTUAL_FREQUENCY)) {
+       if (pmu->enable & config_mask(I915_PMU_ACTUAL_FREQUENCY)) {
                u32 val;
  
                /*
                                intel_gpu_freq(rps, val), period_ns / 1000);
        }
  
-       if (pmu->enable & config_enabled_mask(I915_PMU_REQUESTED_FREQUENCY)) {
+       if (pmu->enable & config_mask(I915_PMU_REQUESTED_FREQUENCY)) {
                add_sample_mult(&pmu->sample[__I915_SAMPLE_FREQ_REQ],
                                intel_gpu_freq(rps, rps->cur_freq),
                                period_ns / 1000);
@@@ -423,6 -445,22 +444,6 @@@ static enum hrtimer_restart i915_sample
        return HRTIMER_RESTART;
  }
  
 -static u64 count_interrupts(struct drm_i915_private *i915)
 -{
 -      /* open-coded kstat_irqs() */
 -      struct irq_desc *desc = irq_to_desc(i915->drm.pdev->irq);
 -      u64 sum = 0;
 -      int cpu;
 -
 -      if (!desc || !desc->kstat_irqs)
 -              return 0;
 -
 -      for_each_possible_cpu(cpu)
 -              sum += *per_cpu_ptr(desc->kstat_irqs, cpu);
 -
 -      return sum;
 -}
 -
  static void i915_pmu_event_destroy(struct perf_event *event)
  {
        struct drm_i915_private *i915 =
@@@ -471,6 -509,8 +492,8 @@@ config_status(struct drm_i915_private *
                if (!HAS_RC6(i915))
                        return -ENODEV;
                break;
+       case I915_PMU_SOFTWARE_GT_AWAKE_TIME:
+               break;
        default:
                return -ENOENT;
        }
@@@ -573,11 -613,14 +596,14 @@@ static u64 __i915_pmu_event_read(struc
                                   USEC_PER_SEC /* to MHz */);
                        break;
                case I915_PMU_INTERRUPTS:
 -                      val = count_interrupts(i915);
 +                      val = READ_ONCE(pmu->irq_count);
                        break;
                case I915_PMU_RC6_RESIDENCY:
                        val = get_rc6(&i915->gt);
                        break;
+               case I915_PMU_SOFTWARE_GT_AWAKE_TIME:
+                       val = ktime_to_ns(intel_gt_get_awake_time(&i915->gt));
+                       break;
                }
        }
  
@@@ -610,12 -653,14 +636,14 @@@ static void i915_pmu_enable(struct perf
  {
        struct drm_i915_private *i915 =
                container_of(event->pmu, typeof(*i915), pmu.base);
-       unsigned int bit = event_enabled_bit(event);
        struct i915_pmu *pmu = &i915->pmu;
-       intel_wakeref_t wakeref;
        unsigned long flags;
+       unsigned int bit;
+       bit = event_bit(event);
+       if (bit == -1)
+               goto update;
  
-       wakeref = intel_runtime_pm_get(&i915->runtime_pm);
        spin_lock_irqsave(&pmu->lock, flags);
  
        /*
        GEM_BUG_ON(bit >= ARRAY_SIZE(pmu->enable_count));
        GEM_BUG_ON(pmu->enable_count[bit] == ~0);
  
-       if (pmu->enable_count[bit] == 0 &&
-           config_enabled_mask(I915_PMU_RC6_RESIDENCY) & BIT_ULL(bit)) {
-               pmu->sample[__I915_SAMPLE_RC6_LAST_REPORTED].cur = 0;
-               pmu->sample[__I915_SAMPLE_RC6].cur = __get_rc6(&i915->gt);
-               pmu->sleep_last = ktime_get();
-       }
        pmu->enable |= BIT_ULL(bit);
        pmu->enable_count[bit]++;
  
  
        spin_unlock_irqrestore(&pmu->lock, flags);
  
+ update:
        /*
         * Store the current counter value so we can report the correct delta
         * for all listeners. Even when the event was already enabled and has
         * an existing non-zero value.
         */
        local64_set(&event->hw.prev_count, __i915_pmu_event_read(event));
-       intel_runtime_pm_put(&i915->runtime_pm, wakeref);
  }
  
  static void i915_pmu_disable(struct perf_event *event)
  {
        struct drm_i915_private *i915 =
                container_of(event->pmu, typeof(*i915), pmu.base);
-       unsigned int bit = event_enabled_bit(event);
+       unsigned int bit = event_bit(event);
        struct i915_pmu *pmu = &i915->pmu;
        unsigned long flags;
  
+       if (bit == -1)
+               return;
        spin_lock_irqsave(&pmu->lock, flags);
  
        if (is_engine_event(event)) {
@@@ -881,6 -921,7 +904,7 @@@ create_event_attributes(struct i915_pm
                __event(I915_PMU_REQUESTED_FREQUENCY, "requested-frequency", "M"),
                __event(I915_PMU_INTERRUPTS, "interrupts", NULL),
                __event(I915_PMU_RC6_RESIDENCY, "rc6-residency", "ns"),
+               __event(I915_PMU_SOFTWARE_GT_AWAKE_TIME, "software-gt-awake-time", "ns"),
        };
        static const struct {
                enum drm_i915_pmu_engine_sample sample;
@@@ -1130,6 -1171,7 +1154,7 @@@ void i915_pmu_register(struct drm_i915_
        hrtimer_init(&pmu->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        pmu->timer.function = i915_sample;
        pmu->cpuhp.cpu = -1;
+       init_rc6(pmu);
  
        if (!is_igp(i915)) {
                pmu->name = kasprintf(GFP_KERNEL,
index 8405d6da5b9a65ef0a9a78a7044b9bb098c18b93,e33be99e6454e9fddaeab3748dbd5338f9096b24..60f9595f902cdf651c81d4a426f26d28e161649a
  
  struct drm_i915_private;
  
+ /**
+  * Non-engine events that we need to track enabled-disabled transition and
+  * current state.
+  */
+ enum i915_pmu_tracked_events {
+       __I915_PMU_ACTUAL_FREQUENCY_ENABLED = 0,
+       __I915_PMU_REQUESTED_FREQUENCY_ENABLED,
+       __I915_PMU_RC6_RESIDENCY_ENABLED,
+       __I915_PMU_TRACKED_EVENT_COUNT, /* count marker */
+ };
+ /**
+  * Slots used from the sampling timer (non-engine events) with some extras for
+  * convenience.
+  */
  enum {
        __I915_SAMPLE_FREQ_ACT = 0,
        __I915_SAMPLE_FREQ_REQ,
@@@ -28,8 -43,7 +43,7 @@@
   * It is also used to know to needed number of event reference counters.
   */
  #define I915_PMU_MASK_BITS \
-       ((1 << I915_PMU_SAMPLE_BITS) + \
-        (I915_PMU_LAST + 1 - __I915_PMU_OTHER(0)))
+       (I915_ENGINE_SAMPLE_COUNT + __I915_PMU_TRACKED_EVENT_COUNT)
  
  #define I915_ENGINE_SAMPLE_COUNT (I915_SAMPLE_SEMA + 1)
  
@@@ -66,18 -80,17 +80,17 @@@ struct i915_pmu 
         */
        struct hrtimer timer;
        /**
-        * @enable: Bitmask of all currently enabled events.
+        * @enable: Bitmask of specific enabled events.
+        *
+        * For some events we need to track their state and do some internal
+        * house keeping.
         *
-        * Bits are derived from uAPI event numbers in a way that low 16 bits
-        * correspond to engine event _sample_ _type_ (I915_SAMPLE_QUEUED is
-        * bit 0), and higher bits correspond to other events (for instance
-        * I915_PMU_ACTUAL_FREQUENCY is bit 16 etc).
+        * Each engine event sampler type and event listed in enum
+        * i915_pmu_tracked_events gets a bit in this field.
         *
-        * In other words, low 16 bits are not per engine but per engine
-        * sampler type, while the upper bits are directly mapped to other
-        * event types.
+        * Low bits are engine samplers and other events continue from there.
         */
-       u64 enable;
+       u32 enable;
  
        /**
         * @timer_last:
         * @sleep_last: Last time GT parked for RC6 estimation.
         */
        ktime_t sleep_last;
 +      /**
 +       * @irq_count: Number of interrupts
 +       *
 +       * Intentionally unsigned long to avoid atomics or heuristics on 32bit.
 +       * 4e9 interrupts are a lot and postprocessing can really deal with an
 +       * occasional wraparound easily. It's 32bit after all.
 +       */
 +      unsigned long irq_count;
        /**
         * @events_attr_group: Device events attribute group.
         */
index 5385b081a37630a97fe6be25445b1f64528045d5,d9f32a342c687afea9bfbb984cffc6a29c4c9244..0b1a46a0d866bd12a0e86688fa57871e72d78b20
@@@ -33,6 -33,7 +33,7 @@@
  #include "gem/i915_gem_context.h"
  #include "gt/intel_breadcrumbs.h"
  #include "gt/intel_context.h"
+ #include "gt/intel_gpu_commands.h"
  #include "gt/intel_ring.h"
  #include "gt/intel_rps.h"
  
@@@ -197,7 -198,7 +198,7 @@@ __notify_execute_cb(struct i915_reques
  
        llist_for_each_entry_safe(cb, cn,
                                  llist_del_all(&rq->execute_cb),
 -                                work.llnode)
 +                                work.node.llist)
                fn(&cb->work);
  }
  
@@@ -306,10 -307,8 +307,8 @@@ bool i915_request_retire(struct i915_re
                spin_unlock_irq(&rq->lock);
        }
  
-       if (i915_request_has_waitboost(rq)) {
-               GEM_BUG_ON(!atomic_read(&rq->engine->gt->rps.num_waiters));
+       if (test_and_set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags))
                atomic_dec(&rq->engine->gt->rps.num_waiters);
-       }
  
        /*
         * We only loosely track inflight requests across preemption,
         * after removing the breadcrumb and signaling it, so that we do not
         * inadvertently attach the breadcrumb to a completed request.
         */
-       remove_from_engine(rq);
+       if (!list_empty(&rq->sched.link))
+               remove_from_engine(rq);
        GEM_BUG_ON(!llist_empty(&rq->execute_cb));
  
        __list_del_entry(&rq->link); /* poison neither prev/next (RCU walks) */
@@@ -460,7 -460,7 +460,7 @@@ __await_execution(struct i915_request *
         * callback first, then checking the ACTIVE bit, we serialise with
         * the completed/retired request.
         */
 -      if (llist_add(&cb->work.llnode, &signal->execute_cb)) {
 +      if (llist_add(&cb->work.node.llist, &signal->execute_cb)) {
                if (i915_request_is_active(signal) ||
                    __request_in_flight(signal))
                        __notify_execute_cb_imm(signal);
@@@ -488,6 -488,8 +488,8 @@@ void __i915_request_skip(struct i915_re
        if (rq->infix == rq->postfix)
                return;
  
+       RQ_TRACE(rq, "error: %d\n", rq->fence.error);
        /*
         * As this request likely depends on state from the lost
         * context, clear out all the user operations leaving the
@@@ -513,6 -515,17 +515,17 @@@ void i915_request_set_error_once(struc
        } while (!try_cmpxchg(&rq->fence.error, &old, error));
  }
  
+ void i915_request_mark_eio(struct i915_request *rq)
+ {
+       if (__i915_request_is_complete(rq))
+               return;
+       GEM_BUG_ON(i915_request_signaled(rq));
+       i915_request_set_error_once(rq, -EIO);
+       i915_request_mark_complete(rq);
+ }
  bool __i915_request_submit(struct i915_request *request)
  {
        struct intel_engine_cs *engine = request->engine;
        if (i915_request_completed(request))
                goto xfer;
  
-       if (unlikely(intel_context_is_closed(request->context) &&
-                    !intel_engine_has_heartbeat(engine)))
-               intel_context_set_banned(request->context);
        if (unlikely(intel_context_is_banned(request->context)))
                i915_request_set_error_once(request, -EIO);
  
@@@ -1582,6 -1591,12 +1591,12 @@@ struct i915_request *__i915_request_com
        return __i915_request_add_to_timeline(rq);
  }
  
+ void __i915_request_queue_bh(struct i915_request *rq)
+ {
+       i915_sw_fence_commit(&rq->semaphore);
+       i915_sw_fence_commit(&rq->submit);
+ }
  void __i915_request_queue(struct i915_request *rq,
                          const struct i915_sched_attr *attr)
  {
         */
        if (attr && rq->engine->schedule)
                rq->engine->schedule(rq, attr);
-       i915_sw_fence_commit(&rq->semaphore);
-       i915_sw_fence_commit(&rq->submit);
+       local_bh_disable();
+       __i915_request_queue_bh(rq);
+       local_bh_enable(); /* kick tasklets */
  }
  
  void i915_request_add(struct i915_request *rq)
@@@ -1823,7 -1840,7 +1840,7 @@@ long i915_request_wait(struct i915_requ
         * for unhappy HW.
         */
        if (i915_request_is_ready(rq))
-               intel_engine_flush_submission(rq->engine);
+               __intel_engine_flush_submission(rq->engine, false);
  
        for (;;) {
                set_current_state(state);
        return timeout;
  }
  
+ static int print_sched_attr(const struct i915_sched_attr *attr,
+                           char *buf, int x, int len)
+ {
+       if (attr->priority == I915_PRIORITY_INVALID)
+               return x;
+       x += snprintf(buf + x, len - x,
+                     " prio=%d", attr->priority);
+       return x;
+ }
+ static char queue_status(const struct i915_request *rq)
+ {
+       if (i915_request_is_active(rq))
+               return 'E';
+       if (i915_request_is_ready(rq))
+               return intel_engine_is_virtual(rq->engine) ? 'V' : 'R';
+       return 'U';
+ }
+ static const char *run_status(const struct i915_request *rq)
+ {
+       if (i915_request_completed(rq))
+               return "!";
+       if (i915_request_started(rq))
+               return "*";
+       if (!i915_sw_fence_signaled(&rq->semaphore))
+               return "&";
+       return "";
+ }
+ static const char *fence_status(const struct i915_request *rq)
+ {
+       if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags))
+               return "+";
+       if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &rq->fence.flags))
+               return "-";
+       return "";
+ }
+ void i915_request_show(struct drm_printer *m,
+                      const struct i915_request *rq,
+                      const char *prefix,
+                      int indent)
+ {
+       const char *name = rq->fence.ops->get_timeline_name((struct dma_fence *)&rq->fence);
+       char buf[80] = "";
+       int x = 0;
+       /*
+        * The prefix is used to show the queue status, for which we use
+        * the following flags:
+        *
+        *  U [Unready]
+        *    - initial status upon being submitted by the user
+        *
+        *    - the request is not ready for execution as it is waiting
+        *      for external fences
+        *
+        *  R [Ready]
+        *    - all fences the request was waiting on have been signaled,
+        *      and the request is now ready for execution and will be
+        *      in a backend queue
+        *
+        *    - a ready request may still need to wait on semaphores
+        *      [internal fences]
+        *
+        *  V [Ready/virtual]
+        *    - same as ready, but queued over multiple backends
+        *
+        *  E [Executing]
+        *    - the request has been transferred from the backend queue and
+        *      submitted for execution on HW
+        *
+        *    - a completed request may still be regarded as executing, its
+        *      status may not be updated until it is retired and removed
+        *      from the lists
+        */
+       x = print_sched_attr(&rq->sched.attr, buf, x, sizeof(buf));
+       drm_printf(m, "%s%.*s%c %llx:%lld%s%s %s @ %dms: %s\n",
+                  prefix, indent, "                ",
+                  queue_status(rq),
+                  rq->fence.context, rq->fence.seqno,
+                  run_status(rq),
+                  fence_status(rq),
+                  buf,
+                  jiffies_to_msecs(jiffies - rq->emitted_jiffies),
+                  name);
+ }
  #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
  #include "selftests/mock_request.c"
  #include "selftests/i915_request.c"
index ef767f04c37c28d15812b4a9274cc94c5bc5aa81,55ccb87a6670f1773cbac95cd2ecce3ddde97a21..f2d5ae59081e48e20c4c3b743e3c16d8396a18a4
@@@ -104,7 -104,7 +104,7 @@@ void intel_device_info_print_static(con
        drm_printf(p, "ppgtt-type: %d\n", info->ppgtt_type);
        drm_printf(p, "dma_mask_size: %u\n", info->dma_mask_size);
  
 -#define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->name));
 +#define PRINT_FLAG(name) drm_printf(p, "%s: %s\n", #name, yesno(info->name))
        DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG);
  #undef PRINT_FLAG
  
@@@ -117,150 -117,6 +117,6 @@@ void intel_device_info_print_runtime(co
                                     struct drm_printer *p)
  {
        drm_printf(p, "rawclk rate: %u kHz\n", info->rawclk_freq);
-       drm_printf(p, "CS timestamp frequency: %u Hz\n",
-                  info->cs_timestamp_frequency_hz);
- }
- static u32 read_reference_ts_freq(struct drm_i915_private *dev_priv)
- {
-       u32 ts_override = intel_uncore_read(&dev_priv->uncore,
-                                           GEN9_TIMESTAMP_OVERRIDE);
-       u32 base_freq, frac_freq;
-       base_freq = ((ts_override & GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_MASK) >>
-                    GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DIVIDER_SHIFT) + 1;
-       base_freq *= 1000000;
-       frac_freq = ((ts_override &
-                     GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_MASK) >>
-                    GEN9_TIMESTAMP_OVERRIDE_US_COUNTER_DENOMINATOR_SHIFT);
-       frac_freq = 1000000 / (frac_freq + 1);
-       return base_freq + frac_freq;
- }
- static u32 gen10_get_crystal_clock_freq(struct drm_i915_private *dev_priv,
-                                       u32 rpm_config_reg)
- {
-       u32 f19_2_mhz = 19200000;
-       u32 f24_mhz = 24000000;
-       u32 crystal_clock = (rpm_config_reg &
-                            GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >>
-                           GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT;
-       switch (crystal_clock) {
-       case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ:
-               return f19_2_mhz;
-       case GEN9_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ:
-               return f24_mhz;
-       default:
-               MISSING_CASE(crystal_clock);
-               return 0;
-       }
- }
- static u32 gen11_get_crystal_clock_freq(struct drm_i915_private *dev_priv,
-                                       u32 rpm_config_reg)
- {
-       u32 f19_2_mhz = 19200000;
-       u32 f24_mhz = 24000000;
-       u32 f25_mhz = 25000000;
-       u32 f38_4_mhz = 38400000;
-       u32 crystal_clock = (rpm_config_reg &
-                            GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_MASK) >>
-                           GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_SHIFT;
-       switch (crystal_clock) {
-       case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_24_MHZ:
-               return f24_mhz;
-       case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_19_2_MHZ:
-               return f19_2_mhz;
-       case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_38_4_MHZ:
-               return f38_4_mhz;
-       case GEN11_RPM_CONFIG0_CRYSTAL_CLOCK_FREQ_25_MHZ:
-               return f25_mhz;
-       default:
-               MISSING_CASE(crystal_clock);
-               return 0;
-       }
- }
- static u32 read_timestamp_frequency(struct drm_i915_private *dev_priv)
- {
-       struct intel_uncore *uncore = &dev_priv->uncore;
-       u32 f12_5_mhz = 12500000;
-       u32 f19_2_mhz = 19200000;
-       u32 f24_mhz = 24000000;
-       if (INTEL_GEN(dev_priv) <= 4) {
-               /* PRMs say:
-                *
-                *     "The value in this register increments once every 16
-                *      hclks." (through the “Clocking Configuration”
-                *      (“CLKCFG”) MCHBAR register)
-                */
-               return RUNTIME_INFO(dev_priv)->rawclk_freq * 1000 / 16;
-       } else if (INTEL_GEN(dev_priv) <= 8) {
-               /* PRMs say:
-                *
-                *     "The PCU TSC counts 10ns increments; this timestamp
-                *      reflects bits 38:3 of the TSC (i.e. 80ns granularity,
-                *      rolling over every 1.5 hours).
-                */
-               return f12_5_mhz;
-       } else if (INTEL_GEN(dev_priv) <= 9) {
-               u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE);
-               u32 freq = 0;
-               if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) {
-                       freq = read_reference_ts_freq(dev_priv);
-               } else {
-                       freq = IS_GEN9_LP(dev_priv) ? f19_2_mhz : f24_mhz;
-                       /* Now figure out how the command stream's timestamp
-                        * register increments from this frequency (it might
-                        * increment only every few clock cycle).
-                        */
-                       freq >>= 3 - ((ctc_reg & CTC_SHIFT_PARAMETER_MASK) >>
-                                     CTC_SHIFT_PARAMETER_SHIFT);
-               }
-               return freq;
-       } else if (INTEL_GEN(dev_priv) <= 12) {
-               u32 ctc_reg = intel_uncore_read(uncore, CTC_MODE);
-               u32 freq = 0;
-               /* First figure out the reference frequency. There are 2 ways
-                * we can compute the frequency, either through the
-                * TIMESTAMP_OVERRIDE register or through RPM_CONFIG. CTC_MODE
-                * tells us which one we should use.
-                */
-               if ((ctc_reg & CTC_SOURCE_PARAMETER_MASK) == CTC_SOURCE_DIVIDE_LOGIC) {
-                       freq = read_reference_ts_freq(dev_priv);
-               } else {
-                       u32 rpm_config_reg = intel_uncore_read(uncore, RPM_CONFIG0);
-                       if (INTEL_GEN(dev_priv) <= 10)
-                               freq = gen10_get_crystal_clock_freq(dev_priv,
-                                                               rpm_config_reg);
-                       else
-                               freq = gen11_get_crystal_clock_freq(dev_priv,
-                                                               rpm_config_reg);
-                       /* Now figure out how the command stream's timestamp
-                        * register increments from this frequency (it might
-                        * increment only every few clock cycle).
-                        */
-                       freq >>= 3 - ((rpm_config_reg &
-                                      GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK) >>
-                                     GEN10_RPM_CONFIG0_CTC_SHIFT_PARAMETER_SHIFT);
-               }
-               return freq;
-       }
-       MISSING_CASE("Unknown gen, unable to read command streamer timestamp frequency\n");
-       return 0;
  }
  
  #undef INTEL_VGA_DEVICE
@@@ -505,19 -361,6 +361,6 @@@ void intel_device_info_runtime_init(str
        runtime->rawclk_freq = intel_read_rawclk(dev_priv);
        drm_dbg(&dev_priv->drm, "rawclk rate: %d kHz\n", runtime->rawclk_freq);
  
-       /* Initialize command stream timestamp frequency */
-       runtime->cs_timestamp_frequency_hz =
-               read_timestamp_frequency(dev_priv);
-       if (runtime->cs_timestamp_frequency_hz) {
-               runtime->cs_timestamp_period_ns =
-                       i915_cs_timestamp_ticks_to_ns(dev_priv, 1);
-               drm_dbg(&dev_priv->drm,
-                       "CS timestamp wraparound in %lldms\n",
-                       div_u64(mul_u32_u32(runtime->cs_timestamp_period_ns,
-                                           S32_MAX),
-                               USEC_PER_SEC));
-       }
        if (!HAS_DISPLAY(dev_priv)) {
                dev_priv->drm.driver_features &= ~(DRIVER_MODESET |
                                                   DRIVER_ATOMIC);
This page took 0.198596 seconds and 4 git commands to generate.