Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | |
3 | * License. See the file "COPYING" in the main directory of this archive | |
4 | * for more details. | |
5 | * | |
6 | * identify.c: identify machine by looking up system identifier | |
7 | * | |
8 | * Copyright (C) 1998 Thomas Bogendoerfer | |
9 | * | |
10 | * This code is based on arch/mips/sgi/kernel/system.c, which is | |
11 | * | |
12 | * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) | |
13 | */ | |
1da177e4 LT |
14 | #include <linux/init.h> |
15 | #include <linux/kernel.h> | |
16 | #include <linux/types.h> | |
17 | #include <linux/string.h> | |
18 | ||
19 | #include <asm/sgialib.h> | |
20 | #include <asm/bootinfo.h> | |
21 | ||
22 | struct smatch { | |
23 | char *arcname; | |
24 | char *liname; | |
1da177e4 LT |
25 | int type; |
26 | int flags; | |
27 | }; | |
28 | ||
29 | static struct smatch mach_table[] = { | |
112b20a1 RB |
30 | { |
31 | .arcname = "SGI-IP22", | |
32 | .liname = "SGI Indy", | |
112b20a1 RB |
33 | .type = MACH_SGI_IP22, |
34 | .flags = PROM_FLAG_ARCS, | |
35 | }, { | |
36 | .arcname = "SGI-IP27", | |
37 | .liname = "SGI Origin", | |
112b20a1 RB |
38 | .type = MACH_SGI_IP27, |
39 | .flags = PROM_FLAG_ARCS, | |
40 | }, { | |
41 | .arcname = "SGI-IP28", | |
42 | .liname = "SGI IP28", | |
112b20a1 RB |
43 | .type = MACH_SGI_IP28, |
44 | .flags = PROM_FLAG_ARCS, | |
45 | }, { | |
46 | .arcname = "SGI-IP30", | |
47 | .liname = "SGI Octane", | |
112b20a1 RB |
48 | .type = MACH_SGI_IP30, |
49 | .flags = PROM_FLAG_ARCS, | |
50 | }, { | |
51 | .arcname = "SGI-IP32", | |
52 | .liname = "SGI O2", | |
112b20a1 RB |
53 | .type = MACH_SGI_IP32, |
54 | .flags = PROM_FLAG_ARCS, | |
55 | }, { | |
56 | .arcname = "Microsoft-Jazz", | |
57 | .liname = "Jazz MIPS_Magnum_4000", | |
112b20a1 RB |
58 | .type = MACH_MIPS_MAGNUM_4000, |
59 | .flags = 0, | |
60 | }, { | |
61 | .arcname = "PICA-61", | |
62 | .liname = "Jazz Acer_PICA_61", | |
112b20a1 RB |
63 | .type = MACH_ACER_PICA_61, |
64 | .flags = 0, | |
65 | }, { | |
66 | .arcname = "RM200PCI", | |
67 | .liname = "SNI RM200_PCI", | |
112b20a1 | 68 | .type = MACH_SNI_RM200_PCI, |
330117ff TB |
69 | .flags = PROM_FLAG_DONT_FREE_TEMP, |
70 | }, { | |
71 | .arcname = "RM200PCI-R5K", | |
72 | .liname = "SNI RM200_PCI-R5K", | |
73 | .type = MACH_SNI_RM200_PCI, | |
112b20a1 | 74 | .flags = PROM_FLAG_DONT_FREE_TEMP, |
1da177e4 LT |
75 | } |
76 | }; | |
77 | ||
78 | int prom_flags; | |
79 | ||
80 | static struct smatch * __init string_to_mach(const char *s) | |
81 | { | |
82 | int i; | |
83 | ||
25b8ac3b | 84 | for (i = 0; i < ARRAY_SIZE(mach_table); i++) { |
1da177e4 LT |
85 | if (!strcmp(s, mach_table[i].arcname)) |
86 | return &mach_table[i]; | |
87 | } | |
88 | ||
89 | panic("Yeee, could not determine architecture type <%s>", s); | |
90 | } | |
91 | ||
92 | char *system_type; | |
93 | ||
94 | const char *get_system_type(void) | |
95 | { | |
96 | return system_type; | |
97 | } | |
98 | ||
99 | void __init prom_identify_arch(void) | |
100 | { | |
101 | pcomponent *p; | |
102 | struct smatch *mach; | |
103 | const char *iname; | |
104 | ||
105 | /* | |
106 | * The root component tells us what machine architecture we have here. | |
107 | */ | |
108 | p = ArcGetChild(PROM_NULL_COMPONENT); | |
109 | if (p == NULL) { | |
110 | #ifdef CONFIG_SGI_IP27 | |
111 | /* IP27 PROM misbehaves, seems to not implement ARC | |
112 | GetChild(). So we just assume it's an IP27. */ | |
113 | iname = "SGI-IP27"; | |
114 | #else | |
115 | iname = "Unknown"; | |
116 | #endif | |
117 | } else | |
118 | iname = (char *) (long) p->iname; | |
119 | ||
120 | printk("ARCH: %s\n", iname); | |
121 | mach = string_to_mach(iname); | |
122 | system_type = mach->liname; | |
123 | ||
1da177e4 LT |
124 | mips_machtype = mach->type; |
125 | prom_flags = mach->flags; | |
126 | } |