summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/os')
-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/dma.c228
-rw-r--r--drivers/gpu/nvgpu/os/posix/posix-dma.c88
3 files changed, 90 insertions, 399 deletions
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/dma.c b/drivers/gpu/nvgpu/os/posix/dma.c
deleted file mode 100644
index 95bb1a75..00000000
--- a/drivers/gpu/nvgpu/os/posix/dma.c
+++ /dev/null
@@ -1,228 +0,0 @@
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(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
64{
65 return nvgpu_dma_alloc_flags(g, 0, size, mem);
66}
67
68int nvgpu_dma_alloc_flags(struct gk20a *g, unsigned long flags, size_t size,
69 struct nvgpu_mem *mem)
70{
71 if (!nvgpu_is_enabled(g, NVGPU_MM_UNIFIED_MEMORY)) {
72 /*
73 * First try vidmem. Obviously in userspace there's no such
74 * thing as vidmem per se but we will mark the aperture as
75 * vidmem.
76 */
77 int err = nvgpu_dma_alloc_flags_vid(g, 0, size, mem);
78
79 if (!err)
80 return 0;
81 /*
82 * Fall back to sysmem (which may then also fail) in case
83 * vidmem is exhausted.
84 */
85 }
86
87 return nvgpu_dma_alloc_flags_sys(g, flags, size, mem);
88
89}
90
91int nvgpu_dma_alloc_sys(struct gk20a *g, size_t size, struct nvgpu_mem *mem)
92{
93 return nvgpu_dma_alloc_flags_sys(g, 0, size, mem);
94}
95
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)
103{
104 return nvgpu_dma_alloc_flags_vid(g, 0, size, mem);
105}
106
107int nvgpu_dma_alloc_flags_vid(struct gk20a *g, unsigned long flags,
108 size_t size, struct nvgpu_mem *mem)
109{
110 return __nvgpu_do_dma_alloc(g, flags, size, mem, APERTURE_VIDMEM);
111}
112
113int nvgpu_dma_alloc_vid_at(struct gk20a *g,
114 size_t size, struct nvgpu_mem *mem, u64 at)
115{
116 BUG();
117
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}
136
137int nvgpu_dma_alloc_map(struct vm_gk20a *vm, size_t size,
138 struct nvgpu_mem *mem)
139{
140 return nvgpu_dma_alloc_map_flags(vm, 0, size, mem);
141}
142
143int nvgpu_dma_alloc_map_flags(struct vm_gk20a *vm, unsigned long flags,
144 size_t size, struct nvgpu_mem *mem)
145{
146 if (!nvgpu_is_enabled(gk20a_from_vm(vm), NVGPU_MM_UNIFIED_MEMORY)) {
147 int err = nvgpu_dma_alloc_map_flags_vid(vm,
148 flags | NVGPU_DMA_NO_KERNEL_MAPPING,
149 size, mem);
150
151 if (!err)
152 return 0;
153 /*
154 * Fall back to sysmem (which may then also fail) in case
155 * vidmem is exhausted.
156 */
157 }
158
159 return nvgpu_dma_alloc_map_flags_sys(vm, flags, size, mem);
160}
161
162int nvgpu_dma_alloc_map_sys(struct vm_gk20a *vm, size_t size,
163 struct nvgpu_mem *mem)
164{
165 return nvgpu_dma_alloc_map_flags_sys(vm, 0, size, mem);
166}
167
168int nvgpu_dma_alloc_map_flags_sys(struct vm_gk20a *vm, unsigned long flags,
169 size_t size, struct nvgpu_mem *mem)
170{
171 int err = nvgpu_dma_alloc_flags_sys(vm->mm->g, flags, size, mem);
172
173 if (err)
174 return err;
175
176 mem->gpu_va = nvgpu_gmmu_map(vm, mem, size, 0,
177 gk20a_mem_flag_none, false,
178 mem->aperture);
179 if (!mem->gpu_va) {
180 err = -ENOMEM;
181 goto fail_free;
182 }
183
184 return 0;
185
186fail_free:
187 nvgpu_dma_free(vm->mm->g, mem);
188 return err;
189}
190
191int nvgpu_dma_alloc_map_vid(struct vm_gk20a *vm, size_t size,
192 struct nvgpu_mem *mem)
193{
194 return nvgpu_dma_alloc_map_flags_vid(vm,
195 NVGPU_DMA_NO_KERNEL_MAPPING, size, mem);
196}
197
198int nvgpu_dma_alloc_map_flags_vid(struct vm_gk20a *vm, unsigned long flags,
199 size_t size, struct nvgpu_mem *mem)
200{
201 int err = nvgpu_dma_alloc_flags_vid(vm->mm->g, flags, size, mem);
202
203 if (err)
204 return err;
205
206 mem->gpu_va = nvgpu_gmmu_map(vm, mem, size, 0,
207 gk20a_mem_flag_none, false,
208 mem->aperture);
209 if (!mem->gpu_va) {
210 err = -ENOMEM;
211 goto fail_free;
212 }
213
214 return 0;
215
216fail_free:
217 nvgpu_dma_free(vm->mm->g, mem);
218 return err;
219}
220
221void nvgpu_dma_unmap_free(struct vm_gk20a *vm, struct nvgpu_mem *mem)
222{
223 if (mem->gpu_va)
224 nvgpu_gmmu_unmap(vm, mem, mem->gpu_va);
225 mem->gpu_va = 0;
226
227 nvgpu_dma_free(vm->mm->g, mem);
228}
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}