Scratch page is part of i915_address_space due to that we have only one of that. Move other scratch entities into the same struct. This is a preparatory patch for having only one instance of each scratch_pt/pd. Signed-off-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_gem_gtt.c | 65 +++++++++++++++++-------------------- drivers/gpu/drm/i915/i915_gem_gtt.h | 7 ++-- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index badbf13..6910996 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -405,14 +405,12 @@ static void free_pt(struct drm_device *dev, struct i915_page_table *pt) static void gen8_setup_scratch_pt(struct i915_address_space *vm) { - struct i915_hw_ppgtt *ppgtt = - container_of(vm, struct i915_hw_ppgtt, base); gen8_pte_t scratch_pte; scratch_pte = gen8_pte_encode(px_dma(vm->scratch_page), I915_CACHE_LLC, true); - fill_px(vm->dev, ppgtt->scratch_pt, scratch_pte); + fill_px(vm->dev, vm->scratch_pt, scratch_pte); } static struct i915_page_table *alloc_pt(struct drm_device *dev) @@ -513,7 +511,7 @@ static int gen8_mm_switch(struct i915_hw_ppgtt *ppgtt, int i, ret; for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) { - dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i); + const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i); ret = gen8_write_pdp(ring, i, pd_daddr); if (ret) @@ -623,14 +621,11 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm, static void gen8_setup_scratch_pd(struct i915_address_space *vm) { - struct i915_hw_ppgtt *ppgtt = - container_of(vm, struct i915_hw_ppgtt, base); gen8_pde_t scratch_pde; - scratch_pde = gen8_pde_encode(px_dma(ppgtt->scratch_pt), - I915_CACHE_LLC); + scratch_pde = gen8_pde_encode(px_dma(vm->scratch_pt), I915_CACHE_LLC); - fill_px(vm->dev, ppgtt->scratch_pd, scratch_pde); + fill_px(vm->dev, vm->scratch_pd, scratch_pde); } static void gen8_free_page_tables(struct i915_page_directory *pd, struct drm_device *dev) @@ -663,8 +658,8 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm) free_pd(ppgtt->base.dev, ppgtt->pdp.page_directory[i]); } - free_pd(ppgtt->base.dev, ppgtt->scratch_pd); - free_pt(ppgtt->base.dev, ppgtt->scratch_pt); + free_pd(vm->dev, vm->scratch_pd); + free_pt(vm->dev, vm->scratch_pt); } /** @@ -700,7 +695,7 @@ static int gen8_ppgtt_alloc_pagetabs(struct i915_hw_ppgtt *ppgtt, /* Don't reallocate page tables */ if (pt) { /* Scratch is never allocated this way */ - WARN_ON(pt == ppgtt->scratch_pt); + WARN_ON(pt == ppgtt->base.scratch_pt); continue; } @@ -708,7 +703,7 @@ static int gen8_ppgtt_alloc_pagetabs(struct i915_hw_ppgtt *ppgtt, if (IS_ERR(pt)) goto unwind_out; - copy_px(ppgtt, pt, ppgtt->scratch_pt); + copy_px(ppgtt, pt, ppgtt->base.scratch_pt); pd->page_table[pde] = pt; set_bit(pde, new_pts); @@ -767,7 +762,7 @@ static int gen8_ppgtt_alloc_page_directories(struct i915_hw_ppgtt *ppgtt, if (IS_ERR(pd)) goto unwind_out; - copy_px(ppgtt, pd, ppgtt->scratch_pd); + copy_px(ppgtt, pd, ppgtt->base.scratch_pd); pdp->page_directory[pdpe] = pd; set_bit(pdpe, new_pds); @@ -952,13 +947,13 @@ err_out: */ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt) { - ppgtt->scratch_pt = alloc_pt(ppgtt->base.dev); - if (IS_ERR(ppgtt->scratch_pt)) - return PTR_ERR(ppgtt->scratch_pt); + ppgtt->base.scratch_pt = alloc_pt(ppgtt->base.dev); + if (IS_ERR(ppgtt->base.scratch_pt)) + return PTR_ERR(ppgtt->base.scratch_pt); - ppgtt->scratch_pd = alloc_pd(ppgtt->base.dev); - if (IS_ERR(ppgtt->scratch_pd)) - return PTR_ERR(ppgtt->scratch_pd); + ppgtt->base.scratch_pd = alloc_pd(ppgtt->base.dev); + if (IS_ERR(ppgtt->base.scratch_pd)) + return PTR_ERR(ppgtt->base.scratch_pd); gen8_setup_scratch_pt(&ppgtt->base); gen8_setup_scratch_pd(&ppgtt->base); @@ -986,7 +981,8 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m) uint32_t pte, pde, temp; uint32_t start = ppgtt->base.start, length = ppgtt->base.total; - scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), I915_CACHE_LLC, true, 0); + scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), + I915_CACHE_LLC, true, 0); gen6_for_each_pde(unused, &ppgtt->pd, start, length, temp, pde) { u32 expected; @@ -1277,8 +1273,6 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm, static void gen6_setup_scratch_pt(struct i915_address_space *vm) { - struct i915_hw_ppgtt *ppgtt = - container_of(vm, struct i915_hw_ppgtt, base); gen6_pte_t scratch_pte; WARN_ON(px_dma(vm->scratch_page) == 0); @@ -1286,7 +1280,7 @@ static void gen6_setup_scratch_pt(struct i915_address_space *vm) scratch_pte = vm->pte_encode(px_dma(vm->scratch_page), I915_CACHE_LLC, true, 0); - fill32_px(vm->dev, ppgtt->scratch_pt, scratch_pte); + fill32_px(vm->dev, vm->scratch_pt, scratch_pte); } static int gen6_alloc_va_range(struct i915_address_space *vm, @@ -1316,7 +1310,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm, * tables. */ gen6_for_each_pde(pt, &ppgtt->pd, start, length, temp, pde) { - if (pt != ppgtt->scratch_pt) { + if (pt != vm->scratch_pt) { WARN_ON(bitmap_empty(pt->used_ptes, GEN6_PTES)); continue; } @@ -1330,7 +1324,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm, goto unwind_out; } - copy_px(ppgtt, pt, ppgtt->scratch_pt); + copy_px(ppgtt, pt, vm->scratch_pt); ppgtt->pd.page_table[pde] = pt; set_bit(pde, new_page_tables); @@ -1371,7 +1365,7 @@ unwind_out: for_each_set_bit(pde, new_page_tables, I915_PDES) { struct i915_page_table *pt = ppgtt->pd.page_table[pde]; - ppgtt->pd.page_table[pde] = ppgtt->scratch_pt; + ppgtt->pd.page_table[pde] = vm->scratch_pt; free_pt(vm->dev, pt); } @@ -1382,19 +1376,18 @@ unwind_out: static void gen6_ppgtt_cleanup(struct i915_address_space *vm) { struct i915_hw_ppgtt *ppgtt = - container_of(vm, struct i915_hw_ppgtt, base); + container_of(vm, struct i915_hw_ppgtt, base); struct i915_page_table *pt; uint32_t pde; - drm_mm_remove_node(&ppgtt->node); gen6_for_all_pdes(pt, ppgtt, pde) { - if (pt != ppgtt->scratch_pt) + if (pt != vm->scratch_pt) free_pt(ppgtt->base.dev, pt); } - free_pt(ppgtt->base.dev, ppgtt->scratch_pt); + free_pt(vm->dev, vm->scratch_pt); } static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt) @@ -1409,9 +1402,9 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt) * size. We allocate at the top of the GTT to avoid fragmentation. */ BUG_ON(!drm_mm_initialized(&dev_priv->gtt.base.mm)); - ppgtt->scratch_pt = alloc_pt(ppgtt->base.dev); - if (IS_ERR(ppgtt->scratch_pt)) - return PTR_ERR(ppgtt->scratch_pt); + ppgtt->base.scratch_pt = alloc_pt(ppgtt->base.dev); + if (IS_ERR(ppgtt->base.scratch_pt)) + return PTR_ERR(ppgtt->base.scratch_pt); gen6_setup_scratch_pt(&ppgtt->base); @@ -1444,7 +1437,7 @@ alloc: return 0; err_out: - free_pt(ppgtt->base.dev, ppgtt->scratch_pt); + free_pt(ppgtt->base.dev, ppgtt->base.scratch_pt); return ret; } @@ -1460,7 +1453,7 @@ static void gen6_scratch_va_range(struct i915_hw_ppgtt *ppgtt, uint32_t pde, temp; gen6_for_each_pde(unused, &ppgtt->pd, start, length, temp, pde) - ppgtt->pd.page_table[pde] = ppgtt->scratch_pt; + ppgtt->pd.page_table[pde] = 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 1fd4041..ba46374 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.h +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h @@ -248,6 +248,8 @@ struct i915_address_space { u64 total; /* size addr space maps (ex. 2GB for ggtt) */ struct i915_page_scratch *scratch_page; + struct i915_page_table *scratch_pt; + struct i915_page_directory *scratch_pd; /** * List of objects currently involved in rendering. @@ -337,9 +339,6 @@ struct i915_hw_ppgtt { struct i915_page_directory pd; }; - struct i915_page_table *scratch_pt; - struct i915_page_directory *scratch_pd; - struct drm_i915_file_private *file_priv; gen6_pte_t __iomem *pd_addr; @@ -481,7 +480,7 @@ i915_page_dir_dma_addr(const struct i915_hw_ppgtt *ppgtt, const unsigned n) { return test_bit(n, ppgtt->pdp.used_pdpes) ? px_dma(ppgtt->pdp.page_directory[n]) : - px_dma(ppgtt->scratch_pd); + px_dma(ppgtt->base.scratch_pd); } int i915_gem_gtt_init(struct drm_device *dev); -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx