10
10
11
11
#include <drm/i915_drm.h>
12
12
13
+ #include "gem/i915_gem_lmem.h"
14
+
13
15
#include "intel_gt.h"
14
16
#include "i915_drv.h"
15
17
#include "i915_scatterlist.h"
@@ -189,7 +191,12 @@ static u64 gen8_ggtt_pte_encode(dma_addr_t addr,
189
191
enum i915_cache_level level ,
190
192
u32 flags )
191
193
{
192
- return addr | _PAGE_PRESENT ;
194
+ gen8_pte_t pte = addr | _PAGE_PRESENT ;
195
+
196
+ if (flags & PTE_LM )
197
+ pte |= GEN12_GGTT_PTE_LM ;
198
+
199
+ return pte ;
193
200
}
194
201
195
202
static void gen8_set_pte (void __iomem * addr , gen8_pte_t pte )
@@ -201,13 +208,13 @@ static void gen8_ggtt_insert_page(struct i915_address_space *vm,
201
208
dma_addr_t addr ,
202
209
u64 offset ,
203
210
enum i915_cache_level level ,
204
- u32 unused )
211
+ u32 flags )
205
212
{
206
213
struct i915_ggtt * ggtt = i915_vm_to_ggtt (vm );
207
214
gen8_pte_t __iomem * pte =
208
215
(gen8_pte_t __iomem * )ggtt -> gsm + offset / I915_GTT_PAGE_SIZE ;
209
216
210
- gen8_set_pte (pte , gen8_ggtt_pte_encode (addr , level , 0 ));
217
+ gen8_set_pte (pte , gen8_ggtt_pte_encode (addr , level , flags ));
211
218
212
219
ggtt -> invalidate (ggtt );
213
220
}
@@ -217,7 +224,7 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
217
224
enum i915_cache_level level ,
218
225
u32 flags )
219
226
{
220
- const gen8_pte_t pte_encode = gen8_ggtt_pte_encode (0 , level , 0 );
227
+ const gen8_pte_t pte_encode = gen8_ggtt_pte_encode (0 , level , flags );
221
228
struct i915_ggtt * ggtt = i915_vm_to_ggtt (vm );
222
229
gen8_pte_t __iomem * gte ;
223
230
gen8_pte_t __iomem * end ;
@@ -459,6 +466,8 @@ static void ggtt_bind_vma(struct i915_address_space *vm,
459
466
pte_flags = 0 ;
460
467
if (i915_gem_object_is_readonly (obj ))
461
468
pte_flags |= PTE_READ_ONLY ;
469
+ if (i915_gem_object_is_lmem (obj ))
470
+ pte_flags |= PTE_LM ;
462
471
463
472
vm -> insert_entries (vm , vma , cache_level , pte_flags );
464
473
vma -> page_sizes .gtt = I915_GTT_PAGE_SIZE ;
@@ -794,6 +803,7 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
794
803
struct drm_i915_private * i915 = ggtt -> vm .i915 ;
795
804
struct pci_dev * pdev = to_pci_dev (i915 -> drm .dev );
796
805
phys_addr_t phys_addr ;
806
+ u32 pte_flags ;
797
807
int ret ;
798
808
799
809
/* For Modern GENs the PTEs and register space are split in the BAR */
@@ -823,9 +833,13 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
823
833
return ret ;
824
834
}
825
835
836
+ pte_flags = 0 ;
837
+ if (i915_gem_object_is_lmem (ggtt -> vm .scratch [0 ]))
838
+ pte_flags |= PTE_LM ;
839
+
826
840
ggtt -> vm .scratch [0 ]-> encode =
827
841
ggtt -> vm .pte_encode (px_dma (ggtt -> vm .scratch [0 ]),
828
- I915_CACHE_NONE , 0 );
842
+ I915_CACHE_NONE , pte_flags );
829
843
830
844
return 0 ;
831
845
}
0 commit comments