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