diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-09-13 13:52:05 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2016-10-19 23:43:50 -0400 |
commit | f4b05d295fe821d2871ba22dde178674359fe563 (patch) | |
tree | 8f2ae393a1763efe488c76ff76427dea167041a5 | |
parent | bf29bd942201e17f55ff0894833a84b8f6c0bf97 (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.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 25 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/therm_gk20a.c | 44 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/therm_gk20a.h | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/therm_gm20b.c | 2 |
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 | ||
4233 | void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine) | 4233 | void 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 | ||
4290 | void gr_gk20a_init_cg_mode(struct gk20a *g, u32 cgmode, u32 mode_config) | 4267 | void 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 | ||
50 | void gk20a_priv_ring_isr(struct gk20a *g) | 47 | void 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 | ||
113 | int 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 | |||
113 | void gk20a_init_therm_ops(struct gpu_ops *gops) | 156 | void 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 | ||
19 | struct gpu_ops; | 19 | struct gpu_ops; |
20 | struct gk20a; | ||
21 | |||
20 | void gk20a_init_therm_ops(struct gpu_ops *gops); | 22 | void gk20a_init_therm_ops(struct gpu_ops *gops); |
23 | int gk20a_elcg_init_idle_filters(struct gk20a *g); | ||
21 | 24 | ||
22 | int gk20a_init_therm_support(struct gk20a *g); | 25 | int 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) | |||
69 | void gm20b_init_therm_ops(struct gpu_ops *gops) | 69 | void 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 | } |