summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/clk/clk_fll.c
diff options
context:
space:
mode:
authorTejal Kudav <tkudav@nvidia.com>2017-11-08 04:56:23 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-04-12 05:31:15 -0400
commit2114869a4084809be18a489dc44d1b8f28e66598 (patch)
treebeb0b902d0c1424a9086a3d0f6ba04dfaebf13d0 /drivers/gpu/nvgpu/clk/clk_fll.c
parent1f4bbff6e068e4b718b69bea5b9a1c3c07f5c49a (diff)
gpu: nvgpu: Update clk_fll interface as per chips_a
Two new members added to fll struct and code modified to support GV100 VBIOS NAFLL tables Add g->ops for getting vbios clk domains JIRA NVGPUGV100-39 Change-Id: Iaabea893d55d44a272e2bce2b1d525b122cd36f5 Signed-off-by: Tejal Kudav <tkudav@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1594289 Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Mahantesh Kumbar <mkumbar@nvidia.com> Tested-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/clk/clk_fll.c')
-rw-r--r--drivers/gpu/nvgpu/clk/clk_fll.c85
1 files changed, 59 insertions, 26 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk_fll.c b/drivers/gpu/nvgpu/clk/clk_fll.c
index 2f05448f..e85168e3 100644
--- a/drivers/gpu/nvgpu/clk/clk_fll.c
+++ b/drivers/gpu/nvgpu/clk/clk_fll.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"), 5 * copy of this software and associated documentation files (the "Software"),
@@ -25,6 +25,7 @@
25#include "gk20a/gk20a.h" 25#include "gk20a/gk20a.h"
26#include "clk.h" 26#include "clk.h"
27#include "clk_fll.h" 27#include "clk_fll.h"
28#include "clk_domain.h"
28#include "boardobj/boardobjgrp.h" 29#include "boardobj/boardobjgrp.h"
29#include "boardobj/boardobjgrp_e32.h" 30#include "boardobj/boardobjgrp_e32.h"
30#include "ctrl/ctrlclk.h" 31#include "ctrl/ctrlclk.h"
@@ -277,19 +278,35 @@ static u32 devinit_get_fll_device_table(struct gk20a *g,
277 278
278 fll_id = fll_desc_table_entry.fll_device_id; 279 fll_id = fll_desc_table_entry.fll_device_id;
279 280
280 pvin_dev = CLK_GET_VIN_DEVICE(pvinobjs, 281 if ( (u8)fll_desc_table_entry.vin_idx_logic != CTRL_CLK_VIN_ID_UNDEFINED) {
281 (u8)fll_desc_table_entry.vin_idx_logic); 282 pvin_dev = CLK_GET_VIN_DEVICE(pvinobjs,
282 if (pvin_dev == NULL) 283 (u8)fll_desc_table_entry.vin_idx_logic);
283 return -EINVAL; 284 if (pvin_dev == NULL)
284 285 return -EINVAL;
285 pvin_dev->flls_shared_mask |= BIT(fll_id); 286 else
286 287 pvin_dev->flls_shared_mask |= BIT(fll_id);
287 pvin_dev = CLK_GET_VIN_DEVICE(pvinobjs, 288 } else {
288 (u8)fll_desc_table_entry.vin_idx_sram); 289 /* Return if Logic ADC device index is invalid*/
289 if (pvin_dev == NULL) 290 nvgpu_err(g, "Invalid Logic ADC specified for Nafll ID");
290 return -EINVAL; 291 return -EINVAL;
292 }
291 293
292 pvin_dev->flls_shared_mask |= BIT(fll_id); 294 fll_dev_data.lut_device.vselect_mode =
295 (u8)BIOS_GET_FIELD(fll_desc_table_entry.lut_params,
296 NV_FLL_DESC_LUT_PARAMS_VSELECT);
297
298 if ( (u8)fll_desc_table_entry.vin_idx_sram != CTRL_CLK_VIN_ID_UNDEFINED) {
299 pvin_dev = CLK_GET_VIN_DEVICE(pvinobjs,
300 (u8)fll_desc_table_entry.vin_idx_sram);
301 if (pvin_dev == NULL)
302 return -EINVAL;
303 else
304 pvin_dev->flls_shared_mask |= BIT(fll_id);
305 } else {
306 /* Make sure VSELECT mode is set correctly to _LOGIC*/
307 if (fll_dev_data.lut_device.vselect_mode != CTRL_CLK_FLL_LUT_VSELECT_LOGIC)
308 return -EINVAL;
309 }
293 310
294 fll_dev_data.super.type = 311 fll_dev_data.super.type =
295 (u8)fll_desc_table_entry.fll_device_type; 312 (u8)fll_desc_table_entry.fll_device_type;
@@ -305,24 +322,17 @@ static u32 devinit_get_fll_device_table(struct gk20a *g,
305 322
306 vbios_domain = (u32)(fll_desc_table_entry.clk_domain & 323 vbios_domain = (u32)(fll_desc_table_entry.clk_domain &
307 NV_PERF_DOMAIN_4X_CLOCK_DOMAIN_MASK); 324 NV_PERF_DOMAIN_4X_CLOCK_DOMAIN_MASK);
308 if (vbios_domain == 0) 325 fll_dev_data.clk_domain =
309 fll_dev_data.clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; 326 g->ops.pmu_ver.clk.get_vbios_clk_domain(vbios_domain);
310 else if (vbios_domain == 1)
311 fll_dev_data.clk_domain = CTRL_CLK_DOMAIN_XBAR2CLK;
312 else if (vbios_domain == 3)
313 fll_dev_data.clk_domain = CTRL_CLK_DOMAIN_SYS2CLK;
314 else
315 continue;
316 327
317 fll_dev_data.rail_idx_for_lut = 0; 328 fll_dev_data.rail_idx_for_lut = 0;
318
319 fll_dev_data.vin_idx_logic = 329 fll_dev_data.vin_idx_logic =
320 (u8)fll_desc_table_entry.vin_idx_logic; 330 (u8)fll_desc_table_entry.vin_idx_logic;
321 fll_dev_data.vin_idx_sram = 331 fll_dev_data.vin_idx_sram =
322 (u8)fll_desc_table_entry.vin_idx_sram; 332 (u8)fll_desc_table_entry.vin_idx_sram;
323 fll_dev_data.lut_device.vselect_mode = 333 fll_dev_data.b_skip_pldiv_below_dvco_min =
324 (u8)BIOS_GET_FIELD(fll_desc_table_entry.lut_params, 334 (bool)BIOS_GET_FIELD(fll_desc_table_entry.fll_params,
325 NV_FLL_DESC_LUT_PARAMS_VSELECT); 335 NV_FLL_DESC_FLL_PARAMS_SKIP_PLDIV_BELOW_DVCO_MIN);
326 fll_dev_data.lut_device.hysteresis_threshold = 336 fll_dev_data.lut_device.hysteresis_threshold =
327 (u8)BIOS_GET_FIELD(fll_desc_table_entry.lut_params, 337 (u8)BIOS_GET_FIELD(fll_desc_table_entry.lut_params,
328 NV_FLL_DESC_LUT_PARAMS_HYSTERISIS_THRESHOLD); 338 NV_FLL_DESC_LUT_PARAMS_HYSTERISIS_THRESHOLD);
@@ -336,7 +346,6 @@ static u32 devinit_get_fll_device_table(struct gk20a *g,
336 346
337 status = boardobjgrp_objinsert(&pfllobjs->super.super, 347 status = boardobjgrp_objinsert(&pfllobjs->super.super,
338 (struct boardobj *)pfll_dev, index); 348 (struct boardobj *)pfll_dev, index);
339
340 fll_tbl_entry_ptr += fll_desc_table_header.entry_size; 349 fll_tbl_entry_ptr += fll_desc_table_header.entry_size;
341 } 350 }
342 351
@@ -345,6 +354,28 @@ done:
345 return status; 354 return status;
346} 355}
347 356
357u32 nvgpu_clk_get_vbios_clk_domain_gv10x( u32 vbios_domain)
358{
359 if (vbios_domain == 0)
360 return CTRL_CLK_DOMAIN_GPCCLK;
361 else if (vbios_domain == 1)
362 return CTRL_CLK_DOMAIN_XBARCLK;
363 else if (vbios_domain == 3)
364 return CTRL_CLK_DOMAIN_SYSCLK;
365 return 0;
366}
367
368u32 nvgpu_clk_get_vbios_clk_domain_gp10x( u32 vbios_domain)
369{
370 if (vbios_domain == 0)
371 return CTRL_CLK_DOMAIN_GPC2CLK;
372 else if (vbios_domain == 1)
373 return CTRL_CLK_DOMAIN_XBAR2CLK;
374 else if (vbios_domain == 3)
375 return CTRL_CLK_DOMAIN_SYS2CLK;
376 return 0;
377}
378
348static u32 lutbroadcastslaveregister(struct gk20a *g, 379static u32 lutbroadcastslaveregister(struct gk20a *g,
349 struct avfsfllobjs *pfllobjs, 380 struct avfsfllobjs *pfllobjs,
350 struct fll_device *pfll, 381 struct fll_device *pfll,
@@ -387,6 +418,8 @@ static struct fll_device *construct_fll_device(struct gk20a *g,
387 board_obj_fll_ptr->min_freq_vfe_idx = 418 board_obj_fll_ptr->min_freq_vfe_idx =
388 pfll_dev->min_freq_vfe_idx; 419 pfll_dev->min_freq_vfe_idx;
389 board_obj_fll_ptr->freq_ctrl_idx = pfll_dev->freq_ctrl_idx; 420 board_obj_fll_ptr->freq_ctrl_idx = pfll_dev->freq_ctrl_idx;
421 board_obj_fll_ptr->b_skip_pldiv_below_dvco_min =
422 pfll_dev->b_skip_pldiv_below_dvco_min;
390 memcpy(&board_obj_fll_ptr->lut_device, &pfll_dev->lut_device, 423 memcpy(&board_obj_fll_ptr->lut_device, &pfll_dev->lut_device,
391 sizeof(struct nv_pmu_clk_lut_device_desc)); 424 sizeof(struct nv_pmu_clk_lut_device_desc));
392 memcpy(&board_obj_fll_ptr->regime_desc, &pfll_dev->regime_desc, 425 memcpy(&board_obj_fll_ptr->regime_desc, &pfll_dev->regime_desc,
@@ -427,7 +460,7 @@ static u32 fll_device_init_pmudata_super(struct gk20a *g,
427 perf_pmu_data->min_freq_vfe_idx = 460 perf_pmu_data->min_freq_vfe_idx =
428 pfll_dev->min_freq_vfe_idx; 461 pfll_dev->min_freq_vfe_idx;
429 perf_pmu_data->freq_ctrl_idx = pfll_dev->freq_ctrl_idx; 462 perf_pmu_data->freq_ctrl_idx = pfll_dev->freq_ctrl_idx;
430 463 perf_pmu_data->b_skip_pldiv_below_dvco_min = pfll_dev->b_skip_pldiv_below_dvco_min;
431 memcpy(&perf_pmu_data->lut_device, &pfll_dev->lut_device, 464 memcpy(&perf_pmu_data->lut_device, &pfll_dev->lut_device,
432 sizeof(struct nv_pmu_clk_lut_device_desc)); 465 sizeof(struct nv_pmu_clk_lut_device_desc));
433 memcpy(&perf_pmu_data->regime_desc, &pfll_dev->regime_desc, 466 memcpy(&perf_pmu_data->regime_desc, &pfll_dev->regime_desc,