diff options
-rw-r--r-- | arch/ia64/sn/kernel/io_init.c | 2 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/setup.c | 27 | ||||
-rw-r--r-- | include/asm-ia64/sn/simulator.h | 13 | ||||
-rw-r--r-- | include/asm-ia64/sn/sn_sal.h | 10 |
4 files changed, 37 insertions, 15 deletions
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index 9e07f5463f21..783eb4323847 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -384,7 +384,7 @@ static int __init sn_pci_init(void) | |||
384 | extern void register_sn_procfs(void); | 384 | extern void register_sn_procfs(void); |
385 | #endif | 385 | #endif |
386 | 386 | ||
387 | if (!ia64_platform_is("sn2") || IS_RUNNING_ON_SIMULATOR()) | 387 | if (!ia64_platform_is("sn2") || IS_RUNNING_ON_FAKE_PROM()) |
388 | return 0; | 388 | return 0; |
389 | 389 | ||
390 | /* | 390 | /* |
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index 3e5ba34ac2ef..22e10d282c7f 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
@@ -96,6 +96,7 @@ u8 sn_coherency_id; | |||
96 | EXPORT_SYMBOL(sn_coherency_id); | 96 | EXPORT_SYMBOL(sn_coherency_id); |
97 | u8 sn_region_size; | 97 | u8 sn_region_size; |
98 | EXPORT_SYMBOL(sn_region_size); | 98 | EXPORT_SYMBOL(sn_region_size); |
99 | int sn_prom_type; /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */ | ||
99 | 100 | ||
100 | short physical_node_map[MAX_PHYSNODE_ID]; | 101 | short physical_node_map[MAX_PHYSNODE_ID]; |
101 | 102 | ||
@@ -354,7 +355,7 @@ void __init sn_setup(char **cmdline_p) | |||
354 | 355 | ||
355 | ia64_mark_idle = &snidle; | 356 | ia64_mark_idle = &snidle; |
356 | 357 | ||
357 | /* | 358 | /* |
358 | * For the bootcpu, we do this here. All other cpus will make the | 359 | * For the bootcpu, we do this here. All other cpus will make the |
359 | * call as part of cpu_init in slave cpu initialization. | 360 | * call as part of cpu_init in slave cpu initialization. |
360 | */ | 361 | */ |
@@ -401,7 +402,7 @@ static void __init sn_init_pdas(char **cmdline_p) | |||
401 | nodepdaindr[cnode] = | 402 | nodepdaindr[cnode] = |
402 | alloc_bootmem_node(NODE_DATA(cnode), sizeof(nodepda_t)); | 403 | alloc_bootmem_node(NODE_DATA(cnode), sizeof(nodepda_t)); |
403 | memset(nodepdaindr[cnode], 0, sizeof(nodepda_t)); | 404 | memset(nodepdaindr[cnode], 0, sizeof(nodepda_t)); |
404 | memset(nodepdaindr[cnode]->phys_cpuid, -1, | 405 | memset(nodepdaindr[cnode]->phys_cpuid, -1, |
405 | sizeof(nodepdaindr[cnode]->phys_cpuid)); | 406 | sizeof(nodepdaindr[cnode]->phys_cpuid)); |
406 | } | 407 | } |
407 | 408 | ||
@@ -431,7 +432,7 @@ static void __init sn_init_pdas(char **cmdline_p) | |||
431 | } | 432 | } |
432 | 433 | ||
433 | /* | 434 | /* |
434 | * Initialize the per node hubdev. This includes IO Nodes and | 435 | * Initialize the per node hubdev. This includes IO Nodes and |
435 | * headless/memless nodes. | 436 | * headless/memless nodes. |
436 | */ | 437 | */ |
437 | for (cnode = 0; cnode < numionodes; cnode++) { | 438 | for (cnode = 0; cnode < numionodes; cnode++) { |
@@ -459,6 +460,14 @@ void __init sn_cpu_init(void) | |||
459 | int i; | 460 | int i; |
460 | static int wars_have_been_checked; | 461 | static int wars_have_been_checked; |
461 | 462 | ||
463 | if (smp_processor_id() == 0 && IS_MEDUSA()) { | ||
464 | if (ia64_sn_is_fake_prom()) | ||
465 | sn_prom_type = 2; | ||
466 | else | ||
467 | sn_prom_type = 1; | ||
468 | printk("Running on medusa with %s PROM\n", (sn_prom_type == 1) ? "real" : "fake"); | ||
469 | } | ||
470 | |||
462 | memset(pda, 0, sizeof(pda)); | 471 | memset(pda, 0, sizeof(pda)); |
463 | if (ia64_sn_get_sn_info(0, &sn_hub_info->shub2, &sn_hub_info->nasid_bitmask, &sn_hub_info->nasid_shift, | 472 | if (ia64_sn_get_sn_info(0, &sn_hub_info->shub2, &sn_hub_info->nasid_bitmask, &sn_hub_info->nasid_shift, |
464 | &sn_system_size, &sn_sharing_domain_size, &sn_partition_id, | 473 | &sn_system_size, &sn_sharing_domain_size, &sn_partition_id, |
@@ -524,7 +533,7 @@ void __init sn_cpu_init(void) | |||
524 | */ | 533 | */ |
525 | { | 534 | { |
526 | u64 pio1[] = {SH1_PIO_WRITE_STATUS_0, 0, SH1_PIO_WRITE_STATUS_1, 0}; | 535 | u64 pio1[] = {SH1_PIO_WRITE_STATUS_0, 0, SH1_PIO_WRITE_STATUS_1, 0}; |
527 | u64 pio2[] = {SH2_PIO_WRITE_STATUS_0, SH2_PIO_WRITE_STATUS_1, | 536 | u64 pio2[] = {SH2_PIO_WRITE_STATUS_0, SH2_PIO_WRITE_STATUS_1, |
528 | SH2_PIO_WRITE_STATUS_2, SH2_PIO_WRITE_STATUS_3}; | 537 | SH2_PIO_WRITE_STATUS_2, SH2_PIO_WRITE_STATUS_3}; |
529 | u64 *pio; | 538 | u64 *pio; |
530 | pio = is_shub1() ? pio1 : pio2; | 539 | pio = is_shub1() ? pio1 : pio2; |
@@ -556,6 +565,10 @@ static void __init scan_for_ionodes(void) | |||
556 | int nasid = 0; | 565 | int nasid = 0; |
557 | lboard_t *brd; | 566 | lboard_t *brd; |
558 | 567 | ||
568 | /* fakeprom does not support klgraph */ | ||
569 | if (IS_RUNNING_ON_FAKE_PROM()) | ||
570 | return; | ||
571 | |||
559 | /* Setup ionodes with memory */ | 572 | /* Setup ionodes with memory */ |
560 | for (nasid = 0; nasid < MAX_PHYSNODE_ID; nasid += 2) { | 573 | for (nasid = 0; nasid < MAX_PHYSNODE_ID; nasid += 2) { |
561 | char *klgraph_header; | 574 | char *klgraph_header; |
@@ -567,8 +580,6 @@ static void __init scan_for_ionodes(void) | |||
567 | cnodeid = -1; | 580 | cnodeid = -1; |
568 | klgraph_header = __va(ia64_sn_get_klconfig_addr(nasid)); | 581 | klgraph_header = __va(ia64_sn_get_klconfig_addr(nasid)); |
569 | if (!klgraph_header) { | 582 | if (!klgraph_header) { |
570 | if (IS_RUNNING_ON_SIMULATOR()) | ||
571 | continue; | ||
572 | BUG(); /* All nodes must have klconfig tables! */ | 583 | BUG(); /* All nodes must have klconfig tables! */ |
573 | } | 584 | } |
574 | cnodeid = nasid_to_cnodeid(nasid); | 585 | cnodeid = nasid_to_cnodeid(nasid); |
@@ -634,8 +645,8 @@ int | |||
634 | nasid_slice_to_cpuid(int nasid, int slice) | 645 | nasid_slice_to_cpuid(int nasid, int slice) |
635 | { | 646 | { |
636 | long cpu; | 647 | long cpu; |
637 | 648 | ||
638 | for (cpu=0; cpu < NR_CPUS; cpu++) | 649 | for (cpu=0; cpu < NR_CPUS; cpu++) |
639 | if (cpuid_to_nasid(cpu) == nasid && | 650 | if (cpuid_to_nasid(cpu) == nasid && |
640 | cpuid_to_slice(cpu) == slice) | 651 | cpuid_to_slice(cpu) == slice) |
641 | return cpu; | 652 | return cpu; |
diff --git a/include/asm-ia64/sn/simulator.h b/include/asm-ia64/sn/simulator.h index 78eb4f869c8b..cf770e246af5 100644 --- a/include/asm-ia64/sn/simulator.h +++ b/include/asm-ia64/sn/simulator.h | |||
@@ -10,16 +10,17 @@ | |||
10 | 10 | ||
11 | #include <linux/config.h> | 11 | #include <linux/config.h> |
12 | 12 | ||
13 | #ifdef CONFIG_IA64_SGI_SN_SIM | ||
14 | |||
15 | #define SNMAGIC 0xaeeeeeee8badbeefL | 13 | #define SNMAGIC 0xaeeeeeee8badbeefL |
16 | #define IS_RUNNING_ON_SIMULATOR() ({long sn; asm("mov %0=cpuid[%1]" : "=r"(sn) : "r"(2)); sn == SNMAGIC;}) | 14 | #define IS_MEDUSA() ({long sn; asm("mov %0=cpuid[%1]" : "=r"(sn) : "r"(2)); sn == SNMAGIC;}) |
17 | |||
18 | #define SIMULATOR_SLEEP() asm("nop.i 0x8beef") | ||
19 | 15 | ||
16 | #ifdef CONFIG_IA64_SGI_SN_SIM | ||
17 | #define SIMULATOR_SLEEP() asm("nop.i 0x8beef") | ||
18 | #define IS_RUNNING_ON_SIMULATOR() (sn_prom_type) | ||
19 | #define IS_RUNNING_ON_FAKE_PROM() (sn_prom_type == 2) | ||
20 | extern int sn_prom_type; /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */ | ||
20 | #else | 21 | #else |
21 | |||
22 | #define IS_RUNNING_ON_SIMULATOR() (0) | 22 | #define IS_RUNNING_ON_SIMULATOR() (0) |
23 | #define IS_RUNNING_ON_FAKE_PROM() (0) | ||
23 | #define SIMULATOR_SLEEP() | 24 | #define SIMULATOR_SLEEP() |
24 | 25 | ||
25 | #endif | 26 | #endif |
diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h index eb0395ad0d6a..1455375d2ce4 100644 --- a/include/asm-ia64/sn/sn_sal.h +++ b/include/asm-ia64/sn/sn_sal.h | |||
@@ -132,6 +132,8 @@ | |||
132 | #define SALRET_INVALID_ARG (-2) | 132 | #define SALRET_INVALID_ARG (-2) |
133 | #define SALRET_ERROR (-3) | 133 | #define SALRET_ERROR (-3) |
134 | 134 | ||
135 | #define SN_SAL_FAKE_PROM 0x02009999 | ||
136 | |||
135 | 137 | ||
136 | /** | 138 | /** |
137 | * sn_sal_rev_major - get the major SGI SAL revision number | 139 | * sn_sal_rev_major - get the major SGI SAL revision number |
@@ -1105,4 +1107,12 @@ ia64_sn_bte_recovery(nasid_t nasid) | |||
1105 | return (int) rv.status; | 1107 | return (int) rv.status; |
1106 | } | 1108 | } |
1107 | 1109 | ||
1110 | static inline int | ||
1111 | ia64_sn_is_fake_prom(void) | ||
1112 | { | ||
1113 | struct ia64_sal_retval rv; | ||
1114 | SAL_CALL_NOLOCK(rv, SN_SAL_FAKE_PROM, 0, 0, 0, 0, 0, 0, 0); | ||
1115 | return (rv.status == 0); | ||
1116 | } | ||
1117 | |||
1108 | #endif /* _ASM_IA64_SN_SN_SAL_H */ | 1118 | #endif /* _ASM_IA64_SN_SN_SAL_H */ |