diff options
| -rw-r--r-- | arch/i386/kernel/setup.c | 3 | ||||
| -rw-r--r-- | arch/i386/kernel/summit.c | 18 | ||||
| -rw-r--r-- | include/asm-i386/mach-summit/mach_mpparse.h | 8 |
3 files changed, 22 insertions, 7 deletions
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 328f80bcd4bc..761ec15eb1a7 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c @@ -1008,9 +1008,6 @@ void __init setup_arch(char **cmdline_p) if (smp_found_config) get_smp_config(); #endif -#ifdef CONFIG_X86_SUMMIT - setup_summit(); -#endif register_memory(max_low_pfn); diff --git a/arch/i386/kernel/summit.c b/arch/i386/kernel/summit.c index c053bd7ff398..85631359c808 100644 --- a/arch/i386/kernel/summit.c +++ b/arch/i386/kernel/summit.c @@ -31,6 +31,7 @@ #include <asm/io.h> #include <mach_mpparse.h> +#ifdef CONFIG_NUMA static void __init setup_pci_node_map_for_wpeg(int wpeg_num, struct rio_table_hdr *rth, struct scal_detail **scal_nodes, struct rio_detail **rio_nodes){ int twst_num = 0, node = 0, first_bus = 0; @@ -93,15 +94,21 @@ static void __init setup_pci_node_map_for_wpeg(int wpeg_num, struct rio_table_hd mp_bus_id_to_node[bus] = node; } -static void __init build_detail_arrays(struct rio_table_hdr *rth, +static int __init build_detail_arrays(struct rio_table_hdr *rth, struct scal_detail **sd, struct rio_detail **rd){ unsigned long ptr; int i, scal_detail_size, rio_detail_size; + if ((rth->num_scal_dev > MAX_NUMNODES) || + (rth->num_rio_dev > MAX_NUMNODES * 2)){ + printk("%s: MAX_NUMNODES too low! Defined as %d, but system has %d nodes.\n", __FUNCTION__, MAX_NUMNODES, rth->num_scal_dev); + return 1; + } + switch (rth->version){ default: printk("%s: Bad Rio Grande Table Version: %d\n", __FUNCTION__, rth->version); - /* Fall through to default to version 2 spec */ + return 1; case 2: scal_detail_size = 11; rio_detail_size = 13; @@ -119,6 +126,8 @@ static void __init build_detail_arrays(struct rio_table_hdr *rth, ptr += scal_detail_size * rth->num_scal_dev; for(i = 0; i < rth->num_rio_dev; i++) rd[i] = (struct rio_detail *)(ptr + (rio_detail_size * i)); + + return 0; } void __init setup_summit(void) @@ -152,11 +161,12 @@ void __init setup_summit(void) return; } - /* Deal with the ugly version 2/3 pointer arithmetic */ - build_detail_arrays(rio_table_hdr, scal_devs, rio_devs); + if (build_detail_arrays(rio_table_hdr, scal_devs, rio_devs)) + return; for(i = 0; i < rio_table_hdr->num_rio_dev; i++) if (is_WPEG(rio_devs[i]->type)) /* It's a Winnipeg, it's got PCI Busses */ setup_pci_node_map_for_wpeg(i, rio_table_hdr, scal_devs, rio_devs); } +#endif /* CONFIG_NUMA */ diff --git a/include/asm-i386/mach-summit/mach_mpparse.h b/include/asm-i386/mach-summit/mach_mpparse.h index c336b9d1de1b..88d215ad7bde 100644 --- a/include/asm-i386/mach-summit/mach_mpparse.h +++ b/include/asm-i386/mach-summit/mach_mpparse.h @@ -5,6 +5,12 @@ extern int use_cyclone; +#ifdef CONFIG_NUMA +extern void setup_summit(void); +#else /* !CONFIG_NUMA */ +#define setup_summit() {} +#endif /* CONFIG_NUMA */ + static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name, struct mpc_config_translation *translation) { @@ -24,6 +30,7 @@ static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, || !strncmp(productid, "EXA", 3) || !strncmp(productid, "RUTHLESS SMP", 12))){ use_cyclone = 1; /*enable cyclone-timer*/ + setup_summit(); return 1; } return 0; @@ -36,6 +43,7 @@ static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) (!strncmp(oem_table_id, "SERVIGIL", 8) || !strncmp(oem_table_id, "EXA", 3))){ use_cyclone = 1; /*enable cyclone-timer*/ + setup_summit(); return 1; } return 0; |
