summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2018-08-14 14:30:48 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-09-05 23:38:42 -0400
commitb44c7fdb114a63ab98fffc0f246776b56399ff64 (patch)
treec523c2ea516aaed3b68271a77cf88ffa132e329d /drivers
parentef851272e5201f343c9b287a9eacfc25d4912276 (diff)
gpu: nvgpu: Move common DMA code to common/mm
This migrates the common DMA code (os agnostic) to the common directory. This new unit will be the common DMA allocator that lets users allocate SYSMEM, VIDMEM, or either. Other units will be responsible for actually handling the mechanics of allocating VIDMEM or SYSMEM. Also update the names of the DMA related files so that tmake doesn't complain about duplicate C file names. To do this call the common DMA file dma.c and prepend the OS to the other DMA files. So now we have: common/mm/dma.c os/posix/posix-dma.c os/linux/linux-dma.c JIRA NVGPU-990 Change-Id: I22d2d41803ad89be7d9c28f87864ce4fedf10836 Signed-off-by: Alex Waterman <alexw@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1799807 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/Makefile3
-rw-r--r--drivers/gpu/nvgpu/Makefile.sources3
-rw-r--r--drivers/gpu/nvgpu/common/mm/dma.c (renamed from drivers/gpu/nvgpu/os/posix/dma.c)107
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/dma.h6
-rw-r--r--drivers/gpu/nvgpu/os/linux/linux-dma.c (renamed from drivers/gpu/nvgpu/os/linux/dma.c)173
-rw-r--r--drivers/gpu/nvgpu/os/posix/posix-dma.c88
6 files changed, 138 insertions, 242 deletions
diff --git a/drivers/gpu/nvgpu/Makefile b/drivers/gpu/nvgpu/Makefile
index 43a36221..a3372cef 100644
--- a/drivers/gpu/nvgpu/Makefile
+++ b/drivers/gpu/nvgpu/Makefile
@@ -65,7 +65,7 @@ nvgpu-y += \
65 os/linux/log.o \ 65 os/linux/log.o \
66 os/linux/cond.o \ 66 os/linux/cond.o \
67 os/linux/nvgpu_mem.o \ 67 os/linux/nvgpu_mem.o \
68 os/linux/dma.o \ 68 os/linux/linux-dma.o \
69 os/linux/driver_common.o \ 69 os/linux/driver_common.o \
70 os/linux/firmware.o \ 70 os/linux/firmware.o \
71 os/linux/thread.o \ 71 os/linux/thread.o \
@@ -180,6 +180,7 @@ nvgpu-y += \
180 common/mm/nvgpu_mem.o \ 180 common/mm/nvgpu_mem.o \
181 common/mm/comptags.o \ 181 common/mm/comptags.o \
182 common/mm/mm.o \ 182 common/mm/mm.o \
183 common/mm/dma.o \
183 common/enabled.o \ 184 common/enabled.o \
184 common/nvlink.o \ 185 common/nvlink.o \
185 common/pramin.o \ 186 common/pramin.o \
diff --git a/drivers/gpu/nvgpu/Makefile.sources b/drivers/gpu/nvgpu/Makefile.sources
index f09ebf78..7dc0251b 100644
--- a/drivers/gpu/nvgpu/Makefile.sources
+++ b/drivers/gpu/nvgpu/Makefile.sources
@@ -27,7 +27,7 @@ srcs := os/posix/nvgpu.c \
27 os/posix/kmem.c \ 27 os/posix/kmem.c \
28 os/posix/io.c \ 28 os/posix/io.c \
29 os/posix/posix-nvgpu_mem.c \ 29 os/posix/posix-nvgpu_mem.c \
30 os/posix/dma.c \ 30 os/posix/posix-dma.c \
31 os/posix/posix-vm.c \ 31 os/posix/posix-vm.c \
32 os/posix/timers.c \ 32 os/posix/timers.c \
33 os/posix/posix-comptags.c \ 33 os/posix/posix-comptags.c \
@@ -56,6 +56,7 @@ srcs := os/posix/nvgpu.c \
56 common/mm/nvgpu_mem.c \ 56 common/mm/nvgpu_mem.c \
57 common/mm/comptags.c \ 57 common/mm/comptags.c \
58 common/mm/mm.c \ 58 common/mm/mm.c \
59 common/mm/dma.c \
59 common/bus/bus_gk20a.c \ 60 common/bus/bus_gk20a.c \
60 common/bus/bus_gm20b.c \ 61 common/bus/bus_gm20b.c \
61 common/bus/bus_gp10b.c \ 62 common/bus/bus_gp10b.c \
diff --git a/drivers/gpu/nvgpu/os/posix/dma.c b/drivers/gpu/nvgpu/common/mm/dma.c
index 95bb1a75..f7331f8e 100644
--- a/drivers/gpu/nvgpu/os/posix/dma.c
+++ b/drivers/gpu/nvgpu/common/mm/dma.c
@@ -20,45 +20,12 @@
20 * DEALINGS IN THE SOFTWARE. 20 * DEALINGS IN THE SOFTWARE.
21 */ 21 */
22 22
23#include <stdlib.h>
24
25#include <nvgpu/mm.h> 23#include <nvgpu/mm.h>
26#include <nvgpu/vm.h> 24#include <nvgpu/vm.h>
27#include <nvgpu/bug.h>
28#include <nvgpu/dma.h> 25#include <nvgpu/dma.h>
29#include <nvgpu/gmmu.h> 26#include <nvgpu/gmmu.h>
30#include <nvgpu/nvgpu_mem.h>
31#include <nvgpu/enabled.h> 27#include <nvgpu/enabled.h>
32 28#include <nvgpu/nvgpu_mem.h>
33/*
34 * In userspace vidmem vs sysmem is just a difference in what is placed in the
35 * aperture field.
36 */
37static int __nvgpu_do_dma_alloc(struct gk20a *g, unsigned long flags,
38 size_t size, struct nvgpu_mem *mem,
39 enum nvgpu_aperture ap)
40{
41 void *memory = malloc(mem->aligned_size);
42
43 if (memory == NULL)
44 return -ENOMEM;
45
46 mem->cpu_va = memory;
47 mem->aperture = ap;
48 mem->size = size;
49 mem->aligned_size = PAGE_ALIGN(size);
50 mem->gpu_va = 0ULL;
51 mem->skip_wmb = true;
52 mem->vidmem_alloc = NULL;
53 mem->allocator = NULL;
54
55 return 0;
56}
57
58bool nvgpu_iommuable(struct gk20a *g)
59{
60 return false;
61}
62 29
63int nvgpu_dma_alloc(struct gk20a *g, size_t size, struct nvgpu_mem *mem) 30int nvgpu_dma_alloc(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
64{ 31{
@@ -66,15 +33,22 @@ int nvgpu_dma_alloc(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
66} 33}
67 34
68int nvgpu_dma_alloc_flags(struct gk20a *g, unsigned long flags, size_t size, 35int nvgpu_dma_alloc_flags(struct gk20a *g, unsigned long flags, size_t size,
69 struct nvgpu_mem *mem) 36 struct nvgpu_mem *mem)
70{ 37{
71 if (!nvgpu_is_enabled(g, NVGPU_MM_UNIFIED_MEMORY)) { 38 if (!nvgpu_is_enabled(g, NVGPU_MM_UNIFIED_MEMORY)) {
72 /* 39 /*
73 * First try vidmem. Obviously in userspace there's no such 40 * Force the no-kernel-mapping flag on because we don't support
74 * thing as vidmem per se but we will mark the aperture as 41 * the lack of it for vidmem - the user should not care when
75 * vidmem. 42 * using nvgpu_gmmu_alloc_map and it's vidmem, or if there's a
43 * difference, the user should use the flag explicitly anyway.
44 *
45 * Incoming flags are ignored here, since bits other than the
46 * no-kernel-mapping flag are ignored by the vidmem mapping
47 * functions anyway.
76 */ 48 */
77 int err = nvgpu_dma_alloc_flags_vid(g, 0, size, mem); 49 int err = nvgpu_dma_alloc_flags_vid(g,
50 NVGPU_DMA_NO_KERNEL_MAPPING,
51 size, mem);
78 52
79 if (!err) 53 if (!err)
80 return 0; 54 return 0;
@@ -85,7 +59,6 @@ int nvgpu_dma_alloc_flags(struct gk20a *g, unsigned long flags, size_t size,
85 } 59 }
86 60
87 return nvgpu_dma_alloc_flags_sys(g, flags, size, mem); 61 return nvgpu_dma_alloc_flags_sys(g, flags, size, mem);
88
89} 62}
90 63
91int nvgpu_dma_alloc_sys(struct gk20a *g, size_t size, struct nvgpu_mem *mem) 64int nvgpu_dma_alloc_sys(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
@@ -93,45 +66,23 @@ int nvgpu_dma_alloc_sys(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
93 return nvgpu_dma_alloc_flags_sys(g, 0, size, mem); 66 return nvgpu_dma_alloc_flags_sys(g, 0, size, mem);
94} 67}
95 68
96int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags,
97 size_t size, struct nvgpu_mem *mem)
98{
99 return __nvgpu_do_dma_alloc(g, flags, size, mem, APERTURE_SYSMEM);
100}
101
102int nvgpu_dma_alloc_vid(struct gk20a *g, size_t size, struct nvgpu_mem *mem) 69int nvgpu_dma_alloc_vid(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
103{ 70{
104 return nvgpu_dma_alloc_flags_vid(g, 0, size, mem); 71 return nvgpu_dma_alloc_flags_vid(g,
72 NVGPU_DMA_NO_KERNEL_MAPPING, size, mem);
105} 73}
106 74
107int nvgpu_dma_alloc_flags_vid(struct gk20a *g, unsigned long flags, 75int nvgpu_dma_alloc_flags_vid(struct gk20a *g, unsigned long flags,
108 size_t size, struct nvgpu_mem *mem) 76 size_t size, struct nvgpu_mem *mem)
109{ 77{
110 return __nvgpu_do_dma_alloc(g, flags, size, mem, APERTURE_VIDMEM); 78 return nvgpu_dma_alloc_flags_vid_at(g, flags, size, mem, 0);
111} 79}
112 80
113int nvgpu_dma_alloc_vid_at(struct gk20a *g, 81int nvgpu_dma_alloc_vid_at(struct gk20a *g,
114 size_t size, struct nvgpu_mem *mem, u64 at) 82 size_t size, struct nvgpu_mem *mem, u64 at)
115{ 83{
116 BUG(); 84 return nvgpu_dma_alloc_flags_vid_at(g,
117 85 NVGPU_DMA_NO_KERNEL_MAPPING, size, mem, at);
118 return 0;
119}
120
121int nvgpu_dma_alloc_flags_vid_at(struct gk20a *g, unsigned long flags,
122 size_t size, struct nvgpu_mem *mem, u64 at)
123{
124 BUG();
125
126 return 0;
127}
128
129void nvgpu_dma_free(struct gk20a *g, struct nvgpu_mem *mem)
130{
131 if (!(mem->mem_flags & NVGPU_MEM_FLAG_SHADOW_COPY))
132 free(mem->cpu_va);
133
134 memset(mem, 0, sizeof(*mem));
135} 86}
136 87
137int nvgpu_dma_alloc_map(struct vm_gk20a *vm, size_t size, 88int nvgpu_dma_alloc_map(struct vm_gk20a *vm, size_t size,
@@ -144,6 +95,12 @@ int nvgpu_dma_alloc_map_flags(struct vm_gk20a *vm, unsigned long flags,
144 size_t size, struct nvgpu_mem *mem) 95 size_t size, struct nvgpu_mem *mem)
145{ 96{
146 if (!nvgpu_is_enabled(gk20a_from_vm(vm), NVGPU_MM_UNIFIED_MEMORY)) { 97 if (!nvgpu_is_enabled(gk20a_from_vm(vm), NVGPU_MM_UNIFIED_MEMORY)) {
98 /*
99 * Force the no-kernel-mapping flag on because we don't support
100 * the lack of it for vidmem - the user should not care when
101 * using nvgpu_dma_alloc_map and it's vidmem, or if there's a
102 * difference, the user should use the flag explicitly anyway.
103 */
147 int err = nvgpu_dma_alloc_map_flags_vid(vm, 104 int err = nvgpu_dma_alloc_map_flags_vid(vm,
148 flags | NVGPU_DMA_NO_KERNEL_MAPPING, 105 flags | NVGPU_DMA_NO_KERNEL_MAPPING,
149 size, mem); 106 size, mem);
@@ -218,6 +175,18 @@ fail_free:
218 return err; 175 return err;
219} 176}
220 177
178void nvgpu_dma_free(struct gk20a *g, struct nvgpu_mem *mem)
179{
180 switch (mem->aperture) {
181 case APERTURE_SYSMEM:
182 return nvgpu_dma_free_sys(g, mem);
183 case APERTURE_VIDMEM:
184 return nvgpu_dma_free_vid(g, mem);
185 default:
186 break; /* like free() on "null" memory */
187 }
188}
189
221void nvgpu_dma_unmap_free(struct vm_gk20a *vm, struct nvgpu_mem *mem) 190void nvgpu_dma_unmap_free(struct vm_gk20a *vm, struct nvgpu_mem *mem)
222{ 191{
223 if (mem->gpu_va) 192 if (mem->gpu_va)
diff --git a/drivers/gpu/nvgpu/include/nvgpu/dma.h b/drivers/gpu/nvgpu/include/nvgpu/dma.h
index d83346a3..f6f264cf 100644
--- a/drivers/gpu/nvgpu/include/nvgpu/dma.h
+++ b/drivers/gpu/nvgpu/include/nvgpu/dma.h
@@ -352,4 +352,10 @@ int nvgpu_dma_alloc_map_flags_vid(struct vm_gk20a *vm, unsigned long flags,
352 */ 352 */
353void nvgpu_dma_unmap_free(struct vm_gk20a *vm, struct nvgpu_mem *mem); 353void nvgpu_dma_unmap_free(struct vm_gk20a *vm, struct nvgpu_mem *mem);
354 354
355/*
356 * Don't use these directly. Instead use nvgpu_dma_free().
357 */
358void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem);
359void nvgpu_dma_free_vid(struct gk20a *g, struct nvgpu_mem *mem);
360
355#endif 361#endif
diff --git a/drivers/gpu/nvgpu/os/linux/dma.c b/drivers/gpu/nvgpu/os/linux/linux-dma.c
index 77669493..a42e7cb5 100644
--- a/drivers/gpu/nvgpu/os/linux/dma.c
+++ b/drivers/gpu/nvgpu/os/linux/linux-dma.c
@@ -174,45 +174,6 @@ static void nvgpu_dma_flags_to_attrs(struct dma_attrs *attrs,
174#undef ATTR_ARG 174#undef ATTR_ARG
175} 175}
176 176
177int nvgpu_dma_alloc(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
178{
179 return nvgpu_dma_alloc_flags(g, 0, size, mem);
180}
181
182int nvgpu_dma_alloc_flags(struct gk20a *g, unsigned long flags, size_t size,
183 struct nvgpu_mem *mem)
184{
185 if (!nvgpu_is_enabled(g, NVGPU_MM_UNIFIED_MEMORY)) {
186 /*
187 * Force the no-kernel-mapping flag on because we don't support
188 * the lack of it for vidmem - the user should not care when
189 * using nvgpu_gmmu_alloc_map and it's vidmem, or if there's a
190 * difference, the user should use the flag explicitly anyway.
191 *
192 * Incoming flags are ignored here, since bits other than the
193 * no-kernel-mapping flag are ignored by the vidmem mapping
194 * functions anyway.
195 */
196 int err = nvgpu_dma_alloc_flags_vid(g,
197 NVGPU_DMA_NO_KERNEL_MAPPING,
198 size, mem);
199
200 if (!err)
201 return 0;
202 /*
203 * Fall back to sysmem (which may then also fail) in case
204 * vidmem is exhausted.
205 */
206 }
207
208 return nvgpu_dma_alloc_flags_sys(g, flags, size, mem);
209}
210
211int nvgpu_dma_alloc_sys(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
212{
213 return nvgpu_dma_alloc_flags_sys(g, 0, size, mem);
214}
215
216int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags, 177int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags,
217 size_t size, struct nvgpu_mem *mem) 178 size_t size, struct nvgpu_mem *mem)
218{ 179{
@@ -302,25 +263,6 @@ fail_free_dma:
302 return err; 263 return err;
303} 264}
304 265
305int nvgpu_dma_alloc_vid(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
306{
307 return nvgpu_dma_alloc_flags_vid(g,
308 NVGPU_DMA_NO_KERNEL_MAPPING, size, mem);
309}
310
311int nvgpu_dma_alloc_flags_vid(struct gk20a *g, unsigned long flags,
312 size_t size, struct nvgpu_mem *mem)
313{
314 return nvgpu_dma_alloc_flags_vid_at(g, flags, size, mem, 0);
315}
316
317int nvgpu_dma_alloc_vid_at(struct gk20a *g,
318 size_t size, struct nvgpu_mem *mem, u64 at)
319{
320 return nvgpu_dma_alloc_flags_vid_at(g,
321 NVGPU_DMA_NO_KERNEL_MAPPING, size, mem, at);
322}
323
324int nvgpu_dma_alloc_flags_vid_at(struct gk20a *g, unsigned long flags, 266int nvgpu_dma_alloc_flags_vid_at(struct gk20a *g, unsigned long flags,
325 size_t size, struct nvgpu_mem *mem, u64 at) 267 size_t size, struct nvgpu_mem *mem, u64 at)
326{ 268{
@@ -405,97 +347,7 @@ fail_physfree:
405#endif 347#endif
406} 348}
407 349
408int nvgpu_dma_alloc_map(struct vm_gk20a *vm, size_t size, 350void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem)
409 struct nvgpu_mem *mem)
410{
411 return nvgpu_dma_alloc_map_flags(vm, 0, size, mem);
412}
413
414int nvgpu_dma_alloc_map_flags(struct vm_gk20a *vm, unsigned long flags,
415 size_t size, struct nvgpu_mem *mem)
416{
417 if (!nvgpu_is_enabled(gk20a_from_vm(vm), NVGPU_MM_UNIFIED_MEMORY)) {
418 /*
419 * Force the no-kernel-mapping flag on because we don't support
420 * the lack of it for vidmem - the user should not care when
421 * using nvgpu_dma_alloc_map and it's vidmem, or if there's a
422 * difference, the user should use the flag explicitly anyway.
423 */
424 int err = nvgpu_dma_alloc_map_flags_vid(vm,
425 flags | NVGPU_DMA_NO_KERNEL_MAPPING,
426 size, mem);
427
428 if (!err)
429 return 0;
430 /*
431 * Fall back to sysmem (which may then also fail) in case
432 * vidmem is exhausted.
433 */
434 }
435
436 return nvgpu_dma_alloc_map_flags_sys(vm, flags, size, mem);
437}
438
439int nvgpu_dma_alloc_map_sys(struct vm_gk20a *vm, size_t size,
440 struct nvgpu_mem *mem)
441{
442 return nvgpu_dma_alloc_map_flags_sys(vm, 0, size, mem);
443}
444
445int nvgpu_dma_alloc_map_flags_sys(struct vm_gk20a *vm, unsigned long flags,
446 size_t size, struct nvgpu_mem *mem)
447{
448 int err = nvgpu_dma_alloc_flags_sys(vm->mm->g, flags, size, mem);
449
450 if (err)
451 return err;
452
453 mem->gpu_va = nvgpu_gmmu_map(vm, mem, size, 0,
454 gk20a_mem_flag_none, false,
455 mem->aperture);
456 if (!mem->gpu_va) {
457 err = -ENOMEM;
458 goto fail_free;
459 }
460
461 return 0;
462
463fail_free:
464 nvgpu_dma_free(vm->mm->g, mem);
465 return err;
466}
467
468int nvgpu_dma_alloc_map_vid(struct vm_gk20a *vm, size_t size,
469 struct nvgpu_mem *mem)
470{
471 return nvgpu_dma_alloc_map_flags_vid(vm,
472 NVGPU_DMA_NO_KERNEL_MAPPING, size, mem);
473}
474
475int nvgpu_dma_alloc_map_flags_vid(struct vm_gk20a *vm, unsigned long flags,
476 size_t size, struct nvgpu_mem *mem)
477{
478 int err = nvgpu_dma_alloc_flags_vid(vm->mm->g, flags, size, mem);
479
480 if (err)
481 return err;
482
483 mem->gpu_va = nvgpu_gmmu_map(vm, mem, size, 0,
484 gk20a_mem_flag_none, false,
485 mem->aperture);
486 if (!mem->gpu_va) {
487 err = -ENOMEM;
488 goto fail_free;
489 }
490
491 return 0;
492
493fail_free:
494 nvgpu_dma_free(vm->mm->g, mem);
495 return err;
496}
497
498static void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem)
499{ 351{
500 struct device *d = dev_from_gk20a(g); 352 struct device *d = dev_from_gk20a(g);
501 353
@@ -551,7 +403,7 @@ static void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem)
551 mem->aperture = APERTURE_INVALID; 403 mem->aperture = APERTURE_INVALID;
552} 404}
553 405
554static void nvgpu_dma_free_vid(struct gk20a *g, struct nvgpu_mem *mem) 406void nvgpu_dma_free_vid(struct gk20a *g, struct nvgpu_mem *mem)
555{ 407{
556#if defined(CONFIG_GK20A_VIDMEM) 408#if defined(CONFIG_GK20A_VIDMEM)
557 size_t mem_size = mem->size; 409 size_t mem_size = mem->size;
@@ -590,27 +442,6 @@ static void nvgpu_dma_free_vid(struct gk20a *g, struct nvgpu_mem *mem)
590#endif 442#endif
591} 443}
592 444
593void nvgpu_dma_free(struct gk20a *g, struct nvgpu_mem *mem)
594{
595 switch (mem->aperture) {
596 case APERTURE_SYSMEM:
597 return nvgpu_dma_free_sys(g, mem);
598 case APERTURE_VIDMEM:
599 return nvgpu_dma_free_vid(g, mem);
600 default:
601 break; /* like free() on "null" memory */
602 }
603}
604
605void nvgpu_dma_unmap_free(struct vm_gk20a *vm, struct nvgpu_mem *mem)
606{
607 if (mem->gpu_va)
608 nvgpu_gmmu_unmap(vm, mem, mem->gpu_va);
609 mem->gpu_va = 0;
610
611 nvgpu_dma_free(vm->mm->g, mem);
612}
613
614int nvgpu_get_sgtable_attrs(struct gk20a *g, struct sg_table **sgt, 445int nvgpu_get_sgtable_attrs(struct gk20a *g, struct sg_table **sgt,
615 void *cpuva, u64 iova, size_t size, unsigned long flags) 446 void *cpuva, u64 iova, size_t size, unsigned long flags)
616{ 447{
diff --git a/drivers/gpu/nvgpu/os/posix/posix-dma.c b/drivers/gpu/nvgpu/os/posix/posix-dma.c
new file mode 100644
index 00000000..e8c5c9d4
--- /dev/null
+++ b/drivers/gpu/nvgpu/os/posix/posix-dma.c
@@ -0,0 +1,88 @@
1/*
2 * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 */
22
23#include <stdlib.h>
24
25#include <nvgpu/mm.h>
26#include <nvgpu/vm.h>
27#include <nvgpu/bug.h>
28#include <nvgpu/dma.h>
29#include <nvgpu/gmmu.h>
30#include <nvgpu/nvgpu_mem.h>
31#include <nvgpu/enabled.h>
32
33/*
34 * In userspace vidmem vs sysmem is just a difference in what is placed in the
35 * aperture field.
36 */
37static int __nvgpu_do_dma_alloc(struct gk20a *g, unsigned long flags,
38 size_t size, struct nvgpu_mem *mem,
39 enum nvgpu_aperture ap)
40{
41 void *memory = malloc(mem->aligned_size);
42
43 if (memory == NULL)
44 return -ENOMEM;
45
46 mem->cpu_va = memory;
47 mem->aperture = ap;
48 mem->size = size;
49 mem->aligned_size = PAGE_ALIGN(size);
50 mem->gpu_va = 0ULL;
51 mem->skip_wmb = true;
52 mem->vidmem_alloc = NULL;
53 mem->allocator = NULL;
54
55 return 0;
56}
57
58bool nvgpu_iommuable(struct gk20a *g)
59{
60 return false;
61}
62
63int nvgpu_dma_alloc_flags_sys(struct gk20a *g, unsigned long flags,
64 size_t size, struct nvgpu_mem *mem)
65{
66 return __nvgpu_do_dma_alloc(g, flags, size, mem, APERTURE_SYSMEM);
67}
68
69int nvgpu_dma_alloc_flags_vid_at(struct gk20a *g, unsigned long flags,
70 size_t size, struct nvgpu_mem *mem, u64 at)
71{
72 BUG();
73
74 return 0;
75}
76
77void nvgpu_dma_free_sys(struct gk20a *g, struct nvgpu_mem *mem)
78{
79 if (!(mem->mem_flags & NVGPU_MEM_FLAG_SHADOW_COPY))
80 free(mem->cpu_va);
81
82 memset(mem, 0, sizeof(*mem));
83}
84
85void nvgpu_dma_free_vid(struct gk20a *g, struct nvgpu_mem *mem)
86{
87 BUG();
88}