Skip to content

Commit ab2ee9f

Browse files
author
Ben Skeggs
committed
drm/nouveau/mmu/gp100-: support vmms with gcc/tex replayable faults enabled
Some GPU units are capable of supporting "replayable" page faults, where the execution unit will wait for SW to fixup GPU page tables rather than triggering a channel-fatal fault. This feature isn't useful (it's harmful, even) unless something like HMM is being used to manage events appearing in the replayable fault buffer, so, it's disabled by default. This commit allows a client to request it be enabled. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
1 parent 71871aa commit ab2ee9f

File tree

10 files changed

+56
-12
lines changed

10 files changed

+56
-12
lines changed

drivers/gpu/drm/nouveau/include/nvif/ifc00d.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ struct gp100_vmm_vn {
66
/* nvif_vmm_vX ... */
77
};
88

9+
struct gp100_vmm_v0 {
10+
/* nvif_vmm_vX ... */
11+
__u8 version;
12+
__u8 fault_replay;
13+
};
14+
915
struct gp100_vmm_map_vn {
1016
/* nvif_vmm_map_vX ... */
1117
};

drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ struct nvkm_vmm {
4545

4646
dma_addr_t null;
4747
void *nullp;
48+
49+
bool replay;
4850
};
4951

5052
int nvkm_vmm_new(struct nvkm_device *, u64 addr, u64 size, void *argv, u32 argc,

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp100.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ gp100_mmu = {
3131
.dma_bits = 47,
3232
.mmu = {{ -1, -1, NVIF_CLASS_MMU_GF100}},
3333
.mem = {{ -1, 0, NVIF_CLASS_MEM_GF100}, gf100_mem_new, gf100_mem_map },
34-
.vmm = {{ -1, -1, NVIF_CLASS_VMM_GP100}, gp100_vmm_new },
34+
.vmm = {{ -1, 0, NVIF_CLASS_VMM_GP100}, gp100_vmm_new },
3535
.kind = gm200_mmu_kind,
3636
.kind_sys = true,
3737
};

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp10b.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ gp10b_mmu = {
3131
.dma_bits = 47,
3232
.mmu = {{ -1, -1, NVIF_CLASS_MMU_GF100}},
3333
.mem = {{ -1, -1, NVIF_CLASS_MEM_GF100}, .umap = gf100_mem_map },
34-
.vmm = {{ -1, -1, NVIF_CLASS_VMM_GP100}, gp10b_vmm_new },
34+
.vmm = {{ -1, 0, NVIF_CLASS_VMM_GP100}, gp10b_vmm_new },
3535
.kind = gm200_mmu_kind,
3636
.kind_sys = true,
3737
};

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ gv100_mmu = {
3131
.dma_bits = 47,
3232
.mmu = {{ -1, -1, NVIF_CLASS_MMU_GF100}},
3333
.mem = {{ -1, 0, NVIF_CLASS_MEM_GF100}, gf100_mem_new, gf100_mem_map },
34-
.vmm = {{ -1, -1, NVIF_CLASS_VMM_GP100}, gv100_vmm_new },
34+
.vmm = {{ -1, 0, NVIF_CLASS_VMM_GP100}, gv100_vmm_new },
3535
.kind = gm200_mmu_kind,
3636
.kind_sys = true,
3737
};

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@ int gm200_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *,
220220
int gm200_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base);
221221
int gm200_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
222222

223+
int gp100_vmm_new_(const struct nvkm_vmm_func *,
224+
struct nvkm_mmu *, bool, u64, u64, void *, u32,
225+
struct lock_class_key *, const char *, struct nvkm_vmm **);
223226
int gp100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *);
224227
int gp100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *);
225228
void gp100_vmm_flush(struct nvkm_vmm *, int);

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp100.c

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,11 @@ gp100_vmm_flush(struct nvkm_vmm *vmm, int depth)
476476
int
477477
gp100_vmm_join(struct nvkm_vmm *vmm, struct nvkm_memory *inst)
478478
{
479-
const u64 base = BIT_ULL(10) /* VER2 */ | BIT_ULL(11); /* 64KiB */
479+
u64 base = BIT_ULL(10) /* VER2 */ | BIT_ULL(11) /* 64KiB */;
480+
if (vmm->replay) {
481+
base |= BIT_ULL(4); /* FAULT_REPLAY_TEX */
482+
base |= BIT_ULL(5); /* FAULT_REPLAY_GCC */
483+
}
480484
return gf100_vmm_join_(vmm, inst, base);
481485
}
482486

@@ -500,11 +504,40 @@ gp100_vmm = {
500504
}
501505
};
502506

507+
int
508+
gp100_vmm_new_(const struct nvkm_vmm_func *func,
509+
struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
510+
void *argv, u32 argc, struct lock_class_key *key,
511+
const char *name, struct nvkm_vmm **pvmm)
512+
{
513+
union {
514+
struct gp100_vmm_vn vn;
515+
struct gp100_vmm_v0 v0;
516+
} *args = argv;
517+
int ret = -ENOSYS;
518+
bool replay;
519+
520+
if (!(ret = nvif_unpack(ret, &argv, &argc, args->v0, 0, 0, false))) {
521+
replay = args->v0.fault_replay != 0;
522+
} else
523+
if (!(ret = nvif_unvers(ret, &argv, &argc, args->vn))) {
524+
replay = false;
525+
} else
526+
return ret;
527+
528+
ret = nvkm_vmm_new_(func, mmu, 0, managed, addr, size, key, name, pvmm);
529+
if (ret)
530+
return ret;
531+
532+
(*pvmm)->replay = replay;
533+
return 0;
534+
}
535+
503536
int
504537
gp100_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
505538
void *argv, u32 argc, struct lock_class_key *key,
506539
const char *name, struct nvkm_vmm **pvmm)
507540
{
508-
return nv04_vmm_new_(&gp100_vmm, mmu, 0, managed, addr, size,
509-
argv, argc, key, name, pvmm);
541+
return gp100_vmm_new_(&gp100_vmm, mmu, managed, addr, size,
542+
argv, argc, key, name, pvmm);
510543
}

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp10b.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ gp10b_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
4646
void *argv, u32 argc, struct lock_class_key *key,
4747
const char *name, struct nvkm_vmm **pvmm)
4848
{
49-
return nv04_vmm_new_(&gp10b_vmm, mmu, 0, managed, addr, size,
50-
argv, argc, key, name, pvmm);
49+
return gp100_vmm_new_(&gp10b_vmm, mmu, managed, addr, size,
50+
argv, argc, key, name, pvmm);
5151
}

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,6 @@ gv100_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
8484
void *argv, u32 argc, struct lock_class_key *key,
8585
const char *name, struct nvkm_vmm **pvmm)
8686
{
87-
return nv04_vmm_new_(&gv100_vmm, mmu, 0, managed, addr, size,
88-
argv, argc, key, name, pvmm);
87+
return gp100_vmm_new_(&gv100_vmm, mmu, managed, addr, size,
88+
argv, argc, key, name, pvmm);
8989
}

drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,6 @@ tu102_vmm_new(struct nvkm_mmu *mmu, bool managed, u64 addr, u64 size,
7373
void *argv, u32 argc, struct lock_class_key *key,
7474
const char *name, struct nvkm_vmm **pvmm)
7575
{
76-
return nv04_vmm_new_(&tu102_vmm, mmu, 0, managed, addr, size,
77-
argv, argc, key, name, pvmm);
76+
return gp100_vmm_new_(&tu102_vmm, mmu, managed, addr, size,
77+
argv, argc, key, name, pvmm);
7878
}

0 commit comments

Comments
 (0)