ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / include / mach / mc.h
1 /*
2  * arch/arm/mach-tegra/include/mach/mc.h
3  *
4  * Copyright (C) 2010-2012 Google, Inc.
5  * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved.
6  *
7  * Author:
8  *      Erik Gilling <konkers@google.com>
9  *
10  * This software is licensed under the terms of the GNU General Public
11  * License version 2, as published by the Free Software Foundation, and
12  * may be copied, distributed, and modified under those terms.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  */
20
21 #ifndef __MACH_TEGRA_MC_H
22 #define __MACH_TEGRA_MC_H
23
24 /* !!!FIXME!!! IMPLEMENT ME */
25 #define tegra_mc_set_priority(client, prio) \
26         do { /* nothing for now */ } while (0)
27
28 /*
29  * Number of unique interrupts we have for this chip.
30  */
31 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
32 #define INTR_COUNT      6
33 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
34 #define INTR_COUNT      8
35 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
36 #define INTR_COUNT      8
37 #else
38 #define INTR_COUNT      4
39 #endif
40
41 struct mc_client {
42         const char *name;
43         const char *swgid;
44         unsigned int intr_counts[INTR_COUNT];
45 };
46
47 #ifdef CONFIG_ARCH_TEGRA_11x_SOC
48 #define MC_DUAL_CHANNEL
49 #endif
50
51 extern void __iomem *mc;
52 #ifdef MC_DUAL_CHANNEL
53 extern void __iomem *mc1;
54 #endif
55
56 #include <linux/io.h>
57 #include <linux/debugfs.h>
58
59 /*
60  * Read and write functions for hitting the MC. mc_ind corresponds to the MC
61  * you wish to write to: 0 -> MC0, 1 -> MC1. If a chip does not have a
62  * secondary MC then reads/writes to said MC are silently dropped.
63  */
64 static inline u32 __mc_readl(int mc_ind, u32 reg)
65 {
66         if (!mc_ind)
67                 return readl(mc + reg);
68 #ifdef MC_DUAL_CHANNEL
69         else
70                 return readl(mc1 + reg);
71 #endif
72         return 0;
73 }
74
75 static inline void __mc_writel(int mc_ind, u32 val, u32 reg)
76 {
77         if (!mc_ind)
78                 writel(val, mc + reg);
79 #ifdef MC_DUAL_CHANNEL
80         else
81                 writel(val, mc1 + reg);
82 #endif
83 }
84
85 static inline u32 __mc_raw_readl(int mc_ind, u32 reg)
86 {
87         if (!mc_ind)
88                 return __raw_readl(mc + reg);
89 #ifdef MC_DUAL_CHANNEL
90         else
91                 return __raw_readl(mc1 + reg);
92 #endif
93         return 0;
94 }
95
96 static inline void __mc_raw_writel(int mc_ind, u32 val, u32 reg)
97 {
98         if (!mc_ind)
99                 __raw_writel(val, mc + reg);
100 #ifdef MC_DUAL_CHANNEL
101         else
102                 __raw_writel(val, mc1 + reg);
103 #endif
104 }
105
106 #define mc_readl(reg)       __mc_readl(0, reg)
107 #define mc_writel(val, reg) __mc_writel(0, val, reg)
108
109 int tegra_mc_get_tiled_memory_bandwidth_multiplier(void);
110
111 /*
112  * Tegra11 has dual 32-bit memory channels, while
113  * Tegra12 has single 64-bit memory channel.
114  * MC effectively operates as 64-bit bus.
115  */
116 static inline int tegra_mc_get_effective_bytes_width(void)
117 {
118 #if defined(CONFIG_ARCH_TEGRA_12x_SOC) || \
119         defined(CONFIG_ARCH_TEGRA_11x_SOC)
120         return 8;
121 #else
122         return 4;
123 #endif
124 }
125
126 unsigned int tegra_emc_bw_to_freq_req(unsigned int bw_kbps);
127 unsigned int tegra_emc_freq_req_to_bw(unsigned int freq_kbps);
128 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
129 void         tegra12_mc_latency_allowance_save(u32 **pctx);
130 void         tegra12_mc_latency_allowance_restore(u32 **pctx);
131 #endif
132
133 /* API to get freqency switch latency at given MC freq.
134  * freq_khz: Frequncy in KHz.
135  * retruns latency in microseconds.
136  */
137 static inline unsigned tegra_emc_dvfs_latency(unsigned int freq_khz)
138 {
139         /* The latency data is not available based on freq.
140          * H/W expects it to be around 3 to 4us.
141          */
142         return 4;
143 }
144
145 #define TEGRA_MC_CLIENT_AFI             0
146 #define TEGRA_MC_CLIENT_DC              2
147 #define TEGRA_MC_CLIENT_DCB             3
148 #define TEGRA_MC_CLIENT_EPP             4
149 #define TEGRA_MC_CLIENT_G2              5
150 #define TEGRA_MC_CLIENT_ISP             8
151 #define TEGRA_MC_CLIENT_MSENC           11
152 #define TEGRA_MC_CLIENT_MPE             11
153 #define TEGRA_MC_CLIENT_NV              12
154 #define TEGRA_MC_CLIENT_SATA            15
155 #define TEGRA_MC_CLIENT_VDE             16
156 #define TEGRA_MC_CLIENT_VI              17
157 #define TEGRA_MC_CLIENT_VIC             18
158 #define TEGRA_MC_CLIENT_XUSB_HOST       19
159 #define TEGRA_MC_CLIENT_XUSB_DEV        20
160 #define TEGRA_MC_CLIENT_TSEC            22
161 #define TEGRA_MC_CLIENT_ISPB            33
162 #define TEGRA_MC_CLIENT_GPU             34
163
164 int tegra_mc_flush(int id);
165 int tegra_mc_flush_done(int id);
166
167 #endif