diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | 86 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/hw_fifo_gv11b.h | 28 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/hw_pbdma_gv11b.h | 8 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/hw_ram_gv11b.h | 30 |
4 files changed, 133 insertions, 19 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c index c6e0f0a2..0e1c1999 100644 --- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | |||
@@ -24,6 +24,9 @@ | |||
24 | #include "hw_ccsr_gv11b.h" | 24 | #include "hw_ccsr_gv11b.h" |
25 | #include "hw_usermode_gv11b.h" | 25 | #include "hw_usermode_gv11b.h" |
26 | 26 | ||
27 | #define CHANNEL_INFO_VEID0 0 | ||
28 | #define PBDMA_SUBDEVICE_ID 1 | ||
29 | |||
27 | static void gv11b_get_tsg_runlist_entry(struct tsg_gk20a *tsg, u32 *runlist) | 30 | static void gv11b_get_tsg_runlist_entry(struct tsg_gk20a *tsg, u32 *runlist) |
28 | { | 31 | { |
29 | 32 | ||
@@ -82,6 +85,88 @@ static void gv11b_get_ch_runlist_entry(struct channel_gk20a *c, u32 *runlist) | |||
82 | runlist[0], runlist[1], runlist[2], runlist[3]); | 85 | runlist[0], runlist[1], runlist[2], runlist[3]); |
83 | } | 86 | } |
84 | 87 | ||
88 | static void gv11b_userd_writeback_config(struct gk20a *g) | ||
89 | { | ||
90 | gk20a_writel(g, fifo_userd_writeback_r(), fifo_userd_writeback_timer_f( | ||
91 | fifo_userd_writeback_timer_100us_v())); | ||
92 | |||
93 | |||
94 | } | ||
95 | |||
96 | static int channel_gv11b_setup_ramfc(struct channel_gk20a *c, | ||
97 | u64 gpfifo_base, u32 gpfifo_entries, u32 flags) | ||
98 | { | ||
99 | struct gk20a *g = c->g; | ||
100 | struct mem_desc *mem = &c->inst_block; | ||
101 | u32 data; | ||
102 | |||
103 | gk20a_dbg_fn(""); | ||
104 | |||
105 | gk20a_memset(g, mem, 0, 0, ram_fc_size_val_v()); | ||
106 | |||
107 | gk20a_mem_wr32(g, mem, ram_fc_gp_base_w(), | ||
108 | pbdma_gp_base_offset_f( | ||
109 | u64_lo32(gpfifo_base >> pbdma_gp_base_rsvd_s()))); | ||
110 | |||
111 | gk20a_mem_wr32(g, mem, ram_fc_gp_base_hi_w(), | ||
112 | pbdma_gp_base_hi_offset_f(u64_hi32(gpfifo_base)) | | ||
113 | pbdma_gp_base_hi_limit2_f(ilog2(gpfifo_entries))); | ||
114 | |||
115 | gk20a_mem_wr32(g, mem, ram_fc_signature_w(), | ||
116 | c->g->ops.fifo.get_pbdma_signature(c->g)); | ||
117 | |||
118 | gk20a_mem_wr32(g, mem, ram_fc_pb_header_w(), | ||
119 | pbdma_pb_header_priv_user_f() | | ||
120 | pbdma_pb_header_method_zero_f() | | ||
121 | pbdma_pb_header_subchannel_zero_f() | | ||
122 | pbdma_pb_header_level_main_f() | | ||
123 | pbdma_pb_header_first_true_f() | | ||
124 | pbdma_pb_header_type_inc_f()); | ||
125 | |||
126 | gk20a_mem_wr32(g, mem, ram_fc_subdevice_w(), | ||
127 | pbdma_subdevice_id_f(PBDMA_SUBDEVICE_ID) | | ||
128 | pbdma_subdevice_status_active_f() | | ||
129 | pbdma_subdevice_channel_dma_enable_f()); | ||
130 | |||
131 | gk20a_mem_wr32(g, mem, ram_fc_target_w(), | ||
132 | pbdma_target_eng_ctx_valid_true_f() | | ||
133 | pbdma_target_engine_sw_f()); | ||
134 | |||
135 | gk20a_mem_wr32(g, mem, ram_fc_acquire_w(), | ||
136 | channel_gk20a_pbdma_acquire_val(c)); | ||
137 | |||
138 | gk20a_mem_wr32(g, mem, ram_fc_runlist_timeslice_w(), | ||
139 | pbdma_runlist_timeslice_timeout_128_f() | | ||
140 | pbdma_runlist_timeslice_timescale_3_f() | | ||
141 | pbdma_runlist_timeslice_enable_true_f()); | ||
142 | |||
143 | |||
144 | gk20a_mem_wr32(g, mem, ram_fc_chid_w(), ram_fc_chid_id_f(c->hw_chid)); | ||
145 | |||
146 | /* Until full subcontext is supported, always use VEID0 */ | ||
147 | gk20a_mem_wr32(g, mem, ram_fc_set_channel_info_w(), | ||
148 | pbdma_set_channel_info_scg_type_graphics_compute0_f() | | ||
149 | pbdma_set_channel_info_veid_f(CHANNEL_INFO_VEID0)); | ||
150 | |||
151 | if (c->is_privileged_channel) { | ||
152 | /* Set privilege level for channel */ | ||
153 | gk20a_mem_wr32(g, mem, ram_fc_config_w(), | ||
154 | pbdma_config_auth_level_privileged_f()); | ||
155 | |||
156 | gk20a_channel_setup_ramfc_for_privileged_channel(c); | ||
157 | } | ||
158 | |||
159 | /* Enable userd writeback */ | ||
160 | data = gk20a_mem_rd32(g, mem, ram_fc_config_w()); | ||
161 | data = data | pbdma_config_userd_writeback_enable_f(); | ||
162 | gk20a_mem_wr32(g, mem, ram_fc_config_w(),data); | ||
163 | |||
164 | gv11b_userd_writeback_config(g); | ||
165 | |||
166 | return channel_gp10b_commit_userd(c); | ||
167 | } | ||
168 | |||
169 | |||
85 | static void gv11b_ring_channel_doorbell(struct channel_gk20a *c) | 170 | static void gv11b_ring_channel_doorbell(struct channel_gk20a *c) |
86 | { | 171 | { |
87 | gk20a_dbg_info("channel ring door bell %d\n", c->hw_chid); | 172 | gk20a_dbg_info("channel ring door bell %d\n", c->hw_chid); |
@@ -131,4 +216,5 @@ void gv11b_init_fifo(struct gpu_ops *gops) | |||
131 | gops->fifo.get_num_fifos = gv11b_fifo_get_num_fifos; | 216 | gops->fifo.get_num_fifos = gv11b_fifo_get_num_fifos; |
132 | gops->fifo.userd_gp_get = gv11b_userd_gp_get; | 217 | gops->fifo.userd_gp_get = gv11b_userd_gp_get; |
133 | gops->fifo.userd_gp_put = gv11b_userd_gp_put; | 218 | gops->fifo.userd_gp_put = gv11b_userd_gp_put; |
219 | gops->fifo.setup_ramfc = channel_gv11b_setup_ramfc; | ||
134 | } | 220 | } |
diff --git a/drivers/gpu/nvgpu/gv11b/hw_fifo_gv11b.h b/drivers/gpu/nvgpu/gv11b/hw_fifo_gv11b.h index 7e9e2743..8ea2e06a 100644 --- a/drivers/gpu/nvgpu/gv11b/hw_fifo_gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/hw_fifo_gv11b.h | |||
@@ -70,6 +70,34 @@ static inline u32 fifo_bar1_base_valid_true_f(void) | |||
70 | { | 70 | { |
71 | return 0x10000000; | 71 | return 0x10000000; |
72 | } | 72 | } |
73 | static inline u32 fifo_userd_writeback_r(void) | ||
74 | { | ||
75 | return 0x0000225c; | ||
76 | } | ||
77 | static inline u32 fifo_userd_writeback_timer_f(u32 v) | ||
78 | { | ||
79 | return (v & 0xff) << 0; | ||
80 | } | ||
81 | static inline u32 fifo_userd_writeback_timer_disabled_v(void) | ||
82 | { | ||
83 | return 0x00000000; | ||
84 | } | ||
85 | static inline u32 fifo_userd_writeback_timer_shorter_v(void) | ||
86 | { | ||
87 | return 0x00000003; | ||
88 | } | ||
89 | static inline u32 fifo_userd_writeback_timer_100us_v(void) | ||
90 | { | ||
91 | return 0x00000064; | ||
92 | } | ||
93 | static inline u32 fifo_userd_writeback_timescale_f(u32 v) | ||
94 | { | ||
95 | return (v & 0xf) << 12; | ||
96 | } | ||
97 | static inline u32 fifo_userd_writeback_timescale_0_v(void) | ||
98 | { | ||
99 | return 0x00000000; | ||
100 | } | ||
73 | static inline u32 fifo_runlist_base_r(void) | 101 | static inline u32 fifo_runlist_base_r(void) |
74 | { | 102 | { |
75 | return 0x00002270; | 103 | return 0x00002270; |
diff --git a/drivers/gpu/nvgpu/gv11b/hw_pbdma_gv11b.h b/drivers/gpu/nvgpu/gv11b/hw_pbdma_gv11b.h index be8089d8..c4d3a631 100644 --- a/drivers/gpu/nvgpu/gv11b/hw_pbdma_gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/hw_pbdma_gv11b.h | |||
@@ -342,6 +342,14 @@ static inline u32 pbdma_config_auth_level_privileged_f(void) | |||
342 | { | 342 | { |
343 | return 0x100; | 343 | return 0x100; |
344 | } | 344 | } |
345 | static inline u32 pbdma_config_userd_writeback_disable_f(void) | ||
346 | { | ||
347 | return 0x0; | ||
348 | } | ||
349 | static inline u32 pbdma_config_userd_writeback_enable_f(void) | ||
350 | { | ||
351 | return 0x1000; | ||
352 | } | ||
345 | static inline u32 pbdma_userd_hi_r(u32 i) | 353 | static inline u32 pbdma_userd_hi_r(u32 i) |
346 | { | 354 | { |
347 | return 0x0004000c + i*8192; | 355 | return 0x0004000c + i*8192; |
diff --git a/drivers/gpu/nvgpu/gv11b/hw_ram_gv11b.h b/drivers/gpu/nvgpu/gv11b/hw_ram_gv11b.h index 46772ff4..11874209 100644 --- a/drivers/gpu/nvgpu/gv11b/hw_ram_gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/hw_ram_gv11b.h | |||
@@ -178,6 +178,10 @@ static inline u32 ram_in_engine_cs_fg_f(void) | |||
178 | { | 178 | { |
179 | return 0x8; | 179 | return 0x8; |
180 | } | 180 | } |
181 | static inline u32 ram_in_engine_wfi_mode_f(u32 v) | ||
182 | { | ||
183 | return (v & 0x1) << 2; | ||
184 | } | ||
181 | static inline u32 ram_in_engine_wfi_mode_w(void) | 185 | static inline u32 ram_in_engine_wfi_mode_w(void) |
182 | { | 186 | { |
183 | return 132; | 187 | return 132; |
@@ -186,17 +190,13 @@ static inline u32 ram_in_engine_wfi_mode_physical_v(void) | |||
186 | { | 190 | { |
187 | return 0x00000000; | 191 | return 0x00000000; |
188 | } | 192 | } |
189 | static inline u32 ram_in_engine_wfi_mode_physical_f(void) | ||
190 | { | ||
191 | return 0x0; | ||
192 | } | ||
193 | static inline u32 ram_in_engine_wfi_mode_virtual_v(void) | 193 | static inline u32 ram_in_engine_wfi_mode_virtual_v(void) |
194 | { | 194 | { |
195 | return 0x00000001; | 195 | return 0x00000001; |
196 | } | 196 | } |
197 | static inline u32 ram_in_engine_wfi_mode_virtual_f(void) | 197 | static inline u32 ram_in_engine_wfi_target_f(u32 v) |
198 | { | 198 | { |
199 | return 0x4; | 199 | return (v & 0x3) << 0; |
200 | } | 200 | } |
201 | static inline u32 ram_in_engine_wfi_target_w(void) | 201 | static inline u32 ram_in_engine_wfi_target_w(void) |
202 | { | 202 | { |
@@ -206,26 +206,14 @@ static inline u32 ram_in_engine_wfi_target_sys_mem_coh_v(void) | |||
206 | { | 206 | { |
207 | return 0x00000002; | 207 | return 0x00000002; |
208 | } | 208 | } |
209 | static inline u32 ram_in_engine_wfi_target_sys_mem_coh_f(void) | 209 | static inline u32 ram_in_engine_wfi_target_sys_mem_ncoh_v(void) |
210 | { | ||
211 | return 0x2; | ||
212 | } | ||
213 | static inline u32 ram_in_engine_wfi_target_sys_mem_nocoh_v(void) | ||
214 | { | 210 | { |
215 | return 0x00000003; | 211 | return 0x00000003; |
216 | } | 212 | } |
217 | static inline u32 ram_in_engine_wfi_target_sys_mem_nocoh_f(void) | ||
218 | { | ||
219 | return 0x3; | ||
220 | } | ||
221 | static inline u32 ram_in_engine_wfi_target_local_mem_v(void) | 213 | static inline u32 ram_in_engine_wfi_target_local_mem_v(void) |
222 | { | 214 | { |
223 | return 0x00000000; | 215 | return 0x00000000; |
224 | } | 216 | } |
225 | static inline u32 ram_in_engine_wfi_target_local_mem_f(void) | ||
226 | { | ||
227 | return 0x0; | ||
228 | } | ||
229 | static inline u32 ram_in_engine_wfi_ptr_lo_f(u32 v) | 217 | static inline u32 ram_in_engine_wfi_ptr_lo_f(u32 v) |
230 | { | 218 | { |
231 | return (v & 0xfffff) << 12; | 219 | return (v & 0xfffff) << 12; |
@@ -582,6 +570,10 @@ static inline u32 ram_fc_chid_id_w(void) | |||
582 | { | 570 | { |
583 | return 0; | 571 | return 0; |
584 | } | 572 | } |
573 | static inline u32 ram_fc_config_w(void) | ||
574 | { | ||
575 | return 61; | ||
576 | } | ||
585 | static inline u32 ram_fc_runlist_timeslice_w(void) | 577 | static inline u32 ram_fc_runlist_timeslice_w(void) |
586 | { | 578 | { |
587 | return 62; | 579 | return 62; |