diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2017-03-14 07:47:04 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-03-21 18:01:47 -0400 |
commit | 8f3875393e7a6bd0fc03afdb1fa99b7e33b71576 (patch) | |
tree | 7ee7b2da741fae7d06eeb367db2b14d8f78f0f55 /drivers/gpu/nvgpu/gk20a/mm_gk20a.h | |
parent | 79658ac5cb22cc68a2d24d964379a606086c8b39 (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.h | 39 |
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 | ||
85 | struct mem_desc_sub { | 85 | struct 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 | |||
548 | int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, | 565 | int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, |
549 | struct mem_desc *mem); | 566 | struct mem_desc *mem); |
550 | int gk20a_gmmu_alloc_map_attr(struct vm_gk20a *vm, enum dma_attr attr, | 567 | int 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 | ||
553 | int gk20a_gmmu_alloc_map_sys(struct vm_gk20a *vm, size_t size, | 570 | int gk20a_gmmu_alloc_map_sys(struct vm_gk20a *vm, size_t size, |
554 | struct mem_desc *mem); | 571 | struct mem_desc *mem); |
555 | int gk20a_gmmu_alloc_map_attr_sys(struct vm_gk20a *vm, enum dma_attr attr, | 572 | int 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 | ||
558 | int gk20a_gmmu_alloc_map_vid(struct vm_gk20a *vm, size_t size, | 575 | int gk20a_gmmu_alloc_map_vid(struct vm_gk20a *vm, size_t size, |
559 | struct mem_desc *mem); | 576 | struct mem_desc *mem); |
560 | int gk20a_gmmu_alloc_map_attr_vid(struct vm_gk20a *vm, enum dma_attr attr, | 577 | int 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 | ||
563 | void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem); | 580 | void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem); |
564 | 581 | ||
565 | int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem); | 582 | int gk20a_gmmu_alloc(struct gk20a *g, size_t size, struct mem_desc *mem); |
566 | int gk20a_gmmu_alloc_attr(struct gk20a *g, enum dma_attr attr, size_t size, | 583 | int 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 | ||
569 | int gk20a_gmmu_alloc_sys(struct gk20a *g, size_t size, struct mem_desc *mem); | 586 | int gk20a_gmmu_alloc_sys(struct gk20a *g, size_t size, struct mem_desc *mem); |
570 | int gk20a_gmmu_alloc_attr_sys(struct gk20a *g, enum dma_attr attr, size_t size, | 587 | int 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 | ||
573 | int gk20a_gmmu_alloc_vid(struct gk20a *g, size_t size, struct mem_desc *mem); | 590 | int gk20a_gmmu_alloc_vid(struct gk20a *g, size_t size, struct mem_desc *mem); |
574 | int gk20a_gmmu_alloc_attr_vid(struct gk20a *g, enum dma_attr attr, size_t size, | 591 | int gk20a_gmmu_alloc_flags_vid(struct gk20a *g, unsigned long flags, |
575 | struct mem_desc *mem); | 592 | size_t size, struct mem_desc *mem); |
576 | int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr, | 593 | int 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 | ||
579 | void gk20a_gmmu_free(struct gk20a *g, struct mem_desc *mem); | 596 | void gk20a_gmmu_free(struct gk20a *g, struct mem_desc *mem); |
580 | void gk20a_gmmu_free_attr(struct gk20a *g, enum dma_attr attr, | ||
581 | struct mem_desc *mem); | ||
582 | 597 | ||
583 | static inline phys_addr_t gk20a_mem_phys(struct mem_desc *mem) | 598 | static inline phys_addr_t gk20a_mem_phys(struct mem_desc *mem) |
584 | { | 599 | { |