summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-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