diff options
author | Jack Steiner <steiner@sgi.com> | 2005-08-31 11:05:00 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-08-31 14:00:53 -0400 |
commit | a1cddb88920b915eaba10712ecfd0fc698b00a22 (patch) | |
tree | 1d20af805193ab9982a48cb4c828c0f6af034c6c | |
parent | d8971fcb702e24d1e22c77fd1772f182ffee87e3 (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.c | 30 | ||||
-rw-r--r-- | include/asm-ia64/sn/sn_feature_sets.h | 57 | ||||
-rw-r--r-- | include/asm-ia64/sn/sn_sal.h | 36 |
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); | |||
99 | int sn_prom_type; /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */ | 100 | int sn_prom_type; /* 0=hardware, 1=medusa/realprom, 2=medusa/fakeprom */ |
100 | 101 | ||
101 | short physical_node_map[MAX_PHYSNODE_ID]; | 102 | short physical_node_map[MAX_PHYSNODE_ID]; |
103 | static unsigned long sn_prom_features[MAX_PROM_FEATURE_SETS]; | ||
102 | 104 | ||
103 | EXPORT_SYMBOL(physical_node_map); | 105 | EXPORT_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 | |||
655 | int 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 | } | ||
661 | EXPORT_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 -----------------------------*/ | ||
19 | extern 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 | */ |
341 | static inline u64 | 338 | static inline u64 |
342 | ia64_sn_plat_set_error_handling_features(void) | 339 | ia64_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 | ||
1100 | static inline int | ||
1101 | ia64_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 | |||
1112 | static inline int | ||
1113 | ia64_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 */ |