video:tegra:gk20a: add debugfs switch for L2 cache
Kirill Artamonov [Wed, 10 Jul 2013 00:35:25 +0000 (17:35 -0700)]
Add debugfs boolean /d/gk20a/ltc_enabled
to disable or enable L2 cache of gk20a.

Signed-off-by: Kirill Artamonov <kartamonov@nvidia.com>
Change-Id: I2ce30c592a4775e7cab92ed34b3c4476bb7a1560
Reviewed-on: http://git-master/r/246927
(cherry picked from commit 7edd25eb707767b9bf94a6de5bdf3855b266535e)
Reviewed-on: http://git-master/r/251691
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

drivers/video/tegra/host/gk20a/channel_gk20a.c
drivers/video/tegra/host/gk20a/gk20a.c
drivers/video/tegra/host/gk20a/gk20a.h
drivers/video/tegra/host/gk20a/hw_ltc_gk20a.h
drivers/video/tegra/host/gk20a/mm_gk20a.h

index cae5580..abd1d49 100644 (file)
@@ -36,6 +36,7 @@
 #include "hw_fifo_gk20a.h"
 #include "hw_pbdma_gk20a.h"
 #include "hw_ccsr_gk20a.h"
+#include "hw_ltc_gk20a.h"
 #include "chip_support.h"
 
 #define NVMAP_HANDLE_PARAM_SIZE 1
@@ -1161,6 +1162,26 @@ void gk20a_channel_update(struct channel_gk20a *c)
        }
        mutex_unlock(&c->jobs_lock);
 }
+#ifdef CONFIG_DEBUG_FS
+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) {
+               u32 reg = gk20a_readl(g, ltc_ltcs_ltss_tstg_set_mgmt_2_r());
+               if (g->mm.debugfs_ltc_enabled)
+                       /* bypass disabled (normal caching ops)*/
+                       reg &= ~reg_f;
+               else
+                       /* bypass enabled (no caching) */
+                       reg |= reg_f;
+
+               gk20a_writel(g, ltc_ltcs_ltss_tstg_set_mgmt_2_r(), reg);
+               g->mm.ltc_enabled = g->mm.debugfs_ltc_enabled;
+       }
+       spin_unlock(&g->debugfs_lock);
+}
+#endif
 
 int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
                                struct nvhost_gpfifo *gpfifo,
@@ -1186,6 +1207,10 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
                      NVHOST_SUBMIT_GPFIFO_FLAGS_FENCE_GET)) &&
            !fence)
                return -EINVAL;
+#ifdef CONFIG_DEBUG_FS
+       /* update debug settings */
+       gk20a_sync_debugfs(g);
+#endif
 
        nvhost_dbg_info("channel %d", c->hw_chid);
 
index 7dca183..cc1ffa2 100644 (file)
@@ -30,6 +30,8 @@
 #include <linux/of_platform.h>
 #include <linux/thermal.h>
 #include <asm/cacheflush.h>
+#include <linux/debugfs.h>
+#include <linux/spinlock.h>
 
 #include <mach/powergate.h>
 #include <mach/pm_domains.h>
@@ -963,6 +965,13 @@ static int gk20a_probe(struct platform_device *dev)
 
 #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,
+                                pdata->debugfs,
+                                &gk20a->mm.debugfs_ltc_enabled);
 #endif
 
        return 0;
@@ -977,6 +986,10 @@ static int __exit gk20a_remove(struct platform_device *dev)
                g->remove_support(dev);
 
        set_gk20a(dev, 0);
+#ifdef CONFIG_DEBUG_FS
+       debugfs_remove(g->debugfs);
+#endif
+
        kfree(g);
 
 #ifdef CONFIG_PM_RUNTIME
index f3a1047..839f8c3 100644 (file)
@@ -35,6 +35,7 @@ struct gr_gk20a;
 struct sim_gk20a;
 
 #include <mach/hardware.h>
+#include <linux/spinlock.h>
 #include "clk_gk20a.h"
 #include "fifo_gk20a.h"
 #include "gr_gk20a.h"
@@ -87,6 +88,10 @@ struct gk20a {
           fw in resume crashes when the resume is from sys_exit. */
        const struct firmware *pmu_fw;
 
+#ifdef CONFIG_DEBUG_FS
+       spinlock_t debugfs_lock;
+       struct dentry *debugfs;
+#endif
        void (*remove_support)(struct platform_device *);
 };
 
