From 7290a6cbd5d03145d6f1ca4c3eacba40f6d4f93c Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Thu, 26 Feb 2015 14:37:43 -0800 Subject: gpu: nvgpu: Implement common allocator and mem_desc Introduce mem_desc, which holds all information needed for a buffer. Implement helper functions for allocation and freeing that use this data type. Change-Id: I82c88595d058d4fb8c5c5fbf19d13269e48e422f Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/712699 --- drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 79 +++++++++++++++----------------------- 1 file changed, 30 insertions(+), 49 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.h') diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 54028e73..ca7fef01 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h @@ -46,7 +46,7 @@ struct mem_desc { void *cpu_va; - dma_addr_t iova; + struct sg_table *sgt; size_t size; u64 gpu_va; }; @@ -70,40 +70,6 @@ struct gpfifo_desc { u64 gpu_va; }; -struct mmu_desc { - void *cpuva; - u64 iova; - size_t size; -}; - -struct inst_desc { - u64 iova; - void *cpuva; - phys_addr_t cpu_pa; - size_t size; -}; - -struct surface_mem_desc { - u64 iova; - void *cpuva; - struct sg_table *sgt; - size_t size; -}; - -struct userd_desc { - struct sg_table *sgt; - u64 iova; - void *cpuva; - size_t size; - u64 gpu_va; -}; - -struct runlist_mem_desc { - u64 iova; - void *cpuva; - size_t size; -}; - struct patch_desc { struct page **pages; u64 iova; @@ -113,13 +79,6 @@ struct patch_desc { u32 data_count; }; -struct pmu_mem_desc { - void *cpuva; - u64 iova; - u64 pmu_va; - size_t size; -}; - struct priv_cmd_queue_mem_desc { u64 base_iova; u32 *base_cpuva; @@ -336,24 +295,24 @@ struct mm_gk20a { struct { u32 aperture_size; struct vm_gk20a vm; - struct inst_desc inst_block; + struct mem_desc inst_block; } bar1; struct { u32 aperture_size; struct vm_gk20a vm; - struct inst_desc inst_block; + struct mem_desc inst_block; } bar2; struct { u32 aperture_size; struct vm_gk20a vm; - struct inst_desc inst_block; + struct mem_desc inst_block; } pmu; struct { /* using pmu vm currently */ - struct inst_desc inst_block; + struct mem_desc inst_block; } hwpm; @@ -406,9 +365,9 @@ static inline int max_vaddr_bits_gk20a(void) #define bar1_instance_block_shift_gk20a() bus_bar1_block_ptr_shift_v() #endif -int gk20a_alloc_inst_block(struct gk20a *g, struct inst_desc *inst_block); -void gk20a_free_inst_block(struct gk20a *g, struct inst_desc *inst_block); -void gk20a_init_inst_block(struct inst_desc *inst_block, struct vm_gk20a *vm, +int gk20a_alloc_inst_block(struct gk20a *g, struct mem_desc *inst_block); +void gk20a_free_inst_block(struct gk20a *g, struct mem_desc *inst_block); +void gk20a_init_inst_block(struct mem_desc *inst_block, struct vm_gk20a *vm, u32 big_page_size); void gk20a_mm_dump_vm(struct vm_gk20a *vm, @@ -448,9 +407,31 @@ int gk20a_gmmu_alloc_map(struct vm_gk20a *vm, size_t size, struct mem_desc *mem); +int gk20a_gmmu_alloc_map_attr(struct vm_gk20a *vm, + enum dma_attr attr, + size_t size, + struct mem_desc *mem); + void gk20a_gmmu_unmap_free(struct vm_gk20a *vm, struct mem_desc *mem); +int gk20a_gmmu_alloc(struct gk20a *g, + size_t size, + struct mem_desc *mem); + +int gk20a_gmmu_alloc_attr(struct gk20a *g, + enum dma_attr attr, + size_t size, + struct mem_desc *mem); + +void gk20a_gmmu_free(struct gk20a *g, + struct mem_desc *mem); + +static inline phys_addr_t gk20a_mem_phys(struct mem_desc *mem) +{ + return sg_phys(mem->sgt->sgl); +} + u64 gk20a_locked_gmmu_map(struct vm_gk20a *vm, u64 map_offset, struct sg_table *sgt, -- cgit v1.2.2