From 412c9fa30c6074ecb9e2dbd8248fbef4667faeea Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Mon, 10 Sep 2018 17:31:23 +0530 Subject: [PATCH] gpu: nvgpu: add separate unit for perfbuf Add separate unit for perfbuf in common/perf/perfbuf.c which does not need to include any h/w file. This unit will utilize HALs exported by perf_*.c units for h/w accesses. Add corresponding header file at include/nvgpu/perfbuf.h Add new HAL gops.perfbuf with below operations : gops.perfbuf.perfbuf_enable() gops.perfbuf.perfbuf_disable() Remove below debug session specific HALs gops.dbg_session_ops.perfbuffer_enable() gops.dbg_session_ops.perfbuffer_disable() Delete file gv11b/dbg_gpu_gv11b.c since it is no longer needed now as it was only including perfbuf sequence Also remove perfbuf sequences from gk20a/dbg_gpu_gk20a.c Jira NVGPU-1102 Change-Id: I57b87c9f0dcd85784f8002bc92728b6d78a68d98 Signed-off-by: Deepak Nibade Reviewed-on: https://git-master.nvidia.com/r/1819303 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/Makefile | 2 +- drivers/gpu/nvgpu/Makefile.sources | 2 +- drivers/gpu/nvgpu/common/perf/perfbuf.c | 68 +++++++++ drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c | 99 -------------- drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h | 2 - drivers/gpu/nvgpu/gm20b/hal_gm20b.c | 8 +- drivers/gpu/nvgpu/gp106/hal_gp106.c | 8 +- drivers/gpu/nvgpu/gp10b/hal_gp10b.c | 8 +- drivers/gpu/nvgpu/gv100/hal_gv100.c | 9 +- drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c | 129 ------------------ drivers/gpu/nvgpu/gv11b/hal_gv11b.c | 9 +- drivers/gpu/nvgpu/include/nvgpu/gk20a.h | 6 +- .../nvgpu/perfbuf.h} | 17 ++- drivers/gpu/nvgpu/os/linux/ioctl_dbg.c | 5 +- drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c | 7 +- drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c | 7 +- 16 files changed, 127 insertions(+), 259 deletions(-) create mode 100644 drivers/gpu/nvgpu/common/perf/perfbuf.c delete mode 100644 drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c rename drivers/gpu/nvgpu/{gv11b/dbg_gpu_gv11b.h => include/nvgpu/perfbuf.h} (80%) diff --git a/drivers/gpu/nvgpu/Makefile b/drivers/gpu/nvgpu/Makefile index 219e848b3..81ca74dd2 100644 --- a/drivers/gpu/nvgpu/Makefile +++ b/drivers/gpu/nvgpu/Makefile @@ -38,6 +38,7 @@ nvgpu-y += common/bus/bus_gk20a.o \ common/fb/fb_gv100.o \ common/perf/perf_gm20b.o \ common/perf/perf_gv11b.o \ + common/perf/perfbuf.o \ common/xve/xve_gp106.o \ common/therm/therm.o \ common/therm/therm_gm20b.o \ @@ -315,7 +316,6 @@ nvgpu-y += \ gp106/bios_gp106.o \ gv11b/gv11b.o \ gv11b/css_gr_gv11b.o \ - gv11b/dbg_gpu_gv11b.o \ gv11b/hal_gv11b.o \ gv11b/gr_gv11b.o \ gv11b/fifo_gv11b.o \ diff --git a/drivers/gpu/nvgpu/Makefile.sources b/drivers/gpu/nvgpu/Makefile.sources index 6cae10f3e..a2de6ef1c 100644 --- a/drivers/gpu/nvgpu/Makefile.sources +++ b/drivers/gpu/nvgpu/Makefile.sources @@ -77,6 +77,7 @@ srcs := os/posix/nvgpu.c \ common/therm/therm_gp106.c \ common/perf/perf_gm20b.c \ common/perf/perf_gv11b.c \ + common/perf/perfbuf.c \ common/fuse/fuse_gm20b.c \ common/fuse/fuse_gp10b.c \ common/fuse/fuse_gp106.c \ @@ -184,7 +185,6 @@ srcs := os/posix/nvgpu.c \ gp10b/gp10b.c \ gp10b/ecc_gp10b.c \ gv11b/gv11b.c \ - gv11b/dbg_gpu_gv11b.c \ gv11b/hal_gv11b.c \ gv11b/gr_gv11b.c \ gv11b/fifo_gv11b.c \ diff --git a/drivers/gpu/nvgpu/common/perf/perfbuf.c b/drivers/gpu/nvgpu/common/perf/perfbuf.c new file mode 100644 index 000000000..3f9d30573 --- /dev/null +++ b/drivers/gpu/nvgpu/common/perf/perfbuf.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +#include + +#include "gk20a/gk20a.h" + +int nvgpu_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size) +{ + struct mm_gk20a *mm = &g->mm; + int err; + + err = gk20a_busy(g); + if (err) { + nvgpu_err(g, "failed to poweron"); + return err; + } + + err = g->ops.mm.alloc_inst_block(g, &mm->perfbuf.inst_block); + if (err) { + return err; + } + + g->ops.mm.init_inst_block(&mm->perfbuf.inst_block, mm->perfbuf.vm, 0); + + g->ops.perf.membuf_reset_streaming(g); + g->ops.perf.enable_membuf(g, size, offset, &mm->perfbuf.inst_block); + + gk20a_idle(g); + + return 0; +} + +int nvgpu_perfbuf_disable_locked(struct gk20a *g) +{ + int err = gk20a_busy(g); + if (err) { + nvgpu_err(g, "failed to poweron"); + return err; + } + + g->ops.perf.membuf_reset_streaming(g); + g->ops.perf.disable_membuf(g); + + gk20a_idle(g); + + return 0; +} diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c index adc13c3dd..8ca9cbdf7 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c @@ -38,29 +38,6 @@ #include "dbg_gpu_gk20a.h" #include "regops_gk20a.h" -#include -#include - -static void gk20a_perfbuf_reset_streaming(struct gk20a *g) -{ - u32 engine_status; - u32 num_unread_bytes; - - g->ops.mc.reset(g, g->ops.mc.reset_mask(g, NVGPU_UNIT_PERFMON)); - - engine_status = gk20a_readl(g, perf_pmasys_enginestatus_r()); - WARN_ON(0u == - (engine_status & perf_pmasys_enginestatus_rbufempty_empty_f())); - - gk20a_writel(g, perf_pmasys_control_r(), - perf_pmasys_control_membuf_clear_status_doit_f()); - - num_unread_bytes = gk20a_readl(g, perf_pmasys_mem_bytes_r()); - if (num_unread_bytes != 0u) { - gk20a_writel(g, perf_pmasys_mem_bump_r(), num_unread_bytes); - } -} - /* * API to get first channel from the list of all channels * bound to the debug session @@ -341,79 +318,3 @@ void nvgpu_release_profiler_reservation(struct dbg_session_gk20a *dbg_s, g->global_profiler_reservation_held = false; } } - -int gk20a_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size) -{ - struct mm_gk20a *mm = &g->mm; - u32 virt_addr_lo; - u32 virt_addr_hi; - u32 inst_pa_page; - int err; - - err = gk20a_busy(g); - if (err) { - nvgpu_err(g, "failed to poweron"); - return err; - } - - err = g->ops.mm.alloc_inst_block(g, &mm->perfbuf.inst_block); - if (err) { - return err; - } - - g->ops.mm.init_inst_block(&mm->perfbuf.inst_block, mm->perfbuf.vm, 0); - - gk20a_perfbuf_reset_streaming(g); - - virt_addr_lo = u64_lo32(offset); - virt_addr_hi = u64_hi32(offset); - - /* address and size are aligned to 32 bytes, the lowest bits read back - * as zeros */ - gk20a_writel(g, perf_pmasys_outbase_r(), virt_addr_lo); - gk20a_writel(g, perf_pmasys_outbaseupper_r(), - perf_pmasys_outbaseupper_ptr_f(virt_addr_hi)); - gk20a_writel(g, perf_pmasys_outsize_r(), size); - - /* this field is aligned to 4K */ - inst_pa_page = nvgpu_inst_block_addr(g, &mm->perfbuf.inst_block) >> 12; - - /* A write to MEM_BLOCK triggers the block bind operation. MEM_BLOCK - * should be written last */ - gk20a_writel(g, perf_pmasys_mem_block_r(), - perf_pmasys_mem_block_base_f(inst_pa_page) | - nvgpu_aperture_mask(g, &mm->perfbuf.inst_block, - perf_pmasys_mem_block_target_sys_ncoh_f(), - perf_pmasys_mem_block_target_sys_coh_f(), - perf_pmasys_mem_block_target_lfb_f()) | - perf_pmasys_mem_block_valid_true_f()); - - gk20a_idle(g); - return 0; -} - -/* must be called with dbg_sessions_lock held */ -int gk20a_perfbuf_disable_locked(struct gk20a *g) -{ - int err = gk20a_busy(g); - if (err) { - nvgpu_err(g, "failed to poweron"); - return err; - } - - gk20a_perfbuf_reset_streaming(g); - - gk20a_writel(g, perf_pmasys_outbase_r(), 0); - gk20a_writel(g, perf_pmasys_outbaseupper_r(), - perf_pmasys_outbaseupper_ptr_f(0)); - gk20a_writel(g, perf_pmasys_outsize_r(), 0); - - gk20a_writel(g, perf_pmasys_mem_block_r(), - perf_pmasys_mem_block_base_f(0) | - perf_pmasys_mem_block_valid_false_f() | - perf_pmasys_mem_block_target_f(0)); - - gk20a_idle(g); - - return 0; -} diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h index 50002557f..d3c7a36f8 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h @@ -129,8 +129,6 @@ bool nvgpu_check_and_set_context_reservation( struct dbg_profiler_object_data *prof_obj); void nvgpu_release_profiler_reservation(struct dbg_session_gk20a *dbg_s, struct dbg_profiler_object_data *prof_obj); -int gk20a_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size); -int gk20a_perfbuf_disable_locked(struct gk20a *g); void nvgpu_dbg_session_post_event(struct dbg_session_gk20a *dbg_s); u32 nvgpu_set_powergate_locked(struct dbg_session_gk20a *dbg_s, diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c index bf5e5189c..39e96d2c3 100644 --- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "common/clock_gating/gm20b_gating_reglist.h" #include "common/bus/bus_gm20b.h" @@ -611,8 +612,6 @@ static const struct gpu_ops gm20b_ops = { nvgpu_check_and_set_context_reservation, .release_profiler_reservation = nvgpu_release_profiler_reservation, - .perfbuffer_enable = gk20a_perfbuf_enable_locked, - .perfbuffer_disable = gk20a_perfbuf_disable_locked, }, .perf = { .enable_membuf = gm20b_perf_enable_membuf, @@ -623,6 +622,10 @@ static const struct gpu_ops gm20b_ops = { .get_membuf_overflow_status = gm20b_perf_get_membuf_overflow_status, }, + .perfbuf = { + .perfbuf_enable = nvgpu_perfbuf_enable_locked, + .perfbuf_disable = nvgpu_perfbuf_disable_locked, + }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -707,6 +710,7 @@ int gm20b_init_hal(struct gk20a *g) gops->mc = gm20b_ops.mc; gops->dbg_session_ops = gm20b_ops.dbg_session_ops; gops->perf = gm20b_ops.perf; + gops->perfbuf = gm20b_ops.perfbuf; gops->debug = gm20b_ops.debug; gops->debugger = gm20b_ops.debugger; gops->bus = gm20b_ops.bus; diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c index 94bfd22a4..600f068cf 100644 --- a/drivers/gpu/nvgpu/gp106/hal_gp106.c +++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c @@ -97,6 +97,7 @@ #include #include #include +#include #include #include @@ -739,8 +740,6 @@ static const struct gpu_ops gp106_ops = { nvgpu_check_and_set_context_reservation, .release_profiler_reservation = nvgpu_release_profiler_reservation, - .perfbuffer_enable = gk20a_perfbuf_enable_locked, - .perfbuffer_disable = gk20a_perfbuf_disable_locked, }, .perf = { .enable_membuf = gm20b_perf_enable_membuf, @@ -751,6 +750,10 @@ static const struct gpu_ops gp106_ops = { .get_membuf_overflow_status = gm20b_perf_get_membuf_overflow_status, }, + .perfbuf = { + .perfbuf_enable = nvgpu_perfbuf_enable_locked, + .perfbuf_disable = nvgpu_perfbuf_disable_locked, + }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -870,6 +873,7 @@ int gp106_init_hal(struct gk20a *g) gops->debugger = gp106_ops.debugger; gops->dbg_session_ops = gp106_ops.dbg_session_ops; gops->perf = gp106_ops.perf; + gops->perfbuf = gp106_ops.perfbuf; gops->bus = gp106_ops.bus; gops->ptimer = gp106_ops.ptimer; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c index a8802fcbf..eae53db9a 100644 --- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "common/bus/bus_gk20a.h" #include "common/clock_gating/gp10b_gating_reglist.h" @@ -673,8 +674,6 @@ static const struct gpu_ops gp10b_ops = { nvgpu_check_and_set_context_reservation, .release_profiler_reservation = nvgpu_release_profiler_reservation, - .perfbuffer_enable = gk20a_perfbuf_enable_locked, - .perfbuffer_disable = gk20a_perfbuf_disable_locked, }, .perf = { .enable_membuf = gm20b_perf_enable_membuf, @@ -685,6 +684,10 @@ static const struct gpu_ops gp10b_ops = { .get_membuf_overflow_status = gm20b_perf_get_membuf_overflow_status, }, + .perfbuf = { + .perfbuf_enable = nvgpu_perfbuf_enable_locked, + .perfbuf_disable = nvgpu_perfbuf_disable_locked, + }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -768,6 +771,7 @@ int gp10b_init_hal(struct gk20a *g) gops->debugger = gp10b_ops.debugger; gops->dbg_session_ops = gp10b_ops.dbg_session_ops; gops->perf = gp10b_ops.perf; + gops->perfbuf = gp10b_ops.perfbuf; gops->bus = gp10b_ops.bus; gops->ptimer = gp10b_ops.ptimer; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/gv100/hal_gv100.c b/drivers/gpu/nvgpu/gv100/hal_gv100.c index e2d427b74..cb94759a6 100644 --- a/drivers/gpu/nvgpu/gv100/hal_gv100.c +++ b/drivers/gpu/nvgpu/gv100/hal_gv100.c @@ -83,7 +83,6 @@ #include "gp10b/pmu_gp10b.h" #include "gv11b/css_gr_gv11b.h" -#include "gv11b/dbg_gpu_gv11b.h" #include "gv11b/hal_gv11b.h" #include "gv11b/gr_gv11b.h" #include "gv11b/gv11b.h" @@ -117,6 +116,7 @@ #include #include #include +#include #include #include @@ -837,8 +837,6 @@ static const struct gpu_ops gv100_ops = { nvgpu_check_and_set_context_reservation, .release_profiler_reservation = nvgpu_release_profiler_reservation, - .perfbuffer_enable = gv11b_perfbuf_enable_locked, - .perfbuffer_disable = gv11b_perfbuf_disable_locked, }, .perf = { .enable_membuf = gv11b_perf_enable_membuf, @@ -849,6 +847,10 @@ static const struct gpu_ops gv100_ops = { .get_membuf_overflow_status = gv11b_perf_get_membuf_overflow_status, }, + .perfbuf = { + .perfbuf_enable = nvgpu_perfbuf_enable_locked, + .perfbuf_disable = nvgpu_perfbuf_disable_locked, + }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -985,6 +987,7 @@ int gv100_init_hal(struct gk20a *g) gops->debugger = gv100_ops.debugger; gops->dbg_session_ops = gv100_ops.dbg_session_ops; gops->perf = gv100_ops.perf; + gops->perfbuf = gv100_ops.perfbuf; gops->bus = gv100_ops.bus; gops->ptimer = gv100_ops.ptimer; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c b/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c deleted file mode 100644 index 2b2410eb6..000000000 --- a/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Tegra GV11B GPU Debugger/Profiler Driver - * - * Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include -#include -#include -#include -#include - -#include "gv11b/dbg_gpu_gv11b.h" -#include -#include - -static void gv11b_perfbuf_reset_streaming(struct gk20a *g) -{ - u32 engine_status; - u32 num_unread_bytes; - - g->ops.mc.reset(g, g->ops.mc.reset_mask(g, NVGPU_UNIT_PERFMON)); - - engine_status = gk20a_readl(g, perf_pmasys_enginestatus_r()); - WARN_ON(0u == - (engine_status & perf_pmasys_enginestatus_rbufempty_empty_f())); - - gk20a_writel(g, perf_pmasys_control_r(), - perf_pmasys_control_membuf_clear_status_doit_f()); - - num_unread_bytes = gk20a_readl(g, perf_pmasys_mem_bytes_r()); - if (num_unread_bytes != 0u) { - gk20a_writel(g, perf_pmasys_mem_bump_r(), num_unread_bytes); - } -} - -int gv11b_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size) -{ - struct mm_gk20a *mm = &g->mm; - u32 virt_addr_lo; - u32 virt_addr_hi; - u32 inst_pa_page; - int err; - - nvgpu_log(g, gpu_dbg_fn | gpu_dbg_gpu_dbg, " "); - err = gk20a_busy(g); - if (err) { - nvgpu_err(g, "failed to poweron"); - return err; - } - - err = gk20a_alloc_inst_block(g, &mm->perfbuf.inst_block); - if (err) { - return err; - } - - g->ops.mm.init_inst_block(&mm->perfbuf.inst_block, mm->perfbuf.vm, 0); - - gv11b_perfbuf_reset_streaming(g); - - virt_addr_lo = u64_lo32(offset); - virt_addr_hi = u64_hi32(offset); - - gk20a_writel(g, perf_pmasys_outbase_r(), virt_addr_lo); - gk20a_writel(g, perf_pmasys_outbaseupper_r(), - perf_pmasys_outbaseupper_ptr_f(virt_addr_hi)); - gk20a_writel(g, perf_pmasys_outsize_r(), size); - - /* this field is aligned to 4K */ - inst_pa_page = nvgpu_inst_block_addr(g, &mm->perfbuf.inst_block) >> 12; - - gk20a_writel(g, perf_pmasys_mem_block_r(), - perf_pmasys_mem_block_base_f(inst_pa_page) | - perf_pmasys_mem_block_valid_true_f() | - nvgpu_aperture_mask(g, &mm->perfbuf.inst_block, - perf_pmasys_mem_block_target_sys_ncoh_f(), - perf_pmasys_mem_block_target_sys_coh_f(), - perf_pmasys_mem_block_target_lfb_f())); - - gk20a_idle(g); - return 0; -} - -/* must be called with dbg_sessions_lock held */ -int gv11b_perfbuf_disable_locked(struct gk20a *g) -{ - int err; - - nvgpu_log(g, gpu_dbg_fn | gpu_dbg_gpu_dbg, " "); - err = gk20a_busy(g); - if (err) { - nvgpu_err(g, "failed to poweron"); - return err; - } - - gv11b_perfbuf_reset_streaming(g); - - gk20a_writel(g, perf_pmasys_outbase_r(), 0); - gk20a_writel(g, perf_pmasys_outbaseupper_r(), - perf_pmasys_outbaseupper_ptr_f(0)); - gk20a_writel(g, perf_pmasys_outsize_r(), 0); - - gk20a_writel(g, perf_pmasys_mem_block_r(), - perf_pmasys_mem_block_base_f(0) | - perf_pmasys_mem_block_valid_false_f() | - perf_pmasys_mem_block_target_f(0)); - - gk20a_idle(g); - - return 0; -} diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c index cd4547f35..72c3b4dc2 100644 --- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c @@ -75,7 +75,6 @@ #include "gv100/gr_gv100.h" -#include "dbg_gpu_gv11b.h" #include "hal_gv11b.h" #include "css_gr_gv11b.h" #include "gr_gv11b.h" @@ -97,6 +96,7 @@ #include #include #include +#include #include #include @@ -778,8 +778,6 @@ static const struct gpu_ops gv11b_ops = { nvgpu_check_and_set_context_reservation, .release_profiler_reservation = nvgpu_release_profiler_reservation, - .perfbuffer_enable = gv11b_perfbuf_enable_locked, - .perfbuffer_disable = gv11b_perfbuf_disable_locked, }, .perf = { .enable_membuf = gv11b_perf_enable_membuf, @@ -790,6 +788,10 @@ static const struct gpu_ops gv11b_ops = { .get_membuf_overflow_status = gv11b_perf_get_membuf_overflow_status, }, + .perfbuf = { + .perfbuf_enable = nvgpu_perfbuf_enable_locked, + .perfbuf_disable = nvgpu_perfbuf_disable_locked, + }, .bus = { .init_hw = gk20a_bus_init_hw, .isr = gk20a_bus_isr, @@ -871,6 +873,7 @@ int gv11b_init_hal(struct gk20a *g) gops->debugger = gv11b_ops.debugger; gops->dbg_session_ops = gv11b_ops.dbg_session_ops; gops->perf = gv11b_ops.perf; + gops->perfbuf = gv11b_ops.perfbuf; gops->bus = gv11b_ops.bus; gops->ptimer = gv11b_ops.ptimer; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h index f6eb7ae8f..9fdbd156d 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gk20a.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gk20a.h @@ -1196,8 +1196,6 @@ struct gpu_ops { void (*release_profiler_reservation)( struct dbg_session_gk20a *dbg_s, struct dbg_profiler_object_data *prof_obj); - int (*perfbuffer_enable)(struct gk20a *g, u64 offset, u32 size); - int (*perfbuffer_disable)(struct gk20a *g); } dbg_session_ops; struct { void (*enable_membuf)(struct gk20a *g, u32 size, @@ -1209,6 +1207,10 @@ struct gpu_ops { u32 entries, u32 entry_size); bool (*get_membuf_overflow_status)(struct gk20a *g); } perf; + struct { + int (*perfbuf_enable)(struct gk20a *g, u64 offset, u32 size); + int (*perfbuf_disable)(struct gk20a *g); + } perfbuf; u32 (*get_litter_value)(struct gk20a *g, int value); int (*chip_init_gpu_characteristics)(struct gk20a *g); diff --git a/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.h b/drivers/gpu/nvgpu/include/nvgpu/perfbuf.h similarity index 80% rename from drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.h rename to drivers/gpu/nvgpu/include/nvgpu/perfbuf.h index 88771a490..770fe480e 100644 --- a/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.h +++ b/drivers/gpu/nvgpu/include/nvgpu/perfbuf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -19,10 +19,15 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#ifndef DBG_GPU_GV11B_H -#define DBG_GPU_GV11B_H -int gv11b_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size); -int gv11b_perfbuf_disable_locked(struct gk20a *g); +#ifndef NVGPU_PERFBUF +#define NVGPU_PERFBUF -#endif /* DBG_GPU_GV11B_H */ +#include + +struct gk20a; + +int nvgpu_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size); +int nvgpu_perfbuf_disable_locked(struct gk20a *g); + +#endif diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c b/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c index 7bb170dad..510b53254 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_dbg.c @@ -1384,8 +1384,7 @@ static int gk20a_perfbuf_map(struct dbg_session_gk20a *dbg_s, goto err_unmap; } - err = g->ops.dbg_session_ops.perfbuffer_enable(g, - args->offset, virt_size); + err = g->ops.perfbuf.perfbuf_enable(g, args->offset, virt_size); if (err) goto err_unmap; @@ -1618,7 +1617,7 @@ static int gk20a_perfbuf_release_locked(struct gk20a *g, u64 offset) struct vm_gk20a *vm = mm->perfbuf.vm; int err; - err = g->ops.dbg_session_ops.perfbuffer_disable(g); + err = g->ops.perfbuf.perfbuf_disable(g); nvgpu_vm_unmap(vm, offset, NULL); nvgpu_free_inst_block(g, &mm->perfbuf.inst_block); diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c index eae0ba9e7..2f9fe6386 100644 --- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c +++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c @@ -511,8 +511,10 @@ static const struct gpu_ops vgpu_gp10b_ops = { vgpu_check_and_set_context_reservation, .release_profiler_reservation = vgpu_release_profiler_reservation, - .perfbuffer_enable = vgpu_perfbuffer_enable, - .perfbuffer_disable = vgpu_perfbuffer_disable, + }, + .perfbuf = { + .perfbuf_enable = vgpu_perfbuffer_enable, + .perfbuf_disable = vgpu_perfbuffer_disable, }, .bus = { .init_hw = NULL, @@ -593,6 +595,7 @@ int vgpu_gp10b_init_hal(struct gk20a *g) gops->debug = vgpu_gp10b_ops.debug; gops->debugger = vgpu_gp10b_ops.debugger; gops->dbg_session_ops = vgpu_gp10b_ops.dbg_session_ops; + gops->perfbuf = vgpu_gp10b_ops.perfbuf; gops->bus = vgpu_gp10b_ops.bus; gops->ptimer = vgpu_gp10b_ops.ptimer; #if defined(CONFIG_GK20A_CYCLE_STATS) diff --git a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c index de006b1e4..1b2535242 100644 --- a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c +++ b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c @@ -584,8 +584,10 @@ static const struct gpu_ops vgpu_gv11b_ops = { vgpu_check_and_set_context_reservation, .release_profiler_reservation = vgpu_release_profiler_reservation, - .perfbuffer_enable = vgpu_perfbuffer_enable, - .perfbuffer_disable = vgpu_perfbuffer_disable, + }, + .perfbuf = { + .perfbuf_enable = vgpu_perfbuffer_enable, + .perfbuf_disable = vgpu_perfbuffer_disable, }, .bus = { .init_hw = NULL, @@ -661,6 +663,7 @@ int vgpu_gv11b_init_hal(struct gk20a *g) gops->debug = vgpu_gv11b_ops.debug; gops->debugger = vgpu_gv11b_ops.debugger; gops->dbg_session_ops = vgpu_gv11b_ops.dbg_session_ops; + gops->perfbuf = vgpu_gv11b_ops.perfbuf; gops->bus = vgpu_gv11b_ops.bus; gops->ptimer = vgpu_gv11b_ops.ptimer; #if defined(CONFIG_GK20A_CYCLE_STATS)