summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2015-06-17 16:23:19 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2015-06-26 14:06:26 -0400
commit4f2d4de40d237dee858322371c2dc06e307d7c74 (patch)
treef3b8ce7390863266d0688a84b3376c61e5080a89 /drivers/gpu/nvgpu/gm20b/ltc_gm20b.c
parentc6b396729bcdb2988878ea6acd256becef3d7cd9 (diff)
gpu: nvgpu: While flushing, check only enabled L2s
When flushing L2 do not check status of L2s not present in system. Change-Id: I95703689314c146f591fea0d85b1a484fdf82cf7 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/759267 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Deepak Nibade <dnibade@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b/ltc_gm20b.c')
-rw-r--r--drivers/gpu/nvgpu/gm20b/ltc_gm20b.c51
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 */
285void gm20b_flush_ltc(struct gk20a *g) 285void 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
351static int gm20b_determine_L2_size_bytes(struct gk20a *g) 348static int gm20b_determine_L2_size_bytes(struct gk20a *g)