summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
diff options
context:
space:
mode:
authorSeema Khowala <seemaj@nvidia.com>2017-10-31 23:56:29 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-11-02 19:15:52 -0400
commitbcd78a0be617be07234e3ef4925cecaef66f2fa4 (patch)
tree44846114d13ae86de0a450268a95abf07f3aa0ba /drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
parentd73e89f984f2f6f8da4e49a0ec3bea0bfc34cde2 (diff)
nvgpu: gv11b: implement railgate/unrailgate
Implement gv11b platform specific rail gating functions by calling relevant powergate and unpowergate functions and linux clock frmework functions: gv11b_tegra_is_railgated gv11b_tegra_railgate gv11b_tegra_unrailgate These calls will take care of hot reset sequence required for gpu powergate and gpu unpowergate. Bug 200269361 Bug 200273571 Change-Id: Ib1825e4324d51fc508b3b5dc9e5e2fdb252eeff4 Signed-off-by: seshendra Gadagottu <sgadagottu@nvidia.com> Signed-off-by: Seema Khowala <seemaj@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1589509 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c')
-rw-r--r--drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c b/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
index ca346d97..95d82254 100644
--- a/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
+++ b/drivers/gpu/nvgpu/gv11b/platform_gv11b_tegra.c
@@ -28,11 +28,15 @@
28#include <linux/nvmap.h> 28#include <linux/nvmap.h>
29#include <linux/reset.h> 29#include <linux/reset.h>
30#include <linux/hashtable.h> 30#include <linux/hashtable.h>
31#include <linux/clk.h>
31#include <nvgpu/nvhost.h> 32#include <nvgpu/nvhost.h>
32#include <nvgpu/nvhost_t19x.h> 33#include <nvgpu/nvhost_t19x.h>
33 34
34#include <uapi/linux/nvgpu.h> 35#include <uapi/linux/nvgpu.h>
35 36
37#include <soc/tegra/tegra_bpmp.h>
38#include <soc/tegra/tegra_powergate.h>
39
36#include "gk20a/gk20a.h" 40#include "gk20a/gk20a.h"
37#include "common/linux/platform_gk20a.h" 41#include "common/linux/platform_gk20a.h"
38#include "common/linux/clk.h" 42#include "common/linux/clk.h"
@@ -103,18 +107,73 @@ static int gv11b_tegra_remove(struct device *dev)
103static bool gv11b_tegra_is_railgated(struct device *dev) 107static bool gv11b_tegra_is_railgated(struct device *dev)
104{ 108{
105 bool ret = false; 109 bool ret = false;
110#ifdef TEGRA194_POWER_DOMAIN_GPU
111 struct gk20a *g = get_gk20a(dev);
112
113 if (tegra_bpmp_running()) {
114 nvgpu_log(g, gpu_dbg_info, "bpmp running");
115 ret = !tegra_powergate_is_powered(TEGRA194_POWER_DOMAIN_GPU);
106 116
117 nvgpu_log(g, gpu_dbg_info, "railgated? %s", ret ? "yes" : "no");
118 } else {
119 nvgpu_log(g, gpu_dbg_info, "bpmp not running");
120 }
121#endif
107 return ret; 122 return ret;
108} 123}
109 124
110static int gv11b_tegra_railgate(struct device *dev) 125static int gv11b_tegra_railgate(struct device *dev)
111{ 126{
127#ifdef TEGRA194_POWER_DOMAIN_GPU
128 struct gk20a_platform *platform = gk20a_get_platform(dev);
129 struct gk20a *g = get_gk20a(dev);
130 int i;
131
132 if (tegra_bpmp_running()) {
133 nvgpu_log(g, gpu_dbg_info, "bpmp running");
134 if (!tegra_powergate_is_powered(TEGRA194_POWER_DOMAIN_GPU)) {
135 nvgpu_log(g, gpu_dbg_info, "powergate is not powered");
136 return 0;
137 }
138 nvgpu_log(g, gpu_dbg_info, "clk_disable_unprepare");
139 for (i = 0; i < platform->num_clks; i++) {
140 if (platform->clk[i])
141 clk_disable_unprepare(platform->clk[i]);
142 }
143 nvgpu_log(g, gpu_dbg_info, "powergate_partition");
144 tegra_powergate_partition(TEGRA194_POWER_DOMAIN_GPU);
145 } else {
146 nvgpu_log(g, gpu_dbg_info, "bpmp not running");
147 }
148#endif
112 return 0; 149 return 0;
113} 150}
114 151
115static int gv11b_tegra_unrailgate(struct device *dev) 152static int gv11b_tegra_unrailgate(struct device *dev)
116{ 153{
117 int ret = 0; 154 int ret = 0;
155#ifdef TEGRA194_POWER_DOMAIN_GPU
156 struct gk20a_platform *platform = gk20a_get_platform(dev);
157 struct gk20a *g = get_gk20a(dev);
158 int i;
159
160 if (tegra_bpmp_running()) {
161 nvgpu_log(g, gpu_dbg_info, "bpmp running");
162 ret = tegra_unpowergate_partition(TEGRA194_POWER_DOMAIN_GPU);
163 if (ret) {
164 nvgpu_log(g, gpu_dbg_info,
165 "unpowergate partition failed");
166 return ret;
167 }
168 nvgpu_log(g, gpu_dbg_info, "clk_prepare_enable");
169 for (i = 0; i < platform->num_clks; i++) {
170 if (platform->clk[i])
171 clk_prepare_enable(platform->clk[i]);
172 }
173 } else {
174 nvgpu_log(g, gpu_dbg_info, "bpmp not running");
175 }
176#endif
118 return ret; 177 return ret;
119} 178}
120 179