11d3d0f1fSWills Wang /* 21d3d0f1fSWills Wang * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com> 31d3d0f1fSWills Wang * 41d3d0f1fSWills Wang * SPDX-License-Identifier: GPL-2.0+ 51d3d0f1fSWills Wang */ 61d3d0f1fSWills Wang 71d3d0f1fSWills Wang #include <common.h> 81d3d0f1fSWills Wang #include <asm/io.h> 91d3d0f1fSWills Wang #include <asm/addrspace.h> 101d3d0f1fSWills Wang #include <asm/types.h> 111d3d0f1fSWills Wang #include <mach/ath79.h> 121d3d0f1fSWills Wang #include <mach/ar71xx_regs.h> 131d3d0f1fSWills Wang 141d3d0f1fSWills Wang struct ath79_soc_desc { 1559e4080cSWills Wang const enum ath79_soc_type soc; 161d3d0f1fSWills Wang const char *chip; 1759e4080cSWills Wang const int major; 1859e4080cSWills Wang const int minor; 191d3d0f1fSWills Wang }; 201d3d0f1fSWills Wang 2159e4080cSWills Wang static const struct ath79_soc_desc desc[] = { 221d3d0f1fSWills Wang {ATH79_SOC_AR7130, "7130", 231d3d0f1fSWills Wang REV_ID_MAJOR_AR71XX, AR71XX_REV_ID_MINOR_AR7130}, 241d3d0f1fSWills Wang {ATH79_SOC_AR7141, "7141", 251d3d0f1fSWills Wang REV_ID_MAJOR_AR71XX, AR71XX_REV_ID_MINOR_AR7141}, 261d3d0f1fSWills Wang {ATH79_SOC_AR7161, "7161", 271d3d0f1fSWills Wang REV_ID_MAJOR_AR71XX, AR71XX_REV_ID_MINOR_AR7161}, 281d3d0f1fSWills Wang {ATH79_SOC_AR7240, "7240", REV_ID_MAJOR_AR7240, 0}, 291d3d0f1fSWills Wang {ATH79_SOC_AR7241, "7241", REV_ID_MAJOR_AR7241, 0}, 301d3d0f1fSWills Wang {ATH79_SOC_AR7242, "7242", REV_ID_MAJOR_AR7242, 0}, 311d3d0f1fSWills Wang {ATH79_SOC_AR9130, "9130", 321d3d0f1fSWills Wang REV_ID_MAJOR_AR913X, AR913X_REV_ID_MINOR_AR9130}, 331d3d0f1fSWills Wang {ATH79_SOC_AR9132, "9132", 341d3d0f1fSWills Wang REV_ID_MAJOR_AR913X, AR913X_REV_ID_MINOR_AR9132}, 351d3d0f1fSWills Wang {ATH79_SOC_AR9330, "9330", REV_ID_MAJOR_AR9330, 0}, 361d3d0f1fSWills Wang {ATH79_SOC_AR9331, "9331", REV_ID_MAJOR_AR9331, 0}, 371d3d0f1fSWills Wang {ATH79_SOC_AR9341, "9341", REV_ID_MAJOR_AR9341, 0}, 381d3d0f1fSWills Wang {ATH79_SOC_AR9342, "9342", REV_ID_MAJOR_AR9342, 0}, 391d3d0f1fSWills Wang {ATH79_SOC_AR9344, "9344", REV_ID_MAJOR_AR9344, 0}, 401d3d0f1fSWills Wang {ATH79_SOC_QCA9533, "9533", REV_ID_MAJOR_QCA9533, 0}, 411d3d0f1fSWills Wang {ATH79_SOC_QCA9533, "9533", 421d3d0f1fSWills Wang REV_ID_MAJOR_QCA9533_V2, 0}, 431d3d0f1fSWills Wang {ATH79_SOC_QCA9556, "9556", REV_ID_MAJOR_QCA9556, 0}, 441d3d0f1fSWills Wang {ATH79_SOC_QCA9558, "9558", REV_ID_MAJOR_QCA9558, 0}, 451d3d0f1fSWills Wang {ATH79_SOC_TP9343, "9343", REV_ID_MAJOR_TP9343, 0}, 461d3d0f1fSWills Wang {ATH79_SOC_QCA9561, "9561", REV_ID_MAJOR_QCA9561, 0}, 471d3d0f1fSWills Wang }; 481d3d0f1fSWills Wang 49*0dfe04d6SPaul Burton int mach_cpu_init(void) 501d3d0f1fSWills Wang { 511d3d0f1fSWills Wang void __iomem *base; 521d3d0f1fSWills Wang enum ath79_soc_type soc = ATH79_SOC_UNKNOWN; 531d3d0f1fSWills Wang u32 id, major, minor = 0; 541d3d0f1fSWills Wang u32 rev = 0, ver = 1; 551d3d0f1fSWills Wang int i; 561d3d0f1fSWills Wang 571d3d0f1fSWills Wang base = map_physmem(AR71XX_RESET_BASE, AR71XX_RESET_SIZE, 581d3d0f1fSWills Wang MAP_NOCACHE); 591d3d0f1fSWills Wang 601d3d0f1fSWills Wang id = readl(base + AR71XX_RESET_REG_REV_ID); 611d3d0f1fSWills Wang major = id & REV_ID_MAJOR_MASK; 621d3d0f1fSWills Wang switch (major) { 631d3d0f1fSWills Wang case REV_ID_MAJOR_AR71XX: 641d3d0f1fSWills Wang case REV_ID_MAJOR_AR913X: 651d3d0f1fSWills Wang minor = id & AR71XX_REV_ID_MINOR_MASK; 661d3d0f1fSWills Wang rev = id >> AR71XX_REV_ID_REVISION_SHIFT; 671d3d0f1fSWills Wang rev &= AR71XX_REV_ID_REVISION_MASK; 681d3d0f1fSWills Wang break; 691d3d0f1fSWills Wang 701d3d0f1fSWills Wang case REV_ID_MAJOR_QCA9533_V2: 711d3d0f1fSWills Wang ver = 2; 721d3d0f1fSWills Wang /* drop through */ 731d3d0f1fSWills Wang 741d3d0f1fSWills Wang case REV_ID_MAJOR_AR9341: 751d3d0f1fSWills Wang case REV_ID_MAJOR_AR9342: 761d3d0f1fSWills Wang case REV_ID_MAJOR_AR9344: 771d3d0f1fSWills Wang case REV_ID_MAJOR_QCA9533: 781d3d0f1fSWills Wang case REV_ID_MAJOR_QCA9556: 791d3d0f1fSWills Wang case REV_ID_MAJOR_QCA9558: 801d3d0f1fSWills Wang case REV_ID_MAJOR_TP9343: 811d3d0f1fSWills Wang case REV_ID_MAJOR_QCA9561: 821d3d0f1fSWills Wang rev = id & AR71XX_REV_ID_REVISION2_MASK; 831d3d0f1fSWills Wang break; 841d3d0f1fSWills Wang default: 851d3d0f1fSWills Wang rev = id & AR71XX_REV_ID_REVISION_MASK; 861d3d0f1fSWills Wang break; 871d3d0f1fSWills Wang } 881d3d0f1fSWills Wang 891d3d0f1fSWills Wang for (i = 0; i < ARRAY_SIZE(desc); i++) { 901d3d0f1fSWills Wang if ((desc[i].major == major) && 911d3d0f1fSWills Wang (desc[i].minor == minor)) { 921d3d0f1fSWills Wang soc = desc[i].soc; 931d3d0f1fSWills Wang break; 941d3d0f1fSWills Wang } 951d3d0f1fSWills Wang } 961d3d0f1fSWills Wang 971d3d0f1fSWills Wang gd->arch.id = id; 981d3d0f1fSWills Wang gd->arch.soc = soc; 991d3d0f1fSWills Wang gd->arch.rev = rev; 1001d3d0f1fSWills Wang gd->arch.ver = ver; 1011d3d0f1fSWills Wang return 0; 1021d3d0f1fSWills Wang } 1031d3d0f1fSWills Wang 1041d3d0f1fSWills Wang int print_cpuinfo(void) 1051d3d0f1fSWills Wang { 1061d3d0f1fSWills Wang enum ath79_soc_type soc = ATH79_SOC_UNKNOWN; 1071d3d0f1fSWills Wang const char *chip = "????"; 1081d3d0f1fSWills Wang u32 id, rev, ver; 1091d3d0f1fSWills Wang int i; 1101d3d0f1fSWills Wang 1111d3d0f1fSWills Wang for (i = 0; i < ARRAY_SIZE(desc); i++) { 1121d3d0f1fSWills Wang if (desc[i].soc == gd->arch.soc) { 1131d3d0f1fSWills Wang chip = desc[i].chip; 1141d3d0f1fSWills Wang soc = desc[i].soc; 1151d3d0f1fSWills Wang break; 1161d3d0f1fSWills Wang } 1171d3d0f1fSWills Wang } 1181d3d0f1fSWills Wang 1191d3d0f1fSWills Wang id = gd->arch.id; 1201d3d0f1fSWills Wang rev = gd->arch.rev; 1211d3d0f1fSWills Wang ver = gd->arch.ver; 1221d3d0f1fSWills Wang 1231d3d0f1fSWills Wang switch (soc) { 1241d3d0f1fSWills Wang case ATH79_SOC_QCA9533: 1251d3d0f1fSWills Wang case ATH79_SOC_QCA9556: 1261d3d0f1fSWills Wang case ATH79_SOC_QCA9558: 1271d3d0f1fSWills Wang case ATH79_SOC_QCA9561: 1281d3d0f1fSWills Wang printf("Qualcomm Atheros QCA%s ver %u rev %u\n", chip, 1291d3d0f1fSWills Wang ver, rev); 1301d3d0f1fSWills Wang break; 1311d3d0f1fSWills Wang case ATH79_SOC_TP9343: 1321d3d0f1fSWills Wang printf("Qualcomm Atheros TP%s rev %u\n", chip, rev); 1331d3d0f1fSWills Wang break; 1341d3d0f1fSWills Wang case ATH79_SOC_UNKNOWN: 1351d3d0f1fSWills Wang printf("ATH79: unknown SoC, id:0x%08x", id); 1361d3d0f1fSWills Wang break; 1371d3d0f1fSWills Wang default: 1381d3d0f1fSWills Wang printf("Atheros AR%s rev %u\n", chip, rev); 1391d3d0f1fSWills Wang } 1401d3d0f1fSWills Wang 1411d3d0f1fSWills Wang return 0; 1421d3d0f1fSWills Wang } 143