diff -urpN -X /home/fletch/.diff.exclude 880-gcov/arch/i386/kernel/setup.c 890-16way_x440/arch/i386/kernel/setup.c --- 880-gcov/arch/i386/kernel/setup.c Tue Aug 5 20:01:48 2003 +++ 890-16way_x440/arch/i386/kernel/setup.c Wed Aug 13 20:55:51 2003 @@ -989,9 +989,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 -urpN -X /home/fletch/.diff.exclude 880-gcov/arch/i386/kernel/summit.c 890-16way_x440/arch/i386/kernel/summit.c --- 880-gcov/arch/i386/kernel/summit.c Sat Jun 14 18:37:24 2003 +++ 890-16way_x440/arch/i386/kernel/summit.c Wed Aug 13 20:55:51 2003 @@ -31,6 +31,7 @@ #include #include +#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_fo 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(s 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 -urpN -X /home/fletch/.diff.exclude 880-gcov/include/asm-i386/mach-summit/mach_mpparse.h 890-16way_x440/include/asm-i386/mach-summit/mach_mpparse.h --- 880-gcov/include/asm-i386/mach-summit/mach_mpparse.h Sat Jun 14 18:37:35 2003 +++ 890-16way_x440/include/asm-i386/mach-summit/mach_mpparse.h Wed Aug 13 20:55:51 2003 @@ -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 m || !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(ch (!strncmp(oem_table_id, "SERVIGIL", 8) || !strncmp(oem_table_id, "EXA", 3))){ use_cyclone = 1; /*enable cyclone-timer*/ + setup_summit(); return 1; } return 0;