diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2007-10-11 05:17:24 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2007-10-11 05:17:24 -0400 |
commit | 250c22777fe1ccd7ac588579a6c16db4c0161cc5 (patch) | |
tree | 55c317efb7d792ec6fdae1d1937c67a502c48dec /arch/x86/kernel/vsmp_64.c | |
parent | 2db55d344e529492545cb3b755c7e9ba8e4fa94e (diff) |
x86_64: move kernel
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/vsmp_64.c')
-rw-r--r-- | arch/x86/kernel/vsmp_64.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c new file mode 100644 index 000000000000..414caf0c5f9a --- /dev/null +++ b/arch/x86/kernel/vsmp_64.c | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * vSMPowered(tm) systems specific initialization | ||
3 | * Copyright (C) 2005 ScaleMP Inc. | ||
4 | * | ||
5 | * Use of this code is subject to the terms and conditions of the | ||
6 | * GNU general public license version 2. See "COPYING" or | ||
7 | * http://www.gnu.org/licenses/gpl.html | ||
8 | * | ||
9 | * Ravikiran Thirumalai <kiran@scalemp.com>, | ||
10 | * Shai Fultheim <shai@scalemp.com> | ||
11 | */ | ||
12 | |||
13 | #include <linux/init.h> | ||
14 | #include <linux/pci_ids.h> | ||
15 | #include <linux/pci_regs.h> | ||
16 | #include <asm/pci-direct.h> | ||
17 | #include <asm/io.h> | ||
18 | |||
19 | static int __init vsmp_init(void) | ||
20 | { | ||
21 | void *address; | ||
22 | unsigned int cap, ctl; | ||
23 | |||
24 | if (!early_pci_allowed()) | ||
25 | return 0; | ||
26 | |||
27 | /* Check if we are running on a ScaleMP vSMP box */ | ||
28 | if ((read_pci_config_16(0, 0x1f, 0, PCI_VENDOR_ID) != PCI_VENDOR_ID_SCALEMP) || | ||
29 | (read_pci_config_16(0, 0x1f, 0, PCI_DEVICE_ID) != PCI_DEVICE_ID_SCALEMP_VSMP_CTL)) | ||
30 | return 0; | ||
31 | |||
32 | /* set vSMP magic bits to indicate vSMP capable kernel */ | ||
33 | address = ioremap(read_pci_config(0, 0x1f, 0, PCI_BASE_ADDRESS_0), 8); | ||
34 | cap = readl(address); | ||
35 | ctl = readl(address + 4); | ||
36 | printk("vSMP CTL: capabilities:0x%08x control:0x%08x\n", cap, ctl); | ||
37 | if (cap & ctl & (1 << 4)) { | ||
38 | /* Turn on vSMP IRQ fastpath handling (see system.h) */ | ||
39 | ctl &= ~(1 << 4); | ||
40 | writel(ctl, address + 4); | ||
41 | ctl = readl(address + 4); | ||
42 | printk("vSMP CTL: control set to:0x%08x\n", ctl); | ||
43 | } | ||
44 | |||
45 | iounmap(address); | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | core_initcall(vsmp_init); | ||