diff options
| author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2006-03-28 07:15:54 -0500 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2006-03-28 07:15:54 -0500 |
| commit | e8222502ee6157e2713da9e0792c21f4ad458d50 (patch) | |
| tree | 0f970fb99912c257a7e5254f863a53f79d22ab14 /arch/powerpc/kernel/setup-common.c | |
| parent | 056cb48a2fb6fb31debf665695a9f97b45cfb8ec (diff) | |
[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>
Diffstat (limited to 'arch/powerpc/kernel/setup-common.c')
| -rw-r--r-- | arch/powerpc/kernel/setup-common.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index b17630ad4ac7..3473cb9cb0ab 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
| @@ -9,6 +9,9 @@ | |||
| 9 | * as published by the Free Software Foundation; either version | 9 | * as published by the Free Software Foundation; either version |
| 10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
| 11 | */ | 11 | */ |
| 12 | |||
| 13 | #undef DEBUG | ||
| 14 | |||
| 12 | #include <linux/config.h> | 15 | #include <linux/config.h> |
| 13 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| 14 | #include <linux/string.h> | 17 | #include <linux/string.h> |
| @@ -41,6 +44,7 @@ | |||
| 41 | #include <asm/time.h> | 44 | #include <asm/time.h> |
| 42 | #include <asm/cputable.h> | 45 | #include <asm/cputable.h> |
| 43 | #include <asm/sections.h> | 46 | #include <asm/sections.h> |
| 47 | #include <asm/firmware.h> | ||
| 44 | #include <asm/btext.h> | 48 | #include <asm/btext.h> |
| 45 | #include <asm/nvram.h> | 49 | #include <asm/nvram.h> |
| 46 | #include <asm/setup.h> | 50 | #include <asm/setup.h> |
| @@ -56,8 +60,6 @@ | |||
| 56 | 60 | ||
| 57 | #include "setup.h" | 61 | #include "setup.h" |
| 58 | 62 | ||
| 59 | #undef DEBUG | ||
| 60 | |||
| 61 | #ifdef DEBUG | 63 | #ifdef DEBUG |
| 62 | #include <asm/udbg.h> | 64 | #include <asm/udbg.h> |
| 63 | #define DBG(fmt...) udbg_printf(fmt) | 65 | #define DBG(fmt...) udbg_printf(fmt) |
| @@ -65,10 +67,12 @@ | |||
| 65 | #define DBG(fmt...) | 67 | #define DBG(fmt...) |
| 66 | #endif | 68 | #endif |
| 67 | 69 | ||
| 68 | #ifdef CONFIG_PPC_MULTIPLATFORM | 70 | /* The main machine-dep calls structure |
| 69 | int _machine = 0; | 71 | */ |
| 70 | EXPORT_SYMBOL(_machine); | 72 | struct machdep_calls ppc_md; |
| 71 | #endif | 73 | EXPORT_SYMBOL(ppc_md); |
| 74 | struct machdep_calls *machine_id; | ||
| 75 | EXPORT_SYMBOL(machine_id); | ||
| 72 | 76 | ||
| 73 | unsigned long klimit = (unsigned long) _end; | 77 | unsigned long klimit = (unsigned long) _end; |
| 74 | 78 | ||
| @@ -168,7 +172,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
| 168 | bogosum/(500000/HZ), bogosum/(5000/HZ) % 100); | 172 | bogosum/(500000/HZ), bogosum/(5000/HZ) % 100); |
| 169 | #endif /* CONFIG_SMP && CONFIG_PPC32 */ | 173 | #endif /* CONFIG_SMP && CONFIG_PPC32 */ |
| 170 | seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq); | 174 | seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq); |
| 171 | 175 | if (ppc_md.name) | |
| 176 | seq_printf(m, "platform\t: %s\n", ppc_md.name); | ||
| 172 | if (ppc_md.show_cpuinfo != NULL) | 177 | if (ppc_md.show_cpuinfo != NULL) |
| 173 | ppc_md.show_cpuinfo(m); | 178 | ppc_md.show_cpuinfo(m); |
| 174 | 179 | ||
| @@ -387,7 +392,7 @@ void __init smp_setup_cpu_maps(void) | |||
| 387 | * On pSeries LPAR, we need to know how many cpus | 392 | * On pSeries LPAR, we need to know how many cpus |
| 388 | * could possibly be added to this partition. | 393 | * could possibly be added to this partition. |
| 389 | */ | 394 | */ |
| 390 | if (_machine == PLATFORM_PSERIES_LPAR && | 395 | if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) && |
| 391 | (dn = of_find_node_by_path("/rtas"))) { | 396 | (dn = of_find_node_by_path("/rtas"))) { |
| 392 | int num_addr_cell, num_size_cell, maxcpus; | 397 | int num_addr_cell, num_size_cell, maxcpus; |
| 393 | unsigned int *ireg; | 398 | unsigned int *ireg; |
| @@ -456,3 +461,34 @@ static int __init early_xmon(char *p) | |||
| 456 | } | 461 | } |
| 457 | early_param("xmon", early_xmon); | 462 | early_param("xmon", early_xmon); |
| 458 | #endif | 463 | #endif |
| 464 | |||
| 465 | void probe_machine(void) | ||
| 466 | { | ||
| 467 | extern struct machdep_calls __machine_desc_start; | ||
| 468 | extern struct machdep_calls __machine_desc_end; | ||
| 469 | |||
| 470 | /* | ||
| 471 | * Iterate all ppc_md structures until we find the proper | ||
| 472 | * one for the current machine type | ||
| 473 | */ | ||
| 474 | DBG("Probing machine type ...\n"); | ||
| 475 | |||
| 476 | for (machine_id = &__machine_desc_start; | ||
| 477 | machine_id < &__machine_desc_end; | ||
| 478 | machine_id++) { | ||
| 479 | DBG(" %s ...", machine_id->name); | ||
| 480 | memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls)); | ||
| 481 | if (ppc_md.probe()) { | ||
| 482 | DBG(" match !\n"); | ||
| 483 | break; | ||
| 484 | } | ||
| 485 | DBG("\n"); | ||
| 486 | } | ||
| 487 | /* What can we do if we didn't find ? */ | ||
| 488 | if (machine_id >= &__machine_desc_end) { | ||
| 489 | DBG("No suitable machine found !\n"); | ||
| 490 | for (;;); | ||
| 491 | } | ||
| 492 | |||
| 493 | printk(KERN_INFO "Using %s machine description\n", ppc_md.name); | ||
| 494 | } | ||
