diff options
author | Alex Waterman <alexw@nvidia.com> | 2014-06-16 15:41:24 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:10:17 -0400 |
commit | 2680d6be576ce2c1b74f03e6e4cc5cbf321ef2bc (patch) | |
tree | a7c649881feb511ec847a369f032b76b1301e998 /drivers | |
parent | d46c8e40035f65194baceeb4210a395c8087940a (diff) |
gpu: nvgpu: Add timeout to L2 flush
Add a timeout mechanism to the L2 flushing code for gm20b.
Previously the code could spin forever in a loop if some
issue were to occur with the L2 causing the flush to fail.
Change-Id: I742c7671bac92aeb8e9674c43d30c45b2de4a836
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/423842
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c index 1f9bf44c..7a2bb5fd 100644 --- a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | |||
@@ -14,6 +14,7 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/jiffies.h> | ||
17 | 18 | ||
18 | #include "hw_ltc_gm20b.h" | 19 | #include "hw_ltc_gm20b.h" |
19 | #include "hw_top_gm20b.h" | 20 | #include "hw_top_gm20b.h" |
@@ -256,6 +257,19 @@ u32 gm20b_ltc_cbc_fix_config(struct gk20a *g, int base) | |||
256 | void gm20b_flush_ltc(struct gk20a *g) | 257 | void gm20b_flush_ltc(struct gk20a *g) |
257 | { | 258 | { |
258 | u32 op_pending; | 259 | u32 op_pending; |
260 | unsigned long now, timeout; | ||
261 | |||
262 | #define __timeout_init() \ | ||
263 | do { \ | ||
264 | now = jiffies; timeout = now + HZ; \ | ||
265 | } while (0) | ||
266 | #define __timeout_check() \ | ||
267 | do { \ | ||
268 | if (tegra_platform_is_silicon() && time_after(now, timeout)) { \ | ||
269 | gk20a_err(dev_from_gk20a(g), "L2 flush timeout!"); \ | ||
270 | break; \ | ||
271 | } \ | ||
272 | } while (0) | ||
259 | 273 | ||
260 | /* Clean... */ | 274 | /* Clean... */ |
261 | gk20a_writel(g, ltc_ltcs_ltss_tstg_cmgmt1_r(), | 275 | gk20a_writel(g, ltc_ltcs_ltss_tstg_cmgmt1_r(), |
@@ -267,13 +281,17 @@ void gm20b_flush_ltc(struct gk20a *g) | |||
267 | ltc_ltcs_ltss_tstg_cmgmt1_clean_evict_first_class_true_f()); | 281 | ltc_ltcs_ltss_tstg_cmgmt1_clean_evict_first_class_true_f()); |
268 | 282 | ||
269 | /* Wait on each LTC individually. */ | 283 | /* Wait on each LTC individually. */ |
284 | __timeout_init(); | ||
270 | do { | 285 | do { |
271 | op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt1_r()); | 286 | op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt1_r()); |
287 | __timeout_check(); | ||
272 | } while (op_pending & | 288 | } while (op_pending & |
273 | ltc_ltc0_ltss_tstg_cmgmt1_clean_pending_f()); | 289 | ltc_ltc0_ltss_tstg_cmgmt1_clean_pending_f()); |
274 | 290 | ||
291 | __timeout_init(); | ||
275 | do { | 292 | do { |
276 | op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt1_r()); | 293 | op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt1_r()); |
294 | __timeout_check(); | ||
277 | } while (op_pending & | 295 | } while (op_pending & |
278 | ltc_ltc1_ltss_tstg_cmgmt1_clean_pending_f()); | 296 | ltc_ltc1_ltss_tstg_cmgmt1_clean_pending_f()); |
279 | 297 | ||
@@ -286,13 +304,17 @@ void gm20b_flush_ltc(struct gk20a *g) | |||
286 | ltc_ltcs_ltss_tstg_cmgmt0_invalidate_evict_first_class_true_f()); | 304 | ltc_ltcs_ltss_tstg_cmgmt0_invalidate_evict_first_class_true_f()); |
287 | 305 | ||
288 | /* Wait on each LTC individually. */ | 306 | /* Wait on each LTC individually. */ |
307 | __timeout_init(); | ||
289 | do { | 308 | do { |
290 | op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt0_r()); | 309 | op_pending = gk20a_readl(g, ltc_ltc0_ltss_tstg_cmgmt0_r()); |
310 | __timeout_check(); | ||
291 | } while (op_pending & | 311 | } while (op_pending & |
292 | ltc_ltc0_ltss_tstg_cmgmt0_invalidate_pending_f()); | 312 | ltc_ltc0_ltss_tstg_cmgmt0_invalidate_pending_f()); |
293 | 313 | ||
314 | __timeout_init(); | ||
294 | do { | 315 | do { |
295 | op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt0_r()); | 316 | op_pending = gk20a_readl(g, ltc_ltc1_ltss_tstg_cmgmt0_r()); |
317 | __timeout_check(); | ||
296 | } while (op_pending & | 318 | } while (op_pending & |
297 | ltc_ltc1_ltss_tstg_cmgmt0_invalidate_pending_f()); | 319 | ltc_ltc1_ltss_tstg_cmgmt0_invalidate_pending_f()); |
298 | } | 320 | } |