index 4545077..dce12b1 100644 (file)
@@ -890,6 +890,394 @@ static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_max_ways_atomic_init_f(void)
 {
        return 0xd000000;
 }
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_r(void)
+{
+       return 0x0017e924;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_s(void)
+{
+       return 8;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_f(u32 v)
+{
+       return (v & 0xff) << 0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_m(void)
+{
+       return 0xff << 0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_v(u32 r)
+{
+       return (r >> 0) & 0xff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_init_v(void)
+{
+       return 0x000000ff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_init_f(void)
+{
+       return 0xff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_one_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_one_f(void)
+{
+       return 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_max_v(void)
+{
+       return 0x000000ff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_rd_miss_max_f(void)
+{
+       return 0xff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_s(void)
+{
+       return 8;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_f(u32 v)
+{
+       return (v & 0xff) << 8;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_m(void)
+{
+       return 0xff << 8;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_v(u32 r)
+{
+       return (r >> 8) & 0xff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_init_v(void)
+{
+       return 0x0000000e;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_init_f(void)
+{
+       return 0xe00;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_one_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_one_f(void)
+{
+       return 0x100;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_max_v(void)
+{
+       return 0x000000ff;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_sysmem_wr_miss_max_f(void)
+{
+       return 0xff00;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_f(u32 v)
+{
+       return (v & 0x1) << 24;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_m(void)
+{
+       return 0x1 << 24;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_v(u32 r)
+{
+       return (r >> 24) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_true_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_true_f(void)
+{
+       return 0x1000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_false_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_write_false_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_f(u32 v)
+{
+       return (v & 0x1) << 25;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_m(void)
+{
+       return 0x1 << 25;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_v(u32 r)
+{
+       return (r >> 25) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_true_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_true_f(void)
+{
+       return 0x2000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_false_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_update_lru_on_prefetch_false_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_f(u32 v)
+{
+       return (v & 0x1) << 26;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_m(void)
+{
+       return 0x1 << 26;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_v(u32 r)
+{
+       return (r >> 26) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_init_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_init_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_disabled_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_disabled_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_enabled_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_only_allow_writes_to_clean_enabled_f(void)
+{
+       return 0x4000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_f(u32 v)
+{
+       return (v & 0x1) << 27;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_m(void)
+{
+       return 0x1 << 27;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_v(u32 r)
+{
+       return (r >> 27) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_init_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_init_f(void)
+{
+       return 0x8000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_disabled_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_disabled_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_enabled_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_issue_dirty_on_evict_last_enabled_f(void)
+{
+       return 0x8000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_f(u32 v)
+{
+       return (v & 0x1) << 28;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_m(void)
+{
+       return 0x1 << 28;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_v(u32 r)
+{
+       return (r >> 28) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_init_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_init_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_disabled_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_disabled_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_enabled_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_bypass_mode_enabled_f(void)
+{
+       return 0x10000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_f(u32 v)
+{
+       return (v & 0x1) << 29;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_m(void)
+{
+       return 0x1 << 29;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_v(u32 r)
+{
+       return (r >> 29) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_init_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_init_f(void)
+{
+       return 0x20000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_enable_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_enable_f(void)
+{
+       return 0x20000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_disable_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_padr_hit_disable_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_f(u32 v)
+{
+       return (v & 0x1) << 30;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_m(void)
+{
+       return 0x1 << 30;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_v(u32 r)
+{
+       return (r >> 30) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_init_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_init_f(void)
+{
+       return 0x40000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_enable_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_enable_f(void)
+{
+       return 0x40000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_disable_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_l2_fasttrack_across_vc_disable_f(void)
+{
+       return 0x0;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_s(void)
+{
+       return 1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_f(u32 v)
+{
+       return (v & 0x1) << 31;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_m(void)
+{
+       return 0x1 << 31;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_v(u32 r)
+{
+       return (r >> 31) & 0x1;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_init_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_init_f(void)
+{
+       return 0x80000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_enabled_v(void)
+{
+       return 0x00000001;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_enabled_f(void)
+{
+       return 0x80000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_disabled_v(void)
+{
+       return 0x00000000;
+}
+static inline u32 ltc_ltcs_ltss_tstg_set_mgmt_2_max_gpc_include_rop_disabled_f(void)
+{
+       return 0x0;
+}
 static inline u32 ltc_ltcs_ltss_dstg_zbc_index_r(void)
 {
        return 0x0017ea44;
index a488a6d..b2ad7b8 100644 (file)
@@ -260,6 +260,10 @@ struct mm_gk20a {
 
        void (*remove_support)(struct mm_gk20a *mm);
        bool sw_ready;
+#ifdef CONFIG_DEBUG_FS
+       u32 ltc_enabled;
+       u32 debugfs_ltc_enabled;
+#endif
 };
 
 int gk20a_mm_init(struct mm_gk20a *mm);