[PATCH 75/78] no-page_table

Chris Wilson chris at chris-wilson.co.uk
Sun Jan 1 13:34:04 UTC 2017


---
 drivers/gpu/drm/i915/i915_gem_gtt.c | 59 +++++++++++++++----------------------
 drivers/gpu/drm/i915/i915_gem_gtt.h | 11 ++++---
 2 files changed, 29 insertions(+), 41 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index f1fbe3a83258..4c88446e9d17 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -688,10 +688,10 @@ static bool gen8_ppgtt_clear_pd(struct i915_address_space *vm,
 			continue;
 
 		vaddr[pde] = scratch_pde;
-		pd->page_table[pde] = NULL;
 		pd->used_pdes--;
 
-		free_pt(vm, pt);
+		cleanup_px(vm, pt);
+		px_page(pt) = NULL;
 	}
 	kunmap_atomic(vaddr);
 
@@ -786,7 +786,7 @@ gen8_ppgtt_insert_pte_entries(struct i915_address_space *vm,
 	gen8_pte_t *vaddr;
 
 	pd = pdp->page_directory[pdpe];
-	vaddr = kmap_atomic_px(pd->page_table[pde]);
+	vaddr = kmap_atomic_px(&pd->page_table[pde]);
 
 	do {
 		vaddr[pte] = pte_encode | (sgt_iter->dma + sgt_iter->curr);
@@ -808,7 +808,7 @@ gen8_ppgtt_insert_pte_entries(struct i915_address_space *vm,
 			}
 
 			kunmap_atomic(vaddr);
-			vaddr = kmap_atomic_px(pd->page_table[pde]);
+			vaddr = kmap_atomic_px(&pd->page_table[pde]);
 			pte = 0;
 		}
 	} while (1);
