1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause
/*
* Copyright (C) 2023, STMicroelectronics - All Rights Reserved
*/
#define LOG_CATEGORY LOGC_ARCH
#include <common.h>
#include <log.h>
#include <syscon.h>
#include <asm/io.h>
#include <asm/arch/stm32.h>
#include <asm/arch/sys_proto.h>
/* SYSCFG register */
#define SYSCFG_DEVICEID_OFFSET 0x6400
#define SYSCFG_DEVICEID_DEV_ID_MASK GENMASK(11, 0)
#define SYSCFG_DEVICEID_DEV_ID_SHIFT 0
#define SYSCFG_DEVICEID_REV_ID_MASK GENMASK(31, 16)
#define SYSCFG_DEVICEID_REV_ID_SHIFT 16
/* Device Part Number (RPN) = OTP9 */
#define RPN_SHIFT 0
#define RPN_MASK GENMASK(31, 0)
/* Package = bit 0:2 of OTP122 => STM32MP25_PKG defines
* - 000: Custom package
* - 011: TFBGA361 => AL = 10x10, 361 balls pith 0.5mm
* - 100: TFBGA424 => AK = 14x14, 424 balls pith 0.5mm
* - 101: TFBGA436 => AI = 18x18, 436 balls pith 0.5mm
* - others: Reserved
*/
#define PKG_SHIFT 0
#define PKG_MASK GENMASK(2, 0)
static u32 read_deviceid(void)
{
void *syscfg = syscon_get_first_range(STM32MP_SYSCON_SYSCFG);
return readl(syscfg + SYSCFG_DEVICEID_OFFSET);
}
u32 get_cpu_dev(void)
{
return (read_deviceid() & SYSCFG_DEVICEID_DEV_ID_MASK) >> SYSCFG_DEVICEID_DEV_ID_SHIFT;
}
u32 get_cpu_rev(void)
{
return (read_deviceid() & SYSCFG_DEVICEID_REV_ID_MASK) >> SYSCFG_DEVICEID_REV_ID_SHIFT;
}
/* Get Device Part Number (RPN) from OTP */
u32 get_cpu_type(void)
{
return get_otp(BSEC_OTP_RPN, RPN_SHIFT, RPN_MASK);
}
/* Get Package options from OTP */
u32 get_cpu_package(void)
{
return get_otp(BSEC_OTP_PKG, PKG_SHIFT, PKG_MASK);
}
int get_eth_nb(void)
{
int nb_eth;
switch (get_cpu_type()) {
case CPU_STM32MP257Fxx:
fallthrough;
case CPU_STM32MP257Dxx:
fallthrough;
case CPU_STM32MP257Cxx:
fallthrough;
case CPU_STM32MP257Axx:
nb_eth = 5; /* dual ETH with TSN support */
break;
case CPU_STM32MP253Fxx:
fallthrough;
case CPU_STM32MP253Dxx:
fallthrough;
case CPU_STM32MP253Cxx:
fallthrough;
case CPU_STM32MP253Axx:
nb_eth = 2; /* dual ETH */
break;
case CPU_STM32MP251Fxx:
fallthrough;
case CPU_STM32MP251Dxx:
fallthrough;
case CPU_STM32MP251Cxx:
fallthrough;
case CPU_STM32MP251Axx:
nb_eth = 1; /* single ETH */
break;
default:
nb_eth = 0;
break;
}
return nb_eth;
}
void get_soc_name(char name[SOC_NAME_SIZE])
{
char *cpu_s, *cpu_r, *package;
cpu_s = "????";
cpu_r = "?";
package = "??";
if (get_cpu_dev() == CPU_DEV_STM32MP25) {
switch (get_cpu_type()) {
case CPU_STM32MP257Fxx:
cpu_s = "257F";
break;
case CPU_STM32MP257Dxx:
cpu_s = "257D";
break;
case CPU_STM32MP257Cxx:
cpu_s = "257C";
break;
case CPU_STM32MP257Axx:
cpu_s = "257A";
break;
case CPU_STM32MP255Fxx:
cpu_s = "255F";
break;
case CPU_STM32MP255Dxx:
cpu_s = "255D";
break;
case CPU_STM32MP255Cxx:
cpu_s = "255C";
break;
case CPU_STM32MP255Axx:
cpu_s = "255A";
break;
case CPU_STM32MP253Fxx:
cpu_s = "253F";
break;
case CPU_STM32MP253Dxx:
cpu_s = "253D";
break;
case CPU_STM32MP253Cxx:
cpu_s = "253C";
break;
case CPU_STM32MP253Axx:
cpu_s = "253A";
break;
case CPU_STM32MP251Fxx:
cpu_s = "251F";
break;
case CPU_STM32MP251Dxx:
cpu_s = "251D";
break;
case CPU_STM32MP251Cxx:
cpu_s = "251C";
break;
case CPU_STM32MP251Axx:
cpu_s = "251A";
break;
default:
cpu_s = "25??";
break;
}
/* REVISION */
switch (get_cpu_rev()) {
case CPU_REV1:
cpu_r = "A";
break;
default:
break;
}
/* PACKAGE */
switch (get_cpu_package()) {
case STM32MP25_PKG_CUSTOM:
package = "XX";
break;
case STM32MP25_PKG_AL_TBGA361:
package = "AL";
break;
case STM32MP25_PKG_AK_TBGA424:
package = "AK";
break;
case STM32MP25_PKG_AI_TBGA436:
package = "AI";
break;
default:
break;
}
}
snprintf(name, SOC_NAME_SIZE, "STM32MP%s%s Rev.%s", cpu_s, package, cpu_r);
}
|