summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2017-03-14 07:47:04 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-03-21 18:01:47 -0400
commit8f3875393e7a6bd0fc03afdb1fa99b7e33b71576 (patch)
tree7ee7b2da741fae7d06eeb367db2b14d8f78f0f55 /drivers/gpu/nvgpu/gk20a/mm_gk20a.h
parent79658ac5cb22cc68a2d24d964379a606086c8b39 (diff)
gpu: nvgpu: abstract away dma alloc attrs
Don't use enum dma_attr in the gk20a_gmmu_alloc_attr* functions, but define nvgpu-internal flags for no kernel mapping, force contiguous, and read only modes. Store the flags in the allocated struct mem_desc and only use gk20a_gmmu_free, remove gk20a_gmmu_free_attr. This helps in OS abstraction. Rename the notion of attr to flags. Add implicit NVGPU_DMA_NO_KERNEL_MAPPING to all vidmem buffers allocated via gk20a_gmmu_alloc_vid for consistency. Fix a bug in gk20a_gmmu_alloc_map_attr that dropped the attr parameter accidentally. Bug 1853519 Change-Id: I1ff67dff9fc425457ae445ce4976a780eb4dcc9f Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: http://git-master/r/1321101 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> Reviewed-by: Alex Waterman <alexw@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.h')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.h39
1 files changed, 27 insertions, 12 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
index 0d3547e1..52e5d4db 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h
@@ -19,7 +19,6 @@
19#define MM_GK20A_H 19#define MM_GK20A_H
20 20
21#include <linux/scatterlist.h> 21#include <linux/scatterlist.h>
22#include <linux/dma-attrs.h>
23#include <linux/iommu.h> 22#include <linux/iommu.h>
24#include <soc/tegra/chip-id.h> 23#include <soc/tegra/chip-id.h>
25#include <linux/vmalloc.h> 24#include <linux/vmalloc.h>
@@ -80,6 +79,7 @@ struct mem_desc {
80 struct nvgpu_allocator *allocator; /* vidmem only */ 79 struct nvgpu_allocator *allocator; /* vidmem only */
81 struct list_head clear_list_entry; /* vidmem only */ 80 struct list_head clear_list_entry; /* vidmem only */
82 bool skip_wmb; 81 bool skip_wmb;
82 unsigned long flags;
83}; 83};
84 84
85struct mem_desc_sub { 85struct mem_desc_sub {
@@ -545,40 +545,55 @@ u64 gk20a_gmmu_fixed_map(struct vm_gk20a *vm,
545 bool priv, 545 bool priv,
546 enum gk20a_aperture aperture); 546 enum gk20a_aperture aperture);
547 547
548/* Flags for the below gk20a_gmmu_{alloc,alloc_map}_flags* */
549
550/*
551 * Don't create a virtual kernel mapping for the buffer but only allocate it;
552 * this may save some resources. The buffer can be mapped later explicitly.
553 */
554#define NVGPU_DMA_NO_KERNEL_MAPPING (1 << 0)
555/*
556 * Don't allow building the buffer from individual pages but require a
557 * physically contiguous block.
558 */
559#define NVGPU_DMA_FORCE_CONTIGUOUS (1 << 1)
560/*
561 * Make the mapping read-only.
562 */
563#define NVGPU_DMA_READ_ONLY (1 << 2)
564
548int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, 565int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size,
549 struct mem_desc *mem); 566 struct mem_desc *mem);
550int gk20a_gmmu_alloc_map_attr(struct vm_gk20a *vm, enum dma_attr attr, 567int gk20a_gmmu_alloc_map_flags(struct vm_gk20a *vm, unsigned long flags,
551 size_t size, struct mem_desc *mem); 568 size_t size, struct mem_desc *mem);
552 569
553int gk20a_gmmu_alloc_map_sys(struct vm_gk20a *vm, size_t size, 570int gk20a_gmmu_alloc_map_sys(struct vm_gk20a *vm, size_t size,
554 struct mem_desc *mem); 571 struct mem_desc *mem);
555int gk20a_gmmu_alloc_map_attr_sys(struct vm_gk20a *vm, enum dma_attr attr, 572int gk20a_gmmu_alloc_map_flags_sys(struct vm_gk20a *vm, unsigned long flags,
556 size_t size, struct mem_desc *mem); 573 size_t size, struct mem_desc *mem);
557 574
558int gk20a_gmmu_alloc_map_vid(struct vm_gk20a *vm, size_t size, 575int gk20a_gmmu_alloc_map_vid(struct vm_gk20a *vm, size_t size,
559 struct mem_desc *mem); 576 struct mem_desc *mem);
560int gk20a_gmmu_alloc_map_attr_vid(struct vm_gk20a *vm, enum dma_attr attr, 577int gk20a_gmmu_alloc_map_flags_vid(struct vm_gk20a *vm, unsigned long flags,
561 size_t size, struct mem_desc *mem); 578 size_t size, struct mem_desc *mem);
562 579
563void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem); 580void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem);
564 581
565int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem); 582int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem);
566int gk20a_gmmu_alloc_attr(struct gk20a *g, enum dma_attr attr, size_t size, 583int gk20a_gmmu_alloc_flags(struct gk20a *g, unsigned long flags, size_t size,
567 struct mem_desc *mem); 584 struct mem_desc *mem);
568 585
569int gk20a_gmmu_alloc_sys(struct gk20a *g, size_t size, struct mem_desc *mem); 586int gk20a_gmmu_alloc_sys(struct gk20a *g, size_t size, struct mem_desc *mem);
570int gk20a_gmmu_alloc_attr_sys(struct gk20a *g, enum dma_attr attr, size_t size, 587int gk20a_gmmu_alloc_flags_sys(struct gk20a *g, unsigned long flags,
571 struct mem_desc *mem); 588 size_t size, struct mem_desc *mem);
572 589
573int gk20a_gmmu_alloc_vid(struct gk20a *g, size_t size, struct mem_desc *mem); 590int gk20a_gmmu_alloc_vid(struct gk20a *g, size_t size, struct mem_desc *mem);
574int gk20a_gmmu_alloc_attr_vid(struct gk20a *g, enum dma_attr attr, size_t size, 591int gk20a_gmmu_alloc_flags_vid(struct gk20a *g, unsigned long flags,
575 struct mem_desc *mem); 592 size_t size, struct mem_desc *mem);
576int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr, 593int gk20a_gmmu_alloc_flags_vid_at(struct gk20a *g, unsigned long flags,
577 size_t size, struct mem_desc *mem, dma_addr_t at); 594 size_t size, struct mem_desc *mem, dma_addr_t at);
578 595
579void gk20a_gmmu_free(struct gk20a *g, struct mem_desc *mem); 596void gk20a_gmmu_free(struct gk20a *g, struct mem_desc *mem);
580void gk20a_gmmu_free_attr(struct gk20a *g, enum dma_attr attr,
581 struct mem_desc *mem);
582 597
583static inline phys_addr_t gk20a_mem_phys(struct mem_desc *mem) 598static inline phys_addr_t gk20a_mem_phys(struct mem_desc *mem)
584{ 599{