+++ /dev/null
-From: Russ Anderson <rja@sgi.com>
-Subject: x86: Add UV partition call
-References: bnc#442455
-
-Add a bios call to return partitioning related info.
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/bios_uv.c | 44 ++++++++++++++++++++++++++++++++++-----
- arch/x86/kernel/genx2apic_uv_x.c | 14 +++++++-----
- include/asm-x86/uv/bios.h | 22 ++++++++++++++++---
- 3 files changed, 66 insertions(+), 14 deletions(-)
-
---- a/arch/x86/kernel/bios_uv.c
-+++ b/arch/x86/kernel/bios_uv.c
-@@ -23,6 +23,7 @@
- #include <asm/efi.h>
- #include <linux/io.h>
- #include <asm/uv/bios.h>
-+#include <asm/uv/uv_hub.h>
-
- struct uv_systab uv_systab;
-
-@@ -65,14 +66,47 @@ s64 uv_bios_call_reentrant(enum uv_bios_
- return ret;
- }
-
--long
--x86_bios_freq_base(unsigned long clock_type, unsigned long *ticks_per_second,
-- unsigned long *drift_info)
-+
-+long sn_partition_id;
-+EXPORT_SYMBOL_GPL(sn_partition_id);
-+long uv_coherency_id;
-+EXPORT_SYMBOL_GPL(uv_coherency_id);
-+long uv_region_size;
-+EXPORT_SYMBOL_GPL(uv_region_size);
-+int uv_type;
-+
-+
-+s64 uv_bios_get_sn_info(int fc, int *uvtype, long *partid, long *coher,
-+ long *region)
-+{
-+ s64 ret;
-+ u64 v0, v1;
-+ union partition_info_u part;
-+
-+ ret = uv_bios_call_irqsave(UV_BIOS_GET_SN_INFO, fc,
-+ (u64)(&v0), (u64)(&v1), 0, 0);
-+ if (ret != BIOS_STATUS_SUCCESS)
-+ return ret;
-+
-+ part.val = v0;
-+ if (uvtype)
-+ *uvtype = part.hub_version;
-+ if (partid)
-+ *partid = part.partition_id;
-+ if (coher)
-+ *coher = part.coherence_id;
-+ if (region)
-+ *region = part.region_size;
-+ return ret;
-+}
-+
-+
-+s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second)
- {
- return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type,
-- (u64)ticks_per_second, 0, 0, 0);
-+ (u64)ticks_per_second, 0, 0, 0);
- }
--EXPORT_SYMBOL_GPL(x86_bios_freq_base);
-+EXPORT_SYMBOL_GPL(uv_bios_freq_base);
-
-
- #ifdef CONFIG_EFI
---- a/arch/x86/kernel/genx2apic_uv_x.c
-+++ b/arch/x86/kernel/genx2apic_uv_x.c
-@@ -353,12 +353,12 @@ static __init void map_mmioh_high(int ma
-
- static __init void uv_rtc_init(void)
- {
-- long status, ticks_per_sec, drift;
-+ long status;
-+ u64 ticks_per_sec;
-
-- status =
-- x86_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec,
-- &drift);
-- if (status != 0 || ticks_per_sec < 100000) {
-+ status = uv_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK,
-+ &ticks_per_sec);
-+ if (status != BIOS_STATUS_SUCCESS || ticks_per_sec < 100000) {
- printk(KERN_WARNING
- "unable to determine platform RTC clock frequency, "
- "guessing.\n");
-@@ -523,6 +523,8 @@ void __init uv_system_init(void)
- ~((1 << n_val) - 1)) << m_val;
-
- uv_bios_init();
-+ uv_bios_get_sn_info(0, &uv_type, &sn_partition_id,
-+ &uv_coherency_id, &uv_region_size);
- uv_rtc_init();
-
- for_each_present_cpu(cpu) {
-@@ -544,7 +546,7 @@ void __init uv_system_init(void)
- uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1;
- uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper;
- uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base;
-- uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */
-+ uv_cpu_hub_info(cpu)->coherency_domain_number = uv_coherency_id;
- uv_cpu_hub_info(cpu)->scir.offset = SCIR_LOCAL_MMR_BASE + lcpu;
- uv_node_to_blade[nid] = blade;
- uv_cpu_to_blade[cpu] = blade;
---- a/include/asm-x86/uv/bios.h
-+++ b/include/asm-x86/uv/bios.h
-@@ -61,6 +61,16 @@ enum {
- BIOS_FREQ_BASE_REALTIME_CLOCK = 2
- };
-
-+union partition_info_u {
-+ u64 val;
-+ struct {
-+ u64 hub_version : 8,
-+ partition_id : 16,
-+ coherence_id : 16,
-+ region_size : 24;
-+ };
-+};
-+
- /*
- * bios calls have 6 parameters
- */
-@@ -68,10 +78,16 @@ extern s64 uv_bios_call(enum uv_bios_cmd
- extern s64 uv_bios_call_irqsave(enum uv_bios_cmd, u64, u64, u64, u64, u64);
- extern s64 uv_bios_call_reentrant(enum uv_bios_cmd, u64, u64, u64, u64, u64);
-
-+extern s64 uv_bios_get_sn_info(int, int *, long *, long *, long *);
-+extern s64 uv_bios_freq_base(u64, u64 *);
-+
- extern void uv_bios_init(void);
-
--extern long
--x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
-- unsigned long *drift_info);
-+extern int uv_type;
-+extern long sn_partition_id;
-+extern long uv_coherency_id;
-+extern long uv_region_size;
-+#define partition_coherence_id() (uv_coherency_id)
-+
-
- #endif /* _ASM_X86_BIOS_H */