diff options
author | Mahantesh Kumbar <mkumbar@nvidia.com> | 2016-09-21 05:32:59 -0400 |
---|---|---|
committer | Deepak Nibade <dnibade@nvidia.com> | 2016-12-27 04:56:50 -0500 |
commit | 741d78ec45f6c48348743617ba5ae7163c95e49a (patch) | |
tree | af51c25cd2ccae6ced16710d80209e35181b3b8f /drivers/gpu/nvgpu/clk/clk.c | |
parent | 173bdefc92e2e4ef8f1e7e6ead7f86e746bee935 (diff) |
gpu: nvgpu: construct/load tabels & set voltage
- Read voltage tables from VBIOS & construct
then send to PMU.
- compare & set voltage based on
mclk/gpc2clk clk, take higher voltage
between two & set.
JIRA DNVGPU-122
Change-Id: I23e7b101a3b1c1b6596620fc6b8319c70bd9a488
Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com>
Reviewed-on: http://git-master/r/1224365
(cherry picked from commit e0055c3ec798b8312df3fa9bf92bde8c57c6f58c)
Reviewed-on: http://git-master/r/1244657
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/clk/clk.c')
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk.c b/drivers/gpu/nvgpu/clk/clk.c index 918cd43c..ce071018 100644 --- a/drivers/gpu/nvgpu/clk/clk.c +++ b/drivers/gpu/nvgpu/clk/clk.c | |||
@@ -17,8 +17,12 @@ | |||
17 | #include "pmuif/gpmuifvolt.h" | 17 | #include "pmuif/gpmuifvolt.h" |
18 | #include "ctrl/ctrlclk.h" | 18 | #include "ctrl/ctrlclk.h" |
19 | #include "ctrl/ctrlvolt.h" | 19 | #include "ctrl/ctrlvolt.h" |
20 | #include "volt/volt.h" | ||
20 | #include "gk20a/pmu_gk20a.h" | 21 | #include "gk20a/pmu_gk20a.h" |
21 | 22 | ||
23 | #define BOOT_GPC2CLK_MHZ 2581 | ||
24 | #define BOOT_MCLK_MHZ 3003 | ||
25 | |||
22 | struct clkrpc_pmucmdhandler_params { | 26 | struct clkrpc_pmucmdhandler_params { |
23 | struct nv_pmu_clk_rpc *prpccall; | 27 | struct nv_pmu_clk_rpc *prpccall; |
24 | u32 success; | 28 | u32 success; |
@@ -382,15 +386,38 @@ int clk_set_boot_fll_clk(struct gk20a *g) | |||
382 | { | 386 | { |
383 | int status; | 387 | int status; |
384 | struct change_fll_clk bootfllclk; | 388 | struct change_fll_clk bootfllclk; |
389 | u16 gpc2clk_clkmhz = BOOT_GPC2CLK_MHZ; | ||
390 | u32 gpc2clk_voltuv = 0; | ||
391 | u16 mclk_clkmhz = BOOT_MCLK_MHZ; | ||
392 | u32 mclk_voltuv = 0; | ||
393 | u32 voltuv = 0; | ||
385 | 394 | ||
386 | mutex_init(&g->clk_pmu.changeclkmutex); | 395 | mutex_init(&g->clk_pmu.changeclkmutex); |
387 | 396 | ||
397 | clk_domain_get_f_or_v(g, CTRL_CLK_DOMAIN_GPC2CLK, &gpc2clk_clkmhz, | ||
398 | &gpc2clk_voltuv); | ||
399 | clk_domain_get_f_or_v(g, CTRL_CLK_DOMAIN_MCLK, &mclk_clkmhz, | ||
400 | &mclk_voltuv); | ||
401 | |||
402 | voltuv = ((gpc2clk_voltuv) > (mclk_voltuv)) ? (gpc2clk_voltuv) | ||
403 | : (mclk_voltuv); | ||
404 | |||
405 | status = volt_set_voltage(g, voltuv, voltuv); | ||
406 | if (status) | ||
407 | gk20a_err(dev_from_gk20a(g), "attempt to set boot voltage failed %d", | ||
408 | voltuv); | ||
409 | |||
388 | bootfllclk.api_clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; | 410 | bootfllclk.api_clk_domain = CTRL_CLK_DOMAIN_GPC2CLK; |
389 | bootfllclk.clkmhz = 2581; | 411 | bootfllclk.clkmhz = gpc2clk_clkmhz; |
390 | bootfllclk.voltuv = 825000; | 412 | bootfllclk.voltuv = voltuv; |
391 | status = clk_program_fllclks(g, &bootfllclk); | 413 | status = clk_program_fllclks(g, &bootfllclk); |
392 | if (status) | 414 | if (status) |
393 | gk20a_err(dev_from_gk20a(g), "attemp to set boot clk failed"); | 415 | gk20a_err(dev_from_gk20a(g), "attempt to set boot gpc2clk failed"); |
416 | |||
417 | status = g->clk_pmu.clk_mclk.change(g, DEFAULT_BOOT_MCLK_SPEED); | ||
418 | if (status) | ||
419 | gk20a_err(dev_from_gk20a(g), "attempt to set boot mclk failed"); | ||
420 | |||
394 | return status; | 421 | return status; |
395 | } | 422 | } |
396 | 423 | ||