video:tegra:gk20a: add debugfs knobs for gk20a
Kirill Artamonov [Wed, 10 Jul 2013 00:35:25 +0000 (17:35 -0700)]
Add bool /d/gk20a/timeouts_enabled to enable timeout
detection for gr engine.

Add u32 /d/gk20a/gr_idle_timeout_default_us to tune
timeout value for gr engine.

Add u32 /d/tegra_host/timeout_default_ms to tune
timeout value for nvhost. Default timeout for jobs
in milliseconds. Set to zero for no timeout.

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

drivers/video/tegra/host/bus_client.c
drivers/video/tegra/host/debug.c
drivers/video/tegra/host/gk20a/channel_gk20a.c
drivers/video/tegra/host/gk20a/fifo_gk20a.c
drivers/video/tegra/host/gk20a/gk20a.c
drivers/video/tegra/host/gk20a/gk20a.h
drivers/video/tegra/host/gk20a/gr_gk20a.c
drivers/video/tegra/host/gk20a/gr_gk20a.h
drivers/video/tegra/host/gk20a/mm_gk20a.h
drivers/video/tegra/host/host1x/host1x.c
include/linux/nvhost.h

index 5ec74d5..0e19db3 100644 (file)
@@ -171,6 +171,7 @@ static int nvhost_channelopen(struct inode *inode, struct file *filp)
 {
        struct nvhost_channel_userctx *priv;
        struct nvhost_channel *ch;
+       struct nvhost_device_data *pdata;
 
        ch = container_of(inode->i_cdev, struct nvhost_channel, cdev);
        ch = nvhost_getchannel(ch);
@@ -198,7 +199,8 @@ static int nvhost_channelopen(struct inode *inode, struct file *filp)
        priv->priority = NVHOST_PRIORITY_MEDIUM;
        priv->clientid = atomic_add_return(1,
                        &nvhost_get_host(ch->dev)->clientid);
-       priv->timeout = CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT;
+       pdata = platform_get_drvdata(ch->dev);
+       priv->timeout = pdata->nvhost_timeout_default;
        priv->timeout_debug_dump = true;
        if (!tegra_platform_is_silicon())
                priv->timeout = 0;
index 54ee9a5..c48e32b 100644 (file)
@@ -245,8 +245,8 @@ void nvhost_debug_init(struct nvhost_master *master)
        debugfs_create_u32("dbg_mask", S_IRUGO|S_IWUSR, de,
                        &nvhost_dbg_mask);
 #endif
-
-
+       debugfs_create_u32("timeout_default_ms", S_IRUGO|S_IWUSR, de,
+                       &pdata->nvhost_timeout_default);
 }
 
 void nvhost_debug_dump(struct nvhost_master *master)
index abd1d49..a174b5d 100644 (file)
@@ -406,7 +406,7 @@ void gk20a_free_channel(struct nvhost_hwctx *ctx, bool finish)
        struct gr_gk20a *gr = &g->gr;
        struct mem_mgr *memmgr = gk20a_channel_mem_mgr(ch);
        struct vm_gk20a *ch_vm = ch->vm;
-       unsigned long timeout = CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT;
+       unsigned long timeout = gk20a_get_gr_idle_timeout(g);
 
        nvhost_dbg_fn("");
 
