/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * identify.c: identify machine by looking up system identifier
 *
 * Copyright (C) 1998 Thomas Bogendoerfer
 *
 * This code is based on arch/mips/sgi/kernel/system.c, which is
 *
 * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
 */
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/string.h>

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

struct smatch {
	char *arcname;
	char *liname;
	int group;
	int type;
	int flags;
};

static struct smatch mach_table[] = {
	{	"SGI-IP22",
		"SGI Indy",
		MACH_GROUP_SGI,
		MACH_SGI_IP22,
		PROM_FLAG_ARCS
	}, {	"SGI-IP27",
		"SGI Origin",
		MACH_GROUP_SGI,
		MACH_SGI_IP27,
		PROM_FLAG_ARCS
	}, {	"SGI-IP28",
		"SGI IP28",
		MACH_GROUP_SGI,
		MACH_SGI_IP28,
		PROM_FLAG_ARCS
	}, {	"SGI-IP30",
		"SGI Octane",
		MACH_GROUP_SGI,
		MACH_SGI_IP30,
		PROM_FLAG_ARCS
	}, {	"SGI-IP32",
		"SGI O2",
		MACH_GROUP_SGI,
		MACH_SGI_IP32,
		PROM_FLAG_ARCS
	}, {	"Microsoft-Jazz",
		"Jazz MIPS_Magnum_4000",
		MACH_GROUP_JAZZ,
		MACH_MIPS_MAGNUM_4000,
		0
	}, {	"PICA-61",
		"Jazz Acer_PICA_61",
		MACH_GROUP_JAZZ,
		MACH_ACER_PICA_61,
		0
	}, {	"RM200PCI",
		"SNI RM200_PCI",
		MACH_GROUP_SNI_RM,
		MACH_SNI_RM200_PCI,
		PROM_FLAG_DONT_FREE_TEMP
	}
};

int prom_flags;

static struct smatch * __init string_to_mach(const char *s)
{
	int i;

	for (i = 0; i < (sizeof(mach_table) / sizeof (mach_table[0])); i++) {
		if (!strcmp(s, mach_table[i].arcname))
			return &mach_table[i];
	}

	panic("Yeee, could not determine architecture type <%s>", s);
}

char *system_type;

const char *get_system_type(void)
{
	return system_type;
}

void __init prom_identify_arch(void)
{
	pcomponent *p;
	struct smatch *mach;
	const char *iname;

	/*
	 * The root component tells us what machine architecture we have here.
	 */
	p = ArcGetChild(PROM_NULL_COMPONENT);
	if (p == NULL) {
#ifdef CONFIG_SGI_IP27
		/* IP27 PROM misbehaves, seems to not implement ARC
		   GetChild().  So we just assume it's an IP27.  */
		iname = "SGI-IP27";
#else
		iname = "Unknown";
#endif
	} else
		iname = (char *) (long) p->iname;

	printk("ARCH: %s\n", iname);
	mach = string_to_mach(iname);
	system_type = mach->liname;

	mips_machgroup = mach->group;
	mips_machtype = mach->type;
	prom_flags = mach->flags;
}
