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