summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gk20a_scale.c
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2016-12-06 10:29:58 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2016-12-14 15:38:32 -0500
commit02b8cda953f7ff0cc9750b79b62712609da9d6ad (patch)
tree04a26e13f45075901811f1ddf9cc1dc6d637deaf /drivers/gpu/nvgpu/gk20a/gk20a_scale.c
parent866dafa484414f8ee540696d5df7617fdb4b1fc9 (diff)
gpu: nvgpu: store last_freq in gk20a struct
In gk20a_scale_target(), to check for duplicate freq requests we compare current frequency with devfreq->previous_freq But for very first request after boot, we have devfreq->previous_freq set to MIN freq And in case we evaluate new frew as MIN freq then we skip calling postscale() and scaling of EMC clock This results in keeping EMC at MAX value To fix this, add new variable last_freq in gk20a structure. Use this variable to store frequency value and to compare for duplicate requests Bug 200255163 Bug 200257544 Change-Id: Icfc57234c63f68cce8ccf8221237105272dad853 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1263747 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gk20a_scale.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a_scale.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a_scale.c b/drivers/gpu/nvgpu/gk20a/gk20a_scale.c
index e3b21c5a..dbc2f06c 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a_scale.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a_scale.c
@@ -182,7 +182,7 @@ static int gk20a_scale_target(struct device *dev, unsigned long *freq,
182 local_freq = max_freq; 182 local_freq = max_freq;
183 183
184 /* Check for duplicate request */ 184 /* Check for duplicate request */
185 if (local_freq == g->devfreq->previous_freq) 185 if (local_freq == g->last_freq)
186 return 0; 186 return 0;
187 187
188 /* set the final frequency */ 188 /* set the final frequency */
@@ -195,6 +195,8 @@ static int gk20a_scale_target(struct device *dev, unsigned long *freq,
195 *freq = platform->clk_get_rate(dev); 195 *freq = platform->clk_get_rate(dev);
196 } 196 }
197 197
198 g->last_freq = *freq;
199
198 /* postscale will only scale emc (dram clock) if evaluating 200 /* postscale will only scale emc (dram clock) if evaluating
199 * gk20a_tegra_get_emc_rate() produces a new or different emc 201 * gk20a_tegra_get_emc_rate() produces a new or different emc
200 * target because the load or_and gpufreq has changed */ 202 * target because the load or_and gpufreq has changed */
@@ -259,6 +261,7 @@ void gk20a_scale_resume(struct device *dev)
259 if (!devfreq) 261 if (!devfreq)
260 return; 262 return;
261 263
264 g->last_freq = 0;
262 devfreq_resume_device(devfreq); 265 devfreq_resume_device(devfreq);
263} 266}
264 267