Skip to content

Commit e762bdf

Browse files
matt-aulddanvet
authored andcommitted
drm/i915/gtt/dg1: add PTE_LM plumbing for GGTT
For the PTEs we get an LM bit, to signal whether the page resides in SMEM or LMEM. Based on a patch from Michel Thierry. BSpec: 45015 Signed-off-by: Matthew Auld <[email protected]> Cc: Joonas Lahtinen <[email protected]> Signed-off-by: Daniele Ceraolo Spurio <[email protected]> Reviewed-by: Chris Wilson <[email protected]> Signed-off-by: Chris Wilson <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Daniel Vetter <[email protected]>
1 parent 11724ee commit e762bdf

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

drivers/gpu/drm/i915/gt/intel_ggtt.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
#include <drm/i915_drm.h>
1212

13+
#include "gem/i915_gem_lmem.h"
14+
1315
#include "intel_gt.h"
1416
#include "i915_drv.h"
1517
#include "i915_scatterlist.h"
@@ -189,7 +191,12 @@ static u64 gen8_ggtt_pte_encode(dma_addr_t addr,
189191
enum i915_cache_level level,
190192
u32 flags)
191193
{
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;
193200
}
194201

195202
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,
201208
dma_addr_t addr,
202209
u64 offset,
203210
enum i915_cache_level level,
204-
u32 unused)
211+
u32 flags)
205212
{
206213
struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
207214
gen8_pte_t __iomem *pte =
208215
(gen8_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
209216

210-
gen8_set_pte(pte, gen8_ggtt_pte_encode(addr, level, 0));
217+
gen8_set_pte(pte, gen8_ggtt_pte_encode(addr, level, flags));
211218

212219
ggtt->invalidate(ggtt);
213220
}
@@ -217,7 +224,7 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
217224
enum i915_cache_level level,
218225
u32 flags)
219226
{
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);
221228
struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
222229
gen8_pte_t __iomem *gte;
223230
gen8_pte_t __iomem *end;
@@ -459,6 +466,8 @@ static void ggtt_bind_vma(struct i915_address_space *vm,
459466
pte_flags = 0;
460467
if (i915_gem_object_is_readonly(obj))
461468
pte_flags |= PTE_READ_ONLY;
469+
if (i915_gem_object_is_lmem(obj))
470+
pte_flags |= PTE_LM;
462471

463472
vm->insert_entries(vm, vma, cache_level, pte_flags);
464473
vma->page_sizes.gtt = I915_GTT_PAGE_SIZE;
@@ -794,6 +803,7 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
794803
struct drm_i915_private *i915 = ggtt->vm.i915;
795804
struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
796805
phys_addr_t phys_addr;
806+
u32 pte_flags;
797807
int ret;
798808

799809
/* 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)
823833
return ret;
824834
}
825835

836+
pte_flags = 0;
837+
if (i915_gem_object_is_lmem(ggtt->vm.scratch[0]))
838+
pte_flags |= PTE_LM;
839+
826840
ggtt->vm.scratch[0]->encode =
827841
ggtt->vm.pte_encode(px_dma(ggtt->vm.scratch[0]),
828-
I915_CACHE_NONE, 0);
842+
I915_CACHE_NONE, pte_flags);
829843

830844
return 0;
831845
}

drivers/gpu/drm/i915/gt/intel_gtt.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ typedef u64 gen8_pte_t;
8585
#define BYT_PTE_SNOOPED_BY_CPU_CACHES REG_BIT(2)
8686
#define BYT_PTE_WRITEABLE REG_BIT(1)
8787

88-
#define GEN12_PPGTT_PTE_LM BIT_ULL(11)
88+
#define GEN12_PPGTT_PTE_LM BIT_ULL(11)
89+
90+
#define GEN12_GGTT_PTE_LM BIT_ULL(1)
8991

9092
/*
9193
* Cacheability Control is a 4-bit value. The low three bits are stored in bits

0 commit comments

Comments
 (0)