diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index b90574e05..948bb69fd 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -27,7 +27,6 @@ #include #include -#include "scale.h" #include "gk20a/gk20a.h" #include "platform_gk20a.h" #include "module.h" @@ -226,11 +225,6 @@ int nvgpu_probe(struct gk20a *g, if (err) return err; - - /* Initialise scaling */ - if (IS_ENABLED(CONFIG_GK20A_DEVFREQ)) - gk20a_scale_init(dev); - if (platform->late_probe) { err = platform->late_probe(dev); if (err) { diff --git a/drivers/gpu/nvgpu/common/linux/module.c b/drivers/gpu/nvgpu/common/linux/module.c index d22455ff5..b0cad0ce6 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) if (err) goto done; + /* Initialise scaling: it will initialize scaling drive only once */ + if (IS_ENABLED(CONFIG_GK20A_DEVFREQ)) { + gk20a_scale_init(dev); + if (platform->initscale) + platform->initscale(dev); + } + trace_gk20a_finalize_poweron_done(dev_name(dev)); 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 b0c089e6f..60e71a74f 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 { /* Called to register GPCPLL with common clk framework */ int (*clk_register)(struct gk20a *g); + /* platform specific scale init quirks */ + void (*initscale)(struct device *dev); + /* Postscale callback is called after frequency change */ void (*postscale)(struct device *dev, 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 c40eafe47..db30fff22 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 @@ /* * GK20A Tegra Platform Interface * - * Copyright (c) 2014-2017, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -592,6 +592,9 @@ static void gk20a_tegra_scale_init(struct device *dev) if (!profile) return; + if (profile->private_data) + return; + emc_params = nvgpu_kzalloc(platform->g, sizeof(*emc_params)); if (!emc_params) return; @@ -850,9 +853,6 @@ static int gk20a_tegra_late_probe(struct device *dev) /* Cause early VPR resize */ gk20a_tegra_secure_page_alloc(dev); - /* Initialise tegra specific scaling quirks */ - gk20a_tegra_scale_init(dev); - return 0; } @@ -958,6 +958,7 @@ struct gk20a_platform gm20b_tegra_platform = { #endif /* frequency scaling configuration */ + .initscale = gk20a_tegra_scale_init, .prescale = gk20a_tegra_prescale, #ifdef CONFIG_TEGRA_BWMGR .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 00cbe48e2..36052ee38 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) if (!profile) return; + if ((struct tegra_bwmgr_client *)profile->private_data) + return; + bwmgr_handle = tegra_bwmgr_register(TEGRA_BWMGR_CLIENT_GPU); if (!bwmgr_handle) return; @@ -157,8 +160,6 @@ static int gp10b_tegra_late_probe(struct device *dev) /* Cause early VPR resize */ gk20a_tegra_secure_page_alloc(dev); - /* Initialise tegra specific scaling quirks */ - gp10b_tegra_scale_init(dev); return 0; } @@ -405,6 +406,7 @@ struct gk20a_platform gp10b_tegra_platform = { .get_clk_freqs = gp10b_clk_get_freqs, /* frequency scaling configuration */ + .initscale = gp10b_tegra_scale_init, .prescale = gp10b_tegra_prescale, .postscale = gp10b_tegra_postscale, .devfreq_governor = "nvhost_podgov",