summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp106
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2016-09-13 13:53:14 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:56:50 -0500
commit4a94ce451b0352ce67e11a2971bbbd75c2e58df1 (patch)
tree4d40b83239cce2408a79e7d13d0bd0b9ace20f7a /drivers/gpu/nvgpu/gp106
parentc527b36daa2019bbf1ba2a3c9b9474d8c7316ff0 (diff)
gpu: nvgpu: Move ELCG programming to therm
Implement gp10b and gp106 ELCG programming. JIRA DNVGPU-74 Change-Id: Ic0349b948a2870e0d39e95ddd2f49231e7b4cbe0 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1220431 (cherry picked from commit d6bc48647982babdf642ea6004d4208c5daa243f) Reviewed-on: http://git-master/r/1239422 GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/gpu/nvgpu/gp106')
-rw-r--r--drivers/gpu/nvgpu/gp106/hw_therm_gp106.h80
-rw-r--r--drivers/gpu/nvgpu/gp106/therm_gp106.c45
2 files changed, 125 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gp106/hw_therm_gp106.h b/drivers/gpu/nvgpu/gp106/hw_therm_gp106.h
index ecc50980..36ffcc7a 100644
--- a/drivers/gpu/nvgpu/gp106/hw_therm_gp106.h
+++ b/drivers/gpu/nvgpu/gp106/hw_therm_gp106.h
@@ -94,4 +94,84 @@ static inline u32 therm_temp_sensor_tsense_state_shadow_v(void)
94{ 94{
95 return 0x00000002; 95 return 0x00000002;
96} 96}
97static inline u32 therm_gate_ctrl_r(u32 i)
98{
99 return 0x00020200 + i*4;
100}
101static inline u32 therm_gate_ctrl_eng_clk_m(void)
102{
103 return 0x3 << 0;
104}
105static inline u32 therm_gate_ctrl_eng_clk_run_f(void)
106{
107 return 0x0;
108}
109static inline u32 therm_gate_ctrl_eng_clk_auto_f(void)
110{
111 return 0x1;
112}
113static inline u32 therm_gate_ctrl_eng_clk_stop_f(void)
114{
115 return 0x2;
116}
117static inline u32 therm_gate_ctrl_blk_clk_m(void)
118{
119 return 0x3 << 2;
120}
121static inline u32 therm_gate_ctrl_blk_clk_run_f(void)
122{
123 return 0x0;
124}
125static inline u32 therm_gate_ctrl_blk_clk_auto_f(void)
126{
127 return 0x4;
128}
129static inline u32 therm_gate_ctrl_eng_idle_filt_exp_f(u32 v)
130{
131 return (v & 0x1f) << 8;
132}
133static inline u32 therm_gate_ctrl_eng_idle_filt_exp_m(void)
134{
135 return 0x1f << 8;
136}
137static inline u32 therm_gate_ctrl_eng_idle_filt_mant_f(u32 v)
138{
139 return (v & 0x7) << 13;
140}
141static inline u32 therm_gate_ctrl_eng_idle_filt_mant_m(void)
142{
143 return 0x7 << 13;
144}
145static inline u32 therm_gate_ctrl_eng_delay_before_f(u32 v)
146{
147 return (v & 0xf) << 16;
148}
149static inline u32 therm_gate_ctrl_eng_delay_before_m(void)
150{
151 return 0xf << 16;
152}
153static inline u32 therm_gate_ctrl_eng_delay_after_f(u32 v)
154{
155 return (v & 0xf) << 20;
156}
157static inline u32 therm_gate_ctrl_eng_delay_after_m(void)
158{
159 return 0xf << 20;
160}
161static inline u32 therm_fecs_idle_filter_r(void)
162{
163 return 0x00020288;
164}
165static inline u32 therm_fecs_idle_filter_value_m(void)
166{
167 return 0xffffffff << 0;
168}
169static inline u32 therm_hubmmu_idle_filter_r(void)
170{
171 return 0x0002028c;
172}
173static inline u32 therm_hubmmu_idle_filter_value_m(void)
174{
175 return 0xffffffff << 0;
176}
97#endif 177#endif
diff --git a/drivers/gpu/nvgpu/gp106/therm_gp106.c b/drivers/gpu/nvgpu/gp106/therm_gp106.c
index 153e953d..a3aa3636 100644
--- a/drivers/gpu/nvgpu/gp106/therm_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/therm_gp106.c
@@ -55,8 +55,53 @@ static void gp106_therm_debugfs_init(struct gk20a *g) {
55} 55}
56#endif 56#endif
57 57
58static int gp106_elcg_init_idle_filters(struct gk20a *g)
59{
60 u32 gate_ctrl, idle_filter;
61 u32 engine_id;
62 u32 active_engine_id = 0;
63 struct fifo_gk20a *f = &g->fifo;
64
65 gk20a_dbg_fn("");
66
67 for (engine_id = 0; engine_id < f->num_engines; engine_id++) {
68 active_engine_id = f->active_engines_list[engine_id];
69 gate_ctrl = gk20a_readl(g, therm_gate_ctrl_r(active_engine_id));
70
71 if (tegra_platform_is_linsim()) {
72 gate_ctrl = set_field(gate_ctrl,
73 therm_gate_ctrl_eng_delay_after_m(),
74 therm_gate_ctrl_eng_delay_after_f(4));
75 }
76
77 gate_ctrl = set_field(gate_ctrl,
78 therm_gate_ctrl_eng_idle_filt_exp_m(),
79 therm_gate_ctrl_eng_idle_filt_exp_f(2));
80 gate_ctrl = set_field(gate_ctrl,
81 therm_gate_ctrl_eng_idle_filt_mant_m(),
82 therm_gate_ctrl_eng_idle_filt_mant_f(1));
83 gate_ctrl = set_field(gate_ctrl,
84 therm_gate_ctrl_eng_delay_before_m(),
85 therm_gate_ctrl_eng_delay_before_f(0));
86 gk20a_writel(g, therm_gate_ctrl_r(active_engine_id), gate_ctrl);
87 }
88
89 /* default fecs_idle_filter to 0 */
90 idle_filter = gk20a_readl(g, therm_fecs_idle_filter_r());
91 idle_filter &= ~therm_fecs_idle_filter_value_m();
92 gk20a_writel(g, therm_fecs_idle_filter_r(), idle_filter);
93 /* default hubmmu_idle_filter to 0 */
94 idle_filter = gk20a_readl(g, therm_hubmmu_idle_filter_r());
95 idle_filter &= ~therm_hubmmu_idle_filter_value_m();
96 gk20a_writel(g, therm_hubmmu_idle_filter_r(), idle_filter);
97
98 gk20a_dbg_fn("done");
99 return 0;
100}
101
58void gp106_init_therm_ops(struct gpu_ops *gops) { 102void gp106_init_therm_ops(struct gpu_ops *gops) {
59#ifdef CONFIG_DEBUG_FS 103#ifdef CONFIG_DEBUG_FS
60 gops->therm.therm_debugfs_init = gp106_therm_debugfs_init; 104 gops->therm.therm_debugfs_init = gp106_therm_debugfs_init;
61#endif 105#endif
106 gops->therm.elcg_init_idle_filters = gp106_elcg_init_idle_filters;
62} 107}