aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2018-05-08 06:39:47 -0400
committerBen Skeggs <bskeggs@redhat.com>2018-05-18 01:01:38 -0400
commitedf50395c7c5e8563843eb586aae57c7ac1214ed (patch)
tree0d1c52d90bd2ee78ebcb03cf33c91ad5372825b5
parent1bce57250ad226e410f9a1a55c0722f075b01652 (diff)
drm/nouveau/mmu/gv100: initial support
VEID support hacked in here, as it's the most convenient place for now. Will be refined once it's better understood. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h1
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/device/base.c1
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild2
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c43
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h3
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c87
6 files changed, 137 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h
index baab93398e54..688595545e21 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/mmu.h
@@ -129,4 +129,5 @@ int gm200_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
129int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 129int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
130int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 130int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
131int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); 131int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
132int gv100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **);
132#endif 133#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
index 8da7b44697c4..46dff27a234b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
@@ -2408,6 +2408,7 @@ nv140_chipset = {
2408 .imem = nv50_instmem_new, 2408 .imem = nv50_instmem_new,
2409 .ltc = gp102_ltc_new, 2409 .ltc = gp102_ltc_new,
2410 .mc = gp100_mc_new, 2410 .mc = gp100_mc_new,
2411 .mmu = gv100_mmu_new,
2411 .pci = gp100_pci_new, 2412 .pci = gp100_pci_new,
2412 .timer = gk20a_timer_new, 2413 .timer = gk20a_timer_new,
2413 .top = gk104_top_new, 2414 .top = gk104_top_new,
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
index 67ee983bb026..58a24e3a0598 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild
@@ -12,6 +12,7 @@ nvkm-y += nvkm/subdev/mmu/gm200.o
12nvkm-y += nvkm/subdev/mmu/gm20b.o 12nvkm-y += nvkm/subdev/mmu/gm20b.o
13nvkm-y += nvkm/subdev/mmu/gp100.o 13nvkm-y += nvkm/subdev/mmu/gp100.o
14nvkm-y += nvkm/subdev/mmu/gp10b.o 14nvkm-y += nvkm/subdev/mmu/gp10b.o
15nvkm-y += nvkm/subdev/mmu/gv100.o
15 16
16nvkm-y += nvkm/subdev/mmu/mem.o 17nvkm-y += nvkm/subdev/mmu/mem.o
17nvkm-y += nvkm/subdev/mmu/memnv04.o 18nvkm-y += nvkm/subdev/mmu/memnv04.o
@@ -31,6 +32,7 @@ nvkm-y += nvkm/subdev/mmu/vmmgm200.o
31nvkm-y += nvkm/subdev/mmu/vmmgm20b.o 32nvkm-y += nvkm/subdev/mmu/vmmgm20b.o
32nvkm-y += nvkm/subdev/mmu/vmmgp100.o 33nvkm-y += nvkm/subdev/mmu/vmmgp100.o
33nvkm-y += nvkm/subdev/mmu/vmmgp10b.o 34nvkm-y += nvkm/subdev/mmu/vmmgp10b.o
35nvkm-y += nvkm/subdev/mmu/vmmgv100.o
34 36
35nvkm-y += nvkm/subdev/mmu/umem.o 37nvkm-y += nvkm/subdev/mmu/umem.o
36nvkm-y += nvkm/subdev/mmu/ummu.o 38nvkm-y += nvkm/subdev/mmu/ummu.o
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c
new file mode 100644
index 000000000000..f666cb57f69e
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c
@@ -0,0 +1,43 @@
1/*
2 * Copyright 2018 Red Hat Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22#include "mem.h"
23#include "vmm.h"
24
25#include <core/option.h>
26
27#include <nvif/class.h>
28
29static const struct nvkm_mmu_func
30gv100_mmu = {
31 .dma_bits = 47,
32 .mmu = {{ -1, -1, NVIF_CLASS_MMU_GF100}},
33 .mem = {{ -1, 0, NVIF_CLASS_MEM_GF100}, gf100_mem_new, gf100_mem_map },
34 .vmm = {{ -1, -1, NVIF_CLASS_VMM_GP100}, gv100_vmm_new },
35 .kind = gm200_mmu_kind,
36 .kind_sys = true,
37};
38
39int
40gv100_mmu_new(struct nvkm_device *device, int index, struct nvkm_mmu **pmmu)
41{
42 return nvkm_mmu_new_(&gv100_mmu, device, index, pmmu);
43}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
index da06e64d8a7d..1a3b0a3724ca 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h
@@ -236,6 +236,9 @@ int gp100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
236int gp10b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, 236int gp10b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
237 struct lock_class_key *, const char *, 237 struct lock_class_key *, const char *,
238 struct nvkm_vmm **); 238 struct nvkm_vmm **);
239int gv100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32,
240 struct lock_class_key *, const char *,
241 struct nvkm_vmm **);
239 242
240#define VMM_PRINT(l,v,p,f,a...) do { \ 243#define VMM_PRINT(l,v,p,f,a...) do { \
241 struct nvkm_vmm *_vmm = (v); \ 244 struct nvkm_vmm *_vmm = (v); \
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c
new file mode 100644
index 000000000000..2fa40c16e6d2
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c
@@ -0,0 +1,87 @@
1/*
2 * Copyright 2018 Red Hat Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22#include "vmm.h"
23
24#include <subdev/fb.h>
25#include <subdev/ltc.h>
26
27#include <nvif/ifc00d.h>
28#include <nvif/unpack.h>
29
30int
31gv100_vmm_join(struct nvkm_vmm *vmm, struct nvkm_memory *inst)
32{
33 u64 data[2], mask;
34 int ret = gp100_vmm_join(vmm, inst), i;
35 if (ret)
36 return ret;
37
38 nvkm_kmap(inst);
39 data[0] = nvkm_ro32(inst, 0x200);
40 data[1] = nvkm_ro32(inst, 0x204);
41 mask = BIT_ULL(0);
42
43 nvkm_wo32(inst, 0x21c, 0x00000000);
44
45 for (i = 0; i < 64; i++) {
46 if (mask & BIT_ULL(i)) {
47 nvkm_wo32(inst, 0x2a4 + (i * 0x10), data[1]);
48 nvkm_wo32(inst, 0x2a0 + (i * 0x10), data[0]);
49 } else {
50 nvkm_wo32(inst, 0x2a4 + (i * 0x10), 0x00000001);
51 nvkm_wo32(inst, 0x2a0 + (i * 0x10), 0x00000001);
52 }
53 nvkm_wo32(inst, 0x2a8 + (i * 0x10), 0x00000000);
54 }
55
56 nvkm_wo32(inst, 0x298, lower_32_bits(mask));
57 nvkm_wo32(inst, 0x29c, upper_32_bits(mask));
58 nvkm_done(inst);
59 return 0;
60}
61
62static const struct nvkm_vmm_func
63gv100_vmm = {
64 .join = gv100_vmm_join,
65 .part = gf100_vmm_part,
66 .aper = gf100_vmm_aper,
67 .valid = gp100_vmm_valid,
68 .flush = gp100_vmm_flush,
69 .page = {
70 { 47, &gp100_vmm_desc_16[4], NVKM_VMM_PAGE_Sxxx },
71 { 38, &gp100_vmm_desc_16[3], NVKM_VMM_PAGE_Sxxx },
72 { 29, &gp100_vmm_desc_16[2], NVKM_VMM_PAGE_Sxxx },
73 { 21, &gp100_vmm_desc_16[1], NVKM_VMM_PAGE_SVxC },
74 { 16, &gp100_vmm_desc_16[0], NVKM_VMM_PAGE_SVxC },
75 { 12, &gp100_vmm_desc_12[0], NVKM_VMM_PAGE_SVHx },
76 {}
77 }
78};
79
80int
81gv100_vmm_new(struct nvkm_mmu *mmu, u64 addr, u64 size, void *argv, u32 argc,
82 struct lock_class_key *key, const char *name,
83 struct nvkm_vmm **pvmm)
84{
85 return nv04_vmm_new_(&gv100_vmm, mmu, 0, addr, size,
86 argv, argc, key, name, pvmm);
87}