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