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