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_RV1109 0x11090000
22 #define ROCKCHIP_CPU_RV1126 0x11260000
23 #define ROCKCHIP_CPU_RK312X 0x31260000
24 #define ROCKCHIP_CPU_RK3288 0x32880000
25 #define ROCKCHIP_CPU_RK3308 0x33080000
26 #define ROCKCHIP_CPU_RK3566 0x35660000
27 #define ROCKCHIP_CPU_RK3568 0x35680000
28
29 #if IS_ENABLED(CONFIG_ROCKCHIP_CPUINFO)
30
31 extern unsigned long rockchip_soc_id;
32
33 #define ROCKCHIP_CPU_VERION_MASK 0x0000f000
34 #define ROCKCHIP_CPU_VERION_SHIFT 12
35
rockchip_get_cpu_version(void)36 static inline unsigned long rockchip_get_cpu_version(void)
37 {
38 return (rockchip_soc_id & ROCKCHIP_CPU_VERION_MASK)
39 >> ROCKCHIP_CPU_VERION_SHIFT;
40 }
41
rockchip_set_cpu_version(unsigned long ver)42 static inline void rockchip_set_cpu_version(unsigned long ver)
43 {
44 rockchip_soc_id &= ~ROCKCHIP_CPU_VERION_MASK;
45 rockchip_soc_id |=
46 (ver << ROCKCHIP_CPU_VERION_SHIFT) & ROCKCHIP_CPU_VERION_MASK;
47 }
48
rockchip_set_cpu(unsigned long code)49 static inline void rockchip_set_cpu(unsigned long code)
50 {
51 if (!code)
52 return;
53
54 rockchip_soc_id &= ~ROCKCHIP_CPU_MASK;
55 rockchip_soc_id |= (code << ROCKCHIP_CPU_SHIFT) & ROCKCHIP_CPU_MASK;
56 }
57
58 int rockchip_soc_id_init(void);
59
60 #else
61
62 #define rockchip_soc_id 0
63
rockchip_get_cpu_version(void)64 static inline unsigned long rockchip_get_cpu_version(void)
65 {
66 return 0;
67 }
68
rockchip_set_cpu_version(unsigned long ver)69 static inline void rockchip_set_cpu_version(unsigned long ver)
70 {
71 }
72
rockchip_set_cpu(unsigned long code)73 static inline void rockchip_set_cpu(unsigned long code)
74 {
75 }
76
rockchip_soc_id_init(void)77 static inline int rockchip_soc_id_init(void)
78 {
79 return 0;
80 }
81
82 #endif
83
84 #if defined(CONFIG_CPU_RV1126) || defined(CONFIG_CPU_RV1109)
cpu_is_rv1109(void)85 static inline bool cpu_is_rv1109(void)
86 {
87 if (rockchip_soc_id)
88 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RV1109;
89 return of_machine_is_compatible("rockchip,rv1109");
90 }
91
cpu_is_rv1126(void)92 static inline bool cpu_is_rv1126(void)
93 {
94 if (rockchip_soc_id)
95 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RV1126;
96 return of_machine_is_compatible("rockchip,rv1126");
97 }
98 #else
cpu_is_rv1109(void)99 static inline bool cpu_is_rv1109(void) { return false; }
cpu_is_rv1126(void)100 static inline bool cpu_is_rv1126(void) { return false; }
101 #endif
102
103 #ifdef CONFIG_CPU_RK312X
cpu_is_rk312x(void)104 static inline bool cpu_is_rk312x(void)
105 {
106 if (rockchip_soc_id)
107 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK312X;
108 return of_machine_is_compatible("rockchip,rk3126") ||
109 of_machine_is_compatible("rockchip,rk3126b") ||
110 of_machine_is_compatible("rockchip,rk3126c") ||
111 of_machine_is_compatible("rockchip,rk3128");
112 }
113 #else
cpu_is_rk312x(void)114 static inline bool cpu_is_rk312x(void) { return false; }
115 #endif
116
117 #ifdef CONFIG_CPU_RK3288
cpu_is_rk3288(void)118 static inline bool cpu_is_rk3288(void)
119 {
120 if (rockchip_soc_id)
121 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3288;
122 return of_machine_is_compatible("rockchip,rk3288") ||
123 of_machine_is_compatible("rockchip,rk3288w");
124 }
125 #else
cpu_is_rk3288(void)126 static inline bool cpu_is_rk3288(void) { return false; }
127 #endif
128
129 #ifdef CONFIG_CPU_RK3308
cpu_is_rk3308(void)130 static inline bool cpu_is_rk3308(void)
131 {
132 if (rockchip_soc_id)
133 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3308;
134
135 return of_machine_is_compatible("rockchip,rk3308");
136 }
137 #else
cpu_is_rk3308(void)138 static inline bool cpu_is_rk3308(void) { return false; }
139 #endif
140
141 #if defined(CONFIG_CPU_RK3568)
cpu_is_rk3566(void)142 static inline bool cpu_is_rk3566(void)
143 {
144 if (rockchip_soc_id)
145 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3566;
146 return of_machine_is_compatible("rockchip,rk3566");
147 }
148
cpu_is_rk3568(void)149 static inline bool cpu_is_rk3568(void)
150 {
151 if (rockchip_soc_id)
152 return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3568;
153 return of_machine_is_compatible("rockchip,rk3568");
154 }
155 #else
cpu_is_rk3566(void)156 static inline bool cpu_is_rk3566(void) { return false; }
cpu_is_rk3568(void)157 static inline bool cpu_is_rk3568(void) { return false; }
158 #endif
159
160 #define ROCKCHIP_SOC_MASK (ROCKCHIP_CPU_MASK | 0xff)
161 #define ROCKCHIP_SOC_RV1109 (ROCKCHIP_CPU_RV1109 | 0x00)
162 #define ROCKCHIP_SOC_RV1126 (ROCKCHIP_CPU_RV1126 | 0x00)
163 #define ROCKCHIP_SOC_RK3126 (ROCKCHIP_CPU_RK312X | 0x00)
164 #define ROCKCHIP_SOC_RK3126B (ROCKCHIP_CPU_RK312X | 0x10)
165 #define ROCKCHIP_SOC_RK3126C (ROCKCHIP_CPU_RK312X | 0x20)
166 #define ROCKCHIP_SOC_RK3128 (ROCKCHIP_CPU_RK312X | 0x01)
167 #define ROCKCHIP_SOC_RK3288 (ROCKCHIP_CPU_RK3288 | 0x00)
168 #define ROCKCHIP_SOC_RK3288W (ROCKCHIP_CPU_RK3288 | 0x01)
169 #define ROCKCHIP_SOC_RK3308 (ROCKCHIP_CPU_RK3308 | 0x00)
170 #define ROCKCHIP_SOC_RK3308B (ROCKCHIP_CPU_RK3308 | 0x01)
171 #define ROCKCHIP_SOC_RK3566 (ROCKCHIP_CPU_RK3566 | 0x00)
172 #define ROCKCHIP_SOC_RK3568 (ROCKCHIP_CPU_RK3568 | 0x00)
173
174 #define ROCKCHIP_SOC(id, ID) \
175 static inline bool soc_is_##id(void) \
176 { \
177 if (rockchip_soc_id) \
178 return ((rockchip_soc_id & ROCKCHIP_SOC_MASK) == ROCKCHIP_SOC_ ##ID); \
179 return of_machine_is_compatible("rockchip,"#id); \
180 }
181
182 ROCKCHIP_SOC(rv1109, RV1109)
183 ROCKCHIP_SOC(rv1126, RV1126)
184 ROCKCHIP_SOC(rk3126, RK3126)
185 ROCKCHIP_SOC(rk3126b, RK3126B)
186 ROCKCHIP_SOC(rk3126c, RK3126C)
187 ROCKCHIP_SOC(rk3128, RK3128)
188 ROCKCHIP_SOC(rk3288, RK3288)
189 ROCKCHIP_SOC(rk3288w, RK3288W)
190 ROCKCHIP_SOC(rk3308, RK3308)
191 ROCKCHIP_SOC(rk3308b, RK3308B)
192 ROCKCHIP_SOC(rk3566, RK3566)
193 ROCKCHIP_SOC(rk3568, RK3568)
194
195 #endif
196