From 8c66aef3bdbfbbeb1d3c3ef3bd6b1bee3ac05411 Mon Sep 17 00:00:00 2001 From: Mahantesh Kumbar Date: Fri, 12 May 2017 11:24:31 +0530 Subject: gpu: nvgpu: reorganize PMU FB alloc/free Moved PMU FB access related code from pmu_gk20a.c to "drivers/gpu/nvgpu/common/pmu/pmu.c" file - Prepended with nvgpu_ for global functions & replaced wherever used. JIRA NVGPU-56 JIRA NVGPU-94 Change-Id: I42bfd9d216e6b35672a9738f01302d954b32b69e Signed-off-by: Mahantesh Kumbar Reviewed-on: http://git-master/r/1480551 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svccoveritychecker GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu --- drivers/gpu/nvgpu/boardobj/boardobjgrp.c | 8 +++--- drivers/gpu/nvgpu/common/pmu/pmu.c | 47 ++++++++++++++++++++++++++++++ drivers/gpu/nvgpu/common/pmu/pmu_ipc.c | 12 ++++---- drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 49 +------------------------------- drivers/gpu/nvgpu/gk20a/pmu_gk20a.h | 13 --------- drivers/gpu/nvgpu/include/nvgpu/pmu.h | 15 ++++++++++ 6 files changed, 73 insertions(+), 71 deletions(-) diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c index 51c23589..b3e1354d 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c +++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c @@ -172,7 +172,7 @@ u32 boardobjgrp_pmucmd_pmuinithandle_impl(struct gk20a *g, if (pcmd->id == BOARDOBJGRP_GRP_CMD_ID_INVALID) goto boardobjgrp_pmucmd_pmuinithandle_exit; - gk20a_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize); + nvgpu_pmu_sysmem_surface_alloc(g, sysmem_desc, pcmd->fbsize); /* we only have got sysmem later this will get copied to vidmem surface*/ pcmd->surf.vidmem_desc.size = 0; @@ -401,7 +401,7 @@ u32 boardobjgrp_pmuset_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp) * sysmem to vidmem */ if (pcmd->surf.vidmem_desc.size == 0) { - gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, + nvgpu_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, pcmd->fbsize); } nvgpu_mem_wr_n(g, &pcmd->surf.vidmem_desc, 0, pcmd->buf, pcmd->fbsize); @@ -466,7 +466,7 @@ boardobjgrp_pmugetstatus_impl(struct gk20a *g, struct boardobjgrp *pboardobjgrp, * sysmem to vidmem */ if (pcmd->surf.vidmem_desc.size == 0) { - gk20a_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, + nvgpu_pmu_vidmem_surface_alloc(g, &pcmd->surf.vidmem_desc, pcmd->fbsize); } @@ -726,7 +726,7 @@ static u32 boardobjgrp_pmucmdsend(struct gk20a *g, /* * copy vidmem information to boardobj_cmd_grp */ - gk20a_pmu_surface_describe(g, &pcmd->surf.vidmem_desc, + nvgpu_pmu_surface_describe(g, &pcmd->surf.vidmem_desc, &pgrpcmd->grp.fb); /* diff --git a/drivers/gpu/nvgpu/common/pmu/pmu.c b/drivers/gpu/nvgpu/common/pmu/pmu.c index 90db07b4..ca532049 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu.c @@ -423,3 +423,50 @@ int nvgpu_pmu_destroy(struct gk20a *g) nvgpu_log_fn(g, "done"); return 0; } + +void nvgpu_pmu_surface_describe(struct gk20a *g, struct nvgpu_mem *mem, + struct flcn_mem_desc_v0 *fb) +{ + fb->address.lo = u64_lo32(mem->gpu_va); + fb->address.hi = u64_hi32(mem->gpu_va); + fb->params = ((u32)mem->size & 0xFFFFFF); + fb->params |= (GK20A_PMU_DMAIDX_VIRT << 24); +} + +int nvgpu_pmu_vidmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, + u32 size) +{ + struct mm_gk20a *mm = &g->mm; + struct vm_gk20a *vm = mm->pmu.vm; + int err; + + err = nvgpu_dma_alloc_map_vid(vm, size, mem); + if (err) { + nvgpu_err(g, "memory allocation failed"); + return -ENOMEM; + } + + return 0; +} + +int nvgpu_pmu_sysmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, + u32 size) +{ + struct mm_gk20a *mm = &g->mm; + struct vm_gk20a *vm = mm->pmu.vm; + int err; + + err = nvgpu_dma_alloc_map_sys(vm, size, mem); + if (err) { + nvgpu_err(g, "failed to allocate memory\n"); + return -ENOMEM; + } + + return 0; +} + +void nvgpu_pmu_surface_free(struct gk20a *g, struct nvgpu_mem *mem) +{ + nvgpu_dma_free(g, mem); + memset(mem, 0, sizeof(struct nvgpu_mem)); +} diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c b/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c index 74966f2d..e45a6182 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_ipc.c @@ -552,9 +552,9 @@ int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd, goto clean_up; } - gk20a_pmu_vidmem_surface_alloc(g, seq->in_mem, + nvgpu_pmu_vidmem_surface_alloc(g, seq->in_mem, payload->in.fb_size); - gk20a_pmu_surface_describe(g, seq->in_mem, + nvgpu_pmu_surface_describe(g, seq->in_mem, (struct flcn_mem_desc_v0 *) pv->pmu_allocation_get_fb_addr(pmu, in)); @@ -595,9 +595,9 @@ int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd, err = -ENOMEM; goto clean_up; } - gk20a_pmu_vidmem_surface_alloc(g, seq->out_mem, + nvgpu_pmu_vidmem_surface_alloc(g, seq->out_mem, payload->out.fb_size); - gk20a_pmu_surface_describe(g, seq->out_mem, + nvgpu_pmu_surface_describe(g, seq->out_mem, (struct flcn_mem_desc_v0 *) pv->pmu_allocation_get_fb_addr(pmu, out)); @@ -699,7 +699,7 @@ static int pmu_response_handle(struct nvgpu_pmu *pmu, pv->pmu_allocation_get_fb_size(pmu, pv->get_pmu_seq_out_a_ptr(seq))); - gk20a_pmu_surface_free(g, seq->out_mem); + nvgpu_pmu_surface_free(g, seq->out_mem); if (seq->out_mem != seq->in_mem) nvgpu_kfree(g, seq->out_mem); else @@ -712,7 +712,7 @@ static int pmu_response_handle(struct nvgpu_pmu *pmu, pv->pmu_allocation_get_fb_size(pmu, pv->get_pmu_seq_in_a_ptr(seq))); - gk20a_pmu_surface_free(g, seq->in_mem); + nvgpu_pmu_surface_free(g, seq->in_mem); nvgpu_kfree(g, seq->in_mem); seq->in_mem = NULL; } diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index 03728378..a9457330 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c @@ -220,7 +220,7 @@ static void set_pmu_cmdline_args_falctracedmabase_v5(struct nvgpu_pmu *pmu) { struct gk20a *g = gk20a_from_pmu(pmu); - gk20a_pmu_surface_describe(g, &pmu->trace_buf, &pmu->args_v5.trace_buf); + nvgpu_pmu_surface_describe(g, &pmu->trace_buf, &pmu->args_v5.trace_buf); } static void set_pmu_cmdline_args_falctracedmaidx_v5( @@ -3789,53 +3789,6 @@ void gk20a_pmu_isr(struct gk20a *g) nvgpu_mutex_release(&pmu->isr_mutex); } -void gk20a_pmu_surface_describe(struct gk20a *g, struct nvgpu_mem *mem, - struct flcn_mem_desc_v0 *fb) -{ - fb->address.lo = u64_lo32(mem->gpu_va); - fb->address.hi = u64_hi32(mem->gpu_va); - fb->params = ((u32)mem->size & 0xFFFFFF); - fb->params |= (GK20A_PMU_DMAIDX_VIRT << 24); -} - -int gk20a_pmu_vidmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, - u32 size) -{ - struct mm_gk20a *mm = &g->mm; - struct vm_gk20a *vm = mm->pmu.vm; - int err; - - err = nvgpu_dma_alloc_map_vid(vm, size, mem); - if (err) { - nvgpu_err(g, "memory allocation failed"); - return -ENOMEM; - } - - return 0; -} - -int gk20a_pmu_sysmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, - u32 size) -{ - struct mm_gk20a *mm = &g->mm; - struct vm_gk20a *vm = mm->pmu.vm; - int err; - - err = nvgpu_dma_alloc_map_sys(vm, size, mem); - if (err) { - nvgpu_err(g, "failed to allocate memory"); - return -ENOMEM; - } - - return 0; -} - -void gk20a_pmu_surface_free(struct gk20a *g, struct nvgpu_mem *mem) -{ - nvgpu_dma_free(g, mem); - memset(mem, 0, sizeof(struct nvgpu_mem)); -} - int gk20a_pmu_pg_global_enable(struct gk20a *g, u32 enable_pg) { u32 status = 0; diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h index 1c29b380..1d2e20e6 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h @@ -57,12 +57,6 @@ struct nvgpu_firmware; #define PMU_PGENG_GR_BUFFER_IDX_ZBC (1) #define PMU_PGENG_GR_BUFFER_IDX_FECS (2) -struct pmu_surface { - struct nvgpu_mem vidmem_desc; - struct nvgpu_mem sysmem_desc; - struct flcn_mem_desc_v0 params; -}; - #define PMU_PG_IDLE_THRESHOLD_SIM 1000 #define PMU_PG_POST_POWERUP_IDLE_THRESHOLD_SIM 4000000 /* TBD: QT or else ? */ @@ -154,13 +148,6 @@ int gk20a_pmu_reset(struct gk20a *g); int pmu_idle(struct nvgpu_pmu *pmu); int pmu_enable_hw(struct nvgpu_pmu *pmu, bool enable); -void gk20a_pmu_surface_free(struct gk20a *g, struct nvgpu_mem *mem); -void gk20a_pmu_surface_describe(struct gk20a *g, struct nvgpu_mem *mem, - struct flcn_mem_desc_v0 *fb); -int gk20a_pmu_vidmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, - u32 size); -int gk20a_pmu_sysmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, - u32 size); bool nvgpu_find_hex_in_string(char *strings, struct gk20a *g, u32 *hex_pos); int nvgpu_pmu_perfmon_start_sampling(struct nvgpu_pmu *pmu); diff --git a/drivers/gpu/nvgpu/include/nvgpu/pmu.h b/drivers/gpu/nvgpu/include/nvgpu/pmu.h index a4d1e0ee..169d8b98 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/pmu.h +++ b/drivers/gpu/nvgpu/include/nvgpu/pmu.h @@ -335,6 +335,12 @@ struct nvgpu_pmu { struct nvgpu_firmware *fw; }; +struct pmu_surface { + struct nvgpu_mem vidmem_desc; + struct nvgpu_mem sysmem_desc; + struct flcn_mem_desc_v0 params; +}; + /*PG defines used by nvpgu-pmu*/ struct pmu_pg_stats_data { u32 gating_cnt; @@ -386,4 +392,13 @@ void nvgpu_pmu_setup_hw_load_zbc(struct gk20a *g); int nvgpu_pmu_get_pg_stats(struct gk20a *g, u32 pg_engine_id, struct pmu_pg_stats_data *pg_stat_data); +/* NVGPU-PMU MEM alloc */ +void nvgpu_pmu_surface_free(struct gk20a *g, struct nvgpu_mem *mem); +void nvgpu_pmu_surface_describe(struct gk20a *g, struct nvgpu_mem *mem, + struct flcn_mem_desc_v0 *fb); +int nvgpu_pmu_vidmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, + u32 size); +int nvgpu_pmu_sysmem_surface_alloc(struct gk20a *g, struct nvgpu_mem *mem, + u32 size); + #endif /* __NVGPU_PMU_H__ */ -- cgit v1.2.2