From b0973391d051613746413f9e0d7f1e81b1f0402c Mon Sep 17 00:00:00 2001 From: Vijayakumar Date: Tue, 28 Feb 2017 13:54:20 +0530 Subject: gpu: nvgpu: add pmu trace support for dgpus 1) Trace buffer allocation now calls generic gmmu alloc/map. so for dGPUs they are allocated in vidmem and iGPUs they are allocated in sysmem 2) Use pmu surface mechanism to setup trace buffer params as dGPU binaries follow falcon memory structure to get mem surface params 3) Fix minor coverity issue by removing unnecessary overwrite of count variable in trace print function JIRA DNVGPU-217 Coverity ID 2431386 Change-Id: I2ae49a4e0450481cde2a778447c270a796681dad Signed-off-by: Vijayakumar Reviewed-on: http://git-master/r/1312404 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 68 +++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 18 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index 1322460c..7e37762c 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c @@ -216,19 +216,20 @@ static void set_pmu_cmdline_args_secure_mode_v5(struct pmu_gk20a *pmu, u32 val) static void set_pmu_cmdline_args_falctracesize_v5( struct pmu_gk20a *pmu, u32 size) { - pmu->args_v5.trace_buf.params |= (size & 0x0FFF); + /* set by surface describe */ } static void set_pmu_cmdline_args_falctracedmabase_v5(struct pmu_gk20a *pmu) { - pmu->args_v5.trace_buf.address.lo = ((u32)pmu->trace_buf.gpu_va)/0x100; - pmu->args_v5.trace_buf.address.hi = 0; + struct gk20a *g = gk20a_from_pmu(pmu); + + gk20a_pmu_surface_describe(g, &pmu->trace_buf, &pmu->args_v5.trace_buf); } static void set_pmu_cmdline_args_falctracedmaidx_v5( struct pmu_gk20a *pmu, u32 idx) { - pmu->args_v5.trace_buf.params |= (idx << 24); + /* set by surface describe */ } static u32 pmu_cmdline_size_v3(struct pmu_gk20a *pmu) @@ -294,17 +295,31 @@ static bool find_hex_in_string(char *strings, struct gk20a *g, u32 *hex_pos) static void printtrace(struct pmu_gk20a *pmu) { u32 i = 0, j = 0, k, l, m, count; - char *trace = pmu->trace_buf.cpu_va; char part_str[40], buf[0x40]; - u32 *trace1 = pmu->trace_buf.cpu_va; struct gk20a *g = gk20a_from_pmu(pmu); + void *tracebuffer; + char *trace; + u32 *trace1; + + /* allocate system memory to copy pmu trace buffer */ + tracebuffer = kzalloc(GK20A_PMU_TRACE_BUFSIZE, GFP_KERNEL); + if (tracebuffer == NULL) + return; + + /* read pmu traces into system memory buffer */ + gk20a_mem_rd_n(g, &pmu->trace_buf, + 0, tracebuffer, GK20A_PMU_TRACE_BUFSIZE); + + trace = (char *)tracebuffer; + trace1 = (u32 *)tracebuffer; + gk20a_err(dev_from_gk20a(g), "Dump pmutrace"); for (i = 0; i < GK20A_PMU_TRACE_BUFSIZE; i += 0x40) { for (j = 0; j < 0x40; j++) if (trace1[(i / 4) + j]) break; if (j == 0x40) - return; + break; count = scnprintf(buf, 0x40, "Index %x: ", trace1[(i / 4)]); l = 0; m = 0; @@ -318,9 +333,10 @@ static void printtrace(struct pmu_gk20a *pmu) l++; m += k + 2; } - count += scnprintf((buf + count), 0x40, "%s", (trace+i+20+m)); + scnprintf((buf + count), 0x40, "%s", (trace+i+20+m)); gk20a_err(dev_from_gk20a(g), "%s", buf); } + kfree(tracebuffer); } static void set_pmu_cmdline_args_falctracedmabase_v1(struct pmu_gk20a *pmu) @@ -3177,13 +3193,6 @@ static int gk20a_init_pmu_setup_sw(struct gk20a *g) goto err_free_seq; } - err = gk20a_gmmu_alloc_map_sys(vm, GK20A_PMU_TRACE_BUFSIZE, - &pmu->trace_buf); - if (err) { - gk20a_err(d, "failed to allocate trace memory\n"); - goto err_free_seq_buf; - } - ptr = (u8 *)pmu->seq_buf.cpu_va; /* TBD: remove this if ZBC save/restore is handled by PMU @@ -3194,6 +3203,13 @@ static int gk20a_init_pmu_setup_sw(struct gk20a *g) pmu->seq_buf.size = GK20A_PMU_SEQ_BUF_SIZE; + err = gk20a_gmmu_alloc_map(vm, GK20A_PMU_TRACE_BUFSIZE, + &pmu->trace_buf); + if (err) { + gk20a_err(d, "failed to allocate pmu trace buffer\n"); + goto err_free_seq_buf; + } + pmu->sw_ready = true; skip_init: @@ -5668,15 +5684,29 @@ static int falc_trace_show(struct seq_file *s, void *data) struct gk20a *g = s->private; struct pmu_gk20a *pmu = &g->pmu; u32 i = 0, j = 0, k, l, m; - char *trace = pmu->trace_buf.cpu_va; char part_str[40]; - u32 *trace1 = pmu->trace_buf.cpu_va; + void *tracebuffer; + char *trace; + u32 *trace1; + + /* allocate system memory to copy pmu trace buffer */ + tracebuffer = kzalloc(GK20A_PMU_TRACE_BUFSIZE, GFP_KERNEL); + if (tracebuffer == NULL) + return -ENOMEM; + + /* read pmu traces into system memory buffer */ + gk20a_mem_rd_n(g, &pmu->trace_buf, + 0, tracebuffer, GK20A_PMU_TRACE_BUFSIZE); + + trace = (char *)tracebuffer; + trace1 = (u32 *)tracebuffer; + for (i = 0; i < GK20A_PMU_TRACE_BUFSIZE; i += 0x40) { for (j = 0; j < 0x40; j++) if (trace1[(i / 4) + j]) break; if (j == 0x40) - return 0; + break; seq_printf(s, "Index %x: ", trace1[(i / 4)]); l = 0; m = 0; @@ -5692,6 +5722,8 @@ static int falc_trace_show(struct seq_file *s, void *data) } seq_printf(s, "%s", (trace+i+20+m)); } + + kfree(tracebuffer); return 0; } -- cgit v1.2.2