[PATCH 75/78] no-page_table
Chris Wilson
chris at chris-wilson.co.uk
Sun Jan 1 15:12:02 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 dc7d26c2bc35..c74aa88e6345 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);
@@ -792,7 +792,7 @@ gen8_ppgtt_insert_pte_entries(struct i915_hw_ppgtt *ppgtt,
bool ret = true;
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 | iter->dma;
iter->dma += PAGE_SIZE;
@@ -814,7 +814,7 @@ gen8_ppgtt_insert_pte_entries(struct i915_hw_ppgtt *ppgtt,
}
kunmap_atomic(vaddr);
- vaddr = kmap_atomic_px(pd->page_table[pde]);
+ vaddr = kmap_atomic_px(&pd->page_table[pde]);
pte = 0;
}
} while (1);
@@ -865,15 +865,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]);
}
}
@@ -1019,13 +1015,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);
@@ -1144,7 +1138,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);
@@ -1307,7 +1301,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;
@@ -1316,10 +1310,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);
@@ -1330,7 +1324,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 =
@@ -1545,7 +1539,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;
@@ -1571,7 +1565,7 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
struct sgt_dma iter;
gen6_pte_t *vaddr;
- vaddr = kmap_atomic_px(ppgtt->pd.page_table[act_pt]);
+ vaddr = kmap_atomic_px(&ppgtt->pd.page_table[act_pt]);
iter.sg = pages->sgl;
iter.dma = sg_dma_address(iter.sg);
iter.max = iter.dma + iter.sg->length;
@@ -1590,7 +1584,7 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
if (++act_pte == GEN6_PTES) {
kunmap_atomic(vaddr);
- vaddr = kmap_atomic_px(ppgtt->pd.page_table[++act_pt]);
+ vaddr = kmap_atomic_px(&ppgtt->pd.page_table[++act_pt]);
act_pte = 0;
}
} while (1);
@@ -1617,18 +1611,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);
}
@@ -1682,14 +1672,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);
@@ -1738,11 +1727,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