diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/gr_gm20b.c')
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/gr_gm20b.c | 91 |
1 files changed, 40 insertions, 51 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c index 8a3de4e8..7b69c5c8 100644 --- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * GM20B GPC MMU | 2 | * GM20B GPU GR |
3 | * | 3 | * |
4 | * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved. |
5 | * | 5 | * |
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/delay.h> /* for mdelay */ | 17 | #include <linux/delay.h> /* for mdelay */ |
18 | 18 | ||
19 | #include "gr_ops.h" | ||
19 | #include "gk20a/gk20a.h" | 20 | #include "gk20a/gk20a.h" |
20 | #include "gk20a/gr_gk20a.h" | 21 | #include "gk20a/gr_gk20a.h" |
21 | 22 | ||
@@ -28,7 +29,7 @@ | |||
28 | #include "pmu_gm20b.h" | 29 | #include "pmu_gm20b.h" |
29 | #include "acr_gm20b.h" | 30 | #include "acr_gm20b.h" |
30 | 31 | ||
31 | static void gr_gm20b_init_gpc_mmu(struct gk20a *g) | 32 | void gr_gm20b_init_gpc_mmu(struct gk20a *g) |
32 | { | 33 | { |
33 | u32 temp; | 34 | u32 temp; |
34 | 35 | ||
@@ -64,7 +65,7 @@ static void gr_gm20b_init_gpc_mmu(struct gk20a *g) | |||
64 | gk20a_readl(g, fb_fbhub_num_active_ltcs_r())); | 65 | gk20a_readl(g, fb_fbhub_num_active_ltcs_r())); |
65 | } | 66 | } |
66 | 67 | ||
67 | static void gr_gm20b_bundle_cb_defaults(struct gk20a *g) | 68 | void gr_gm20b_bundle_cb_defaults(struct gk20a *g) |
68 | { | 69 | { |
69 | struct gr_gk20a *gr = &g->gr; | 70 | struct gr_gk20a *gr = &g->gr; |
70 | 71 | ||
@@ -76,7 +77,7 @@ static void gr_gm20b_bundle_cb_defaults(struct gk20a *g) | |||
76 | gr_pd_ab_dist_cfg2_token_limit_init_v(); | 77 | gr_pd_ab_dist_cfg2_token_limit_init_v(); |
77 | } | 78 | } |
78 | 79 | ||
79 | static void gr_gm20b_cb_size_default(struct gk20a *g) | 80 | void gr_gm20b_cb_size_default(struct gk20a *g) |
80 | { | 81 | { |
81 | struct gr_gk20a *gr = &g->gr; | 82 | struct gr_gk20a *gr = &g->gr; |
82 | 83 | ||
@@ -86,7 +87,7 @@ static void gr_gm20b_cb_size_default(struct gk20a *g) | |||
86 | gr_gpc0_ppc0_cbm_alpha_cb_size_v_default_v(); | 87 | gr_gpc0_ppc0_cbm_alpha_cb_size_v_default_v(); |
87 | } | 88 | } |
88 | 89 | ||
89 | static int gr_gm20b_calc_global_ctx_buffer_size(struct gk20a *g) | 90 | int gr_gm20b_calc_global_ctx_buffer_size(struct gk20a *g) |
90 | { | 91 | { |
91 | struct gr_gk20a *gr = &g->gr; | 92 | struct gr_gk20a *gr = &g->gr; |
92 | int size; | 93 | int size; |
@@ -107,7 +108,7 @@ static int gr_gm20b_calc_global_ctx_buffer_size(struct gk20a *g) | |||
107 | return size; | 108 | return size; |
108 | } | 109 | } |
109 | 110 | ||
110 | static void gr_gk20a_commit_global_attrib_cb(struct gk20a *g, | 111 | void gr_gm20b_commit_global_attrib_cb(struct gk20a *g, |
111 | struct channel_ctx_gk20a *ch_ctx, | 112 | struct channel_ctx_gk20a *ch_ctx, |
112 | u64 addr, bool patch) | 113 | u64 addr, bool patch) |
113 | { | 114 | { |
@@ -124,7 +125,7 @@ static void gr_gk20a_commit_global_attrib_cb(struct gk20a *g, | |||
124 | gr_gpcs_tpcs_mpc_vtg_cb_global_base_addr_valid_true_f(), patch); | 125 | gr_gpcs_tpcs_mpc_vtg_cb_global_base_addr_valid_true_f(), patch); |
125 | } | 126 | } |
126 | 127 | ||
127 | static void gr_gm20b_commit_global_bundle_cb(struct gk20a *g, | 128 | void gr_gm20b_commit_global_bundle_cb(struct gk20a *g, |
128 | struct channel_ctx_gk20a *ch_ctx, | 129 | struct channel_ctx_gk20a *ch_ctx, |
129 | u64 addr, u64 size, bool patch) | 130 | u64 addr, u64 size, bool patch) |
130 | { | 131 | { |
@@ -160,7 +161,7 @@ static void gr_gm20b_commit_global_bundle_cb(struct gk20a *g, | |||
160 | 161 | ||
161 | } | 162 | } |
162 | 163 | ||
163 | static int gr_gm20b_commit_global_cb_manager(struct gk20a *g, | 164 | int gr_gm20b_commit_global_cb_manager(struct gk20a *g, |
164 | struct channel_gk20a *c, bool patch) | 165 | struct channel_gk20a *c, bool patch) |
165 | { | 166 | { |
166 | struct gr_gk20a *gr = &g->gr; | 167 | struct gr_gk20a *gr = &g->gr; |
@@ -247,7 +248,7 @@ static int gr_gm20b_commit_global_cb_manager(struct gk20a *g, | |||
247 | return 0; | 248 | return 0; |
248 | } | 249 | } |
249 | 250 | ||
250 | static void gr_gm20b_commit_global_pagepool(struct gk20a *g, | 251 | void gr_gm20b_commit_global_pagepool(struct gk20a *g, |
251 | struct channel_ctx_gk20a *ch_ctx, | 252 | struct channel_ctx_gk20a *ch_ctx, |
252 | u64 addr, u32 size, bool patch) | 253 | u64 addr, u32 size, bool patch) |
253 | { | 254 | { |
@@ -259,7 +260,7 @@ static void gr_gm20b_commit_global_pagepool(struct gk20a *g, | |||
259 | 260 | ||
260 | } | 261 | } |
261 | 262 | ||
262 | static int gr_gm20b_handle_sw_method(struct gk20a *g, u32 addr, | 263 | int gr_gm20b_handle_sw_method(struct gk20a *g, u32 addr, |
263 | u32 class_num, u32 offset, u32 data) | 264 | u32 class_num, u32 offset, u32 data) |
264 | { | 265 | { |
265 | gk20a_dbg_fn(""); | 266 | gk20a_dbg_fn(""); |
@@ -280,10 +281,10 @@ static int gr_gm20b_handle_sw_method(struct gk20a *g, u32 addr, | |||
280 | gk20a_gr_set_shader_exceptions(g, data); | 281 | gk20a_gr_set_shader_exceptions(g, data); |
281 | break; | 282 | break; |
282 | case NVB197_SET_CIRCULAR_BUFFER_SIZE: | 283 | case NVB197_SET_CIRCULAR_BUFFER_SIZE: |
283 | g->ops.gr.set_circular_buffer_size(g, data); | 284 | g->ops.gr->set_circular_buffer_size(g, data); |
284 | break; | 285 | break; |
285 | case NVB197_SET_ALPHA_CIRCULAR_BUFFER_SIZE: | 286 | case NVB197_SET_ALPHA_CIRCULAR_BUFFER_SIZE: |
286 | g->ops.gr.set_alpha_circular_buffer_size(g, data); | 287 | g->ops.gr->set_alpha_circular_buffer_size(g, data); |
287 | break; | 288 | break; |
288 | default: | 289 | default: |
289 | goto fail; | 290 | goto fail; |
@@ -295,7 +296,7 @@ fail: | |||
295 | return -EINVAL; | 296 | return -EINVAL; |
296 | } | 297 | } |
297 | 298 | ||
298 | static void gr_gm20b_set_alpha_circular_buffer_size(struct gk20a *g, u32 data) | 299 | void gr_gm20b_set_alpha_circular_buffer_size(struct gk20a *g, u32 data) |
299 | { | 300 | { |
300 | struct gr_gk20a *gr = &g->gr; | 301 | struct gr_gk20a *gr = &g->gr; |
301 | u32 gpc_index, ppc_index, stride, val; | 302 | u32 gpc_index, ppc_index, stride, val; |
@@ -395,7 +396,7 @@ void gr_gm20b_set_circular_buffer_size(struct gk20a *g, u32 data) | |||
395 | } | 396 | } |
396 | } | 397 | } |
397 | 398 | ||
398 | static void gr_gm20b_enable_hww_exceptions(struct gk20a *g) | 399 | void gr_gm20b_enable_hww_exceptions(struct gk20a *g) |
399 | { | 400 | { |
400 | gr_gk20a_enable_hww_exceptions(g); | 401 | gr_gk20a_enable_hww_exceptions(g); |
401 | 402 | ||
@@ -406,7 +407,7 @@ static void gr_gm20b_enable_hww_exceptions(struct gk20a *g) | |||
406 | gr_ds_hww_report_mask_2_sph24_err_report_f()); | 407 | gr_ds_hww_report_mask_2_sph24_err_report_f()); |
407 | } | 408 | } |
408 | 409 | ||
409 | static void gr_gm20b_set_hww_esr_report_mask(struct gk20a *g) | 410 | void gr_gm20b_set_hww_esr_report_mask(struct gk20a *g) |
410 | { | 411 | { |
411 | /* setup sm warp esr report masks */ | 412 | /* setup sm warp esr report masks */ |
412 | gk20a_writel(g, gr_gpcs_tpcs_sm_hww_warp_esr_report_mask_r(), | 413 | gk20a_writel(g, gr_gpcs_tpcs_sm_hww_warp_esr_report_mask_r(), |
@@ -439,7 +440,7 @@ static void gr_gm20b_set_hww_esr_report_mask(struct gk20a *g) | |||
439 | gr_gpcs_tpcs_sm_hww_global_esr_report_mask_multiple_warp_errors_report_f()); | 440 | gr_gpcs_tpcs_sm_hww_global_esr_report_mask_multiple_warp_errors_report_f()); |
440 | } | 441 | } |
441 | 442 | ||
442 | static bool gr_gm20b_is_valid_class(struct gk20a *g, u32 class_num) | 443 | bool gr_gm20b_is_valid_class(struct gk20a *g, u32 class_num) |
443 | { | 444 | { |
444 | bool valid = false; | 445 | bool valid = false; |
445 | 446 | ||
@@ -459,7 +460,7 @@ static bool gr_gm20b_is_valid_class(struct gk20a *g, u32 class_num) | |||
459 | return valid; | 460 | return valid; |
460 | } | 461 | } |
461 | 462 | ||
462 | static void gr_gm20b_get_sm_dsm_perf_regs(struct gk20a *g, | 463 | void gr_gm20b_get_sm_dsm_perf_regs(struct gk20a *g, |
463 | u32 *num_sm_dsm_perf_regs, | 464 | u32 *num_sm_dsm_perf_regs, |
464 | u32 **sm_dsm_perf_regs, | 465 | u32 **sm_dsm_perf_regs, |
465 | u32 *perf_register_stride) | 466 | u32 *perf_register_stride) |
@@ -470,7 +471,7 @@ static void gr_gm20b_get_sm_dsm_perf_regs(struct gk20a *g, | |||
470 | *perf_register_stride = ctxsw_prog_extended_sm_dsm_perf_counter_register_stride_v(); | 471 | *perf_register_stride = ctxsw_prog_extended_sm_dsm_perf_counter_register_stride_v(); |
471 | } | 472 | } |
472 | 473 | ||
473 | static void gr_gm20b_get_sm_dsm_perf_ctrl_regs(struct gk20a *g, | 474 | void gr_gm20b_get_sm_dsm_perf_ctrl_regs(struct gk20a *g, |
474 | u32 *num_sm_dsm_perf_regs, | 475 | u32 *num_sm_dsm_perf_regs, |
475 | u32 **sm_dsm_perf_regs, | 476 | u32 **sm_dsm_perf_regs, |
476 | u32 *ctrl_register_stride) | 477 | u32 *ctrl_register_stride) |
@@ -481,7 +482,7 @@ static void gr_gm20b_get_sm_dsm_perf_ctrl_regs(struct gk20a *g, | |||
481 | *ctrl_register_stride = ctxsw_prog_extended_sm_dsm_perf_counter_control_register_stride_v(); | 482 | *ctrl_register_stride = ctxsw_prog_extended_sm_dsm_perf_counter_control_register_stride_v(); |
482 | } | 483 | } |
483 | 484 | ||
484 | static u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index) | 485 | u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index) |
485 | { | 486 | { |
486 | u32 val; | 487 | u32 val; |
487 | struct gr_gk20a *gr = &g->gr; | 488 | struct gr_gk20a *gr = &g->gr; |
@@ -492,7 +493,7 @@ static u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index) | |||
492 | return (~val) & ((0x1 << gr->max_tpc_per_gpc_count) - 1); | 493 | return (~val) & ((0x1 << gr->max_tpc_per_gpc_count) - 1); |
493 | } | 494 | } |
494 | 495 | ||
495 | static int gr_gm20b_ctx_state_floorsweep(struct gk20a *g) | 496 | int gr_gm20b_init_fs_state(struct gk20a *g) |
496 | { | 497 | { |
497 | struct gr_gk20a *gr = &g->gr; | 498 | struct gr_gk20a *gr = &g->gr; |
498 | u32 tpc_index, gpc_index; | 499 | u32 tpc_index, gpc_index; |
@@ -595,7 +596,7 @@ static int gr_gm20b_ctx_state_floorsweep(struct gk20a *g) | |||
595 | return 0; | 596 | return 0; |
596 | } | 597 | } |
597 | 598 | ||
598 | static int gr_gm20b_load_ctxsw_ucode_segments(struct gk20a *g, u64 addr_base, | 599 | int gr_gm20b_falcon_load_ucode(struct gk20a *g, u64 addr_base, |
599 | struct gk20a_ctxsw_ucode_segments *segments, u32 reg_offset) | 600 | struct gk20a_ctxsw_ucode_segments *segments, u32 reg_offset) |
600 | { | 601 | { |
601 | gk20a_writel(g, reg_offset + gr_fecs_dmactl_r(), | 602 | gk20a_writel(g, reg_offset + gr_fecs_dmactl_r(), |
@@ -622,7 +623,7 @@ static void gr_gm20b_load_gpccs_with_bootloader(struct gk20a *g) | |||
622 | 623 | ||
623 | gr_gk20a_load_falcon_bind_instblk(g); | 624 | gr_gk20a_load_falcon_bind_instblk(g); |
624 | 625 | ||
625 | g->ops.gr.falcon_load_ucode(g, addr_base, | 626 | g->ops.gr->falcon_load_ucode(g, addr_base, |
626 | &g->ctxsw_ucode_info.gpccs, | 627 | &g->ctxsw_ucode_info.gpccs, |
627 | gr_gpcs_gpccs_falcon_hwcfg_r() - | 628 | gr_gpcs_gpccs_falcon_hwcfg_r() - |
628 | gr_fecs_falcon_hwcfg_r()); | 629 | gr_fecs_falcon_hwcfg_r()); |
@@ -648,7 +649,7 @@ static int gr_gm20b_ctx_wait_lsf_ready(struct gk20a *g, u32 timeout, u32 val) | |||
648 | return -ETIMEDOUT; | 649 | return -ETIMEDOUT; |
649 | } | 650 | } |
650 | 651 | ||
651 | static int gr_gm20b_load_ctxsw_ucode(struct gk20a *g) | 652 | int gr_gm20b_load_ctxsw_ucode(struct gk20a *g) |
652 | { | 653 | { |
653 | u32 err; | 654 | u32 err; |
654 | gk20a_dbg_fn(""); | 655 | gk20a_dbg_fn(""); |
@@ -710,42 +711,30 @@ static int gr_gm20b_load_ctxsw_ucode(struct gk20a *g) | |||
710 | } | 711 | } |
711 | #else | 712 | #else |
712 | 713 | ||
713 | static int gr_gm20b_load_ctxsw_ucode(struct gk20a *g) | 714 | int gr_gm20b_load_ctxsw_ucode(struct gk20a *g) |
714 | { | 715 | { |
715 | return -EPERM; | 716 | return -EPERM; |
716 | } | 717 | } |
717 | 718 | ||
718 | #endif | 719 | #endif |
719 | 720 | ||
721 | #include "gk20a/gr_ops_gk20a.h" | ||
722 | #include "gr_ops_gm20b.h" | ||
723 | |||
724 | static struct gpu_gr_ops gm20b_gr_ops = { | ||
725 | __set_gr_gm20b_ops(), | ||
726 | __set_gr_gk20a_op(load_ctxsw_ucode) | ||
727 | }; | ||
728 | |||
729 | static struct gpu_gr_ops gm20b_gr_privsecurity_ops = { | ||
730 | __set_gr_gm20b_ops(), | ||
731 | __set_gr_gm20b_op(load_ctxsw_ucode) | ||
732 | }; | ||
733 | |||
720 | void gm20b_init_gr(struct gpu_ops *gops) | 734 | void gm20b_init_gr(struct gpu_ops *gops) |
721 | { | 735 | { |
722 | gops->gr.init_gpc_mmu = gr_gm20b_init_gpc_mmu; | ||
723 | gops->gr.bundle_cb_defaults = gr_gm20b_bundle_cb_defaults; | ||
724 | gops->gr.cb_size_default = gr_gm20b_cb_size_default; | ||
725 | gops->gr.calc_global_ctx_buffer_size = | ||
726 | gr_gm20b_calc_global_ctx_buffer_size; | ||
727 | gops->gr.commit_global_attrib_cb = gr_gk20a_commit_global_attrib_cb; | ||
728 | gops->gr.commit_global_bundle_cb = gr_gm20b_commit_global_bundle_cb; | ||
729 | gops->gr.commit_global_cb_manager = gr_gm20b_commit_global_cb_manager; | ||
730 | gops->gr.commit_global_pagepool = gr_gm20b_commit_global_pagepool; | ||
731 | gops->gr.handle_sw_method = gr_gm20b_handle_sw_method; | ||
732 | gops->gr.set_alpha_circular_buffer_size = gr_gm20b_set_alpha_circular_buffer_size; | ||
733 | gops->gr.set_circular_buffer_size = gr_gm20b_set_circular_buffer_size; | ||
734 | gops->gr.enable_hww_exceptions = gr_gm20b_enable_hww_exceptions; | ||
735 | gops->gr.is_valid_class = gr_gm20b_is_valid_class; | ||
736 | gops->gr.get_sm_dsm_perf_regs = gr_gm20b_get_sm_dsm_perf_regs; | ||
737 | gops->gr.get_sm_dsm_perf_ctrl_regs = gr_gm20b_get_sm_dsm_perf_ctrl_regs; | ||
738 | gops->gr.init_fs_state = gr_gm20b_ctx_state_floorsweep; | ||
739 | gops->gr.set_hww_esr_report_mask = gr_gm20b_set_hww_esr_report_mask; | ||
740 | gops->gr.falcon_load_ucode = gr_gm20b_load_ctxsw_ucode_segments; | ||
741 | if (gops->privsecurity) | 736 | if (gops->privsecurity) |
742 | gops->gr.load_ctxsw_ucode = gr_gm20b_load_ctxsw_ucode; | 737 | gops->gr = &gm20b_gr_privsecurity_ops; |
743 | else | 738 | else |
744 | gops->gr.load_ctxsw_ucode = gr_gk20a_load_ctxsw_ucode; | 739 | gops->gr = &gm20b_gr_ops; |
745 | gops->gr.get_gpc_tpc_mask = gr_gm20b_get_gpc_tpc_mask; | ||
746 | gops->gr.free_channel_ctx = gk20a_free_channel_ctx; | ||
747 | gops->gr.alloc_obj_ctx = gk20a_alloc_obj_ctx; | ||
748 | gops->gr.free_obj_ctx = gk20a_free_obj_ctx; | ||
749 | gops->gr.bind_ctxsw_zcull = gr_gk20a_bind_ctxsw_zcull; | ||
750 | gops->gr.get_zcull_info = gr_gk20a_get_zcull_info; | ||
751 | } | 740 | } |