arm: tegra: t124: Add functions for reading speedo and iddq values
Shardar Shariff Md [Wed, 22 May 2013 17:22:24 +0000 (22:22 +0530)]
Below functions to access speedos and iddq values
1. int tegra_cpu_speedo_0_value(void);
2. int tegra_cpu_speedo_1_value(void);
3. int tegra_cpu_speedo_2_value(void);
4. int tegra_soc_speedo_0_value(void);
5. int tegra_soc_speedo_1_value(void);
6. int tegra_soc_speedo_2_value(void);
7. int tegra_get_cpu_iddq_value(void);
8. int tegra_get_soc_iddq_value(void);
9. int tegra_get_gpu_iddq_value(void);

Bug 1049541
Bug 1280063

Change-Id: Id4bb9786b962dcf847e0c6dc53e2319bbcc9dc06
Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>
Reviewed-on: http://git-master/r/231943
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>

arch/arm/mach-tegra/fuse.h
arch/arm/mach-tegra/tegra12_speedo.c

index 87ec4ac..5db8f0a 100644 (file)
@@ -282,7 +282,6 @@ void tegra_fuse_program_disable(void);
 
 extern int (*tegra_fuse_regulator_en)(int);
 #ifdef CONFIG_TEGRA_SILICON_PLATFORM
-
 int tegra_soc_speedo_id(void);
 void tegra_init_speedo_data(void);
 int tegra_cpu_process_id(void);
@@ -309,6 +308,17 @@ static inline int tegra_core_speedo_mv(void) { return 1200; }
 static inline int tegra_get_cpu_iddq_value(void) { return 0; }
 #endif /* CONFIG_ARCH_TEGRA_2x_SOC */
 
+#ifdef CONFIG_ARCH_TEGRA_12x_SOC
+int tegra_cpu_speedo_0_value(void);
+int tegra_cpu_speedo_1_value(void);
+int tegra_cpu_speedo_2_value(void);
+int tegra_soc_speedo_0_value(void);
+int tegra_soc_speedo_1_value(void);
+int tegra_soc_speedo_2_value(void);
+int tegra_get_soc_iddq_value(void);
+int tegra_get_gpu_iddq_value(void);
+#endif
+
 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
 int tegra_core_speedo_value(void);
 #endif
@@ -324,6 +334,18 @@ static inline int tegra_cpu_speedo_value(void) { return 2109; }
 #else
 static inline int tegra_cpu_speedo_value(void) { return 1777; }
 #endif
+
+#ifdef CONFIG_ARCH_TEGRA_12x_SOC
+static inline int tegra_cpu_speedo_0_value(void) { return 0; }
+static inline int tegra_cpu_speedo_1_value(void) { return 0; }
+static inline int tegra_cpu_speedo_2_value(void) { return 0; }
+static inline int tegra_soc_speedo_0_value(void) { return 0; }
+static inline int tegra_soc_speedo_1_value(void) { return 0; }
+static inline int tegra_soc_speedo_2_value(void) { return 0; }
+static inline int tegra_get_soc_iddq_value(void) { return 0; }
+static inline int tegra_get_gpu_iddq_value(void) { return 0; }
+#endif
+
 static inline int tegra_soc_speedo_id(void) { return 0; }
 static inline int tegra_package_id(void) { return -1; }
 static inline int tegra_cpu_speedo_mv(void) { return 1250; }
index 44f630e..8a53d8b 100644 (file)
 
 #define TEGRA124_CPU_SPEEDO 17777 /* FIXME: Get Correct Value */
 
-static int threshold_index;
+#define FUSE_CPU_SPEEDO_0      0x114
+#define FUSE_CPU_SPEEDO_1      0x12c
+#define FUSE_CPU_SPEEDO_2      0x130
+#define FUSE_SOC_SPEEDO_0      0x134
+#define FUSE_SOC_SPEEDO_1      0x138
+#define FUSE_SOC_SPEEDO_2      0x13c
+#define FUSE_CPU_IDDQ          0x118
+#define FUSE_SOC_IDDQ          0x140
+#define FUSE_GPU_IDDQ          0x228
+#define FUSE_FT_REV            0x128
 
 static int cpu_process_id;
 static int core_process_id;
@@ -44,18 +53,40 @@ static int soc_speedo_id;
 static int gpu_speedo_id;
 static int package_id;
 static int cpu_iddq_value;
+static int gpu_iddq_value;
+static int soc_iddq_value;
+
+static int cpu_speedo_0_value;
+static int cpu_speedo_1_value;
+static int cpu_speedo_2_value;
+static int soc_speedo_0_value;
+static int soc_speedo_1_value;
+static int soc_speedo_2_value;
 
 static int enable_app_profiles;
 
 void tegra_init_speedo_data(void)
 {
        cpu_speedo_value = TEGRA124_CPU_SPEEDO;
-       cpu_process_id = -1;
+
+       cpu_process_id  = -1;
        core_process_id = -1;
-       gpu_process_id = -1;
-       cpu_speedo_id = -1;
-       soc_speedo_id = -1;
-       gpu_speedo_id = -1;
+       gpu_process_id  = -1;
+       cpu_speedo_id   = -1;
+       soc_speedo_id   = -1;
+       gpu_speedo_id   = -1;
+
+       cpu_speedo_0_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_0);
+       cpu_speedo_1_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_1);
+       cpu_speedo_2_value = tegra_fuse_readl(FUSE_CPU_SPEEDO_2);
+
+       soc_speedo_0_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_0);
+       soc_speedo_1_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_1);
+       soc_speedo_2_value = tegra_fuse_readl(FUSE_SOC_SPEEDO_2);
+
+       cpu_iddq_value = tegra_fuse_readl(FUSE_CPU_IDDQ);
+       soc_iddq_value = tegra_fuse_readl(FUSE_SOC_IDDQ);
+       gpu_iddq_value = tegra_fuse_readl(FUSE_GPU_IDDQ);
 
        pr_info("Tegra12: CPU Speedo ID %d, Soc Speedo ID %d, Gpu Speedo ID %d",
                cpu_speedo_id, soc_speedo_id, gpu_speedo_id);
@@ -101,6 +132,35 @@ int tegra_cpu_speedo_value(void)
        return cpu_speedo_value;
 }
 
+int tegra_cpu_speedo_0_value(void)
+{
+       return cpu_speedo_0_value;
+}
+
+int tegra_cpu_speedo_1_value(void)
+{
+       return cpu_speedo_1_value;
+}
+
+int tegra_cpu_speedo_2_value(void)
+{
+       return cpu_speedo_2_value;
+}
+
+int tegra_soc_speedo_0_value(void)
+{
+       return soc_speedo_0_value;
+}
+
+int tegra_soc_speedo_1_value(void)
+{
+       return soc_speedo_1_value;
+}
+
+int tegra_soc_speedo_2_value(void)
+{
+       return soc_speedo_2_value;
+}
 /*
  * CPU and core nominal voltage levels as determined by chip SKU and speedo
  * (not final - can be lowered by dvfs tables and rail dependencies; the
@@ -128,11 +188,21 @@ int tegra_gpu_speedo_mv(void)
        return 1100;
 }
 
-int tegra_get_cpu_iddq_value()
+int tegra_get_cpu_iddq_value(void)
 {
        return cpu_iddq_value;
 }
 
+int tegra_get_soc_iddq_value(void)
+{
+       return soc_iddq_value;
+}
+
+int tegra_get_gpu_iddq_value(void)
+{
+       return gpu_iddq_value;
+}
+
 static int get_enable_app_profiles(char *val, const struct kernel_param *kp)
 {
        return param_get_uint(val, kp);