ar71xx_setup.c revision 211502
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: head/sys/mips/atheros/ar71xx_setup.c 211502 2010-08-19 11:40:10Z adrian $"); 29211476Sadrian 30211476Sadrian#include <sys/param.h> 31211476Sadrian#include <machine/cpuregs.h> 32211476Sadrian 33211476Sadrian#include <mips/sentry5/s5reg.h> 34211476Sadrian 35211476Sadrian#include "opt_ddb.h" 36211476Sadrian 37211476Sadrian#include <sys/param.h> 38211476Sadrian#include <sys/conf.h> 39211476Sadrian#include <sys/kernel.h> 40211476Sadrian#include <sys/systm.h> 41211476Sadrian#include <sys/bus.h> 42211476Sadrian#include <sys/cons.h> 43211476Sadrian#include <sys/kdb.h> 44211476Sadrian#include <sys/reboot.h> 45211476Sadrian 46211476Sadrian#include <vm/vm.h> 47211476Sadrian#include <vm/vm_page.h> 48211476Sadrian 49211476Sadrian#include <net/ethernet.h> 50211476Sadrian 51211476Sadrian#include <machine/clock.h> 52211476Sadrian#include <machine/cpu.h> 53211476Sadrian#include <machine/hwfunc.h> 54211476Sadrian#include <machine/md_var.h> 55211476Sadrian#include <machine/trap.h> 56211476Sadrian#include <machine/vmparam.h> 57211476Sadrian 58211476Sadrian#include <mips/atheros/ar71xxreg.h> 59211476Sadrian#include <mips/atheros/ar71xx_setup.h> 60211476Sadrian 61211476Sadrian#include <mips/atheros/ar71xx_cpudef.h> 62211476Sadrian 63211476Sadrian#include <mips/atheros/ar71xx_chip.h> 64211502Sadrian#include <mips/atheros/ar91xx_chip.h> 65211476Sadrian 66211476Sadrian#define AR71XX_SYS_TYPE_LEN 128 67211476Sadrian 68211476Sadrianstatic char ar71xx_sys_type[AR71XX_SYS_TYPE_LEN]; 69211476Sadrianenum ar71xx_soc_type ar71xx_soc; 70211476Sadrianstruct ar71xx_cpu_def * ar71xx_cpu_ops = NULL; 71211476Sadrian 72211476Sadrianvoid 73211476Sadrianar71xx_detect_sys_type(void) 74211476Sadrian{ 75211476Sadrian char *chip = "????"; 76211476Sadrian uint32_t id; 77211476Sadrian uint32_t major; 78211476Sadrian uint32_t minor; 79211476Sadrian uint32_t rev = 0; 80211476Sadrian 81211476Sadrian id = ATH_READ_REG(AR71XX_RST_RESET_REG_REV_ID); 82211476Sadrian major = id & REV_ID_MAJOR_MASK; 83211476Sadrian 84211476Sadrian switch (major) { 85211476Sadrian case REV_ID_MAJOR_AR71XX: 86211476Sadrian minor = id & AR71XX_REV_ID_MINOR_MASK; 87211476Sadrian rev = id >> AR71XX_REV_ID_REVISION_SHIFT; 88211476Sadrian rev &= AR71XX_REV_ID_REVISION_MASK; 89211476Sadrian ar71xx_cpu_ops = &ar71xx_chip_def; 90211476Sadrian switch (minor) { 91211476Sadrian case AR71XX_REV_ID_MINOR_AR7130: 92211476Sadrian ar71xx_soc = AR71XX_SOC_AR7130; 93211476Sadrian chip = "7130"; 94211476Sadrian break; 95211476Sadrian 96211476Sadrian case AR71XX_REV_ID_MINOR_AR7141: 97211476Sadrian ar71xx_soc = AR71XX_SOC_AR7141; 98211476Sadrian chip = "7141"; 99211476Sadrian break; 100211476Sadrian 101211476Sadrian case AR71XX_REV_ID_MINOR_AR7161: 102211476Sadrian ar71xx_soc = AR71XX_SOC_AR7161; 103211476Sadrian chip = "7161"; 104211476Sadrian break; 105211476Sadrian } 106211476Sadrian break; 107211476Sadrian 108211502Sadrian case REV_ID_MAJOR_AR913X: 109211502Sadrian minor = id & AR91XX_REV_ID_MINOR_MASK; 110211502Sadrian rev = id >> AR91XX_REV_ID_REVISION_SHIFT; 111211502Sadrian rev &= AR91XX_REV_ID_REVISION_MASK; 112211502Sadrian ar71xx_cpu_ops = &ar91xx_chip_def; 113211502Sadrian switch (minor) { 114211502Sadrian case AR91XX_REV_ID_MINOR_AR9130: 115211502Sadrian ar71xx_soc = AR71XX_SOC_AR9130; 116211502Sadrian chip = "9130"; 117211502Sadrian break; 118211502Sadrian 119211502Sadrian case AR91XX_REV_ID_MINOR_AR9132: 120211502Sadrian ar71xx_soc = AR71XX_SOC_AR9132; 121211502Sadrian chip = "9132"; 122211502Sadrian break; 123211502Sadrian } 124211502Sadrian break; 125211502Sadrian 126211502Sadrian 127211476Sadrian default: 128211476Sadrian panic("ar71xx: unknown chip id:0x%08x\n", id); 129211476Sadrian } 130211476Sadrian 131211476Sadrian sprintf(ar71xx_sys_type, "Atheros AR%s rev %u", chip, rev); 132211476Sadrian} 133211476Sadrian 134211476Sadrianconst char * 135211476Sadrianar71xx_get_system_type(void) 136211476Sadrian{ 137211476Sadrian return ar71xx_sys_type; 138211476Sadrian} 139211476Sadrian 140