diff options
author | Michel Thierry <michel.thierry@intel.com> | 2015-03-16 12:00:54 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-03-20 06:48:17 -0400 |
commit | 07749ef32c4fd60334c2451739460dd1cf600281 (patch) | |
tree | dd743b70522044e23424e22c603f62f446e55f7c | |
parent | d2d9cbbd224f5fc9254c9952a78bd8cfed3b96f9 (diff) |
drm/i915: page table generalizations
No functional changes, but will improve code clarity and removed some
duplicated defines.
Signed-off-by: Michel Thierry <michel.thierry@intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 160 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.h | 28 |
2 files changed, 96 insertions, 92 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index d8ff1a8e9d43..6f5a0cf77fad 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -148,11 +148,11 @@ static void ppgtt_bind_vma(struct i915_vma *vma, | |||
148 | u32 flags); | 148 | u32 flags); |
149 | static void ppgtt_unbind_vma(struct i915_vma *vma); | 149 | static void ppgtt_unbind_vma(struct i915_vma *vma); |
150 | 150 | ||
151 | static inline gen8_gtt_pte_t gen8_pte_encode(dma_addr_t addr, | 151 | static inline gen8_pte_t gen8_pte_encode(dma_addr_t addr, |
152 | enum i915_cache_level level, | 152 | enum i915_cache_level level, |
153 | bool valid) | 153 | bool valid) |
154 | { | 154 | { |
155 | gen8_gtt_pte_t pte = valid ? _PAGE_PRESENT | _PAGE_RW : 0; | 155 | gen8_pte_t pte = valid ? _PAGE_PRESENT | _PAGE_RW : 0; |
156 | pte |= addr; | 156 | pte |= addr; |
157 | 157 | ||
158 | switch (level) { | 158 | switch (level) { |
@@ -170,11 +170,11 @@ static inline gen8_gtt_pte_t gen8_pte_encode(dma_addr_t addr, | |||
170 | return pte; | 170 | return pte; |
171 | } | 171 | } |
172 | 172 | ||
173 | static inline gen8_ppgtt_pde_t gen8_pde_encode(struct drm_device *dev, | 173 | static inline gen8_pde_t gen8_pde_encode(struct drm_device *dev, |
174 | dma_addr_t addr, | 174 | dma_addr_t addr, |
175 | enum i915_cache_level level) | 175 | enum i915_cache_level level) |
176 | { | 176 | { |
177 | gen8_ppgtt_pde_t pde = _PAGE_PRESENT | _PAGE_RW; | 177 | gen8_pde_t pde = _PAGE_PRESENT | _PAGE_RW; |
178 | pde |= addr; | 178 | pde |= addr; |
179 | if (level != I915_CACHE_NONE) | 179 | if (level != I915_CACHE_NONE) |
180 | pde |= PPAT_CACHED_PDE_INDEX; | 180 | pde |= PPAT_CACHED_PDE_INDEX; |
@@ -183,11 +183,11 @@ static inline gen8_ppgtt_pde_t gen8_pde_encode(struct drm_device *dev, | |||
183 | return pde; | 183 | return pde; |
184 | } | 184 | } |
185 | 185 | ||
186 | static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, | 186 | static gen6_pte_t snb_pte_encode(dma_addr_t addr, |
187 | enum i915_cache_level level, | 187 | enum i915_cache_level level, |
188 | bool valid, u32 unused) | 188 | bool valid, u32 unused) |
189 | { | 189 | { |
190 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; | 190 | gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
191 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 191 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
192 | 192 | ||
193 | switch (level) { | 193 | switch (level) { |
@@ -205,11 +205,11 @@ static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, | |||
205 | return pte; | 205 | return pte; |
206 | } | 206 | } |
207 | 207 | ||
208 | static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, | 208 | static gen6_pte_t ivb_pte_encode(dma_addr_t addr, |
209 | enum i915_cache_level level, | 209 | enum i915_cache_level level, |
210 | bool valid, u32 unused) | 210 | bool valid, u32 unused) |
211 | { | 211 | { |
212 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; | 212 | gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
213 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 213 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
214 | 214 | ||
215 | switch (level) { | 215 | switch (level) { |
@@ -229,11 +229,11 @@ static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, | |||
229 | return pte; | 229 | return pte; |
230 | } | 230 | } |
231 | 231 | ||
232 | static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, | 232 | static gen6_pte_t byt_pte_encode(dma_addr_t addr, |
233 | enum i915_cache_level level, | 233 | enum i915_cache_level level, |
234 | bool valid, u32 flags) | 234 | bool valid, u32 flags) |
235 | { | 235 | { |
236 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; | 236 | gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
237 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 237 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
238 | 238 | ||
239 | if (!(flags & PTE_READ_ONLY)) | 239 | if (!(flags & PTE_READ_ONLY)) |
@@ -245,11 +245,11 @@ static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, | |||
245 | return pte; | 245 | return pte; |
246 | } | 246 | } |
247 | 247 | ||
248 | static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, | 248 | static gen6_pte_t hsw_pte_encode(dma_addr_t addr, |
249 | enum i915_cache_level level, | 249 | enum i915_cache_level level, |
250 | bool valid, u32 unused) | 250 | bool valid, u32 unused) |
251 | { | 251 | { |
252 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; | 252 | gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
253 | pte |= HSW_PTE_ADDR_ENCODE(addr); | 253 | pte |= HSW_PTE_ADDR_ENCODE(addr); |
254 | 254 | ||
255 | if (level != I915_CACHE_NONE) | 255 | if (level != I915_CACHE_NONE) |
@@ -258,11 +258,11 @@ static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, | |||
258 | return pte; | 258 | return pte; |
259 | } | 259 | } |
260 | 260 | ||
261 | static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr, | 261 | static gen6_pte_t iris_pte_encode(dma_addr_t addr, |
262 | enum i915_cache_level level, | 262 | enum i915_cache_level level, |
263 | bool valid, u32 unused) | 263 | bool valid, u32 unused) |
264 | { | 264 | { |
265 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; | 265 | gen6_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
266 | pte |= HSW_PTE_ADDR_ENCODE(addr); | 266 | pte |= HSW_PTE_ADDR_ENCODE(addr); |
267 | 267 | ||
268 | switch (level) { | 268 | switch (level) { |
@@ -324,7 +324,7 @@ static int alloc_pt_range(struct i915_page_directory_entry *pd, uint16_t pde, si | |||
324 | int i, ret; | 324 | int i, ret; |
325 | 325 | ||
326 | /* 512 is the max page tables per page_directory on any platform. */ | 326 | /* 512 is the max page tables per page_directory on any platform. */ |
327 | if (WARN_ON(pde + count > GEN6_PPGTT_PD_ENTRIES)) | 327 | if (WARN_ON(pde + count > I915_PDES)) |
328 | return -EINVAL; | 328 | return -EINVAL; |
329 | 329 | ||
330 | for (i = pde; i < pde + count; i++) { | 330 | for (i = pde; i < pde + count; i++) { |
@@ -402,7 +402,7 @@ static int gen8_mm_switch(struct i915_hw_ppgtt *ppgtt, | |||
402 | int i, ret; | 402 | int i, ret; |
403 | 403 | ||
404 | /* bit of a hack to find the actual last used pd */ | 404 | /* bit of a hack to find the actual last used pd */ |
405 | int used_pd = ppgtt->num_pd_entries / GEN8_PDES_PER_PAGE; | 405 | int used_pd = ppgtt->num_pd_entries / I915_PDES; |
406 | 406 | ||
407 | for (i = used_pd - 1; i >= 0; i--) { | 407 | for (i = used_pd - 1; i >= 0; i--) { |
408 | dma_addr_t addr = ppgtt->pdp.page_directory[i]->daddr; | 408 | dma_addr_t addr = ppgtt->pdp.page_directory[i]->daddr; |
@@ -421,7 +421,7 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm, | |||
421 | { | 421 | { |
422 | struct i915_hw_ppgtt *ppgtt = | 422 | struct i915_hw_ppgtt *ppgtt = |
423 | container_of(vm, struct i915_hw_ppgtt, base); | 423 | container_of(vm, struct i915_hw_ppgtt, base); |
424 | gen8_gtt_pte_t *pt_vaddr, scratch_pte; | 424 | gen8_pte_t *pt_vaddr, scratch_pte; |
425 | unsigned pdpe = start >> GEN8_PDPE_SHIFT & GEN8_PDPE_MASK; | 425 | unsigned pdpe = start >> GEN8_PDPE_SHIFT & GEN8_PDPE_MASK; |
426 | unsigned pde = start >> GEN8_PDE_SHIFT & GEN8_PDE_MASK; | 426 | unsigned pde = start >> GEN8_PDE_SHIFT & GEN8_PDE_MASK; |
427 | unsigned pte = start >> GEN8_PTE_SHIFT & GEN8_PTE_MASK; | 427 | unsigned pte = start >> GEN8_PTE_SHIFT & GEN8_PTE_MASK; |
@@ -452,8 +452,8 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm, | |||
452 | page_table = pt->page; | 452 | page_table = pt->page; |
453 | 453 | ||
454 | last_pte = pte + num_entries; | 454 | last_pte = pte + num_entries; |
455 | if (last_pte > GEN8_PTES_PER_PAGE) | 455 | if (last_pte > GEN8_PTES) |
456 | last_pte = GEN8_PTES_PER_PAGE; | 456 | last_pte = GEN8_PTES; |
457 | 457 | ||
458 | pt_vaddr = kmap_atomic(page_table); | 458 | pt_vaddr = kmap_atomic(page_table); |
459 | 459 | ||
@@ -467,7 +467,7 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm, | |||
467 | kunmap_atomic(pt_vaddr); | 467 | kunmap_atomic(pt_vaddr); |
468 | 468 | ||
469 | pte = 0; | 469 | pte = 0; |
470 | if (++pde == GEN8_PDES_PER_PAGE) { | 470 | if (++pde == I915_PDES) { |
471 | pdpe++; | 471 | pdpe++; |
472 | pde = 0; | 472 | pde = 0; |
473 | } | 473 | } |
@@ -481,7 +481,7 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm, | |||
481 | { | 481 | { |
482 | struct i915_hw_ppgtt *ppgtt = | 482 | struct i915_hw_ppgtt *ppgtt = |
483 | container_of(vm, struct i915_hw_ppgtt, base); | 483 | container_of(vm, struct i915_hw_ppgtt, base); |
484 | gen8_gtt_pte_t *pt_vaddr; | 484 | gen8_pte_t *pt_vaddr; |
485 | unsigned pdpe = start >> GEN8_PDPE_SHIFT & GEN8_PDPE_MASK; | 485 | unsigned pdpe = start >> GEN8_PDPE_SHIFT & GEN8_PDPE_MASK; |
486 | unsigned pde = start >> GEN8_PDE_SHIFT & GEN8_PDE_MASK; | 486 | unsigned pde = start >> GEN8_PDE_SHIFT & GEN8_PDE_MASK; |
487 | unsigned pte = start >> GEN8_PTE_SHIFT & GEN8_PTE_MASK; | 487 | unsigned pte = start >> GEN8_PTE_SHIFT & GEN8_PTE_MASK; |
@@ -504,12 +504,12 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm, | |||
504 | pt_vaddr[pte] = | 504 | pt_vaddr[pte] = |
505 | gen8_pte_encode(sg_page_iter_dma_address(&sg_iter), | 505 | gen8_pte_encode(sg_page_iter_dma_address(&sg_iter), |
506 | cache_level, true); | 506 | cache_level, true); |
507 | if (++pte == GEN8_PTES_PER_PAGE) { | 507 | if (++pte == GEN8_PTES) { |
508 | if (!HAS_LLC(ppgtt->base.dev)) | 508 | if (!HAS_LLC(ppgtt->base.dev)) |
509 | drm_clflush_virt_range(pt_vaddr, PAGE_SIZE); | 509 | drm_clflush_virt_range(pt_vaddr, PAGE_SIZE); |
510 | kunmap_atomic(pt_vaddr); | 510 | kunmap_atomic(pt_vaddr); |
511 | pt_vaddr = NULL; | 511 | pt_vaddr = NULL; |
512 | if (++pde == GEN8_PDES_PER_PAGE) { | 512 | if (++pde == I915_PDES) { |
513 | pdpe++; | 513 | pdpe++; |
514 | pde = 0; | 514 | pde = 0; |
515 | } | 515 | } |
@@ -530,7 +530,7 @@ static void gen8_free_page_tables(struct i915_page_directory_entry *pd, struct d | |||
530 | if (!pd->page) | 530 | if (!pd->page) |
531 | return; | 531 | return; |
532 | 532 | ||
533 | for (i = 0; i < GEN8_PDES_PER_PAGE; i++) { | 533 | for (i = 0; i < I915_PDES; i++) { |
534 | if (WARN_ON(!pd->page_table[i])) | 534 | if (WARN_ON(!pd->page_table[i])) |
535 | continue; | 535 | continue; |
536 | 536 | ||
@@ -566,7 +566,7 @@ static void gen8_ppgtt_unmap_pages(struct i915_hw_ppgtt *ppgtt) | |||
566 | pci_unmap_page(hwdev, ppgtt->pdp.page_directory[i]->daddr, PAGE_SIZE, | 566 | pci_unmap_page(hwdev, ppgtt->pdp.page_directory[i]->daddr, PAGE_SIZE, |
567 | PCI_DMA_BIDIRECTIONAL); | 567 | PCI_DMA_BIDIRECTIONAL); |
568 | 568 | ||
569 | for (j = 0; j < GEN8_PDES_PER_PAGE; j++) { | 569 | for (j = 0; j < I915_PDES; j++) { |
570 | struct i915_page_directory_entry *pd = ppgtt->pdp.page_directory[i]; | 570 | struct i915_page_directory_entry *pd = ppgtt->pdp.page_directory[i]; |
571 | struct i915_page_table_entry *pt; | 571 | struct i915_page_table_entry *pt; |
572 | dma_addr_t addr; | 572 | dma_addr_t addr; |
@@ -599,7 +599,7 @@ static int gen8_ppgtt_allocate_page_tables(struct i915_hw_ppgtt *ppgtt) | |||
599 | 599 | ||
600 | for (i = 0; i < ppgtt->num_pd_pages; i++) { | 600 | for (i = 0; i < ppgtt->num_pd_pages; i++) { |
601 | ret = alloc_pt_range(ppgtt->pdp.page_directory[i], | 601 | ret = alloc_pt_range(ppgtt->pdp.page_directory[i], |
602 | 0, GEN8_PDES_PER_PAGE, ppgtt->base.dev); | 602 | 0, I915_PDES, ppgtt->base.dev); |
603 | if (ret) | 603 | if (ret) |
604 | goto unwind_out; | 604 | goto unwind_out; |
605 | } | 605 | } |
@@ -649,7 +649,7 @@ static int gen8_ppgtt_alloc(struct i915_hw_ppgtt *ppgtt, | |||
649 | if (ret) | 649 | if (ret) |
650 | goto err_out; | 650 | goto err_out; |
651 | 651 | ||
652 | ppgtt->num_pd_entries = max_pdp * GEN8_PDES_PER_PAGE; | 652 | ppgtt->num_pd_entries = max_pdp * I915_PDES; |
653 | 653 | ||
654 | return 0; | 654 | return 0; |
655 | 655 | ||
@@ -711,7 +711,7 @@ static int gen8_ppgtt_setup_page_tables(struct i915_hw_ppgtt *ppgtt, | |||
711 | static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) | 711 | static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) |
712 | { | 712 | { |
713 | const int max_pdp = DIV_ROUND_UP(size, 1 << 30); | 713 | const int max_pdp = DIV_ROUND_UP(size, 1 << 30); |
714 | const int min_pt_pages = GEN8_PDES_PER_PAGE * max_pdp; | 714 | const int min_pt_pages = I915_PDES * max_pdp; |
715 | int i, j, ret; | 715 | int i, j, ret; |
716 | 716 | ||
717 | if (size % (1<<30)) | 717 | if (size % (1<<30)) |
@@ -734,7 +734,7 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) | |||
734 | if (ret) | 734 | if (ret) |
735 | goto bail; | 735 | goto bail; |
736 | 736 | ||
737 | for (j = 0; j < GEN8_PDES_PER_PAGE; j++) { | 737 | for (j = 0; j < I915_PDES; j++) { |
738 | ret = gen8_ppgtt_setup_page_tables(ppgtt, i, j); | 738 | ret = gen8_ppgtt_setup_page_tables(ppgtt, i, j); |
739 | if (ret) | 739 | if (ret) |
740 | goto bail; | 740 | goto bail; |
@@ -751,9 +751,9 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) | |||
751 | */ | 751 | */ |
752 | for (i = 0; i < GEN8_LEGACY_PDPES; i++) { | 752 | for (i = 0; i < GEN8_LEGACY_PDPES; i++) { |
753 | struct i915_page_directory_entry *pd = ppgtt->pdp.page_directory[i]; | 753 | struct i915_page_directory_entry *pd = ppgtt->pdp.page_directory[i]; |
754 | gen8_ppgtt_pde_t *pd_vaddr; | 754 | gen8_pde_t *pd_vaddr; |
755 | pd_vaddr = kmap_atomic(ppgtt->pdp.page_directory[i]->page); | 755 | pd_vaddr = kmap_atomic(ppgtt->pdp.page_directory[i]->page); |
756 | for (j = 0; j < GEN8_PDES_PER_PAGE; j++) { | 756 | for (j = 0; j < I915_PDES; j++) { |
757 | struct i915_page_table_entry *pt = pd->page_table[j]; | 757 | struct i915_page_table_entry *pt = pd->page_table[j]; |
758 | dma_addr_t addr = pt->daddr; | 758 | dma_addr_t addr = pt->daddr; |
759 | pd_vaddr[j] = gen8_pde_encode(ppgtt->base.dev, addr, | 759 | pd_vaddr[j] = gen8_pde_encode(ppgtt->base.dev, addr, |
@@ -771,11 +771,11 @@ static int gen8_ppgtt_init(struct i915_hw_ppgtt *ppgtt, uint64_t size) | |||
771 | ppgtt->base.start = 0; | 771 | ppgtt->base.start = 0; |
772 | 772 | ||
773 | /* This is the area that we advertise as usable for the caller */ | 773 | /* This is the area that we advertise as usable for the caller */ |
774 | ppgtt->base.total = max_pdp * GEN8_PDES_PER_PAGE * GEN8_PTES_PER_PAGE * PAGE_SIZE; | 774 | ppgtt->base.total = max_pdp * I915_PDES * GEN8_PTES * PAGE_SIZE; |
775 | 775 | ||
776 | /* Set all ptes to a valid scratch page. Also above requested space */ | 776 | /* Set all ptes to a valid scratch page. Also above requested space */ |
777 | ppgtt->base.clear_range(&ppgtt->base, 0, | 777 | ppgtt->base.clear_range(&ppgtt->base, 0, |
778 | ppgtt->num_pd_pages * GEN8_PTES_PER_PAGE * PAGE_SIZE, | 778 | ppgtt->num_pd_pages * GEN8_PTES * PAGE_SIZE, |
779 | true); | 779 | true); |
780 | 780 | ||
781 | DRM_DEBUG_DRIVER("Allocated %d pages for page directories (%d wasted)\n", | 781 | DRM_DEBUG_DRIVER("Allocated %d pages for page directories (%d wasted)\n", |
@@ -795,22 +795,22 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m) | |||
795 | { | 795 | { |
796 | struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private; | 796 | struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private; |
797 | struct i915_address_space *vm = &ppgtt->base; | 797 | struct i915_address_space *vm = &ppgtt->base; |
798 | gen6_gtt_pte_t __iomem *pd_addr; | 798 | gen6_pte_t __iomem *pd_addr; |
799 | gen6_gtt_pte_t scratch_pte; | 799 | gen6_pte_t scratch_pte; |
800 | uint32_t pd_entry; | 800 | uint32_t pd_entry; |
801 | int pte, pde; | 801 | int pte, pde; |
802 | 802 | ||
803 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true, 0); | 803 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true, 0); |
804 | 804 | ||
805 | pd_addr = (gen6_gtt_pte_t __iomem *)dev_priv->gtt.gsm + | 805 | pd_addr = (gen6_pte_t __iomem *)dev_priv->gtt.gsm + |
806 | ppgtt->pd.pd_offset / sizeof(gen6_gtt_pte_t); | 806 | ppgtt->pd.pd_offset / sizeof(gen6_pte_t); |
807 | 807 | ||
808 | seq_printf(m, " VM %p (pd_offset %x-%x):\n", vm, | 808 | seq_printf(m, " VM %p (pd_offset %x-%x):\n", vm, |
809 | ppgtt->pd.pd_offset, | 809 | ppgtt->pd.pd_offset, |
810 | ppgtt->pd.pd_offset + ppgtt->num_pd_entries); | 810 | ppgtt->pd.pd_offset + ppgtt->num_pd_entries); |
811 | for (pde = 0; pde < ppgtt->num_pd_entries; pde++) { | 811 | for (pde = 0; pde < ppgtt->num_pd_entries; pde++) { |
812 | u32 expected; | 812 | u32 expected; |
813 | gen6_gtt_pte_t *pt_vaddr; | 813 | gen6_pte_t *pt_vaddr; |
814 | dma_addr_t pt_addr = ppgtt->pd.page_table[pde]->daddr; | 814 | dma_addr_t pt_addr = ppgtt->pd.page_table[pde]->daddr; |
815 | pd_entry = readl(pd_addr + pde); | 815 | pd_entry = readl(pd_addr + pde); |
816 | expected = (GEN6_PDE_ADDR_ENCODE(pt_addr) | GEN6_PDE_VALID); | 816 | expected = (GEN6_PDE_ADDR_ENCODE(pt_addr) | GEN6_PDE_VALID); |
@@ -823,9 +823,9 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m) | |||
823 | seq_printf(m, "\tPDE: %x\n", pd_entry); | 823 | seq_printf(m, "\tPDE: %x\n", pd_entry); |
824 | 824 | ||
825 | pt_vaddr = kmap_atomic(ppgtt->pd.page_table[pde]->page); | 825 | pt_vaddr = kmap_atomic(ppgtt->pd.page_table[pde]->page); |
826 | for (pte = 0; pte < I915_PPGTT_PT_ENTRIES; pte+=4) { | 826 | for (pte = 0; pte < GEN6_PTES; pte+=4) { |
827 | unsigned long va = | 827 | unsigned long va = |
828 | (pde * PAGE_SIZE * I915_PPGTT_PT_ENTRIES) + | 828 | (pde * PAGE_SIZE * GEN6_PTES) + |
829 | (pte * PAGE_SIZE); | 829 | (pte * PAGE_SIZE); |
830 | int i; | 830 | int i; |
831 | bool found = false; | 831 | bool found = false; |
@@ -851,13 +851,13 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m) | |||
851 | static void gen6_write_pdes(struct i915_hw_ppgtt *ppgtt) | 851 | static void gen6_write_pdes(struct i915_hw_ppgtt *ppgtt) |
852 | { | 852 | { |
853 | struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private; | 853 | struct drm_i915_private *dev_priv = ppgtt->base.dev->dev_private; |
854 | gen6_gtt_pte_t __iomem *pd_addr; | 854 | gen6_pte_t __iomem *pd_addr; |
855 | uint32_t pd_entry; | 855 | uint32_t pd_entry; |
856 | int i; | 856 | int i; |
857 | 857 | ||
858 | WARN_ON(ppgtt->pd.pd_offset & 0x3f); | 858 | WARN_ON(ppgtt->pd.pd_offset & 0x3f); |
859 | pd_addr = (gen6_gtt_pte_t __iomem*)dev_priv->gtt.gsm + | 859 | pd_addr = (gen6_pte_t __iomem*)dev_priv->gtt.gsm + |
860 | ppgtt->pd.pd_offset / sizeof(gen6_gtt_pte_t); | 860 | ppgtt->pd.pd_offset / sizeof(gen6_pte_t); |
861 | for (i = 0; i < ppgtt->num_pd_entries; i++) { | 861 | for (i = 0; i < ppgtt->num_pd_entries; i++) { |
862 | dma_addr_t pt_addr; | 862 | dma_addr_t pt_addr; |
863 | 863 | ||
@@ -1023,19 +1023,19 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm, | |||
1023 | { | 1023 | { |
1024 | struct i915_hw_ppgtt *ppgtt = | 1024 | struct i915_hw_ppgtt *ppgtt = |
1025 | container_of(vm, struct i915_hw_ppgtt, base); | 1025 | container_of(vm, struct i915_hw_ppgtt, base); |
1026 | gen6_gtt_pte_t *pt_vaddr, scratch_pte; | 1026 | gen6_pte_t *pt_vaddr, scratch_pte; |
1027 | unsigned first_entry = start >> PAGE_SHIFT; | 1027 | unsigned first_entry = start >> PAGE_SHIFT; |
1028 | unsigned num_entries = length >> PAGE_SHIFT; | 1028 | unsigned num_entries = length >> PAGE_SHIFT; |
1029 | unsigned act_pt = first_entry / I915_PPGTT_PT_ENTRIES; | 1029 | unsigned act_pt = first_entry / GEN6_PTES; |
1030 | unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES; | 1030 | unsigned first_pte = first_entry % GEN6_PTES; |
1031 | unsigned last_pte, i; | 1031 | unsigned last_pte, i; |
1032 | 1032 | ||
1033 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true, 0); | 1033 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true, 0); |
1034 | 1034 | ||
1035 | while (num_entries) { | 1035 | while (num_entries) { |
1036 | last_pte = first_pte + num_entries; | 1036 | last_pte = first_pte + num_entries; |
1037 | if (last_pte > I915_PPGTT_PT_ENTRIES) | 1037 | if (last_pte > GEN6_PTES) |
1038 | last_pte = I915_PPGTT_PT_ENTRIES; | 1038 | last_pte = GEN6_PTES; |
1039 | 1039 | ||
1040 | pt_vaddr = kmap_atomic(ppgtt->pd.page_table[act_pt]->page); | 1040 | pt_vaddr = kmap_atomic(ppgtt->pd.page_table[act_pt]->page); |
1041 | 1041 | ||
@@ -1057,10 +1057,10 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm, | |||
1057 | { | 1057 | { |
1058 | struct i915_hw_ppgtt *ppgtt = | 1058 | struct i915_hw_ppgtt *ppgtt = |
1059 | container_of(vm, struct i915_hw_ppgtt, base); | 1059 | container_of(vm, struct i915_hw_ppgtt, base); |
1060 | gen6_gtt_pte_t *pt_vaddr; | 1060 | gen6_pte_t *pt_vaddr; |
1061 | unsigned first_entry = start >> PAGE_SHIFT; | 1061 | unsigned first_entry = start >> PAGE_SHIFT; |
1062 | unsigned act_pt = first_entry / I915_PPGTT_PT_ENTRIES; | 1062 | unsigned act_pt = first_entry / GEN6_PTES; |
1063 | unsigned act_pte = first_entry % I915_PPGTT_PT_ENTRIES; | 1063 | unsigned act_pte = first_entry % GEN6_PTES; |
1064 | struct sg_page_iter sg_iter; | 1064 | struct sg_page_iter sg_iter; |
1065 | 1065 | ||
1066 | pt_vaddr = NULL; | 1066 | pt_vaddr = NULL; |
@@ -1072,7 +1072,7 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm, | |||
1072 | vm->pte_encode(sg_page_iter_dma_address(&sg_iter), | 1072 | vm->pte_encode(sg_page_iter_dma_address(&sg_iter), |
1073 | cache_level, true, flags); | 1073 | cache_level, true, flags); |
1074 | 1074 | ||
1075 | if (++act_pte == I915_PPGTT_PT_ENTRIES) { | 1075 | if (++act_pte == GEN6_PTES) { |
1076 | kunmap_atomic(pt_vaddr); | 1076 | kunmap_atomic(pt_vaddr); |
1077 | pt_vaddr = NULL; | 1077 | pt_vaddr = NULL; |
1078 | act_pt++; | 1078 | act_pt++; |
@@ -1151,7 +1151,7 @@ alloc: | |||
1151 | if (ppgtt->node.start < dev_priv->gtt.mappable_end) | 1151 | if (ppgtt->node.start < dev_priv->gtt.mappable_end) |
1152 | DRM_DEBUG("Forced to use aperture for PDEs\n"); | 1152 | DRM_DEBUG("Forced to use aperture for PDEs\n"); |
1153 | 1153 | ||
1154 | ppgtt->num_pd_entries = GEN6_PPGTT_PD_ENTRIES; | 1154 | ppgtt->num_pd_entries = I915_PDES; |
1155 | return 0; | 1155 | return 0; |
1156 | } | 1156 | } |
1157 | 1157 | ||
@@ -1231,11 +1231,11 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt) | |||
1231 | ppgtt->base.insert_entries = gen6_ppgtt_insert_entries; | 1231 | ppgtt->base.insert_entries = gen6_ppgtt_insert_entries; |
1232 | ppgtt->base.cleanup = gen6_ppgtt_cleanup; | 1232 | ppgtt->base.cleanup = gen6_ppgtt_cleanup; |
1233 | ppgtt->base.start = 0; | 1233 | ppgtt->base.start = 0; |
1234 | ppgtt->base.total = ppgtt->num_pd_entries * I915_PPGTT_PT_ENTRIES * PAGE_SIZE; | 1234 | ppgtt->base.total = ppgtt->num_pd_entries * GEN6_PTES * PAGE_SIZE; |
1235 | ppgtt->debug_dump = gen6_dump_ppgtt; | 1235 | ppgtt->debug_dump = gen6_dump_ppgtt; |
1236 | 1236 | ||
1237 | ppgtt->pd.pd_offset = | 1237 | ppgtt->pd.pd_offset = |
1238 | ppgtt->node.start / PAGE_SIZE * sizeof(gen6_gtt_pte_t); | 1238 | ppgtt->node.start / PAGE_SIZE * sizeof(gen6_pte_t); |
1239 | 1239 | ||
1240 | ppgtt->base.clear_range(&ppgtt->base, 0, ppgtt->base.total, true); | 1240 | ppgtt->base.clear_range(&ppgtt->base, 0, ppgtt->base.total, true); |
1241 | 1241 | ||
@@ -1541,7 +1541,7 @@ int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj) | |||
1541 | return 0; | 1541 | return 0; |
1542 | } | 1542 | } |
1543 | 1543 | ||
1544 | static inline void gen8_set_pte(void __iomem *addr, gen8_gtt_pte_t pte) | 1544 | static inline void gen8_set_pte(void __iomem *addr, gen8_pte_t pte) |
1545 | { | 1545 | { |
1546 | #ifdef writeq | 1546 | #ifdef writeq |
1547 | writeq(pte, addr); | 1547 | writeq(pte, addr); |
@@ -1558,8 +1558,8 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm, | |||
1558 | { | 1558 | { |
1559 | struct drm_i915_private *dev_priv = vm->dev->dev_private; | 1559 | struct drm_i915_private *dev_priv = vm->dev->dev_private; |
1560 | unsigned first_entry = start >> PAGE_SHIFT; | 1560 | unsigned first_entry = start >> PAGE_SHIFT; |
1561 | gen8_gtt_pte_t __iomem *gtt_entries = | 1561 | gen8_pte_t __iomem *gtt_entries = |
1562 | (gen8_gtt_pte_t __iomem *)dev_priv->gtt.gsm + first_entry; | 1562 | (gen8_pte_t __iomem *)dev_priv->gtt.gsm + first_entry; |
1563 | int i = 0; | 1563 | int i = 0; |
1564 | struct sg_page_iter sg_iter; | 1564 | struct sg_page_iter sg_iter; |
1565 | dma_addr_t addr = 0; /* shut up gcc */ | 1565 | dma_addr_t addr = 0; /* shut up gcc */ |
@@ -1604,8 +1604,8 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm, | |||
1604 | { | 1604 | { |
1605 | struct drm_i915_private *dev_priv = vm->dev->dev_private; | 1605 | struct drm_i915_private *dev_priv = vm->dev->dev_private; |
1606 | unsigned first_entry = start >> PAGE_SHIFT; | 1606 | unsigned first_entry = start >> PAGE_SHIFT; |
1607 | gen6_gtt_pte_t __iomem *gtt_entries = | 1607 | gen6_pte_t __iomem *gtt_entries = |
1608 | (gen6_gtt_pte_t __iomem *)dev_priv->gtt.gsm + first_entry; | 1608 | (gen6_pte_t __iomem *)dev_priv->gtt.gsm + first_entry; |
1609 | int i = 0; | 1609 | int i = 0; |
1610 | struct sg_page_iter sg_iter; | 1610 | struct sg_page_iter sg_iter; |
1611 | dma_addr_t addr = 0; | 1611 | dma_addr_t addr = 0; |
@@ -1643,8 +1643,8 @@ static void gen8_ggtt_clear_range(struct i915_address_space *vm, | |||
1643 | struct drm_i915_private *dev_priv = vm->dev->dev_private; | 1643 | struct drm_i915_private *dev_priv = vm->dev->dev_private; |
1644 | unsigned first_entry = start >> PAGE_SHIFT; | 1644 | unsigned first_entry = start >> PAGE_SHIFT; |
1645 | unsigned num_entries = length >> PAGE_SHIFT; | 1645 | unsigned num_entries = length >> PAGE_SHIFT; |
1646 | gen8_gtt_pte_t scratch_pte, __iomem *gtt_base = | 1646 | gen8_pte_t scratch_pte, __iomem *gtt_base = |
1647 | (gen8_gtt_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; | 1647 | (gen8_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; |
1648 | const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; | 1648 | const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; |
1649 | int i; | 1649 | int i; |
1650 | 1650 | ||
@@ -1669,8 +1669,8 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm, | |||
1669 | struct drm_i915_private *dev_priv = vm->dev->dev_private; | 1669 | struct drm_i915_private *dev_priv = vm->dev->dev_private; |
1670 | unsigned first_entry = start >> PAGE_SHIFT; | 1670 | unsigned first_entry = start >> PAGE_SHIFT; |
1671 | unsigned num_entries = length >> PAGE_SHIFT; | 1671 | unsigned num_entries = length >> PAGE_SHIFT; |
1672 | gen6_gtt_pte_t scratch_pte, __iomem *gtt_base = | 1672 | gen6_pte_t scratch_pte, __iomem *gtt_base = |
1673 | (gen6_gtt_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; | 1673 | (gen6_pte_t __iomem *) dev_priv->gtt.gsm + first_entry; |
1674 | const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; | 1674 | const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry; |
1675 | int i; | 1675 | int i; |
1676 | 1676 | ||
@@ -2185,7 +2185,7 @@ static int gen8_gmch_probe(struct drm_device *dev, | |||
2185 | gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl); | 2185 | gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl); |
2186 | } | 2186 | } |
2187 | 2187 | ||
2188 | *gtt_total = (gtt_size / sizeof(gen8_gtt_pte_t)) << PAGE_SHIFT; | 2188 | *gtt_total = (gtt_size / sizeof(gen8_pte_t)) << PAGE_SHIFT; |
2189 | 2189 | ||
2190 | if (IS_CHERRYVIEW(dev)) | 2190 | if (IS_CHERRYVIEW(dev)) |
2191 | chv_setup_private_ppat(dev_priv); | 2191 | chv_setup_private_ppat(dev_priv); |
@@ -2230,7 +2230,7 @@ static int gen6_gmch_probe(struct drm_device *dev, | |||
2230 | *stolen = gen6_get_stolen_size(snb_gmch_ctl); | 2230 | *stolen = gen6_get_stolen_size(snb_gmch_ctl); |
2231 | 2231 | ||
2232 | gtt_size = gen6_get_total_gtt_size(snb_gmch_ctl); | 2232 | gtt_size = gen6_get_total_gtt_size(snb_gmch_ctl); |
2233 | *gtt_total = (gtt_size / sizeof(gen6_gtt_pte_t)) << PAGE_SHIFT; | 2233 | *gtt_total = (gtt_size / sizeof(gen6_pte_t)) << PAGE_SHIFT; |
2234 | 2234 | ||
2235 | ret = ggtt_probe_common(dev, gtt_size); | 2235 | ret = ggtt_probe_common(dev, gtt_size); |
2236 | 2236 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h index c9e93f5070bc..5ca7c5eff88b 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.h +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h | |||
@@ -36,13 +36,13 @@ | |||
36 | 36 | ||
37 | struct drm_i915_file_private; | 37 | struct drm_i915_file_private; |
38 | 38 | ||
39 | typedef uint32_t gen6_gtt_pte_t; | 39 | typedef uint32_t gen6_pte_t; |
40 | typedef uint64_t gen8_gtt_pte_t; | 40 | typedef uint64_t gen8_pte_t; |
41 | typedef gen8_gtt_pte_t gen8_ppgtt_pde_t; | 41 | typedef uint64_t gen8_pde_t; |
42 | 42 | ||
43 | #define gtt_total_entries(gtt) ((gtt).base.total >> PAGE_SHIFT) | 43 | #define gtt_total_entries(gtt) ((gtt).base.total >> PAGE_SHIFT) |
44 | 44 | ||
45 | #define I915_PPGTT_PT_ENTRIES (PAGE_SIZE / sizeof(gen6_gtt_pte_t)) | 45 | |
46 | /* gen6-hsw has bit 11-4 for physical addr bit 39-32 */ | 46 | /* gen6-hsw has bit 11-4 for physical addr bit 39-32 */ |
47 | #define GEN6_GTT_ADDR_ENCODE(addr) ((addr) | (((addr) >> 28) & 0xff0)) | 47 | #define GEN6_GTT_ADDR_ENCODE(addr) ((addr) | (((addr) >> 28) & 0xff0)) |
48 | #define GEN6_PTE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr) | 48 | #define GEN6_PTE_ADDR_ENCODE(addr) GEN6_GTT_ADDR_ENCODE(addr) |
@@ -51,8 +51,13 @@ typedef gen8_gtt_pte_t gen8_ppgtt_pde_t; | |||
51 | #define GEN6_PTE_UNCACHED (1 << 1) | 51 | #define GEN6_PTE_UNCACHED (1 << 1) |
52 | #define GEN6_PTE_VALID (1 << 0) | 52 | #define GEN6_PTE_VALID (1 << 0) |
53 | 53 | ||
54 | #define GEN6_PPGTT_PD_ENTRIES 512 | 54 | #define I915_PTES(pte_len) (PAGE_SIZE / (pte_len)) |
55 | #define GEN6_PD_SIZE (GEN6_PPGTT_PD_ENTRIES * PAGE_SIZE) | 55 | #define I915_PTE_MASK(pte_len) (I915_PTES(pte_len) - 1) |
56 | #define I915_PDES 512 | ||
57 | #define I915_PDE_MASK (I915_PDES - 1) | ||
58 | |||
59 | #define GEN6_PTES I915_PTES(sizeof(gen6_pte_t)) | ||
60 | #define GEN6_PD_SIZE (I915_PDES * PAGE_SIZE) | ||
56 | #define GEN6_PD_ALIGN (PAGE_SIZE * 16) | 61 | #define GEN6_PD_ALIGN (PAGE_SIZE * 16) |
57 | #define GEN6_PDE_VALID (1 << 0) | 62 | #define GEN6_PDE_VALID (1 << 0) |
58 | 63 | ||
@@ -89,8 +94,7 @@ typedef gen8_gtt_pte_t gen8_ppgtt_pde_t; | |||
89 | #define GEN8_PTE_SHIFT 12 | 94 | #define GEN8_PTE_SHIFT 12 |
90 | #define GEN8_PTE_MASK 0x1ff | 95 | #define GEN8_PTE_MASK 0x1ff |
91 | #define GEN8_LEGACY_PDPES 4 | 96 | #define GEN8_LEGACY_PDPES 4 |
92 | #define GEN8_PTES_PER_PAGE (PAGE_SIZE / sizeof(gen8_gtt_pte_t)) | 97 | #define GEN8_PTES I915_PTES(sizeof(gen8_pte_t)) |
93 | #define GEN8_PDES_PER_PAGE (PAGE_SIZE / sizeof(gen8_ppgtt_pde_t)) | ||
94 | 98 | ||
95 | #define PPAT_UNCACHED_INDEX (_PAGE_PWT | _PAGE_PCD) | 99 | #define PPAT_UNCACHED_INDEX (_PAGE_PWT | _PAGE_PCD) |
96 | #define PPAT_CACHED_PDE_INDEX 0 /* WB LLC */ | 100 | #define PPAT_CACHED_PDE_INDEX 0 /* WB LLC */ |
@@ -199,7 +203,7 @@ struct i915_page_directory_entry { | |||
199 | dma_addr_t daddr; | 203 | dma_addr_t daddr; |
200 | }; | 204 | }; |
201 | 205 | ||
202 | struct i915_page_table_entry *page_table[GEN6_PPGTT_PD_ENTRIES]; /* PDEs */ | 206 | struct i915_page_table_entry *page_table[I915_PDES]; /* PDEs */ |
203 | }; | 207 | }; |
204 | 208 | ||
205 | struct i915_page_directory_pointer_entry { | 209 | struct i915_page_directory_pointer_entry { |
@@ -243,9 +247,9 @@ struct i915_address_space { | |||
243 | struct list_head inactive_list; | 247 | struct list_head inactive_list; |
244 | 248 | ||
245 | /* FIXME: Need a more generic return type */ | 249 | /* FIXME: Need a more generic return type */ |
246 | gen6_gtt_pte_t (*pte_encode)(dma_addr_t addr, | 250 | gen6_pte_t (*pte_encode)(dma_addr_t addr, |
247 | enum i915_cache_level level, | 251 | enum i915_cache_level level, |
248 | bool valid, u32 flags); /* Create a valid PTE */ | 252 | bool valid, u32 flags); /* Create a valid PTE */ |
249 | void (*clear_range)(struct i915_address_space *vm, | 253 | void (*clear_range)(struct i915_address_space *vm, |
250 | uint64_t start, | 254 | uint64_t start, |
251 | uint64_t length, | 255 | uint64_t length, |