arm: tegra: Add run-time cluster switch debug control
Scott Williams [Tue, 1 Feb 2011 20:52:39 +0000 (12:52 -0800)]
Allow run-time control of cluster switch debug messages
so they can be enabled for debuggability and disabled for
performance measurement.

Original-Change-Id: Id2bd85d6a9d3a57430a20d93b51ce5b59fe53c71
Reviewed-on: http://git-master/r/17927
Tested-by: Scott Williams <scwilliams@nvidia.com>
Reviewed-by: Aleksandr Frid <afrid@nvidia.com>
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Original-Change-Id: Ia57424eee01276d82af7aab37d2f3d0525acc379

Rebase-Id: Rb7054dcdd910d9f1b82edb485856e868a47c5034

arch/arm/mach-tegra/pm-t3.c
arch/arm/mach-tegra/pm.h
arch/arm/mach-tegra/sysfs-cluster.c

index 5798c09..66a4365 100644 (file)
 #include "iomap.h"
 #include "pm.h"
 
-#define SUSPEND_DEBUG_PRINT    1       /* Nonzero for debug prints */
-
-#if SUSPEND_DEBUG_PRINT
-#define DEBUG_SUSPEND(x) printk x
-#else
-#define DEBUG_SUSPEND(x)
-#endif
-
 #define CAR_CCLK_BURST_POLICY \
        (IO_ADDRESS(TEGRA_CLK_RESET_BASE) + 0x20)
 
@@ -184,11 +176,11 @@ static int cluster_switch_prolog_clock(unsigned int flags)
                                   be multipled by 2 because of the LP CPU's
                                   implied divied-by-2. */
 
