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