Merge drm/drm-next into drm-intel-next
authorJani Nikula <jani.nikula@intel.com>
Mon, 29 Aug 2022 11:44:38 +0000 (14:44 +0300)
committerJani Nikula <jani.nikula@intel.com>
Mon, 29 Aug 2022 12:14:59 +0000 (15:14 +0300)
Sync drm-intel-next with v6.0-rc as well as recent drm-intel-gt-next.

Since drm-next does not have commit f0c70d41e4e8 ("drm/i915/guc: remove
runtime info printing from time stamp logging") yet, only
drm-intel-gt-next, will need to do that as part of the merge here to
build.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
1  2 
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/gem/i915_gem_pages.c
drivers/gpu/drm/i915/gt/intel_gt.c
drivers/gpu/drm/i915/gt/intel_ppgtt.c
drivers/gpu/drm/i915/gt/intel_region_lmem.c
drivers/gpu/drm/i915/gt/uc/intel_guc.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gpu_error.c

index 651b2309593a3ffc6335e1f8c19bd35fa985540d,fc5d94862ef320ae018c51d1583f8aa605b18c21..458f010e46f3589f14a74d4df7b9dfa65465ecca
@@@ -27,7 -27,6 +27,6 @@@
  #include <acpi/video.h>
  #include <linux/i2c.h>
  #include <linux/input.h>
- #include <linux/intel-iommu.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/dma-resv.h>
@@@ -165,16 -164,16 +164,16 @@@ static void ilk_pfit_enable(const struc
   */
  void intel_update_watermarks(struct drm_i915_private *dev_priv)
  {
 -      if (dev_priv->wm_disp->update_wm)
 -              dev_priv->wm_disp->update_wm(dev_priv);
 +      if (dev_priv->display.funcs.wm->update_wm)
 +              dev_priv->display.funcs.wm->update_wm(dev_priv);
  }
  
  static int intel_compute_pipe_wm(struct intel_atomic_state *state,
                                 struct intel_crtc *crtc)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      if (dev_priv->wm_disp->compute_pipe_wm)
 -              return dev_priv->wm_disp->compute_pipe_wm(state, crtc);
 +      if (dev_priv->display.funcs.wm->compute_pipe_wm)
 +              return dev_priv->display.funcs.wm->compute_pipe_wm(state, crtc);
        return 0;
  }
  
@@@ -182,20 -181,20 +181,20 @@@ static int intel_compute_intermediate_w
                                         struct intel_crtc *crtc)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      if (!dev_priv->wm_disp->compute_intermediate_wm)
 +      if (!dev_priv->display.funcs.wm->compute_intermediate_wm)
                return 0;
        if (drm_WARN_ON(&dev_priv->drm,
 -                      !dev_priv->wm_disp->compute_pipe_wm))
 +                      !dev_priv->display.funcs.wm->compute_pipe_wm))
                return 0;
 -      return dev_priv->wm_disp->compute_intermediate_wm(state, crtc);
 +      return dev_priv->display.funcs.wm->compute_intermediate_wm(state, crtc);
  }
  
  static bool intel_initial_watermarks(struct intel_atomic_state *state,
                                     struct intel_crtc *crtc)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      if (dev_priv->wm_disp->initial_watermarks) {
 -              dev_priv->wm_disp->initial_watermarks(state, crtc);
 +      if (dev_priv->display.funcs.wm->initial_watermarks) {
 +              dev_priv->display.funcs.wm->initial_watermarks(state, crtc);
                return true;
        }
        return false;
@@@ -205,23 -204,23 +204,23 @@@ static void intel_atomic_update_waterma
                                           struct intel_crtc *crtc)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      if (dev_priv->wm_disp->atomic_update_watermarks)
 -              dev_priv->wm_disp->atomic_update_watermarks(state, crtc);
 +      if (dev_priv->display.funcs.wm->atomic_update_watermarks)
 +              dev_priv->display.funcs.wm->atomic_update_watermarks(state, crtc);
  }
  
  static void intel_optimize_watermarks(struct intel_atomic_state *state,
                                      struct intel_crtc *crtc)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      if (dev_priv->wm_disp->optimize_watermarks)
 -              dev_priv->wm_disp->optimize_watermarks(state, crtc);
 +      if (dev_priv->display.funcs.wm->optimize_watermarks)
 +              dev_priv->display.funcs.wm->optimize_watermarks(state, crtc);
  }
  
  static int intel_compute_global_watermarks(struct intel_atomic_state *state)
  {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
 -      if (dev_priv->wm_disp->compute_global_watermarks)
 -              return dev_priv->wm_disp->compute_global_watermarks(state);
 +      if (dev_priv->display.funcs.wm->compute_global_watermarks)
 +              return dev_priv->display.funcs.wm->compute_global_watermarks(state);
        return 0;
  }
  
