1211476Sadrian/*- 2211476Sadrian * Copyright (c) 2010 Adrian Chadd 3211476Sadrian * All rights reserved. 4211476Sadrian * 5211476Sadrian * Redistribution and use in source and binary forms, with or without 6211476Sadrian * modification, are permitted provided that the following conditions 7211476Sadrian * are met: 8211476Sadrian * 1. Redistributions of source code must retain the above copyright 9211476Sadrian * notice, this list of conditions and the following disclaimer. 10211476Sadrian * 2. Redistributions in binary form must reproduce the above copyright 11211476Sadrian * notice, this list of conditions and the following disclaimer in the 12211476Sadrian * documentation and/or other materials provided with the distribution. 13211476Sadrian * 14211476Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15211476Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16211476Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17211476Sadrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18211476Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19211476Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20211476Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21211476Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22211476Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23211476Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24211476Sadrian * SUCH DAMAGE. 25211476Sadrian */ 26211476Sadrian 27211476Sadrian#include <sys/cdefs.h> 28211476Sadrian__FBSDID("$FreeBSD$"); 29211476Sadrian 30211476Sadrian#include "opt_ddb.h" 31211476Sadrian 32211476Sadrian#include <sys/param.h> 33211476Sadrian#include <sys/conf.h> 34211476Sadrian#include <sys/kernel.h> 35211476Sadrian#include <sys/systm.h> 36211476Sadrian#include <sys/bus.h> 37211476Sadrian#include <sys/cons.h> 38211476Sadrian#include <sys/kdb.h> 39211476Sadrian#include <sys/reboot.h> 40211476Sadrian 41211476Sadrian#include <vm/vm.h> 42211476Sadrian#include <vm/vm_page.h> 43211476Sadrian 44211476Sadrian#include <net/ethernet.h> 45211476Sadrian 46211476Sadrian#include <machine/clock.h> 47211476Sadrian#include <machine/cpu.h> 48223562Skevlo#include <machine/cpuregs.h> 49211476Sadrian#include <machine/hwfunc.h> 50211476Sadrian#include <machine/md_var.h> 51211476Sadrian#include <machine/trap.h> 52211476Sadrian#include <machine/vmparam.h> 53211476Sadrian 54211476Sadrian#include <mips/atheros/ar71xxreg.h> 55211476Sadrian#include <mips/atheros/ar71xx_setup.h> 56211476Sadrian 57211476Sadrian#include <mips/atheros/ar71xx_cpudef.h> 58211476Sadrian 59211476Sadrian#include <mips/atheros/ar71xx_chip.h> 60211503Sadrian#include <mips/atheros/ar724x_chip.h> 61211502Sadrian#include <mips/atheros/ar91xx_chip.h> 62211476Sadrian 63223562Skevlo#include <mips/sentry5/s5reg.h> 64223562Skevlo 65211476Sadrian#define AR71XX_SYS_TYPE_LEN 128 66211476Sadrian 67211476Sadrianstatic char ar71xx_sys_type[AR71XX_SYS_TYPE_LEN]; 68211476Sadrianenum ar71xx_soc_type ar71xx_soc; 69211476Sadrianstruct ar71xx_cpu_def * ar71xx_cpu_ops = NULL; 70211476Sadrian 71211476Sadrianvoid 72211476Sadrianar71xx_detect_sys_type(void) 73211476Sadrian{ 74211476Sadrian char *chip = "????"; 75211476Sadrian uint32_t id; 76211476Sadrian uint32_t major; 77211476Sadrian uint32_t minor; 78211476Sadrian uint32_t rev = 0; 79211476Sadrian 80211476Sadrian id = ATH_READ_REG(AR71XX_RST_RESET_REG_REV_ID); 81211476Sadrian major = id & REV_ID_MAJOR_MASK; 82211476Sadrian 83211476Sadrian switch (major) { 84211476Sadrian case REV_ID_MAJOR_AR71XX: 85211476Sadrian minor = id & AR71XX_REV_ID_MINOR_MASK; 86211476Sadrian rev = id >> AR71XX_REV_ID_REVISION_SHIFT; 87211476Sadrian rev &= AR71XX_REV_ID_REVISION_MASK; 88211504Sadrian ar71xx_cpu_ops = &ar71xx_chip_def; 89211476Sadrian switch (minor) { 90211476Sadrian case AR71XX_REV_ID_MINOR_AR7130: 91211476Sadrian ar71xx_soc = AR71XX_SOC_AR7130; 92211476Sadrian chip = "7130"; 93211476Sadrian break; 94211476Sadrian 95211476Sadrian case AR71XX_REV_ID_MINOR_AR7141: 96211476Sadrian ar71xx_soc = AR71XX_SOC_AR7141; 97211476Sadrian chip = "7141"; 98211476Sadrian break; 99211476Sadrian 100211476Sadrian case AR71XX_REV_ID_MINOR_AR7161: 101211476Sadrian ar71xx_soc = AR71XX_SOC_AR7161; 102211476Sadrian chip = "7161"; 103211476Sadrian break; 104211476Sadrian } 105211476Sadrian break; 106211476Sadrian 107211503Sadrian case REV_ID_MAJOR_AR7240: 108211503Sadrian ar71xx_soc = AR71XX_SOC_AR7240; 109211503Sadrian chip = "7240"; 110211504Sadrian ar71xx_cpu_ops = &ar724x_chip_def; 111211503Sadrian rev = (id & AR724X_REV_ID_REVISION_MASK); 112211503Sadrian break; 113211503Sadrian 114211503Sadrian case REV_ID_MAJOR_AR7241: 115211503Sadrian ar71xx_soc = AR71XX_SOC_AR7241; 116211503Sadrian chip = "7241"; 117211504Sadrian ar71xx_cpu_ops = &ar724x_chip_def; 118211503Sadrian rev = (id & AR724X_REV_ID_REVISION_MASK); 119211503Sadrian break; 120211503Sadrian 121211503Sadrian case REV_ID_MAJOR_AR7242: 122211503Sadrian ar71xx_soc = AR71XX_SOC_AR7242; 123211503Sadrian chip = "7242"; 124211504Sadrian ar71xx_cpu_ops = &ar724x_chip_def; 125211503Sadrian rev = (id & AR724X_REV_ID_REVISION_MASK); 126211503Sadrian break; 127211503Sadrian 128211502Sadrian case REV_ID_MAJOR_AR913X: 129211502Sadrian minor = id & AR91XX_REV_ID_MINOR_MASK; 130211502Sadrian rev = id >> AR91XX_REV_ID_REVISION_SHIFT; 131211502Sadrian rev &= AR91XX_REV_ID_REVISION_MASK; 132211504Sadrian ar71xx_cpu_ops = &ar91xx_chip_def; 133211502Sadrian switch (minor) { 134211502Sadrian case AR91XX_REV_ID_MINOR_AR9130: 135211502Sadrian ar71xx_soc = AR71XX_SOC_AR9130; 136211502Sadrian chip = "9130"; 137211502Sadrian break; 138211502Sadrian 139211502Sadrian case AR91XX_REV_ID_MINOR_AR9132: 140211502Sadrian ar71xx_soc = AR71XX_SOC_AR9132; 141211502Sadrian chip = "9132"; 142211502Sadrian break; 143211502Sadrian } 144211502Sadrian break; 145211502Sadrian 146211502Sadrian 147211476Sadrian default: 148211476Sadrian panic("ar71xx: unknown chip id:0x%08x\n", id); 149211476Sadrian } 150211476Sadrian 151211476Sadrian sprintf(ar71xx_sys_type, "Atheros AR%s rev %u", chip, rev); 152211476Sadrian} 153211476Sadrian 154211476Sadrianconst char * 155211476Sadrianar71xx_get_system_type(void) 156211476Sadrian{ 157211476Sadrian return ar71xx_sys_type; 158211476Sadrian} 159211476Sadrian 160