xref: /kernel/linux/linux-6.6/arch/mips/fw/arc/identify.c (revision 62306a36)
162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
362306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
462306a36Sopenharmony_ci * for more details.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * identify.c: identify machine by looking up system identifier
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (C) 1998 Thomas Bogendoerfer
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * This code is based on arch/mips/sgi/kernel/system.c, which is
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci#include <linux/bug.h>
1562306a36Sopenharmony_ci#include <linux/init.h>
1662306a36Sopenharmony_ci#include <linux/kernel.h>
1762306a36Sopenharmony_ci#include <linux/types.h>
1862306a36Sopenharmony_ci#include <linux/string.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <asm/sgialib.h>
2162306a36Sopenharmony_ci#include <asm/bootinfo.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct smatch {
2462306a36Sopenharmony_ci	char *arcname;
2562306a36Sopenharmony_ci	char *liname;
2662306a36Sopenharmony_ci	int flags;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic struct smatch mach_table[] = {
3062306a36Sopenharmony_ci	{
3162306a36Sopenharmony_ci		.arcname	= "SGI-IP22",
3262306a36Sopenharmony_ci		.liname		= "SGI Indy",
3362306a36Sopenharmony_ci		.flags		= PROM_FLAG_ARCS,
3462306a36Sopenharmony_ci	}, {
3562306a36Sopenharmony_ci		.arcname	= "SGI-IP28",
3662306a36Sopenharmony_ci		.liname		= "SGI IP28",
3762306a36Sopenharmony_ci		.flags		= PROM_FLAG_ARCS,
3862306a36Sopenharmony_ci	}, {
3962306a36Sopenharmony_ci		.arcname	= "SGI-IP30",
4062306a36Sopenharmony_ci		.liname		= "SGI Octane",
4162306a36Sopenharmony_ci		.flags		= PROM_FLAG_ARCS,
4262306a36Sopenharmony_ci	}, {
4362306a36Sopenharmony_ci		.arcname	= "SGI-IP32",
4462306a36Sopenharmony_ci		.liname		= "SGI O2",
4562306a36Sopenharmony_ci		.flags		= PROM_FLAG_ARCS,
4662306a36Sopenharmony_ci	}, {
4762306a36Sopenharmony_ci		.arcname	= "Microsoft-Jazz",
4862306a36Sopenharmony_ci		.liname		= "Jazz MIPS_Magnum_4000",
4962306a36Sopenharmony_ci		.flags		= 0,
5062306a36Sopenharmony_ci	}, {
5162306a36Sopenharmony_ci		.arcname	= "PICA-61",
5262306a36Sopenharmony_ci		.liname		= "Jazz Acer_PICA_61",
5362306a36Sopenharmony_ci		.flags		= 0,
5462306a36Sopenharmony_ci	}, {
5562306a36Sopenharmony_ci		.arcname	= "RM200PCI",
5662306a36Sopenharmony_ci		.liname		= "SNI RM200_PCI",
5762306a36Sopenharmony_ci		.flags		= PROM_FLAG_DONT_FREE_TEMP,
5862306a36Sopenharmony_ci	}, {
5962306a36Sopenharmony_ci		.arcname	= "RM200PCI-R5K",
6062306a36Sopenharmony_ci		.liname		= "SNI RM200_PCI-R5K",
6162306a36Sopenharmony_ci		.flags		= PROM_FLAG_DONT_FREE_TEMP,
6262306a36Sopenharmony_ci	}
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciint prom_flags;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic struct smatch * __init string_to_mach(const char *s)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	int i;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(mach_table); i++) {
7262306a36Sopenharmony_ci		if (!strcmp(s, mach_table[i].arcname))
7362306a36Sopenharmony_ci			return &mach_table[i];
7462306a36Sopenharmony_ci	}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	panic("Yeee, could not determine architecture type <%s>", s);
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cichar *system_type;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciconst char *get_system_type(void)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	return system_type;
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic pcomponent * __init ArcGetChild(pcomponent *Current)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	return (pcomponent *) ARC_CALL1(child_component, Current);
8962306a36Sopenharmony_ci}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_civoid __init prom_identify_arch(void)
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	pcomponent *p;
9462306a36Sopenharmony_ci	struct smatch *mach;
9562306a36Sopenharmony_ci	const char *iname;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	/*
9862306a36Sopenharmony_ci	 * The root component tells us what machine architecture we have here.
9962306a36Sopenharmony_ci	 */
10062306a36Sopenharmony_ci	p = ArcGetChild(PROM_NULL_COMPONENT);
10162306a36Sopenharmony_ci	if (p == NULL) {
10262306a36Sopenharmony_ci		iname = "Unknown";
10362306a36Sopenharmony_ci	} else
10462306a36Sopenharmony_ci		iname = (char *) (long) p->iname;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	printk("ARCH: %s\n", iname);
10762306a36Sopenharmony_ci	mach = string_to_mach(iname);
10862306a36Sopenharmony_ci	system_type = mach->liname;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	prom_flags = mach->flags;
11162306a36Sopenharmony_ci}
112