diff options
author | Russ Anderson <rja@sgi.com> | 2008-10-03 12:59:33 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-16 10:53:13 -0400 |
commit | 922402f15a85f7a064926eb1db68cc52bc4d4a91 (patch) | |
tree | 8e76ac0210479f4babffd71d349d6bcb1e495e16 /arch | |
parent | 7f5942329e0787087a5e4dced838cee711ac2b58 (diff) |
x86: Add UV partition call v4
Add a bios call to return partitioning related info.
Signed-off-by: Russ Anderson <rja@sgi.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/bios_uv.c | 44 | ||||
-rw-r--r-- | arch/x86/kernel/genx2apic_uv_x.c | 14 |
2 files changed, 47 insertions, 11 deletions
diff --git a/arch/x86/kernel/bios_uv.c b/arch/x86/kernel/bios_uv.c index 5481eb59f783..f0dfe6f17e7e 100644 --- a/arch/x86/kernel/bios_uv.c +++ b/arch/x86/kernel/bios_uv.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/efi.h> | 23 | #include <asm/efi.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <asm/uv/bios.h> | 25 | #include <asm/uv/bios.h> |
26 | #include <asm/uv/uv_hub.h> | ||
26 | 27 | ||
27 | struct uv_systab uv_systab; | 28 | struct uv_systab uv_systab; |
28 | 29 | ||
@@ -65,14 +66,47 @@ s64 uv_bios_call_reentrant(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, | |||
65 | return ret; | 66 | return ret; |
66 | } | 67 | } |
67 | 68 | ||
68 | long | 69 | |
69 | x86_bios_freq_base(unsigned long clock_type, unsigned long *ticks_per_second, | 70 | long sn_partition_id; |
70 | unsigned long *drift_info) | 71 | EXPORT_SYMBOL_GPL(sn_partition_id); |
72 | long uv_coherency_id; | ||
73 | EXPORT_SYMBOL_GPL(uv_coherency_id); | ||
74 | long uv_region_size; | ||
75 | EXPORT_SYMBOL_GPL(uv_region_size); | ||
76 | int uv_type; | ||
77 | |||
78 | |||
79 | s64 uv_bios_get_sn_info(int fc, int *uvtype, long *partid, long *coher, | ||
80 | long *region) | ||
81 | { | ||
82 | s64 ret; | ||
83 | u64 v0, v1; | ||
84 | union partition_info_u part; | ||
85 | |||
86 | ret = uv_bios_call_irqsave(UV_BIOS_GET_SN_INFO, fc, | ||
87 | (u64)(&v0), (u64)(&v1), 0, 0); | ||
88 | if (ret != BIOS_STATUS_SUCCESS) | ||
89 | return ret; | ||
90 | |||
91 | part.val = v0; | ||
92 | if (uvtype) | ||
93 | *uvtype = part.hub_version; | ||
94 | if (partid) | ||
95 | *partid = part.partition_id; | ||
96 | if (coher) | ||
97 | *coher = part.coherence_id; | ||
98 | if (region) | ||
99 | *region = part.region_size; | ||
100 | return ret; | ||
101 | } | ||
102 | |||
103 | |||
104 | s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second) | ||
71 | { | 105 | { |
72 | return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type, | 106 | return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type, |
73 | (u64)ticks_per_second, 0, 0, 0); | 107 | (u64)ticks_per_second, 0, 0, 0); |
74 | } | 108 | } |
75 | EXPORT_SYMBOL_GPL(x86_bios_freq_base); | 109 | EXPORT_SYMBOL_GPL(uv_bios_freq_base); |
76 | 110 | ||
77 | 111 | ||
78 | #ifdef CONFIG_EFI | 112 | #ifdef CONFIG_EFI |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index aa2e5e15bf69..bfd532843df6 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
@@ -341,12 +341,12 @@ static __init void map_mmioh_high(int max_pnode) | |||
341 | 341 | ||
342 | static __init void uv_rtc_init(void) | 342 | static __init void uv_rtc_init(void) |
343 | { | 343 | { |
344 | long status, ticks_per_sec, drift; | 344 | long status; |
345 | u64 ticks_per_sec; | ||
345 | 346 | ||
346 | status = | 347 | status = uv_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK, |
347 | x86_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec, | 348 | &ticks_per_sec); |
348 | &drift); | 349 | if (status != BIOS_STATUS_SUCCESS || ticks_per_sec < 100000) { |
349 | if (status != 0 || ticks_per_sec < 100000) { | ||
350 | printk(KERN_WARNING | 350 | printk(KERN_WARNING |
351 | "unable to determine platform RTC clock frequency, " | 351 | "unable to determine platform RTC clock frequency, " |
352 | "guessing.\n"); | 352 | "guessing.\n"); |
@@ -428,6 +428,8 @@ void __init uv_system_init(void) | |||
428 | ~((1 << n_val) - 1)) << m_val; | 428 | ~((1 << n_val) - 1)) << m_val; |
429 | 429 | ||
430 | uv_bios_init(); | 430 | uv_bios_init(); |
431 | uv_bios_get_sn_info(0, &uv_type, &sn_partition_id, | ||
432 | &uv_coherency_id, &uv_region_size); | ||
431 | uv_rtc_init(); | 433 | uv_rtc_init(); |
432 | 434 | ||
433 | for_each_present_cpu(cpu) { | 435 | for_each_present_cpu(cpu) { |
@@ -449,7 +451,7 @@ void __init uv_system_init(void) | |||
449 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | 451 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; |
450 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | 452 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; |
451 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | 453 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; |
452 | uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */ | 454 | uv_cpu_hub_info(cpu)->coherency_domain_number = uv_coherency_id; |
453 | uv_node_to_blade[nid] = blade; | 455 | uv_node_to_blade[nid] = blade; |
454 | uv_cpu_to_blade[cpu] = blade; | 456 | uv_cpu_to_blade[cpu] = blade; |
455 | max_pnode = max(pnode, max_pnode); | 457 | max_pnode = max(pnode, max_pnode); |