-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MIPS: Add generic support for multiple machines within a single kernel
This patch adds a generic solution to support multiple machines based on a given SoC within a single kernel image. It is implemented already for several other architectures but MIPS has no generic support for that yet. [Ralf: This competes with DT but DT is a much more complex solution and this code has been used by OpenWRT for a long time so for now DT is a bad reason to stop the merge but longer term this should be migrated to DT.] Signed-off-by: Gabor Juhos <juhosg@openwrt.org> Cc: linux-mips@linux-mips.org Cc: kaloz@openwrt.org Cc: Luis R. Rodriguez <lrodriguez@atheros.com> Cc: Cliff Holden <Cliff.Holden@Atheros.com> Patchwork: https://patchwork.linux-mips.org/patch/1814/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
- Loading branch information
Gabor Juhos
authored and
Ralf Baechle
committed
Jan 18, 2011
1 parent
0bec405
commit 487d70d
Showing
6 changed files
with
157 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/* | ||
* Copyright (C) 2008-2010 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/stddef.h> | ||
|
||
#include <asm/bootinfo.h> | ||
|
||
struct mips_machine { | ||
unsigned long mach_type; | ||
const char *mach_id; | ||
const char *mach_name; | ||
void (*mach_setup)(void); | ||
}; | ||
|
||
#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 \ | ||
__used __section(.mips.machines.init) = \ | ||
{ \ | ||
.mach_type = _type, \ | ||
.mach_id = machine_id_##_type, \ | ||
.mach_name = machine_name_##_type, \ | ||
.mach_setup = _setup, \ | ||
}; | ||
|
||
extern long __mips_machines_start; | ||
extern long __mips_machines_end; | ||
|
||
#ifdef CONFIG_MIPS_MACHINE | ||
int mips_machtype_setup(char *id) __init; | ||
void mips_machine_setup(void) __init; | ||
void mips_set_machine_name(const char *name) __init; | ||
char *mips_get_machine_name(void); | ||
#else | ||
static inline int mips_machtype_setup(char *id) { return 1; } | ||
static inline void mips_machine_setup(void) { } | ||
static inline void mips_set_machine_name(const char *name) { } | ||
static inline char *mips_get_machine_name(void) { return NULL; } | ||
#endif /* CONFIG_MIPS_MACHINE */ | ||
|
||
#endif /* __ASM_MIPS_MACHINE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* Copyright (C) 2008-2010 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 <linux/string.h> | ||
#include <linux/slab.h> | ||
|
||
#include <asm/mips_machine.h> | ||
|
||
static struct mips_machine *mips_machine __initdata; | ||
static char *mips_machine_name = "Unknown"; | ||
|
||
#define for_each_machine(mach) \ | ||
for ((mach) = (struct mips_machine *)&__mips_machines_start; \ | ||
(mach) && \ | ||
(unsigned long)(mach) < (unsigned long)&__mips_machines_end; \ | ||
(mach)++) | ||
|
||
__init void mips_set_machine_name(const char *name) | ||
{ | ||
char *p; | ||
|
||
if (name == NULL) | ||
return; | ||
|
||
p = kstrdup(name, GFP_KERNEL); | ||
if (!p) | ||
pr_err("MIPS: no memory for machine_name\n"); | ||
|
||
mips_machine_name = p; | ||
} | ||
|
||
char *mips_get_machine_name(void) | ||
{ | ||
return mips_machine_name; | ||
} | ||
|
||
__init int mips_machtype_setup(char *id) | ||
{ | ||
struct mips_machine *mach; | ||
|
||
for_each_machine(mach) { | ||
if (mach->mach_id == NULL) | ||
continue; | ||
|
||
if (strcmp(mach->mach_id, id) == 0) { | ||
mips_machtype = mach->mach_type; | ||
return 0; | ||
} | ||
} | ||
|
||
pr_err("MIPS: no machine found for id '%s', supported machines:\n", id); | ||
pr_err("%-24s %s\n", "id", "name"); | ||
for_each_machine(mach) | ||
pr_err("%-24s %s\n", mach->mach_id, mach->mach_name); | ||
|
||
return 1; | ||
} | ||
|
||
__setup("machtype=", mips_machtype_setup); | ||
|
||
__init void mips_machine_setup(void) | ||
{ | ||
struct mips_machine *mach; | ||
|
||
for_each_machine(mach) { | ||
if (mips_machtype == mach->mach_type) { | ||
mips_machine = mach; | ||
break; | ||
} | ||
} | ||
|
||
if (!mips_machine) | ||
return; | ||
|
||
mips_set_machine_name(mips_machine->mach_name); | ||
pr_info("MIPS: machine is %s\n", mips_machine_name); | ||
|
||
if (mips_machine->mach_setup) | ||
mips_machine->mach_setup(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters