drm/i915/gtt: Compute the radix for gen8 page table levels
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 12 Jul 2019 09:43:25 +0000 (10:43 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 12 Jul 2019 11:22:33 +0000 (12:22 +0100)
The radix levels of each page directory are easily determined so replace
the numerous hardcoded constants with precomputed derived constants.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190712094327.24437-4-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.h

index 4544af1..1a60403 100644 (file)
@@ -867,6 +867,48 @@ static int gen8_ppgtt_notify_vgt(struct i915_ppgtt *ppgtt, bool create)
        return 0;
 }
 
+/* Index shifts into the pagetable are offset by GEN8_PTE_SHIFT [12] */
+#define GEN8_PAGE_SIZE (SZ_4K) /* page and page-directory sizes are the same */
+#define GEN8_PTE_SHIFT (ilog2(GEN8_PAGE_SIZE))
+#define GEN8_PDES (GEN8_PAGE_SIZE / sizeof(u64))
+#define gen8_pd_shift(lvl) ((lvl) * ilog2(GEN8_PDES))
+#define gen8_pd_index(i, lvl) i915_pde_index((i), gen8_pd_shift(lvl))
+#define __gen8_pte_shift(lvl) (GEN8_PTE_SHIFT + gen8_pd_shift(lvl))
+#define __gen8_pte_index(a, lvl) i915_pde_index((a), __gen8_pte_shift(lvl))
+
+static inline unsigned int
+gen8_pd_range(u64 start, u64 end, int lvl, unsigned int *idx)
+{
+       const int shift = gen8_pd_shift(lvl);
+       const u64 mask = ~0ull << gen8_pd_shift(lvl + 1);
+
+       GEM_BUG_ON(start >= end);
+       end += ~mask >> gen8_pd_shift(1);
+
+       *idx = i915_pde_index(start, shift);
+       if ((start ^ end) & mask)
+               return GEN8_PDES - *idx;
+       else
+               return i915_pde_index(end, shift) - *idx;
+}
+
+static inline bool gen8_pd_contains(u64 start, u64 end, int lvl)
+{
+       const u64 mask = ~0ull << gen8_pd_shift(lvl + 1);
+
+       GEM_BUG_ON(start >= end);
+       return (start ^ end) & mask && (start & ~mask) == 0;
+}
+
+static inline unsigned int gen8_pt_count(u64 start, u64 end)
+{
+       GEM_BUG_ON(start >= end);
+       if ((start ^ end) >> gen8_pd_shift(1))
+               return GEN8_PDES - (start & (GEN8_PDES - 1));
+       else
+               return end - start;
+}
+
 static void gen8_free_page_tables(struct i915_address_space *vm,
                                  struct i915_page_directory *pd)
 {
index 36162bb..fb33f25 100644 (file)
@@ -124,7 +124,6 @@ typedef u64 gen8_pte_t;
 #define GEN8_3LVL_PDPES                        4
 #define GEN8_PDE_SHIFT                 21
 #define GEN8_PDE_MASK                  0x1ff
-#define GEN8_PTE_SHIFT                 12
 #define GEN8_PTE_MASK                  0x1ff
 #define GEN8_PTES                      I915_PTES(sizeof(gen8_pte_t))