diff --git a/drivers/gpu/nvgpu/gk20a/gk20a_scale.c b/drivers/gpu/nvgpu/gk20a/gk20a_scale.c index 8a92828f5..d09a18f84 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a_scale.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a_scale.c @@ -192,6 +192,9 @@ static void gk20a_scale_notify(struct platform_device *pdev, bool busy) struct gk20a_scale_profile *profile = g->scale_profile; struct devfreq *devfreq = g->devfreq; + /* update the software shadow */ + gk20a_pmu_load_update(g); + /* inform edp about new constraint */ if (platform->prescale) platform->prescale(pdev); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c index 994c9cd2f..97a0452cd 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a_sysfs.c @@ -278,6 +278,7 @@ static ssize_t gk20a_load_show(struct device *dev, busy_time = 0; } else { gk20a_busy(g->dev); + gk20a_pmu_load_update(g); gk20a_pmu_load_norm(g, &busy_time); gk20a_idle(g->dev); } diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index 7c441f53b..06e7a4e65 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c @@ -3676,17 +3676,23 @@ int gk20a_pmu_destroy(struct gk20a *g) } int gk20a_pmu_load_norm(struct gk20a *g, u32 *load) +{ + *load = g->pmu.load_shadow; + return 0; +} + +int gk20a_pmu_load_update(struct gk20a *g) { struct pmu_gk20a *pmu = &g->pmu; u16 _load = 0; if (!pmu->perfmon_ready) { - *load = 0; + pmu->load_shadow = 0; return 0; } pmu_copy_from_dmem(pmu, pmu->sample_buffer, (u8 *)&_load, 2, 0); - *load = _load / 10; + pmu->load_shadow = _load / 10; return 0; } diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h index 292aabb0f..694e0288f 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h @@ -1079,6 +1079,7 @@ struct pmu_gk20a { bool perfmon_ready; u32 sample_buffer; + u32 load_shadow; struct mutex isr_mutex; struct mutex isr_enable_lock; @@ -1119,6 +1120,7 @@ int pmu_mutex_acquire(struct pmu_gk20a *pmu, u32 id, u32 *token); int pmu_mutex_release(struct pmu_gk20a *pmu, u32 id, u32 *token); int gk20a_pmu_destroy(struct gk20a *g); int gk20a_pmu_load_norm(struct gk20a *g, u32 *load); +int gk20a_pmu_load_update(struct gk20a *g); int gk20a_pmu_debugfs_init(struct platform_device *dev); void gk20a_pmu_reset_load_counters(struct gk20a *g); void gk20a_pmu_get_load_counters(struct gk20a *g, u32 *busy_cycles,