@@ -844,15 +844,11 @@ static void gen8_free_page_tables(struct i915_address_space *vm,
 {
 	int i;
 
-	if (!px_page(pd))
-		return;
-
 	for (i = 0; i < I915_PDES; i++) {
-		if (!pd->page_table[i])
+		if (!px_page(&pd->page_table[i]))
 			continue;
 
-		free_pt(vm, pd->page_table[i]);
-		pd->page_table[i] = NULL;
+		cleanup_px(vm, &pd->page_table[i]);
 	}
 }
 
@@ -998,13 +994,11 @@ static int gen8_ppgtt_alloc_pd(struct i915_address_space *vm,
 
 	vaddr = kmap_px(pd);
 	gen8_for_each_pde(pt, pd, start, length, pde) {
-		if (!pt) {
-			pt = alloc_pt(vm);
-			if (IS_ERR(pt))
+		if (!px_page(pt)) {
+			if (setup_px(vm, pt))
 				goto unwind;
 
 			gen8_initialize_pt(vm, pt);
-			pd->page_table[pde] = pt;
 			pd->used_pdes++;
 			vaddr[pde] = gen8_pde_encode(px_dma(pt),
 						     I915_CACHE_LLC);
@@ -1123,7 +1117,7 @@ static void gen8_dump_pdp(struct i915_hw_ppgtt *ppgtt,
 			uint32_t  pte;
 			gen8_pte_t *pt_vaddr;
 
-			if (!pd->page_table[pde])
+			if (!px_page(pt))
 				continue;
 
 			pt_vaddr = kmap_atomic_px(pt);
@@ -1287,7 +1281,7 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
 static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
 {
 	struct i915_address_space *vm = &ppgtt->base;
-	struct i915_page_table *unused;
+	struct i915_page_table *pt;
 	gen6_pte_t scratch_pte;
 	uint32_t pd_entry;
 	uint32_t  pte, pde;
@@ -1296,10 +1290,10 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
 	scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
 				     I915_CACHE_LLC, 0);
 
-	gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde) {
+	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde) {
 		u32 expected;
 		gen6_pte_t *pt_vaddr;
-		const dma_addr_t pt_addr = px_dma(ppgtt->pd.page_table[pde]);
+		const dma_addr_t pt_addr = px_dma(pt);
 		pd_entry = readl(ppgtt->pd_addr + pde);
 		expected = (GEN6_PDE_ADDR_ENCODE(pt_addr) | GEN6_PDE_VALID);
 
@@ -1310,7 +1304,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
 				   expected);
 		seq_printf(m, "\tPDE: %x\n", pd_entry);
 
-		pt_vaddr = kmap_atomic_px(ppgtt->pd.page_table[pde]);
+		pt_vaddr = kmap_atomic_px(pt);
 
 		for (pte = 0; pte < GEN6_PTES; pte+=4) {
 			unsigned long va =
@@ -1525,7 +1519,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
 		if (last_pte > GEN6_PTES)
 			last_pte = GEN6_PTES;
 
-		pt_vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
+		pt_vaddr = kmap_atomic_px(&ppgtt->pd.page_table[act_pt]);
 
 		for (i = first_pte; i < last_pte; i++)
 			pt_vaddr[i] = scratch_pte;
@@ -1552,11 +1546,11 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
 	gen6_pte_t *pt_vaddr;
 	dma_addr_t addr;
 
-	pt_vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
+	pt_vaddr = kmap_atomic_px(&ppgtt->pd.page_table[act_pt]);
 	for_each_sgt_dma(addr, sgt_iter, pages) {
 		if (++act_pte == GEN6_PTES) {
 			kunmap_atomic(pt_vaddr);
-			pt_vaddr = kmap_atomic_px(ppgtt->pd.page_table[++act_pt]);
+			pt_vaddr = kmap_atomic_px(&ppgtt->pd.page_table[++act_pt]);
 			act_pte = 0;
 		}
 		pt_vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(addr);
@@ -1584,18 +1578,14 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 	 * tables.
 	 */
 	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde) {
-		if (pt != vm->scratch_pt)
+		if (px_page(pt) != px_page(vm->scratch_pt))
 			continue;
 
-		pt = alloc_pt(vm);
-		if (IS_ERR(pt)) {
-			ret = PTR_ERR(pt);
+		ret = setup_px(vm, pt);
+		if (ret)
 			goto unwind_out;
-		}
 
 		gen6_initialize_pt(vm, pt);
-
-		ppgtt->pd.page_table[pde] = pt;
 		trace_i915_page_table_entry_alloc(vm, pde, start, GEN6_PDE_SHIFT);
 	}
 
@@ -1649,14 +1639,13 @@ static void gen6_free_scratch(struct i915_address_space *vm)
 static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
 {
 	struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
-	struct i915_page_directory *pd = &ppgtt->pd;
 	struct i915_page_table *pt;
 	uint32_t pde;
 
 	drm_mm_remove_node(&ppgtt->node);
 
-	gen6_for_all_pdes(pt, pd, pde)
-		if (pt != vm->scratch_pt)
+	gen6_for_all_pdes(pt, ppgtt, pde)
+		if (px_page(pt) != px_page(vm->scratch_pt))
 			free_pt(vm, pt);
 
 	gen6_free_scratch(vm);
@@ -1705,11 +1694,11 @@ static int gen6_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt)
 static void gen6_scratch_va_range(struct i915_hw_ppgtt *ppgtt,
 				  uint64_t start, uint64_t length)
 {
-	struct i915_page_table *unused;
+	struct i915_page_table *pt;
 	uint32_t pde;
 
-	gen6_for_each_pde(unused, &ppgtt->pd, start, length, pde)
-		ppgtt->pd.page_table[pde] = ppgtt->base.scratch_pt;
+	gen6_for_each_pde(pt, &ppgtt->pd, start, length, pde)
+		*pt = *ppgtt->base.scratch_pt;
 }
 
 static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index 0c3e5df51402..c9c608debf41 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -221,8 +221,7 @@ struct i915_page_table {
 
 struct i915_page_directory {
 	struct i915_page_dma base;
-
-	struct i915_page_table *page_table[I915_PDES]; /* PDEs */
+	struct i915_page_table page_table[I915_PDES]; /* PDEs */
 	unsigned int used_pdes;
 };
 
@@ -395,15 +394,15 @@ struct i915_hw_ppgtt {
 #define gen6_for_each_pde(pt, pd, start, length, iter)			\
 	for (iter = gen6_pde_index(start);				\
 	     length > 0 && iter < I915_PDES &&				\
-		(pt = (pd)->page_table[iter], true);			\
+		(pt = &(pd)->page_table[iter], true);			\
 	     ({ u32 temp = ALIGN(start+1, 1 << GEN6_PDE_SHIFT);		\
 		    temp = min(temp - start, length);			\
 		    start += temp, length -= temp; }), ++iter)
 
-#define gen6_for_all_pdes(pt, pd, iter)					\
+#define gen6_for_all_pdes(pt, ppgtt, iter)				\
 	for (iter = 0;							\
 	     iter < I915_PDES &&					\
-		(pt = (pd)->page_table[iter], true);			\
+	     (pt = &(ppgtt)->pd.page_table[iter], true);		\
 	     ++iter)
 
 static inline uint32_t i915_pte_index(uint64_t address, uint32_t pde_shift)
@@ -461,7 +460,7 @@ static inline uint32_t gen6_pde_index(uint32_t addr)
 #define gen8_for_each_pde(pt, pd, start, length, iter)			\
 	for (iter = gen8_pde_index(start);				\
 	     length > 0 && iter < I915_PDES &&				\
-		(pt = (pd)->page_table[iter], true);			\
+		(pt = &(pd)->page_table[iter], true);			\
 	     ({ u64 temp = ALIGN(start+1, 1 << GEN8_PDE_SHIFT);		\
 		    temp = min(temp - start, length);			\
 		    start += temp, length -= temp; }), ++iter)
-- 
2.11.0



More information about the Intel-gfx-trybot mailing list