@@@ -1488,7 -1487,7 +1487,7 @@@ static void intel_encoders_update_prepa
         * Make sure the DPLL state is up-to-date for fastset TypeC ports after non-blocking commits.
         * TODO: Update the DPLL state for all cases in the encoder->update_prepare() hook.
         */
 -      if (i915->dpll.mgr) {
 +      if (i915->display.dpll.mgr) {
                for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
                        if (intel_crtc_needs_modeset(new_crtc_state))
                                continue;
@@@ -2082,20 -2081,22 +2081,20 @@@ bool intel_phy_is_combo(struct drm_i915
  {
        if (phy == PHY_NONE)
                return false;
 -      else if (IS_DG2(dev_priv))
 -              /*
 -               * DG2 outputs labelled as "combo PHY" in the bspec use
 -               * SNPS PHYs with completely different programming,
 -               * hence we always return false here.
 -               */
 -              return false;
        else if (IS_ALDERLAKE_S(dev_priv))
                return phy <= PHY_E;
        else if (IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv))
                return phy <= PHY_D;
        else if (IS_JSL_EHL(dev_priv))
                return phy <= PHY_C;
 -      else if (DISPLAY_VER(dev_priv) >= 11)
 +      else if (IS_ALDERLAKE_P(dev_priv) || IS_DISPLAY_VER(dev_priv, 11, 12))
                return phy <= PHY_B;
        else
 +              /*
 +               * DG2 outputs labelled as "combo PHY" in the bspec use
 +               * SNPS PHYs with completely different programming,
 +               * hence we always return false here.
 +               */
                return false;
  }
  
@@@ -2401,7 -2402,7 +2400,7 @@@ static void i9xx_crtc_disable(struct in
        if (DISPLAY_VER(dev_priv) != 2)
                intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
  
 -      if (!dev_priv->wm_disp->initial_watermarks)
 +      if (!dev_priv->display.funcs.wm->initial_watermarks)
                intel_update_watermarks(dev_priv);
  
        /* clock the pipe down to 640x480@60 to potentially save power */
@@@ -4145,7 -4146,7 +4144,7 @@@ bool intel_crtc_get_pipe_config(struct 
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *i915 = to_i915(crtc->base.dev);
  
 -      if (!i915->display->get_pipe_config(crtc, crtc_state))
 +      if (!i915->display.funcs.display->get_pipe_config(crtc, crtc_state))
                return false;
  
        crtc_state->hw.active = true;
@@@ -5840,7 -5841,7 +5839,7 @@@ intel_pipe_config_compare(const struct 
  
        PIPE_CONF_CHECK_BOOL(double_wide);
  
 -      if (dev_priv->dpll.mgr) {
 +      if (dev_priv->display.dpll.mgr) {
                PIPE_CONF_CHECK_P(shared_dpll);
  
                PIPE_CONF_CHECK_X(dpll_hw_state.dpll);
@@@ -7120,7 -7121,7 +7119,7 @@@ static void intel_enable_crtc(struct in
  
        intel_crtc_update_active_timings(new_crtc_state);
  
 -      dev_priv->display->crtc_enable(state, crtc);
 +      dev_priv->display.funcs.display->crtc_enable(state, crtc);
  
        if (intel_crtc_is_bigjoiner_slave(new_crtc_state))
                return;
@@@ -7199,7 -7200,7 +7198,7 @@@ static void intel_old_crtc_state_disabl
         */
        intel_crtc_disable_pipe_crc(crtc);
  
 -      dev_priv->display->crtc_disable(state, crtc);
 +      dev_priv->display.funcs.display->crtc_disable(state, crtc);
        crtc->active = false;
        intel_fbc_disable(crtc);
        intel_disable_shared_dpll(old_crtc_state);
@@@ -7587,7 -7588,7 +7586,7 @@@ static void intel_atomic_commit_tail(st
        }
  
        /* Now enable the clocks, plane, pipe, and connectors that we set up. */
 -      dev_priv->display->commit_modeset_enables(state);
 +      dev_priv->display.funcs.display->commit_modeset_enables(state);
  
        intel_encoders_update_complete(state);
  
@@@ -8318,7 -8319,7 +8317,7 @@@ static const struct drm_mode_config_fun
        .atomic_state_free = intel_atomic_state_free,
  };
  
 -static const struct drm_i915_display_funcs skl_display_funcs = {
 +static const struct intel_display_funcs skl_display_funcs = {
        .get_pipe_config = hsw_get_pipe_config,
        .crtc_enable = hsw_crtc_enable,
        .crtc_disable = hsw_crtc_disable,
        .get_initial_plane_config = skl_get_initial_plane_config,
  };
  
 -static const struct drm_i915_display_funcs ddi_display_funcs = {
 +static const struct intel_display_funcs ddi_display_funcs = {
        .get_pipe_config = hsw_get_pipe_config,
        .crtc_enable = hsw_crtc_enable,
        .crtc_disable = hsw_crtc_disable,
        .get_initial_plane_config = i9xx_get_initial_plane_config,
  };
  
 -static const struct drm_i915_display_funcs pch_split_display_funcs = {
 +static const struct intel_display_funcs pch_split_display_funcs = {
        .get_pipe_config = ilk_get_pipe_config,
        .crtc_enable = ilk_crtc_enable,
        .crtc_disable = ilk_crtc_disable,
        .get_initial_plane_config = i9xx_get_initial_plane_config,
  };
  
 -static const struct drm_i915_display_funcs vlv_display_funcs = {
 +static const struct intel_display_funcs vlv_display_funcs = {
        .get_pipe_config = i9xx_get_pipe_config,
        .crtc_enable = valleyview_crtc_enable,
        .crtc_disable = i9xx_crtc_disable,
        .get_initial_plane_config = i9xx_get_initial_plane_config,
  };
  
 -static const struct drm_i915_display_funcs i9xx_display_funcs = {
 +static const struct intel_display_funcs i9xx_display_funcs = {
        .get_pipe_config = i9xx_get_pipe_config,
        .crtc_enable = i9xx_crtc_enable,
        .crtc_disable = i9xx_crtc_disable,
@@@ -8373,16 -8374,16 +8372,16 @@@ void intel_init_display_hooks(struct dr
        intel_dpll_init_clock_hook(dev_priv);
  
        if (DISPLAY_VER(dev_priv) >= 9) {
 -              dev_priv->display = &skl_display_funcs;
 +              dev_priv->display.funcs.display = &skl_display_funcs;
        } else if (HAS_DDI(dev_priv)) {
 -              dev_priv->display = &ddi_display_funcs;
 +              dev_priv->display.funcs.display = &ddi_display_funcs;
        } else if (HAS_PCH_SPLIT(dev_priv)) {
 -              dev_priv->display = &pch_split_display_funcs;
 +              dev_priv->display.funcs.display = &pch_split_display_funcs;
        } else if (IS_CHERRYVIEW(dev_priv) ||
                   IS_VALLEYVIEW(dev_priv)) {
 -              dev_priv->display = &vlv_display_funcs;
 +              dev_priv->display.funcs.display = &vlv_display_funcs;
        } else {
 -              dev_priv->display = &i9xx_display_funcs;
 +              dev_priv->display.funcs.display = &i9xx_display_funcs;
        }
  
        intel_fdi_init_hook(dev_priv);
@@@ -8455,7 -8456,7 +8454,7 @@@ static void sanitize_watermarks(struct 
        int i;
  
        /* Only supported on platforms that use atomic watermark design */
 -      if (!dev_priv->wm_disp->optimize_watermarks)
 +      if (!dev_priv->display.funcs.wm->optimize_watermarks)
                return;
  
        state = drm_atomic_state_alloc(&dev_priv->drm);
@@@ -8686,6 -8687,8 +8685,6 @@@ int intel_modeset_init_noirq(struct drm
        i915->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
                                        WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
  
 -      i915->window2_delay = 0; /* No DSB so no window2 delay */
 -
        intel_mode_config_init(i915);
  
        ret = intel_cdclk_init(i915);
index 8df8ae0e1dea48233ed7403477491d8211f1c7e1,8357dbdcab5cb0e406e2bba97a8f7f528fb85ba1..4df50b049ceaf1c30c4ac958811e713c5ae7f4df
@@@ -6,20 -6,21 +6,21 @@@
  
  #include <drm/drm_cache.h>
  
+ #include "gt/intel_gt.h"
+ #include "gt/intel_gt_pm.h"
  #include "i915_drv.h"
  #include "i915_gem_object.h"
  #include "i915_scatterlist.h"
  #include "i915_gem_lmem.h"
  #include "i915_gem_mman.h"
  
- #include "gt/intel_gt.h"
  void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
                                 struct sg_table *pages,
                                 unsigned int sg_page_sizes)
  {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
 -      unsigned long supported = INTEL_INFO(i915)->page_sizes;
 +      unsigned long supported = RUNTIME_INFO(i915)->page_sizes;
        bool shrinkable;
        int i;
  
@@@ -65,7 -66,7 +66,7 @@@
        shrinkable = i915_gem_object_is_shrinkable(obj);
  
        if (i915_gem_object_is_tiled(obj) &&
 -          i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
 +          i915->gem_quirks & GEM_QUIRK_PIN_SWIZZLED_PAGES) {
                GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
                i915_gem_object_set_tiling_quirk(obj);
                GEM_BUG_ON(!list_empty(&obj->mm.link));
@@@ -190,6 -191,18 +191,18 @@@ static void unmap_object(struct drm_i91
                vunmap(ptr);
  }
  
+ static void flush_tlb_invalidate(struct drm_i915_gem_object *obj)
+ {
+       struct drm_i915_private *i915 = to_i915(obj->base.dev);
+       struct intel_gt *gt = to_gt(i915);
+       if (!obj->mm.tlb)
+               return;
+       intel_gt_invalidate_tlb(gt, obj->mm.tlb);
+       obj->mm.tlb = 0;
+ }
  struct sg_table *
  __i915_gem_object_unset_pages(struct drm_i915_gem_object *obj)
  {
        __i915_gem_object_reset_page_iter(obj);
        obj->mm.page_sizes.phys = obj->mm.page_sizes.sg = 0;
  
-       if (test_and_clear_bit(I915_BO_WAS_BOUND_BIT, &obj->flags)) {
-               struct drm_i915_private *i915 = to_i915(obj->base.dev);
-               intel_wakeref_t wakeref;
-               with_intel_runtime_pm_if_active(&i915->runtime_pm, wakeref)
-                       intel_gt_invalidate_tlbs(to_gt(i915));
-       }
+       flush_tlb_invalidate(obj);
  
        return pages;
  }
index 7b059fdf8cbc53538226a25cb968e465e2e7e5df,f435e06125aab0b99d79a842b857c6cffdfab068..e4bac2431e41607de83512f4e6620acaa4c498d4
@@@ -11,7 -11,9 +11,9 @@@
  #include "pxp/intel_pxp.h"
  
  #include "i915_drv.h"
+ #include "i915_perf_oa_regs.h"
  #include "intel_context.h"
+ #include "intel_engine_pm.h"
  #include "intel_engine_regs.h"
  #include "intel_ggtt_gmch.h"
  #include "intel_gt.h"
@@@ -24,7 -26,6 +26,7 @@@
  #include "intel_gt_requests.h"
  #include "intel_migrate.h"
  #include "intel_mocs.h"
 +#include "intel_pci_config.h"
  #include "intel_pm.h"
  #include "intel_rc6.h"
  #include "intel_renderstate.h"
@@@ -37,8 -38,6 +39,6 @@@ static void __intel_gt_init_early(struc
  {
        spin_lock_init(&gt->irq_lock);
  
-       mutex_init(&gt->tlb_invalidate_lock);
        INIT_LIST_HEAD(&gt->closed_vma);
        spin_lock_init(&gt->closed_lock);
  
@@@ -49,6 -48,8 +49,8 @@@
        intel_gt_init_reset(gt);
        intel_gt_init_requests(gt);
        intel_gt_init_timelines(gt);
+       mutex_init(&gt->tlb.invalidate_lock);
+       seqcount_mutex_init(&gt->tlb.seqno, &gt->tlb.invalidate_lock);
        intel_gt_pm_init_early(gt);
  
        intel_uc_init_early(&gt->uc);
@@@ -769,6 -770,7 +771,7 @@@ void intel_gt_driver_late_release_all(s
                intel_gt_fini_requests(gt);
                intel_gt_fini_reset(gt);
                intel_gt_fini_timelines(gt);
+               mutex_destroy(&gt->tlb.invalidate_lock);
                intel_engines_free(gt);
        }
  }
@@@ -828,7 -830,7 +831,7 @@@ int intel_gt_probe_all(struct drm_i915_
        unsigned int mmio_bar;
        int ret;
  
 -      mmio_bar = GRAPHICS_VER(i915) == 2 ? 1 : 0;
 +      mmio_bar = GRAPHICS_VER(i915) == 2 ? GEN2_GTTMMADR_BAR : GTTMMADR_BAR;
        phys_addr = pci_resource_start(pdev, mmio_bar);
  
        /*
@@@ -907,7 -909,7 +910,7 @@@ get_reg_and_bit(const struct intel_engi
        return rb;
  }
  
void intel_gt_invalidate_tlbs(struct intel_gt *gt)
static void mmio_invalidate_full(struct intel_gt *gt)
  {
        static const i915_reg_t gen8_regs[] = {
                [RENDER_CLASS]                  = GEN8_RTCR,
        struct drm_i915_private *i915 = gt->i915;
        struct intel_uncore *uncore = gt->uncore;
        struct intel_engine_cs *engine;
+       intel_engine_mask_t awake, tmp;
        enum intel_engine_id id;
        const i915_reg_t *regs;
        unsigned int num = 0;
  
-       if (I915_SELFTEST_ONLY(gt->awake == -ENODEV))
-               return;
        if (GRAPHICS_VER(i915) == 12) {
                regs = gen12_regs;
                num = ARRAY_SIZE(gen12_regs);
                          "Platform does not implement TLB invalidation!"))
                return;
  
-       GEM_TRACE("\n");
-       assert_rpm_wakelock_held(&i915->runtime_pm);
-       mutex_lock(&gt->tlb_invalidate_lock);
        intel_uncore_forcewake_get(uncore, FORCEWAKE_ALL);
  
        spin_lock_irq(&uncore->lock); /* serialise invalidate with GT reset */
  
+       awake = 0;
        for_each_engine(engine, gt, id) {
                struct reg_and_bit rb;
  
+               if (!intel_engine_pm_is_awake(engine))
+                       continue;
                rb = get_reg_and_bit(engine, regs == gen8_regs, regs, num);
                if (!i915_mmio_reg_offset(rb.reg))
                        continue;
  
                intel_uncore_write_fw(uncore, rb.reg, rb.bit);
+               awake |= engine->mask;
        }
  
+       GT_TRACE(gt, "invalidated engines %08x\n", awake);
+       /* Wa_2207587034:tgl,dg1,rkl,adl-s,adl-p */
+       if (awake &&
+           (IS_TIGERLAKE(i915) ||
+            IS_DG1(i915) ||
+            IS_ROCKETLAKE(i915) ||
+            IS_ALDERLAKE_S(i915) ||
+            IS_ALDERLAKE_P(i915)))
+               intel_uncore_write_fw(uncore, GEN12_OA_TLB_INV_CR, 1);
        spin_unlock_irq(&uncore->lock);
  
-       for_each_engine(engine, gt, id) {
+       for_each_engine_masked(engine, gt, awake, tmp) {
+               struct reg_and_bit rb;
                /*
                 * HW architecture suggest typical invalidation time at 40us,
                 * with pessimistic cases up to 100us and a recommendation to
                 */
                const unsigned int timeout_us = 100;
                const unsigned int timeout_ms = 4;
-               struct reg_and_bit rb;
  
                rb = get_reg_and_bit(engine, regs == gen8_regs, regs, num);
-               if (!i915_mmio_reg_offset(rb.reg))
-                       continue;
                if (__intel_wait_for_register_fw(uncore,
                                                 rb.reg, rb.bit, 0,
                                                 timeout_us, timeout_ms,
         * transitions.
         */
        intel_uncore_forcewake_put_delayed(uncore, FORCEWAKE_ALL);
-       mutex_unlock(&gt->tlb_invalidate_lock);
+ }
+ static bool tlb_seqno_passed(const struct intel_gt *gt, u32 seqno)
+ {
+       u32 cur = intel_gt_tlb_seqno(gt);
+       /* Only skip if a *full* TLB invalidate barrier has passed */
+       return (s32)(cur - ALIGN(seqno, 2)) > 0;
+ }
+ void intel_gt_invalidate_tlb(struct intel_gt *gt, u32 seqno)
+ {
+       intel_wakeref_t wakeref;
+       if (I915_SELFTEST_ONLY(gt->awake == -ENODEV))
+               return;
+       if (intel_gt_is_wedged(gt))
+               return;
+       if (tlb_seqno_passed(gt, seqno))
+               return;
+       with_intel_gt_pm_if_awake(gt, wakeref) {
+               mutex_lock(&gt->tlb.invalidate_lock);
+               if (tlb_seqno_passed(gt, seqno))
+                       goto unlock;
+               mmio_invalidate_full(gt);
+               write_seqcount_invalidate(&gt->tlb.seqno);
+ unlock:
+               mutex_unlock(&gt->tlb.invalidate_lock);
+       }
  }
index bf8570ae749a340b0ab3654e3cbc18cb44448e2e,6ee8d11270168fe7af5ae557a1ad06bb9d386488..7ecfa672f738d7087e85e3fcbceb34e0b0c50572
@@@ -206,8 -206,12 +206,12 @@@ void ppgtt_bind_vma(struct i915_address
  void ppgtt_unbind_vma(struct i915_address_space *vm,
                      struct i915_vma_resource *vma_res)
  {
-       if (vma_res->allocated)
-               vm->clear_range(vm, vma_res->start, vma_res->vma_size);
+       if (!vma_res->allocated)
+               return;
+       vm->clear_range(vm, vma_res->start, vma_res->vma_size);
+       if (vma_res->tlb)
+               vma_invalidate_tlb(vm, vma_res->tlb);
  }
  
  static unsigned long pd_count(u64 size, int shift)
@@@ -308,7 -312,7 +312,7 @@@ void ppgtt_init(struct i915_ppgtt *ppgt
        ppgtt->vm.gt = gt;
        ppgtt->vm.i915 = i915;
        ppgtt->vm.dma = i915->drm.dev;
 -      ppgtt->vm.total = BIT_ULL(INTEL_INFO(i915)->ppgtt_size);
 +      ppgtt->vm.total = BIT_ULL(RUNTIME_INFO(i915)->ppgtt_size);
        ppgtt->vm.lmem_pt_obj_flags = lmem_pt_obj_flags;
  
        dma_resv_init(&ppgtt->vm._resv);
index 360b11fd57bb478eb0aba235938517122e61d661,aa6aed8371947b116851244b134e1b4763cd3eb6..f3ad93db0b21fa4da66723bf2cf6e9db426af6de
@@@ -4,10 -4,8 +4,10 @@@
   */
  
  #include "i915_drv.h"
 +#include "i915_pci.h"
  #include "i915_reg.h"
  #include "intel_memory_region.h"
 +#include "intel_pci_config.h"
  #include "intel_region_lmem.h"
  #include "intel_region_ttm.h"
  #include "gem/i915_gem_lmem.h"
@@@ -17,6 -15,7 +17,7 @@@
  #include "gt/intel_gt_mcr.h"
  #include "gt/intel_gt_regs.h"
  
+ #ifdef CONFIG_64BIT
  static void _release_bars(struct pci_dev *pdev)
  {
        int resno;
@@@ -46,6 -45,7 +47,6 @@@ _resize_bar(struct drm_i915_private *i9
        drm_info(&i915->drm, "BAR%d resized to %dM\n", resno, 1 << bar_size);
  }
  
 -#define LMEM_BAR_NUM 2
  static void i915_resize_lmem_bar(struct drm_i915_private *i915, resource_size_t lmem_size)
  {
        struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
        u32 pci_cmd;
        int i;
  
 -      current_size = roundup_pow_of_two(pci_resource_len(pdev, LMEM_BAR_NUM));
 +      current_size = roundup_pow_of_two(pci_resource_len(pdev, GEN12_LMEM_BAR));
  
        if (i915->params.lmem_bar_size) {
                u32 bar_sizes;
  
                rebar_size = i915->params.lmem_bar_size *
                        (resource_size_t)SZ_1M;
 -              bar_sizes = pci_rebar_get_possible_sizes(pdev,
 -                                                       LMEM_BAR_NUM);
 +              bar_sizes = pci_rebar_get_possible_sizes(pdev, GEN12_LMEM_BAR);
  
                if (rebar_size == current_size)
                        return;
        pci_write_config_dword(pdev, PCI_COMMAND,
                               pci_cmd & ~PCI_COMMAND_MEMORY);
  
 -      _resize_bar(i915, LMEM_BAR_NUM, rebar_size);
 +      _resize_bar(i915, GEN12_LMEM_BAR, rebar_size);
  
        pci_assign_unassigned_bus_resources(pdev->bus);
        pci_write_config_dword(pdev, PCI_COMMAND, pci_cmd);
  }
+ #else
+ static void i915_resize_lmem_bar(struct drm_i915_private *i915, resource_size_t lmem_size) {}
+ #endif
  
  static int
  region_lmem_release(struct intel_memory_region *mem)
@@@ -198,9 -202,6 +202,9 @@@ static struct intel_memory_region *setu
        if (!IS_DGFX(i915))
                return ERR_PTR(-ENODEV);
  
 +      if (!i915_pci_resource_valid(pdev, GEN12_LMEM_BAR))
 +              return ERR_PTR(-ENXIO);
 +
        if (HAS_FLAT_CCS(i915)) {
                resource_size_t lmem_range;
                u64 tile_stolen, flat_ccs_base;
                                  mul_u32_u32(i915->params.lmem_size, SZ_1M));
        }
  
 -      io_start = pci_resource_start(pdev, 2);
 -      io_size = min(pci_resource_len(pdev, 2), lmem_size);
 +      io_start = pci_resource_start(pdev, GEN12_LMEM_BAR);
 +      io_size = min(pci_resource_len(pdev, GEN12_LMEM_BAR), lmem_size);
        if (!io_size)
                return ERR_PTR(-EIO);
  
index 2706a8c650900e661a4a178f999e9e464443d885,ab4aacc516aa407375e096dc59552b19f3af2b8d..50af247e84c42815a9bb8ee741decebd9b8f2ea3
@@@ -389,6 -389,25 +389,23 @@@ void intel_guc_write_params(struct inte
        intel_uncore_forcewake_put(uncore, FORCEWAKE_GT);
  }
  
 -      intel_device_info_print_runtime(RUNTIME_INFO(gt->i915), p);
 -
+ void intel_guc_dump_time_info(struct intel_guc *guc, struct drm_printer *p)
+ {
+       struct intel_gt *gt = guc_to_gt(guc);
+       intel_wakeref_t wakeref;
+       u32 stamp = 0;
+       u64 ktime;
+       with_intel_runtime_pm(&gt->i915->runtime_pm, wakeref)
+               stamp = intel_uncore_read(gt->uncore, GUCPMTIMESTAMP);
+       ktime = ktime_get_boottime_ns();
+       drm_printf(p, "Kernel timestamp: 0x%08llX [%llu]\n", ktime, ktime);
+       drm_printf(p, "GuC timestamp: 0x%08X [%u]\n", stamp, stamp);
+       drm_printf(p, "CS timestamp frequency: %u Hz, %u ns\n",
+                  gt->clock_frequency, gt->clock_period_ns);
+ }
  int intel_guc_init(struct intel_guc *guc)
  {
        struct intel_gt *gt = guc_to_gt(guc);
index f12f3aa3bc13a2d3e3076f75b4ded02742b23d2b,086bbe8945d6cbd53bb4e368a291dd69079439c1..443ed6dac92a7c6157d7c0a9ce95326fc98e7849
  
  #include "display/intel_cdclk.h"
  #include "display/intel_display.h"
 +#include "display/intel_display_core.h"
  #include "display/intel_display_power.h"
 -#include "display/intel_dmc.h"
 -#include "display/intel_dpll_mgr.h"
  #include "display/intel_dsb.h"
  #include "display/intel_fbc.h"
  #include "display/intel_frontbuffer.h"
  #include "display/intel_global_state.h"
 -#include "display/intel_gmbus.h"
  #include "display/intel_opregion.h"
  
  #include "gem/i915_gem_context_types.h"
  #include "intel_device_info.h"
  #include "intel_memory_region.h"
  #include "intel_pch.h"
 -#include "intel_pm_types.h"
  #include "intel_runtime_pm.h"
  #include "intel_step.h"
  #include "intel_uncore.h"
  #include "intel_wopcm.h"
  
 -struct dpll;
  struct drm_i915_clock_gating_funcs;
  struct drm_i915_gem_object;
  struct drm_i915_private;
 -struct intel_atomic_state;
 -struct intel_audio_funcs;
  struct intel_cdclk_config;
 -struct intel_cdclk_funcs;
  struct intel_cdclk_state;
  struct intel_cdclk_vals;
 -struct intel_color_funcs;
  struct intel_connector;
 -struct intel_crtc;
  struct intel_dp;
 -struct intel_dpll_funcs;
  struct intel_encoder;
 -struct intel_fbdev;
 -struct intel_fdi_funcs;
 -struct intel_gmbus;
 -struct intel_hotplug_funcs;
 -struct intel_initial_plane_config;
  struct intel_limit;
 -struct intel_overlay;
  struct intel_overlay_error_state;
  struct vlv_s0ix_state;
  
  /* Threshold == 5 for long IRQs, 50 for short */
  #define HPD_STORM_DEFAULT_THRESHOLD 50
  
 -struct i915_hotplug {
 -      struct delayed_work hotplug_work;
 -
 -      const u32 *hpd, *pch_hpd;
 -
 -      struct {
 -              unsigned long last_jiffies;
 -              int count;
 -              enum {
 -                      HPD_ENABLED = 0,
 -                      HPD_DISABLED = 1,
 -                      HPD_MARK_DISABLED = 2
 -              } state;
 -      } stats[HPD_NUM_PINS];
 -      u32 event_bits;
 -      u32 retry_bits;
 -      struct delayed_work reenable_work;
 -
 -      u32 long_port_mask;
 -      u32 short_port_mask;
 -      struct work_struct dig_port_work;
 -
 -      struct work_struct poll_init_work;
 -      bool poll_enabled;
 -
 -      unsigned int hpd_storm_threshold;
 -      /* Whether or not to count short HPD IRQs in HPD storms */
 -      u8 hpd_short_storm_enabled;
 -
 -      /*
 -       * if we get a HPD irq from DP and a HPD irq from non-DP
 -       * the non-DP HPD could block the workqueue on a mode config
 -       * mutex getting, that userspace may have taken. However
 -       * userspace is waiting on the DP workqueue to run which is
 -       * blocked behind the non-DP one.
 -       */
 -      struct workqueue_struct *dp_wq;
 -};
 -
  #define I915_GEM_GPU_DOMAINS \
        (I915_GEM_DOMAIN_RENDER | \
         I915_GEM_DOMAIN_SAMPLER | \
@@@ -105,13 -160,43 +105,13 @@@ struct sdvo_device_mapping 
        u8 ddc_pin;
  };
  
 -/* functions used for watermark calcs for display. */
 -struct drm_i915_wm_disp_funcs {
 -      /* update_wm is for legacy wm management */
 -      void (*update_wm)(struct drm_i915_private *dev_priv);
 -      int (*compute_pipe_wm)(struct intel_atomic_state *state,
 -                             struct intel_crtc *crtc);
 -      int (*compute_intermediate_wm)(struct intel_atomic_state *state,
 -                                     struct intel_crtc *crtc);
 -      void (*initial_watermarks)(struct intel_atomic_state *state,
 -                                 struct intel_crtc *crtc);
 -      void (*atomic_update_watermarks)(struct intel_atomic_state *state,
 -                                       struct intel_crtc *crtc);
 -      void (*optimize_watermarks)(struct intel_atomic_state *state,
 -                                  struct intel_crtc *crtc);
 -      int (*compute_global_watermarks)(struct intel_atomic_state *state);
 -};
 -
 -struct drm_i915_display_funcs {
 -      /* Returns the active state of the crtc, and if the crtc is active,
 -       * fills out the pipe-config with the hw state. */
 -      bool (*get_pipe_config)(struct intel_crtc *,
 -                              struct intel_crtc_state *);
 -      void (*get_initial_plane_config)(struct intel_crtc *,
 -                                       struct intel_initial_plane_config *);
 -      void (*crtc_enable)(struct intel_atomic_state *state,
 -                          struct intel_crtc *crtc);
 -      void (*crtc_disable)(struct intel_atomic_state *state,
 -                           struct intel_crtc *crtc);
 -      void (*commit_modeset_enables)(struct intel_atomic_state *state);
 -};
 -
  #define I915_COLOR_UNEVICTABLE (-1) /* a non-vma sharing the address space */
  
 +#define GEM_QUIRK_PIN_SWIZZLED_PAGES  BIT(0)
 +
  #define QUIRK_LVDS_SSC_DISABLE (1<<1)
  #define QUIRK_INVERT_BRIGHTNESS (1<<2)
  #define QUIRK_BACKLIGHT_PRESENT (1<<3)
 -#define QUIRK_PIN_SWIZZLED_PAGES (1<<5)
  #define QUIRK_INCREASE_T12_DELAY (1<<6)
  #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7)
  #define QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK (1<<8)
@@@ -162,7 -247,7 +162,7 @@@ struct i915_gem_mm 
         * List of objects which are pending destruction.
         */
        struct llist_head free_list;
-       struct delayed_work free_work;
+       struct work_struct free_work;
        /**
         * Count of objects pending destructions. Used to skip needlessly
         * waiting on an RCU barrier if no objects are waiting to be freed.
@@@ -263,11 -348,32 +263,11 @@@ struct i915_selftest_stash 
        struct ida mock_region_instances;
  };
  
 -/* intel_audio.c private */
 -struct intel_audio_private {
 -      /* Display internal audio functions */
 -      const struct intel_audio_funcs *funcs;
 -
 -      /* hda/i915 audio component */
 -      struct i915_audio_component *component;
 -      bool component_registered;
 -      /* mutex for audio/video sync */
 -      struct mutex mutex;
 -      int power_refcount;
 -      u32 freq_cntrl;
 -
 -      /* Used to save the pipe-to-encoder mapping for audio */
 -      struct intel_encoder *encoder_map[I915_MAX_PIPES];
 -
 -      /* necessary resource sharing with HDMI LPE audio driver. */
 -      struct {
 -              struct platform_device *platdev;
 -              int irq;
 -      } lpe;
 -};
 -
  struct drm_i915_private {
        struct drm_device drm;
  
 +      struct intel_display display;
 +
        /* FIXME: Device release actions should all be moved to drmm_ */
        bool do_release;
  
  
        struct intel_wopcm wopcm;
  
 -      struct intel_dmc dmc;
 -
 -      struct intel_gmbus *gmbus[GMBUS_NUM_PINS];
 -
 -      /** gmbus_mutex protects against concurrent usage of the single hw gmbus
 -       * controller on different i2c buses. */
 -      struct mutex gmbus_mutex;
 -
 -      /**
 -       * Base address of where the gmbus and gpio blocks are located (either
 -       * on PCH or on SoC for platforms without PCH).
 -       */
 -      u32 gpio_mmio_base;
 -
        /* MMIO base address for MIPI regs */
        u32 mipi_mmio_base;
  
 -      u32 pps_mmio_base;
 -
 -      wait_queue_head_t gmbus_wait_queue;
 -
        struct pci_dev *bridge_dev;
  
        struct rb_root uabi_engines;
        };
        u32 pipestat_irq_mask[I915_MAX_PIPES];
  
 -      struct i915_hotplug hotplug;
        struct intel_fbc *fbc[I915_MAX_FBCS];
        struct intel_opregion opregion;
        struct intel_vbt_data vbt;
  
        bool preserve_bios_swizzle;
  
 -      /* overlay */
 -      struct intel_overlay *overlay;
 -
        /* backlight registers and fields in struct intel_panel */
        struct mutex backlight_lock;
  
 -      /* protects panel power sequencer state */
 -      struct mutex pps_mutex;
 -
        unsigned int fsb_freq, mem_freq, is_ddr3;
        unsigned int skl_preferred_vco_freq;
        unsigned int max_cdclk_freq;
        /* pm private clock gating functions */
        const struct drm_i915_clock_gating_funcs *clock_gating_funcs;
  
 -      /* pm display functions */
 -      const struct drm_i915_wm_disp_funcs *wm_disp;
 -
 -      /* irq display functions */
 -      const struct intel_hotplug_funcs *hotplug_funcs;
 -
 -      /* fdi display functions */
 -      const struct intel_fdi_funcs *fdi_funcs;
 -
 -      /* display pll funcs */
 -      const struct intel_dpll_funcs *dpll_funcs;
 -
 -      /* Display functions */
 -      const struct drm_i915_display_funcs *display;
 -
 -      /* Display internal color functions */
 -      const struct intel_color_funcs *color_funcs;
 -
 -      /* Display CDCLK functions */
 -      const struct intel_cdclk_funcs *cdclk_funcs;
 -
        /* PCH chipset type */
        enum intel_pch pch_type;
        unsigned short pch_id;
  
 +      unsigned long gem_quirks;
        unsigned long quirks;
  
        struct drm_atomic_state *modeset_restore_state;
  
        /* Kernel Modesetting */
  
 -      /**
 -       * dpll and cdclk state is protected by connection_mutex
 -       * dpll.lock serializes intel_{prepare,enable,disable}_shared_dpll.
 -       * Must be global rather than per dpll, because on some platforms plls
 -       * share registers.
 -       */
 -      struct {
 -              struct mutex lock;
 -
 -              int num_shared_dpll;
 -              struct intel_shared_dpll shared_dplls[I915_NUM_PLLS];
 -              const struct intel_dpll_mgr *mgr;
 -
 -              struct {
 -                      int nssc;
 -                      int ssc;
 -              } ref_clks;
 -      } dpll;
 -
        struct list_head global_obj_list;
  
        struct i915_frontbuffer_tracking fb_tracking;
  
        struct i915_gpu_error gpu_error;
  
 -      /* list of fbdev register on this device */
 -      struct intel_fbdev *fbdev;
 -      struct work_struct fbdev_suspend_work;
 -
        struct drm_property *broadcast_rgb_property;
        struct drm_property *force_audio_property;
  
        struct i915_suspend_saved_registers regfile;
        struct vlv_s0ix_state *vlv_s0ix_state;
  
 -      enum {
 -              I915_SAGV_UNKNOWN = 0,
 -              I915_SAGV_DISABLED,
 -              I915_SAGV_ENABLED,
 -              I915_SAGV_NOT_CONTROLLED
 -      } sagv_status;
 -
 -      u32 sagv_block_time_us;
 -
 -      struct {
 -              /*
 -               * Raw watermark latency values:
 -               * in 0.1us units for WM0,
 -               * in 0.5us units for WM1+.
 -               */
 -              /* primary */
 -              u16 pri_latency[5];
 -              /* sprite */
 -              u16 spr_latency[5];
 -              /* cursor */
 -              u16 cur_latency[5];
 -              /*
 -               * Raw watermark memory latency values
 -               * for SKL for all 8 levels
 -               * in 1us units.
 -               */
 -              u16 skl_latency[8];
 -
 -              /* current hardware state */
 -              union {
 -                      struct ilk_wm_values hw;
 -                      struct vlv_wm_values vlv;
 -                      struct g4x_wm_values g4x;
 -              };
 -
 -              u8 max_level;
 -
 -              /*
 -               * Should be held around atomic WM register writing; also
 -               * protects * intel_crtc->wm.active and
 -               * crtc_state->wm.need_postvbl_update.
 -               */
 -              struct mutex wm_mutex;
 -      } wm;
 -
        struct dram_info {
                bool wm_lv_0_adjust_needed;
                u8 num_channels;
                struct file *mmap_singleton;
        } gem;
  
 -      /* Window2 specifies time required to program DSB (Window2) in number of scan lines */
 -      u8 window2_delay;
 -
        u8 pch_ssc_use;
  
        /* For i915gm/i945gm vblank irq workaround */
  
        bool ipc_enabled;
  
 -      struct intel_audio_private audio;
 -
        struct i915_pmu pmu;
  
        struct i915_drm_clients clients;
@@@ -604,6 -828,26 +604,6 @@@ static inline struct intel_gt *to_gt(st
  
  #define I915_GTT_OFFSET_NONE ((u32)-1)
  
 -/*
 - * Frontbuffer tracking bits. Set in obj->frontbuffer_bits while a gem bo is
 - * considered to be the frontbuffer for the given plane interface-wise. This
 - * doesn't mean that the hw necessarily already scans it out, but that any
 - * rendering (by the cpu or gpu) will land in the frontbuffer eventually.
 - *
 - * We have one bit per pipe and per scanout plane type.
 - */
 -#define INTEL_FRONTBUFFER_BITS_PER_PIPE 8
 -#define INTEL_FRONTBUFFER(pipe, plane_id) ({ \
 -      BUILD_BUG_ON(INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES > 32); \
 -      BUILD_BUG_ON(I915_MAX_PLANES > INTEL_FRONTBUFFER_BITS_PER_PIPE); \
 -      BIT((plane_id) + INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)); \
 -})
 -#define INTEL_FRONTBUFFER_OVERLAY(pipe) \
 -      BIT(INTEL_FRONTBUFFER_BITS_PER_PIPE - 1 + INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))
 -#define INTEL_FRONTBUFFER_ALL_MASK(pipe) \
 -      GENMASK(INTEL_FRONTBUFFER_BITS_PER_PIPE * ((pipe) + 1) - 1, \
 -              INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))
 -
  #define INTEL_INFO(dev_priv)  (&(dev_priv)->__info)
  #define RUNTIME_INFO(dev_priv)        (&(dev_priv)->__runtime)
  #define DRIVER_CAPS(dev_priv) (&(dev_priv)->caps)
  
  #define IP_VER(ver, rel)              ((ver) << 8 | (rel))
  
 -#define GRAPHICS_VER(i915)            (INTEL_INFO(i915)->graphics.ver)
 -#define GRAPHICS_VER_FULL(i915)               IP_VER(INTEL_INFO(i915)->graphics.ver, \
 -                                             INTEL_INFO(i915)->graphics.rel)
 +#define GRAPHICS_VER(i915)            (RUNTIME_INFO(i915)->graphics.ver)
 +#define GRAPHICS_VER_FULL(i915)               IP_VER(RUNTIME_INFO(i915)->graphics.ver, \
 +                                             RUNTIME_INFO(i915)->graphics.rel)
  #define IS_GRAPHICS_VER(i915, from, until) \
        (GRAPHICS_VER(i915) >= (from) && GRAPHICS_VER(i915) <= (until))
  
@@@ -966,7 -1210,7 +966,7 @@@ IS_SUBPLATFORM(const struct drm_i915_pr
  
  #define HAS_EXECLISTS(dev_priv) HAS_LOGICAL_RING_CONTEXTS(dev_priv)
  
 -#define INTEL_PPGTT(dev_priv) (INTEL_INFO(dev_priv)->ppgtt_type)
 +#define INTEL_PPGTT(dev_priv) (RUNTIME_INFO(dev_priv)->ppgtt_type)
  #define HAS_PPGTT(dev_priv) \
        (INTEL_PPGTT(dev_priv) != INTEL_PPGTT_NONE)
  #define HAS_FULL_PPGTT(dev_priv) \
  
  #define HAS_PAGE_SIZES(dev_priv, sizes) ({ \
        GEM_BUG_ON((sizes) == 0); \
 -      ((sizes) & ~INTEL_INFO(dev_priv)->page_sizes) == 0; \
 +      ((sizes) & ~RUNTIME_INFO(dev_priv)->page_sizes) == 0; \
  })
  
  #define HAS_OVERLAY(dev_priv)          (INTEL_INFO(dev_priv)->display.has_overlay)
  #define I915_HAS_HOTPLUG(dev_priv)    (INTEL_INFO(dev_priv)->display.has_hotplug)
  
  #define HAS_FW_BLC(dev_priv)  (DISPLAY_VER(dev_priv) > 2)
 -#define HAS_FBC(dev_priv)     (INTEL_INFO(dev_priv)->display.fbc_mask != 0)
 +#define HAS_FBC(dev_priv)     (RUNTIME_INFO(dev_priv)->fbc_mask != 0)
  #define HAS_CUR_FBC(dev_priv) (!HAS_GMCH(dev_priv) && DISPLAY_VER(dev_priv) >= 7)
  
  #define HAS_IPS(dev_priv)     (IS_HSW_ULT(dev_priv) || IS_BROADWELL(dev_priv))
  
  #define HAS_DP_MST(dev_priv)  (INTEL_INFO(dev_priv)->display.has_dp_mst)
 -#define HAS_DP20(dev_priv)    (IS_DG2(dev_priv))
 +#define HAS_DP20(dev_priv)    (IS_DG2(dev_priv) || DISPLAY_VER(dev_priv) >= 14)
  
  #define HAS_CDCLK_CRAWL(dev_priv)      (INTEL_INFO(dev_priv)->display.has_cdclk_crawl)
  #define HAS_DDI(dev_priv)              (INTEL_INFO(dev_priv)->display.has_ddi)
  #define HAS_PSR_HW_TRACKING(dev_priv) \
        (INTEL_INFO(dev_priv)->display.has_psr_hw_tracking)
  #define HAS_PSR2_SEL_FETCH(dev_priv)   (DISPLAY_VER(dev_priv) >= 12)
 -#define HAS_TRANSCODER(dev_priv, trans)        ((INTEL_INFO(dev_priv)->display.cpu_transcoder_mask & BIT(trans)) != 0)
 +#define HAS_TRANSCODER(dev_priv, trans)        ((RUNTIME_INFO(dev_priv)->cpu_transcoder_mask & BIT(trans)) != 0)
  
  #define HAS_RC6(dev_priv)              (INTEL_INFO(dev_priv)->has_rc6)
  #define HAS_RC6p(dev_priv)             (INTEL_INFO(dev_priv)->has_rc6p)
  
  #define HAS_RPS(dev_priv)     (INTEL_INFO(dev_priv)->has_rps)
  
 -#define HAS_DMC(dev_priv)     (INTEL_INFO(dev_priv)->display.has_dmc)
 +#define HAS_DMC(dev_priv)     (RUNTIME_INFO(dev_priv)->has_dmc)
  
  #define HAS_HECI_PXP(dev_priv) \
        (INTEL_INFO(dev_priv)->has_heci_pxp)
  
  #define HAS_IPC(dev_priv)              (INTEL_INFO(dev_priv)->display.has_ipc)
  
 -#define HAS_REGION(i915, i) (INTEL_INFO(i915)->memory_regions & (i))
 +#define HAS_REGION(i915, i) (RUNTIME_INFO(i915)->memory_regions & (i))
  #define HAS_LMEM(i915) HAS_REGION(i915, REGION_LMEM)
  
  /*
  
  #define HAS_GT_UC(dev_priv)   (INTEL_INFO(dev_priv)->has_gt_uc)
  
 -#define HAS_POOLED_EU(dev_priv)       (INTEL_INFO(dev_priv)->has_pooled_eu)
 +#define HAS_POOLED_EU(dev_priv)       (RUNTIME_INFO(dev_priv)->has_pooled_eu)
  
  #define HAS_GLOBAL_MOCS_REGISTERS(dev_priv)   (INTEL_INFO(dev_priv)->has_global_mocs)
  
  #define GT_FREQUENCY_MULTIPLIER 50
  #define GEN9_FREQ_SCALER 3
  
 -#define INTEL_NUM_PIPES(dev_priv) (hweight8(INTEL_INFO(dev_priv)->display.pipe_mask))
 +#define INTEL_NUM_PIPES(dev_priv) (hweight8(RUNTIME_INFO(dev_priv)->pipe_mask))
  
 -#define HAS_DISPLAY(dev_priv) (INTEL_INFO(dev_priv)->display.pipe_mask != 0)
 +#define HAS_DISPLAY(dev_priv) (RUNTIME_INFO(dev_priv)->pipe_mask != 0)
  
  #define HAS_VRR(i915) (DISPLAY_VER(i915) >= 11)
  
  #define HAS_D12_PLANE_MINIMIZATION(dev_priv) (IS_ROCKETLAKE(dev_priv) || \
                                              IS_ALDERLAKE_S(dev_priv))
  
 -#define HAS_MBUS_JOINING(i915) (IS_ALDERLAKE_P(i915))
 +#define HAS_MBUS_JOINING(i915) (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14)
  
  #define HAS_3D_PIPELINE(i915) (INTEL_INFO(i915)->has_3d_pipeline)
  
@@@ -1134,7 -1378,7 +1134,7 @@@ static inline void i915_gem_drain_freed
         * armed the work again.
         */
        while (atomic_read(&i915->mm.free_count)) {
-               flush_delayed_work(&i915->mm.free_work);
+               flush_work(&i915->mm.free_work);
                flush_delayed_work(&i915->bdev.wq);
                rcu_barrier();
        }
index d10f4eb0e2722675ba7f6d987bfcc422381367e3,543ba63f958eacd419191c9fae9f73d1b4ab0087..b5fbc2252784ac74981ed4a200f49310c82d16e2
@@@ -646,7 -646,8 +646,7 @@@ static void err_print_capabilities(stru
  {
        struct drm_printer p = i915_error_printer(m);
  
 -      intel_device_info_print_static(&error->device_info, &p);
 -      intel_device_info_print_runtime(&error->runtime_info, &p);
 +      intel_device_info_print(&error->device_info, &error->runtime_info, &p);
        intel_driver_caps_print(&error->driver_caps, &p);
  }
  
@@@ -670,6 -671,18 +670,18 @@@ static void err_print_pciid(struct drm_
                   pdev->subsystem_device);
  }
  
+ static void err_print_guc_ctb(struct drm_i915_error_state_buf *m,
+                             const char *name,
+                             const struct intel_ctb_coredump *ctb)
+ {
+       if (!ctb->size)
+               return;
+       err_printf(m, "GuC %s CTB: raw: 0x%08X, 0x%08X/%08X, cached: 0x%08X/%08X, desc = 0x%08X, buf = 0x%08X x 0x%08X\n",
+                  name, ctb->raw_status, ctb->raw_head, ctb->raw_tail,
+                  ctb->head, ctb->tail, ctb->desc_offset, ctb->cmds_offset, ctb->size);
+ }
  static void err_print_uc(struct drm_i915_error_state_buf *m,
                         const struct intel_uc_coredump *error_uc)
  {
  
        intel_uc_fw_dump(&error_uc->guc_fw, &p);
        intel_uc_fw_dump(&error_uc->huc_fw, &p);
-       intel_gpu_error_print_vma(m, NULL, error_uc->guc_log);
+       err_printf(m, "GuC timestamp: 0x%08x\n", error_uc->guc.timestamp);
+       intel_gpu_error_print_vma(m, NULL, error_uc->guc.vma_log);
+       err_printf(m, "GuC CTB fence: %d\n", error_uc->guc.last_fence);
+       err_print_guc_ctb(m, "Send", error_uc->guc.ctb + 0);
+       err_print_guc_ctb(m, "Recv", error_uc->guc.ctb + 1);
+       intel_gpu_error_print_vma(m, NULL, error_uc->guc.vma_ctb);
  }
  
  static void err_free_sgl(struct scatterlist *sgl)
@@@ -719,6 -737,8 +736,8 @@@ static void err_print_gt_global_nonguc(
        int i;
  
        err_printf(m, "GT awake: %s\n", str_yes_no(gt->awake));
+       err_printf(m, "CS timestamp frequency: %u Hz, %d ns\n",
+                  gt->clock_frequency, gt->clock_period_ns);
        err_printf(m, "EIR: 0x%08x\n", gt->eir);
        err_printf(m, "PGTBL_ER: 0x%08x\n", gt->pgtbl_er);
  
@@@ -850,7 -870,7 +869,7 @@@ static void __err_print_to_sgl(struct d
        if (error->gt) {
                bool print_guc_capture = false;
  
-               if (error->gt->uc && error->gt->uc->is_guc_capture)
+               if (error->gt->uc && error->gt->uc->guc.is_guc_capture)
                        print_guc_capture = true;
  
                err_print_gt_display(m, error->gt);
@@@ -1005,7 -1025,8 +1024,8 @@@ static void cleanup_uc(struct intel_uc_
  {
        kfree(uc->guc_fw.path);
        kfree(uc->huc_fw.path);
-       i915_vma_coredump_free(uc->guc_log);
+       i915_vma_coredump_free(uc->guc.vma_log);
+       i915_vma_coredump_free(uc->guc.vma_ctb);
  
        kfree(uc);
  }
@@@ -1654,6 -1675,23 +1674,23 @@@ gt_record_engines(struct intel_gt_cored
        }
  }
  
+ static void gt_record_guc_ctb(struct intel_ctb_coredump *saved,
+                             const struct intel_guc_ct_buffer *ctb,
+                             const void *blob_ptr, struct intel_guc *guc)
+ {
+       if (!ctb || !ctb->desc)
+               return;
+       saved->raw_status = ctb->desc->status;
+       saved->raw_head = ctb->desc->head;
+       saved->raw_tail = ctb->desc->tail;
+       saved->head = ctb->head;
+       saved->tail = ctb->tail;
+       saved->size = ctb->size;
+       saved->desc_offset = ((void *)ctb->desc) - blob_ptr;
+       saved->cmds_offset = ((void *)ctb->cmds) - blob_ptr;
+ }
  static struct intel_uc_coredump *
  gt_record_uc(struct intel_gt_coredump *gt,
             struct i915_vma_compress *compress)
         */
        error_uc->guc_fw.path = kstrdup(uc->guc.fw.path, ALLOW_FAIL);
        error_uc->huc_fw.path = kstrdup(uc->huc.fw.path, ALLOW_FAIL);
-       error_uc->guc_log = create_vma_coredump(gt->_gt, uc->guc.log.vma,
-                                               "GuC log buffer", compress);
+       /*
+        * Save the GuC log and include a timestamp reference for converting the
+        * log times to system times (in conjunction with the error->boottime and
+        * gt->clock_frequency fields saved elsewhere).
+        */
+       error_uc->guc.timestamp = intel_uncore_read(gt->_gt->uncore, GUCPMTIMESTAMP);
+       error_uc->guc.vma_log = create_vma_coredump(gt->_gt, uc->guc.log.vma,
+                                                   "GuC log buffer", compress);
+       error_uc->guc.vma_ctb = create_vma_coredump(gt->_gt, uc->guc.ct.vma,
+                                                   "GuC CT buffer", compress);
+       error_uc->guc.last_fence = uc->guc.ct.requests.last_fence;
+       gt_record_guc_ctb(error_uc->guc.ctb + 0, &uc->guc.ct.ctbs.send,
+                         uc->guc.ct.ctbs.send.desc, (struct intel_guc *)&uc->guc);
+       gt_record_guc_ctb(error_uc->guc.ctb + 1, &uc->guc.ct.ctbs.recv,
+                         uc->guc.ct.ctbs.send.desc, (struct intel_guc *)&uc->guc);
  
        return error_uc;
  }
@@@ -1832,6 -1884,8 +1883,8 @@@ static void gt_record_global_regs(struc
  static void gt_record_info(struct intel_gt_coredump *gt)
  {
        memcpy(&gt->info, &gt->_gt->info, sizeof(struct intel_gt_info));
+       gt->clock_frequency = gt->_gt->clock_frequency;
+       gt->clock_period_ns = gt->_gt->clock_period_ns;
  }
  
  /*
@@@ -2026,9 -2080,9 +2079,9 @@@ __i915_gpu_coredump(struct intel_gt *gt
                        error->gt->uc = gt_record_uc(error->gt, compress);
                        if (error->gt->uc) {
                                if (dump_flags & CORE_DUMP_FLAG_IS_GUC_CAPTURE)
-                                       error->gt->uc->is_guc_capture = true;
+                                       error->gt->uc->guc.is_guc_capture = true;
                                else
-                                       GEM_BUG_ON(error->gt->uc->is_guc_capture);
+                                       GEM_BUG_ON(error->gt->uc->guc.is_guc_capture);
                        }
                }