video:tegra:gk20a: increase gr idle timeout
Kirill Artamonov [Sun, 21 Jul 2013 04:46:20 +0000 (21:46 -0700)]
10 ms timeout can be easily exceeded by a single drawcall.
Use timeout setting defined in Kconfig for nvhost.

Fix timeout implementation for gk20a_fifo_preempt_channel.

bug 1326868
bug 1324432

Change-Id: I430ab4b1f60fd0fc5f84ace55c7f31087bd4599b
Signed-off-by: Kirill Artamonov <kartamonov@nvidia.com>
Reviewed-on: http://git-master/r/249964
(cherry picked from commit e7d722830705cbaef8ceb73adc21780c01182810)
Reviewed-on: http://git-master/r/251693
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>

drivers/video/tegra/host/gk20a/fifo_gk20a.c
drivers/video/tegra/host/gk20a/gk20a.c

index 5b0e5fb..da0c552 100644 (file)
@@ -1014,7 +1014,8 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 engine_id, u32 hw_chid)
        struct fifo_gk20a *f = &g->fifo;
        struct fifo_runlist_info_gk20a *runlist;
        u32 runlist_id;
-       u32 timeout = g->timeouts_enabled ? 5000 : MAX_SCHEDULE_TIMEOUT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
+       u32 delay = GR_IDLE_CHECK_DEFAULT;
        u32 ret = 0;
        u32 token = PMU_INVALID_MUTEX_OWNER_ID;
        u32 elpg_off = 0;
@@ -1052,8 +1053,10 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 engine_id, u32 hw_chid)
                        ret = -EBUSY;
                        break;
                }
-               schedule();
-       } while (1);
+               udelay(delay);
+               timeout -= min_t(u32, delay, timeout);
+               delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX);
+       } while (timeout);
 
        /* re-enable elpg or release pmu mutex */
        if (elpg_off)
index 266b46e..777e524 100644 (file)
@@ -963,7 +963,9 @@ static int gk20a_probe(struct platform_device *dev)
        else
                pm_runtime_put(&dev->dev);
 
-       gk20a->gr_idle_timeout_default = CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT;
+       /* Kconfig defines timeout in milliseconds, grhost uses microseconds */
+       gk20a->gr_idle_timeout_default =
+                       CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT * 1000;
        gk20a->timeouts_enabled = true;
 
 #ifdef CONFIG_DEBUG_FS