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