@@ -1167,9 +1167,9 @@ static void gk20a_sync_debugfs(struct gk20a *g)
 {
        u32 reg_f = ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_enabled_f();
        spin_lock(&g->debugfs_lock);
-       if (g->mm.ltc_enabled != g->mm.debugfs_ltc_enabled) {
+       if (g->mm.ltc_enabled != g->mm.ltc_enabled_debug) {
                u32 reg = gk20a_readl(g, ltc_ltcs_ltss_tstg_set_mgmt_2_r());
-               if (g->mm.debugfs_ltc_enabled)
+               if (g->mm.ltc_enabled_debug)
                        /* bypass disabled (normal caching ops)*/
                        reg &= ~reg_f;
                else
@@ -1177,7 +1177,7 @@ static void gk20a_sync_debugfs(struct gk20a *g)
                        reg |= reg_f;
 
                gk20a_writel(g, ltc_ltcs_ltss_tstg_set_mgmt_2_r(), reg);
-               g->mm.ltc_enabled = g->mm.debugfs_ltc_enabled;
+               g->mm.ltc_enabled = g->mm.ltc_enabled_debug;
        }
        spin_unlock(&g->debugfs_lock);
 }
index 0fde80c..5b0e5fb 100644 (file)
@@ -1014,7 +1014,7 @@ 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 = 2000; /* 2 sec */
+       u32 timeout = g->timeouts_enabled ? 5000 : MAX_SCHEDULE_TIMEOUT;
        u32 ret = 0;
        u32 token = PMU_INVALID_MUTEX_OWNER_ID;
        u32 elpg_off = 0;
index cc1ffa2..266b46e 100644 (file)
@@ -963,15 +963,29 @@ static int gk20a_probe(struct platform_device *dev)
        else
                pm_runtime_put(&dev->dev);
 
+       gk20a->gr_idle_timeout_default = CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT;
+       gk20a->timeouts_enabled = true;
+
 #ifdef CONFIG_DEBUG_FS
        clk_gk20a_debugfs_init(dev);
 
        spin_lock_init(&gk20a->debugfs_lock);
        gk20a->mm.ltc_enabled = true;
-       gk20a->mm.debugfs_ltc_enabled = true;
-       gk20a->debugfs = debugfs_create_bool("ltc_enabled", S_IRUGO|S_IWUSR,
+       gk20a->mm.ltc_enabled_debug = true;
+       gk20a->debugfs_ltc_enabled =
+                       debugfs_create_bool("ltc_enabled", S_IRUGO|S_IWUSR,
                                 pdata->debugfs,
-                                &gk20a->mm.debugfs_ltc_enabled);
+                                &gk20a->mm.ltc_enabled_debug);
+       gk20a->mm.ltc_enabled_debug = true;
+       gk20a->debugfs_gr_idle_timeout_default =
+                       debugfs_create_u32("gr_idle_timeout_default_us",
+                                       S_IRUGO|S_IWUSR, pdata->debugfs,
+                                        &gk20a->gr_idle_timeout_default);
+       gk20a->debugfs_timeouts_enabled =
+                       debugfs_create_bool("timeouts_enabled",
+                                       S_IRUGO|S_IWUSR,
+                                       pdata->debugfs,
+                                       &gk20a->timeouts_enabled);
 #endif
 
        return 0;
@@ -987,7 +1001,9 @@ static int __exit gk20a_remove(struct platform_device *dev)
 
        set_gk20a(dev, 0);
 #ifdef CONFIG_DEBUG_FS
-       debugfs_remove(g->debugfs);
+       debugfs_remove(g->debugfs_ltc_enabled);
+       debugfs_remove(g->debugfs_gr_idle_timeout_default);
+       debugfs_remove(g->debugfs_timeouts_enabled);
 #endif
 
        kfree(g);
index 839f8c3..e90e33e 100644 (file)
@@ -88,13 +88,24 @@ struct gk20a {
           fw in resume crashes when the resume is from sys_exit. */
        const struct firmware *pmu_fw;
 
+       u32 gr_idle_timeout_default;
+       u32 timeouts_enabled;
+
 #ifdef CONFIG_DEBUG_FS
        spinlock_t debugfs_lock;
-       struct dentry *debugfs;
+       struct dentry *debugfs_ltc_enabled;
+       struct dentry *debugfs_timeouts_enabled;
+       struct dentry *debugfs_gr_idle_timeout_default;
 #endif
        void (*remove_support)(struct platform_device *);
 };
 
+static inline u32 gk20a_get_gr_idle_timeout(struct gk20a *g)
+{
+       return g->timeouts_enabled ?
+               g->gr_idle_timeout_default : MAX_SCHEDULE_TIMEOUT;
+}
+
 static inline struct gk20a *get_gk20a(struct platform_device *dev)
 {
        return (struct gk20a *)nvhost_get_private_data(dev);
index daafae6..235613c 100644 (file)
@@ -279,7 +279,7 @@ static int gr_gk20a_ctx_wait_ucode(struct gk20a *g, u32 mailbox_id,
                                   u32 mailbox_ok, u32 opc_fail,
                                   u32 mailbox_fail)
 {
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 delay = GR_IDLE_CHECK_DEFAULT;
        u32 check = WAIT_UCODE_LOOP;
        u32 reg;
@@ -1929,7 +1929,7 @@ out:
 int gk20a_free_obj_ctx(struct channel_gk20a  *c,
                       struct nvhost_free_obj_ctx_args *args)
 {
-       unsigned long timeout = CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT;
+       unsigned long timeout = gk20a_get_gr_idle_timeout(c->g);
 
        nvhost_dbg_fn("");
 
@@ -2532,7 +2532,7 @@ int gk20a_gr_clear_comptags(struct gk20a *g, u32 min, u32 max)
 {
        struct gr_gk20a *gr = &g->gr;
        u32 fbp, slice, ctrl1, val;
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 delay = GR_IDLE_CHECK_DEFAULT;
        u32 slices_per_fbp =
                ltc_ltcs_ltss_cbc_param_slices_per_fbp_v(
@@ -2663,7 +2663,7 @@ static int gr_gk20a_add_zbc_color(struct gk20a *g, struct gr_gk20a *gr,
        struct fifo_gk20a *f = &g->fifo;
        struct fifo_engine_info_gk20a *gr_info = f->engine_info + ENGINE_GR_GK20A;
        u32 i;
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 ret;
 
        ret = gk20a_fifo_disable_engine_activity(g, gr_info, true);
@@ -2736,7 +2736,7 @@ static int gr_gk20a_add_zbc_depth(struct gk20a *g, struct gr_gk20a *gr,
 {
        struct fifo_gk20a *f = &g->fifo;
        struct fifo_engine_info_gk20a *gr_info = f->engine_info + ENGINE_GR_GK20A;
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 ret;
 
        ret = gk20a_fifo_disable_engine_activity(g, gr_info, true);
@@ -2890,7 +2890,7 @@ int gr_gk20a_clear_zbc_table(struct gk20a *g, struct gr_gk20a *gr)
        struct fifo_gk20a *f = &g->fifo;
        struct fifo_engine_info_gk20a *gr_info = f->engine_info + ENGINE_GR_GK20A;
        u32 i, j;
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 ret;
 
        ret = gk20a_fifo_disable_engine_activity(g, gr_info, true);
@@ -3309,7 +3309,7 @@ static int gk20a_init_gr_setup_hw(struct gk20a *g)
        u32 addr_lo, addr_hi, addr;
        u32 compbit_base_post_divide;
        u32 compbit_base_post_multiply;
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 fe_go_idle_timeout_save;
        u32 last_bundle_data = 0;
        u32 last_method_data = 0;
@@ -3607,7 +3607,7 @@ static int gk20a_init_gr_reset_enable_hw(struct gk20a *g)
 {
        struct gr_gk20a *gr = &g->gr;
        struct av_list_gk20a *sw_non_ctx_load = &g->gr.ctx_vars.sw_non_ctx_load;
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 i, err = 0;
 
        nvhost_dbg_fn("");
@@ -4242,7 +4242,7 @@ int gr_gk20a_fecs_set_reglist_virual_addr(struct gk20a *g, u64 pmu_va)
 
 int gk20a_gr_suspend(struct gk20a *g)
 {
-       u32 timeout = GR_IDLE_TIMEOUT_DEFAULT;
+       u32 timeout = gk20a_get_gr_idle_timeout(g);
        u32 ret = 0;
 
        nvhost_dbg_fn("");
index e81ce49..539356e 100644 (file)
 
 #include "gr_ctx_gk20a.h"
 
-#if defined(CONFIG_TEGRA_SIMULATION_PLATFORM)
 #define GR_IDLE_CHECK_DEFAULT          100 /* usec */
 #define GR_IDLE_CHECK_MAX              5000 /* usec */
-#define GR_IDLE_TIMEOUT_DEFAULT                40000 /* usec */
-#else
-#define GR_IDLE_CHECK_DEFAULT          100 /* usec */
-#define GR_IDLE_CHECK_MAX              5000 /* usec */
-#define GR_IDLE_TIMEOUT_DEFAULT                10000 /* usec */
-#endif
 
 #define INVALID_SCREEN_TILE_ROW_OFFSET 0xFFFFFFFF
 #define INVALID_MAX_WAYS               0xFFFFFFFF
index b2ad7b8..b4ba01b 100644 (file)
@@ -262,7 +262,7 @@ struct mm_gk20a {
        bool sw_ready;
 #ifdef CONFIG_DEBUG_FS
        u32 ltc_enabled;
-       u32 debugfs_ltc_enabled;
+       u32 ltc_enabled_debug;
 #endif
 };
 
index e71ac87..47258eb 100644 (file)
@@ -682,6 +682,8 @@ static int nvhost_probe(struct platform_device *dev)
        if (err)
                goto fail;
 
+       pdata->nvhost_timeout_default =
+                       CONFIG_TEGRA_GRHOST_DEFAULT_TIMEOUT;
        nvhost_debug_init(host);
 
 #ifdef CONFIG_PM_RUNTIME
index 1708148..d7fac78 100644 (file)
@@ -194,6 +194,8 @@ struct nvhost_device_data {
        struct nvhost_device_power_attr *power_attrib;  /* sysfs attributes */
        struct dentry *debugfs;         /* debugfs directory */
 
+       u32 nvhost_timeout_default;
+
        /* Data for devfreq usage */
        struct devfreq                  *power_manager;
        /* Private device profile data */