From 4ccb162da7a2414c344aecc9cdf85bee9c284caf Mon Sep 17 00:00:00 2001 From: Konsta Holtta Date: Wed, 31 Dec 2014 10:37:36 +0200 Subject: gpu: nvgpu: unify instance block creation Reduce copypaste code in instance block allocation and deletion with functions purposed for that. Change-Id: I2c8ae6a317ac89e2c857dde4296cb4316b8aaafe Signed-off-by: Konsta Holtta Reviewed-on: http://git-master/r/668698 Reviewed-by: Terje Bergstrom Tested-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 40 ++------------ drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 19 ++----- drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 94 +++++++++++++++------------------ drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 3 ++ 4 files changed, 54 insertions(+), 102 deletions(-) (limited to 'drivers/gpu/nvgpu') diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index a54e3a6c..648450ae 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -341,54 +341,24 @@ void channel_gk20a_unbind(struct channel_gk20a *ch_gk20a) int channel_gk20a_alloc_inst(struct gk20a *g, struct channel_gk20a *ch) { - struct device *d = dev_from_gk20a(g); - int err = 0; - dma_addr_t iova; + int err; gk20a_dbg_fn(""); - ch->inst_block.size = ram_in_alloc_size_v(); - ch->inst_block.cpuva = dma_alloc_coherent(d, - ch->inst_block.size, - &iova, - GFP_KERNEL); - if (!ch->inst_block.cpuva) { - gk20a_err(d, "%s: memory allocation failed\n", __func__); - err = -ENOMEM; - goto clean_up; - } - - ch->inst_block.iova = iova; - ch->inst_block.cpu_pa = gk20a_get_phys_from_iova(d, - ch->inst_block.iova); - if (!ch->inst_block.cpu_pa) { - gk20a_err(d, "%s: failed to get physical address\n", __func__); - err = -ENOMEM; - goto clean_up; - } + err = gk20a_alloc_inst_block(g, &ch->inst_block); + if (err) + return err; gk20a_dbg_info("channel %d inst block physical addr: 0x%16llx", ch->hw_chid, (u64)ch->inst_block.cpu_pa); gk20a_dbg_fn("done"); return 0; - -clean_up: - gk20a_err(d, "fail"); - g->ops.fifo.free_inst(g, ch); - return err; } void channel_gk20a_free_inst(struct gk20a *g, struct channel_gk20a *ch) { - struct device *d = dev_from_gk20a(g); - - if (ch->inst_block.cpuva) - dma_free_coherent(d, ch->inst_block.size, - ch->inst_block.cpuva, ch->inst_block.iova); - ch->inst_block.cpuva = NULL; - ch->inst_block.iova = 0; - memset(&ch->inst_block, 0, sizeof(struct inst_desc)); + gk20a_free_inst_block(g, &ch->inst_block); } static int channel_gk20a_update_runlist(struct channel_gk20a *c, bool add) diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index 4b48b838..4f6c885c 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c @@ -1687,22 +1687,11 @@ static int gr_gk20a_init_ctxsw_ucode_vaspace(struct gk20a *g) u32 pde_addr_lo; u32 pde_addr_hi; u64 pde_addr; - dma_addr_t iova; - - /* Alloc mem of inst block */ - ucode_info->inst_blk_desc.size = ram_in_alloc_size_v(); - ucode_info->inst_blk_desc.cpuva = dma_alloc_coherent(d, - ucode_info->inst_blk_desc.size, - &iova, - GFP_KERNEL); - if (!ucode_info->inst_blk_desc.cpuva) { - gk20a_err(d, "failed to allocate memory\n"); - return -ENOMEM; - } + int err; - ucode_info->inst_blk_desc.iova = iova; - ucode_info->inst_blk_desc.cpu_pa = gk20a_get_phys_from_iova(d, - ucode_info->inst_blk_desc.iova); + err = gk20a_alloc_inst_block(g, &ucode_info->inst_blk_desc); + if (err) + return err; inst_ptr = ucode_info->inst_blk_desc.cpuva; diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c index 7695f147..949237b1 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c @@ -2656,6 +2656,44 @@ static void gk20a_deinit_vm(struct vm_gk20a *vm) kfree(vm->pdes.ptes[gmmu_page_size_big]); } +int gk20a_alloc_inst_block(struct gk20a *g, struct inst_desc *inst_block) +{ + struct device *dev = dev_from_gk20a(g); + dma_addr_t iova; + + inst_block->size = ram_in_alloc_size_v(); + inst_block->cpuva = dma_alloc_coherent(dev, inst_block->size, + &iova, GFP_KERNEL); + if (!inst_block->cpuva) { + gk20a_err(dev, "%s: memory allocation failed\n", __func__); + return -ENOMEM; + } + + inst_block->iova = iova; + inst_block->cpu_pa = gk20a_get_phys_from_iova(dev, inst_block->iova); + if (!inst_block->cpu_pa) { + gk20a_err(dev, "%s: failed to get phys address\n", __func__); + gk20a_free_inst_block(g, inst_block); + return -ENOMEM; + } + + memset(inst_block->cpuva, 0, inst_block->size); + + return 0; +} + +void gk20a_free_inst_block(struct gk20a *g, struct inst_desc *inst_block) +{ + struct device *dev = dev_from_gk20a(g); + + if (inst_block->cpuva) { + dma_free_coherent(dev, inst_block->size, + inst_block->cpuva, inst_block->iova); + } + + memset(inst_block, 0, sizeof(*inst_block)); +} + static int gk20a_init_bar1_vm(struct mm_gk20a *mm) { int err; @@ -2666,9 +2704,7 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) u64 pde_addr; u32 pde_addr_lo; u32 pde_addr_hi; - struct device *d = dev_from_gk20a(g); struct inst_desc *inst_block = &mm->bar1.inst_block; - dma_addr_t iova; u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; mm->bar1.aperture_size = bar1_aperture_size_mb_gk20a() << 20; @@ -2683,23 +2719,9 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) pde_addr_lo = u64_lo32(pde_addr >> ram_in_base_shift_v()); pde_addr_hi = u64_hi32(pde_addr); - /* allocate instance mem for bar1 */ - inst_block->size = ram_in_alloc_size_v(); - inst_block->cpuva = dma_alloc_coherent(d, inst_block->size, - &iova, GFP_KERNEL); - if (!inst_block->cpuva) { - gk20a_err(d, "%s: memory allocation failed\n", __func__); - err = -ENOMEM; + err = gk20a_alloc_inst_block(g, inst_block); + if (err) goto clean_up_va; - } - - inst_block->iova = iova; - inst_block->cpu_pa = gk20a_get_phys_from_iova(d, inst_block->iova); - if (!inst_block->cpu_pa) { - gk20a_err(d, "%s: failed to get phys address\n", __func__); - err = -ENOMEM; - goto clean_up_inst_block; - } inst_pa = inst_block->cpu_pa; inst_ptr = inst_block->cpuva; @@ -2707,8 +2729,6 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) gk20a_dbg_info("bar1 inst block physical phys = 0x%llx, kv = 0x%p", (u64)inst_pa, inst_ptr); - memset(inst_ptr, 0, inst_block->size); - gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), ram_in_page_dir_base_target_vid_mem_f() | ram_in_page_dir_base_vol_true_f() | @@ -2729,12 +2749,6 @@ static int gk20a_init_bar1_vm(struct mm_gk20a *mm) gk20a_dbg_info("bar1 inst block ptr: %08llx", (u64)inst_pa); return 0; -clean_up_inst_block: - if (inst_block->cpuva) - dma_free_coherent(d, inst_block->size, - inst_block->cpuva, inst_block->iova); - inst_block->cpuva = NULL; - inst_block->iova = 0; clean_up_va: gk20a_deinit_vm(vm); return err; @@ -2751,9 +2765,7 @@ static int gk20a_init_system_vm(struct mm_gk20a *mm) u64 pde_addr; u32 pde_addr_lo; u32 pde_addr_hi; - struct device *d = dev_from_gk20a(g); struct inst_desc *inst_block = &mm->pmu.inst_block; - dma_addr_t iova; u32 big_page_size = gk20a_get_platform(g->dev)->default_big_page_size; mm->pmu.aperture_size = GK20A_PMU_VA_SIZE; @@ -2769,31 +2781,15 @@ static int gk20a_init_system_vm(struct mm_gk20a *mm) pde_addr_lo = u64_lo32(pde_addr >> ram_in_base_shift_v()); pde_addr_hi = u64_hi32(pde_addr); - /* allocate instance mem for pmu */ - inst_block->size = ram_in_alloc_size_v(); - inst_block->cpuva = dma_alloc_coherent(d, inst_block->size, - &iova, GFP_KERNEL); - if (!inst_block->cpuva) { - gk20a_err(d, "%s: memory allocation failed\n", __func__); - err = -ENOMEM; + err = gk20a_alloc_inst_block(g, inst_block); + if (err) goto clean_up_va; - } - - inst_block->iova = iova; - inst_block->cpu_pa = gk20a_get_phys_from_iova(d, inst_block->iova); - if (!inst_block->cpu_pa) { - gk20a_err(d, "%s: failed to get phys address\n", __func__); - err = -ENOMEM; - goto clean_up_inst_block; - } inst_pa = inst_block->cpu_pa; inst_ptr = inst_block->cpuva; gk20a_dbg_info("pmu inst block physical addr: 0x%llx", (u64)inst_pa); - memset(inst_ptr, 0, inst_block->size); - gk20a_mem_wr32(inst_ptr, ram_in_page_dir_base_lo_w(), ram_in_page_dir_base_target_vid_mem_f() | ram_in_page_dir_base_vol_true_f() | @@ -2813,12 +2809,6 @@ static int gk20a_init_system_vm(struct mm_gk20a *mm) return 0; -clean_up_inst_block: - if (inst_block->cpuva) - dma_free_coherent(d, inst_block->size, - inst_block->cpuva, inst_block->iova); - inst_block->cpuva = NULL; - inst_block->iova = 0; clean_up_va: gk20a_deinit_vm(vm); return err; diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 6ccb6ab1..d3ee8670 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h @@ -389,6 +389,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_mm_dump_vm(struct vm_gk20a *vm, u64 va_begin, u64 va_end, char *label); -- cgit v1.2.2