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