You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
[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
@@ -9,6 +9,9 @@
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
@@ -41,6 +44,7 @@
|
||||
#include <asm/time.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/btext.h>
|
||||
#include <asm/nvram.h>
|
||||
#include <asm/setup.h>
|
||||
@@ -56,8 +60,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <asm/udbg.h>
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
@@ -65,10 +67,12 @@
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
int _machine = 0;
|
||||
EXPORT_SYMBOL(_machine);
|
||||
#endif
|
||||
/* The main machine-dep calls structure
|
||||
*/
|
||||
struct machdep_calls ppc_md;
|
||||
EXPORT_SYMBOL(ppc_md);
|
||||
struct machdep_calls *machine_id;
|
||||
EXPORT_SYMBOL(machine_id);
|
||||
|
||||
unsigned long klimit = (unsigned long) _end;
|
||||
|
||||
@@ -168,7 +172,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
bogosum/(500000/HZ), bogosum/(5000/HZ) % 100);
|
||||
#endif /* CONFIG_SMP && CONFIG_PPC32 */
|
||||
seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq);
|
||||
|
||||
if (ppc_md.name)
|
||||
seq_printf(m, "platform\t: %s\n", ppc_md.name);
|
||||
if (ppc_md.show_cpuinfo != NULL)
|
||||
ppc_md.show_cpuinfo(m);
|
||||
|
||||
@@ -387,7 +392,7 @@ void __init smp_setup_cpu_maps(void)
|
||||
* On pSeries LPAR, we need to know how many cpus
|
||||
* could possibly be added to this partition.
|
||||
*/
|
||||
if (_machine == PLATFORM_PSERIES_LPAR &&
|
||||
if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) &&
|
||||
(dn = of_find_node_by_path("/rtas"))) {
|
||||
int num_addr_cell, num_size_cell, maxcpus;
|
||||
unsigned int *ireg;
|
||||
@@ -456,3 +461,34 @@ static int __init early_xmon(char *p)
|
||||
}
|
||||
early_param("xmon", early_xmon);
|
||||
#endif
|
||||
|
||||
void probe_machine(void)
|
||||
{
|
||||
extern struct machdep_calls __machine_desc_start;
|
||||
extern struct machdep_calls __machine_desc_end;
|
||||
|
||||
/*
|
||||
* Iterate all ppc_md structures until we find the proper
|
||||
* one for the current machine type
|
||||
*/
|
||||
DBG("Probing machine type ...\n");
|
||||
|
||||
for (machine_id = &__machine_desc_start;
|
||||
machine_id < &__machine_desc_end;
|
||||
machine_id++) {
|
||||
DBG(" %s ...", machine_id->name);
|
||||
memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls));
|
||||
if (ppc_md.probe()) {
|
||||
DBG(" match !\n");
|
||||
break;
|
||||
}
|
||||
DBG("\n");
|
||||
}
|
||||
/* What can we do if we didn't find ? */
|
||||
if (machine_id >= &__machine_desc_end) {
|
||||
DBG("No suitable machine found !\n");
|
||||
for (;;);
|
||||
}
|
||||
|
||||
printk(KERN_INFO "Using %s machine description\n", ppc_md.name);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user