diff options
author | Vijayakumar <vsubbu@nvidia.com> | 2017-02-28 03:24:20 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-03-07 03:10:50 -0500 |
commit | b0973391d051613746413f9e0d7f1e81b1f0402c (patch) | |
tree | 552c2d56c5ea2637e4502a4f70eaf6d31633bd41 /drivers/gpu/nvgpu | |
parent | 35f0cf0efefe4a64ee25a5b118338b15e552dcb0 (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/gpu/nvgpu')
-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 | ||