summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c')
-rw-r--r--drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c b/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c
index c5464d5b..5fdcb05c 100644
--- a/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c
+++ b/drivers/gpu/nvgpu/os/linux/platform_gp10b_tegra.c
@@ -55,6 +55,9 @@
55static unsigned long 55static unsigned long
56gp10b_freq_table[GP10B_MAX_SUPPORTED_FREQS / GP10B_FREQ_SELECT_STEP]; 56gp10b_freq_table[GP10B_MAX_SUPPORTED_FREQS / GP10B_FREQ_SELECT_STEP];
57 57
58static bool freq_table_init_complete;
59static int num_supported_freq;
60
58#define TEGRA_GP10B_BW_PER_FREQ 64 61#define TEGRA_GP10B_BW_PER_FREQ 64
59#define TEGRA_DDR4_BW_PER_FREQ 16 62#define TEGRA_DDR4_BW_PER_FREQ 16
60 63
@@ -166,6 +169,8 @@ static int gp10b_tegra_probe(struct device *dev)
166 gp10b_tegra_get_clocks(dev); 169 gp10b_tegra_get_clocks(dev);
167 nvgpu_linux_init_clk_support(platform->g); 170 nvgpu_linux_init_clk_support(platform->g);
168 171
172 nvgpu_mutex_init(&platform->clk_get_freq_lock);
173
169 return 0; 174 return 0;
170} 175}
171 176
@@ -176,6 +181,8 @@ static int gp10b_tegra_late_probe(struct device *dev)
176 181
177static int gp10b_tegra_remove(struct device *dev) 182static int gp10b_tegra_remove(struct device *dev)
178{ 183{
184 struct gk20a_platform *platform = gk20a_get_platform(dev);
185
179 /* deinitialise tegra specific scaling quirks */ 186 /* deinitialise tegra specific scaling quirks */
180 gp10b_tegra_scale_exit(dev); 187 gp10b_tegra_scale_exit(dev);
181 188
@@ -183,6 +190,8 @@ static int gp10b_tegra_remove(struct device *dev)
183 nvgpu_free_nvhost_dev(get_gk20a(dev)); 190 nvgpu_free_nvhost_dev(get_gk20a(dev));
184#endif 191#endif
185 192
193 nvgpu_mutex_destroy(&platform->clk_get_freq_lock);
194
186 return 0; 195 return 0;
187} 196}
188 197
@@ -342,6 +351,18 @@ int gp10b_clk_get_freqs(struct device *dev,
342 int sel_freq_cnt; 351 int sel_freq_cnt;
343 unsigned long loc_freq_table[GP10B_MAX_SUPPORTED_FREQS]; 352 unsigned long loc_freq_table[GP10B_MAX_SUPPORTED_FREQS];
344 353
354 nvgpu_mutex_acquire(&platform->clk_get_freq_lock);
355
356 if (freq_table_init_complete) {
357
358 *freqs = gp10b_freq_table;
359 *num_freqs = num_supported_freq;
360
361 nvgpu_mutex_release(&platform->clk_get_freq_lock);
362
363 return 0;
364 }
365
345 max_rate = clk_round_rate(platform->clk[0], (UINT_MAX - 1)); 366 max_rate = clk_round_rate(platform->clk[0], (UINT_MAX - 1));
346 367
347 /* 368 /*
@@ -392,10 +413,15 @@ int gp10b_clk_get_freqs(struct device *dev,
392 /* Fill freq table */ 413 /* Fill freq table */
393 *freqs = gp10b_freq_table; 414 *freqs = gp10b_freq_table;
394 *num_freqs = sel_freq_cnt; 415 *num_freqs = sel_freq_cnt;
416 num_supported_freq = sel_freq_cnt;
417
418 freq_table_init_complete = true;
395 419
396 nvgpu_log_info(g, "min rate: %ld max rate: %ld num_of_freq %d\n", 420 nvgpu_log_info(g, "min rate: %ld max rate: %ld num_of_freq %d\n",
397 gp10b_freq_table[0], max_rate, *num_freqs); 421 gp10b_freq_table[0], max_rate, *num_freqs);
398 422
423 nvgpu_mutex_release(&platform->clk_get_freq_lock);
424
399 return 0; 425 return 0;
400} 426}
401 427