Commit 54d8435b authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Make 16-way x440's boot

From: Matthew Dobson <colpatch@us.ibm.com>

16 proc x440 boxen aren't booting mainline kernels right now for many valid
configs.  This patch makes sure NUMA codepaths aren't executed for SMP
configs.  It also adds some sane error messages to the code, and cleans up
some #ifdefs.
parent 0f9ba494
...@@ -1008,9 +1008,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -1008,9 +1008,6 @@ void __init setup_arch(char **cmdline_p)
if (smp_found_config) if (smp_found_config)
get_smp_config(); get_smp_config();
#endif #endif
#ifdef CONFIG_X86_SUMMIT
setup_summit();
#endif
register_memory(max_low_pfn); register_memory(max_low_pfn);
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <mach_mpparse.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, 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){ struct scal_detail **scal_nodes, struct rio_detail **rio_nodes){
int twst_num = 0, node = 0, first_bus = 0; 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 ...@@ -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; 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){ struct scal_detail **sd, struct rio_detail **rd){
unsigned long ptr; unsigned long ptr;
int i, scal_detail_size, rio_detail_size; 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){ switch (rth->version){
default: default:
printk("%s: Bad Rio Grande Table Version: %d\n", __FUNCTION__, rth->version); printk("%s: Bad Rio Grande Table Version: %d\n", __FUNCTION__, rth->version);
/* Fall through to default to version 2 spec */ return 1;
case 2: case 2:
scal_detail_size = 11; scal_detail_size = 11;
rio_detail_size = 13; rio_detail_size = 13;
...@@ -119,6 +126,8 @@ static void __init build_detail_arrays(struct rio_table_hdr *rth, ...@@ -119,6 +126,8 @@ static void __init build_detail_arrays(struct rio_table_hdr *rth,
ptr += scal_detail_size * rth->num_scal_dev; ptr += scal_detail_size * rth->num_scal_dev;
for(i = 0; i < rth->num_rio_dev; i++) for(i = 0; i < rth->num_rio_dev; i++)
rd[i] = (struct rio_detail *)(ptr + (rio_detail_size * i)); rd[i] = (struct rio_detail *)(ptr + (rio_detail_size * i));
return 0;
} }
void __init setup_summit(void) void __init setup_summit(void)
...@@ -152,11 +161,12 @@ void __init setup_summit(void) ...@@ -152,11 +161,12 @@ void __init setup_summit(void)
return; return;
} }
/* Deal with the ugly version 2/3 pointer arithmetic */ if (build_detail_arrays(rio_table_hdr, scal_devs, rio_devs))
build_detail_arrays(rio_table_hdr, scal_devs, rio_devs); return;
for(i = 0; i < rio_table_hdr->num_rio_dev; i++) for(i = 0; i < rio_table_hdr->num_rio_dev; i++)
if (is_WPEG(rio_devs[i]->type)) if (is_WPEG(rio_devs[i]->type))
/* It's a Winnipeg, it's got PCI Busses */ /* It's a Winnipeg, it's got PCI Busses */
setup_pci_node_map_for_wpeg(i, rio_table_hdr, scal_devs, rio_devs); setup_pci_node_map_for_wpeg(i, rio_table_hdr, scal_devs, rio_devs);
} }
#endif /* CONFIG_NUMA */
...@@ -5,6 +5,12 @@ ...@@ -5,6 +5,12 @@
extern int use_cyclone; 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, static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
struct mpc_config_translation *translation) struct mpc_config_translation *translation)
{ {
...@@ -24,6 +30,7 @@ static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, ...@@ -24,6 +30,7 @@ static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
|| !strncmp(productid, "EXA", 3) || !strncmp(productid, "EXA", 3)
|| !strncmp(productid, "RUTHLESS SMP", 12))){ || !strncmp(productid, "RUTHLESS SMP", 12))){
use_cyclone = 1; /*enable cyclone-timer*/ use_cyclone = 1; /*enable cyclone-timer*/
setup_summit();
return 1; return 1;
} }
return 0; return 0;
...@@ -36,6 +43,7 @@ static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) ...@@ -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, "SERVIGIL", 8)
|| !strncmp(oem_table_id, "EXA", 3))){ || !strncmp(oem_table_id, "EXA", 3))){
use_cyclone = 1; /*enable cyclone-timer*/ use_cyclone = 1; /*enable cyclone-timer*/
setup_summit();
return 1; return 1;
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment