18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 38c2ecf20Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 48c2ecf20Sopenharmony_ci * for more details. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * identify.c: identify machine by looking up system identifier 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Copyright (C) 1998 Thomas Bogendoerfer 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * This code is based on arch/mips/sgi/kernel/system.c, which is 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * Copyright (C) 1996 David S. Miller (davem@davemloft.net) 138c2ecf20Sopenharmony_ci */ 148c2ecf20Sopenharmony_ci#include <linux/bug.h> 158c2ecf20Sopenharmony_ci#include <linux/init.h> 168c2ecf20Sopenharmony_ci#include <linux/kernel.h> 178c2ecf20Sopenharmony_ci#include <linux/types.h> 188c2ecf20Sopenharmony_ci#include <linux/string.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <asm/sgialib.h> 218c2ecf20Sopenharmony_ci#include <asm/bootinfo.h> 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct smatch { 248c2ecf20Sopenharmony_ci char *arcname; 258c2ecf20Sopenharmony_ci char *liname; 268c2ecf20Sopenharmony_ci int flags; 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic struct smatch mach_table[] = { 308c2ecf20Sopenharmony_ci { 318c2ecf20Sopenharmony_ci .arcname = "SGI-IP22", 328c2ecf20Sopenharmony_ci .liname = "SGI Indy", 338c2ecf20Sopenharmony_ci .flags = PROM_FLAG_ARCS, 348c2ecf20Sopenharmony_ci }, { 358c2ecf20Sopenharmony_ci .arcname = "SGI-IP28", 368c2ecf20Sopenharmony_ci .liname = "SGI IP28", 378c2ecf20Sopenharmony_ci .flags = PROM_FLAG_ARCS, 388c2ecf20Sopenharmony_ci }, { 398c2ecf20Sopenharmony_ci .arcname = "SGI-IP30", 408c2ecf20Sopenharmony_ci .liname = "SGI Octane", 418c2ecf20Sopenharmony_ci .flags = PROM_FLAG_ARCS, 428c2ecf20Sopenharmony_ci }, { 438c2ecf20Sopenharmony_ci .arcname = "SGI-IP32", 448c2ecf20Sopenharmony_ci .liname = "SGI O2", 458c2ecf20Sopenharmony_ci .flags = PROM_FLAG_ARCS, 468c2ecf20Sopenharmony_ci }, { 478c2ecf20Sopenharmony_ci .arcname = "Microsoft-Jazz", 488c2ecf20Sopenharmony_ci .liname = "Jazz MIPS_Magnum_4000", 498c2ecf20Sopenharmony_ci .flags = 0, 508c2ecf20Sopenharmony_ci }, { 518c2ecf20Sopenharmony_ci .arcname = "PICA-61", 528c2ecf20Sopenharmony_ci .liname = "Jazz Acer_PICA_61", 538c2ecf20Sopenharmony_ci .flags = 0, 548c2ecf20Sopenharmony_ci }, { 558c2ecf20Sopenharmony_ci .arcname = "RM200PCI", 568c2ecf20Sopenharmony_ci .liname = "SNI RM200_PCI", 578c2ecf20Sopenharmony_ci .flags = PROM_FLAG_DONT_FREE_TEMP, 588c2ecf20Sopenharmony_ci }, { 598c2ecf20Sopenharmony_ci .arcname = "RM200PCI-R5K", 608c2ecf20Sopenharmony_ci .liname = "SNI RM200_PCI-R5K", 618c2ecf20Sopenharmony_ci .flags = PROM_FLAG_DONT_FREE_TEMP, 628c2ecf20Sopenharmony_ci } 638c2ecf20Sopenharmony_ci}; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ciint prom_flags; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cistatic struct smatch * __init string_to_mach(const char *s) 688c2ecf20Sopenharmony_ci{ 698c2ecf20Sopenharmony_ci int i; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(mach_table); i++) { 728c2ecf20Sopenharmony_ci if (!strcmp(s, mach_table[i].arcname)) 738c2ecf20Sopenharmony_ci return &mach_table[i]; 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci panic("Yeee, could not determine architecture type <%s>", s); 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cichar *system_type; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ciconst char *get_system_type(void) 828c2ecf20Sopenharmony_ci{ 838c2ecf20Sopenharmony_ci return system_type; 848c2ecf20Sopenharmony_ci} 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_cistatic pcomponent * __init ArcGetChild(pcomponent *Current) 878c2ecf20Sopenharmony_ci{ 888c2ecf20Sopenharmony_ci return (pcomponent *) ARC_CALL1(child_component, Current); 898c2ecf20Sopenharmony_ci} 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_civoid __init prom_identify_arch(void) 928c2ecf20Sopenharmony_ci{ 938c2ecf20Sopenharmony_ci pcomponent *p; 948c2ecf20Sopenharmony_ci struct smatch *mach; 958c2ecf20Sopenharmony_ci const char *iname; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci /* 988c2ecf20Sopenharmony_ci * The root component tells us what machine architecture we have here. 998c2ecf20Sopenharmony_ci */ 1008c2ecf20Sopenharmony_ci p = ArcGetChild(PROM_NULL_COMPONENT); 1018c2ecf20Sopenharmony_ci if (p == NULL) { 1028c2ecf20Sopenharmony_ci iname = "Unknown"; 1038c2ecf20Sopenharmony_ci } else 1048c2ecf20Sopenharmony_ci iname = (char *) (long) p->iname; 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci printk("ARCH: %s\n", iname); 1078c2ecf20Sopenharmony_ci mach = string_to_mach(iname); 1088c2ecf20Sopenharmony_ci system_type = mach->liname; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci prom_flags = mach->flags; 1118c2ecf20Sopenharmony_ci} 112