-                               DEBUG_SUSPEND(("%s: G freq %lu\r\n", __func__,
+                               DEBUG_CLUSTER(("%s: G freq %lu\r\n", __func__,
                                               cur_rate));
                                err = clk_set_rate(c, max_rate * 2);
                                BUG_ON(err);
-                               DEBUG_SUSPEND(("%s: G freq %lu\r\n", __func__,
+                               DEBUG_CLUSTER(("%s: G freq %lu\r\n", __func__,
                                               clk_get_rate(c)));
                        }
                }
@@ -295,10 +287,10 @@ void tegra_cluster_switch_epilog(unsigned int flags)
        /* Perform post-switch clean-up of the interrupt distributor */
        cluster_switch_epilog_gic();
 
-       #if SUSPEND_DEBUG_PRINT
+       #if DEBUG_CLUSTER_SWITCH
        {
                struct clk *c = tegra_get_clock_by_name("cpu");
-               DEBUG_SUSPEND(("%s: %s freq %lu\r\n", __func__,
+               DEBUG_CLUSTER(("%s: %s freq %lu\r\n", __func__,
                        is_lp_cluster() ? "LP" : "G", clk_get_rate(c)));
        }
        #endif
@@ -324,7 +316,7 @@ int tegra_cluster_control(unsigned int us, unsigned int flags)
        if (flags & TEGRA_POWER_CLUSTER_IMMEDIATE)
                us = 0;
 
-       DEBUG_SUSPEND(("%s(LP%d): %s->%s %s %s %d\r\n", __func__,
+       DEBUG_CLUSTER(("%s(LP%d): %s->%s %s %s %d\r\n", __func__,
                (flags & TEGRA_POWER_SDRAM_SELFREFRESH) ? 1 : 2,
                is_lp_cluster() ? "LP" : "G",
                (target_cluster == TEGRA_POWER_CLUSTER_G) ? "G" : "LP",
@@ -345,7 +337,7 @@ int tegra_cluster_control(unsigned int us, unsigned int flags)
                tegra_idle_lp2_last(flags);
        local_irq_enable();
 
-       DEBUG_SUSPEND(("%s: %s\r\n", __func__, is_lp_cluster() ? "LP" : "G"));
+       DEBUG_CLUSTER(("%s: %s\r\n", __func__, is_lp_cluster() ? "LP" : "G"));
 
        return 0;
 }
index e77127f..9cc7054 100644 (file)
@@ -70,7 +70,8 @@ extern void (*tegra_deep_sleep)(int);
 
 void tegra_idle_lp2_last(unsigned int flags);
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
-#define INSTRUMENT_CLUSTER_SWITCH 0 /* Must be zero for ARCH_TEGRA_2x_SOC */
+#define INSTRUMENT_CLUSTER_SWITCH 0    /* Must be zero for ARCH_TEGRA_2x_SOC */
+#define DEBUG_CLUSTER_SWITCH 0         /* Must be zero for ARCH_TEGRA_2x_SOC */
 static inline int tegra_cluster_control(unsigned int us, unsigned int flags)
 { return -EPERM; }
 #define tegra_cluster_switch_prolog(flags) do {} while(0)
@@ -80,7 +81,8 @@ static inline unsigned int is_lp_cluster(void)
 static inline unsigned long tegra_get_lpcpu_max_rate(void)
 { return 0; }
 #else
-#define INSTRUMENT_CLUSTER_SWITCH 1 /* Should be zero for shipping code */
+#define INSTRUMENT_CLUSTER_SWITCH 1    /* Should be zero for shipping code */
+#define DEBUG_CLUSTER_SWITCH 1         /* Should be zero for shipping code */
 int tegra_cluster_control(unsigned int us, unsigned int flags);
 void tegra_cluster_switch_prolog(unsigned int flags);
 void tegra_cluster_switch_epilog(unsigned int flags);
@@ -88,4 +90,11 @@ unsigned int is_lp_cluster(void);
 unsigned long tegra_get_lpcpu_max_rate(void);
 #endif
 
+#if DEBUG_CLUSTER_SWITCH
+extern unsigned int tegra_cluster_debug;
+#define DEBUG_CLUSTER(x) do { if (tegra_cluster_debug) printk x; } while (0)
+#else
+#define DEBUG_CLUSTER(x) do { } while (0)
+#endif
+
 #endif /* _MACH_TEGRA_SUSPEND_H_ */
index 0dad8f5..a56485c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 NVIDIA Corporation.
+ * Copyright (c) 2010-2011 NVIDIA Corporation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include "power.h"
 
 #define SYSFS_CLUSTER_PRINTS      1    /* Nonzero: enable status prints */
-#define SYSFS_CLUSTER_DEBUG_PRINTS 0   /* Nonzero: enable debug prints */
+#define SYSFS_CLUSTER_TRACE_PRINTS 0   /* Nonzero: enable trace prints */
 #define SYSFS_CLUSTER_POWER_MODE   0   /* Nonzero: use power modes other than LP2*/
 
-#if SYSFS_CLUSTER_DEBUG_PRINTS
-#define DEBUG_CLUSTER(x) printk x
+#if SYSFS_CLUSTER_TRACE_PRINTS
+#define TRACE_CLUSTER(x) printk x
 #else
-#define DEBUG_CLUSTER(x)
+#define TRACE_CLUSTER(x)
 #endif
 
 #if SYSFS_CLUSTER_PRINTS
@@ -138,6 +138,12 @@ static struct kobj_attribute cluster_powermode_attr =
                __ATTR(power_mode, 0640, sysfscluster_show, sysfscluster_store);
 #endif
 
+#if DEBUG_CLUSTER_SWITCH
+unsigned int tegra_cluster_debug = 1;
+static struct kobj_attribute cluster_debug_attr =
+               __ATTR(debug, 0640, sysfscluster_show, sysfscluster_store);
+#endif
+
 typedef enum
 {
        ClusterAttr_Invalid = 0,
@@ -146,7 +152,10 @@ typedef enum
        ClusterAttr_Force,
        ClusterAttr_WakeMs,
 #if defined(CONFIG_PM) && SYSFS_CLUSTER_POWER_MODE
-       ClusterAttr_PowerMode
+       ClusterAttr_PowerMode,
+#endif
+#if DEBUG_CLUSTER_SWITCH
+       ClusterAttr_Debug
 #endif
 } ClusterAttr;
 
@@ -164,7 +173,11 @@ static ClusterAttr GetClusterAttr(const char *name)
        if (!strcmp(name, "power_mode"))
                return ClusterAttr_PowerMode;
 #endif
-       DEBUG_CLUSTER(("GetClusterAttr(%s): invalid\n", name));
+#if DEBUG_CLUSTER_SWITCH
+       if (!strcmp(name, "debug"))
+               return ClusterAttr_Debug;
+#endif
+       TRACE_CLUSTER(("GetClusterAttr(%s): invalid\n", name));
        return ClusterAttr_Invalid;
 }
 
@@ -174,7 +187,7 @@ static ssize_t sysfscluster_show(struct kobject *kobj,
        ClusterAttr type;
        ssize_t len;
 
-       DEBUG_CLUSTER(("+sysfscluster_show\n"));
+       TRACE_CLUSTER(("+sysfscluster_show\n"));
 
        type = GetClusterAttr(attr->attr.name);
        switch (type) {
@@ -202,12 +215,18 @@ static ssize_t sysfscluster_show(struct kobject *kobj,
                break;
 #endif
 
+#if DEBUG_CLUSTER_SWITCH
+       case ClusterAttr_Debug:
+               len = sprintf(buf, "%d\n", tegra_cluster_debug);
+               break;
+#endif
+
        default:
                len = sprintf(buf, "invalid\n");
                break;
        }
 
-       DEBUG_CLUSTER(("-sysfscluster_show\n"));
+       TRACE_CLUSTER(("-sysfscluster_show\n"));
        return len;
 }
 
@@ -221,7 +240,7 @@ static ssize_t sysfscluster_store(struct kobject *kobj,
        int tmp;
        int cnt;
 
-       DEBUG_CLUSTER(("+sysfscluster_store: %p, %d\n", buf, count));
+       TRACE_CLUSTER(("+sysfscluster_store: %p, %d\n", buf, count));
 
        /* The count includes data bytes follow by a line feed character. */
        if (!buf || (count < 1)) {
@@ -330,6 +349,22 @@ static ssize_t sysfscluster_store(struct kobject *kobj,
                break;
 #endif
 
+#if DEBUG_CLUSTER_SWITCH
+       case ClusterAttr_Debug:
+               if ((count == 1) && (*buf == '0'))
+                       tegra_cluster_debug = 0;
+               else if ((count == 1) && (*buf == '1'))
+                       tegra_cluster_debug = 1;
+               else {
+                       PRINT_CLUSTER(("cluster/debug: '%*.*s' invalid, "
+                               "must be 0 or 1\n", count, count, buf));
+                       ret = -EINVAL;
+                       break;
+               }
+               PRINT_CLUSTER(("cluster/debug -> %d\n",tegra_cluster_debug));
+               break;
+#endif
+
        default:
                ret = -ENOENT;
                break;
@@ -338,7 +373,7 @@ static ssize_t sysfscluster_store(struct kobject *kobj,
        spin_unlock(&cluster_lock);
 
 fail:
-       DEBUG_CLUSTER(("-sysfscluster_store: %d\n", count));
+       TRACE_CLUSTER(("-sysfscluster_store: %d\n", count));
        return ret;
 }
 
@@ -346,7 +381,7 @@ fail:
        do { \
                e = sysfs_create_file(cluster_kobj, &cluster_##x##_attr.attr); \
                if (e) { \
-                       DEBUG_CLUSTER(("cluster/" __stringify(x) \
+                       TRACE_CLUSTER(("cluster/" __stringify(x) \
                                ": sysfs_create_file failed!\n")); \
                        goto fail; \
                } \
@@ -356,7 +391,7 @@ static int __init sysfscluster_init(void)
 {
        int e;
 
-       DEBUG_CLUSTER(("+sysfscluster_init\n"));
+       TRACE_CLUSTER(("+sysfscluster_init\n"));
 
        spin_lock_init(&cluster_lock);
        cluster_kobj = kobject_create_and_add("cluster", kernel_kobj);
@@ -368,6 +403,9 @@ static int __init sysfscluster_init(void)
 #if defined(CONFIG_PM) && SYSFS_CLUSTER_POWER_MODE
        CREATE_FILE(powermode);
 #endif
+#if DEBUG_CLUSTER_SWITCH
+       CREATE_FILE(debug);
+#endif
 
        spin_lock(&cluster_lock);
        if (is_lp_cluster())
@@ -377,7 +415,7 @@ static int __init sysfscluster_init(void)
        spin_unlock(&cluster_lock);
 
 fail:
-       DEBUG_CLUSTER(("-sysfscluster_init\n"));
+       TRACE_CLUSTER(("-sysfscluster_init\n"));
        return e;
 }
 
@@ -386,7 +424,10 @@ fail:
 
 static void __exit sysfscluster_exit(void)
 {
-       DEBUG_CLUSTER(("+sysfscluster_exit\n"));
+       TRACE_CLUSTER(("+sysfscluster_exit\n"));
+#if DEBUG_CLUSTER_SWITCH
+       REMOVE_FILE(debug);
+#endif
 #if defined(CONFIG_PM) && SYSFS_CLUSTER_POWER_MODE
        REMOVE_FILE(powermode);
 #endif
@@ -395,7 +436,7 @@ static void __exit sysfscluster_exit(void)
        REMOVE_FILE(immediate);
        REMOVE_FILE(active);
        kobject_del(cluster_kobj);
-       DEBUG_CLUSTER(("-sysfscluster_exit\n"));
+       TRACE_CLUSTER(("-sysfscluster_exit\n"));
 }
 
 module_init(sysfscluster_init);