summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2017-02-28 03:24:20 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-03-07 03:10:50 -0500
commitb0973391d051613746413f9e0d7f1e81b1f0402c (patch)
tree552c2d56c5ea2637e4502a4f70eaf6d31633bd41 /drivers
parent35f0cf0efefe4a64ee25a5b118338b15e552dcb0 (diff)
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 <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/1312404 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c68
1 files changed, 50 insertions, 18 deletions
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)
216static void set_pmu_cmdline_args_falctracesize_v5( 216static void set_pmu_cmdline_args_falctracesize_v5(
217 struct pmu_gk20a *pmu, u32 size) 217 struct pmu_gk20a *pmu, u32 size)
218{ 218{
219 pmu->args_v5.trace_buf.params |= (size & 0x0FFF); 219 /* set by surface describe */
220} 220}
221 221
222static void set_pmu_cmdline_args_falctracedmabase_v5(struct pmu_gk20a *pmu) 222static void set_pmu_cmdline_args_falctracedmabase_v5(struct pmu_gk20a *pmu)
223{ 223{
224 pmu->args_v5.trace_buf.address.lo = ((u32)pmu->trace_buf.gpu_va)/0x100; 224 struct gk20a *g = gk20a_from_pmu(pmu);
225 pmu->args_v5.trace_buf.address.hi = 0; 225
226 gk20a_pmu_surface_describe(g, &pmu->trace_buf, &pmu->args_v5.trace_buf);
226} 227}
227 228
228static void set_pmu_cmdline_args_falctracedmaidx_v5( 229static void set_pmu_cmdline_args_falctracedmaidx_v5(
229 struct pmu_gk20a *pmu, u32 idx) 230 struct pmu_gk20a *pmu, u32 idx)
230{ 231{
231 pmu->args_v5.trace_buf.params |= (idx << 24); 232 /* set by surface describe */
232} 233}
233 234
234static u32 pmu_cmdline_size_v3(struct pmu_gk20a *pmu) 235static 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)
294static void printtrace(struct pmu_gk20a *pmu) 295static void printtrace(struct pmu_gk20a *pmu)
295{ 296{
296 u32 i = 0, j = 0, k, l, m, count; 297 u32 i = 0, j = 0, k, l, m, count;
297 char *trace = pmu->trace_buf.cpu_va;
298 char part_str[40], buf[0x40]; 298 char part_str[40], buf[0x40];
299 u32 *trace1 = pmu->trace_buf.cpu_va;
300 struct gk20a *g = gk20a_from_pmu(pmu); 299 struct gk20a *g = gk20a_from_pmu(pmu);
300 void *tracebuffer;
301 char *trace;
302 u32 *trace1;
303
304 /* allocate system memory to copy pmu trace buffer */
305 tracebuffer = kzalloc(GK20A_PMU_TRACE_BUFSIZE, GFP_KERNEL);
306 if (tracebuffer == NULL)
307 return;
308
309 /* read pmu traces into system memory buffer */
310 gk20a_mem_rd_n(g, &pmu->trace_buf,
311 0, tracebuffer, GK20A_PMU_TRACE_BUFSIZE);
312
313 trace = (char *)tracebuffer;
314 trace1 = (u32 *)tracebuffer;
315
301 gk20a_err(dev_from_gk20a(g), "Dump pmutrace"); 316 gk20a_err(dev_from_gk20a(g), "Dump pmutrace");
302 for (i = 0; i < GK20A_PMU_TRACE_BUFSIZE; i += 0x40) { 317 for (i = 0; i < GK20A_PMU_TRACE_BUFSIZE; i += 0x40) {
303 for (j = 0; j < 0x40; j++) 318 for (j = 0; j < 0x40; j++)
304 if (trace1[(i / 4) + j]) 319 if (trace1[(i / 4) + j])
305 break; 320 break;
306 if (j == 0x40) 321 if (j == 0x40)
307 return; 322 break;
308 count = scnprintf(buf, 0x40, "Index %x: ", trace1[(i / 4)]); 323 count = scnprintf(buf, 0x40, "Index %x: ", trace1[(i / 4)]);
309 l = 0; 324 l = 0;
310 m = 0; 325 m = 0;
@@ -318,9 +333,10 @@ static void printtrace(struct pmu_gk20a *pmu)
318 l++; 333 l++;
319 m += k + 2; 334 m += k + 2;
320 } 335 }
321 count += scnprintf((buf + count), 0x40, "%s", (trace+i+20+m)); 336 scnprintf((buf + count), 0x40, "%s", (trace+i+20+m));
322 gk20a_err(dev_from_gk20a(g), "%s", buf); 337 gk20a_err(dev_from_gk20a(g), "%s", buf);
323 } 338 }
339 kfree(tracebuffer);
324} 340}
325 341
326static void set_pmu_cmdline_args_falctracedmabase_v1(struct pmu_gk20a *pmu) 342static 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)
3177 goto err_free_seq; 3193 goto err_free_seq;
3178 } 3194 }
3179 3195
3180 err = gk20a_gmmu_alloc_map_sys(vm, GK20A_PMU_TRACE_BUFSIZE,
3181 &pmu->trace_buf);
3182 if (err) {
3183 gk20a_err(d, "failed to allocate trace memory\n");
3184 goto err_free_seq_buf;
3185 }
3186
3187 ptr = (u8 *)pmu->seq_buf.cpu_va; 3196 ptr = (u8 *)pmu->seq_buf.cpu_va;
3188 3197
3189 /* TBD: remove this if ZBC save/restore is handled by PMU 3198 /* 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)
3194 3203
3195 pmu->seq_buf.size = GK20A_PMU_SEQ_BUF_SIZE; 3204 pmu->seq_buf.size = GK20A_PMU_SEQ_BUF_SIZE;
3196 3205
3206 err = gk20a_gmmu_alloc_map(vm, GK20A_PMU_TRACE_BUFSIZE,
3207 &pmu->trace_buf);
3208 if (err) {
3209 gk20a_err(d, "failed to allocate pmu trace buffer\n");
3210 goto err_free_seq_buf;
3211 }
3212
3197 pmu->sw_ready = true; 3213 pmu->sw_ready = true;
3198 3214
3199skip_init: 3215skip_init:
@@ -5668,15 +5684,29 @@ static int falc_trace_show(struct seq_file *s, void *data)
5668 struct gk20a *g = s->private; 5684 struct gk20a *g = s->private;
5669 struct pmu_gk20a *pmu = &g->pmu; 5685 struct pmu_gk20a *pmu = &g->pmu;
5670 u32 i = 0, j = 0, k, l, m; 5686 u32 i = 0, j = 0, k, l, m;
5671 char *trace = pmu->trace_buf.cpu_va;
5672 char part_str[40]; 5687 char part_str[40];
5673 u32 *trace1 = pmu->trace_buf.cpu_va; 5688 void *tracebuffer;
5689 char *trace;
5690 u32 *trace1;
5691
5692 /* allocate system memory to copy pmu trace buffer */
5693 tracebuffer = kzalloc(GK20A_PMU_TRACE_BUFSIZE, GFP_KERNEL);
5694 if (tracebuffer == NULL)
5695 return -ENOMEM;
5696
5697 /* read pmu traces into system memory buffer */
5698 gk20a_mem_rd_n(g, &pmu->trace_buf,
5699 0, tracebuffer, GK20A_PMU_TRACE_BUFSIZE);
5700
5701 trace = (char *)tracebuffer;
5702 trace1 = (u32 *)tracebuffer;
5703
5674 for (i = 0; i < GK20A_PMU_TRACE_BUFSIZE; i += 0x40) { 5704 for (i = 0; i < GK20A_PMU_TRACE_BUFSIZE; i += 0x40) {
5675 for (j = 0; j < 0x40; j++) 5705 for (j = 0; j < 0x40; j++)
5676 if (trace1[(i / 4) + j]) 5706 if (trace1[(i / 4) + j])
5677 break; 5707 break;
5678 if (j == 0x40) 5708 if (j == 0x40)
5679 return 0; 5709 break;
5680 seq_printf(s, "Index %x: ", trace1[(i / 4)]); 5710 seq_printf(s, "Index %x: ", trace1[(i / 4)]);
5681 l = 0; 5711 l = 0;
5682 m = 0; 5712 m = 0;
@@ -5692,6 +5722,8 @@ static int falc_trace_show(struct seq_file *s, void *data)
5692 } 5722 }
5693 seq_printf(s, "%s", (trace+i+20+m)); 5723 seq_printf(s, "%s", (trace+i+20+m));
5694 } 5724 }
5725
5726 kfree(tracebuffer);
5695 return 0; 5727 return 0;
5696} 5728}
5697 5729