--- a/arch/mips/kernel/mips_machine.c
+++ b/arch/mips/kernel/mips_machine.c
@@ -7,12 +7,13 @@
  *
  */
 #include <linux/mm.h>
+#include <linux/string.h>
 
 #include <asm/mips_machine.h>
-#include <asm/bootinfo.h>
 
 static struct list_head mips_machines __initdata =
 		LIST_HEAD_INIT(mips_machines);
+static char *mips_machid __initdata;
 
 char *mips_machine_name = "Unknown";
 
@@ -55,20 +56,65 @@ void __init mips_machine_set_name(char *
 	}
 }
 
-void __init mips_machine_setup(unsigned long machtype)
+void __init mips_machine_setup(void)
 {
 	struct mips_machine *mach;
 
-	mach = mips_machine_find(machtype);
+	mach = mips_machine_find(mips_machtype);
 	if (!mach) {
-		printk(KERN_ALERT "MIPS: no machine registered for "
-			"machtype %lu\n", machtype);
+		printk(KERN_WARNING "MIPS: no machine registered for "
+			"machtype %lu\n", mips_machtype);
 		return;
 	}
 
 	mips_machine_set_name(mach->mach_name);
-	printk(KERN_INFO "MIPS: machine is %s\n", mips_machine_name);
+	printk(KERN_NOTICE "MIPS: machine is %s\n", mips_machine_name);
 
 	if (mach->mach_setup)
 		mach->mach_setup();
 }
+
+int __init mips_machtype_setup(char *id)
+{
+	if (mips_machid == NULL)
+		mips_machid = id;
+
+	return 1;
+}
+
+__setup("machtype=", mips_machtype_setup);
+
+static int __init mips_machtype_init(void)
+{
+	struct list_head *this;
+	struct mips_machine *mach;
+
+	if (mips_machid == NULL)
+		return 0;
+
+	list_for_each(this, &mips_machines) {
+		mach = list_entry(this, struct mips_machine, list);
+		if (mach->mach_id == NULL)
+			continue;
+
+		if (strcmp(mach->mach_id, mips_machid) == 0) {
+			mips_machtype = mach->mach_type;
+			return 0;
+		}
+	}
+
+	printk(KERN_WARNING
+	       "MIPS: no machine found for id: '%s', registered machines:\n",
+	       mips_machid);
+	printk(KERN_WARNING "%32s %s\n", "id", "name");
+
+	list_for_each(this, &mips_machines) {
+		mach = list_entry(this, struct mips_machine, list);
+		printk(KERN_WARNING "%32s %s\n",
+		       mach->mach_id ? mach->mach_id : "", mach->mach_name);
+	}
+
+	return 0;
+}
+
+core_initcall(mips_machtype_init);
--- a/arch/mips/include/asm/mips_machine.h
+++ b/arch/mips/include/asm/mips_machine.h
@@ -13,25 +13,33 @@
 #include <linux/init.h>
 #include <linux/list.h>
 
+#include <asm/bootinfo.h>
+
 struct mips_machine {
 	unsigned long		mach_type;
-	void			(*mach_setup)(void);
+	char			*mach_id;
 	char			*mach_name;
+	void			(*mach_setup)(void);
 	struct list_head	list;
 };
 
 void mips_machine_register(struct mips_machine *) __init;
-void mips_machine_setup(unsigned long machtype) __init;
+void mips_machine_setup(void) __init;
+int  mips_machtype_setup(char *id) __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;		\
+#define MIPS_MACHINE(_type, _id, _name, _setup) 		\
+static const char machine_name_##_type[] __initconst		\
+			__aligned(1) = _name;			\
+static const char machine_id_##_type[] __initconst		\
+			__aligned(1) = _id;			\
 static struct mips_machine machine_##_type __initdata =		\
 {								\
 	.mach_type	= _type,				\
-	.mach_name	= machine_name_##_type,			\
+	.mach_id	= (char *) machine_id_##_type,		\
+	.mach_name	= (char *) machine_name_##_type,	\
 	.mach_setup	= _setup,				\
 };								\
 								\
@@ -44,4 +52,3 @@ static int __init register_machine_##_ty
 pure_initcall(register_machine_##_type)
 
 #endif /* __ASM_MIPS_MACHINE_H */
-
