summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2014-08-20 23:52:07 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:11:02 -0400
commit9e3fc22ea77e5b484d7d05933c66875277a31c78 (patch)
tree4d255108dd9952ee66a0af232c6d74eb93373f70 /drivers/gpu/nvgpu/gm20b/clk_gm20b.c
parent7687e551e8fc3987ad3294484437bd67f00500c0 (diff)
gpu: nvgpu: Disable GM20b clock slowdown for monitor
Disabled GM20b idle clock slowdown during rate measurements. Change-Id: I20127c1f2816b7a8fe2f208eb21d2decc986d727 Signed-off-by: Alex Frid <afrid@nvidia.com> Reviewed-on: http://git-master/r/486324 Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Tested-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/clk_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/clk_gm20b.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/clk_gm20b.c b/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
index 561a0427..fffac551 100644
--- a/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/clk_gm20b.c
@@ -25,6 +25,7 @@
25#include "gk20a/gk20a.h" 25#include "gk20a/gk20a.h"
26#include "hw_trim_gm20b.h" 26#include "hw_trim_gm20b.h"
27#include "hw_timer_gm20b.h" 27#include "hw_timer_gm20b.h"
28#include "hw_therm_gm20b.h"
28#include "clk_gm20b.h" 29#include "clk_gm20b.h"
29 30
30#define gk20a_dbg_clk(fmt, arg...) \ 31#define gk20a_dbg_clk(fmt, arg...) \
@@ -877,6 +878,7 @@ static int monitor_get(void *data, u64 *val)
877{ 878{
878 struct gk20a *g = (struct gk20a *)data; 879 struct gk20a *g = (struct gk20a *)data;
879 struct clk_gk20a *clk = &g->clk; 880 struct clk_gk20a *clk = &g->clk;
881 u32 clk_slowdown, clk_slowdown_save;
880 int err; 882 int err;
881 883
882 u32 ncycle = 100; /* count GPCCLK for ncycle of clkin */ 884 u32 ncycle = 100; /* count GPCCLK for ncycle of clkin */
@@ -887,6 +889,16 @@ static int monitor_get(void *data, u64 *val)
887 if (err) 889 if (err)
888 return err; 890 return err;
889 891
892 mutex_lock(&g->clk.clk_mutex);
893
894 /* Disable clock slowdown during measurements */
895 clk_slowdown_save = gk20a_readl(g, therm_clk_slowdown_r(0));
896 clk_slowdown = set_field(clk_slowdown_save,
897 therm_clk_slowdown_idle_factor_m(),
898 therm_clk_slowdown_idle_factor_disabled_f());
899 gk20a_writel(g, therm_clk_slowdown_r(0), clk_slowdown);
900 gk20a_readl(g, therm_clk_slowdown_r(0));
901
890 gk20a_writel(g, trim_gpc_clk_cntr_ncgpcclk_cfg_r(0), 902 gk20a_writel(g, trim_gpc_clk_cntr_ncgpcclk_cfg_r(0),
891 trim_gpc_clk_cntr_ncgpcclk_cfg_reset_asserted_f()); 903 trim_gpc_clk_cntr_ncgpcclk_cfg_reset_asserted_f());
892 gk20a_writel(g, trim_gpc_clk_cntr_ncgpcclk_cfg_r(0), 904 gk20a_writel(g, trim_gpc_clk_cntr_ncgpcclk_cfg_r(0),
@@ -895,10 +907,10 @@ static int monitor_get(void *data, u64 *val)
895 trim_gpc_clk_cntr_ncgpcclk_cfg_noofipclks_f(ncycle)); 907 trim_gpc_clk_cntr_ncgpcclk_cfg_noofipclks_f(ncycle));
896 /* start */ 908 /* start */
897 909
898 /* It should take about 8us to finish 100 cycle of 12MHz. 910 /* It should take less than 5us to finish 100 cycle of 38.4MHz.
899 But longer than 100us delay is required here. */ 911 But longer than 100us delay is required here. */
900 gk20a_readl(g, trim_gpc_clk_cntr_ncgpcclk_cfg_r(0)); 912 gk20a_readl(g, trim_gpc_clk_cntr_ncgpcclk_cfg_r(0));
901 udelay(2000); 913 udelay(200);
902 914
903 count1 = gk20a_readl(g, trim_gpc_clk_cntr_ncgpcclk_cnt_r(0)); 915 count1 = gk20a_readl(g, trim_gpc_clk_cntr_ncgpcclk_cnt_r(0));
904 udelay(100); 916 udelay(100);
@@ -907,6 +919,10 @@ static int monitor_get(void *data, u64 *val)
907 do_div(freq, ncycle); 919 do_div(freq, ncycle);
908 *val = freq; 920 *val = freq;
909 921
922 /* Restore clock slowdown */
923 gk20a_writel(g, therm_clk_slowdown_r(0), clk_slowdown_save);
924 mutex_unlock(&g->clk.clk_mutex);
925
910 gk20a_idle(g->dev); 926 gk20a_idle(g->dev);
911 927
912 if (count1 != count2) 928 if (count1 != count2)