summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2016-09-13 13:52:05 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-10-19 23:43:50 -0400
commitf4b05d295fe821d2871ba22dde178674359fe563 (patch)
tree8f2ae393a1763efe488c76ff76427dea167041a5
parentbf29bd942201e17f55ff0894833a84b8f6c0bf97 (diff)
gpu: nvgpu: Move ELCG programming to therm
Move ELCG parameter programming to a new function in therm, elcg_init_idle_filter. Implement gk20a variant and use it for gk20a and gm20b. JIRA DNVGPU-74 Change-Id: I8ef400f3a6195311fb9e7da8db6c34993d62f461 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1220433 (cherry picked from commit f6654ae4d83d31cd40b317bf55922964bbfa575d) Reviewed-on: http://git-master/r/1239421 GVS: Gerrit_Virtual_Submit
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c3
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h2
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c25
-rw-r--r--drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c3
-rw-r--r--drivers/gpu/nvgpu/gk20a/therm_gk20a.c44
-rw-r--r--drivers/gpu/nvgpu/gk20a/therm_gk20a.h3
-rw-r--r--drivers/gpu/nvgpu/gm20b/therm_gm20b.c2
7 files changed, 53 insertions, 29 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index c61b47c5..9eebfe88 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -941,6 +941,9 @@ int gk20a_pm_finalize_poweron(struct device *dev)
941 goto done; 941 goto done;
942 } 942 }
943 943
944 if (g->ops.therm.elcg_init_idle_filters)
945 g->ops.therm.elcg_init_idle_filters(g);
946
944 g->ops.mc.intr_enable(g); 947 g->ops.mc.intr_enable(g);
945 948
946 err = gk20a_enable_gr_hw(g); 949 err = gk20a_enable_gr_hw(g);
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 75b96f42..2d4e6bbf 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -576,7 +576,7 @@ struct gpu_ops {
576 } mm; 576 } mm;
577 struct { 577 struct {
578 int (*init_therm_setup_hw)(struct gk20a *g); 578 int (*init_therm_setup_hw)(struct gk20a *g);
579 int (*update_therm_gate_ctrl)(struct gk20a *g); 579 int (*elcg_init_idle_filters)(struct gk20a *g);
580 void (*therm_debugfs_init)(struct gk20a *g); 580 void (*therm_debugfs_init)(struct gk20a *g);
581 } therm; 581 } therm;
582 struct { 582 struct {
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index fc1978ed..ecc67167 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -4232,8 +4232,7 @@ void gr_gk20a_init_blcg_mode(struct gk20a *g, u32 mode, u32 engine)
4232 4232
4233void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine) 4233void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine)
4234{ 4234{
4235 u32 gate_ctrl, idle_filter; 4235 u32 gate_ctrl;
4236 struct gk20a_platform *platform = dev_get_drvdata(g->dev);
4237 4236
4238 gate_ctrl = gk20a_readl(g, therm_gate_ctrl_r(engine)); 4237 gate_ctrl = gk20a_readl(g, therm_gate_ctrl_r(engine));
4239 4238
@@ -4262,29 +4261,7 @@ void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine)
4262 "invalid elcg mode %d", mode); 4261 "invalid elcg mode %d", mode);
4263 } 4262 }
4264 4263
4265 if (platform->is_fmodel) {
4266 gate_ctrl = set_field(gate_ctrl,
4267 therm_gate_ctrl_eng_delay_after_m(),
4268 therm_gate_ctrl_eng_delay_after_f(4));
4269 }
4270
4271 /* 2 * (1 << 9) = 1024 clks */
4272 gate_ctrl = set_field(gate_ctrl,
4273 therm_gate_ctrl_eng_idle_filt_exp_m(),
4274 therm_gate_ctrl_eng_idle_filt_exp_f(9));
4275 gate_ctrl = set_field(gate_ctrl,
4276 therm_gate_ctrl_eng_idle_filt_mant_m(),
4277 therm_gate_ctrl_eng_idle_filt_mant_f(2));
4278 gk20a_writel(g, therm_gate_ctrl_r(engine), gate_ctrl); 4264 gk20a_writel(g, therm_gate_ctrl_r(engine), gate_ctrl);
4279
4280 /* default fecs_idle_filter to 0 */
4281 idle_filter = gk20a_readl(g, therm_fecs_idle_filter_r());
4282 idle_filter &= ~therm_fecs_idle_filter_value_m();
4283 gk20a_writel(g, therm_fecs_idle_filter_r(), idle_filter);
4284 /* default hubmmu_idle_filter to 0 */
4285 idle_filter = gk20a_readl(g, therm_hubmmu_idle_filter_r());
4286 idle_filter &= ~therm_hubmmu_idle_filter_value_m();
4287 gk20a_writel(g, therm_hubmmu_idle_filter_r(), idle_filter);
4288} 4265}
4289 4266
4290void gr_gk20a_init_cg_mode(struct gk20a *g, u32 cgmode, u32 mode_config) 4267void gr_gk20a_init_cg_mode(struct gk20a *g, u32 cgmode, u32 mode_config)
diff --git a/drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c b/drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c
index f812383f..695d646f 100644
--- a/drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c
@@ -42,9 +42,6 @@ void gk20a_reset_priv_ring(struct gk20a *g)
42 42
43 gk20a_readl(g, pri_ringstation_sys_decode_config_r()); 43 gk20a_readl(g, pri_ringstation_sys_decode_config_r());
44 44
45 if (g->ops.therm.update_therm_gate_ctrl)
46 g->ops.therm.update_therm_gate_ctrl(g);
47
48} 45}
49 46
50void gk20a_priv_ring_isr(struct gk20a *g) 47void gk20a_priv_ring_isr(struct gk20a *g)
diff --git a/drivers/gpu/nvgpu/gk20a/therm_gk20a.c b/drivers/gpu/nvgpu/gk20a/therm_gk20a.c
index da8e2894..e983a814 100644
--- a/drivers/gpu/nvgpu/gk20a/therm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/therm_gk20a.c
@@ -110,7 +110,51 @@ int gk20a_init_therm_support(struct gk20a *g)
110 return err; 110 return err;
111} 111}
112 112
113int gk20a_elcg_init_idle_filters(struct gk20a *g)
114{
115 u32 gate_ctrl, idle_filter;
116 u32 engine_id;
117 u32 active_engine_id = 0;
118 struct fifo_gk20a *f = &g->fifo;
119 struct gk20a_platform *platform = dev_get_drvdata(g->dev);
120
121 gk20a_dbg_fn("");
122
123 for (engine_id = 0; engine_id < f->num_engines; engine_id++) {
124 active_engine_id = f->active_engines_list[engine_id];
125 gate_ctrl = gk20a_readl(g, therm_gate_ctrl_r(active_engine_id));
126
127 if (platform->is_fmodel) {
128 gate_ctrl = set_field(gate_ctrl,
129 therm_gate_ctrl_eng_delay_after_m(),
130 therm_gate_ctrl_eng_delay_after_f(4));
131 }
132
133 /* 2 * (1 << 9) = 1024 clks */
134 gate_ctrl = set_field(gate_ctrl,
135 therm_gate_ctrl_eng_idle_filt_exp_m(),
136 therm_gate_ctrl_eng_idle_filt_exp_f(9));
137 gate_ctrl = set_field(gate_ctrl,
138 therm_gate_ctrl_eng_idle_filt_mant_m(),
139 therm_gate_ctrl_eng_idle_filt_mant_f(2));
140 gk20a_writel(g, therm_gate_ctrl_r(active_engine_id), gate_ctrl);
141 }
142
143 /* default fecs_idle_filter to 0 */
144 idle_filter = gk20a_readl(g, therm_fecs_idle_filter_r());
145 idle_filter &= ~therm_fecs_idle_filter_value_m();
146 gk20a_writel(g, therm_fecs_idle_filter_r(), idle_filter);
147 /* default hubmmu_idle_filter to 0 */
148 idle_filter = gk20a_readl(g, therm_hubmmu_idle_filter_r());
149 idle_filter &= ~therm_hubmmu_idle_filter_value_m();
150 gk20a_writel(g, therm_hubmmu_idle_filter_r(), idle_filter);
151
152 gk20a_dbg_fn("done");
153 return 0;
154}
155
113void gk20a_init_therm_ops(struct gpu_ops *gops) 156void gk20a_init_therm_ops(struct gpu_ops *gops)
114{ 157{
115 gops->therm.init_therm_setup_hw = gk20a_init_therm_setup_hw; 158 gops->therm.init_therm_setup_hw = gk20a_init_therm_setup_hw;
159 gops->therm.elcg_init_idle_filters = gk20a_elcg_init_idle_filters;
116} 160}
diff --git a/drivers/gpu/nvgpu/gk20a/therm_gk20a.h b/drivers/gpu/nvgpu/gk20a/therm_gk20a.h
index 80671d68..ddd7ac54 100644
--- a/drivers/gpu/nvgpu/gk20a/therm_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/therm_gk20a.h
@@ -17,7 +17,10 @@
17#define THERM_GK20A_H 17#define THERM_GK20A_H
18 18
19struct gpu_ops; 19struct gpu_ops;
20struct gk20a;
21
20void gk20a_init_therm_ops(struct gpu_ops *gops); 22void gk20a_init_therm_ops(struct gpu_ops *gops);
23int gk20a_elcg_init_idle_filters(struct gk20a *g);
21 24
22int gk20a_init_therm_support(struct gk20a *g); 25int gk20a_init_therm_support(struct gk20a *g);
23#endif /* THERM_GK20A_H */ 26#endif /* THERM_GK20A_H */
diff --git a/drivers/gpu/nvgpu/gm20b/therm_gm20b.c b/drivers/gpu/nvgpu/gm20b/therm_gm20b.c
index 6ebc4c91..6847894a 100644
--- a/drivers/gpu/nvgpu/gm20b/therm_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/therm_gm20b.c
@@ -69,5 +69,5 @@ static int gm20b_init_therm_setup_hw(struct gk20a *g)
69void gm20b_init_therm_ops(struct gpu_ops *gops) 69void gm20b_init_therm_ops(struct gpu_ops *gops)
70{ 70{
71 gops->therm.init_therm_setup_hw = gm20b_init_therm_setup_hw; 71 gops->therm.init_therm_setup_hw = gm20b_init_therm_setup_hw;
72 72 gops->therm.elcg_init_idle_filters = gk20a_elcg_init_idle_filters;
73} 73}