Skip to content

Commit 6c3ac7b

Browse files
Ben Skeggsairlied
authored andcommitted
drm/nouveau/gsp: support deeper page tables in COPY_SERVER_RESERVED_PDES
Use data from 'struct nvkm_vmm_page/desc' to determine which PDEs need to be mirrored to RM instead of hardcoded values for pre-Hopper page tables. Needed to support Hopper/Blackwell. Signed-off-by: Ben Skeggs <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Timur Tabi <[email protected]> Tested-by: Timur Tabi <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent bc78497 commit 6c3ac7b

File tree

1 file changed

+32
-15
lines changed
  • drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535

1 file changed

+32
-15
lines changed

drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/vmm.c

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,22 @@ r535_mmu_vaspace_new(struct nvkm_vmm *vmm, u32 handle, bool external)
7575

7676
if (!external) {
7777
NV90F1_CTRL_VASPACE_COPY_SERVER_RESERVED_PDES_PARAMS *ctrl;
78+
u8 page_shift = 29; /* 512MiB */
79+
const u64 page_size = BIT_ULL(page_shift);
80+
const struct nvkm_vmm_page *page;
81+
const struct nvkm_vmm_desc *desc;
82+
struct nvkm_vmm_pt *pd = vmm->pd;
83+
84+
for (page = vmm->func->page; page->shift; page++) {
85+
if (page->shift == page_shift)
86+
break;
87+
}
88+
89+
if (WARN_ON(!page->shift))
90+
return -EINVAL;
7891

7992
mutex_lock(&vmm->mutex.vmm);
80-
ret = nvkm_vmm_get_locked(vmm, true, false, false, 0x1d, 32, 0x20000000,
93+
ret = nvkm_vmm_get_locked(vmm, true, false, false, page_shift, 32, page_size,
8194
&vmm->rm.rsvd);
8295
mutex_unlock(&vmm->mutex.vmm);
8396
if (ret)
@@ -94,22 +107,26 @@ r535_mmu_vaspace_new(struct nvkm_vmm *vmm, u32 handle, bool external)
94107
if (IS_ERR(ctrl))
95108
return PTR_ERR(ctrl);
96109

97-
ctrl->pageSize = 0x20000000;
110+
ctrl->pageSize = page_size;
98111
ctrl->virtAddrLo = vmm->rm.rsvd->addr;
99112
ctrl->virtAddrHi = vmm->rm.rsvd->addr + vmm->rm.rsvd->size - 1;
100-
ctrl->numLevelsToCopy = vmm->pd->pde[0]->pde[0] ? 3 : 2;
101-
ctrl->levels[0].physAddress = vmm->pd->pt[0]->addr;
102-
ctrl->levels[0].size = 0x20;
103-
ctrl->levels[0].aperture = 1;
104-
ctrl->levels[0].pageShift = 0x2f;
105-
ctrl->levels[1].physAddress = vmm->pd->pde[0]->pt[0]->addr;
106-
ctrl->levels[1].size = 0x1000;
107-
ctrl->levels[1].aperture = 1;
108-
ctrl->levels[1].pageShift = 0x26;
109-
ctrl->levels[2].physAddress = vmm->pd->pde[0]->pde[0]->pt[0]->addr;
110-
ctrl->levels[2].size = 0x1000;
111-
ctrl->levels[2].aperture = 1;
112-
ctrl->levels[2].pageShift = 0x1d;
113+
114+
for (desc = page->desc; desc->bits; desc++) {
115+
ctrl->numLevelsToCopy++;
116+
page_shift += desc->bits;
117+
}
118+
desc--;
119+
120+
for (int i = 0; i < ctrl->numLevelsToCopy; i++, desc--) {
121+
page_shift -= desc->bits;
122+
123+
ctrl->levels[i].physAddress = pd->pt[0]->addr;
124+
ctrl->levels[i].size = (1 << desc->bits) * desc->size;
125+
ctrl->levels[i].aperture = 1;
126+
ctrl->levels[i].pageShift = page_shift;
127+
128+
pd = pd->pde[0];
129+
}
113130

114131
ret = nvkm_gsp_rm_ctrl_wr(&vmm->rm.object, ctrl);
115132
} else {

0 commit comments

Comments
 (0)