diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2018-05-08 06:39:47 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2018-05-18 01:01:38 -0400 |
commit | edf50395c7c5e8563843eb586aae57c7ac1214ed (patch) | |
tree | 0d1c52d90bd2ee78ebcb03cf33c91ad5372825b5 | |
parent | 1bce57250ad226e410f9a1a55c0722f075b01652 (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/device/base.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/mmu/Kbuild | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.c | 43 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.c | 87 |
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 **); | |||
129 | int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | 129 | int gm20b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
130 | int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | 130 | int gp100_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
131 | int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); | 131 | int gp10b_mmu_new(struct nvkm_device *, int, struct nvkm_mmu **); |
132 | int 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 | |||
12 | nvkm-y += nvkm/subdev/mmu/gm20b.o | 12 | nvkm-y += nvkm/subdev/mmu/gm20b.o |
13 | nvkm-y += nvkm/subdev/mmu/gp100.o | 13 | nvkm-y += nvkm/subdev/mmu/gp100.o |
14 | nvkm-y += nvkm/subdev/mmu/gp10b.o | 14 | nvkm-y += nvkm/subdev/mmu/gp10b.o |
15 | nvkm-y += nvkm/subdev/mmu/gv100.o | ||
15 | 16 | ||
16 | nvkm-y += nvkm/subdev/mmu/mem.o | 17 | nvkm-y += nvkm/subdev/mmu/mem.o |
17 | nvkm-y += nvkm/subdev/mmu/memnv04.o | 18 | nvkm-y += nvkm/subdev/mmu/memnv04.o |
@@ -31,6 +32,7 @@ nvkm-y += nvkm/subdev/mmu/vmmgm200.o | |||
31 | nvkm-y += nvkm/subdev/mmu/vmmgm20b.o | 32 | nvkm-y += nvkm/subdev/mmu/vmmgm20b.o |
32 | nvkm-y += nvkm/subdev/mmu/vmmgp100.o | 33 | nvkm-y += nvkm/subdev/mmu/vmmgp100.o |
33 | nvkm-y += nvkm/subdev/mmu/vmmgp10b.o | 34 | nvkm-y += nvkm/subdev/mmu/vmmgp10b.o |
35 | nvkm-y += nvkm/subdev/mmu/vmmgv100.o | ||
34 | 36 | ||
35 | nvkm-y += nvkm/subdev/mmu/umem.o | 37 | nvkm-y += nvkm/subdev/mmu/umem.o |
36 | nvkm-y += nvkm/subdev/mmu/ummu.o | 38 | nvkm-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 | |||
29 | static const struct nvkm_mmu_func | ||
30 | gv100_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 | |||
39 | int | ||
40 | gv100_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, | |||
236 | int gp10b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, | 236 | int 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 **); |
239 | int 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 | |||
30 | int | ||
31 | gv100_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 | |||
62 | static const struct nvkm_vmm_func | ||
63 | gv100_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 | |||
80 | int | ||
81 | gv100_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 | } | ||