#define pipelined 0
 
+static struct drm_i915_private *fence_to_i915(struct i915_fence_reg *fence)
+{
+       return fence->ggtt->vm.i915;
+}
+
+static struct intel_uncore *fence_to_uncore(struct i915_fence_reg *fence)
+{
+       return fence->ggtt->vm.gt->uncore;
+}
+
 static void i965_write_fence_reg(struct i915_fence_reg *fence,
                                 struct i915_vma *vma)
 {
        int fence_pitch_shift;
        u64 val;
 
-       if (INTEL_GEN(fence->i915) >= 6) {
+       if (INTEL_GEN(fence_to_i915(fence)) >= 6) {
                fence_reg_lo = FENCE_REG_GEN6_LO(fence->id);
                fence_reg_hi = FENCE_REG_GEN6_HI(fence->id);
                fence_pitch_shift = GEN6_FENCE_PITCH_SHIFT;
        }
 
        if (!pipelined) {
-               struct intel_uncore *uncore = &fence->i915->uncore;
+               struct intel_uncore *uncore = fence_to_uncore(fence);
 
                /*
                 * To w/a incoherency with non-atomic 64-bit register updates,
                GEM_BUG_ON(!is_power_of_2(vma->fence_size));
                GEM_BUG_ON(!IS_ALIGNED(vma->node.start, vma->fence_size));
 
-               if (is_y_tiled && HAS_128_BYTE_Y_TILING(fence->i915))
+               if (is_y_tiled && HAS_128_BYTE_Y_TILING(fence_to_i915(fence)))
                        stride /= 128;
                else
                        stride /= 512;
        }
 
        if (!pipelined) {
-               struct intel_uncore *uncore = &fence->i915->uncore;
+               struct intel_uncore *uncore = fence_to_uncore(fence);
                i915_reg_t reg = FENCE_REG(fence->id);
 
                intel_uncore_write_fw(uncore, reg, val);
        }
 
        if (!pipelined) {
-               struct intel_uncore *uncore = &fence->i915->uncore;
+               struct intel_uncore *uncore = fence_to_uncore(fence);
                i915_reg_t reg = FENCE_REG(fence->id);
 
                intel_uncore_write_fw(uncore, reg, val);
 static void fence_write(struct i915_fence_reg *fence,
                        struct i915_vma *vma)
 {
+       struct drm_i915_private *i915 = fence_to_i915(fence);
+
        /*
         * Previous access through the fence register is marshalled by
         * the mb() inside the fault handlers (i915_gem_release_mmaps)
         * and explicitly managed for internal users.
         */
 
-       if (IS_GEN(fence->i915, 2))
+       if (IS_GEN(i915, 2))
                i830_write_fence_reg(fence, vma);
-       else if (IS_GEN(fence->i915, 3))
+       else if (IS_GEN(i915, 3))
                i915_write_fence_reg(fence, vma);
        else
                i965_write_fence_reg(fence, vma);
 static int fence_update(struct i915_fence_reg *fence,
                        struct i915_vma *vma)
 {
+       struct i915_ggtt *ggtt = fence->ggtt;
+       struct intel_uncore *uncore = fence_to_uncore(fence);
        intel_wakeref_t wakeref;
        struct i915_vma *old;
        int ret;
                        old->fence = NULL;
                }
 
-               list_move(&fence->link, &fence->i915->ggtt.fence_list);
+               list_move(&fence->link, &ggtt->fence_list);
        }
 
        /*
         * be cleared before we can use any other fences to ensure that
         * the new fences do not overlap the elided clears, confusing HW.
         */
-       wakeref = intel_runtime_pm_get_if_in_use(&fence->i915->runtime_pm);
+       wakeref = intel_runtime_pm_get_if_in_use(uncore->rpm);
        if (!wakeref) {
                GEM_BUG_ON(vma);
                return 0;
 
        if (vma) {
                vma->fence = fence;
-               list_move_tail(&fence->link, &fence->i915->ggtt.fence_list);
+               list_move_tail(&fence->link, &ggtt->fence_list);
        }
 
-       intel_runtime_pm_put(&fence->i915->runtime_pm, wakeref);
+       intel_runtime_pm_put(uncore->rpm, wakeref);
        return 0;
 }
 
        return fence_update(fence, NULL);
 }
 
-static struct i915_fence_reg *fence_find(struct drm_i915_private *i915)
+static struct i915_fence_reg *fence_find(struct i915_ggtt *ggtt)
 {
        struct i915_fence_reg *fence;
 
-       list_for_each_entry(fence, &i915->ggtt.fence_list, link) {
+       list_for_each_entry(fence, &ggtt->fence_list, link) {
                GEM_BUG_ON(fence->vma && fence->vma->fence != fence);
 
                if (atomic_read(&fence->pin_count))
        }
 
        /* Wait for completion of pending flips which consume fences */
-       if (intel_has_pending_fb_unpin(i915))
+       if (intel_has_pending_fb_unpin(ggtt->vm.i915))
                return ERR_PTR(-EAGAIN);
 
        return ERR_PTR(-EDEADLK);
                        return 0;
                }
        } else if (set) {
-               fence = fence_find(vma->vm->i915);
+               fence = fence_find(ggtt);
                if (IS_ERR(fence))
                        return PTR_ERR(fence);
 
         * Note that we revoke fences on runtime suspend. Therefore the user
         * must keep the device awake whilst using the fence.
         */
-       assert_rpm_wakelock_held(&vma->vm->i915->runtime_pm);
+       assert_rpm_wakelock_held(vma->vm->gt->uncore->rpm);
        GEM_BUG_ON(!i915_vma_is_pinned(vma));
        GEM_BUG_ON(!i915_vma_is_ggtt(vma));
 
 
 /**
  * i915_reserve_fence - Reserve a fence for vGPU
- * @i915: i915 device private
+ * @ggtt: Global GTT
  *
  * This function walks the fence regs looking for a free one and remove
  * it from the fence_list. It is used to reserve fence for vGPU to use.
  */
-struct i915_fence_reg *i915_reserve_fence(struct drm_i915_private *i915)
+struct i915_fence_reg *i915_reserve_fence(struct i915_ggtt *ggtt)
 {
-       struct i915_ggtt *ggtt = &i915->ggtt;
        struct i915_fence_reg *fence;
        int count;
        int ret;
        if (count <= 1)
                return ERR_PTR(-ENOSPC);
 
-       fence = fence_find(i915);
+       fence = fence_find(ggtt);
        if (IS_ERR(fence))
                return fence;
 
  */
 void i915_unreserve_fence(struct i915_fence_reg *fence)
 {
-       struct i915_ggtt *ggtt = &fence->i915->ggtt;
+       struct i915_ggtt *ggtt = fence->ggtt;
 
        lockdep_assert_held(&ggtt->vm.mutex);
 
 
 /**
  * i915_gem_restore_fences - restore fence state
- * @i915: i915 device private
+ * @ggtt: Global GTT
  *
  * Restore the hw fence state to match the software tracking again, to be called
  * after a gpu reset and on resume. Note that on runtime suspend we only cancel
  * the fences, to be reacquired by the user later.
  */
-void i915_gem_restore_fences(struct drm_i915_private *i915)
+void i915_gem_restore_fences(struct i915_ggtt *ggtt)
 {
        int i;
 
        rcu_read_lock(); /* keep obj alive as we dereference */
-       for (i = 0; i < i915->ggtt.num_fences; i++) {
-               struct i915_fence_reg *reg = &i915->ggtt.fence_regs[i];
+       for (i = 0; i < ggtt->num_fences; i++) {
+               struct i915_fence_reg *reg = &ggtt->fence_regs[i];
                struct i915_vma *vma = READ_ONCE(reg->vma);
 
                GEM_BUG_ON(vma && vma->fence != reg);
  */
 
 /**
- * i915_gem_detect_bit_6_swizzle - detect bit 6 swizzling pattern
+ * detect_bit_6_swizzle - detect bit 6 swizzling pattern
  * @i915: i915 device private
  *
  * Detects bit 6 swizzling of address lookup between IGD access and CPU
 void i915_ggtt_init_fences(struct i915_ggtt *ggtt)
 {
        struct drm_i915_private *i915 = ggtt->vm.i915;
+       struct intel_uncore *uncore = ggtt->vm.gt->uncore;
        int num_fences;
        int i;
 
        INIT_LIST_HEAD(&ggtt->fence_list);
        INIT_LIST_HEAD(&ggtt->userfault_list);
-       intel_wakeref_auto_init(&ggtt->userfault_wakeref, &i915->runtime_pm);
+       intel_wakeref_auto_init(&ggtt->userfault_wakeref, uncore->rpm);
 
        detect_bit_6_swizzle(i915);
 
                num_fences = 8;
 
        if (intel_vgpu_active(i915))
-               num_fences = intel_uncore_read(&i915->uncore,
+               num_fences = intel_uncore_read(uncore,
                                               vgtif_reg(avail_rs.fence_num));
 
        /* Initialize fence registers to zero */
        for (i = 0; i < num_fences; i++) {
                struct i915_fence_reg *fence = &ggtt->fence_regs[i];
 
-               fence->i915 = i915;
+               fence->ggtt = ggtt;
                fence->id = i;
                list_add_tail(&fence->link, &ggtt->fence_list);
        }
        ggtt->num_fences = num_fences;
 
-       i915_gem_restore_fences(i915);
+       i915_gem_restore_fences(ggtt);
 }
 
 void intel_gt_init_swizzling(struct intel_gt *gt)