diff options
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk.c | 33 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk_mclk.c | 6 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk_mclk.h | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/pstate/pstate.c | 32 |
4 files changed, 66 insertions, 8 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 | ||
diff --git a/drivers/gpu/nvgpu/clk/clk_mclk.c b/drivers/gpu/nvgpu/clk/clk_mclk.c index b63fab1e..7b15767b 100644 --- a/drivers/gpu/nvgpu/clk/clk_mclk.c +++ b/drivers/gpu/nvgpu/clk/clk_mclk.c | |||
@@ -23,10 +23,6 @@ | |||
23 | 23 | ||
24 | #define VREG_COUNT 24 | 24 | #define VREG_COUNT 24 |
25 | 25 | ||
26 | #define DEFAULT_BOOT_MCLK_SPEED gk20a_mclk_high_speed | ||
27 | #define MCLK_LOW_SPEED_LIMIT 405 | ||
28 | #define MCLK_MID_SPEED_LIMIT 810 | ||
29 | |||
30 | struct memory_link_training_pattern { | 26 | struct memory_link_training_pattern { |
31 | u32 regaddr; | 27 | u32 regaddr; |
32 | u32 writeval; | 28 | u32 writeval; |
@@ -2220,7 +2216,7 @@ int clk_mclkseq_init_mclk_gddr5(struct gk20a *g) | |||
2220 | 2216 | ||
2221 | mclk->init = true; | 2217 | mclk->init = true; |
2222 | 2218 | ||
2223 | return mclk->change(g, DEFAULT_BOOT_MCLK_SPEED); | 2219 | return 0; |
2224 | } | 2220 | } |
2225 | 2221 | ||
2226 | int clk_mclkseq_change_mclk_gddr5(struct gk20a *g, enum gk20a_mclk_speed speed) | 2222 | int clk_mclkseq_change_mclk_gddr5(struct gk20a *g, enum gk20a_mclk_speed speed) |
diff --git a/drivers/gpu/nvgpu/clk/clk_mclk.h b/drivers/gpu/nvgpu/clk/clk_mclk.h index edb7eb78..9d193c96 100644 --- a/drivers/gpu/nvgpu/clk/clk_mclk.h +++ b/drivers/gpu/nvgpu/clk/clk_mclk.h | |||
@@ -22,6 +22,9 @@ enum gk20a_mclk_speed { | |||
22 | gk20a_mclk_high_speed, | 22 | gk20a_mclk_high_speed, |
23 | }; | 23 | }; |
24 | 24 | ||
25 | #define DEFAULT_BOOT_MCLK_SPEED gk20a_mclk_high_speed | ||
26 | #define MCLK_LOW_SPEED_LIMIT 405 | ||
27 | #define MCLK_MID_SPEED_LIMIT 810 | ||
25 | struct clk_mclk_state { | 28 | struct clk_mclk_state { |
26 | enum gk20a_mclk_speed speed; | 29 | enum gk20a_mclk_speed speed; |
27 | struct mutex mclk_mutex; | 30 | struct mutex mclk_mutex; |
diff --git a/drivers/gpu/nvgpu/pstate/pstate.c b/drivers/gpu/nvgpu/pstate/pstate.c index f4cc50ab..a4787f35 100644 --- a/drivers/gpu/nvgpu/pstate/pstate.c +++ b/drivers/gpu/nvgpu/pstate/pstate.c | |||
@@ -29,6 +29,18 @@ int gk20a_init_pstate_support(struct gk20a *g) | |||
29 | 29 | ||
30 | gk20a_dbg_fn(""); | 30 | gk20a_dbg_fn(""); |
31 | 31 | ||
32 | err = volt_rail_sw_setup(g); | ||
33 | if (err) | ||
34 | return err; | ||
35 | |||
36 | err = volt_dev_sw_setup(g); | ||
37 | if (err) | ||
38 | return err; | ||
39 | |||
40 | err = volt_policy_sw_setup(g); | ||
41 | if (err) | ||
42 | return err; | ||
43 | |||
32 | err = clk_vin_sw_setup(g); | 44 | err = clk_vin_sw_setup(g); |
33 | if (err) | 45 | if (err) |
34 | return err; | 46 | return err; |
@@ -72,6 +84,26 @@ int gk20a_init_pstate_pmu_support(struct gk20a *g) | |||
72 | 84 | ||
73 | gk20a_dbg_fn(""); | 85 | gk20a_dbg_fn(""); |
74 | 86 | ||
87 | err = volt_rail_pmu_setup(g); | ||
88 | if (err) | ||
89 | return err; | ||
90 | |||
91 | err = volt_dev_pmu_setup(g); | ||
92 | if (err) | ||
93 | return err; | ||
94 | |||
95 | err = volt_policy_pmu_setup(g); | ||
96 | if (err) | ||
97 | return err; | ||
98 | |||
99 | err = volt_pmu_send_load_cmd_to_pmu(g); | ||
100 | if (err) { | ||
101 | gk20a_err(dev_from_gk20a(g), | ||
102 | "Failed to send VOLT LOAD CMD to PMU: status = 0x%08x.", | ||
103 | err); | ||
104 | return err; | ||
105 | } | ||
106 | |||
75 | err = vfe_var_pmu_setup(g); | 107 | err = vfe_var_pmu_setup(g); |
76 | if (err) | 108 | if (err) |
77 | return err; | 109 | return err; |