From f4b05d295fe821d2871ba22dde178674359fe563 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Tue, 13 Sep 2016 10:52:05 -0700 Subject: 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 Reviewed-on: http://git-master/r/1220433 (cherry picked from commit f6654ae4d83d31cd40b317bf55922964bbfa575d) Reviewed-on: http://git-master/r/1239421 GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/gk20a/gk20a.c | 3 +++ drivers/gpu/nvgpu/gk20a/gk20a.h | 2 +- drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 25 +----------------- drivers/gpu/nvgpu/gk20a/priv_ring_gk20a.c | 3 --- drivers/gpu/nvgpu/gk20a/therm_gk20a.c | 44 +++++++++++++++++++++++++++++++ drivers/gpu/nvgpu/gk20a/therm_gk20a.h | 3 +++ 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) goto done; } + if (g->ops.therm.elcg_init_idle_filters) + g->ops.therm.elcg_init_idle_filters(g); + g->ops.mc.intr_enable(g); 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 { } mm; struct { int (*init_therm_setup_hw)(struct gk20a *g); - int (*update_therm_gate_ctrl)(struct gk20a *g); + int (*elcg_init_idle_filters)(struct gk20a *g); void (*therm_debugfs_init)(struct gk20a *g); } therm; 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) void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine) { - u32 gate_ctrl, idle_filter; - struct gk20a_platform *platform = dev_get_drvdata(g->dev); + u32 gate_ctrl; gate_ctrl = gk20a_readl(g, therm_gate_ctrl_r(engine)); @@ -4262,29 +4261,7 @@ void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine) "invalid elcg mode %d", mode); } - if (platform->is_fmodel) { - gate_ctrl = set_field(gate_ctrl, - therm_gate_ctrl_eng_delay_after_m(), - therm_gate_ctrl_eng_delay_after_f(4)); - } - - /* 2 * (1 << 9) = 1024 clks */ - gate_ctrl = set_field(gate_ctrl, - therm_gate_ctrl_eng_idle_filt_exp_m(), - therm_gate_ctrl_eng_idle_filt_exp_f(9)); - gate_ctrl = set_field(gate_ctrl, - therm_gate_ctrl_eng_idle_filt_mant_m(), - therm_gate_ctrl_eng_idle_filt_mant_f(2)); gk20a_writel(g, therm_gate_ctrl_r(engine), gate_ctrl); - - /* default fecs_idle_filter to 0 */ - idle_filter = gk20a_readl(g, therm_fecs_idle_filter_r()); - idle_filter &= ~therm_fecs_idle_filter_value_m(); - gk20a_writel(g, therm_fecs_idle_filter_r(), idle_filter); - /* default hubmmu_idle_filter to 0 */ - idle_filter = gk20a_readl(g, therm_hubmmu_idle_filter_r()); - idle_filter &= ~therm_hubmmu_idle_filter_value_m(); - gk20a_writel(g, therm_hubmmu_idle_filter_r(), idle_filter); } 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) gk20a_readl(g, pri_ringstation_sys_decode_config_r()); - if (g->ops.therm.update_therm_gate_ctrl) - g->ops.therm.update_therm_gate_ctrl(g); - } 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) return err; } +int gk20a_elcg_init_idle_filters(struct gk20a *g) +{ + u32 gate_ctrl, idle_filter; + u32 engine_id; + u32 active_engine_id = 0; + struct fifo_gk20a *f = &g->fifo; + struct gk20a_platform *platform = dev_get_drvdata(g->dev); + + gk20a_dbg_fn(""); + + for (engine_id = 0; engine_id < f->num_engines; engine_id++) { + active_engine_id = f->active_engines_list[engine_id]; + gate_ctrl = gk20a_readl(g, therm_gate_ctrl_r(active_engine_id)); + + if (platform->is_fmodel) { + gate_ctrl = set_field(gate_ctrl, + therm_gate_ctrl_eng_delay_after_m(), + therm_gate_ctrl_eng_delay_after_f(4)); + } + + /* 2 * (1 << 9) = 1024 clks */ + gate_ctrl = set_field(gate_ctrl, + therm_gate_ctrl_eng_idle_filt_exp_m(), + therm_gate_ctrl_eng_idle_filt_exp_f(9)); + gate_ctrl = set_field(gate_ctrl, + therm_gate_ctrl_eng_idle_filt_mant_m(), + therm_gate_ctrl_eng_idle_filt_mant_f(2)); + gk20a_writel(g, therm_gate_ctrl_r(active_engine_id), gate_ctrl); + } + + /* default fecs_idle_filter to 0 */ + idle_filter = gk20a_readl(g, therm_fecs_idle_filter_r()); + idle_filter &= ~therm_fecs_idle_filter_value_m(); + gk20a_writel(g, therm_fecs_idle_filter_r(), idle_filter); + /* default hubmmu_idle_filter to 0 */ + idle_filter = gk20a_readl(g, therm_hubmmu_idle_filter_r()); + idle_filter &= ~therm_hubmmu_idle_filter_value_m(); + gk20a_writel(g, therm_hubmmu_idle_filter_r(), idle_filter); + + gk20a_dbg_fn("done"); + return 0; +} + void gk20a_init_therm_ops(struct gpu_ops *gops) { gops->therm.init_therm_setup_hw = gk20a_init_therm_setup_hw; + gops->therm.elcg_init_idle_filters = gk20a_elcg_init_idle_filters; } 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 @@ #define THERM_GK20A_H struct gpu_ops; +struct gk20a; + void gk20a_init_therm_ops(struct gpu_ops *gops); +int gk20a_elcg_init_idle_filters(struct gk20a *g); int gk20a_init_therm_support(struct gk20a *g); #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) void gm20b_init_therm_ops(struct gpu_ops *gops) { gops->therm.init_therm_setup_hw = gm20b_init_therm_setup_hw; - + gops->therm.elcg_init_idle_filters = gk20a_elcg_init_idle_filters; } -- cgit v1.2.2