Commit aa7d8e25 authored by Ravikiran G Thirumalai's avatar Ravikiran G Thirumalai Committed by Ingo Molnar

x86: fix build breakage when PCI is define and PARAVIRT is not

- Fix the the build breakage when PARAVIRT is defined
  but PCI is not
  This fixes problem reported at:
	http://marc.info/?l=linux-kernel&m=120525966600698&w=2
- Make is_vsmp_box() available even when PARAVIRT is not defined.
  This is needed to determine if tsc's are reliable as a time source
  even when PARAVIRT is not defined.
- split vsmp_init to use is_vsmp_box() and set_vsmp_pv_ops()
  set_vsmp_pv_ops will do nothing if PCI is not enabled in the config.
Signed-off-by: default avatarRavikiran Thirumalai <kiran@scalex86.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 3250c91a
...@@ -60,7 +60,7 @@ obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o ...@@ -60,7 +60,7 @@ obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o
obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o
obj-$(CONFIG_X86_NUMAQ) += numaq_32.o obj-$(CONFIG_X86_NUMAQ) += numaq_32.o
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit_32.o obj-$(CONFIG_X86_SUMMIT_NUMA) += summit_32.o
obj-$(CONFIG_PARAVIRT) += vsmp_64.o obj-y += vsmp_64.o
obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KPROBES) += kprobes.o
obj-$(CONFIG_MODULES) += module_$(BITS).o obj-$(CONFIG_MODULES) += module_$(BITS).o
obj-$(CONFIG_ACPI_SRAT) += srat_32.o obj-$(CONFIG_ACPI_SRAT) += srat_32.o
......
...@@ -351,9 +351,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -351,9 +351,7 @@ void __init setup_arch(char **cmdline_p)
if (efi_enabled) if (efi_enabled)
efi_init(); efi_init();
#ifdef CONFIG_PARAVIRT
vsmp_init(); vsmp_init();
#endif
dmi_scan_machine(); dmi_scan_machine();
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/paravirt.h> #include <asm/paravirt.h>
#if defined CONFIG_PCI && defined CONFIG_PARAVIRT
/* /*
* Interrupt control on vSMPowered systems: * Interrupt control on vSMPowered systems:
* ~AC is a shadow of IF. If IF is 'on' AC should be 'off' * ~AC is a shadow of IF. If IF is 'on' AC should be 'off'
...@@ -72,39 +73,11 @@ static unsigned __init vsmp_patch(u8 type, u16 clobbers, void *ibuf, ...@@ -72,39 +73,11 @@ static unsigned __init vsmp_patch(u8 type, u16 clobbers, void *ibuf,
} }
static int vsmp = -1; static void __init set_vsmp_pv_ops(void)
int is_vsmp_box(void)
{
if (vsmp != -1)
return vsmp;
vsmp = 0;
if (!early_pci_allowed())
return vsmp;
/* Check if we are running on a ScaleMP vSMP box */
if ((read_pci_config_16(0, 0x1f, 0, PCI_VENDOR_ID) ==
PCI_VENDOR_ID_SCALEMP) &&
(read_pci_config_16(0, 0x1f, 0, PCI_DEVICE_ID) ==
PCI_DEVICE_ID_SCALEMP_VSMP_CTL))
vsmp = 1;
return vsmp;
}
void __init vsmp_init(void)
{ {
void *address; void *address;
unsigned int cap, ctl, cfg; unsigned int cap, ctl, cfg;
if (!is_vsmp_box())
return;
if (!early_pci_allowed())
return;
/* If we are, use the distinguished irq functions */
pv_irq_ops.irq_disable = vsmp_irq_disable; pv_irq_ops.irq_disable = vsmp_irq_disable;
pv_irq_ops.irq_enable = vsmp_irq_enable; pv_irq_ops.irq_enable = vsmp_irq_enable;
pv_irq_ops.save_fl = vsmp_save_fl; pv_irq_ops.save_fl = vsmp_save_fl;
...@@ -127,5 +100,46 @@ void __init vsmp_init(void) ...@@ -127,5 +100,46 @@ void __init vsmp_init(void)
} }
early_iounmap(address, 8); early_iounmap(address, 8);
}
#else
static void __init set_vsmp_pv_ops(void)
{
}
#endif
#ifdef CONFIG_PCI
static int vsmp = -1;
int is_vsmp_box(void)
{
if (vsmp != -1)
return vsmp;
vsmp = 0;
if (!early_pci_allowed())
return vsmp;
/* Check if we are running on a ScaleMP vSMP box */
if ((read_pci_config_16(0, 0x1f, 0, PCI_VENDOR_ID) ==
PCI_VENDOR_ID_SCALEMP) &&
(read_pci_config_16(0, 0x1f, 0, PCI_DEVICE_ID) ==
PCI_DEVICE_ID_SCALEMP_VSMP_CTL))
vsmp = 1;
return vsmp;
}
#else
int is_vsmp_box(void)
{
return 0;
}
#endif
void __init vsmp_init(void)
{
if (!is_vsmp_box())
return;
set_vsmp_pv_ops();
return; return;
} }
...@@ -50,19 +50,16 @@ extern int disable_apic_timer; ...@@ -50,19 +50,16 @@ extern int disable_apic_timer;
*/ */
#ifdef CONFIG_PARAVIRT #ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h> #include <asm/paravirt.h>
extern int is_vsmp_box(void);
#else #else
#define apic_write native_apic_write #define apic_write native_apic_write
#define apic_write_atomic native_apic_write_atomic #define apic_write_atomic native_apic_write_atomic
#define apic_read native_apic_read #define apic_read native_apic_read
#define setup_boot_clock setup_boot_APIC_clock #define setup_boot_clock setup_boot_APIC_clock
#define setup_secondary_clock setup_secondary_APIC_clock #define setup_secondary_clock setup_secondary_APIC_clock
static int inline is_vsmp_box(void)
{
return 0;
}
#endif #endif
extern int is_vsmp_box(void);
static inline void native_apic_write(unsigned long reg, u32 v) static inline void native_apic_write(unsigned long reg, u32 v)
{ {
*((volatile u32 *)(APIC_BASE + reg)) = v; *((volatile u32 *)(APIC_BASE + reg)) = v;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment