diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 68 |
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) | |||
216 | static void set_pmu_cmdline_args_falctracesize_v5( | 216 | static 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 | ||
222 | static void set_pmu_cmdline_args_falctracedmabase_v5(struct pmu_gk20a *pmu) | 222 | static 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 | ||
228 | static void set_pmu_cmdline_args_falctracedmaidx_v5( | 229 | static 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 | ||
234 | static u32 pmu_cmdline_size_v3(struct pmu_gk20a *pmu) | 235 | 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) | |||
294 | static void printtrace(struct pmu_gk20a *pmu) | 295 | static 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 | ||
326 | static void set_pmu_cmdline_args_falctracedmabase_v1(struct pmu_gk20a *pmu) | 342 | 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) | |||
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 | ||
3199 | skip_init: | 3215 | skip_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 | ||