174 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- /dev/null
 | 
						|
+++ b/arch/mips/include/asm/mips_machine.h
 | 
						|
@@ -0,0 +1,47 @@
 | 
						|
+/*
 | 
						|
+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
 | 
						|
+ *
 | 
						|
+ *  This program is free software; you can redistribute it and/or modify it
 | 
						|
+ *  under the terms of the GNU General Public License version 2 as published
 | 
						|
+ *  by the Free Software Foundation.
 | 
						|
+ *
 | 
						|
+ */
 | 
						|
+
 | 
						|
+#ifndef __ASM_MIPS_MACHINE_H
 | 
						|
+#define __ASM_MIPS_MACHINE_H
 | 
						|
+
 | 
						|
+#include <linux/init.h>
 | 
						|
+#include <linux/list.h>
 | 
						|
+
 | 
						|
+struct mips_machine {
 | 
						|
+	unsigned long		mach_type;
 | 
						|
+	void			(*mach_setup)(void);
 | 
						|
+	char			*mach_name;
 | 
						|
+	struct list_head	list;
 | 
						|
+};
 | 
						|
+
 | 
						|
+void mips_machine_register(struct mips_machine *) __init;
 | 
						|
+void mips_machine_setup(unsigned long machtype) __init;
 | 
						|
+void mips_machine_set_name(char *name) __init;
 | 
						|
+
 | 
						|
+extern char *mips_machine_name;
 | 
						|
+
 | 
						|
+#define MIPS_MACHINE(_type, _name, _setup) 			\
 | 
						|
+static char machine_name_##_type[] __initdata = _name;		\
 | 
						|
+static struct mips_machine machine_##_type __initdata =		\
 | 
						|
+{								\
 | 
						|
+	.mach_type	= _type,				\
 | 
						|
+	.mach_name	= machine_name_##_type,			\
 | 
						|
+	.mach_setup	= _setup,				\
 | 
						|
+};								\
 | 
						|
+								\
 | 
						|
+static int __init register_machine_##_type(void)		\
 | 
						|
