summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2016-04-11 16:01:59 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-04-15 15:38:33 -0400
commit0e423669a4ff3f00b06d86f8ca251ef99f3671ce (patch)
tree637552c0c76d0a7a820d5cb8f359478d756e8c2a /drivers
parent7d8e2193893454bc8e05543c956fab32b8eed54b (diff)
gpu: nvgpu: Wait for BAR1 bind
Wait for BAR1 bind to complete before continuing. The register to wait exists Maxwell onwards. Change-Id: Ie3736033fdb748c5da8d7a6085ad6d63acaf41f5 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1123941
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h1
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c26
-rw-r--r--drivers/gpu/nvgpu/gm20b/hw_bus_gm20b.h52
-rw-r--r--drivers/gpu/nvgpu/gm20b/mm_gm20b.c29
4 files changed, 99 insertions, 9 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index e17392d0..61e8e641 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -475,6 +475,7 @@ struct gpu_ops {
475 void (*init_pdb)(struct gk20a *g, void *inst_ptr, u64 pdb_addr); 475 void (*init_pdb)(struct gk20a *g, void *inst_ptr, u64 pdb_addr);
476 u64 (*get_iova_addr)(struct gk20a *g, struct scatterlist *sgl, 476 u64 (*get_iova_addr)(struct gk20a *g, struct scatterlist *sgl,
477 u32 flags); 477 u32 flags);
478 int (*bar1_bind)(struct gk20a *g, u64 bar1_iova);
478 } mm; 479 } mm;
479 struct { 480 struct {
480 int (*init_therm_setup_hw)(struct gk20a *g); 481 int (*init_therm_setup_hw)(struct gk20a *g);
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index 5c3f83a6..b5ec5e25 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -493,15 +493,7 @@ int gk20a_init_mm_setup_hw(struct gk20a *g)
493 g->ops.fb.set_use_full_comp_tag_line(g); 493 g->ops.fb.set_use_full_comp_tag_line(g);
494 494
495 495
496 inst_pa = (u32)(inst_pa >> bar1_instance_block_shift_gk20a()); 496 g->ops.mm.bar1_bind(g, inst_pa);
497 gk20a_dbg_info("bar1 inst block ptr: 0x%08x", (u32)inst_pa);
498
499 gk20a_writel(g, bus_bar1_block_r(),
500 (g->mm.vidmem_is_vidmem ?
501 bus_bar1_block_target_sys_mem_ncoh_f() :
502 bus_bar1_block_target_vid_mem_f()) |
503 bus_bar1_block_mode_virtual_f() |
504 bus_bar1_block_ptr_f(inst_pa));
505 497
506 if (g->ops.mm.init_bar2_mm_hw_setup) { 498 if (g->ops.mm.init_bar2_mm_hw_setup) {
507 err = g->ops.mm.init_bar2_mm_hw_setup(g); 499 err = g->ops.mm.init_bar2_mm_hw_setup(g);
@@ -516,6 +508,21 @@ int gk20a_init_mm_setup_hw(struct gk20a *g)
516 return 0; 508 return 0;
517} 509}
518 510
511static int gk20a_mm_bar1_bind(struct gk20a *g, u64 bar1_iova)
512{
513 u64 inst_pa = (u32)(bar1_iova >> bar1_instance_block_shift_gk20a());
514 gk20a_dbg_info("bar1 inst block ptr: 0x%08x", (u32)inst_pa);
515
516 gk20a_writel(g, bus_bar1_block_r(),
517 (g->mm.vidmem_is_vidmem ?
518 bus_bar1_block_target_sys_mem_ncoh_f() :
519 bus_bar1_block_target_vid_mem_f()) |
520 bus_bar1_block_mode_virtual_f() |
521 bus_bar1_block_ptr_f(inst_pa));
522
523 return 0;
524}
525
519int gk20a_init_mm_support(struct gk20a *g) 526int gk20a_init_mm_support(struct gk20a *g)
520{ 527{
521 u32 err; 528 u32 err;
@@ -3919,4 +3926,5 @@ void gk20a_init_mm(struct gpu_ops *gops)
3919 gops->mm.get_mmu_levels = gk20a_mm_get_mmu_levels; 3926 gops->mm.get_mmu_levels = gk20a_mm_get_mmu_levels;
3920 gops->mm.init_pdb = gk20a_mm_init_pdb; 3927 gops->mm.init_pdb = gk20a_mm_init_pdb;
3921 gops->mm.init_mm_setup_hw = gk20a_init_mm_setup_hw; 3928 gops->mm.init_mm_setup_hw = gk20a_init_mm_setup_hw;
3929 gops->mm.bar1_bind = gk20a_mm_bar1_bind;
3922} 3930}
diff --git a/drivers/gpu/nvgpu/gm20b/hw_bus_gm20b.h b/drivers/gpu/nvgpu/gm20b/hw_bus_gm20b.h
index 6e412e17..e69275e0 100644
--- a/drivers/gpu/nvgpu/gm20b/hw_bus_gm20b.h
+++ b/drivers/gpu/nvgpu/gm20b/hw_bus_gm20b.h
@@ -106,6 +106,58 @@ static inline u32 bus_bar2_block_ptr_shift_v(void)
106{ 106{
107 return 0x0000000c; 107 return 0x0000000c;
108} 108}
109static inline u32 bus_bind_status_r(void)
110{
111 return 0x00001710;
112}
113static inline u32 bus_bind_status_bar1_pending_v(u32 r)
114{
115 return (r >> 0) & 0x1;
116}
117static inline u32 bus_bind_status_bar1_pending_empty_f(void)
118{
119 return 0x0;
120}
121static inline u32 bus_bind_status_bar1_pending_busy_f(void)
122{
123 return 0x1;
124}
125static inline u32 bus_bind_status_bar1_outstanding_v(u32 r)
126{
127 return (r >> 1) & 0x1;
128}
129static inline u32 bus_bind_status_bar1_outstanding_false_f(void)
130{
131 return 0x0;
132}
133static inline u32 bus_bind_status_bar1_outstanding_true_f(void)
134{
135 return 0x2;
136}
137static inline u32 bus_bind_status_bar2_pending_v(u32 r)
138{
139 return (r >> 2) & 0x1;
140}
141static inline u32 bus_bind_status_bar2_pending_empty_f(void)
142{
143 return 0x0;
144}
145static inline u32 bus_bind_status_bar2_pending_busy_f(void)
146{
147 return 0x4;
148}
149static inline u32 bus_bind_status_bar2_outstanding_v(u32 r)
150{
151 return (r >> 3) & 0x1;
152}
153static inline u32 bus_bind_status_bar2_outstanding_false_f(void)
154{
155 return 0x0;
156}
157static inline u32 bus_bind_status_bar2_outstanding_true_f(void)
158{
159 return 0x8;
160}
109static inline u32 bus_intr_0_r(void) 161static inline u32 bus_intr_0_r(void)
110{ 162{
111 return 0x00001100; 163 return 0x00001100;
diff --git a/drivers/gpu/nvgpu/gm20b/mm_gm20b.c b/drivers/gpu/nvgpu/gm20b/mm_gm20b.c
index 7bc19972..ac73b5c8 100644
--- a/drivers/gpu/nvgpu/gm20b/mm_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/mm_gm20b.c
@@ -14,12 +14,14 @@
14 */ 14 */
15 15
16#include <linux/pm_runtime.h> 16#include <linux/pm_runtime.h>
17#include <linux/delay.h>
17#include "gk20a/gk20a.h" 18#include "gk20a/gk20a.h"
18#include "mm_gm20b.h" 19#include "mm_gm20b.h"
19#include "hw_gmmu_gm20b.h" 20#include "hw_gmmu_gm20b.h"
20#include "hw_fb_gm20b.h" 21#include "hw_fb_gm20b.h"
21#include "hw_gr_gm20b.h" 22#include "hw_gr_gm20b.h"
22#include "hw_ram_gm20b.h" 23#include "hw_ram_gm20b.h"
24#include "hw_bus_gm20b.h"
23 25
24static int gm20b_mm_mmu_vpr_info_fetch_wait(struct gk20a *g, 26static int gm20b_mm_mmu_vpr_info_fetch_wait(struct gk20a *g,
25 const unsigned int msec) 27 const unsigned int msec)
@@ -133,6 +135,32 @@ static bool gm20b_mm_support_sparse(struct gk20a *g)
133 return true; 135 return true;
134} 136}
135 137
138static int gm20b_mm_bar1_bind(struct gk20a *g, u64 bar1_iova)
139{
140 int retry = 1000;
141 u64 inst_pa = (u32)(bar1_iova >> bar1_instance_block_shift_gk20a());
142 gk20a_dbg_info("bar1 inst block ptr: 0x%08x", (u32)inst_pa);
143
144 gk20a_writel(g, bus_bar1_block_r(),
145 (g->mm.vidmem_is_vidmem ?
146 bus_bar1_block_target_sys_mem_ncoh_f() :
147 bus_bar1_block_target_vid_mem_f()) |
148 bus_bar1_block_mode_virtual_f() |
149 bus_bar1_block_ptr_f(inst_pa));
150 do {
151 u32 val = gk20a_readl(g, bus_bind_status_r());
152 u32 pending = bus_bind_status_bar1_pending_v(val);
153 u32 outstanding = bus_bind_status_bar1_outstanding_v(val);
154 if (!pending && !outstanding)
155 break;
156
157 udelay(5);
158 retry--;
159 } while (retry >= 0 || !tegra_platform_is_silicon());
160
161 return retry ? -EINVAL : 0;
162}
163
136void gm20b_init_mm(struct gpu_ops *gops) 164void gm20b_init_mm(struct gpu_ops *gops)
137{ 165{
138 gops->mm.support_sparse = gm20b_mm_support_sparse; 166 gops->mm.support_sparse = gm20b_mm_support_sparse;
@@ -155,4 +183,5 @@ void gm20b_init_mm(struct gpu_ops *gops)
155 gops->mm.get_mmu_levels = gk20a_mm_get_mmu_levels; 183 gops->mm.get_mmu_levels = gk20a_mm_get_mmu_levels;
156 gops->mm.init_pdb = gk20a_mm_init_pdb; 184 gops->mm.init_pdb = gk20a_mm_init_pdb;
157 gops->mm.init_mm_setup_hw = gk20a_init_mm_setup_hw; 185 gops->mm.init_mm_setup_hw = gk20a_init_mm_setup_hw;
186 gops->mm.bar1_bind = gm20b_mm_bar1_bind;
158} 187}