12f56cfddSAurelien Jarno /* 22f56cfddSAurelien Jarno * This file is subject to the terms and conditions of the GNU General Public 32f56cfddSAurelien Jarno * License. See the file "COPYING" in the main directory of this archive 42f56cfddSAurelien Jarno * for more details. 52f56cfddSAurelien Jarno * 62f56cfddSAurelien Jarno * identify.c: identify machine by looking up system identifier 72f56cfddSAurelien Jarno * 82f56cfddSAurelien Jarno * Copyright (C) 1998 Thomas Bogendoerfer 92f56cfddSAurelien Jarno * 102f56cfddSAurelien Jarno * This code is based on arch/mips/sgi/kernel/system.c, which is 112f56cfddSAurelien Jarno * 122f56cfddSAurelien Jarno * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) 132f56cfddSAurelien Jarno */ 142f56cfddSAurelien Jarno #include <linux/init.h> 152f56cfddSAurelien Jarno #include <linux/kernel.h> 162f56cfddSAurelien Jarno #include <linux/types.h> 172f56cfddSAurelien Jarno #include <linux/string.h> 182f56cfddSAurelien Jarno 192f56cfddSAurelien Jarno #include <asm/sgialib.h> 202f56cfddSAurelien Jarno #include <asm/bootinfo.h> 212f56cfddSAurelien Jarno 222f56cfddSAurelien Jarno struct smatch { 232f56cfddSAurelien Jarno char *arcname; 242f56cfddSAurelien Jarno char *liname; 252f56cfddSAurelien Jarno int type; 262f56cfddSAurelien Jarno int flags; 272f56cfddSAurelien Jarno }; 282f56cfddSAurelien Jarno 292f56cfddSAurelien Jarno static struct smatch mach_table[] = { 30112b20a1SRalf Baechle { 31112b20a1SRalf Baechle .arcname = "SGI-IP22", 32112b20a1SRalf Baechle .liname = "SGI Indy", 33112b20a1SRalf Baechle .type = MACH_SGI_IP22, 34112b20a1SRalf Baechle .flags = PROM_FLAG_ARCS, 35112b20a1SRalf Baechle }, { 36112b20a1SRalf Baechle .arcname = "SGI-IP27", 37112b20a1SRalf Baechle .liname = "SGI Origin", 38112b20a1SRalf Baechle .type = MACH_SGI_IP27, 39112b20a1SRalf Baechle .flags = PROM_FLAG_ARCS, 40112b20a1SRalf Baechle }, { 41112b20a1SRalf Baechle .arcname = "SGI-IP28", 42112b20a1SRalf Baechle .liname = "SGI IP28", 43112b20a1SRalf Baechle .type = MACH_SGI_IP28, 44112b20a1SRalf Baechle .flags = PROM_FLAG_ARCS, 45112b20a1SRalf Baechle }, { 46112b20a1SRalf Baechle .arcname = "SGI-IP30", 47112b20a1SRalf Baechle .liname = "SGI Octane", 48112b20a1SRalf Baechle .type = MACH_SGI_IP30, 49112b20a1SRalf Baechle .flags = PROM_FLAG_ARCS, 50112b20a1SRalf Baechle }, { 51112b20a1SRalf Baechle .arcname = "SGI-IP32", 52112b20a1SRalf Baechle .liname = "SGI O2", 53112b20a1SRalf Baechle .type = MACH_SGI_IP32, 54112b20a1SRalf Baechle .flags = PROM_FLAG_ARCS, 55112b20a1SRalf Baechle }, { 56112b20a1SRalf Baechle .arcname = "Microsoft-Jazz", 57112b20a1SRalf Baechle .liname = "Jazz MIPS_Magnum_4000", 58112b20a1SRalf Baechle .type = MACH_MIPS_MAGNUM_4000, 59112b20a1SRalf Baechle .flags = 0, 60112b20a1SRalf Baechle }, { 61112b20a1SRalf Baechle .arcname = "PICA-61", 62112b20a1SRalf Baechle .liname = "Jazz Acer_PICA_61", 63112b20a1SRalf Baechle .type = MACH_ACER_PICA_61, 64112b20a1SRalf Baechle .flags = 0, 65112b20a1SRalf Baechle }, { 66112b20a1SRalf Baechle .arcname = "RM200PCI", 67112b20a1SRalf Baechle .liname = "SNI RM200_PCI", 68112b20a1SRalf Baechle .type = MACH_SNI_RM200_PCI, 69112b20a1SRalf Baechle .flags = PROM_FLAG_DONT_FREE_TEMP, 70*330117ffSThomas Bogendoerfer }, { 71*330117ffSThomas Bogendoerfer .arcname = "RM200PCI-R5K", 72*330117ffSThomas Bogendoerfer .liname = "SNI RM200_PCI-R5K", 73*330117ffSThomas Bogendoerfer .type = MACH_SNI_RM200_PCI, 74*330117ffSThomas Bogendoerfer .flags = PROM_FLAG_DONT_FREE_TEMP, 752f56cfddSAurelien Jarno } 762f56cfddSAurelien Jarno }; 772f56cfddSAurelien Jarno 782f56cfddSAurelien Jarno int prom_flags; 792f56cfddSAurelien Jarno 802f56cfddSAurelien Jarno static struct smatch * __init string_to_mach(const char *s) 812f56cfddSAurelien Jarno { 822f56cfddSAurelien Jarno int i; 832f56cfddSAurelien Jarno 842f56cfddSAurelien Jarno for (i = 0; i < ARRAY_SIZE(mach_table); i++) { 852f56cfddSAurelien Jarno if (!strcmp(s, mach_table[i].arcname)) 862f56cfddSAurelien Jarno return &mach_table[i]; 872f56cfddSAurelien Jarno } 882f56cfddSAurelien Jarno 892f56cfddSAurelien Jarno panic("Yeee, could not determine architecture type <%s>", s); 902f56cfddSAurelien Jarno } 912f56cfddSAurelien Jarno 922f56cfddSAurelien Jarno char *system_type; 932f56cfddSAurelien Jarno 942f56cfddSAurelien Jarno const char *get_system_type(void) 952f56cfddSAurelien Jarno { 962f56cfddSAurelien Jarno return system_type; 972f56cfddSAurelien Jarno } 982f56cfddSAurelien Jarno 992f56cfddSAurelien Jarno void __init prom_identify_arch(void) 1002f56cfddSAurelien Jarno { 1012f56cfddSAurelien Jarno pcomponent *p; 1022f56cfddSAurelien Jarno struct smatch *mach; 1032f56cfddSAurelien Jarno const char *iname; 1042f56cfddSAurelien Jarno 1052f56cfddSAurelien Jarno /* 1062f56cfddSAurelien Jarno * The root component tells us what machine architecture we have here. 1072f56cfddSAurelien Jarno */ 1082f56cfddSAurelien Jarno p = ArcGetChild(PROM_NULL_COMPONENT); 1092f56cfddSAurelien Jarno if (p == NULL) { 1102f56cfddSAurelien Jarno #ifdef CONFIG_SGI_IP27 1112f56cfddSAurelien Jarno /* IP27 PROM misbehaves, seems to not implement ARC 1122f56cfddSAurelien Jarno GetChild(). So we just assume it's an IP27. */ 1132f56cfddSAurelien Jarno iname = "SGI-IP27"; 1142f56cfddSAurelien Jarno #else 1152f56cfddSAurelien Jarno iname = "Unknown"; 1162f56cfddSAurelien Jarno #endif 1172f56cfddSAurelien Jarno } else 1182f56cfddSAurelien Jarno iname = (char *) (long) p->iname; 1192f56cfddSAurelien Jarno 1202f56cfddSAurelien Jarno printk("ARCH: %s\n", iname); 1212f56cfddSAurelien Jarno mach = string_to_mach(iname); 1222f56cfddSAurelien Jarno system_type = mach->liname; 1232f56cfddSAurelien Jarno 1242f56cfddSAurelien Jarno mips_machtype = mach->type; 1252f56cfddSAurelien Jarno prom_flags = mach->flags; 1262f56cfddSAurelien Jarno } 127