1 /*
2 * Copyright (C) 2017 Rockchip Electronics Co. Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 */
13
14 #ifndef __LINUX_ROCKCHIP_CPU_H
15 #define __LINUX_ROCKCHIP_CPU_H
16
17 #include <linux/of.h>
18
19 #define ROCKCHIP_CPU_MASK 0xffff0000
20 #define ROCKCHIP_CPU_SHIFT 16
21 #define ROCKCHIP_CPU_PX30 0x33260000
22 #define ROCKCHIP_CPU_RV1103 0x11030000
23 #define ROCKCHIP_CPU_RV1106 0x11060000
24 #define ROCKCHIP_CPU_RV1109 0x11090000
25 #define ROCKCHIP_CPU_RV1126 0x11260000
26 #define ROCKCHIP_CPU_RK312X 0x31260000
27 #define ROCKCHIP_CPU_RK3288 0x32880000
28 #define ROCKCHIP_CPU_RK3308 0x33080000
29 #define ROCKCHIP_CPU_RK3528 0x35280000
30 #define ROCKCHIP_CPU_RK3566 0x35660000
31 #define ROCKCHIP_CPU_RK3568 0x35680000
32
33 #if IS_REACHABLE(CONFIG_ROCKCHIP_CPUINFO)
34
35 extern unsigned long rockchip_soc_id;
36
37 #define ROCKCHIP_CPU_VERION_MASK 0x0000f000
38 #define ROCKCHIP_CPU_VERION_SHIFT 12
39
rockchip_get_cpu_version(void)40 static inline unsigned long rockchip_get_cpu_version(void)
41 {
42 return (rockchip_soc_id & ROCKCHIP_CPU_VERION_MASK)
43 >> ROCKCHIP_CPU_VERION_SHIFT;
44 }
45
rockchip_set_cpu_version(unsigned long ver)46 static inline void rockchip_set_cpu_version(unsigned long ver)
47 {
48 rockchip_soc_id &= ~ROCKCHIP_CPU_VERION_MASK;
49 rockchip_soc_id |=
50 (ver << ROCKCHIP_CPU_VERION_SHIFT) & ROCKCHIP_CPU_VERION_MASK;
51 }
52
rockchip_set_cpu(unsigned long code)53 static inline void rockchip_set_cpu(unsigned long code)
54 {
55 if (!code)
56 return;
57
58 rockchip_soc_id &= ~ROCKCHIP_CPU_MASK;
59 rockchip_soc_id |= (code << ROCKCHIP_CPU_SHIFT) & ROCKCHIP_CPU_MASK;
60 }
61
62 int rockchip_soc_id_init(void);
63
64 #else
65
66 #define rockchip_soc_id 0
67
rockchip_get_cpu_version(void)68 static inline unsigned long rockchip_get_cpu_version(void)
69 {
70 return 0;
71 }
72
rockchip_set_cpu_version(unsigned long ver)73 static inline void rockchip_set_cpu_version(unsigned long ver)
74 {
75 }
76
rockchip_set_cpu(unsigned long code)77 static inline void rockchip_set_cpu(unsigned long code)
78 {
79 }
80
rockchip_soc_id_init(void)81 static inline int rockchip_soc_id_init(void)
82 {
83 return 0;
84 }
85
86 #endif
87
88 #ifdef CONFIG_CPU_PX30
cpu_is_px30(void)89 static inline bool cpu_is_px30(void)
90 {
91 if (rockchip_soc_id)
92 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_PX30;
93 return of_machine_is_compatible("rockchip,px30") ||
94 of_machine_is_compatible("rockchip,px30s") ||
95 of_machine_is_compatible("rockchip,rk3326") ||
96 of_machine_is_compatible("rockchip,rk3326s");
97 }
98 #else
cpu_is_px30(void)99 static inline bool cpu_is_px30(void) { return false; }
100 #endif
101
102 #if defined(CONFIG_CPU_RV1106)
cpu_is_rv1103(void)103 static inline bool cpu_is_rv1103(void)
104 {
105 if (rockchip_soc_id)
106 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RV1103;
107 return of_machine_is_compatible("rockchip,rv1103");
108 }
109
cpu_is_rv1106(void)110 static inline bool cpu_is_rv1106(void)
111 {
112 if (rockchip_soc_id)
113 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RV1106;
114 return of_machine_is_compatible("rockchip,rv1106");
115 }
116 #else
cpu_is_rv1103(void)117 static inline bool cpu_is_rv1103(void) { return false; }
cpu_is_rv1106(void)118 static inline bool cpu_is_rv1106(void) { return false; }
119 #endif
120
121 #if defined(CONFIG_CPU_RV1126) || defined(CONFIG_CPU_RV1109)
cpu_is_rv1109(void)122 static inline bool cpu_is_rv1109(void)
123 {
124 if (rockchip_soc_id)
125 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RV1109;
126 return of_machine_is_compatible("rockchip,rv1109");
127 }
128
cpu_is_rv1126(void)129 static inline bool cpu_is_rv1126(void)
130 {
131 if (rockchip_soc_id)
132 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RV1126;
133 return of_machine_is_compatible("rockchip,rv1126");
134 }
135 #else
cpu_is_rv1109(void)136 static inline bool cpu_is_rv1109(void) { return false; }
cpu_is_rv1126(void)137 static inline bool cpu_is_rv1126(void) { return false; }
138 #endif
139
140 #ifdef CONFIG_CPU_RK312X
cpu_is_rk312x(void)141 static inline bool cpu_is_rk312x(void)
142 {
143 if (rockchip_soc_id)
144 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK312X;
145 return of_machine_is_compatible("rockchip,rk3126") ||
146 of_machine_is_compatible("rockchip,rk3126b") ||
147 of_machine_is_compatible("rockchip,rk3126c") ||
148 of_machine_is_compatible("rockchip,rk3128");
149 }
150 #else
cpu_is_rk312x(void)151 static inline bool cpu_is_rk312x(void) { return false; }
152 #endif
153
154 #ifdef CONFIG_CPU_RK3288
cpu_is_rk3288(void)155 static inline bool cpu_is_rk3288(void)
156 {
157 if (rockchip_soc_id)
158 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3288;
159 return of_machine_is_compatible("rockchip,rk3288") ||
160 of_machine_is_compatible("rockchip,rk3288w");
161 }
162 #else
cpu_is_rk3288(void)163 static inline bool cpu_is_rk3288(void) { return false; }
164 #endif
165
166 #ifdef CONFIG_CPU_RK3308
cpu_is_rk3308(void)167 static inline bool cpu_is_rk3308(void)
168 {
169 if (rockchip_soc_id)
170 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3308;
171
172 return of_machine_is_compatible("rockchip,rk3308") ||
173 of_machine_is_compatible("rockchip,rk3308bs");
174 }
175 #else
cpu_is_rk3308(void)176 static inline bool cpu_is_rk3308(void) { return false; }
177 #endif
178
179 #if defined(CONFIG_CPU_RK3528)
cpu_is_rk3528(void)180 static inline bool cpu_is_rk3528(void)
181 {
182 if (rockchip_soc_id)
183 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3528;
184 return of_machine_is_compatible("rockchip,rk3528");
185 }
186 #else
cpu_is_rk3528(void)187 static inline bool cpu_is_rk3528(void) { return false; }
188 #endif
189
190 #if defined(CONFIG_CPU_RK3568)
cpu_is_rk3566(void)191 static inline bool cpu_is_rk3566(void)
192 {
193 if (rockchip_soc_id)
194 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3566;
195 return of_machine_is_compatible("rockchip,rk3566");
196 }
197
cpu_is_rk3568(void)198 static inline bool cpu_is_rk3568(void)
199 {
200 if (rockchip_soc_id)
201 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3568;
202 return of_machine_is_compatible("rockchip,rk3568");
203 }
204 #else
cpu_is_rk3566(void)205 static inline bool cpu_is_rk3566(void) { return false; }
cpu_is_rk3568(void)206 static inline bool cpu_is_rk3568(void) { return false; }
207 #endif
208
209 #define ROCKCHIP_SOC_MASK (ROCKCHIP_CPU_MASK | 0xff)
210 #define ROCKCHIP_SOC_PX30 (ROCKCHIP_CPU_PX30 | 0x00)
211 #define ROCKCHIP_SOC_PX30S (ROCKCHIP_CPU_PX30 | 0x01)
212 #define ROCKCHIP_SOC_RV1103 (ROCKCHIP_CPU_RV1103 | 0x00)
213 #define ROCKCHIP_SOC_RV1106 (ROCKCHIP_CPU_RV1106 | 0x00)
214 #define ROCKCHIP_SOC_RV1109 (ROCKCHIP_CPU_RV1109 | 0x00)
215 #define ROCKCHIP_SOC_RV1126 (ROCKCHIP_CPU_RV1126 | 0x00)
216 #define ROCKCHIP_SOC_RK3126 (ROCKCHIP_CPU_RK312X | 0x00)
217 #define ROCKCHIP_SOC_RK3126B (ROCKCHIP_CPU_RK312X | 0x10)
218 #define ROCKCHIP_SOC_RK3126C (ROCKCHIP_CPU_RK312X | 0x20)
219 #define ROCKCHIP_SOC_RK3128 (ROCKCHIP_CPU_RK312X | 0x01)
220 #define ROCKCHIP_SOC_RK3288 (ROCKCHIP_CPU_RK3288 | 0x00)
221 #define ROCKCHIP_SOC_RK3288W (ROCKCHIP_CPU_RK3288 | 0x01)
222 #define ROCKCHIP_SOC_RK3308 (ROCKCHIP_CPU_RK3308 | 0x00)
223 #define ROCKCHIP_SOC_RK3308B (ROCKCHIP_CPU_RK3308 | 0x01)
224 #define ROCKCHIP_SOC_RK3308BS (ROCKCHIP_CPU_RK3308 | 0x02)
225 #define ROCKCHIP_SOC_RK3528 (ROCKCHIP_CPU_RK3528 | 0x00)
226 #define ROCKCHIP_SOC_RK3566 (ROCKCHIP_CPU_RK3566 | 0x00)
227 #define ROCKCHIP_SOC_RK3568 (ROCKCHIP_CPU_RK3568 | 0x00)
228
229 #define ROCKCHIP_SOC(CPU, id, ID) \
230 static inline bool soc_is_##id(void) \
231 { \
232 if (!IS_ENABLED(CONFIG_CPU_##CPU)) \
233 return false; \
234 if (rockchip_soc_id) \
235 return ((rockchip_soc_id & ROCKCHIP_SOC_MASK) == ROCKCHIP_SOC_ ##ID); \
236 return of_machine_is_compatible("rockchip,"#id); \
237 }
238
239 ROCKCHIP_SOC(PX30, px30, PX30)
240 ROCKCHIP_SOC(PX30, px30s, PX30S)
241 ROCKCHIP_SOC(RV1106, rv1103, RV1103)
242 ROCKCHIP_SOC(RV1106, rv1106, RV1106)
243 ROCKCHIP_SOC(RV1126, rv1109, RV1109)
244 ROCKCHIP_SOC(RV1126, rv1126, RV1126)
245 ROCKCHIP_SOC(RK312X, rk3126, RK3126)
246 ROCKCHIP_SOC(RK312X, rk3126b, RK3126B)
247 ROCKCHIP_SOC(RK312X, rk3126c, RK3126C)
248 ROCKCHIP_SOC(RK312X, rk3128, RK3128)
249 ROCKCHIP_SOC(RK3288, rk3288, RK3288)
250 ROCKCHIP_SOC(RK3288, rk3288w, RK3288W)
251 ROCKCHIP_SOC(RK3308, rk3308, RK3308)
252 ROCKCHIP_SOC(RK3308, rk3308b, RK3308B)
253 ROCKCHIP_SOC(RK3308, rk3308bs, RK3308BS)
254 ROCKCHIP_SOC(RK3528, rk3528, RK3528)
255 ROCKCHIP_SOC(RK3568, rk3566, RK3566)
256 ROCKCHIP_SOC(RK3568, rk3568, RK3568)
257
258 #endif
259