--- 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 */ -