summaryrefslogtreecommitdiffstats
path: root/arch/mips/sgi/kernel/system.c
blob: d6b02c4c1075b8291c687bc8dd97bf50955fcb55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * system.c: Probe the system type using ARCS prom interface library.
 *
 * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
 *
 * $Id: system.c,v 1.6 1998/10/18 13:51:49 tsbogend Exp $
 */
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/string.h>

#include <asm/sgi.h>
#include <asm/sgialib.h>
#include <asm/bootinfo.h>

enum sgi_mach sgimach;

struct smatch {
	char *name;
	int type;
};

static struct smatch sgi_cputable[] = {
	{ "MIPS-R2000", CPU_R2000 },
	{ "MIPS-R3000", CPU_R3000 },
	{ "MIPS-R3000A", CPU_R3000A },
	{ "MIPS-R4000", CPU_R4000SC },
	{ "MIPS-R4400", CPU_R4400SC },
	{ "MIPS-R4600", CPU_R4600 },
	{ "MIPS-R8000", CPU_R8000 },
	{ "MIPS-R5000", CPU_R5000 },
	{ "MIPS-R5000A", CPU_R5000A }
};

#define NUM_CPUS 9 /* for now */

__initfunc(static int string_to_cpu(char *s))
{
	int i;

	for(i = 0; i < NUM_CPUS; i++) {
		if(!strcmp(s, sgi_cputable[i].name))
			return sgi_cputable[i].type;
	}
	prom_printf("\nYeee, could not determine MIPS cpu type <%s>\n", s);
	prom_printf("press a key to reboot\n");
	prom_getchar();
	romvec->imode();
	return 0;
}

/*
 * We' call this early before loadmmu().  If we do the other way around
 * the firmware will crash and burn.
 */
__initfunc(void sgi_sysinit(void))
{
	pcomponent *p, *toplev, *cpup = 0;
	int cputype = -1;


	/* The root component tells us what machine architecture we
	 * have here.
	 */
	p = prom_getchild(PROM_NULL_COMPONENT);

	/* Now scan for cpu(s). */
	toplev = p = prom_getchild(p);
	while(p) {
		int ncpus = 0;

		if(p->type == Cpu) {
			if(++ncpus > 1) {
				prom_printf("\nYeee, SGI MP not ready yet\n");
				prom_printf("press a key to reboot\n");
				prom_getchar();
				romvec->imode();
			}
			printk("CPU: %s ", p->iname);
			cpup = p;
			cputype = string_to_cpu(cpup->iname);
		}
		p = prom_getsibling(p);
	}
	if(cputype == -1) {
		prom_printf("\nYeee, could not find cpu ARCS component\n");
		prom_printf("press a key to reboot\n");
		prom_getchar();
		romvec->imode();
	}
	p = prom_getchild(cpup);
	while(p) {
		switch(p->class) {
		case processor:
			switch(p->type) {
			case Fpu:
				printk("FPU<%s> ", p->iname);
				break;

			default:
				break;
			};
			break;

		case cache:
			switch(p->type) {
			case picache:
				printk("ICACHE ");
				break;

			case pdcache:
				printk("DCACHE ");
				break;

			case sccache:
				printk("SCACHE ");
				break;

			default:
				break;

			};
			break;

		default:
			break;
		};
		p = prom_getsibling(p);
	}
	printk("\n");
}