From 4f2d4de40d237dee858322371c2dc06e307d7c74 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Wed, 17 Jun 2015 13:23:19 -0700 Subject: 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 Reviewed-on: http://git-master/r/759267 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Deepak Nibade --- drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | 51 +++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 27 deletions(-) (limited to 'drivers/gpu/nvgpu/gm20b/ltc_gm20b.c') 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) */ void gm20b_flush_ltc(struct gk20a *g) { - u32 op_pending; unsigned long timeout; + int ltc; #define __timeout_init() \ do { \ @@ -310,19 +310,18 @@ void gm20b_flush_ltc(struct gk20a *g) ltc_ltcs_ltss_tstg_cmgmt1_clean_evict_first_class_true_f()); /* Wait on each LTC individually. */ - __timeout_init(); - do { - op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt1_r()); - __timeout_check(); - } while (op_pending & - ltc_ltc0_ltss_tstg_cmgmt1_clean_pending_f()); - - __timeout_init(); - do { - op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt1_r()); - __timeout_check(); - } while (op_pending & - ltc_ltc1_ltss_tstg_cmgmt1_clean_pending_f()); + for (ltc = 0; ltc < g->ltc_count; ltc++) { + u32 op_pending; + + __timeout_init(); + do { + int cmgmt1 = ltc_ltc0_ltss_tstg_cmgmt1_r() + + ltc * proj_ltc_stride_v(); + op_pending = gk20a_readl(g, cmgmt1); + __timeout_check(); + } while (op_pending & + ltc_ltc0_ltss_tstg_cmgmt1_clean_pending_f()); + } /* And invalidate. */ gk20a_writel(g, ltc_ltcs_ltss_tstg_cmgmt0_r(), @@ -333,19 +332,17 @@ void gm20b_flush_ltc(struct gk20a *g) ltc_ltcs_ltss_tstg_cmgmt0_invalidate_evict_first_class_true_f()); /* Wait on each LTC individually. */ - __timeout_init(); - do { - op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt0_r()); - __timeout_check(); - } while (op_pending & - ltc_ltc0_ltss_tstg_cmgmt0_invalidate_pending_f()); - - __timeout_init(); - do { - op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt0_r()); - __timeout_check(); - } while (op_pending & - ltc_ltc1_ltss_tstg_cmgmt0_invalidate_pending_f()); + for (ltc = 0; ltc < g->ltc_count; ltc++) { + u32 op_pending; + __timeout_init(); + do { + int cmgmt0 = ltc_ltc0_ltss_tstg_cmgmt0_r() + + ltc * proj_ltc_stride_v(); + op_pending = gk20a_readl(g, cmgmt0); + __timeout_check(); + } while (op_pending & + ltc_ltc0_ltss_tstg_cmgmt0_invalidate_pending_f()); + } } static int gm20b_determine_L2_size_bytes(struct gk20a *g) -- cgit v1.2.2