ARM: tegra: add GPU frequency capping
[linux-3.10.git] / arch / arm / mach-tegra / include / mach / thermal.h
1 /*
2  * arch/arm/mach-tegra/thermal.h
3  *
4  * Copyright (c) 2010-2013 NVIDIA CORPORATION. All rights reserved.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #ifndef __MACH_THERMAL_H
18 #define __MACH_THERMAL_H
19
20 #include <linux/therm_est.h>
21 #include <linux/thermal.h>
22
23 struct tegra_cooling_device {
24         char *cdev_type;
25         int *trip_temperatures;
26         int trip_temperatures_num;
27 };
28
29 #define MAX_THROT_TABLE_SIZE    (64)
30 #define NO_CAP                  (ULONG_MAX) /* no cap */
31 #define CPU_THROT_LOW           0 /* lowest throttle freq. only used for CPU */
32
33 #ifdef CONFIG_TEGRA_DUAL_CBUS
34 #ifdef CONFIG_TEGRA_GPU_DVFS
35 #define NUM_OF_CAP_FREQS        5 /* cpu, gpu, c3bus, sclk, emc */
36 #else
37 #define NUM_OF_CAP_FREQS        5 /* cpu, c2bus, c3bus, sclk, emc */
38 #endif
39 #else
40 #define NUM_OF_CAP_FREQS        4 /* cpu, cbus, sclk, emc */
41 #endif
42
43 struct throttle_table {
44         unsigned long cap_freqs[NUM_OF_CAP_FREQS];
45 };
46
47 struct balanced_throttle {
48         struct thermal_cooling_device *cdev;
49         struct list_head node;
50         unsigned long cur_state;
51         int throttle_count;
52         int throt_tab_size;
53         struct throttle_table *throt_tab;
54 };
55
56 /* TODO : remove when GPU clock is available in Linux Clock Framework */
57 struct gk20a_clk_cap_info {
58         struct gk20a *g;
59         int (*set_cap_thermal)(struct gk20a *g, unsigned long rate);
60         unsigned long (*get_max)(void);
61 };
62
63 #ifdef CONFIG_TEGRA_THERMAL_THROTTLE
64 int tegra_throttle_init(struct mutex *cpu_lock);
65 struct thermal_cooling_device *balanced_throttle_register(
66                 struct balanced_throttle *bthrot,
67                 char *type);
68 void tegra_throttle_exit(void);
69 bool tegra_is_throttling(int *count);
70 unsigned long tegra_throttle_governor_speed(unsigned long requested_speed);
71 /* TODO : remove when GPU clock is available in Linux Clock Framework */
72 int tegra_throttle_gk20a_clk_cap_register(struct gk20a_clk_cap_info *gk20a_clk);
73 #else
74 static inline int tegra_throttle_init(struct mutex *cpu_lock)
75 { return 0; }
76 static inline struct thermal_cooling_device *balanced_throttle_register(
77                 struct balanced_throttle *bthrot,
78                 char *type)
79 { return ERR_PTR(-ENODEV); }
80 static inline void tegra_throttle_exit(void)
81 {}
82 static inline bool tegra_is_throttling(int *count)
83 { return false; }
84 static inline unsigned long tegra_throttle_governor_speed(
85         unsigned long requested_speed)
86 { return requested_speed; }
87 /* TODO : remove when GPU clock is available in Linux Clock Framework */
88 static int tegra_throttle_gk20a_clk_cap_register(
89                                 struct gk20a_clk_cap_info *gk20a_clk)
90 { return 0; }
91 #endif /* CONFIG_TEGRA_THERMAL_THROTTLE */
92
93 #endif  /* __MACH_THERMAL_H */