xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/cpu.h (revision 5a94b26492fd3ad20c580976e18e101b67d14e6e)
1 /* SPDX-License-Identifier: GPL-2.0+  */
2 /*
3  * Rockchip Electronics Co., Ltd.
4  *
5  */
6 
7 #ifndef __ASM_ARCH_CPU_H
8 #define __ASM_ARCH_CPU_H
9 
10 #include <asm/io.h>
11 #include <dm/device.h>
12 
13 #define ROCKCHIP_CPU_MASK       0xffff0000
14 #define ROCKCHIP_CPU_RK312X     0x31260000
15 #define ROCKCHIP_CPU_RK3288     0x32880000
16 #define ROCKCHIP_CPU_RK3308	0x33080000
17 #define ROCKCHIP_CPU_RK3566	0x35660000
18 #define ROCKCHIP_CPU_RK3568	0x35680000
19 
20 #define ROCKCHIP_SOC_MASK	(ROCKCHIP_CPU_MASK | 0xff)
21 #define ROCKCHIP_SOC_RK3126     (ROCKCHIP_CPU_RK312X | 0x00)
22 #define ROCKCHIP_SOC_RK3126B    (ROCKCHIP_CPU_RK312X | 0x10)
23 #define ROCKCHIP_SOC_RK3126C    (ROCKCHIP_CPU_RK312X | 0x20)
24 #define ROCKCHIP_SOC_RK3128     (ROCKCHIP_CPU_RK312X | 0x01)
25 #define ROCKCHIP_SOC_RK3288     (ROCKCHIP_CPU_RK3288 | 0x00)
26 #define ROCKCHIP_SOC_RK3288W    (ROCKCHIP_CPU_RK3288 | 0x01)
27 #define ROCKCHIP_SOC_RK3308	(ROCKCHIP_CPU_RK3308 | 0x00)
28 #define ROCKCHIP_SOC_RK3308B	(ROCKCHIP_CPU_RK3308 | 0x01)
29 #define ROCKCHIP_SOC_RK3308BS	(ROCKCHIP_CPU_RK3308 | 0x02)
30 #define ROCKCHIP_SOC_RK3566	(ROCKCHIP_CPU_RK3566 | 0x00)
31 #define ROCKCHIP_SOC_RK3568	(ROCKCHIP_CPU_RK3568 | 0x00)
32 
33 static inline unsigned long rockchip_get_cpu_version(void)
34 {
35 #if defined(CONFIG_ROCKCHIP_RK3568)
36 #define PMUGRF_SOC_CON15	0xfdc20100
37 	if (readl(PMUGRF_SOC_CON15) & GENMASK(15, 14))
38 		return 1;
39 	else
40 		return 0;
41 #else
42 	return 0;
43 #endif
44 }
45 
46 static inline int rockchip_soc_id(void)
47 {
48 #if defined(CONFIG_ROCKCHIP_RK3288)
49 	/* RK3288W HDMI Revision ID is 0x1A */
50 	if (readl(0xFF980004) == 0x1A)
51 		return ROCKCHIP_SOC_RK3288W;
52 	else
53 		return ROCKCHIP_SOC_RK3288;
54 #elif defined(CONFIG_ROCKCHIP_RK3308)
55 	/*
56 	 * The CHIP_ID is stored in GRF_CHIP_ID:
57 	 * RK3308:  0xcea (3306 in decimal)
58 	 * RK3308B: 0x3308
59 	 * RK3308BS: 0x3308c
60 	 */
61 	u32 v = readl(0xFF000800);
62 
63 	if (v == 3306)
64 		return ROCKCHIP_SOC_RK3308;
65 	else if (v == 0x3308c)
66 		return ROCKCHIP_SOC_RK3308BS;
67 	else
68 		return ROCKCHIP_SOC_RK3308B;
69 #elif defined(CONFIG_ROCKCHIP_RK3568)
70 	if (of_machine_is_compatible("rockchip,rk3566"))
71 		return ROCKCHIP_SOC_RK3566;
72 	else
73 		return ROCKCHIP_SOC_RK3568;
74 #else
75 	return 0;
76 #endif
77 }
78 
79 #define ROCKCHIP_SOC(id, ID) \
80 static inline bool soc_is_##id(void) \
81 { \
82 	int soc_id = rockchip_soc_id(); \
83 	if (soc_id) \
84 		return ((soc_id & ROCKCHIP_SOC_MASK) == ROCKCHIP_SOC_ ##ID); \
85 	return false; \
86 }
87 
88 ROCKCHIP_SOC(rk3126, RK3126)
89 ROCKCHIP_SOC(rk3126b, RK3126B)
90 ROCKCHIP_SOC(rk3126c, RK3126C)
91 ROCKCHIP_SOC(rk3128, RK3128)
92 ROCKCHIP_SOC(rk3288, RK3288)
93 ROCKCHIP_SOC(rk3288w, RK3288W)
94 ROCKCHIP_SOC(rk3308, RK3308)
95 ROCKCHIP_SOC(rk3308b, RK3308B)
96 ROCKCHIP_SOC(rk3308bs, RK3308BS)
97 ROCKCHIP_SOC(rk3566, RK3566)
98 ROCKCHIP_SOC(rk3568, RK3568)
99 
100 #endif
101