1 /* *********************************************************************
2 * Broadcom Common Firmware Environment (CFE)
4 * All you never wanted to know about CPUs File: ui_cpuinfo.c
6 * Routines to display CPU info (common to all CPUs)
8 * Author: Mitch Lichtenberg (mpl@broadcom.com)
10 *********************************************************************
12 * Copyright 2000,2001,2002,2003
13 * Broadcom Corporation. All rights reserved.
15 * This software is furnished under license and may be used and
16 * copied only in accordance with the following terms and
17 * conditions. Subject to these conditions, you may download,
18 * copy, install, use, modify and distribute modified or unmodified
19 * copies of this software in source and/or binary form. No title
20 * or ownership is transferred hereby.
22 * 1) Any source code used, modified or distributed must reproduce
23 * and retain this copyright notice and list of conditions
24 * as they appear in the source file.
26 * 2) No right is granted to use any trade name, trademark, or
27 * logo of Broadcom Corporation. The "Broadcom Corporation"
28 * name may not be used to endorse or promote products derived
29 * from this software without the prior written permission of
30 * Broadcom Corporation.
32 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
33 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
34 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
35 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
36 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
37 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
38 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
39 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
40 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
41 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
42 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
43 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
44 * THE POSSIBILITY OF SUCH DAMAGE.
45 ********************************************************************* */
48 #include "lib_types.h"
49 #include "lib_queue.h"
50 #include "lib_printf.h"
51 #include "ui_command.h"
53 #include "sb1250_defs.h"
54 #include "sb1250_regs.h"
55 #include "sb1250_scd.h"
56 #include "sb1250_wid.h"
58 #include "bsp_config.h"
63 /* *********************************************************************
65 ********************************************************************* */
67 #define SB1250_PASS1 (K_SYS_REVISION_PASS1) /* 1 */
68 #define SB1250_PASS2 (K_SYS_REVISION_PASS2) /* 3 */
69 #define SB1250_PASS20FL (4)
70 #define SB1250_PASS20WB (3)
71 #define SB1250_PASS21FL (5)
72 #define SB1250_PASS21WB (6)
73 #define SB1250_STEP_A6 (7) /* A6 is really rev=4 && wid!=0 */
74 #define SB1250_STEP_A7 (8)
75 #define SB1250_STEP_B0 (9)
76 #define SB1250_STEP_A8 (11)
77 #define SB1250_STEP_B1 (16)
78 #define SB1250_STEP_B2 (17)
79 #define SB1250_STEP_C0 (32)
82 * This lets us override the WID by poking values into our PromICE
85 #undef A_SCD_SYSTEM_REVISION
86 #define A_SCD_SYSTEM_REVISION 0x1FC00508
87 #undef A_SCD_SYSTEM_MANUF
88 #define A_SCD_SYSTEM_MANUF 0x1FC00518
91 /* *********************************************************************
93 ********************************************************************* */
95 void sb1250_show_cpu_type(void);
97 /* XXXCGD: could be const, when env_setenv can cope. */
98 static char *show_cpu_type_bcm1250(uint64_t syscfg
, uint64_t sysrev
);
99 static char *show_cpu_type_bcm112x(uint64_t syscfg
, uint64_t sysrev
);
101 /* *********************************************************************
104 * Display board CPU information
111 ********************************************************************* */
112 void sb1250_show_cpu_type(void)
114 uint64_t syscfg
, sysrev
;
116 /* XXXCGD: could be const, when env_setenv can cope. */
118 char *(*infofn
)(uint64_t, uint64_t);
121 syscfg
= SBREADCSR(A_SCD_SYSTEM_CFG
);
122 sysrev
= SBREADCSR(A_SCD_SYSTEM_REVISION
);
124 switch (SYS_SOC_TYPE(sysrev
)) {
125 case K_SYS_SOC_TYPE_BCM1250
:
127 infofn
= show_cpu_type_bcm1250
;
130 case K_SYS_SOC_TYPE_BCM1120
:
132 infofn
= show_cpu_type_bcm112x
;
135 case K_SYS_SOC_TYPE_BCM1125
:
137 infofn
= show_cpu_type_bcm112x
;
140 case K_SYS_SOC_TYPE_BCM1125H
:
142 infofn
= show_cpu_type_bcm112x
;
146 sprintf(temp
, "unknown_%04x", (int)G_SYS_PART(sysrev
));
151 env_setenv("CPU_TYPE", envval
,
152 ENV_FLG_BUILTIN
| ENV_FLG_READONLY
| ENV_FLG_ADMIN
);
156 envval
= (*infofn
)(syscfg
, sysrev
);
157 if (envval
== NULL
) {
158 sprintf(temp
, "unknown_%02x", (int)G_SYS_REVISION(sysrev
));
161 env_setenv("CPU_REVISION", envval
,
162 ENV_FLG_BUILTIN
| ENV_FLG_READONLY
| ENV_FLG_ADMIN
);
164 /* Set # of CPUs based on 2nd hex digit of part number */
165 sprintf(temp
, "%d", (int)((G_SYS_PART(sysrev
) >> 8) & 0x0F));
166 env_setenv("CPU_NUM_CORES", temp
,
167 ENV_FLG_BUILTIN
| ENV_FLG_READONLY
| ENV_FLG_ADMIN
);
170 * Set variable that contains CPU speed, spit out config register
172 printf("SysCfg: %016llX [PLL_DIV: %d, IOB0_DIV: %s, IOB1_DIV: %s]\n",
174 (int)G_SYS_PLL_DIV(syscfg
),
175 (syscfg
& M_SYS_IOB0_DIV
) ? "CPUCLK/3" : "CPUCLK/4",
176 (syscfg
& M_SYS_IOB1_DIV
) ? "CPUCLK/2" : "CPUCLK/3");
178 plldiv
= G_SYS_PLL_DIV(syscfg
);
180 printf("PLL_DIV of zero found, assuming 6 (300MHz)\n");
184 sprintf(temp
,"%d", plldiv
* 50);
185 env_setenv("CPU_SPEED", temp
,
186 ENV_FLG_BUILTIN
| ENV_FLG_READONLY
| ENV_FLG_ADMIN
);
189 /* *********************************************************************
190 * show_cpu_type_bcm1250()
192 * Display CPU information for BCM1250 CPUs
195 * revstr: pointer to string pointer, to be filled in with
199 * none. fills in revstr.
200 ********************************************************************* */
202 show_cpu_type_bcm1250(uint64_t syscfg
, uint64_t sysrev
)
204 char *revstr
, *revprintstr
;
209 unsigned int cpu_pass
;
211 static uint8_t cachesizes
[16] = {4,2,2,2,2,1,1,1,2,1,1,1,2,1,1,0};
212 static char *binnames
[8] = {
214 "2CPU_FI_FD_F2 (OK)",
222 cpu_pass
= G_SYS_REVISION(sysrev
);
224 wid
= G_SYS_WID(SBREADCSR(A_SCD_SYSTEM_REVISION
));
225 wid
= WID_UNCONVOLUTE(wid
);
227 if ((wid
!= 0) && (cpu_pass
== 0x4)) {
228 cpu_pass
= SB1250_STEP_A6
;
234 revprintstr
= "Pass 1";
236 case SB1250_PASS20WB
:
238 revprintstr
= "Pass 2.0 (wirebond)";
240 case SB1250_PASS20FL
:
242 revprintstr
= "Pass 2.0 (flip-chip)";
244 case SB1250_PASS21WB
:
246 revprintstr
= "A4 Pass 2.1 (wirebond)";
248 case SB1250_PASS21FL
:
250 revprintstr
= "A3 Pass 2.1 (flip-chip)";
253 revstr
= revprintstr
= "A6";
256 revstr
= revprintstr
= "A7";
259 revprintstr
= "A8/A10";
263 revstr
= revprintstr
= "B0";
266 revstr
= revprintstr
= "B1";
269 revstr
= revprintstr
= "B2";
272 revstr
= revprintstr
= "C0";
276 sprintf(temp
, "rev 0x%x", (int)G_SYS_REVISION(sysrev
));
280 printf("CPU: BCM1250 %s\n", revprintstr
);
282 if (((G_SYS_PART(sysrev
) >> 8) & 0x0F) == 1) {
283 printf("[Uniprocessor CPU mode]\n");
287 * Report cache status if the cache was disabled, or the status of
288 * the cache test for non-WID pass2 and pass3 parts.
290 printf("L2 Cache Status: ");
291 if ((syscfg
& M_SYS_L2C_RESET
) != 0) {
292 printf("disabled via JTAG\n");
294 else if ((cpu_pass
== SB1250_PASS20FL
) || (cpu_pass
== SB1250_PASS20WB
) ||
295 (cpu_pass
== SB1250_STEP_C0
)) {
296 cachetest
= (SBREADCSR(A_MAC_REGISTER(2,R_MAC_HASH_BASE
)) & 0x0F);
297 printf("0x%llX Available L2 Cache: %dKB\n",cachetest
,
298 ((int)cachesizes
[(int)cachetest
])*128);
303 printf("Wafer ID: Not set\n");
305 else if (cpu_pass
!= SB1250_STEP_C0
) {
307 printf("Wafer ID: 0x%08X [Lot %d, Wafer %d]\n",wid
,
308 G_WID_LOTID(wid
),G_WID_WAFERID(wid
));
310 bin
= G_WID_BIN(wid
);
312 printf("Manuf Test: Bin %c [%s] ","EABCDFGH"[bin
],binnames
[bin
]);
314 if (bin
!= K_WID_BIN_2CPU_FI_FD_F2
) {
315 printf("L2:%d ",G_WID_L2QTR(wid
));
316 printf("CPU0:[I=%d D=%d] ",G_WID_CPU0_L1I(wid
),G_WID_CPU0_L1D(wid
));
317 printf("CPU1:[I=%d D=%d]",G_WID_CPU1_L1I(wid
),G_WID_CPU1_L1D(wid
));
322 if (cpu_pass
== SB1250_STEP_C0
) {
323 /* Read system_manuf register for C0 */
324 sysmanuf
= SBREADCSR(A_SCD_SYSTEM_MANUF
);
326 printf("SysManuf: %016llX [X: %d Y: %d]",sysmanuf
, (int)G_SYS_XPOS(sysmanuf
),
327 (int)G_SYS_YPOS(sysmanuf
));
334 /* *********************************************************************
335 * show_cpu_type_bcm112x()
337 * Display CPU information for BCM112x CPUs
340 * revstr: pointer to string pointer, to be filled in with
344 * none. fills in revstr.
345 ********************************************************************* */
347 show_cpu_type_bcm112x(uint64_t syscfg
, uint64_t sysrev
)
349 char *revstr
, *revprintstr
;
352 switch (G_SYS_REVISION(sysrev
)) {
353 case K_SYS_REVISION_BCM112x_A1
:
354 revstr
= revprintstr
= "A1";
356 case K_SYS_REVISION_BCM112x_A2
:
357 revstr
= revprintstr
= "A2";
361 sprintf(temp
, "rev 0x%x", (int)G_SYS_REVISION(sysrev
));
365 printf("CPU: %s %s\n", env_getenv("CPU_TYPE"), revprintstr
);
367 printf("L2 Cache: ");
368 if ((syscfg
& M_SYS_L2C_RESET
) != 0)
369 printf("disabled via JTAG\n");