diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index a082cd92..7c51afca 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |||
@@ -41,6 +41,7 @@ | |||
41 | 41 | ||
42 | #include "gk20a.h" | 42 | #include "gk20a.h" |
43 | #include "gr_gk20a.h" | 43 | #include "gr_gk20a.h" |
44 | #include "gk20a/fecs_trace_gk20a.h" | ||
44 | #include "gr_ctx_gk20a.h" | 45 | #include "gr_ctx_gk20a.h" |
45 | #include "gr_pri_gk20a.h" | 46 | #include "gr_pri_gk20a.h" |
46 | #include "regops_gk20a.h" | 47 | #include "regops_gk20a.h" |
@@ -2499,6 +2500,10 @@ int gr_gk20a_init_ctx_state(struct gk20a *g) | |||
2499 | return ret; | 2500 | return ret; |
2500 | } | 2501 | } |
2501 | g->gr.ctx_vars.priv_access_map_size = 512 * 1024; | 2502 | g->gr.ctx_vars.priv_access_map_size = 512 * 1024; |
2503 | #ifdef CONFIG_GK20A_CTXSW_TRACE | ||
2504 | g->gr.ctx_vars.fecs_trace_buffer_size = | ||
2505 | gk20a_fecs_trace_buffer_size(g); | ||
2506 | #endif | ||
2502 | } | 2507 | } |
2503 | 2508 | ||
2504 | nvgpu_log_fn(g, "done"); | 2509 | nvgpu_log_fn(g, "done"); |
@@ -2630,6 +2635,20 @@ int gr_gk20a_alloc_global_ctx_buffers(struct gk20a *g) | |||
2630 | if (err) | 2635 | if (err) |
2631 | goto clean_up; | 2636 | goto clean_up; |
2632 | 2637 | ||
2638 | #ifdef CONFIG_GK20A_CTXSW_TRACE | ||
2639 | nvgpu_log_info(g, "fecs_trace_buffer_size : %d", | ||
2640 | gr->ctx_vars.fecs_trace_buffer_size); | ||
2641 | |||
2642 | err = nvgpu_dma_alloc_sys(g, | ||
2643 | gr->ctx_vars.fecs_trace_buffer_size, | ||
2644 | &gr->global_ctx_buffer[FECS_TRACE_BUFFER].mem); | ||
2645 | if (err) | ||
2646 | goto clean_up; | ||
2647 | |||
2648 | gr->global_ctx_buffer[FECS_TRACE_BUFFER].destroy = | ||
2649 | gk20a_gr_destroy_ctx_buffer; | ||
2650 | #endif | ||
2651 | |||
2633 | nvgpu_log_fn(g, "done"); | 2652 | nvgpu_log_fn(g, "done"); |
2634 | return 0; | 2653 | return 0; |
2635 | 2654 | ||
@@ -2769,6 +2788,21 @@ int gr_gk20a_map_global_ctx_buffers(struct gk20a *g, | |||
2769 | g_bfr_index[PRIV_ACCESS_MAP_VA] = PRIV_ACCESS_MAP; | 2788 | g_bfr_index[PRIV_ACCESS_MAP_VA] = PRIV_ACCESS_MAP; |
2770 | 2789 | ||
2771 | tsg->gr_ctx.global_ctx_buffer_mapped = true; | 2790 | tsg->gr_ctx.global_ctx_buffer_mapped = true; |
2791 | |||
2792 | #ifdef CONFIG_GK20A_CTXSW_TRACE | ||
2793 | /* FECS trace buffer */ | ||
2794 | if (nvgpu_is_enabled(g, NVGPU_FECS_TRACE_VA)) { | ||
2795 | mem = &gr->global_ctx_buffer[FECS_TRACE_BUFFER].mem; | ||
2796 | gpu_va = nvgpu_gmmu_map(ch_vm, mem, mem->size, 0, | ||
2797 | gk20a_mem_flag_none, true, mem->aperture); | ||
2798 | if (!gpu_va) | ||
2799 | goto clean_up; | ||
2800 | g_bfr_va[FECS_TRACE_BUFFER_VA] = gpu_va; | ||
2801 | g_bfr_size[FECS_TRACE_BUFFER_VA] = mem->size; | ||
2802 | g_bfr_index[FECS_TRACE_BUFFER_VA] = FECS_TRACE_BUFFER; | ||
2803 | } | ||
2804 | #endif | ||
2805 | |||
2772 | return 0; | 2806 | return 0; |
2773 | 2807 | ||
2774 | clean_up: | 2808 | clean_up: |
@@ -3050,6 +3084,14 @@ int gk20a_alloc_obj_ctx(struct channel_gk20a *c, u32 class_num, u32 flags) | |||
3050 | "fail to commit gr ctx buffer"); | 3084 | "fail to commit gr ctx buffer"); |
3051 | goto out; | 3085 | goto out; |
3052 | } | 3086 | } |
3087 | #ifdef CONFIG_GK20A_CTXSW_TRACE | ||
3088 | if (g->ops.fecs_trace.bind_channel && !c->vpr) { | ||
3089 | err = g->ops.fecs_trace.bind_channel(g, c); | ||
3090 | if (err) | ||
3091 | nvgpu_warn(g, | ||
3092 | "fail to bind channel for ctxsw trace"); | ||
3093 | } | ||
3094 | #endif | ||
3053 | } | 3095 | } |
3054 | 3096 | ||
3055 | nvgpu_log_fn(g, "done"); | 3097 | nvgpu_log_fn(g, "done"); |