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: Ravikiran Thirumalai <kiran@scalex86.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
committed by
Ingo Molnar
parent
3250c91ada
commit
aa7d8e25ec
@@ -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)
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|||||||
*/
|
*/
|
||||||
#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;
|
||||||
|
Reference in New Issue
Block a user