diff options
Diffstat (limited to 'arch/x86')
57 files changed, 796 insertions, 77 deletions
diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild index ad8ec356fb3..0e103236b75 100644 --- a/arch/x86/Kbuild +++ b/arch/x86/Kbuild | |||
@@ -14,3 +14,4 @@ obj-y += crypto/ | |||
14 | obj-y += vdso/ | 14 | obj-y += vdso/ |
15 | obj-$(CONFIG_IA32_EMULATION) += ia32/ | 15 | obj-$(CONFIG_IA32_EMULATION) += ia32/ |
16 | 16 | ||
17 | obj-y += platform/ | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 299fbc86f57..e8327686d3c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -1,6 +1,3 @@ | |||
1 | # x86 configuration | ||
2 | mainmenu "Linux Kernel Configuration for x86" | ||
3 | |||
4 | # Select 32 or 64 bit | 1 | # Select 32 or 64 bit |
5 | config 64BIT | 2 | config 64BIT |
6 | bool "64-bit kernel" if ARCH = "x86" | 3 | bool "64-bit kernel" if ARCH = "x86" |
@@ -1896,6 +1893,11 @@ config PCI_OLPC | |||
1896 | def_bool y | 1893 | def_bool y |
1897 | depends on PCI && OLPC && (PCI_GOOLPC || PCI_GOANY) | 1894 | depends on PCI && OLPC && (PCI_GOOLPC || PCI_GOANY) |
1898 | 1895 | ||
1896 | config PCI_XEN | ||
1897 | def_bool y | ||
1898 | depends on PCI && XEN | ||
1899 | select SWIOTLB_XEN | ||
1900 | |||
1899 | config PCI_DOMAINS | 1901 | config PCI_DOMAINS |
1900 | def_bool y | 1902 | def_bool y |
1901 | depends on PCI | 1903 | depends on PCI |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 92091de1111..55d106b5e31 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
@@ -93,6 +93,9 @@ extern u8 acpi_sci_flags; | |||
93 | extern int acpi_sci_override_gsi; | 93 | extern int acpi_sci_override_gsi; |
94 | void acpi_pic_sci_set_trigger(unsigned int, u16); | 94 | void acpi_pic_sci_set_trigger(unsigned int, u16); |
95 | 95 | ||
96 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, | ||
97 | int trigger, int polarity); | ||
98 | |||
96 | static inline void disable_acpi(void) | 99 | static inline void disable_acpi(void) |
97 | { | 100 | { |
98 | acpi_disabled = 1; | 101 | acpi_disabled = 1; |
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index f0203f4791a..07227308252 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
@@ -41,6 +41,8 @@ | |||
41 | #include <asm-generic/int-ll64.h> | 41 | #include <asm-generic/int-ll64.h> |
42 | #include <asm/page.h> | 42 | #include <asm/page.h> |
43 | 43 | ||
44 | #include <xen/xen.h> | ||
45 | |||
44 | #define build_mmio_read(name, size, type, reg, barrier) \ | 46 | #define build_mmio_read(name, size, type, reg, barrier) \ |
45 | static inline type name(const volatile void __iomem *addr) \ | 47 | static inline type name(const volatile void __iomem *addr) \ |
46 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ | 48 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
@@ -351,6 +353,17 @@ extern void early_iounmap(void __iomem *addr, unsigned long size); | |||
351 | extern void fixup_early_ioremap(void); | 353 | extern void fixup_early_ioremap(void); |
352 | extern bool is_early_ioremap_ptep(pte_t *ptep); | 354 | extern bool is_early_ioremap_ptep(pte_t *ptep); |
353 | 355 | ||
356 | #ifdef CONFIG_XEN | ||
357 | struct bio_vec; | ||
358 | |||
359 | extern bool xen_biovec_phys_mergeable(const struct bio_vec *vec1, | ||
360 | const struct bio_vec *vec2); | ||
361 | |||
362 | #define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ | ||
363 | (__BIOVEC_PHYS_MERGEABLE(vec1, vec2) && \ | ||
364 | (!xen_domain() || xen_biovec_phys_mergeable(vec1, vec2))) | ||
365 | #endif /* CONFIG_XEN */ | ||
366 | |||
354 | #define IO_SPACE_LIMIT 0xffff | 367 | #define IO_SPACE_LIMIT 0xffff |
355 | 368 | ||
356 | #endif /* _ASM_X86_IO_H */ | 369 | #endif /* _ASM_X86_IO_H */ |
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index c8be4566c3d..a6b28d017c2 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
@@ -169,6 +169,7 @@ extern void mask_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); | |||
169 | extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); | 169 | extern int restore_IO_APIC_setup(struct IO_APIC_route_entry **ioapic_entries); |
170 | 170 | ||
171 | extern void probe_nr_irqs_gsi(void); | 171 | extern void probe_nr_irqs_gsi(void); |
172 | extern int get_nr_irqs_gsi(void); | ||
172 | 173 | ||
173 | extern void setup_ioapic_ids_from_mpc(void); | 174 | extern void setup_ioapic_ids_from_mpc(void); |
174 | 175 | ||
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index d395540ff89..ca0437c714b 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/string.h> | 7 | #include <linux/string.h> |
8 | #include <asm/scatterlist.h> | 8 | #include <asm/scatterlist.h> |
9 | #include <asm/io.h> | 9 | #include <asm/io.h> |
10 | #include <asm/x86_init.h> | ||
10 | 11 | ||
11 | #ifdef __KERNEL__ | 12 | #ifdef __KERNEL__ |
12 | 13 | ||
@@ -94,8 +95,36 @@ static inline void early_quirks(void) { } | |||
94 | 95 | ||
95 | extern void pci_iommu_alloc(void); | 96 | extern void pci_iommu_alloc(void); |
96 | 97 | ||
97 | /* MSI arch hook */ | 98 | #ifdef CONFIG_PCI_MSI |
98 | #define arch_setup_msi_irqs arch_setup_msi_irqs | 99 | /* MSI arch specific hooks */ |
100 | static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | ||
101 | { | ||
102 | return x86_msi.setup_msi_irqs(dev, nvec, type); | ||
103 | } | ||
104 | |||
105 | static inline void x86_teardown_msi_irqs(struct pci_dev *dev) | ||
106 | { | ||
107 | x86_msi.teardown_msi_irqs(dev); | ||
108 | } | ||
109 | |||
110 | static inline void x86_teardown_msi_irq(unsigned int irq) | ||
111 | { | ||
112 | x86_msi.teardown_msi_irq(irq); | ||
113 | } | ||
114 | #define arch_setup_msi_irqs x86_setup_msi_irqs | ||
115 | #define arch_teardown_msi_irqs x86_teardown_msi_irqs | ||
116 | #define arch_teardown_msi_irq x86_teardown_msi_irq | ||
117 | /* implemented in arch/x86/kernel/apic/io_apic. */ | ||
118 | int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); | ||
119 | void native_teardown_msi_irq(unsigned int irq); | ||
120 | /* default to the implementation in drivers/lib/msi.c */ | ||
121 | #define HAVE_DEFAULT_MSI_TEARDOWN_IRQS | ||
122 | void default_teardown_msi_irqs(struct pci_dev *dev); | ||
123 | #else | ||
124 | #define native_setup_msi_irqs NULL | ||
125 | #define native_teardown_msi_irq NULL | ||
126 | #define default_teardown_msi_irqs NULL | ||
127 | #endif | ||
99 | 128 | ||
100 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | 129 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) |
101 | 130 | ||
diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h index 49c7219826f..704526734be 100644 --- a/arch/x86/include/asm/pci_x86.h +++ b/arch/x86/include/asm/pci_x86.h | |||
@@ -47,6 +47,7 @@ enum pci_bf_sort_state { | |||
47 | extern unsigned int pcibios_max_latency; | 47 | extern unsigned int pcibios_max_latency; |
48 | 48 | ||
49 | void pcibios_resource_survey(void); | 49 | void pcibios_resource_survey(void); |
50 | void pcibios_set_cache_line_size(void); | ||
50 | 51 | ||
51 | /* pci-pc.c */ | 52 | /* pci-pc.c */ |
52 | 53 | ||
diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h index bf6b88ef8ee..e969f691cbf 100644 --- a/arch/x86/include/asm/uv/uv_hub.h +++ b/arch/x86/include/asm/uv/uv_hub.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * SGI UV architectural definitions | 6 | * SGI UV architectural definitions |
7 | * | 7 | * |
8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef _ASM_X86_UV_UV_HUB_H | 11 | #ifndef _ASM_X86_UV_UV_HUB_H |
@@ -77,7 +77,8 @@ | |||
77 | * | 77 | * |
78 | * 1111110000000000 | 78 | * 1111110000000000 |
79 | * 5432109876543210 | 79 | * 5432109876543210 |
80 | * pppppppppplc0cch | 80 | * pppppppppplc0cch Nehalem-EX |
81 | * ppppppppplcc0cch Westmere-EX | ||
81 | * sssssssssss | 82 | * sssssssssss |
82 | * | 83 | * |
83 | * p = pnode bits | 84 | * p = pnode bits |
@@ -148,12 +149,25 @@ struct uv_hub_info_s { | |||
148 | unsigned char m_val; | 149 | unsigned char m_val; |
149 | unsigned char n_val; | 150 | unsigned char n_val; |
150 | struct uv_scir_s scir; | 151 | struct uv_scir_s scir; |
152 | unsigned char apic_pnode_shift; | ||
151 | }; | 153 | }; |
152 | 154 | ||
153 | DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | 155 | DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); |
154 | #define uv_hub_info (&__get_cpu_var(__uv_hub_info)) | 156 | #define uv_hub_info (&__get_cpu_var(__uv_hub_info)) |
155 | #define uv_cpu_hub_info(cpu) (&per_cpu(__uv_hub_info, cpu)) | 157 | #define uv_cpu_hub_info(cpu) (&per_cpu(__uv_hub_info, cpu)) |
156 | 158 | ||
159 | union uvh_apicid { | ||
160 | unsigned long v; | ||
161 | struct uvh_apicid_s { | ||
162 | unsigned long local_apic_mask : 24; | ||
163 | unsigned long local_apic_shift : 5; | ||
164 | unsigned long unused1 : 3; | ||
165 | unsigned long pnode_mask : 24; | ||
166 | unsigned long pnode_shift : 5; | ||
167 | unsigned long unused2 : 3; | ||
168 | } s; | ||
169 | }; | ||
170 | |||
157 | /* | 171 | /* |
158 | * Local & Global MMR space macros. | 172 | * Local & Global MMR space macros. |
159 | * Note: macros are intended to be used ONLY by inline functions | 173 | * Note: macros are intended to be used ONLY by inline functions |
@@ -182,6 +196,7 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); | |||
182 | #define UV_GLOBAL_MMR64_PNODE_BITS(p) \ | 196 | #define UV_GLOBAL_MMR64_PNODE_BITS(p) \ |
183 | (((unsigned long)(p)) << UV_GLOBAL_MMR64_PNODE_SHIFT) | 197 | (((unsigned long)(p)) << UV_GLOBAL_MMR64_PNODE_SHIFT) |
184 | 198 | ||
199 | #define UVH_APICID 0x002D0E00L | ||
185 | #define UV_APIC_PNODE_SHIFT 6 | 200 | #define UV_APIC_PNODE_SHIFT 6 |
186 | 201 | ||
187 | /* Local Bus from cpu's perspective */ | 202 | /* Local Bus from cpu's perspective */ |
@@ -280,7 +295,7 @@ static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) | |||
280 | */ | 295 | */ |
281 | static inline int uv_apicid_to_pnode(int apicid) | 296 | static inline int uv_apicid_to_pnode(int apicid) |
282 | { | 297 | { |
283 | return (apicid >> UV_APIC_PNODE_SHIFT); | 298 | return (apicid >> uv_hub_info->apic_pnode_shift); |
284 | } | 299 | } |
285 | 300 | ||
286 | /* | 301 | /* |
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index baa579c8e03..64642ad019f 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h | |||
@@ -154,9 +154,18 @@ struct x86_platform_ops { | |||
154 | int (*i8042_detect)(void); | 154 | int (*i8042_detect)(void); |
155 | }; | 155 | }; |
156 | 156 | ||
157 | struct pci_dev; | ||
158 | |||
159 | struct x86_msi_ops { | ||
160 | int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); | ||
161 | void (*teardown_msi_irq)(unsigned int irq); | ||
162 | void (*teardown_msi_irqs)(struct pci_dev *dev); | ||
163 | }; | ||
164 | |||
157 | extern struct x86_init_ops x86_init; | 165 | extern struct x86_init_ops x86_init; |
158 | extern struct x86_cpuinit_ops x86_cpuinit; | 166 | extern struct x86_cpuinit_ops x86_cpuinit; |
159 | extern struct x86_platform_ops x86_platform; | 167 | extern struct x86_platform_ops x86_platform; |
168 | extern struct x86_msi_ops x86_msi; | ||
160 | 169 | ||
161 | extern void x86_init_noop(void); | 170 | extern void x86_init_noop(void); |
162 | extern void x86_init_uint_noop(unsigned int unused); | 171 | extern void x86_init_uint_noop(unsigned int unused); |
diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h new file mode 100644 index 00000000000..2329b3eaf8d --- /dev/null +++ b/arch/x86/include/asm/xen/pci.h | |||
@@ -0,0 +1,65 @@ | |||
1 | #ifndef _ASM_X86_XEN_PCI_H | ||
2 | #define _ASM_X86_XEN_PCI_H | ||
3 | |||
4 | #if defined(CONFIG_PCI_XEN) | ||
5 | extern int __init pci_xen_init(void); | ||
6 | extern int __init pci_xen_hvm_init(void); | ||
7 | #define pci_xen 1 | ||
8 | #else | ||
9 | #define pci_xen 0 | ||
10 | #define pci_xen_init (0) | ||
11 | static inline int pci_xen_hvm_init(void) | ||
12 | { | ||
13 | return -1; | ||
14 | } | ||
15 | #endif | ||
16 | #if defined(CONFIG_XEN_DOM0) | ||
17 | void __init xen_setup_pirqs(void); | ||
18 | #else | ||
19 | static inline void __init xen_setup_pirqs(void) | ||
20 | { | ||
21 | } | ||
22 | #endif | ||
23 | |||
24 | #if defined(CONFIG_PCI_MSI) | ||
25 | #if defined(CONFIG_PCI_XEN) | ||
26 | /* The drivers/pci/xen-pcifront.c sets this structure to | ||
27 | * its own functions. | ||
28 | */ | ||
29 | struct xen_pci_frontend_ops { | ||
30 | int (*enable_msi)(struct pci_dev *dev, int **vectors); | ||
31 | void (*disable_msi)(struct pci_dev *dev); | ||
32 | int (*enable_msix)(struct pci_dev *dev, int **vectors, int nvec); | ||
33 | void (*disable_msix)(struct pci_dev *dev); | ||
34 | }; | ||
35 | |||
36 | extern struct xen_pci_frontend_ops *xen_pci_frontend; | ||
37 | |||
38 | static inline int xen_pci_frontend_enable_msi(struct pci_dev *dev, | ||
39 | int **vectors) | ||
40 | { | ||
41 | if (xen_pci_frontend && xen_pci_frontend->enable_msi) | ||
42 | return xen_pci_frontend->enable_msi(dev, vectors); | ||
43 | return -ENODEV; | ||
44 | } | ||
45 | static inline void xen_pci_frontend_disable_msi(struct pci_dev *dev) | ||
46 | { | ||
47 | if (xen_pci_frontend && xen_pci_frontend->disable_msi) | ||
48 | xen_pci_frontend->disable_msi(dev); | ||
49 | } | ||
50 | static inline int xen_pci_frontend_enable_msix(struct pci_dev *dev, | ||
51 | int **vectors, int nvec) | ||
52 | { | ||
53 | if (xen_pci_frontend && xen_pci_frontend->enable_msix) | ||
54 | return xen_pci_frontend->enable_msix(dev, vectors, nvec); | ||
55 | return -ENODEV; | ||
56 | } | ||
57 | static inline void xen_pci_frontend_disable_msix(struct pci_dev *dev) | ||
58 | { | ||
59 | if (xen_pci_frontend && xen_pci_frontend->disable_msix) | ||
60 | xen_pci_frontend->disable_msix(dev); | ||
61 | } | ||
62 | #endif /* CONFIG_PCI_XEN */ | ||
63 | #endif /* CONFIG_PCI_MSI */ | ||
64 | |||
65 | #endif /* _ASM_X86_XEN_PCI_H */ | ||
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 2c833d8c414..9e13763b609 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -36,7 +36,6 @@ obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o | |||
36 | obj-y += time.o ioport.o ldt.o dumpstack.o | 36 | obj-y += time.o ioport.o ldt.o dumpstack.o |
37 | obj-y += setup.o x86_init.o i8259.o irqinit.o jump_label.o | 37 | obj-y += setup.o x86_init.o i8259.o irqinit.o jump_label.o |
38 | obj-$(CONFIG_IRQ_WORK) += irq_work.o | 38 | obj-$(CONFIG_IRQ_WORK) += irq_work.o |
39 | obj-$(CONFIG_X86_VISWS) += visws_quirks.o | ||
40 | obj-$(CONFIG_X86_32) += probe_roms_32.o | 39 | obj-$(CONFIG_X86_32) += probe_roms_32.o |
41 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o | 40 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o |
42 | obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o | 41 | obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o |
@@ -58,7 +57,6 @@ obj-$(CONFIG_INTEL_TXT) += tboot.o | |||
58 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | 57 | obj-$(CONFIG_STACKTRACE) += stacktrace.o |
59 | obj-y += cpu/ | 58 | obj-y += cpu/ |
60 | obj-y += acpi/ | 59 | obj-y += acpi/ |
61 | obj-$(CONFIG_SFI) += sfi.o | ||
62 | obj-y += reboot.o | 60 | obj-y += reboot.o |
63 | obj-$(CONFIG_MCA) += mca_32.o | 61 | obj-$(CONFIG_MCA) += mca_32.o |
64 | obj-$(CONFIG_X86_MSR) += msr.o | 62 | obj-$(CONFIG_X86_MSR) += msr.o |
@@ -82,7 +80,6 @@ obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o | |||
82 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o | 80 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o |
83 | obj-$(CONFIG_KPROBES) += kprobes.o | 81 | obj-$(CONFIG_KPROBES) += kprobes.o |
84 | obj-$(CONFIG_MODULES) += module.o | 82 | obj-$(CONFIG_MODULES) += module.o |
85 | obj-$(CONFIG_EFI) += efi.o efi_$(BITS).o efi_stub_$(BITS).o | ||
86 | obj-$(CONFIG_DOUBLEFAULT) += doublefault_32.o | 83 | obj-$(CONFIG_DOUBLEFAULT) += doublefault_32.o |
87 | obj-$(CONFIG_KGDB) += kgdb.o | 84 | obj-$(CONFIG_KGDB) += kgdb.o |
88 | obj-$(CONFIG_VM86) += vm86_32.o | 85 | obj-$(CONFIG_VM86) += vm86_32.o |
@@ -104,14 +101,6 @@ obj-$(CONFIG_PARAVIRT_CLOCK) += pvclock.o | |||
104 | 101 | ||
105 | obj-$(CONFIG_PCSPKR_PLATFORM) += pcspeaker.o | 102 | obj-$(CONFIG_PCSPKR_PLATFORM) += pcspeaker.o |
106 | 103 | ||
107 | obj-$(CONFIG_SCx200) += scx200.o | ||
108 | scx200-y += scx200_32.o | ||
109 | |||
110 | obj-$(CONFIG_OLPC) += olpc.o | ||
111 | obj-$(CONFIG_OLPC_XO1) += olpc-xo1.o | ||
112 | obj-$(CONFIG_OLPC_OPENFIRMWARE) += olpc_ofw.o | ||
113 | obj-$(CONFIG_X86_MRST) += mrst.o | ||
114 | |||
115 | microcode-y := microcode_core.o | 104 | microcode-y := microcode_core.o |
116 | microcode-$(CONFIG_MICROCODE_INTEL) += microcode_intel.o | 105 | microcode-$(CONFIG_MICROCODE_INTEL) += microcode_intel.o |
117 | microcode-$(CONFIG_MICROCODE_AMD) += microcode_amd.o | 106 | microcode-$(CONFIG_MICROCODE_AMD) += microcode_amd.o |
@@ -124,7 +113,6 @@ obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o | |||
124 | ### | 113 | ### |
125 | # 64 bit specific files | 114 | # 64 bit specific files |
126 | ifeq ($(CONFIG_X86_64),y) | 115 | ifeq ($(CONFIG_X86_64),y) |
127 | obj-$(CONFIG_X86_UV) += tlb_uv.o bios_uv.o uv_irq.o uv_sysfs.o uv_time.o | ||
128 | obj-$(CONFIG_AUDIT) += audit_64.o | 116 | obj-$(CONFIG_AUDIT) += audit_64.o |
129 | 117 | ||
130 | obj-$(CONFIG_GART_IOMMU) += pci-gart_64.o aperture_64.o | 118 | obj-$(CONFIG_GART_IOMMU) += pci-gart_64.o aperture_64.o |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index c05872aa3ce..71232b941b6 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -513,35 +513,62 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi) | |||
513 | return 0; | 513 | return 0; |
514 | } | 514 | } |
515 | 515 | ||
516 | /* | 516 | static int acpi_register_gsi_pic(struct device *dev, u32 gsi, |
517 | * success: return IRQ number (>=0) | 517 | int trigger, int polarity) |
518 | * failure: return < 0 | ||
519 | */ | ||
520 | int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | ||
521 | { | 518 | { |
522 | unsigned int irq; | ||
523 | unsigned int plat_gsi = gsi; | ||
524 | |||
525 | #ifdef CONFIG_PCI | 519 | #ifdef CONFIG_PCI |
526 | /* | 520 | /* |
527 | * Make sure all (legacy) PCI IRQs are set as level-triggered. | 521 | * Make sure all (legacy) PCI IRQs are set as level-triggered. |
528 | */ | 522 | */ |
529 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { | 523 | if (trigger == ACPI_LEVEL_SENSITIVE) |
530 | if (trigger == ACPI_LEVEL_SENSITIVE) | 524 | eisa_set_level_irq(gsi); |
531 | eisa_set_level_irq(gsi); | ||
532 | } | ||
533 | #endif | 525 | #endif |
534 | 526 | ||
527 | return gsi; | ||
528 | } | ||
529 | |||
530 | static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi, | ||
531 | int trigger, int polarity) | ||
532 | { | ||
535 | #ifdef CONFIG_X86_IO_APIC | 533 | #ifdef CONFIG_X86_IO_APIC |
536 | if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) { | 534 | gsi = mp_register_gsi(dev, gsi, trigger, polarity); |
537 | plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity); | ||
538 | } | ||
539 | #endif | 535 | #endif |
536 | |||
537 | return gsi; | ||
538 | } | ||
539 | |||
540 | int (*__acpi_register_gsi)(struct device *dev, u32 gsi, | ||
541 | int trigger, int polarity) = acpi_register_gsi_pic; | ||
542 | |||
543 | /* | ||
544 | * success: return IRQ number (>=0) | ||
545 | * failure: return < 0 | ||
546 | */ | ||
547 | int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) | ||
548 | { | ||
549 | unsigned int irq; | ||
550 | unsigned int plat_gsi = gsi; | ||
551 | |||
552 | plat_gsi = (*__acpi_register_gsi)(dev, gsi, trigger, polarity); | ||
540 | irq = gsi_to_irq(plat_gsi); | 553 | irq = gsi_to_irq(plat_gsi); |
541 | 554 | ||
542 | return irq; | 555 | return irq; |
543 | } | 556 | } |
544 | 557 | ||
558 | void __init acpi_set_irq_model_pic(void) | ||
559 | { | ||
560 | acpi_irq_model = ACPI_IRQ_MODEL_PIC; | ||
561 | __acpi_register_gsi = acpi_register_gsi_pic; | ||
562 | acpi_ioapic = 0; | ||
563 | } | ||
564 | |||
565 | void __init acpi_set_irq_model_ioapic(void) | ||
566 | { | ||
567 | acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC; | ||
568 | __acpi_register_gsi = acpi_register_gsi_ioapic; | ||
569 | acpi_ioapic = 1; | ||
570 | } | ||
571 | |||
545 | /* | 572 | /* |
546 | * ACPI based hotplug support for CPU | 573 | * ACPI based hotplug support for CPU |
547 | */ | 574 | */ |
@@ -1259,8 +1286,7 @@ static void __init acpi_process_madt(void) | |||
1259 | */ | 1286 | */ |
1260 | error = acpi_parse_madt_ioapic_entries(); | 1287 | error = acpi_parse_madt_ioapic_entries(); |
1261 | if (!error) { | 1288 | if (!error) { |
1262 | acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC; | 1289 | acpi_set_irq_model_ioapic(); |
1263 | acpi_ioapic = 1; | ||
1264 | 1290 | ||
1265 | smp_found_config = 1; | 1291 | smp_found_config = 1; |
1266 | } | 1292 | } |
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 0b30214282a..5079f24c955 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
@@ -638,7 +638,7 @@ void *__kprobes text_poke_smp(void *addr, const void *opcode, size_t len) | |||
638 | atomic_set(&stop_machine_first, 1); | 638 | atomic_set(&stop_machine_first, 1); |
639 | wrote_text = 0; | 639 | wrote_text = 0; |
640 | /* Use __stop_machine() because the caller already got online_cpus. */ | 640 | /* Use __stop_machine() because the caller already got online_cpus. */ |
641 | __stop_machine(stop_machine_text_poke, (void *)&tpp, NULL); | 641 | __stop_machine(stop_machine_text_poke, (void *)&tpp, cpu_online_mask); |
642 | return addr; | 642 | return addr; |
643 | } | 643 | } |
644 | 644 | ||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 8ae808d110f..7cc0a721f62 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -3109,7 +3109,7 @@ void destroy_irq(unsigned int irq) | |||
3109 | 3109 | ||
3110 | irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); | 3110 | irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); |
3111 | 3111 | ||
3112 | if (intr_remapping_enabled) | 3112 | if (irq_remapped(cfg)) |
3113 | free_irte(irq); | 3113 | free_irte(irq); |
3114 | raw_spin_lock_irqsave(&vector_lock, flags); | 3114 | raw_spin_lock_irqsave(&vector_lock, flags); |
3115 | __clear_irq_vector(irq, cfg); | 3115 | __clear_irq_vector(irq, cfg); |
@@ -3331,7 +3331,7 @@ static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) | |||
3331 | return 0; | 3331 | return 0; |
3332 | } | 3332 | } |
3333 | 3333 | ||
3334 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 3334 | int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
3335 | { | 3335 | { |
3336 | int node, ret, sub_handle, index = 0; | 3336 | int node, ret, sub_handle, index = 0; |
3337 | unsigned int irq, irq_want; | 3337 | unsigned int irq, irq_want; |
@@ -3389,7 +3389,7 @@ error: | |||
3389 | return ret; | 3389 | return ret; |
3390 | } | 3390 | } |
3391 | 3391 | ||
3392 | void arch_teardown_msi_irq(unsigned int irq) | 3392 | void native_teardown_msi_irq(unsigned int irq) |
3393 | { | 3393 | { |
3394 | destroy_irq(irq); | 3394 | destroy_irq(irq); |
3395 | } | 3395 | } |
@@ -3650,6 +3650,11 @@ void __init probe_nr_irqs_gsi(void) | |||
3650 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); | 3650 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); |
3651 | } | 3651 | } |
3652 | 3652 | ||
3653 | int get_nr_irqs_gsi(void) | ||
3654 | { | ||
3655 | return nr_irqs_gsi; | ||
3656 | } | ||
3657 | |||
3653 | #ifdef CONFIG_SPARSE_IRQ | 3658 | #ifdef CONFIG_SPARSE_IRQ |
3654 | int __init arch_probe_nr_irqs(void) | 3659 | int __init arch_probe_nr_irqs(void) |
3655 | { | 3660 | { |
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f744f54cb24..ed4118de249 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * SGI UV APIC functions (note: not an Intel compatible APIC) | 6 | * SGI UV APIC functions (note: not an Intel compatible APIC) |
7 | * | 7 | * |
8 | * Copyright (C) 2007-2009 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2010 Silicon Graphics, Inc. All rights reserved. |
9 | */ | 9 | */ |
10 | #include <linux/cpumask.h> | 10 | #include <linux/cpumask.h> |
11 | #include <linux/hardirq.h> | 11 | #include <linux/hardirq.h> |
@@ -41,6 +41,7 @@ DEFINE_PER_CPU(int, x2apic_extra_bits); | |||
41 | 41 | ||
42 | static enum uv_system_type uv_system_type; | 42 | static enum uv_system_type uv_system_type; |
43 | static u64 gru_start_paddr, gru_end_paddr; | 43 | static u64 gru_start_paddr, gru_end_paddr; |
44 | static union uvh_apicid uvh_apicid; | ||
44 | int uv_min_hub_revision_id; | 45 | int uv_min_hub_revision_id; |
45 | EXPORT_SYMBOL_GPL(uv_min_hub_revision_id); | 46 | EXPORT_SYMBOL_GPL(uv_min_hub_revision_id); |
46 | static DEFINE_SPINLOCK(uv_nmi_lock); | 47 | static DEFINE_SPINLOCK(uv_nmi_lock); |
@@ -70,12 +71,27 @@ static int early_get_nodeid(void) | |||
70 | return node_id.s.node_id; | 71 | return node_id.s.node_id; |
71 | } | 72 | } |
72 | 73 | ||
74 | static void __init early_get_apic_pnode_shift(void) | ||
75 | { | ||
76 | unsigned long *mmr; | ||
77 | |||
78 | mmr = early_ioremap(UV_LOCAL_MMR_BASE | UVH_APICID, sizeof(*mmr)); | ||
79 | uvh_apicid.v = *mmr; | ||
80 | early_iounmap(mmr, sizeof(*mmr)); | ||
81 | if (!uvh_apicid.v) | ||
82 | /* | ||
83 | * Old bios, use default value | ||
84 | */ | ||
85 | uvh_apicid.s.pnode_shift = UV_APIC_PNODE_SHIFT; | ||
86 | } | ||
87 | |||
73 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 88 | static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
74 | { | 89 | { |
75 | int nodeid; | 90 | int nodeid; |
76 | 91 | ||
77 | if (!strcmp(oem_id, "SGI")) { | 92 | if (!strcmp(oem_id, "SGI")) { |
78 | nodeid = early_get_nodeid(); | 93 | nodeid = early_get_nodeid(); |
94 | early_get_apic_pnode_shift(); | ||
79 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; | 95 | x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range; |
80 | x86_platform.nmi_init = uv_nmi_init; | 96 | x86_platform.nmi_init = uv_nmi_init; |
81 | if (!strcmp(oem_table_id, "UVL")) | 97 | if (!strcmp(oem_table_id, "UVL")) |
@@ -84,7 +100,7 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
84 | uv_system_type = UV_X2APIC; | 100 | uv_system_type = UV_X2APIC; |
85 | else if (!strcmp(oem_table_id, "UVH")) { | 101 | else if (!strcmp(oem_table_id, "UVH")) { |
86 | __get_cpu_var(x2apic_extra_bits) = | 102 | __get_cpu_var(x2apic_extra_bits) = |
87 | nodeid << (UV_APIC_PNODE_SHIFT - 1); | 103 | nodeid << (uvh_apicid.s.pnode_shift - 1); |
88 | uv_system_type = UV_NON_UNIQUE_APIC; | 104 | uv_system_type = UV_NON_UNIQUE_APIC; |
89 | return 1; | 105 | return 1; |
90 | } | 106 | } |
@@ -716,6 +732,10 @@ void __init uv_system_init(void) | |||
716 | int apicid = per_cpu(x86_cpu_to_apicid, cpu); | 732 | int apicid = per_cpu(x86_cpu_to_apicid, cpu); |
717 | 733 | ||
718 | nid = cpu_to_node(cpu); | 734 | nid = cpu_to_node(cpu); |
735 | /* | ||
736 | * apic_pnode_shift must be set before calling uv_apicid_to_pnode(); | ||
737 | */ | ||
738 | uv_cpu_hub_info(cpu)->apic_pnode_shift = uvh_apicid.s.pnode_shift; | ||
719 | pnode = uv_apicid_to_pnode(apicid); | 739 | pnode = uv_apicid_to_pnode(apicid); |
720 | blade = boot_pnode_to_blade(pnode); | 740 | blade = boot_pnode_to_blade(pnode); |
721 | lcpu = uv_blade_info[blade].nr_possible_cpus; | 741 | lcpu = uv_blade_info[blade].nr_possible_cpus; |
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 64668dbf00a..96656f20775 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/uaccess.h> | 18 | #include <linux/uaccess.h> |
19 | #include <linux/percpu.h> | 19 | #include <linux/percpu.h> |
20 | #include <linux/mm.h> | ||
20 | 21 | ||
21 | #include <asm/apic.h> | 22 | #include <asm/apic.h> |
22 | 23 | ||
@@ -125,7 +126,9 @@ void __cpuinit irq_ctx_init(int cpu) | |||
125 | if (per_cpu(hardirq_ctx, cpu)) | 126 | if (per_cpu(hardirq_ctx, cpu)) |
126 | return; | 127 | return; |
127 | 128 | ||
128 | irqctx = (union irq_ctx *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER); | 129 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), |
130 | THREAD_FLAGS, | ||
131 | THREAD_ORDER)); | ||
129 | irqctx->tinfo.task = NULL; | 132 | irqctx->tinfo.task = NULL; |
130 | irqctx->tinfo.exec_domain = NULL; | 133 | irqctx->tinfo.exec_domain = NULL; |
131 | irqctx->tinfo.cpu = cpu; | 134 | irqctx->tinfo.cpu = cpu; |
@@ -134,7 +137,9 @@ void __cpuinit irq_ctx_init(int cpu) | |||
134 | 137 | ||
135 | per_cpu(hardirq_ctx, cpu) = irqctx; | 138 | per_cpu(hardirq_ctx, cpu) = irqctx; |
136 | 139 | ||
137 | irqctx = (union irq_ctx *)__get_free_pages(THREAD_FLAGS, THREAD_ORDER); | 140 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), |
141 | THREAD_FLAGS, | ||
142 | THREAD_ORDER)); | ||
138 | irqctx->tinfo.task = NULL; | 143 | irqctx->tinfo.task = NULL; |
139 | irqctx->tinfo.exec_domain = NULL; | 144 | irqctx->tinfo.exec_domain = NULL; |
140 | irqctx->tinfo.cpu = cpu; | 145 | irqctx->tinfo.cpu = cpu; |
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index d81cfebb848..ec592caac4b 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
@@ -387,7 +387,7 @@ kgdb_set_hw_break(unsigned long addr, int len, enum kgdb_bptype bptype) | |||
387 | * disable hardware debugging while it is processing gdb packets or | 387 | * disable hardware debugging while it is processing gdb packets or |
388 | * handling exception. | 388 | * handling exception. |
389 | */ | 389 | */ |
390 | void kgdb_disable_hw_debug(struct pt_regs *regs) | 390 | static void kgdb_disable_hw_debug(struct pt_regs *regs) |
391 | { | 391 | { |
392 | int i; | 392 | int i; |
393 | int cpu = raw_smp_processor_id(); | 393 | int cpu = raw_smp_processor_id(); |
@@ -724,6 +724,7 @@ struct kgdb_arch arch_kgdb_ops = { | |||
724 | .flags = KGDB_HW_BREAKPOINT, | 724 | .flags = KGDB_HW_BREAKPOINT, |
725 | .set_hw_breakpoint = kgdb_set_hw_break, | 725 | .set_hw_breakpoint = kgdb_set_hw_break, |
726 | .remove_hw_breakpoint = kgdb_remove_hw_break, | 726 | .remove_hw_breakpoint = kgdb_remove_hw_break, |
727 | .disable_hw_break = kgdb_disable_hw_debug, | ||
727 | .remove_all_hw_break = kgdb_remove_all_hw_break, | 728 | .remove_all_hw_break = kgdb_remove_all_hw_break, |
728 | .correct_hw_break = kgdb_correct_hw_break, | 729 | .correct_hw_break = kgdb_correct_hw_break, |
729 | }; | 730 | }; |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 95a32746fbf..21c6746338a 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -769,6 +769,8 @@ void __init setup_arch(char **cmdline_p) | |||
769 | 769 | ||
770 | x86_init.oem.arch_setup(); | 770 | x86_init.oem.arch_setup(); |
771 | 771 | ||
772 | resource_alloc_from_bottom = 0; | ||
773 | iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1; | ||
772 | setup_memory_map(); | 774 | setup_memory_map(); |
773 | parse_setup_data(); | 775 | parse_setup_data(); |
774 | /* update the e820_saved too */ | 776 | /* update the e820_saved too */ |
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index cd6da6bf3ec..ceb2911aa43 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c | |||
@@ -6,10 +6,12 @@ | |||
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
7 | #include <linux/ioport.h> | 7 | #include <linux/ioport.h> |
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/pci.h> | ||
9 | 10 | ||
10 | #include <asm/bios_ebda.h> | 11 | #include <asm/bios_ebda.h> |
11 | #include <asm/paravirt.h> | 12 | #include <asm/paravirt.h> |
12 | #include <asm/pci_x86.h> | 13 | #include <asm/pci_x86.h> |
14 | #include <asm/pci.h> | ||
13 | #include <asm/mpspec.h> | 15 | #include <asm/mpspec.h> |
14 | #include <asm/setup.h> | 16 | #include <asm/setup.h> |
15 | #include <asm/apic.h> | 17 | #include <asm/apic.h> |
@@ -99,3 +101,8 @@ struct x86_platform_ops x86_platform = { | |||
99 | }; | 101 | }; |
100 | 102 | ||
101 | EXPORT_SYMBOL_GPL(x86_platform); | 103 | EXPORT_SYMBOL_GPL(x86_platform); |
104 | struct x86_msi_ops x86_msi = { | ||
105 | .setup_msi_irqs = native_setup_msi_irqs, | ||
106 | .teardown_msi_irq = native_teardown_msi_irq, | ||
107 | .teardown_msi_irqs = default_teardown_msi_irqs, | ||
108 | }; | ||
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 60f498511dd..7ffc9b727ef 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -178,11 +178,8 @@ static void * __init early_node_mem(int nodeid, unsigned long start, | |||
178 | 178 | ||
179 | /* extend the search scope */ | 179 | /* extend the search scope */ |
180 | end = max_pfn_mapped << PAGE_SHIFT; | 180 | end = max_pfn_mapped << PAGE_SHIFT; |
181 | if (end > (MAX_DMA32_PFN<<PAGE_SHIFT)) | 181 | start = MAX_DMA_PFN << PAGE_SHIFT; |
182 | start = MAX_DMA32_PFN<<PAGE_SHIFT; | 182 | mem = memblock_find_in_range(start, end, size, align); |
183 | else | ||
184 | start = MAX_DMA_PFN<<PAGE_SHIFT; | ||
185 | mem = memblock_x86_find_in_range_node(nodeid, start, end, size, align); | ||
186 | if (mem != MEMBLOCK_ERROR) | 183 | if (mem != MEMBLOCK_ERROR) |
187 | return __va(mem); | 184 | return __va(mem); |
188 | 185 | ||
diff --git a/arch/x86/pci/Makefile b/arch/x86/pci/Makefile index a0207a7fdf3..effd96e33f1 100644 --- a/arch/x86/pci/Makefile +++ b/arch/x86/pci/Makefile | |||
@@ -4,6 +4,7 @@ obj-$(CONFIG_PCI_BIOS) += pcbios.o | |||
4 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_$(BITS).o direct.o mmconfig-shared.o | 4 | obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_$(BITS).o direct.o mmconfig-shared.o |
5 | obj-$(CONFIG_PCI_DIRECT) += direct.o | 5 | obj-$(CONFIG_PCI_DIRECT) += direct.o |
6 | obj-$(CONFIG_PCI_OLPC) += olpc.o | 6 | obj-$(CONFIG_PCI_OLPC) += olpc.o |
7 | obj-$(CONFIG_PCI_XEN) += xen.o | ||
7 | 8 | ||
8 | obj-y += fixup.o | 9 | obj-y += fixup.o |
9 | obj-$(CONFIG_ACPI) += acpi.o | 10 | obj-$(CONFIG_ACPI) += acpi.o |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index a0772af64ef..f7c8a399978 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -421,16 +421,10 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum) | |||
421 | 421 | ||
422 | return bus; | 422 | return bus; |
423 | } | 423 | } |
424 | 424 | void __init pcibios_set_cache_line_size(void) | |
425 | int __init pcibios_init(void) | ||
426 | { | 425 | { |
427 | struct cpuinfo_x86 *c = &boot_cpu_data; | 426 | struct cpuinfo_x86 *c = &boot_cpu_data; |
428 | 427 | ||
429 | if (!raw_pci_ops) { | ||
430 | printk(KERN_WARNING "PCI: System does not support PCI\n"); | ||
431 | return 0; | ||
432 | } | ||
433 | |||
434 | /* | 428 | /* |
435 | * Set PCI cacheline size to that of the CPU if the CPU has reported it. | 429 | * Set PCI cacheline size to that of the CPU if the CPU has reported it. |
436 | * (For older CPUs that don't support cpuid, we se it to 32 bytes | 430 | * (For older CPUs that don't support cpuid, we se it to 32 bytes |
@@ -445,7 +439,16 @@ int __init pcibios_init(void) | |||
445 | pci_dfl_cache_line_size = 32 >> 2; | 439 | pci_dfl_cache_line_size = 32 >> 2; |
446 | printk(KERN_DEBUG "PCI: Unknown cacheline size. Setting to 32 bytes\n"); | 440 | printk(KERN_DEBUG "PCI: Unknown cacheline size. Setting to 32 bytes\n"); |
447 | } | 441 | } |
442 | } | ||
443 | |||
444 | int __init pcibios_init(void) | ||
445 | { | ||
446 | if (!raw_pci_ops) { | ||
447 | printk(KERN_WARNING "PCI: System does not support PCI\n"); | ||
448 | return 0; | ||
449 | } | ||
448 | 450 | ||
451 | pcibios_set_cache_line_size(); | ||
449 | pcibios_resource_survey(); | 452 | pcibios_resource_survey(); |
450 | 453 | ||
451 | if (pci_bf_sort >= pci_force_bf) | 454 | if (pci_bf_sort >= pci_force_bf) |
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 55253095be8..c4bb261c106 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
@@ -65,16 +65,21 @@ pcibios_align_resource(void *data, const struct resource *res, | |||
65 | resource_size_t size, resource_size_t align) | 65 | resource_size_t size, resource_size_t align) |
66 | { | 66 | { |
67 | struct pci_dev *dev = data; | 67 | struct pci_dev *dev = data; |
68 | resource_size_t start = res->start; | 68 | resource_size_t start = round_down(res->end - size + 1, align); |
69 | 69 | ||
70 | if (res->flags & IORESOURCE_IO) { | 70 | if (res->flags & IORESOURCE_IO) { |
71 | if (skip_isa_ioresource_align(dev)) | 71 | |
72 | return start; | 72 | /* |
73 | if (start & 0x300) | 73 | * If we're avoiding ISA aliases, the largest contiguous I/O |
74 | start = (start + 0x3ff) & ~0x3ff; | 74 | * port space is 256 bytes. Clearing bits 9 and 10 preserves |
75 | * all 256-byte and smaller alignments, so the result will | ||
76 | * still be correctly aligned. | ||
77 | */ | ||
78 | if (!skip_isa_ioresource_align(dev)) | ||
79 | start &= ~0x300; | ||
75 | } else if (res->flags & IORESOURCE_MEM) { | 80 | } else if (res->flags & IORESOURCE_MEM) { |
76 | if (start < BIOS_END) | 81 | if (start < BIOS_END) |
77 | start = BIOS_END; | 82 | start = res->end; /* fail; no space */ |
78 | } | 83 | } |
79 | return start; | 84 | return start; |
80 | } | 85 | } |
@@ -311,6 +316,8 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
311 | */ | 316 | */ |
312 | prot |= _PAGE_CACHE_UC_MINUS; | 317 | prot |= _PAGE_CACHE_UC_MINUS; |
313 | 318 | ||
319 | prot |= _PAGE_IOMAP; /* creating a mapping for IO */ | ||
320 | |||
314 | vma->vm_page_prot = __pgprot(prot); | 321 | vma->vm_page_prot = __pgprot(prot); |
315 | 322 | ||
316 | if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, | 323 | if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, |
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index f547ee05f71..9f9bfb705cf 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -584,27 +584,28 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route | |||
584 | case PCI_DEVICE_ID_INTEL_ICH9_3: | 584 | case PCI_DEVICE_ID_INTEL_ICH9_3: |
585 | case PCI_DEVICE_ID_INTEL_ICH9_4: | 585 | case PCI_DEVICE_ID_INTEL_ICH9_4: |
586 | case PCI_DEVICE_ID_INTEL_ICH9_5: | 586 | case PCI_DEVICE_ID_INTEL_ICH9_5: |
587 | case PCI_DEVICE_ID_INTEL_TOLAPAI_0: | 587 | case PCI_DEVICE_ID_INTEL_EP80579_0: |
588 | case PCI_DEVICE_ID_INTEL_ICH10_0: | 588 | case PCI_DEVICE_ID_INTEL_ICH10_0: |
589 | case PCI_DEVICE_ID_INTEL_ICH10_1: | 589 | case PCI_DEVICE_ID_INTEL_ICH10_1: |
590 | case PCI_DEVICE_ID_INTEL_ICH10_2: | 590 | case PCI_DEVICE_ID_INTEL_ICH10_2: |
591 | case PCI_DEVICE_ID_INTEL_ICH10_3: | 591 | case PCI_DEVICE_ID_INTEL_ICH10_3: |
592 | case PCI_DEVICE_ID_INTEL_PATSBURG_LPC: | ||
592 | r->name = "PIIX/ICH"; | 593 | r->name = "PIIX/ICH"; |
593 | r->get = pirq_piix_get; | 594 | r->get = pirq_piix_get; |
594 | r->set = pirq_piix_set; | 595 | r->set = pirq_piix_set; |
595 | return 1; | 596 | return 1; |
596 | } | 597 | } |
597 | 598 | ||
598 | if ((device >= PCI_DEVICE_ID_INTEL_PCH_LPC_MIN) && | 599 | if ((device >= PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN) && |
599 | (device <= PCI_DEVICE_ID_INTEL_PCH_LPC_MAX)) { | 600 | (device <= PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX)) { |
600 | r->name = "PIIX/ICH"; | 601 | r->name = "PIIX/ICH"; |
601 | r->get = pirq_piix_get; | 602 | r->get = pirq_piix_get; |
602 | r->set = pirq_piix_set; | 603 | r->set = pirq_piix_set; |
603 | return 1; | 604 | return 1; |
604 | } | 605 | } |
605 | 606 | ||
606 | if ((device >= PCI_DEVICE_ID_INTEL_CPT_LPC_MIN) && | 607 | if ((device >= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN) && |
607 | (device <= PCI_DEVICE_ID_INTEL_CPT_LPC_MAX)) { | 608 | (device <= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX)) { |
608 | r->name = "PIIX/ICH"; | 609 | r->name = "PIIX/ICH"; |
609 | r->get = pirq_piix_get; | 610 | r->get = pirq_piix_get; |
610 | r->set = pirq_piix_set; | 611 | r->set = pirq_piix_set; |
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index a918553ebc7..e282886616a 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c | |||
@@ -65,7 +65,6 @@ static __init struct pci_mmcfg_region *pci_mmconfig_add(int segment, int start, | |||
65 | int end, u64 addr) | 65 | int end, u64 addr) |
66 | { | 66 | { |
67 | struct pci_mmcfg_region *new; | 67 | struct pci_mmcfg_region *new; |
68 | int num_buses; | ||
69 | struct resource *res; | 68 | struct resource *res; |
70 | 69 | ||
71 | if (addr == 0) | 70 | if (addr == 0) |
@@ -82,10 +81,9 @@ static __init struct pci_mmcfg_region *pci_mmconfig_add(int segment, int start, | |||
82 | 81 | ||
83 | list_add_sorted(new); | 82 | list_add_sorted(new); |
84 | 83 | ||
85 | num_buses = end - start + 1; | ||
86 | res = &new->res; | 84 | res = &new->res; |
87 | res->start = addr + PCI_MMCFG_BUS_OFFSET(start); | 85 | res->start = addr + PCI_MMCFG_BUS_OFFSET(start); |
88 | res->end = addr + PCI_MMCFG_BUS_OFFSET(num_buses) - 1; | 86 | res->end = addr + PCI_MMCFG_BUS_OFFSET(end + 1) - 1; |
89 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; | 87 | res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; |
90 | snprintf(new->name, PCI_MMCFG_RESOURCE_NAME_LEN, | 88 | snprintf(new->name, PCI_MMCFG_RESOURCE_NAME_LEN, |
91 | "PCI MMCONFIG %04x [bus %02x-%02x]", segment, start, end); | 89 | "PCI MMCONFIG %04x [bus %02x-%02x]", segment, start, end); |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c new file mode 100644 index 00000000000..117f5b8daf7 --- /dev/null +++ b/arch/x86/pci/xen.c | |||
@@ -0,0 +1,414 @@ | |||
1 | /* | ||
2 | * Xen PCI Frontend Stub - puts some "dummy" functions in to the Linux | ||
3 | * x86 PCI core to support the Xen PCI Frontend | ||
4 | * | ||
5 | * Author: Ryan Wilson <hap9@epoch.ncsc.mil> | ||
6 | */ | ||
7 | #include <linux/module.h> | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/pci.h> | ||
10 | #include <linux/acpi.h> | ||
11 | |||
12 | #include <linux/io.h> | ||
13 | #include <asm/io_apic.h> | ||
14 | #include <asm/pci_x86.h> | ||
15 | |||
16 | #include <asm/xen/hypervisor.h> | ||
17 | |||
18 | #include <xen/features.h> | ||
19 | #include <xen/events.h> | ||
20 | #include <asm/xen/pci.h> | ||
21 | |||
22 | #ifdef CONFIG_ACPI | ||
23 | static int xen_hvm_register_pirq(u32 gsi, int triggering) | ||
24 | { | ||
25 | int rc, irq; | ||
26 | struct physdev_map_pirq map_irq; | ||
27 | int shareable = 0; | ||
28 | char *name; | ||
29 | |||
30 | if (!xen_hvm_domain()) | ||
31 | return -1; | ||
32 | |||
33 | map_irq.domid = DOMID_SELF; | ||
34 | map_irq.type = MAP_PIRQ_TYPE_GSI; | ||
35 | map_irq.index = gsi; | ||
36 | map_irq.pirq = -1; | ||
37 | |||
38 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq); | ||
39 | if (rc) { | ||
40 | printk(KERN_WARNING "xen map irq failed %d\n", rc); | ||
41 | return -1; | ||
42 | } | ||
43 | |||
44 | if (triggering == ACPI_EDGE_SENSITIVE) { | ||
45 | shareable = 0; | ||
46 | name = "ioapic-edge"; | ||
47 | } else { | ||
48 | shareable = 1; | ||
49 | name = "ioapic-level"; | ||
50 | } | ||
51 | |||
52 | irq = xen_map_pirq_gsi(map_irq.pirq, gsi, shareable, name); | ||
53 | |||
54 | printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq); | ||
55 | |||
56 | return irq; | ||
57 | } | ||
58 | |||
59 | static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi, | ||
60 | int trigger, int polarity) | ||
61 | { | ||
62 | return xen_hvm_register_pirq(gsi, trigger); | ||
63 | } | ||
64 | #endif | ||
65 | |||
66 | #if defined(CONFIG_PCI_MSI) | ||
67 | #include <linux/msi.h> | ||
68 | #include <asm/msidef.h> | ||
69 | |||
70 | struct xen_pci_frontend_ops *xen_pci_frontend; | ||
71 | EXPORT_SYMBOL_GPL(xen_pci_frontend); | ||
72 | |||
73 | static void xen_msi_compose_msg(struct pci_dev *pdev, unsigned int pirq, | ||
74 | struct msi_msg *msg) | ||
75 | { | ||
76 | /* We set vector == 0 to tell the hypervisor we don't care about it, | ||
77 | * but we want a pirq setup instead. | ||
78 | * We use the dest_id field to pass the pirq that we want. */ | ||
79 | msg->address_hi = MSI_ADDR_BASE_HI | MSI_ADDR_EXT_DEST_ID(pirq); | ||
80 | msg->address_lo = | ||
81 | MSI_ADDR_BASE_LO | | ||
82 | MSI_ADDR_DEST_MODE_PHYSICAL | | ||
83 | MSI_ADDR_REDIRECTION_CPU | | ||
84 | MSI_ADDR_DEST_ID(pirq); | ||
85 | |||
86 | msg->data = | ||
87 | MSI_DATA_TRIGGER_EDGE | | ||
88 | MSI_DATA_LEVEL_ASSERT | | ||
89 | /* delivery mode reserved */ | ||
90 | (3 << 8) | | ||
91 | MSI_DATA_VECTOR(0); | ||
92 | } | ||
93 | |||
94 | static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | ||
95 | { | ||
96 | int irq, pirq, ret = 0; | ||
97 | struct msi_desc *msidesc; | ||
98 | struct msi_msg msg; | ||
99 | |||
100 | list_for_each_entry(msidesc, &dev->msi_list, list) { | ||
101 | xen_allocate_pirq_msi((type == PCI_CAP_ID_MSIX) ? | ||
102 | "msi-x" : "msi", &irq, &pirq); | ||
103 | if (irq < 0 || pirq < 0) | ||
104 | goto error; | ||
105 | printk(KERN_DEBUG "xen: msi --> irq=%d, pirq=%d\n", irq, pirq); | ||
106 | xen_msi_compose_msg(dev, pirq, &msg); | ||
107 | ret = set_irq_msi(irq, msidesc); | ||
108 | if (ret < 0) | ||
109 | goto error_while; | ||
110 | write_msi_msg(irq, &msg); | ||
111 | } | ||
112 | return 0; | ||
113 | |||
114 | error_while: | ||
115 | unbind_from_irqhandler(irq, NULL); | ||
116 | error: | ||
117 | if (ret == -ENODEV) | ||
118 | dev_err(&dev->dev, "Xen PCI frontend has not registered" \ | ||
119 | " MSI/MSI-X support!\n"); | ||
120 | |||
121 | return ret; | ||
122 | } | ||
123 | |||
124 | /* | ||
125 | * For MSI interrupts we have to use drivers/xen/event.s functions to | ||
126 | * allocate an irq_desc and setup the right */ | ||
127 | |||
128 | |||
129 | static int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | ||
130 | { | ||
131 | int irq, ret, i; | ||
132 | struct msi_desc *msidesc; | ||
133 | int *v; | ||
134 | |||
135 | v = kzalloc(sizeof(int) * max(1, nvec), GFP_KERNEL); | ||
136 | if (!v) | ||
137 | return -ENOMEM; | ||
138 | |||
139 | if (type == PCI_CAP_ID_MSIX) | ||
140 | ret = xen_pci_frontend_enable_msix(dev, &v, nvec); | ||
141 | else | ||
142 | ret = xen_pci_frontend_enable_msi(dev, &v); | ||
143 | if (ret) | ||
144 | goto error; | ||
145 | i = 0; | ||
146 | list_for_each_entry(msidesc, &dev->msi_list, list) { | ||
147 | irq = xen_allocate_pirq(v[i], 0, /* not sharable */ | ||
148 | (type == PCI_CAP_ID_MSIX) ? | ||
149 | "pcifront-msi-x" : "pcifront-msi"); | ||
150 | if (irq < 0) | ||
151 | return -1; | ||
152 | |||
153 | ret = set_irq_msi(irq, msidesc); | ||
154 | if (ret) | ||
155 | goto error_while; | ||
156 | i++; | ||
157 | } | ||
158 | kfree(v); | ||
159 | return 0; | ||
160 | |||
161 | error_while: | ||
162 | unbind_from_irqhandler(irq, NULL); | ||
163 | error: | ||
164 | if (ret == -ENODEV) | ||
165 | dev_err(&dev->dev, "Xen PCI frontend has not registered" \ | ||
166 | " MSI/MSI-X support!\n"); | ||
167 | |||
168 | kfree(v); | ||
169 | return ret; | ||
170 | } | ||
171 | |||
172 | static void xen_teardown_msi_irqs(struct pci_dev *dev) | ||
173 | { | ||
174 | struct msi_desc *msidesc; | ||
175 | |||
176 | msidesc = list_entry(dev->msi_list.next, struct msi_desc, list); | ||
177 | if (msidesc->msi_attrib.is_msix) | ||
178 | xen_pci_frontend_disable_msix(dev); | ||
179 | else | ||
180 | xen_pci_frontend_disable_msi(dev); | ||
181 | } | ||
182 | |||
183 | static void xen_teardown_msi_irq(unsigned int irq) | ||
184 | { | ||
185 | xen_destroy_irq(irq); | ||
186 | } | ||
187 | |||
188 | static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | ||
189 | { | ||
190 | int irq, ret; | ||
191 | struct msi_desc *msidesc; | ||
192 | |||
193 | list_for_each_entry(msidesc, &dev->msi_list, list) { | ||
194 | irq = xen_create_msi_irq(dev, msidesc, type); | ||
195 | if (irq < 0) | ||
196 | return -1; | ||
197 | |||
198 | ret = set_irq_msi(irq, msidesc); | ||
199 | if (ret) | ||
200 | goto error; | ||
201 | } | ||
202 | return 0; | ||
203 | |||
204 | error: | ||
205 | xen_destroy_irq(irq); | ||
206 | return ret; | ||
207 | } | ||
208 | #endif | ||
209 | |||
210 | static int xen_pcifront_enable_irq(struct pci_dev *dev) | ||
211 | { | ||
212 | int rc; | ||
213 | int share = 1; | ||
214 | |||
215 | dev_info(&dev->dev, "Xen PCI enabling IRQ: %d\n", dev->irq); | ||
216 | |||
217 | if (dev->irq < 0) | ||
218 | return -EINVAL; | ||
219 | |||
220 | if (dev->irq < NR_IRQS_LEGACY) | ||
221 | share = 0; | ||
222 | |||
223 | rc = xen_allocate_pirq(dev->irq, share, "pcifront"); | ||
224 | if (rc < 0) { | ||
225 | dev_warn(&dev->dev, "Xen PCI IRQ: %d, failed to register:%d\n", | ||
226 | dev->irq, rc); | ||
227 | return rc; | ||
228 | } | ||
229 | return 0; | ||
230 | } | ||
231 | |||
232 | int __init pci_xen_init(void) | ||
233 | { | ||
234 | if (!xen_pv_domain() || xen_initial_domain()) | ||
235 | return -ENODEV; | ||
236 | |||
237 | printk(KERN_INFO "PCI: setting up Xen PCI frontend stub\n"); | ||
238 | |||
239 | pcibios_set_cache_line_size(); | ||
240 | |||
241 | pcibios_enable_irq = xen_pcifront_enable_irq; | ||
242 | pcibios_disable_irq = NULL; | ||
243 | |||
244 | #ifdef CONFIG_ACPI | ||
245 | /* Keep ACPI out of the picture */ | ||
246 | acpi_noirq = 1; | ||
247 | #endif | ||
248 | |||
249 | #ifdef CONFIG_PCI_MSI | ||
250 | x86_msi.setup_msi_irqs = xen_setup_msi_irqs; | ||
251 | x86_msi.teardown_msi_irq = xen_teardown_msi_irq; | ||
252 | x86_msi.teardown_msi_irqs = xen_teardown_msi_irqs; | ||
253 | #endif | ||
254 | return 0; | ||
255 | } | ||
256 | |||
257 | int __init pci_xen_hvm_init(void) | ||
258 | { | ||
259 | if (!xen_feature(XENFEAT_hvm_pirqs)) | ||
260 | return 0; | ||
261 | |||
262 | #ifdef CONFIG_ACPI | ||
263 | /* | ||
264 | * We don't want to change the actual ACPI delivery model, | ||
265 | * just how GSIs get registered. | ||
266 | */ | ||
267 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; | ||
268 | #endif | ||
269 | |||
270 | #ifdef CONFIG_PCI_MSI | ||
271 | x86_msi.setup_msi_irqs = xen_hvm_setup_msi_irqs; | ||
272 | x86_msi.teardown_msi_irq = xen_teardown_msi_irq; | ||
273 | #endif | ||
274 | return 0; | ||
275 | } | ||
276 | |||
277 | #ifdef CONFIG_XEN_DOM0 | ||
278 | static int xen_register_pirq(u32 gsi, int triggering) | ||
279 | { | ||
280 | int rc, irq; | ||
281 | struct physdev_map_pirq map_irq; | ||
282 | int shareable = 0; | ||
283 | char *name; | ||
284 | |||
285 | if (!xen_pv_domain()) | ||
286 | return -1; | ||
287 | |||
288 | if (triggering == ACPI_EDGE_SENSITIVE) { | ||
289 | shareable = 0; | ||
290 | name = "ioapic-edge"; | ||
291 | } else { | ||
292 | shareable = 1; | ||
293 | name = "ioapic-level"; | ||
294 | } | ||
295 | |||
296 | irq = xen_allocate_pirq(gsi, shareable, name); | ||
297 | |||
298 | printk(KERN_DEBUG "xen: --> irq=%d\n", irq); | ||
299 | |||
300 | if (irq < 0) | ||
301 | goto out; | ||
302 | |||
303 | map_irq.domid = DOMID_SELF; | ||
304 | map_irq.type = MAP_PIRQ_TYPE_GSI; | ||
305 | map_irq.index = gsi; | ||
306 | map_irq.pirq = irq; | ||
307 | |||
308 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq); | ||
309 | if (rc) { | ||
310 | printk(KERN_WARNING "xen map irq failed %d\n", rc); | ||
311 | return -1; | ||
312 | } | ||
313 | |||
314 | out: | ||
315 | return irq; | ||
316 | } | ||
317 | |||
318 | static int xen_register_gsi(u32 gsi, int triggering, int polarity) | ||
319 | { | ||
320 | int rc, irq; | ||
321 | struct physdev_setup_gsi setup_gsi; | ||
322 | |||
323 | if (!xen_pv_domain()) | ||
324 | return -1; | ||
325 | |||
326 | printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n", | ||
327 | gsi, triggering, polarity); | ||
328 | |||
329 | irq = xen_register_pirq(gsi, triggering); | ||
330 | |||
331 | setup_gsi.gsi = gsi; | ||
332 | setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); | ||
333 | setup_gsi.polarity = (polarity == ACPI_ACTIVE_HIGH ? 0 : 1); | ||
334 | |||
335 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_setup_gsi, &setup_gsi); | ||
336 | if (rc == -EEXIST) | ||
337 | printk(KERN_INFO "Already setup the GSI :%d\n", gsi); | ||
338 | else if (rc) { | ||
339 | printk(KERN_ERR "Failed to setup GSI :%d, err_code:%d\n", | ||
340 | gsi, rc); | ||
341 | } | ||
342 | |||
343 | return irq; | ||
344 | } | ||
345 | |||
346 | static __init void xen_setup_acpi_sci(void) | ||
347 | { | ||
348 | int rc; | ||
349 | int trigger, polarity; | ||
350 | int gsi = acpi_sci_override_gsi; | ||
351 | |||
352 | if (!gsi) | ||
353 | return; | ||
354 | |||
355 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); | ||
356 | if (rc) { | ||
357 | printk(KERN_WARNING "xen: acpi_get_override_irq failed for acpi" | ||
358 | " sci, rc=%d\n", rc); | ||
359 | return; | ||
360 | } | ||
361 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; | ||
362 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; | ||
363 | |||
364 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " | ||
365 | "polarity=%d\n", gsi, trigger, polarity); | ||
366 | |||
367 | gsi = xen_register_gsi(gsi, trigger, polarity); | ||
368 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); | ||
369 | |||
370 | return; | ||
371 | } | ||
372 | |||
373 | static int acpi_register_gsi_xen(struct device *dev, u32 gsi, | ||
374 | int trigger, int polarity) | ||
375 | { | ||
376 | return xen_register_gsi(gsi, trigger, polarity); | ||
377 | } | ||
378 | |||
379 | static int __init pci_xen_initial_domain(void) | ||
380 | { | ||
381 | #ifdef CONFIG_PCI_MSI | ||
382 | x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs; | ||
383 | x86_msi.teardown_msi_irq = xen_teardown_msi_irq; | ||
384 | #endif | ||
385 | xen_setup_acpi_sci(); | ||
386 | __acpi_register_gsi = acpi_register_gsi_xen; | ||
387 | |||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | void __init xen_setup_pirqs(void) | ||
392 | { | ||
393 | int irq; | ||
394 | |||
395 | pci_xen_initial_domain(); | ||
396 | |||
397 | if (0 == nr_ioapics) { | ||
398 | for (irq = 0; irq < NR_IRQS_LEGACY; irq++) | ||
399 | xen_allocate_pirq(irq, 0, "xt-pic"); | ||
400 | return; | ||
401 | } | ||
402 | |||
403 | /* Pre-allocate legacy irqs */ | ||
404 | for (irq = 0; irq < NR_IRQS_LEGACY; irq++) { | ||
405 | int trigger, polarity; | ||
406 | |||
407 | if (acpi_get_override_irq(irq, &trigger, &polarity) == -1) | ||
408 | continue; | ||
409 | |||
410 | xen_register_pirq(irq, | ||
411 | trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE); | ||
412 | } | ||
413 | } | ||
414 | #endif | ||
diff --git a/arch/x86/platform/Makefile b/arch/x86/platform/Makefile new file mode 100644 index 00000000000..7bf70b812fa --- /dev/null +++ b/arch/x86/platform/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # Platform specific code goes here | ||
2 | obj-y += efi/ | ||
3 | obj-y += mrst/ | ||
4 | obj-y += olpc/ | ||
5 | obj-y += scx200/ | ||
6 | obj-y += sfi/ | ||
7 | obj-y += visws/ | ||
8 | obj-y += uv/ | ||
diff --git a/arch/x86/platform/efi/Makefile b/arch/x86/platform/efi/Makefile new file mode 100644 index 00000000000..73b8be0f367 --- /dev/null +++ b/arch/x86/platform/efi/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_EFI) += efi.o efi_$(BITS).o efi_stub_$(BITS).o | |||
diff --git a/arch/x86/kernel/efi.c b/arch/x86/platform/efi/efi.c index 0fe27d7c625..0fe27d7c625 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
diff --git a/arch/x86/kernel/efi_32.c b/arch/x86/platform/efi/efi_32.c index 5cab48ee61a..5cab48ee61a 100644 --- a/arch/x86/kernel/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c | |||
diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/platform/efi/efi_64.c index ac0621a7ac3..ac0621a7ac3 100644 --- a/arch/x86/kernel/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
diff --git a/arch/x86/kernel/efi_stub_32.S b/arch/x86/platform/efi/efi_stub_32.S index fbe66e626c0..fbe66e626c0 100644 --- a/arch/x86/kernel/efi_stub_32.S +++ b/arch/x86/platform/efi/efi_stub_32.S | |||
diff --git a/arch/x86/kernel/efi_stub_64.S b/arch/x86/platform/efi/efi_stub_64.S index 4c07ccab814..4c07ccab814 100644 --- a/arch/x86/kernel/efi_stub_64.S +++ b/arch/x86/platform/efi/efi_stub_64.S | |||
diff --git a/arch/x86/platform/mrst/Makefile b/arch/x86/platform/mrst/Makefile new file mode 100644 index 00000000000..efbbc552fa9 --- /dev/null +++ b/arch/x86/platform/mrst/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_X86_MRST) += mrst.o | |||
diff --git a/arch/x86/kernel/mrst.c b/arch/x86/platform/mrst/mrst.c index 79ae68154e8..79ae68154e8 100644 --- a/arch/x86/kernel/mrst.c +++ b/arch/x86/platform/mrst/mrst.c | |||
diff --git a/arch/x86/platform/olpc/Makefile b/arch/x86/platform/olpc/Makefile new file mode 100644 index 00000000000..c31b8fcb5a8 --- /dev/null +++ b/arch/x86/platform/olpc/Makefile | |||
@@ -0,0 +1,3 @@ | |||
1 | obj-$(CONFIG_OLPC) += olpc.o | ||
2 | obj-$(CONFIG_OLPC_XO1) += olpc-xo1.o | ||
3 | obj-$(CONFIG_OLPC_OPENFIRMWARE) += olpc_ofw.o | ||
diff --git a/arch/x86/kernel/olpc-xo1.c b/arch/x86/platform/olpc/olpc-xo1.c index f5442c03abc..f5442c03abc 100644 --- a/arch/x86/kernel/olpc-xo1.c +++ b/arch/x86/platform/olpc/olpc-xo1.c | |||
diff --git a/arch/x86/kernel/olpc.c b/arch/x86/platform/olpc/olpc.c index edaf3fe8dc5..edaf3fe8dc5 100644 --- a/arch/x86/kernel/olpc.c +++ b/arch/x86/platform/olpc/olpc.c | |||
diff --git a/arch/x86/kernel/olpc_ofw.c b/arch/x86/platform/olpc/olpc_ofw.c index 78732046437..78732046437 100644 --- a/arch/x86/kernel/olpc_ofw.c +++ b/arch/x86/platform/olpc/olpc_ofw.c | |||
diff --git a/arch/x86/platform/scx200/Makefile b/arch/x86/platform/scx200/Makefile new file mode 100644 index 00000000000..762b4c7f431 --- /dev/null +++ b/arch/x86/platform/scx200/Makefile | |||
@@ -0,0 +1,2 @@ | |||
1 | obj-$(CONFIG_SCx200) += scx200.o | ||
2 | scx200-y += scx200_32.o | ||
diff --git a/arch/x86/kernel/scx200_32.c b/arch/x86/platform/scx200/scx200_32.c index 7e004acbe52..7e004acbe52 100644 --- a/arch/x86/kernel/scx200_32.c +++ b/arch/x86/platform/scx200/scx200_32.c | |||
diff --git a/arch/x86/platform/sfi/Makefile b/arch/x86/platform/sfi/Makefile new file mode 100644 index 00000000000..cc5db1168a5 --- /dev/null +++ b/arch/x86/platform/sfi/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_SFI) += sfi.o | |||
diff --git a/arch/x86/kernel/sfi.c b/arch/x86/platform/sfi/sfi.c index dd4c281ffe5..dd4c281ffe5 100644 --- a/arch/x86/kernel/sfi.c +++ b/arch/x86/platform/sfi/sfi.c | |||
diff --git a/arch/x86/platform/uv/Makefile b/arch/x86/platform/uv/Makefile new file mode 100644 index 00000000000..6c40995fefb --- /dev/null +++ b/arch/x86/platform/uv/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_X86_UV) += tlb_uv.o bios_uv.o uv_irq.o uv_sysfs.o uv_time.o | |||
diff --git a/arch/x86/kernel/bios_uv.c b/arch/x86/platform/uv/bios_uv.c index 8bc57baaa9a..8bc57baaa9a 100644 --- a/arch/x86/kernel/bios_uv.c +++ b/arch/x86/platform/uv/bios_uv.c | |||
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index 20ea20a39e2..20ea20a39e2 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c | |||
diff --git a/arch/x86/kernel/uv_irq.c b/arch/x86/platform/uv/uv_irq.c index 7b24460917d..7b24460917d 100644 --- a/arch/x86/kernel/uv_irq.c +++ b/arch/x86/platform/uv/uv_irq.c | |||
diff --git a/arch/x86/kernel/uv_sysfs.c b/arch/x86/platform/uv/uv_sysfs.c index 309c70fb775..309c70fb775 100644 --- a/arch/x86/kernel/uv_sysfs.c +++ b/arch/x86/platform/uv/uv_sysfs.c | |||
diff --git a/arch/x86/kernel/uv_time.c b/arch/x86/platform/uv/uv_time.c index 56e421bc379..56e421bc379 100644 --- a/arch/x86/kernel/uv_time.c +++ b/arch/x86/platform/uv/uv_time.c | |||
diff --git a/arch/x86/platform/visws/Makefile b/arch/x86/platform/visws/Makefile new file mode 100644 index 00000000000..91bc17ab2fd --- /dev/null +++ b/arch/x86/platform/visws/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_X86_VISWS) += visws_quirks.o | |||
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/platform/visws/visws_quirks.c index 3371bd053b8..3371bd053b8 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/platform/visws/visws_quirks.c | |||
diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index 90a7f5ad691..5b54892e4bc 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig | |||
@@ -13,6 +13,16 @@ config XEN | |||
13 | kernel to boot in a paravirtualized environment under the | 13 | kernel to boot in a paravirtualized environment under the |
14 | Xen hypervisor. | 14 | Xen hypervisor. |
15 | 15 | ||
16 | config XEN_DOM0 | ||
17 | def_bool y | ||
18 | depends on XEN && PCI_XEN && SWIOTLB_XEN | ||
19 | depends on X86_LOCAL_APIC && X86_IO_APIC && ACPI && PCI | ||
20 | |||
21 | # Dummy symbol since people have come to rely on the PRIVILEGED_GUEST | ||
22 | # name in tools. | ||
23 | config XEN_PRIVILEGED_GUEST | ||
24 | def_bool XEN_DOM0 | ||
25 | |||
16 | config XEN_PVHVM | 26 | config XEN_PVHVM |
17 | def_bool y | 27 | def_bool y |
18 | depends on XEN | 28 | depends on XEN |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 70ddeaeb1ef..235c0f4d386 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <asm/paravirt.h> | 46 | #include <asm/paravirt.h> |
47 | #include <asm/apic.h> | 47 | #include <asm/apic.h> |
48 | #include <asm/page.h> | 48 | #include <asm/page.h> |
49 | #include <asm/xen/pci.h> | ||
49 | #include <asm/xen/hypercall.h> | 50 | #include <asm/xen/hypercall.h> |
50 | #include <asm/xen/hypervisor.h> | 51 | #include <asm/xen/hypervisor.h> |
51 | #include <asm/fixmap.h> | 52 | #include <asm/fixmap.h> |
@@ -236,6 +237,7 @@ static __init void xen_init_cpuid_mask(void) | |||
236 | cpuid_leaf1_edx_mask = | 237 | cpuid_leaf1_edx_mask = |
237 | ~((1 << X86_FEATURE_MCE) | /* disable MCE */ | 238 | ~((1 << X86_FEATURE_MCE) | /* disable MCE */ |
238 | (1 << X86_FEATURE_MCA) | /* disable MCA */ | 239 | (1 << X86_FEATURE_MCA) | /* disable MCA */ |
240 | (1 << X86_FEATURE_MTRR) | /* disable MTRR */ | ||
239 | (1 << X86_FEATURE_ACC)); /* thermal monitoring */ | 241 | (1 << X86_FEATURE_ACC)); /* thermal monitoring */ |
240 | 242 | ||
241 | if (!xen_initial_domain()) | 243 | if (!xen_initial_domain()) |
@@ -1184,6 +1186,7 @@ asmlinkage void __init xen_start_kernel(void) | |||
1184 | 1186 | ||
1185 | xen_raw_console_write("mapping kernel into physical memory\n"); | 1187 | xen_raw_console_write("mapping kernel into physical memory\n"); |
1186 | pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); | 1188 | pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); |
1189 | xen_ident_map_ISA(); | ||
1187 | 1190 | ||
1188 | /* Allocate and initialize top and mid mfn levels for p2m structure */ | 1191 | /* Allocate and initialize top and mid mfn levels for p2m structure */ |
1189 | xen_build_mfn_list_list(); | 1192 | xen_build_mfn_list_list(); |
@@ -1222,6 +1225,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
1222 | add_preferred_console("xenboot", 0, NULL); | 1225 | add_preferred_console("xenboot", 0, NULL); |
1223 | add_preferred_console("tty", 0, NULL); | 1226 | add_preferred_console("tty", 0, NULL); |
1224 | add_preferred_console("hvc", 0, NULL); | 1227 | add_preferred_console("hvc", 0, NULL); |
1228 | if (pci_xen) | ||
1229 | x86_init.pci.arch_init = pci_xen_init; | ||
1225 | } else { | 1230 | } else { |
1226 | /* Make sure ACS will be enabled */ | 1231 | /* Make sure ACS will be enabled */ |
1227 | pci_request_acs(); | 1232 | pci_request_acs(); |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 9631c90907e..c237b810b03 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -1975,6 +1975,7 @@ static void *m2v(phys_addr_t maddr) | |||
1975 | return __ka(m2p(maddr)); | 1975 | return __ka(m2p(maddr)); |
1976 | } | 1976 | } |
1977 | 1977 | ||
1978 | /* Set the page permissions on an identity-mapped pages */ | ||
1978 | static void set_page_prot(void *addr, pgprot_t prot) | 1979 | static void set_page_prot(void *addr, pgprot_t prot) |
1979 | { | 1980 | { |
1980 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; | 1981 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; |
@@ -2159,6 +2160,8 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | |||
2159 | } | 2160 | } |
2160 | #endif /* CONFIG_X86_64 */ | 2161 | #endif /* CONFIG_X86_64 */ |
2161 | 2162 | ||
2163 | static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss; | ||
2164 | |||
2162 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | 2165 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) |
2163 | { | 2166 | { |
2164 | pte_t pte; | 2167 | pte_t pte; |
@@ -2179,15 +2182,28 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
2179 | #else | 2182 | #else |
2180 | case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE: | 2183 | case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE: |
2181 | #endif | 2184 | #endif |
2182 | #ifdef CONFIG_X86_LOCAL_APIC | ||
2183 | case FIX_APIC_BASE: /* maps dummy local APIC */ | ||
2184 | #endif | ||
2185 | case FIX_TEXT_POKE0: | 2185 | case FIX_TEXT_POKE0: |
2186 | case FIX_TEXT_POKE1: | 2186 | case FIX_TEXT_POKE1: |
2187 | /* All local page mappings */ | 2187 | /* All local page mappings */ |
2188 | pte = pfn_pte(phys, prot); | 2188 | pte = pfn_pte(phys, prot); |
2189 | break; | 2189 | break; |
2190 | 2190 | ||
2191 | #ifdef CONFIG_X86_LOCAL_APIC | ||
2192 | case FIX_APIC_BASE: /* maps dummy local APIC */ | ||
2193 | pte = pfn_pte(PFN_DOWN(__pa(dummy_mapping)), PAGE_KERNEL); | ||
2194 | break; | ||
2195 | #endif | ||
2196 | |||
2197 | #ifdef CONFIG_X86_IO_APIC | ||
2198 | case FIX_IO_APIC_BASE_0 ... FIX_IO_APIC_BASE_END: | ||
2199 | /* | ||
2200 | * We just don't map the IO APIC - all access is via | ||
2201 | * hypercalls. Keep the address in the pte for reference. | ||
2202 | */ | ||
2203 | pte = pfn_pte(PFN_DOWN(__pa(dummy_mapping)), PAGE_KERNEL); | ||
2204 | break; | ||
2205 | #endif | ||
2206 | |||
2191 | case FIX_PARAVIRT_BOOTMAP: | 2207 | case FIX_PARAVIRT_BOOTMAP: |
2192 | /* This is an MFN, but it isn't an IO mapping from the | 2208 | /* This is an MFN, but it isn't an IO mapping from the |
2193 | IO domain */ | 2209 | IO domain */ |
@@ -2212,6 +2228,29 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
2212 | #endif | 2228 | #endif |
2213 | } | 2229 | } |
2214 | 2230 | ||
2231 | __init void xen_ident_map_ISA(void) | ||
2232 | { | ||
2233 | unsigned long pa; | ||
2234 | |||
2235 | /* | ||
2236 | * If we're dom0, then linear map the ISA machine addresses into | ||
2237 | * the kernel's address space. | ||
2238 | */ | ||
2239 | if (!xen_initial_domain()) | ||
2240 | return; | ||
2241 | |||
2242 | xen_raw_printk("Xen: setup ISA identity maps\n"); | ||
2243 | |||
2244 | for (pa = ISA_START_ADDRESS; pa < ISA_END_ADDRESS; pa += PAGE_SIZE) { | ||
2245 | pte_t pte = mfn_pte(PFN_DOWN(pa), PAGE_KERNEL_IO); | ||
2246 | |||
2247 | if (HYPERVISOR_update_va_mapping(PAGE_OFFSET + pa, pte, 0)) | ||
2248 | BUG(); | ||
2249 | } | ||
2250 | |||
2251 | xen_flush_tlb(); | ||
2252 | } | ||
2253 | |||
2215 | static __init void xen_post_allocator_init(void) | 2254 | static __init void xen_post_allocator_init(void) |
2216 | { | 2255 | { |
2217 | pv_mmu_ops.set_pte = xen_set_pte; | 2256 | pv_mmu_ops.set_pte = xen_set_pte; |
@@ -2320,6 +2359,8 @@ void __init xen_init_mmu_ops(void) | |||
2320 | pv_mmu_ops = xen_mmu_ops; | 2359 | pv_mmu_ops = xen_mmu_ops; |
2321 | 2360 | ||
2322 | vmap_lazy_unmap = false; | 2361 | vmap_lazy_unmap = false; |
2362 | |||
2363 | memset(dummy_mapping, 0xff, PAGE_SIZE); | ||
2323 | } | 2364 | } |
2324 | 2365 | ||
2325 | /* Protected by xen_reservation_lock. */ | 2366 | /* Protected by xen_reservation_lock. */ |
diff --git a/arch/x86/xen/pci-swiotlb-xen.c b/arch/x86/xen/pci-swiotlb-xen.c index 22471001b74..bfd0632fe65 100644 --- a/arch/x86/xen/pci-swiotlb-xen.c +++ b/arch/x86/xen/pci-swiotlb-xen.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* Glue code to lib/swiotlb-xen.c */ | 1 | /* Glue code to lib/swiotlb-xen.c */ |
2 | 2 | ||
3 | #include <linux/dma-mapping.h> | 3 | #include <linux/dma-mapping.h> |
4 | #include <linux/pci.h> | ||
4 | #include <xen/swiotlb-xen.h> | 5 | #include <xen/swiotlb-xen.h> |
5 | 6 | ||
6 | #include <asm/xen/hypervisor.h> | 7 | #include <asm/xen/hypervisor.h> |
@@ -55,6 +56,9 @@ void __init pci_xen_swiotlb_init(void) | |||
55 | if (xen_swiotlb) { | 56 | if (xen_swiotlb) { |
56 | xen_swiotlb_init(1); | 57 | xen_swiotlb_init(1); |
57 | dma_ops = &xen_swiotlb_dma_ops; | 58 | dma_ops = &xen_swiotlb_dma_ops; |
59 | |||
60 | /* Make sure ACS will be enabled */ | ||
61 | pci_request_acs(); | ||
58 | } | 62 | } |
59 | } | 63 | } |
60 | IOMMU_INIT_FINISH(pci_xen_swiotlb_detect, | 64 | IOMMU_INIT_FINISH(pci_xen_swiotlb_detect, |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 105db250105..b1dbdaa23ec 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -204,6 +204,9 @@ char * __init xen_memory_setup(void) | |||
204 | * Even though this is normal, usable memory under Xen, reserve | 204 | * Even though this is normal, usable memory under Xen, reserve |
205 | * ISA memory anyway because too many things think they can poke | 205 | * ISA memory anyway because too many things think they can poke |
206 | * about in there. | 206 | * about in there. |
207 | * | ||
208 | * In a dom0 kernel, this region is identity mapped with the | ||
209 | * hardware ISA area, so it really is out of bounds. | ||
207 | */ | 210 | */ |
208 | e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, | 211 | e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, |
209 | E820_RESERVED); | 212 | E820_RESERVED); |
@@ -367,7 +370,5 @@ void __init xen_arch_setup(void) | |||
367 | 370 | ||
368 | pm_idle = xen_idle; | 371 | pm_idle = xen_idle; |
369 | 372 | ||
370 | paravirt_disable_iospace(); | ||
371 | |||
372 | fiddle_vdso(); | 373 | fiddle_vdso(); |
373 | } | 374 | } |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index f4d01003146..72a4c795904 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/xen/interface.h> | 28 | #include <asm/xen/interface.h> |
29 | #include <asm/xen/hypercall.h> | 29 | #include <asm/xen/hypercall.h> |
30 | 30 | ||
31 | #include <xen/xen.h> | ||
31 | #include <xen/page.h> | 32 | #include <xen/page.h> |
32 | #include <xen/events.h> | 33 | #include <xen/events.h> |
33 | 34 | ||
@@ -156,11 +157,35 @@ static void __init xen_fill_possible_map(void) | |||
156 | { | 157 | { |
157 | int i, rc; | 158 | int i, rc; |
158 | 159 | ||
160 | if (xen_initial_domain()) | ||
161 | return; | ||
162 | |||
163 | for (i = 0; i < nr_cpu_ids; i++) { | ||
164 | rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL); | ||
165 | if (rc >= 0) { | ||
166 | num_processors++; | ||
167 | set_cpu_possible(i, true); | ||
168 | } | ||
169 | } | ||
170 | } | ||
171 | |||
172 | static void __init xen_filter_cpu_maps(void) | ||
173 | { | ||
174 | int i, rc; | ||
175 | |||
176 | if (!xen_initial_domain()) | ||
177 | return; | ||
178 | |||
179 | num_processors = 0; | ||
180 | disabled_cpus = 0; | ||
159 | for (i = 0; i < nr_cpu_ids; i++) { | 181 | for (i = 0; i < nr_cpu_ids; i++) { |
160 | rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL); | 182 | rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL); |
161 | if (rc >= 0) { | 183 | if (rc >= 0) { |
162 | num_processors++; | 184 | num_processors++; |
163 | set_cpu_possible(i, true); | 185 | set_cpu_possible(i, true); |
186 | } else { | ||
187 | set_cpu_possible(i, false); | ||
188 | set_cpu_present(i, false); | ||
164 | } | 189 | } |
165 | } | 190 | } |
166 | } | 191 | } |
@@ -174,6 +199,7 @@ static void __init xen_smp_prepare_boot_cpu(void) | |||
174 | old memory can be recycled */ | 199 | old memory can be recycled */ |
175 | make_lowmem_page_readwrite(xen_initial_gdt); | 200 | make_lowmem_page_readwrite(xen_initial_gdt); |
176 | 201 | ||
202 | xen_filter_cpu_maps(); | ||
177 | xen_setup_vcpu_info_placement(); | 203 | xen_setup_vcpu_info_placement(); |
178 | } | 204 | } |
179 | 205 | ||