diff options
author | seshendra Gadagottu <sgadagottu@nvidia.com> | 2018-01-23 16:12:04 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-01-31 17:21:56 -0500 |
commit | 9afb084055e77622d1e3faa6099c340d00f94968 (patch) | |
tree | dc16c443755c00e6fead2c63a891452ab3d1fc04 /drivers/gpu/nvgpu/common | |
parent | 791ce6bd5480a8393c12be55e8afa459cb4dd1ff (diff) |
gpu: nvgpu: enable devfreq after finalize poweron
Enabling gpu scaling driver after finalize poweron,
will make gpu booting happen at initially set
frequency(1GHz).
Also doing platform specific init scale after enabling
scaling driver.
Bug 2049965
Bug 2039013
Bug 200377508
Change-Id: I633f8f5a25d9de18cbb3a022913b8b725ccd87e5
Signed-off-by: seshendra Gadagottu <sgadagottu@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1644703
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common')
5 files changed, 20 insertions, 13 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index b90574e0..948bb69f 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.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 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -27,7 +27,6 @@ | |||
27 | #include <nvgpu/debug.h> | 27 | #include <nvgpu/debug.h> |
28 | #include <nvgpu/sizes.h> | 28 | #include <nvgpu/sizes.h> |
29 | 29 | ||
30 | #include "scale.h" | ||
31 | #include "gk20a/gk20a.h" | 30 | #include "gk20a/gk20a.h" |
32 | #include "platform_gk20a.h" | 31 | #include "platform_gk20a.h" |
33 | #include "module.h" | 32 | #include "module.h" |
@@ -226,11 +225,6 @@ int nvgpu_probe(struct gk20a *g, | |||
226 | if (err) | 225 | if (err) |
227 | return err; | 226 | return err; |
228 | 227 | ||
229 | |||
230 | /* Initialise scaling */ | ||
231 | if (IS_ENABLED(CONFIG_GK20A_DEVFREQ)) | ||
232 | gk20a_scale_init(dev); | ||
233 | |||
234 | if (platform->late_probe) { | 228 | if (platform->late_probe) { |
235 | err = platform->late_probe(dev); | 229 | err = platform->late_probe(dev); |
236 | if (err) { | 230 | if (err) { |
diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index d22455ff..b0cad0ce 100644 --- a/drivers/gpu/nvgpu/common/linux/module.c +++ b/drivers/gpu/nvgpu/common/linux/module.c | |||
@@ -264,6 +264,13 @@ int gk20a_pm_finalize_poweron(struct device *dev) | |||
264 | if (err) | 264 | if (err) |
265 | goto done; | 265 | goto done; |
266 | 266 | ||
267 | /* Initialise scaling: it will initialize scaling drive only once */ | ||
268 | if (IS_ENABLED(CONFIG_GK20A_DEVFREQ)) { | ||
269 | gk20a_scale_init(dev); | ||
270 | if (platform->initscale) | ||
271 | platform->initscale(dev); | ||
272 | } | ||
273 | |||
267 | trace_gk20a_finalize_poweron_done(dev_name(dev)); | 274 | trace_gk20a_finalize_poweron_done(dev_name(dev)); |
268 | 275 | ||
269 | err = nvgpu_init_os_linux_ops(l); | 276 | err = nvgpu_init_os_linux_ops(l); |
diff --git a/drivers/gpu/nvgpu/common/linux/platform_gk20a.h b/drivers/gpu/nvgpu/common/linux/platform_gk20a.h index b0c089e6..60e71a74 100644 --- a/drivers/gpu/nvgpu/common/linux/platform_gk20a.h +++ b/drivers/gpu/nvgpu/common/linux/platform_gk20a.h | |||
@@ -177,6 +177,9 @@ struct gk20a_platform { | |||
177 | /* Called to register GPCPLL with common clk framework */ | 177 | /* Called to register GPCPLL with common clk framework */ |
178 | int (*clk_register)(struct gk20a *g); | 178 | int (*clk_register)(struct gk20a *g); |
179 | 179 | ||
180 | /* platform specific scale init quirks */ | ||
181 | void (*initscale)(struct device *dev); | ||
182 | |||
180 | /* Postscale callback is called after frequency change */ | 183 | /* Postscale callback is called after frequency change */ |
181 | void (*postscale)(struct device *dev, | 184 | void (*postscale)(struct device *dev, |
182 | unsigned long freq); | 185 | unsigned long freq); |
diff --git a/drivers/gpu/nvgpu/common/linux/platform_gk20a_tegra.c b/drivers/gpu/nvgpu/common/linux/platform_gk20a_tegra.c index c40eafe4..db30fff2 100644 --- a/drivers/gpu/nvgpu/common/linux/platform_gk20a_tegra.c +++ b/drivers/gpu/nvgpu/common/linux/platform_gk20a_tegra.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * GK20A Tegra Platform Interface | 2 | * GK20A Tegra Platform Interface |
3 | * | 3 | * |
4 | * Copyright (c) 2014-2017, NVIDIA CORPORATION. All rights reserved. | 4 | * Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms and conditions of the GNU General Public License, | 7 | * under the terms and conditions of the GNU General Public License, |
@@ -592,6 +592,9 @@ static void gk20a_tegra_scale_init(struct device *dev) | |||
592 | if (!profile) | 592 | if (!profile) |
593 | return; | 593 | return; |
594 | 594 | ||
595 | if (profile->private_data) | ||
596 | return; | ||
597 | |||
595 | emc_params = nvgpu_kzalloc(platform->g, sizeof(*emc_params)); | 598 | emc_params = nvgpu_kzalloc(platform->g, sizeof(*emc_params)); |
596 | if (!emc_params) | 599 | if (!emc_params) |
597 | return; | 600 | return; |
@@ -850,9 +853,6 @@ static int gk20a_tegra_late_probe(struct device *dev) | |||
850 | /* Cause early VPR resize */ | 853 | /* Cause early VPR resize */ |
851 | gk20a_tegra_secure_page_alloc(dev); | 854 | gk20a_tegra_secure_page_alloc(dev); |
852 | 855 | ||
853 | /* Initialise tegra specific scaling quirks */ | ||
854 | gk20a_tegra_scale_init(dev); | ||
855 | |||
856 | return 0; | 856 | return 0; |
857 | } | 857 | } |
858 | 858 | ||
@@ -958,6 +958,7 @@ struct gk20a_platform gm20b_tegra_platform = { | |||
958 | #endif | 958 | #endif |
959 | 959 | ||
960 | /* frequency scaling configuration */ | 960 | /* frequency scaling configuration */ |
961 | .initscale = gk20a_tegra_scale_init, | ||
961 | .prescale = gk20a_tegra_prescale, | 962 | .prescale = gk20a_tegra_prescale, |
962 | #ifdef CONFIG_TEGRA_BWMGR | 963 | #ifdef CONFIG_TEGRA_BWMGR |
963 | .postscale = gm20b_tegra_postscale, | 964 | .postscale = gm20b_tegra_postscale, |
diff --git a/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c b/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c index 00cbe48e..36052ee3 100644 --- a/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c +++ b/drivers/gpu/nvgpu/common/linux/platform_gp10b_tegra.c | |||
@@ -106,6 +106,9 @@ static void gp10b_tegra_scale_init(struct device *dev) | |||
106 | if (!profile) | 106 | if (!profile) |
107 | return; | 107 | return; |
108 | 108 | ||
109 | if ((struct tegra_bwmgr_client *)profile->private_data) | ||
110 | return; | ||
111 | |||
109 | bwmgr_handle = tegra_bwmgr_register(TEGRA_BWMGR_CLIENT_GPU); | 112 | bwmgr_handle = tegra_bwmgr_register(TEGRA_BWMGR_CLIENT_GPU); |
110 | if (!bwmgr_handle) | 113 | if (!bwmgr_handle) |
111 | return; | 114 | return; |
@@ -157,8 +160,6 @@ static int gp10b_tegra_late_probe(struct device *dev) | |||
157 | /* Cause early VPR resize */ | 160 | /* Cause early VPR resize */ |
158 | gk20a_tegra_secure_page_alloc(dev); | 161 | gk20a_tegra_secure_page_alloc(dev); |
159 | 162 | ||
160 | /* Initialise tegra specific scaling quirks */ | ||
161 | gp10b_tegra_scale_init(dev); | ||
162 | return 0; | 163 | return 0; |
163 | } | 164 | } |
164 | 165 | ||
@@ -405,6 +406,7 @@ struct gk20a_platform gp10b_tegra_platform = { | |||
405 | .get_clk_freqs = gp10b_clk_get_freqs, | 406 | .get_clk_freqs = gp10b_clk_get_freqs, |
406 | 407 | ||
407 | /* frequency scaling configuration */ | 408 | /* frequency scaling configuration */ |
409 | .initscale = gp10b_tegra_scale_init, | ||
408 | .prescale = gp10b_tegra_prescale, | 410 | .prescale = gp10b_tegra_prescale, |
409 | .postscale = gp10b_tegra_postscale, | 411 | .postscale = gp10b_tegra_postscale, |
410 | .devfreq_governor = "nvhost_podgov", | 412 | .devfreq_governor = "nvhost_podgov", |