xref: /openbmc/u-boot/arch/arm/mach-aspeed/ast2500/scu_info.c (revision 00d75f3fdc1e374fb8f5f270eebc4f1e5fe04c1c)
1*00d75f3fSChia-Wei, Wang // SPDX-License-Identifier: GPL-2.0+
2*00d75f3fSChia-Wei, Wang /*
3*00d75f3fSChia-Wei, Wang  * Copyright (C) ASPEED Technology Inc.
4*00d75f3fSChia-Wei, Wang  * Ryan Chen <ryan_chen@aspeedtech.com>
5*00d75f3fSChia-Wei, Wang  */
6*00d75f3fSChia-Wei, Wang 
7*00d75f3fSChia-Wei, Wang #include <common.h>
8*00d75f3fSChia-Wei, Wang #include <errno.h>
9*00d75f3fSChia-Wei, Wang #include <asm/io.h>
10*00d75f3fSChia-Wei, Wang #include <asm/arch/platform.h>
11*00d75f3fSChia-Wei, Wang #include <asm/arch/aspeed_scu_info.h>
12*00d75f3fSChia-Wei, Wang 
13*00d75f3fSChia-Wei, Wang /* SoC mapping Table */
14*00d75f3fSChia-Wei, Wang #define SOC_ID(str, rev) { .name = str, .rev_id = rev, }
15*00d75f3fSChia-Wei, Wang 
16*00d75f3fSChia-Wei, Wang struct soc_id {
17*00d75f3fSChia-Wei, Wang 	const char *name;
18*00d75f3fSChia-Wei, Wang 	u32	   rev_id;
19*00d75f3fSChia-Wei, Wang };
20*00d75f3fSChia-Wei, Wang 
21*00d75f3fSChia-Wei, Wang static struct soc_id soc_map_table[] = {
22*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1100/AST2050-A0", 0x00000200),
23*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1100/AST2050-A1", 0x00000201),
24*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1100/AST2050-A2,3/AST2150-A0,1", 0x00000202),
25*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1510/AST2100-A0", 0x00000300),
26*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1510/AST2100-A1", 0x00000301),
27*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1510/AST2100-A2,3", 0x00000302),
28*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2200-A0,1", 0x00000102),
29*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2300-A0", 0x01000003),
30*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2300-A1", 0x01010303),
31*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1300-A1", 0x01010003),
32*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1050-A1", 0x01010203),
33*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2400-A0", 0x02000303),
34*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2400-A1", 0x02010303),
35*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1010-A0", 0x03000003),
36*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1010-A1", 0x03010003),
37*00d75f3fSChia-Wei, Wang 	SOC_ID("AST3200-A0", 0x04002003),
38*00d75f3fSChia-Wei, Wang 	SOC_ID("AST3200-A1", 0x04012003),
39*00d75f3fSChia-Wei, Wang 	SOC_ID("AST3200-A2", 0x04032003),
40*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1520-A0", 0x03000203),
41*00d75f3fSChia-Wei, Wang 	SOC_ID("AST1520-A1", 0x03010203),
42*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2510-A0", 0x04000103),
43*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2510-A1", 0x04010103),
44*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2510-A2", 0x04030103),
45*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2520-A0", 0x04000203),
46*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2520-A1", 0x04010203),
47*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2520-A2", 0x04030203),
48*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2500-A0", 0x04000303),
49*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2500-A1", 0x04010303),
50*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2500-A2", 0x04030303),
51*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2530-A0", 0x04000403),
52*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2530-A1", 0x04010403),
53*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2530-A2", 0x04030403),
54*00d75f3fSChia-Wei, Wang 	SOC_ID("AST2600-A0", 0x05000303),
55*00d75f3fSChia-Wei, Wang };
56*00d75f3fSChia-Wei, Wang 
57*00d75f3fSChia-Wei, Wang void aspeed_print_soc_id(void)
58*00d75f3fSChia-Wei, Wang {
59*00d75f3fSChia-Wei, Wang 	int i;
60*00d75f3fSChia-Wei, Wang 	u32 rev_id = readl(ASPEED_REVISION_ID);
61*00d75f3fSChia-Wei, Wang 	for (i = 0; i < ARRAY_SIZE(soc_map_table); i++) {
62*00d75f3fSChia-Wei, Wang 		if (rev_id == soc_map_table[i].rev_id)
63*00d75f3fSChia-Wei, Wang 			break;
64*00d75f3fSChia-Wei, Wang 	}
65*00d75f3fSChia-Wei, Wang 	if (i == ARRAY_SIZE(soc_map_table))
66*00d75f3fSChia-Wei, Wang 		printf("UnKnow-SOC : %x \n",rev_id);
67*00d75f3fSChia-Wei, Wang 	else
68*00d75f3fSChia-Wei, Wang 		printf("SOC : %4s \n",soc_map_table[i].name);
69*00d75f3fSChia-Wei, Wang }
70*00d75f3fSChia-Wei, Wang 
71*00d75f3fSChia-Wei, Wang int aspeed_get_mac_phy_interface(u8 num)
72*00d75f3fSChia-Wei, Wang {
73*00d75f3fSChia-Wei, Wang 	u32 strap1 = readl(ASPEED_HW_STRAP1);
74*00d75f3fSChia-Wei, Wang #ifdef ASPEED_HW_STRAP2
75*00d75f3fSChia-Wei, Wang 	u32 strap2 = readl(ASPEED_HW_STRAP2);
76*00d75f3fSChia-Wei, Wang #endif
77*00d75f3fSChia-Wei, Wang 	switch(num) {
78*00d75f3fSChia-Wei, Wang 		case 0:
79*00d75f3fSChia-Wei, Wang 			if(strap1 & BIT(6)) {
80*00d75f3fSChia-Wei, Wang 				return 1;
81*00d75f3fSChia-Wei, Wang 			} else {
82*00d75f3fSChia-Wei, Wang 				return 0;
83*00d75f3fSChia-Wei, Wang 			}
84*00d75f3fSChia-Wei, Wang 			break;
85*00d75f3fSChia-Wei, Wang 		case 1:
86*00d75f3fSChia-Wei, Wang 			if(strap1 & BIT(7)) {
87*00d75f3fSChia-Wei, Wang 				return 1;
88*00d75f3fSChia-Wei, Wang 			} else {
89*00d75f3fSChia-Wei, Wang 				return 0;
90*00d75f3fSChia-Wei, Wang 			}
91*00d75f3fSChia-Wei, Wang 			break;
92*00d75f3fSChia-Wei, Wang #ifdef ASPEED_HW_STRAP2
93*00d75f3fSChia-Wei, Wang 		case 2:
94*00d75f3fSChia-Wei, Wang 			if(strap2 & BIT(0)) {
95*00d75f3fSChia-Wei, Wang 				return 1;
96*00d75f3fSChia-Wei, Wang 			} else {
97*00d75f3fSChia-Wei, Wang 				return 0;
98*00d75f3fSChia-Wei, Wang 			}
99*00d75f3fSChia-Wei, Wang 			break;
100*00d75f3fSChia-Wei, Wang 		case 3:
101*00d75f3fSChia-Wei, Wang 			if(strap2 & BIT(1)) {
102*00d75f3fSChia-Wei, Wang 				return 1;
103*00d75f3fSChia-Wei, Wang 			} else {
104*00d75f3fSChia-Wei, Wang 				return 0;
105*00d75f3fSChia-Wei, Wang 			}
106*00d75f3fSChia-Wei, Wang 			break;
107*00d75f3fSChia-Wei, Wang #endif
108*00d75f3fSChia-Wei, Wang 	}
109*00d75f3fSChia-Wei, Wang 	return -1;
110*00d75f3fSChia-Wei, Wang }
111*00d75f3fSChia-Wei, Wang 
112*00d75f3fSChia-Wei, Wang void aspeed_print_security_info(void)
113*00d75f3fSChia-Wei, Wang {
114*00d75f3fSChia-Wei, Wang 	switch((readl(ASPEED_HW_STRAP2) >> 18) & 0x3) {
115*00d75f3fSChia-Wei, Wang 		case 1:
116*00d75f3fSChia-Wei, Wang 			printf("SEC : DSS Mode \n");
117*00d75f3fSChia-Wei, Wang 			break;
118*00d75f3fSChia-Wei, Wang 		case 2:
119*00d75f3fSChia-Wei, Wang 			printf("SEC : UnKnow \n");
120*00d75f3fSChia-Wei, Wang 			break;
121*00d75f3fSChia-Wei, Wang 		case 3:
122*00d75f3fSChia-Wei, Wang 			printf("SEC : SPI2 Mode \n");
123*00d75f3fSChia-Wei, Wang 			break;
124*00d75f3fSChia-Wei, Wang 	}
125*00d75f3fSChia-Wei, Wang }
126*00d75f3fSChia-Wei, Wang 
127*00d75f3fSChia-Wei, Wang /*	ASPEED_SYS_RESET_CTRL	: System reset contrl/status register*/
128*00d75f3fSChia-Wei, Wang #define SYS_WDT3_RESET			BIT(4)
129*00d75f3fSChia-Wei, Wang #define SYS_WDT2_RESET			BIT(3)
130*00d75f3fSChia-Wei, Wang #define SYS_WDT1_RESET			BIT(2)
131*00d75f3fSChia-Wei, Wang #define SYS_EXT_RESET			BIT(1)
132*00d75f3fSChia-Wei, Wang #define SYS_PWR_RESET_FLAG		BIT(0)
133*00d75f3fSChia-Wei, Wang 
134*00d75f3fSChia-Wei, Wang void aspeed_print_sysrst_info(void)
135*00d75f3fSChia-Wei, Wang {
136*00d75f3fSChia-Wei, Wang 	u32 rest = readl(ASPEED_SYS_RESET_CTRL);
137*00d75f3fSChia-Wei, Wang 
138*00d75f3fSChia-Wei, Wang 	if (rest & SYS_WDT1_RESET) {
139*00d75f3fSChia-Wei, Wang 		printf("RST : WDT1 \n");
140*00d75f3fSChia-Wei, Wang 		writel(readl(ASPEED_SYS_RESET_CTRL) & ~SYS_WDT1_RESET, ASPEED_SYS_RESET_CTRL);
141*00d75f3fSChia-Wei, Wang 	}
142*00d75f3fSChia-Wei, Wang 	if (rest & SYS_WDT2_RESET) {
143*00d75f3fSChia-Wei, Wang 		printf("RST : WDT2 - 2nd Boot \n");
144*00d75f3fSChia-Wei, Wang 		writel(readl(ASPEED_SYS_RESET_CTRL) & ~SYS_WDT2_RESET, ASPEED_SYS_RESET_CTRL);
145*00d75f3fSChia-Wei, Wang 		if(readl(0x1e785030) & BIT(1))
146*00d75f3fSChia-Wei, Wang 			puts("default boot\n");
147*00d75f3fSChia-Wei, Wang 		else
148*00d75f3fSChia-Wei, Wang 			puts("second boot\n");
149*00d75f3fSChia-Wei, Wang 	}
150*00d75f3fSChia-Wei, Wang 	if (rest & SYS_WDT3_RESET) {
151*00d75f3fSChia-Wei, Wang 		printf("RST : WDT3 - Boot\n");
152*00d75f3fSChia-Wei, Wang 		writel(readl(ASPEED_SYS_RESET_CTRL) & ~SYS_WDT3_RESET, ASPEED_SYS_RESET_CTRL);
153*00d75f3fSChia-Wei, Wang 	}
154*00d75f3fSChia-Wei, Wang 	if(rest & SYS_EXT_RESET) {
155*00d75f3fSChia-Wei, Wang 		printf("RST : External \n");
156*00d75f3fSChia-Wei, Wang 		writel(readl(ASPEED_SYS_RESET_CTRL) & ~SYS_EXT_RESET, ASPEED_SYS_RESET_CTRL);
157*00d75f3fSChia-Wei, Wang 	}
158*00d75f3fSChia-Wei, Wang 	if (rest & SYS_PWR_RESET_FLAG) {
159*00d75f3fSChia-Wei, Wang 		printf("RST : Power On \n");
160*00d75f3fSChia-Wei, Wang 		writel(readl(ASPEED_SYS_RESET_CTRL) & ~SYS_PWR_RESET_FLAG, ASPEED_SYS_RESET_CTRL);
161*00d75f3fSChia-Wei, Wang 	}
162*00d75f3fSChia-Wei, Wang }
163*00d75f3fSChia-Wei, Wang 
164*00d75f3fSChia-Wei, Wang #define SOC_FW_INIT_DRAM		BIT(7)
165*00d75f3fSChia-Wei, Wang 
166*00d75f3fSChia-Wei, Wang void aspeed_print_dram_initializer(void)
167*00d75f3fSChia-Wei, Wang {
168*00d75f3fSChia-Wei, Wang 	if(readl(ASPEED_VGA_HANDSHAKE0) & SOC_FW_INIT_DRAM)
169*00d75f3fSChia-Wei, Wang 		printf("[init by SOC]\n");
170*00d75f3fSChia-Wei, Wang 	else
171*00d75f3fSChia-Wei, Wang 		printf("[init by VBIOS]\n");
172*00d75f3fSChia-Wei, Wang }
173*00d75f3fSChia-Wei, Wang 
174*00d75f3fSChia-Wei, Wang void aspeed_print_2nd_wdt_mode(void)
175*00d75f3fSChia-Wei, Wang {
176*00d75f3fSChia-Wei, Wang 	if(readl(ASPEED_HW_STRAP1) & BIT(17))
177*00d75f3fSChia-Wei, Wang 		printf("2nd Boot : Enable\n");
178*00d75f3fSChia-Wei, Wang }
179*00d75f3fSChia-Wei, Wang 
180*00d75f3fSChia-Wei, Wang void aspeed_print_spi_strap_mode(void)
181*00d75f3fSChia-Wei, Wang {
182*00d75f3fSChia-Wei, Wang 	return;
183*00d75f3fSChia-Wei, Wang }
184*00d75f3fSChia-Wei, Wang 
185*00d75f3fSChia-Wei, Wang void aspeed_print_espi_mode(void)
186*00d75f3fSChia-Wei, Wang {
187*00d75f3fSChia-Wei, Wang 	int espi_mode = 0;
188*00d75f3fSChia-Wei, Wang 	int sio_disable = 0;
189*00d75f3fSChia-Wei, Wang 	u32 sio_addr = 0x2e;
190*00d75f3fSChia-Wei, Wang 
191*00d75f3fSChia-Wei, Wang 	if(readl(ASPEED_HW_STRAP1) & BIT(25))
192*00d75f3fSChia-Wei, Wang 		espi_mode = 1;
193*00d75f3fSChia-Wei, Wang 	else
194*00d75f3fSChia-Wei, Wang 		espi_mode = 0;
195*00d75f3fSChia-Wei, Wang 
196*00d75f3fSChia-Wei, Wang 	if(readl(ASPEED_HW_STRAP1) & BIT(16))
197*00d75f3fSChia-Wei, Wang 		sio_addr = 0x4e;
198*00d75f3fSChia-Wei, Wang 
199*00d75f3fSChia-Wei, Wang 	if(readl(ASPEED_HW_STRAP1) & BIT(20))
200*00d75f3fSChia-Wei, Wang 		sio_disable = 1;
201*00d75f3fSChia-Wei, Wang 
202*00d75f3fSChia-Wei, Wang 	if(espi_mode)
203*00d75f3fSChia-Wei, Wang 		printf("eSPI Mode : SIO:%s ",  sio_disable ? "Disable" : "Enable");
204*00d75f3fSChia-Wei, Wang 	else
205*00d75f3fSChia-Wei, Wang 		printf("LPC Mode : SIO:%s ",  sio_disable ? "Disable" : "Enable");
206*00d75f3fSChia-Wei, Wang 
207*00d75f3fSChia-Wei, Wang 	if(!sio_disable)
208*00d75f3fSChia-Wei, Wang 		printf(": SuperIO-%02x\n",  sio_addr);
209*00d75f3fSChia-Wei, Wang 	else
210*00d75f3fSChia-Wei, Wang 		printf("\n");
211*00d75f3fSChia-Wei, Wang }
212*00d75f3fSChia-Wei, Wang 
213*00d75f3fSChia-Wei, Wang void aspeed_print_mac_info(void)
214*00d75f3fSChia-Wei, Wang {
215*00d75f3fSChia-Wei, Wang 	int i;
216*00d75f3fSChia-Wei, Wang 	printf("Eth :\n");
217*00d75f3fSChia-Wei, Wang 	for (i = 0; i < ASPEED_MAC_COUNT; i++)
218*00d75f3fSChia-Wei, Wang 		printf("    MAC%d: %s\n", i,
219*00d75f3fSChia-Wei, Wang 				aspeed_get_mac_phy_interface(i) ? "RGMII" : "RMII/NCSI");
220*00d75f3fSChia-Wei, Wang }
221