diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c index bc904ef3..9c250a7d 100644 --- a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | |||
@@ -284,8 +284,8 @@ u32 gm20b_ltc_cbc_fix_config(struct gk20a *g, int base) | |||
284 | */ | 284 | */ |
285 | void gm20b_flush_ltc(struct gk20a *g) | 285 | void gm20b_flush_ltc(struct gk20a *g) |
286 | { | 286 | { |
287 | u32 op_pending; | ||
288 | unsigned long timeout; | 287 | unsigned long timeout; |
288 | int ltc; | ||
289 | 289 | ||
290 | #define __timeout_init() \ | 290 | #define __timeout_init() \ |
291 | do { \ | 291 | do { \ |
@@ -310,19 +310,18 @@ void gm20b_flush_ltc(struct gk20a *g) | |||
310 | ltc_ltcs_ltss_tstg_cmgmt1_clean_evict_first_class_true_f()); | 310 | ltc_ltcs_ltss_tstg_cmgmt1_clean_evict_first_class_true_f()); |
311 | 311 | ||
312 | /* Wait on each LTC individually. */ | 312 | /* Wait on each LTC individually. */ |
313 | __timeout_init(); | 313 | for (ltc = 0; ltc < g->ltc_count; ltc++) { |
314 | do { | 314 | u32 op_pending; |
315 | op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt1_r()); | 315 | |
316 | __timeout_check(); | 316 | __timeout_init(); |
317 | } while (op_pending & | 317 | do { |
318 | ltc_ltc0_ltss_tstg_cmgmt1_clean_pending_f()); | 318 | int cmgmt1 = ltc_ltc0_ltss_tstg_cmgmt1_r() + |
319 | 319 | ltc * proj_ltc_stride_v(); | |
320 | __timeout_init(); | 320 | op_pending = gk20a_readl(g, cmgmt1); |
321 | do { | 321 | __timeout_check(); |
322 | op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt1_r()); | 322 | } while (op_pending & |
323 | __timeout_check(); | 323 | ltc_ltc0_ltss_tstg_cmgmt1_clean_pending_f()); |
324 | } while (op_pending & | 324 | } |
325 | ltc_ltc1_ltss_tstg_cmgmt1_clean_pending_f()); | ||
326 | 325 | ||
327 | /* And invalidate. */ | 326 | /* And invalidate. */ |
328 | gk20a_writel(g, ltc_ltcs_ltss_tstg_cmgmt0_r(), | 327 | gk20a_writel(g, ltc_ltcs_ltss_tstg_cmgmt0_r(), |
@@ -333,19 +332,17 @@ void gm20b_flush_ltc(struct gk20a *g) | |||
333 | ltc_ltcs_ltss_tstg_cmgmt0_invalidate_evict_first_class_true_f()); | 332 | ltc_ltcs_ltss_tstg_cmgmt0_invalidate_evict_first_class_true_f()); |
334 | 333 | ||
335 | /* Wait on each LTC individually. */ | 334 | /* Wait on each LTC individually. */ |
336 | __timeout_init(); | 335 | for (ltc = 0; ltc < g->ltc_count; ltc++) { |
337 | do { | 336 | u32 op_pending; |
338 | op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt0_r()); | 337 | __timeout_init(); |
339 | __timeout_check(); | 338 | do { |
340 | } while (op_pending & | 339 | int cmgmt0 = ltc_ltc0_ltss_tstg_cmgmt0_r() + |
341 | ltc_ltc0_ltss_tstg_cmgmt0_invalidate_pending_f()); | 340 | ltc * proj_ltc_stride_v(); |
342 | 341 | op_pending = gk20a_readl(g, cmgmt0); | |
343 | __timeout_init(); | 342 | __timeout_check(); |
344 | do { | 343 | } while (op_pending & |
345 | op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt0_r()); | 344 | ltc_ltc0_ltss_tstg_cmgmt0_invalidate_pending_f()); |
346 | __timeout_check(); | 345 | } |
347 | } while (op_pending & | ||
348 | ltc_ltc1_ltss_tstg_cmgmt0_invalidate_pending_f()); | ||
349 | } | 346 | } |
350 | 347 | ||
351 | static int gm20b_determine_L2_size_bytes(struct gk20a *g) | 348 | static int gm20b_determine_L2_size_bytes(struct gk20a *g) |