[PATCH] powerpc: Kill _machine and hard-coded platform numbers
This removes statically assigned platform numbers and reworks the powerpc platform probe code to use a better mechanism. With this, board support files can simply declare a new machine type with a macro, and implement a probe() function that uses the flattened device-tree to detect if they apply for a given machine. We now have a machine_is() macro that replaces the comparisons of _machine with the various PLATFORM_* constants. This commit also changes various drivers to use the new macro instead of looking at _machine. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
056cb48a2f
commit
e8222502ee
@@ -180,6 +180,16 @@ static unsigned long __initdata prom_tce_alloc_start;
|
||||
static unsigned long __initdata prom_tce_alloc_end;
|
||||
#endif
|
||||
|
||||
/* Platforms codes are now obsolete in the kernel. Now only used within this
|
||||
* file and ultimately gone too. Feel free to change them if you need, they
|
||||
* are not shared with anything outside of this file anymore
|
||||
*/
|
||||
#define PLATFORM_PSERIES 0x0100
|
||||
#define PLATFORM_PSERIES_LPAR 0x0101
|
||||
#define PLATFORM_LPAR 0x0001
|
||||
#define PLATFORM_POWERMAC 0x0400
|
||||
#define PLATFORM_GENERIC 0x0500
|
||||
|
||||
static int __initdata of_platform;
|
||||
|
||||
static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
|
||||
@@ -1492,7 +1502,10 @@ static int __init prom_find_machine_type(void)
|
||||
int len, i = 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
phandle rtas;
|
||||
int x;
|
||||
#endif
|
||||
|
||||
/* Look for a PowerMac */
|
||||
len = prom_getprop(_prom->root, "compatible",
|
||||
compat, sizeof(compat)-1);
|
||||
if (len > 0) {
|
||||
@@ -1505,28 +1518,36 @@ static int __init prom_find_machine_type(void)
|
||||
if (strstr(p, RELOC("Power Macintosh")) ||
|
||||
strstr(p, RELOC("MacRISC")))
|
||||
return PLATFORM_POWERMAC;
|
||||
#ifdef CONFIG_PPC64
|
||||
if (strstr(p, RELOC("Momentum,Maple")))
|
||||
return PLATFORM_MAPLE;
|
||||
if (strstr(p, RELOC("IBM,CPB")))
|
||||
return PLATFORM_CELL;
|
||||
#endif
|
||||
i += sl + 1;
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_PPC64
|
||||
/* If not a mac, try to figure out if it's an IBM pSeries or any other
|
||||
* PAPR compliant platform. We assume it is if :
|
||||
* - /device_type is "chrp" (please, do NOT use that for future
|
||||
* non-IBM designs !
|
||||
* - it has /rtas
|
||||
*/
|
||||
len = prom_getprop(_prom->root, "model",
|
||||
compat, sizeof(compat)-1);
|
||||
if (len <= 0)
|
||||
return PLATFORM_GENERIC;
|
||||
compat[len] = 0;
|
||||
if (strcmp(compat, "chrp"))
|
||||
return PLATFORM_GENERIC;
|
||||
|
||||
/* Default to pSeries. We need to know if we are running LPAR */
|
||||
rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
|
||||
if (PHANDLE_VALID(rtas)) {
|
||||
int x = prom_getproplen(rtas, "ibm,hypertas-functions");
|
||||
if (x != PROM_ERROR) {
|
||||
prom_printf("Hypertas detected, assuming LPAR !\n");
|
||||
return PLATFORM_PSERIES_LPAR;
|
||||
}
|
||||
if (!PHANDLE_VALID(rtas))
|
||||
return PLATFORM_GENERIC;
|
||||
x = prom_getproplen(rtas, "ibm,hypertas-functions");
|
||||
if (x != PROM_ERROR) {
|
||||
prom_printf("Hypertas detected, assuming LPAR !\n");
|
||||
return PLATFORM_PSERIES_LPAR;
|
||||
}
|
||||
return PLATFORM_PSERIES;
|
||||
#else
|
||||
return PLATFORM_CHRP;
|
||||
return PLATFORM_GENERIC;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -2034,7 +2055,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
|
||||
{
|
||||
struct prom_t *_prom;
|
||||
unsigned long hdr;
|
||||
u32 getprop_rval;
|
||||
unsigned long offset = reloc_offset();
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
@@ -2070,9 +2090,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
|
||||
* between pSeries SMP and pSeries LPAR
|
||||
*/
|
||||
RELOC(of_platform) = prom_find_machine_type();
|
||||
getprop_rval = RELOC(of_platform);
|
||||
prom_setprop(_prom->chosen, "/chosen", "linux,platform",
|
||||
&getprop_rval, sizeof(getprop_rval));
|
||||
|
||||
/* Bail if this is a kdump kernel. */
|
||||
if (PHYSICAL_START > 0)
|
||||
|
||||
Reference in New Issue
Block a user