summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/clk
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2016-12-20 17:11:54 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-01-04 04:44:25 -0500
commitf37f4e27e362629d5c187817104d48d703c380cc (patch)
tree8dddaa1d926016848c6cebc4aa9f4a3612341da1 /drivers/gpu/nvgpu/clk
parent2a95a288b285b0eff16a8825298c416d185693fb (diff)
gpu: nvgpu: Use perf table only VBIOS supports it
We retrieve perf table from VBIOS only if respective HAL op is implemented. Later in code we unconditionally dereference the pointer which can lead to NULL pointer access. Fix by early aborting creation of devinit tables if the perf VBIOS getter is missing. Change-Id: If48aa6dac724056dd1feb2ef520e343736d4db85 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1279223 GVS: Gerrit_Virtual_Submit Reviewed-by: Thomas Fleury <tfleury@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/clk')
-rw-r--r--drivers/gpu/nvgpu/clk/clk_domain.c15
-rw-r--r--drivers/gpu/nvgpu/clk/clk_fll.c15
-rw-r--r--drivers/gpu/nvgpu/clk/clk_vin.c15
3 files changed, 24 insertions, 21 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk_domain.c b/drivers/gpu/nvgpu/clk/clk_domain.c
index fe3db5d6..892437de 100644
--- a/drivers/gpu/nvgpu/clk/clk_domain.c
+++ b/drivers/gpu/nvgpu/clk/clk_domain.c
@@ -263,13 +263,14 @@ static u32 devinit_get_clocks_table(struct gk20a *g,
263 263
264 gk20a_dbg_info(""); 264 gk20a_dbg_info("");
265 265
266 if (g->ops.bios.get_perf_table_ptrs) { 266 if (!g->ops.bios.get_perf_table_ptrs)
267 clocks_table_ptr = (u8 *)g->ops.bios.get_perf_table_ptrs(g, 267 return -EINVAL;
268 g->bios.clock_token, CLOCKS_TABLE); 268
269 if (clocks_table_ptr == NULL) { 269 clocks_table_ptr = (u8 *)g->ops.bios.get_perf_table_ptrs(g,
270 status = -EINVAL; 270 g->bios.clock_token, CLOCKS_TABLE);
271 goto done; 271 if (clocks_table_ptr == NULL) {
272 } 272 status = -EINVAL;
273 goto done;
273 } 274 }
274 275
275 memcpy(&clocks_table_header, clocks_table_ptr, 276 memcpy(&clocks_table_header, clocks_table_ptr,
diff --git a/drivers/gpu/nvgpu/clk/clk_fll.c b/drivers/gpu/nvgpu/clk/clk_fll.c
index 0de857f5..d83f3e15 100644
--- a/drivers/gpu/nvgpu/clk/clk_fll.c
+++ b/drivers/gpu/nvgpu/clk/clk_fll.c
@@ -236,13 +236,14 @@ static u32 devinit_get_fll_device_table(struct gk20a *g,
236 236
237 gk20a_dbg_info(""); 237 gk20a_dbg_info("");
238 238
239 if (g->ops.bios.get_perf_table_ptrs) { 239 if (!g->ops.bios.get_perf_table_ptrs)
240 fll_table_ptr = (u8 *)g->ops.bios.get_perf_table_ptrs(g, 240 return -EINVAL;
241 g->bios.clock_token, FLL_TABLE); 241
242 if (fll_table_ptr == NULL) { 242 fll_table_ptr = (u8 *)g->ops.bios.get_perf_table_ptrs(g,
243 status = -1; 243 g->bios.clock_token, FLL_TABLE);
244 goto done; 244 if (fll_table_ptr == NULL) {
245 } 245 status = -1;
246 goto done;
246 } 247 }
247 248
248 memcpy(&fll_desc_table_header_sz, fll_table_ptr, 249 memcpy(&fll_desc_table_header_sz, fll_table_ptr,
diff --git a/drivers/gpu/nvgpu/clk/clk_vin.c b/drivers/gpu/nvgpu/clk/clk_vin.c
index e8e4b753..649eb234 100644
--- a/drivers/gpu/nvgpu/clk/clk_vin.c
+++ b/drivers/gpu/nvgpu/clk/clk_vin.c
@@ -339,13 +339,14 @@ static u32 devinit_get_vin_device_table(struct gk20a *g,
339 339
340 gk20a_dbg_info(""); 340 gk20a_dbg_info("");
341 341
342 if (g->ops.bios.get_perf_table_ptrs) { 342 if (!g->ops.bios.get_perf_table_ptrs)
343 vin_table_ptr = (u8 *)g->ops.bios.get_perf_table_ptrs(g, 343 return -EINVAL;
344 g->bios.clock_token, VIN_TABLE); 344
345 if (vin_table_ptr == NULL) { 345 vin_table_ptr = (u8 *)g->ops.bios.get_perf_table_ptrs(g,
346 status = -1; 346 g->bios.clock_token, VIN_TABLE);
347 goto done; 347 if (vin_table_ptr == NULL) {
348 } 348 status = -1;
349 goto done;
349 } 350 }
350 351
351 memcpy(&vin_desc_table_header, vin_table_ptr, 352 memcpy(&vin_desc_table_header, vin_table_ptr,