aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Steiner <steiner@sgi.com>2005-08-31 11:05:00 -0400
committerTony Luck <tony.luck@intel.com>2005-08-31 14:00:53 -0400
commita1cddb88920b915eaba10712ecfd0fc698b00a22 (patch)
tree1d20af805193ab9982a48cb4c828c0f6af034c6c
parentd8971fcb702e24d1e22c77fd1772f182ffee87e3 (diff)
[IA64-SGI] Add new vendor-specific SAL calls for:
- notifying the PROM of specific features that are supported by the OS. This is used to enable PROM feature if and only if the corresponding feature is implemented in the OS - fetch feature sets that are supported by the current PROM. This allows the OS to selectively enable features when the PROM support is available. Signed-off-by: Jack Steiner <steiner@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r--arch/ia64/sn/kernel/setup.c30
-rw-r--r--include/asm-ia64/sn/sn_feature_sets.h57
-rw-r--r--include/asm-ia64/sn/sn_sal.h36
3 files changed, 103 insertions, 20 deletions
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
index 7c7fe441d623..981928f35a8c 100644
--- a/arch/ia64/sn/kernel/setup.c
+++ b/arch/ia64/sn/kernel/setup.c
@@ -49,6 +49,7 @@
49#include <asm/sn/clksupport.h> 49#include <asm/sn/clksupport.h>
50#include <asm/sn/sn_sal.h> 50#include <asm/sn/sn_sal.h>
51#include <asm/sn/geo.h> 51#include <asm/sn/geo.h>
52#include <asm/sn/sn_feature_sets.h>
52#include "xtalk/xwidgetdev.h" 53#include "xtalk/xwidgetdev.h"
53#include "xtalk/hubdev.h" 54#include "xtalk/hubdev.h"
54#include <asm/sn/klconfig.h> 55#include <asm/sn/klconfig.h>
@@ -99,6 +100,7 @@ EXPORT_SYMBOL(sn_region_size);
99int sn_prom_type; /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */ 100int sn_prom_type; /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */
100 101
101short physical_node_map[MAX_PHYSNODE_ID]; 102short physical_node_map[MAX_PHYSNODE_ID];
103static unsigned long sn_prom_features[MAX_PROM_FEATURE_SETS];
102 104
103EXPORT_SYMBOL(physical_node_map); 105EXPORT_SYMBOL(physical_node_map);
104 106
@@ -273,7 +275,10 @@ void __init sn_setup(char **cmdline_p)
273 u32 version = sn_sal_rev(); 275 u32 version = sn_sal_rev();
274 extern void sn_cpu_init(void); 276 extern void sn_cpu_init(void);
275 277
276 ia64_sn_plat_set_error_handling_features(); 278 ia64_sn_plat_set_error_handling_features(); // obsolete
279 ia64_sn_set_os_feature(OSF_MCA_SLV_TO_OS_INIT_SLV);
280 ia64_sn_set_os_feature(OSF_FEAT_LOG_SBES);
281
277 282
278#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) 283#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
279 /* 284 /*
@@ -316,16 +321,6 @@ void __init sn_setup(char **cmdline_p)
316 321
317 printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF); 322 printk("SGI SAL version %x.%02x\n", version >> 8, version & 0x00FF);
318 323
319 /*
320 * Confirm the SAL we're running on is recent enough...
321 */
322 if (version < SN_SAL_MIN_VERSION) {
323 printk(KERN_ERR "This kernel needs SGI SAL version >= "
324 "%x.%02x\n", SN_SAL_MIN_VERSION >> 8,
325 SN_SAL_MIN_VERSION & 0x00FF);
326 panic("PROM version too old\n");
327 }
328
329 master_nasid = boot_get_nasid(); 324 master_nasid = boot_get_nasid();
330 325
331 status = 326 status =
@@ -481,6 +476,10 @@ void __init sn_cpu_init(void)
481 if (nodepdaindr[0] == NULL) 476 if (nodepdaindr[0] == NULL)
482 return; 477 return;
483 478
479 for (i = 0; i < MAX_PROM_FEATURE_SETS; i++)
480 if (ia64_sn_get_prom_feature_set(i, &sn_prom_features[i]) != 0)
481 break;
482
484 cpuid = smp_processor_id(); 483 cpuid = smp_processor_id();
485 cpuphyid = get_sapicid(); 484 cpuphyid = get_sapicid();
486 485
@@ -652,3 +651,12 @@ nasid_slice_to_cpuid(int nasid, int slice)
652 651
653 return -1; 652 return -1;
654} 653}
654
655int sn_prom_feature_available(int id)
656{
657 if (id >= BITS_PER_LONG * MAX_PROM_FEATURE_SETS)
658 return 0;
659 return test_bit(id, sn_prom_features);
660}
661EXPORT_SYMBOL(sn_prom_feature_available);
662
diff --git a/include/asm-ia64/sn/sn_feature_sets.h b/include/asm-ia64/sn/sn_feature_sets.h
new file mode 100644
index 000000000000..e68a80853d5d
--- /dev/null
+++ b/include/asm-ia64/sn/sn_feature_sets.h
@@ -0,0 +1,57 @@
1#ifndef _ASM_IA64_SN_FEATURE_SETS_H
2#define _ASM_IA64_SN_FEATURE_SETS_H
3
4/*
5 * SN PROM Features
6 *
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file "COPYING" in the main directory of this archive
9 * for more details.
10 *
11 * Copyright (c) 2005 Silicon Graphics, Inc. All rights reserved.
12 */
13
14
15#include <asm/types.h>
16#include <asm/bitops.h>
17
18/* --------------------- PROM Features -----------------------------*/
19extern int sn_prom_feature_available(int id);
20
21#define MAX_PROM_FEATURE_SETS 2
22
23/*
24 * The following defines features that may or may not be supported by the
25 * current PROM. The OS uses sn_prom_feature_available(feature) to test for
26 * the presence of a PROM feature. Down rev (old) PROMs will always test
27 * "false" for new features.
28 *
29 * Use:
30 * if (sn_prom_feature_available(PRF_FEATURE_XXX))
31 * ...
32 */
33
34/*
35 * Example: feature XXX
36 */
37#define PRF_FEATURE_XXX 0
38
39
40
41/* --------------------- OS Features -------------------------------*/
42
43/*
44 * The following defines OS features that are optionally present in
45 * the operating system.
46 * During boot, PROM is notified of these features via a series of calls:
47 *
48 * ia64_sn_set_os_feature(feature1);
49 *
50 * Once enabled, a feature cannot be disabled.
51 *
52 * By default, features are disabled unless explicitly enabled.
53 */
54#define OSF_MCA_SLV_TO_OS_INIT_SLV 0
55#define OSF_FEAT_LOG_SBES 1
56
57#endif /* _ASM_IA64_SN_FEATURE_SETS_H */
diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h
index 27976d223186..231d0d04c3e8 100644
--- a/include/asm-ia64/sn/sn_sal.h
+++ b/include/asm-ia64/sn/sn_sal.h
@@ -80,6 +80,9 @@
80#define SN_SAL_BTE_RECOVER 0x02000061 80#define SN_SAL_BTE_RECOVER 0x02000061
81#define SN_SAL_IOIF_GET_PCI_TOPOLOGY 0x02000062 81#define SN_SAL_IOIF_GET_PCI_TOPOLOGY 0x02000062
82 82
83#define SN_SAL_GET_PROM_FEATURE_SET 0x02000065
84#define SN_SAL_SET_OS_FEATURE_SET 0x02000066
85
83/* 86/*
84 * Service-specific constants 87 * Service-specific constants
85 */ 88 */
@@ -118,8 +121,8 @@
118/* 121/*
119 * Error Handling Features 122 * Error Handling Features
120 */ 123 */
121#define SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV 0x1 124#define SAL_ERR_FEAT_MCA_SLV_TO_OS_INIT_SLV 0x1 // obsolete
122#define SAL_ERR_FEAT_LOG_SBES 0x2 125#define SAL_ERR_FEAT_LOG_SBES 0x2 // obsolete
123#define SAL_ERR_FEAT_MFR_OVERRIDE 0x4 126#define SAL_ERR_FEAT_MFR_OVERRIDE 0x4
124#define SAL_ERR_FEAT_SBE_THRESHOLD 0xffff0000 127#define SAL_ERR_FEAT_SBE_THRESHOLD 0xffff0000
125 128
@@ -152,12 +155,6 @@ sn_sal_rev(void)
152} 155}
153 156
154/* 157/*
155 * Specify the minimum PROM revsion required for this kernel.
156 * Note that they're stored in hex format...
157 */
158#define SN_SAL_MIN_VERSION 0x0404
159
160/*
161 * Returns the master console nasid, if the call fails, return an illegal 158 * Returns the master console nasid, if the call fails, return an illegal
162 * value. 159 * value.
163 */ 160 */
@@ -336,7 +333,7 @@ ia64_sn_plat_cpei_handler(void)
336} 333}
337 334
338/* 335/*
339 * Set Error Handling Features 336 * Set Error Handling Features (Obsolete)
340 */ 337 */
341static inline u64 338static inline u64
342ia64_sn_plat_set_error_handling_features(void) 339ia64_sn_plat_set_error_handling_features(void)
@@ -1100,4 +1097,25 @@ ia64_sn_is_fake_prom(void)
1100 return (rv.status == 0); 1097 return (rv.status == 0);
1101} 1098}
1102 1099
1100static inline int
1101ia64_sn_get_prom_feature_set(int set, unsigned long *feature_set)
1102{
1103 struct ia64_sal_retval rv;
1104
1105 SAL_CALL_NOLOCK(rv, SN_SAL_GET_PROM_FEATURE_SET, set, 0, 0, 0, 0, 0, 0);
1106 if (rv.status != 0)
1107 return rv.status;
1108 *feature_set = rv.v0;
1109 return 0;
1110}
1111
1112static inline int
1113ia64_sn_set_os_feature(int feature)
1114{
1115 struct ia64_sal_retval rv;
1116
1117 SAL_CALL_NOLOCK(rv, SN_SAL_SET_OS_FEATURE_SET, feature, 0, 0, 0, 0, 0, 0);
1118 return rv.status;
1119}
1120
1103#endif /* _ASM_IA64_SN_SN_SAL_H */ 1121#endif /* _ASM_IA64_SN_SN_SAL_H */