+{								\
 | 
						|
+	mips_machine_register(&machine_##_type);		\
 | 
						|
+	return 0;						\
 | 
						|
+}								\
 | 
						|
+								\
 | 
						|
+pure_initcall(register_machine_##_type)
 | 
						|
+
 | 
						|
+#endif /* __ASM_MIPS_MACHINE_H */
 | 
						|
+
 | 
						|
--- /dev/null
 | 
						|
+++ b/arch/mips/kernel/mips_machine.c
 | 
						|
@@ -0,0 +1,74 @@
 | 
						|
+/*
 | 
						|
+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
 | 
						|
+ *
 | 
						|
+ *  This program is free software; you can redistribute it and/or modify it
 | 
						|
+ *  under the terms of the GNU General Public License version 2 as published
 | 
						|
+ *  by the Free Software Foundation.
 | 
						|
+ *
 | 
						|
+ */
 | 
						|
+#include <linux/mm.h>
 | 
						|
+
 | 
						|
+#include <asm/mips_machine.h>
 | 
						|
+#include <asm/bootinfo.h>
 | 
						|
+
 | 
						|
+static struct list_head mips_machines __initdata =
 | 
						|
+		LIST_HEAD_INIT(mips_machines);
 | 
						|
+
 | 
						|
+char *mips_machine_name = "Unknown";
 | 
						|
+
 | 
						|
+static struct mips_machine * __init mips_machine_find(unsigned long machtype)
 | 
						|
+{
 | 
						|
+	struct list_head *this;
 | 
						|
+
 | 
						|
+	list_for_each(this, &mips_machines) {
 | 
						|
+		struct mips_machine *mach;
 | 
						|
+
 | 
						|
+		mach = list_entry(this, struct mips_machine, list);
 | 
						|
+		if (mach->mach_type == machtype)
 | 
						|
+			return mach;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	return NULL;
 | 
						|
+}
 | 
						|
+
 | 
						|
+void __init mips_machine_register(struct mips_machine *mach)
 | 
						|
+{
 | 
						|
+	list_add_tail(&mach->list, &mips_machines);
 | 
						|
+}
 | 
						|
+
 | 
						|
+void __init mips_machine_set_name(char *name)
 | 
						|
+{
 | 
						|
+	unsigned int len;
 | 
						|
+	char *p;
 | 
						|
+
 | 
						|
+	if (name == NULL)
 | 
						|
+		return;
 | 
						|
+
 | 
						|
+	len = strlen(name);
 | 
						|
+	p = kmalloc(len + 1, GFP_KERNEL);
 | 
						|
+	if (p) {
 | 
						|
+		strncpy(p, name, len);
 | 
						|
+		p[len] = '\0';
 | 
						|
+		mips_machine_name = p;
 | 
						|
+	} else {
 | 
						|
+		printk(KERN_WARNING "MIPS: no memory for machine_name\n");
 | 
						|
+	}
 | 
						|
+}
 | 
						|
+
 | 
						|
+void __init mips_machine_setup(unsigned long machtype)
 | 
						|
+{
 | 
						|
+	struct mips_machine *mach;
 | 
						|
+
 | 
						|
+	mach = mips_machine_find(machtype);
 | 
						|
+	if (!mach) {
 | 
						|
+		printk(KERN_ALERT "MIPS: no machine registered for "
 | 
						|
+			"machtype %lu\n", machtype);
 | 
						|
+		return;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	mips_machine_set_name(mach->mach_name);
 | 
						|
+	printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
 | 
						|
+
 | 
						|
+	if (mach->mach_setup)
 | 
						|
+		mach->mach_setup();
 | 
						|
+}
 | 
						|
--- a/arch/mips/kernel/Makefile
 | 
						|
+++ b/arch/mips/kernel/Makefile
 | 
						|
@@ -85,6 +85,7 @@ obj-$(CONFIG_GPIO_TXX9)		+= gpio_txx9.o
 | 
						|
 
 | 
						|
 obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o
 | 
						|
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
 | 
						|
+obj-$(CONFIG_MIPS_MACHINE)	+= mips_machine.o
 | 
						|
 
 | 
						|
 CFLAGS_cpu-bugs64.o	= $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
 | 
						|
 
 | 
						|
--- a/arch/mips/Kconfig
 | 
						|
+++ b/arch/mips/Kconfig
 | 
						|
@@ -803,6 +803,9 @@ config MIPS_DISABLE_OBSOLETE_IDE
 | 
						|
 config SYNC_R4K
 | 
						|
 	bool
 | 
						|
 
 | 
						|
+config MIPS_MACHINE
 | 
						|
+	def_bool n
 | 
						|
+
 | 
						|
 config NO_IOPORT
 | 
						|
 	def_bool n
 | 
						|
 
 | 
						|
--- a/arch/mips/kernel/proc.c
 | 
						|
+++ b/arch/mips/kernel/proc.c
 | 
						|
@@ -14,6 +14,7 @@
 | 
						|
 #include <asm/cpu-features.h>
 | 
						|
 #include <asm/mipsregs.h>
 | 
						|
 #include <asm/processor.h>
 | 
						|
+#include <asm/mips_machine.h>
 | 
						|
 
 | 
						|
 unsigned int vced_count, vcei_count;
 | 
						|
 
 | 
						|
@@ -33,8 +34,12 @@ static int show_cpuinfo(struct seq_file 
 | 
						|
 	/*
 | 
						|
 	 * For the first processor also print the system type
 | 
						|
 	 */
 | 
						|
-	if (n == 0)
 | 
						|
+	if (n == 0) {
 | 
						|
 		seq_printf(m, "system type\t\t: %s\n", get_system_type());
 | 
						|
+#ifdef CONFIG_MIPS_MACHINE
 | 
						|
+		seq_printf(m, "machine\t\t\t: %s\n", mips_machine_name);
 | 
						|
+#endif
 | 
						|
+	}
 | 
						|
 
 | 
						|
 	seq_printf(m, "processor\t\t: %ld\n", n);
 | 
						|
 	sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
 |