pm: EDP: enable EDP framework and EDP_LIMIT for tegra14x
Jean Huang [Wed, 30 Jan 2013 01:51:17 +0000 (17:51 -0800)]
Change-Id: I2b8183fc26347e1b9d4454d55e1e5431e3ba7996
Signed-off-by: Jean Huang <jeanh@nvidia.com>
Reviewed-on: http://git-master/r/195358
Reviewed-by: Gaurav Sarode <gsarode@nvidia.com>
Tested-by: Gaurav Sarode <gsarode@nvidia.com>

arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/edp.c
arch/arm/mach-tegra/tegra14_speedo.c

index 240187b..bc215d3 100644 (file)
@@ -156,6 +156,7 @@ config ARCH_TEGRA_14x_SOC
        select ARM_SAVE_DEBUG_CONTEXT if PM_SLEEP
        select ARCH_TEGRA_HAS_DUAL_CPU_CLUSTERS
        select CPU_V7
+       select EDP_FRAMEWORK
        select GIC_SET_MULTIPLE_CPUS if SMP
        select NVMAP_CACHE_MAINT_BY_SET_WAYS
        select NVMAP_DEFERRED_CACHE_MAINT
@@ -164,6 +165,7 @@ config ARCH_TEGRA_14x_SOC
        select REPORT_PRESENT_CPUS if TEGRA_AUTO_HOTPLUG
        select SOC_BUS
        select TEGRA_DUAL_CBUS
+       select TEGRA_EDP_LIMITS
        select TEGRA_ISOMGR
        select TEGRA_LP2_CPU_TIMER if HAVE_ARM_TWD && !TEGRA_RAIL_OFF_MULTIPLE_CPUS
        select USB_ARCH_HAS_EHCI if USB_SUPPORT
index 3ceebe7..5314019 100644 (file)
@@ -343,6 +343,41 @@ static const int power_cap_levels[] = { /* milliwatts (mW) */
        16000, 16500, 17000,
 };
 
+#ifdef CONFIG_ARCH_TEGRA_14x_SOC
+static struct tegra_edp_cpu_leakage_params leakage_params[] = {
+       {
+               .cpu_speedo_id      = 0, /* A01 CPU */
+               .dyn_consts_n       = {  643724,  908655, 1173586, 1438517 },
+               .leakage_consts_n   = {  524409,  699606,  874803, 1050000 },
+               .leakage_consts_ijk = {
+                       /* i = 0 */
+                       { {   0,   -5346808,   97234,   -464, },
+                         {   0,   16803984, -307162,   1481, },
+                         {   0,  -17730060,  322460,  -1546, },
+                         {   0,    6489900, -118190,    564, },
+                       },
+                       /* i = 1 */
+                       { {   0,   -7166070,   16144,  -2495, },
+                         {   0,   22733881,  -62339,   7849, },
+                         {   0,  -22851718,   17626,  -7211, },
+                         {   0,    8845764,   -3232,   2668, },
+                       },
+                       /* i = 2 */
+                       { {   0,  -13755297,   88228,    194, },
+                         {   0,   43058825, -281494,   -604, },
+                         {   0,  -45854189,  328873,    337, },
+                         {   0,   17332703, -123100,   -128, },
+                       },
+                       /* i = 3 */
+                       { {   0,    1950888,   -8210,    -62, },
+                         {   0,   -6086732,   26052,    197, },
+                         {   0,    6462190,  -32222,   -161, },
+                         {   0,   -2416618,   11593,     62, },
+                       },
+                },
+       },
+};
+#else
 static struct tegra_edp_cpu_leakage_params leakage_params[] = {
        {
                .cpu_speedo_id      = 0, /* A01 CPU */
@@ -440,6 +475,7 @@ static struct tegra_edp_cpu_leakage_params leakage_params[] = {
                .safety_cap = { 1912500, 1912500, 1708500, 1708500 },
        },
 };
+#endif
 
 static struct tegra_edp_freq_voltage_table *freq_voltage_lut;
 static unsigned int freq_voltage_lut_size;
@@ -757,6 +793,7 @@ void __init tegra_init_cpu_edp_limits(unsigned int regulator_mA)
                        return;
                break;
        case TEGRA11X:
+       case TEGRA14X:
                if (init_cpu_edp_limits_calculated() == 0)
                        return;
                break;
@@ -874,7 +911,9 @@ struct tegra_system_edp_entry *tegra_get_system_edp_entries(int *size)
 
 static int edp_limit_debugfs_show(struct seq_file *s, void *data)
 {
+#ifdef CONFIG_CPU_FREQ
        seq_printf(s, "%u\n", tegra_get_edp_limit(NULL));
+#endif
        return 0;
 }
 
@@ -882,7 +921,11 @@ static int edp_debugfs_show(struct seq_file *s, void *data)
 {
        int i, th_idx;
 
+#ifdef CONFIG_CPU_FREQ
        tegra_get_edp_limit(&th_idx);
+#else
+       th_idx = 0;
+#endif
        seq_printf(s, "-- VDD_CPU %sEDP table (%umA = %umA - %umA) --\n",
                   edp_limits == edp_default_limits ? "default " : "",
                   regulator_cur - edp_reg_override_mA,
@@ -965,6 +1008,7 @@ static int edp_reg_override_write(struct file *file,
                goto override_err;
        }
 
+#ifdef CONFIG_CPU_FREQ
        if (tegra_cpu_set_speed_cap(NULL)) {
                pr_err("FAILED: Set CPU freq cap with new VDD_CPU EDP table\n");
                goto override_out;
@@ -972,13 +1016,18 @@ static int edp_reg_override_write(struct file *file,
 
        pr_info("Reinitialized VDD_CPU EDP table with regulator current limit"
                        " %u mA\n", regulator_cur - edp_reg_override_mA);
+#else
+       pr_err("FAILED: tegra_cpu_set_speed_cap() does not exist, failed to reinitialize VDD_CPU EDP table");
+#endif
 
        return count;
 
 override_err:
        pr_err("FAILED: Reinitialize VDD_CPU EDP table with override \"%s\"",
               buf);
+#ifdef CONFIG_CPU_FREQ
 override_out:
+#endif
        return -EINVAL;
 }
 
index b30b9fb..9156252 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/arm/mach-tegra/tegra14_speedo.c
  *
- * Copyright (C) 2012 NVIDIA Corporation. All rights reserved.
+ * Copyright (C) 2013 NVIDIA Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,6 +32,7 @@
 #include "iomap.h"
 
 #define TEGRA148_CPU_SPEEDO 2109
+#define FUSE_CPU_IDDQ 0x118 /*FIXME: update T148 register*/
 
 static int cpu_process_id;
 static int core_process_id;
@@ -39,6 +40,7 @@ static int cpu_speedo_id;
 static int cpu_speedo_value;
 static int soc_speedo_id;
 static int package_id;
+static int cpu_iddq_value;
 
 static int enable_app_profiles;
 
@@ -48,6 +50,8 @@ void tegra_init_speedo_data(void)
 
        pr_info("Tegra14: CPU Speedo ID %d, Soc Speedo ID %d",
                 cpu_speedo_id, soc_speedo_id);
+
+       cpu_iddq_value = tegra_fuse_readl(FUSE_CPU_IDDQ);
 }
 
 int tegra_cpu_process_id(void)
@@ -101,6 +105,11 @@ int tegra_core_speedo_mv(void)
        }
 }
 
+int tegra_get_cpu_iddq_value()
+{
+       return cpu_iddq_value;
+}
+
 static int get_enable_app_profiles(char *val, const struct kernel_param *kp)
 {
        return param_get_uint(val, kp);