diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 35 |
2 files changed, 22 insertions, 16 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 35874b3a86dc..3979a81dd6ee 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -497,7 +497,8 @@ struct i915_address_space { | |||
497 | 497 | ||
498 | /* FIXME: Need a more generic return type */ | 498 | /* FIXME: Need a more generic return type */ |
499 | gen6_gtt_pte_t (*pte_encode)(dma_addr_t addr, | 499 | gen6_gtt_pte_t (*pte_encode)(dma_addr_t addr, |
500 | enum i915_cache_level level); | 500 | enum i915_cache_level level, |
501 | bool valid); /* Create a valid PTE */ | ||
501 | void (*clear_range)(struct i915_address_space *vm, | 502 | void (*clear_range)(struct i915_address_space *vm, |
502 | unsigned int first_entry, | 503 | unsigned int first_entry, |
503 | unsigned int num_entries); | 504 | unsigned int num_entries); |
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); |