diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_gtt.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 212f6d8c35ec..32aa69d7ef20 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -58,9 +58,10 @@ | |||
| 58 | #define HSW_WT_ELLC_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0x6) | 58 | #define HSW_WT_ELLC_LLC_AGE0 HSW_CACHEABILITY_CONTROL(0x6) |
| 59 | 59 | ||
| 60 | static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, | 60 | static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, |
| 61 | enum i915_cache_level level) | 61 | enum i915_cache_level level, |
| 62 | bool valid) | ||
| 62 | { | 63 | { |
| 63 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 64 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
| 64 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 65 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
| 65 | 66 | ||
| 66 | switch (level) { | 67 | switch (level) { |
| @@ -79,9 +80,10 @@ static gen6_gtt_pte_t snb_pte_encode(dma_addr_t addr, | |||
| 79 | } | 80 | } |
| 80 | 81 | ||
| 81 | static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, | 82 | static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, |
| 82 | enum i915_cache_level level) | 83 | enum i915_cache_level level, |
| 84 | bool valid) | ||
| 83 | { | 85 | { |
| 84 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 86 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
| 85 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 87 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
| 86 | 88 | ||
| 87 | switch (level) { | 89 | switch (level) { |
| @@ -105,9 +107,10 @@ static gen6_gtt_pte_t ivb_pte_encode(dma_addr_t addr, | |||
| 105 | #define BYT_PTE_SNOOPED_BY_CPU_CACHES (1 << 2) | 107 | #define BYT_PTE_SNOOPED_BY_CPU_CACHES (1 << 2) |
| 106 | 108 | ||
| 107 | static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, | 109 | static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, |
| 108 | enum i915_cache_level level) | 110 | enum i915_cache_level level, |
| 111 | bool valid) | ||
| 109 | { | 112 | { |
| 110 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 113 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
| 111 | pte |= GEN6_PTE_ADDR_ENCODE(addr); | 114 | pte |= GEN6_PTE_ADDR_ENCODE(addr); |
| 112 | 115 | ||
| 113 | /* Mark the page as writeable. Other platforms don't have a | 116 | /* Mark the page as writeable. Other platforms don't have a |
| @@ -122,9 +125,10 @@ static gen6_gtt_pte_t byt_pte_encode(dma_addr_t addr, | |||
| 122 | } | 125 | } |
| 123 | 126 | ||
| 124 | static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, | 127 | static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, |
| 125 | enum i915_cache_level level) | 128 | enum i915_cache_level level, |
| 129 | bool valid) | ||
| 126 | { | 130 | { |
| 127 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 131 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
| 128 | pte |= HSW_PTE_ADDR_ENCODE(addr); | 132 | pte |= HSW_PTE_ADDR_ENCODE(addr); |
| 129 | 133 | ||
| 130 | if (level != I915_CACHE_NONE) | 134 | if (level != I915_CACHE_NONE) |
| @@ -134,9 +138,10 @@ static gen6_gtt_pte_t hsw_pte_encode(dma_addr_t addr, | |||
| 134 | } | 138 | } |
| 135 | 139 | ||
| 136 | static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr, | 140 | static gen6_gtt_pte_t iris_pte_encode(dma_addr_t addr, |
| 137 | enum i915_cache_level level) | 141 | enum i915_cache_level level, |
| 142 | bool valid) | ||
| 138 | { | 143 | { |
| 139 | gen6_gtt_pte_t pte = GEN6_PTE_VALID; | 144 | gen6_gtt_pte_t pte = valid ? GEN6_PTE_VALID : 0; |
| 140 | pte |= HSW_PTE_ADDR_ENCODE(addr); | 145 | pte |= HSW_PTE_ADDR_ENCODE(addr); |
| 141 | 146 | ||
| 142 | switch (level) { | 147 | switch (level) { |
| @@ -245,7 +250,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm, | |||
| 245 | unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES; | 250 | unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES; |
| 246 | unsigned last_pte, i; | 251 | unsigned last_pte, i; |
| 247 | 252 | ||
| 248 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC); | 253 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true); |
| 249 | 254 | ||
| 250 | while (num_entries) { | 255 | while (num_entries) { |
| 251 | last_pte = first_pte + num_entries; | 256 | last_pte = first_pte + num_entries; |
| @@ -282,7 +287,7 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm, | |||
| 282 | dma_addr_t page_addr; | 287 | dma_addr_t page_addr; |
| 283 | 288 | ||
| 284 | page_addr = sg_page_iter_dma_address(&sg_iter); | 289 | page_addr = sg_page_iter_dma_address(&sg_iter); |
| 285 | pt_vaddr[act_pte] = vm->pte_encode(page_addr, cache_level); | 290 | pt_vaddr[act_pte] = vm->pte_encode(page_addr, cache_level, true); |
| 286 | if (++act_pte == I915_PPGTT_PT_ENTRIES) { | 291 | if (++act_pte == I915_PPGTT_PT_ENTRIES) { |
| 287 | kunmap_atomic(pt_vaddr); | 292 | kunmap_atomic(pt_vaddr); |
| 288 | act_pt++; | 293 | act_pt++; |
| @@ -536,7 +541,7 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm, | |||
| 536 | 541 | ||
| 537 | for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { | 542 | for_each_sg_page(st->sgl, &sg_iter, st->nents, 0) { |
| 538 | addr = sg_page_iter_dma_address(&sg_iter); | 543 | addr = sg_page_iter_dma_address(&sg_iter); |
| 539 | iowrite32(vm->pte_encode(addr, level), >t_entries[i]); | 544 | iowrite32(vm->pte_encode(addr, level, true), >t_entries[i]); |
| 540 | i++; | 545 | i++; |
| 541 | } | 546 | } |
| 542 | 547 | ||
| @@ -548,7 +553,7 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm, | |||
| 548 | */ | 553 | */ |
| 549 | if (i != 0) | 554 | if (i != 0) |
| 550 | WARN_ON(readl(>t_entries[i-1]) != | 555 | WARN_ON(readl(>t_entries[i-1]) != |
| 551 | vm->pte_encode(addr, level)); | 556 | vm->pte_encode(addr, level, true)); |
| 552 | 557 | ||
| 553 | /* This next bit makes the above posting read even more important. We | 558 | /* This next bit makes the above posting read even more important. We |
| 554 | * want to flush the TLBs only after we're certain all the PTE updates | 559 | * want to flush the TLBs only after we're certain all the PTE updates |
| @@ -573,7 +578,7 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm, | |||
| 573 | first_entry, num_entries, max_entries)) | 578 | first_entry, num_entries, max_entries)) |
| 574 | num_entries = max_entries; | 579 | num_entries = max_entries; |
| 575 | 580 | ||
| 576 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC); | 581 | scratch_pte = vm->pte_encode(vm->scratch.addr, I915_CACHE_LLC, true); |
| 577 | for (i = 0; i < num_entries; i++) | 582 | for (i = 0; i < num_entries; i++) |
| 578 | iowrite32(scratch_pte, >t_base[i]); | 583 | iowrite32(scratch_pte, >t_base[i]); |
| 579 | readl(gtt_base); | 584 | readl(gtt_base); |
