diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/io.c | 12 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.c | 12 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mc_gk20a.c | 5 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/include/nvgpu/io.h | 1 |
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 | ||
34 | u32 nvgpu_readl(struct gk20a *g, u32 r) | 34 | u32 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 | |||
44 | u32 __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 | ||
55 | void __nvgpu_check_gpu_state(struct gk20a *g) | 55 | void __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 | ||
201 | u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev) | 201 | u32 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 | ||
41 | void nvgpu_writel(struct gk20a *g, u32 r, u32 v); | 41 | void nvgpu_writel(struct gk20a *g, u32 r, u32 v); |
42 | u32 nvgpu_readl(struct gk20a *g, u32 r); | 42 | u32 nvgpu_readl(struct gk20a *g, u32 r); |
43 | u32 __nvgpu_readl(struct gk20a *g, u32 r); | ||
43 | void nvgpu_writel_check(struct gk20a *g, u32 r, u32 v); | 44 | void nvgpu_writel_check(struct gk20a *g, u32 r, u32 v); |
44 | void nvgpu_bar1_writel(struct gk20a *g, u32 b, u32 v); | 45 | void nvgpu_bar1_writel(struct gk20a *g, u32 b, u32 v); |
45 | u32 nvgpu_bar1_readl(struct gk20a *g, u32 b); | 46 | u32 nvgpu_bar1_readl(struct gk20a *g, u32 b); |