diff options
author | Ravikiran G Thirumalai <kiran@scalex86.org> | 2008-03-24 17:48:36 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-17 11:41:29 -0400 |
commit | e5699a8231593d0e11e65ccf248549935304dab1 (patch) | |
tree | 2b02941763e26430574d2556d08a8a5b3f046e95 /arch/x86 | |
parent | 43cdf5d6e0a75c1069adc8d126b97b792ff53142 (diff) |
x86: clean up vSMP detection
vSMP detection: access pci config space early in boot to detect if the
system is a vSMPowered box, and cache the result in a flag, so that
is_vsmp_box() retrieves the value of the flag always.
Signed-off-by: Ravikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/vsmp_64.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c index 1e9a791dbe39..caf2a26f5cfd 100644 --- a/arch/x86/kernel/vsmp_64.c +++ b/arch/x86/kernel/vsmp_64.c | |||
@@ -108,25 +108,34 @@ static void __init set_vsmp_pv_ops(void) | |||
108 | #endif | 108 | #endif |
109 | 109 | ||
110 | #ifdef CONFIG_PCI | 110 | #ifdef CONFIG_PCI |
111 | static int vsmp = -1; | 111 | static int is_vsmp = -1; |
112 | 112 | ||
113 | int is_vsmp_box(void) | 113 | static void __init detect_vsmp_box(void) |
114 | { | 114 | { |
115 | if (vsmp != -1) | 115 | is_vsmp = 0; |
116 | return vsmp; | ||
117 | 116 | ||
118 | vsmp = 0; | ||
119 | if (!early_pci_allowed()) | 117 | if (!early_pci_allowed()) |
120 | return vsmp; | 118 | return; |
121 | 119 | ||
122 | /* Check if we are running on a ScaleMP vSMP box */ | 120 | /* Check if we are running on a ScaleMP vSMPowered box */ |
123 | if (read_pci_config(0, 0x1f, 0, PCI_VENDOR_ID) == | 121 | if (read_pci_config(0, 0x1f, 0, PCI_VENDOR_ID) == |
124 | (PCI_VENDOR_ID_SCALEMP | (PCI_DEVICE_ID_SCALEMP_VSMP_CTL << 16))) | 122 | (PCI_VENDOR_ID_SCALEMP | (PCI_DEVICE_ID_SCALEMP_VSMP_CTL << 16))) |
125 | vsmp = 1; | 123 | is_vsmp = 1; |
124 | } | ||
126 | 125 | ||
127 | return vsmp; | 126 | int is_vsmp_box(void) |
127 | { | ||
128 | if (is_vsmp != -1) | ||
129 | return is_vsmp; | ||
130 | else { | ||
131 | WARN_ON_ONCE(1); | ||
132 | return 0; | ||
133 | } | ||
128 | } | 134 | } |
129 | #else | 135 | #else |
136 | static int __init detect_vsmp_box(void) | ||
137 | { | ||
138 | } | ||
130 | int is_vsmp_box(void) | 139 | int is_vsmp_box(void) |
131 | { | 140 | { |
132 | return 0; | 141 | return 0; |
@@ -135,6 +144,7 @@ int is_vsmp_box(void) | |||
135 | 144 | ||
136 | void __init vsmp_init(void) | 145 | void __init vsmp_init(void) |
137 | { | 146 | { |
147 | detect_vsmp_box(); | ||
138 | if (!is_vsmp_box()) | 148 | if (!is_vsmp_box()) |
139 | return; | 149 | return; |
140 | 150 | ||