summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
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