From c392a7270fd13fa0eb1e26ef0ef9f8f4479630a1 Mon Sep 17 00:00:00 2001 From: Martin Radev Date: Thu, 15 Mar 2018 19:36:59 +0200 Subject: gpu: nvgpu: Reset streaming on perfbuf_enable and perfbuf_disable Similarly to css_hw_(enable|disable)_snapshot the HWPM state should be reset on perfbuf_enable and perfbuf_disable to avoid leaking snapshot data into a freshly mapped buffer. Bug 1960846 Change-Id: I94826b209ef4b8cb6ad44d3b8667745270c6a7e1 Signed-off-by: Martin Radev Reviewed-on: https://git-master.nvidia.com/r/1676009 Reviewed-by: svc-mobile-coverity Reviewed-by: Terje Bergstrom GVS: Gerrit_Virtual_Submit Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c') diff --git a/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c b/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c index 562476ca..0dad7c2d 100644 --- a/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/dbg_gpu_gv11b.c @@ -25,6 +25,27 @@ #include #include "gk20a/gk20a.h" #include +#include + +static void gv11b_perfbuf_reset_streaming(struct gk20a *g) +{ + u32 engine_status; + u32 num_unread_bytes; + + g->ops.mc.reset(g, mc_enable_perfmon_enabled_f()); + + 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) { @@ -47,6 +68,8 @@ int gv11b_perfbuf_enable_locked(struct gk20a *g, u64 offset, u32 size) 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); @@ -82,6 +105,8 @@ int gv11b_perfbuf_disable_locked(struct gk20a *g) 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)); -- cgit v1.2.2