summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/common/linux/io.c12
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c12
-rw-r--r--drivers/gpu/nvgpu/gk20a/mc_gk20a.c5
-rw-r--r--drivers/gpu/nvgpu/include/nvgpu/io.h1
4 files changed, 24 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/io.c b/drivers/gpu/nvgpu/common/linux/io.c
index 729825e7..cde90ddd 100644
--- a/drivers/gpu/nvgpu/common/linux/io.c
+++ b/drivers/gpu/nvgpu/common/linux/io.c
@@ -33,6 +33,16 @@ void nvgpu_writel(struct gk20a *g, u32 r, u32 v)
33 33
34u32 nvgpu_readl(struct gk20a *g, u32 r) 34u32 nvgpu_readl(struct gk20a *g, u32 r)
35{ 35{
36 u32 v = __nvgpu_readl(g, r);
37
38 if (v == 0xffffffff)
39 __nvgpu_check_gpu_state(g);
40
41 return v;
42}
43
44u32 __nvgpu_readl(struct gk20a *g, u32 r)
45{
36 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g); 46 struct nvgpu_os_linux *l = nvgpu_os_linux_from_gk20a(g);
37 u32 v = 0xffffffff; 47 u32 v = 0xffffffff;
38 48
@@ -41,8 +51,6 @@ u32 nvgpu_readl(struct gk20a *g, u32 r)
41 gk20a_dbg(gpu_dbg_reg, "r=0x%x v=0x%x (failed)", r, v); 51 gk20a_dbg(gpu_dbg_reg, "r=0x%x v=0x%x (failed)", r, v);
42 } else { 52 } else {
43 v = readl(l->regs + r); 53 v = readl(l->regs + r);
44 if (v == 0xffffffff)
45 __nvgpu_check_gpu_state(g);
46 gk20a_dbg(gpu_dbg_reg, "r=0x%x v=0x%x", r, v); 54 gk20a_dbg(gpu_dbg_reg, "r=0x%x v=0x%x", r, v);
47 } 55 }
48 56
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index c72b6193..0ccc8f6c 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -54,11 +54,17 @@
54 54
55void __nvgpu_check_gpu_state(struct gk20a *g) 55void __nvgpu_check_gpu_state(struct gk20a *g)
56{ 56{
57 u32 boot_0 = g->ops.mc.boot_0(g, NULL, NULL, NULL); 57 u32 boot_0 = 0xffffffff;
58 58
59 if (!g->ops.mc.boot_0) {
60 nvgpu_err(g, "Can't determine GPU state, mc.boot_0 unset");
61 return;
62 }
63
64 boot_0 = g->ops.mc.boot_0(g, NULL, NULL, NULL);
59 if (boot_0 == 0xffffffff) { 65 if (boot_0 == 0xffffffff) {
60 pr_err("nvgpu: GPU has disappeared from bus!!\n"); 66 nvgpu_err(g, "GPU has disappeared from bus!!");
61 pr_err("nvgpu: Rebooting system!!\n"); 67 nvgpu_err(g, "Rebooting system!!");
62 kernel_restart(NULL); 68 kernel_restart(NULL);
63 } 69 }
64} 70}
diff --git a/drivers/gpu/nvgpu/gk20a/mc_gk20a.c b/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
index 9d9256bd..5027eaa4 100644
--- a/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mc_gk20a.c
@@ -200,7 +200,10 @@ void gk20a_mc_reset(struct gk20a *g, u32 units)
200 200
201u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev) 201u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev)
202{ 202{
203 u32 val = gk20a_readl(g, mc_boot_0_r()); 203 u32 val = __nvgpu_readl(g, mc_boot_0_r());
204
205 if (val == 0xffffffff)
206 return val;
204 207
205 if (arch) 208 if (arch)
206 *arch = mc_boot_0_architecture_v(val) << 209 *arch = mc_boot_0_architecture_v(val) <<
diff --git a/drivers/gpu/nvgpu/include/nvgpu/io.h b/drivers/gpu/nvgpu/include/nvgpu/io.h
index 94ae8f95..b7281b41 100644
--- a/drivers/gpu/nvgpu/include/nvgpu/io.h
+++ b/drivers/gpu/nvgpu/include/nvgpu/io.h
@@ -40,6 +40,7 @@ struct gk20a;
40 40
41void nvgpu_writel(struct gk20a *g, u32 r, u32 v); 41void nvgpu_writel(struct gk20a *g, u32 r, u32 v);
42u32 nvgpu_readl(struct gk20a *g, u32 r); 42u32 nvgpu_readl(struct gk20a *g, u32 r);
43u32 __nvgpu_readl(struct gk20a *g, u32 r);
43void nvgpu_writel_check(struct gk20a *g, u32 r, u32 v); 44void nvgpu_writel_check(struct gk20a *g, u32 r, u32 v);
44void nvgpu_bar1_writel(struct gk20a *g, u32 b, u32 v); 45void nvgpu_bar1_writel(struct gk20a *g, u32 b, u32 v);
45u32 nvgpu_bar1_readl(struct gk20a *g, u32 b); 46u32 nvgpu_bar1_readl(struct gk20a *g, u32 b);