summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
authorSupriya <ssharatkumar@nvidia.com>2014-07-24 04:44:32 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:36 -0400
commite34b945834c4fa0ca7aa50224e8d77fafa5fe7e3 (patch)
treeefaf46994b3fa27a320392b2663e9f9e44a12744 /drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
parent44b9d5fdb090444534914a5c492a92d7ecefb0e7 (diff)
nvgpu: new gpmu ucode compatibility
For LS PMU new ucode needs to be used. Ucode has interface header file changes too. This patch also has fixes for pmu dmem copy failure Bug 1509680 Change-Id: I8c7018f889a82104dea590751e650e53e5524a54 Signed-off-by: Supriya <ssharatkumar@nvidia.com> Reviewed-on: http://git-master/r/441734 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c231
1 files changed, 221 insertions, 10 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index c23d83cf..b147c66f 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -44,6 +44,76 @@ static void ap_callback_init_and_enable_ctrl(
44 struct gk20a *g, struct pmu_msg *msg, 44 struct gk20a *g, struct pmu_msg *msg,
45 void *param, u32 seq_desc, u32 status); 45 void *param, u32 seq_desc, u32 status);
46 46
47static u32 pmu_perfmon_cntr_sz_v0(struct pmu_gk20a *pmu)
48{
49 return sizeof(struct pmu_perfmon_counter_v0);
50}
51
52static u32 pmu_perfmon_cntr_sz_v2(struct pmu_gk20a *pmu)
53{
54 return sizeof(struct pmu_perfmon_counter_v2);
55}
56
57static void *get_perfmon_cntr_ptr_v2(struct pmu_gk20a *pmu)
58{
59 return (void *)(&pmu->perfmon_counter_v2);
60}
61
62static void *get_perfmon_cntr_ptr_v0(struct pmu_gk20a *pmu)
63{
64 return (void *)(&pmu->perfmon_counter_v0);
65}
66
67static void set_perfmon_cntr_ut_v2(struct pmu_gk20a *pmu, u16 ut)
68{
69 pmu->perfmon_counter_v2.upper_threshold = ut;
70}
71
72static void set_perfmon_cntr_ut_v0(struct pmu_gk20a *pmu, u16 ut)
73{
74 pmu->perfmon_counter_v0.upper_threshold = ut;
75}
76
77static void set_perfmon_cntr_lt_v2(struct pmu_gk20a *pmu, u16 lt)
78{
79 pmu->perfmon_counter_v2.lower_threshold = lt;
80}
81
82static void set_perfmon_cntr_lt_v0(struct pmu_gk20a *pmu, u16 lt)
83{
84 pmu->perfmon_counter_v0.lower_threshold = lt;
85}
86
87static void set_perfmon_cntr_valid_v2(struct pmu_gk20a *pmu, u8 valid)
88{
89 pmu->perfmon_counter_v2.valid = valid;
90}
91
92static void set_perfmon_cntr_valid_v0(struct pmu_gk20a *pmu, u8 valid)
93{
94 pmu->perfmon_counter_v0.valid = valid;
95}
96
97static void set_perfmon_cntr_index_v2(struct pmu_gk20a *pmu, u8 index)
98{
99 pmu->perfmon_counter_v2.index = index;
100}
101
102static void set_perfmon_cntr_index_v0(struct pmu_gk20a *pmu, u8 index)
103{
104 pmu->perfmon_counter_v0.index = index;
105}
106
107static void set_perfmon_cntr_group_id_v2(struct pmu_gk20a *pmu, u8 gid)
108{
109 pmu->perfmon_counter_v2.group_id = gid;
110}
111
112static void set_perfmon_cntr_group_id_v0(struct pmu_gk20a *pmu, u8 gid)
113{
114 pmu->perfmon_counter_v0.group_id = gid;
115}
116
47static u32 pmu_cmdline_size_v0(struct pmu_gk20a *pmu) 117static u32 pmu_cmdline_size_v0(struct pmu_gk20a *pmu)
48{ 118{
49 return sizeof(struct pmu_cmdline_args_v0); 119 return sizeof(struct pmu_cmdline_args_v0);
@@ -54,6 +124,37 @@ static u32 pmu_cmdline_size_v1(struct pmu_gk20a *pmu)
54 return sizeof(struct pmu_cmdline_args_v1); 124 return sizeof(struct pmu_cmdline_args_v1);
55} 125}
56 126
127static u32 pmu_cmdline_size_v2(struct pmu_gk20a *pmu)
128{
129 return sizeof(struct pmu_cmdline_args_v2);
130}
131
132static void set_pmu_cmdline_args_cpufreq_v2(struct pmu_gk20a *pmu, u32 freq)
133{
134 pmu->args_v2.cpu_freq_hz = freq;
135}
136static void set_pmu_cmdline_args_secure_mode_v2(struct pmu_gk20a *pmu, u32 val)
137{
138 pmu->args_v2.secure_mode = val;
139}
140
141static void set_pmu_cmdline_args_falctracesize_v2(
142 struct pmu_gk20a *pmu, u32 size)
143{
144 pmu->args_v2.falc_trace_size = size;
145}
146
147static void set_pmu_cmdline_args_falctracedmabase_v2(struct pmu_gk20a *pmu)
148{
149 pmu->args_v2.falc_trace_dma_base = ((u32)pmu->trace_buf.pmu_va)/0x100;
150}
151
152static void set_pmu_cmdline_args_falctracedmaidx_v2(
153 struct pmu_gk20a *pmu, u32 idx)
154{
155 pmu->args_v2.falc_trace_dma_idx = idx;
156}
157
57static void set_pmu_cmdline_args_cpufreq_v1(struct pmu_gk20a *pmu, u32 freq) 158static void set_pmu_cmdline_args_cpufreq_v1(struct pmu_gk20a *pmu, u32 freq)
58{ 159{
59 pmu->args_v1.cpu_freq_hz = freq; 160 pmu->args_v1.cpu_freq_hz = freq;
@@ -69,6 +170,7 @@ static void set_pmu_cmdline_args_falctracesize_v1(
69 pmu->args_v1.falc_trace_size = size; 170 pmu->args_v1.falc_trace_size = size;
70} 171}
71 172
173
72void printtrace(struct pmu_gk20a *pmu) 174void printtrace(struct pmu_gk20a *pmu)
73{ 175{
74 u32 i = 0, j = 0; 176 u32 i = 0, j = 0;
@@ -108,6 +210,11 @@ static void set_pmu_cmdline_args_cpufreq_v0(struct pmu_gk20a *pmu, u32 freq)
108 pmu->args_v0.cpu_freq_hz = freq; 210 pmu->args_v0.cpu_freq_hz = freq;
109} 211}
110 212
213static void *get_pmu_cmdline_args_ptr_v2(struct pmu_gk20a *pmu)
214{
215 return (void *)(&pmu->args_v2);
216}
217
111static void *get_pmu_cmdline_args_ptr_v1(struct pmu_gk20a *pmu) 218static void *get_pmu_cmdline_args_ptr_v1(struct pmu_gk20a *pmu)
112{ 219{
113 return (void *)(&pmu->args_v1); 220 return (void *)(&pmu->args_v1);
@@ -525,6 +632,7 @@ static void *get_pmu_sequence_out_alloc_ptr_v0(struct pmu_sequence *seq)
525int gk20a_init_pmu(struct pmu_gk20a *pmu) 632int gk20a_init_pmu(struct pmu_gk20a *pmu)
526{ 633{
527 struct gk20a *g = gk20a_from_pmu(pmu); 634 struct gk20a *g = gk20a_from_pmu(pmu);
635 struct pmu_v *pv = &g->ops.pmu_ver;
528 636
529 mutex_init(&pmu->elpg_mutex); 637 mutex_init(&pmu->elpg_mutex);
530 mutex_init(&pmu->isr_mutex); 638 mutex_init(&pmu->isr_mutex);
@@ -532,17 +640,107 @@ int gk20a_init_pmu(struct pmu_gk20a *pmu)
532 mutex_init(&pmu->pmu_copy_lock); 640 mutex_init(&pmu->pmu_copy_lock);
533 mutex_init(&pmu->pmu_seq_lock); 641 mutex_init(&pmu->pmu_seq_lock);
534 642
535 pmu->perfmon_counter.index = 3; /* GR & CE2 */
536 pmu->perfmon_counter.group_id = PMU_DOMAIN_GROUP_PSTATE;
537
538 pmu->remove_support = gk20a_remove_pmu_support; 643 pmu->remove_support = gk20a_remove_pmu_support;
539 644
540 switch (pmu->desc->app_version) { 645 switch (pmu->desc->app_version) {
646 case APP_VERSION_GM20B_2:
647 g->ops.pmu_ver.get_perfmon_cntr_ptr = get_perfmon_cntr_ptr_v2;
648 g->ops.pmu_ver.set_perfmon_cntr_ut = set_perfmon_cntr_ut_v2;
649 g->ops.pmu_ver.set_perfmon_cntr_lt = set_perfmon_cntr_lt_v2;
650 g->ops.pmu_ver.set_perfmon_cntr_valid =
651 set_perfmon_cntr_valid_v2;
652 g->ops.pmu_ver.set_perfmon_cntr_index =
653 set_perfmon_cntr_index_v2;
654 g->ops.pmu_ver.set_perfmon_cntr_group_id =
655 set_perfmon_cntr_group_id_v2;
656 g->ops.pmu_ver.get_perfmon_cntr_sz = pmu_perfmon_cntr_sz_v2;
657 g->ops.pmu_ver.cmd_id_zbc_table_update = 16;
658 g->ops.pmu_ver.get_pmu_cmdline_args_size =
659 pmu_cmdline_size_v2;
660 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
661 set_pmu_cmdline_args_cpufreq_v2;
662 g->ops.pmu_ver.set_pmu_cmdline_args_secure_mode =
663 set_pmu_cmdline_args_secure_mode_v2;
664 g->ops.pmu_ver.set_pmu_cmdline_args_trace_size =
665 set_pmu_cmdline_args_falctracesize_v2;
666 g->ops.pmu_ver.set_pmu_cmdline_args_trace_dma_base =
667 set_pmu_cmdline_args_falctracedmabase_v2;
668 g->ops.pmu_ver.set_pmu_cmdline_args_trace_dma_idx =
669 set_pmu_cmdline_args_falctracedmaidx_v2;
670 g->ops.pmu_ver.get_pmu_cmdline_args_ptr =
671 get_pmu_cmdline_args_ptr_v2;
672 g->ops.pmu_ver.get_pmu_allocation_struct_size =
673 get_pmu_allocation_size_v1;
674 g->ops.pmu_ver.set_pmu_allocation_ptr =
675 set_pmu_allocation_ptr_v1;
676 g->ops.pmu_ver.pmu_allocation_set_dmem_size =
677 pmu_allocation_set_dmem_size_v1;
678 g->ops.pmu_ver.pmu_allocation_get_dmem_size =
679 pmu_allocation_get_dmem_size_v1;
680 g->ops.pmu_ver.pmu_allocation_get_dmem_offset =
681 pmu_allocation_get_dmem_offset_v1;
682 g->ops.pmu_ver.pmu_allocation_get_dmem_offset_addr =
683 pmu_allocation_get_dmem_offset_addr_v1;
684 g->ops.pmu_ver.pmu_allocation_set_dmem_offset =
685 pmu_allocation_set_dmem_offset_v1;
686 g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params =
687 get_pmu_init_msg_pmu_queue_params_v1;
688 g->ops.pmu_ver.get_pmu_msg_pmu_init_msg_ptr =
689 get_pmu_msg_pmu_init_msg_ptr_v1;
690 g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_off =
691 get_pmu_init_msg_pmu_sw_mg_off_v1;
692 g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_size =
693 get_pmu_init_msg_pmu_sw_mg_size_v1;
694 g->ops.pmu_ver.get_pmu_perfmon_cmd_start_size =
695 get_pmu_perfmon_cmd_start_size_v1;
696 g->ops.pmu_ver.get_perfmon_cmd_start_offsetofvar =
697 get_perfmon_cmd_start_offsetofvar_v1;
698 g->ops.pmu_ver.perfmon_start_set_cmd_type =
699 perfmon_start_set_cmd_type_v1;
700 g->ops.pmu_ver.perfmon_start_set_group_id =
701 perfmon_start_set_group_id_v1;
702 g->ops.pmu_ver.perfmon_start_set_state_id =
703 perfmon_start_set_state_id_v1;
704 g->ops.pmu_ver.perfmon_start_set_flags =
705 perfmon_start_set_flags_v1;
706 g->ops.pmu_ver.perfmon_start_get_flags =
707 perfmon_start_get_flags_v1;
708 g->ops.pmu_ver.get_pmu_perfmon_cmd_init_size =
709 get_pmu_perfmon_cmd_init_size_v1;
710 g->ops.pmu_ver.get_perfmon_cmd_init_offsetofvar =
711 get_perfmon_cmd_init_offsetofvar_v1;
712 g->ops.pmu_ver.perfmon_cmd_init_set_sample_buffer =
713 perfmon_cmd_init_set_sample_buffer_v1;
714 g->ops.pmu_ver.perfmon_cmd_init_set_dec_cnt =
715 perfmon_cmd_init_set_dec_cnt_v1;
716 g->ops.pmu_ver.perfmon_cmd_init_set_base_cnt_id =
717 perfmon_cmd_init_set_base_cnt_id_v1;
718 g->ops.pmu_ver.perfmon_cmd_init_set_samp_period_us =
719 perfmon_cmd_init_set_samp_period_us_v1;
720 g->ops.pmu_ver.perfmon_cmd_init_set_num_cnt =
721 perfmon_cmd_init_set_num_cnt_v1;
722 g->ops.pmu_ver.perfmon_cmd_init_set_mov_avg =
723 perfmon_cmd_init_set_mov_avg_v1;
724 g->ops.pmu_ver.get_pmu_seq_in_a_ptr =
725 get_pmu_sequence_in_alloc_ptr_v1;
726 g->ops.pmu_ver.get_pmu_seq_out_a_ptr =
727 get_pmu_sequence_out_alloc_ptr_v1;
728 break;
541 case APP_VERSION_GM20B_1: 729 case APP_VERSION_GM20B_1:
542 case APP_VERSION_GM20B: 730 case APP_VERSION_GM20B:
543 case APP_VERSION_1: 731 case APP_VERSION_1:
544 case APP_VERSION_2: 732 case APP_VERSION_2:
545 g->ops.pmu_ver.cmd_id_zbc_table_update = 16; 733 g->ops.pmu_ver.cmd_id_zbc_table_update = 16;
734 g->ops.pmu_ver.get_perfmon_cntr_ptr = get_perfmon_cntr_ptr_v0;
735 g->ops.pmu_ver.set_perfmon_cntr_ut = set_perfmon_cntr_ut_v0;
736 g->ops.pmu_ver.set_perfmon_cntr_lt = set_perfmon_cntr_lt_v0;
737 g->ops.pmu_ver.set_perfmon_cntr_valid =
738 set_perfmon_cntr_valid_v0;
739 g->ops.pmu_ver.set_perfmon_cntr_index =
740 set_perfmon_cntr_index_v0;
741 g->ops.pmu_ver.set_perfmon_cntr_group_id =
742 set_perfmon_cntr_group_id_v0;
743 g->ops.pmu_ver.get_perfmon_cntr_sz = pmu_perfmon_cntr_sz_v0;
546 g->ops.pmu_ver.get_pmu_cmdline_args_size = 744 g->ops.pmu_ver.get_pmu_cmdline_args_size =
547 pmu_cmdline_size_v1; 745 pmu_cmdline_size_v1;
548 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq = 746 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
@@ -616,6 +814,16 @@ int gk20a_init_pmu(struct pmu_gk20a *pmu)
616 break; 814 break;
617 case APP_VERSION_0: 815 case APP_VERSION_0:
618 g->ops.pmu_ver.cmd_id_zbc_table_update = 14; 816 g->ops.pmu_ver.cmd_id_zbc_table_update = 14;
817 g->ops.pmu_ver.get_perfmon_cntr_ptr = get_perfmon_cntr_ptr_v0;
818 g->ops.pmu_ver.set_perfmon_cntr_ut = set_perfmon_cntr_ut_v0;
819 g->ops.pmu_ver.set_perfmon_cntr_lt = set_perfmon_cntr_lt_v0;
820 g->ops.pmu_ver.set_perfmon_cntr_valid =
821 set_perfmon_cntr_valid_v0;
822 g->ops.pmu_ver.set_perfmon_cntr_index =
823 set_perfmon_cntr_index_v0;
824 g->ops.pmu_ver.set_perfmon_cntr_group_id =
825 set_perfmon_cntr_group_id_v0;
826 g->ops.pmu_ver.get_perfmon_cntr_sz = pmu_perfmon_cntr_sz_v0;
619 g->ops.pmu_ver.get_pmu_cmdline_args_size = 827 g->ops.pmu_ver.get_pmu_cmdline_args_size =
620 pmu_cmdline_size_v0; 828 pmu_cmdline_size_v0;
621 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq = 829 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
@@ -688,6 +896,9 @@ int gk20a_init_pmu(struct pmu_gk20a *pmu)
688 return -EINVAL; 896 return -EINVAL;
689 break; 897 break;
690 } 898 }
899 pv->set_perfmon_cntr_index(pmu, 3); /* GR & CE2 */
900 pv->set_perfmon_cntr_group_id(pmu, PMU_DOMAIN_GROUP_PSTATE);
901
691 return 0; 902 return 0;
692} 903}
693 904
@@ -2336,8 +2547,8 @@ static int pmu_init_perfmon(struct pmu_gk20a *pmu)
2336 pv->perfmon_cmd_init_set_mov_avg(&cmd.cmd.perfmon, 17); 2547 pv->perfmon_cmd_init_set_mov_avg(&cmd.cmd.perfmon, 17);
2337 2548
2338 memset(&payload, 0, sizeof(struct pmu_payload)); 2549 memset(&payload, 0, sizeof(struct pmu_payload));
2339 payload.in.buf = &pmu->perfmon_counter; 2550 payload.in.buf = pv->get_perfmon_cntr_ptr(pmu);
2340 payload.in.size = sizeof(struct pmu_perfmon_counter); 2551 payload.in.size = pv->get_perfmon_cntr_sz(pmu);
2341 payload.in.offset = pv->get_perfmon_cmd_init_offsetofvar(COUNTER_ALLOC); 2552 payload.in.offset = pv->get_perfmon_cmd_init_offsetofvar(COUNTER_ALLOC);
2342 2553
2343 gk20a_dbg_pmu("cmd post PMU_PERFMON_CMD_ID_INIT"); 2554 gk20a_dbg_pmu("cmd post PMU_PERFMON_CMD_ID_INIT");
@@ -2631,13 +2842,13 @@ static int pmu_perfmon_start_sampling(struct pmu_gk20a *pmu)
2631 memset(&payload, 0, sizeof(struct pmu_payload)); 2842 memset(&payload, 0, sizeof(struct pmu_payload));
2632 2843
2633 /* TBD: PMU_PERFMON_PCT_TO_INC * 100 */ 2844 /* TBD: PMU_PERFMON_PCT_TO_INC * 100 */
2634 pmu->perfmon_counter.upper_threshold = 3000; /* 30% */ 2845 pv->set_perfmon_cntr_ut(pmu, 3000); /* 30% */
2635 /* TBD: PMU_PERFMON_PCT_TO_DEC * 100 */ 2846 /* TBD: PMU_PERFMON_PCT_TO_DEC * 100 */
2636 pmu->perfmon_counter.lower_threshold = 1000; /* 10% */ 2847 pv->set_perfmon_cntr_lt(pmu, 1000); /* 10% */
2637 pmu->perfmon_counter.valid = true; 2848 pv->set_perfmon_cntr_valid(pmu, true);
2638 2849
2639 payload.in.buf = &pmu->perfmon_counter; 2850 payload.in.buf = pv->get_perfmon_cntr_ptr(pmu);
2640 payload.in.size = sizeof(pmu->perfmon_counter); 2851 payload.in.size = pv->get_perfmon_cntr_sz(pmu);
2641 payload.in.offset = 2852 payload.in.offset =
2642 pv->get_perfmon_cmd_start_offsetofvar(COUNTER_ALLOC); 2853 pv->get_perfmon_cmd_start_offsetofvar(COUNTER_ALLOC);
2643 2854