Merge branches 'x86-detect-hyper-for-linus', 'x86-fpu-for-linus', 'x86-kexec-for...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 23 Jul 2011 17:38:21 +0000 (10:38 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 23 Jul 2011 17:38:21 +0000 (10:38 -0700)
* 'x86-detect-hyper-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, hyper: Change hypervisor detection order

* 'x86-fpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86-32, fpu: Fix DNA exception during check_fpu()

* 'x86-kexec-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  kexec, x86: Fix incorrect jump back address if not preserving context

* 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, config: Introduce an INTEL_MID configuration

* 'x86-quirks-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, quirks: Use pci_dev->revision

* 'x86-tsc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86: tsc: Remove unneeded DMI-based blacklisting

* 'x86-smpboot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, boot: Wait for boot cpu to show up if nr_cpus limit is about to hit

arch/x86/Kconfig
arch/x86/kernel/apic/apic.c
arch/x86/kernel/cpu/bugs.c
arch/x86/kernel/cpu/hypervisor.c
arch/x86/kernel/quirks.c
arch/x86/kernel/relocate_kernel_32.S
arch/x86/kernel/relocate_kernel_64.S
arch/x86/kernel/tsc.c

index c3e03e4..b212754 100644 (file)
@@ -390,12 +390,21 @@ config X86_INTEL_CE
          This option compiles in support for the CE4100 SOC for settop
          boxes and media devices.
 
+config X86_INTEL_MID
+       bool "Intel MID platform support"
+       depends on X86_32
+       depends on X86_EXTENDED_PLATFORM
+       ---help---
+         Select to build a kernel capable of supporting Intel MID platform
+         systems which do not have the PCI legacy interfaces (Moorestown,
+         Medfield). If you are building for a PC class system say N here.
+
+if X86_INTEL_MID
+
 config X86_MRST
        bool "Moorestown MID platform"
        depends on PCI
        depends on PCI_GOANY
-       depends on X86_32
-       depends on X86_EXTENDED_PLATFORM
        depends on X86_IO_APIC
        select APB_TIMER
        select I2C
@@ -410,6 +419,8 @@ config X86_MRST
          nor standard legacy replacement devices/features. e.g. Moorestown does
          not contain i8259, i8254, HPET, legacy BIOS, most of the io ports.
 
+endif
+
 config X86_RDC321X
        bool "RDC R-321x SoC"
        depends on X86_32
index 9498b84..b24be38 100644 (file)
@@ -1944,10 +1944,28 @@ void disconnect_bsp_APIC(int virt_wire_setup)
 
 void __cpuinit generic_processor_info(int apicid, int version)
 {
-       int cpu;
+       int cpu, max = nr_cpu_ids;
+       bool boot_cpu_detected = physid_isset(boot_cpu_physical_apicid,
+                               phys_cpu_present_map);
+
+       /*
+        * If boot cpu has not been detected yet, then only allow upto
+        * nr_cpu_ids - 1 processors and keep one slot free for boot cpu
+        */
+       if (!boot_cpu_detected && num_processors >= nr_cpu_ids - 1 &&
+           apicid != boot_cpu_physical_apicid) {
+               int thiscpu = max + disabled_cpus - 1;
+
+               pr_warning(
+                       "ACPI: NR_CPUS/possible_cpus limit of %i almost"
+                       " reached. Keeping one slot for boot cpu."
+                       "  Processor %d/0x%x ignored.\n", max, thiscpu, apicid);
+
+               disabled_cpus++;
+               return;
+       }
 
        if (num_processors >= nr_cpu_ids) {
-               int max = nr_cpu_ids;
                int thiscpu = max + disabled_cpus;
 
                pr_warning(
index 525514c..46674fb 100644 (file)
@@ -62,6 +62,8 @@ static void __init check_fpu(void)
                return;
        }
 
+       kernel_fpu_begin();
+
        /*
         * trap_init() enabled FXSR and company _before_ testing for FP
         * problems here.
@@ -80,6 +82,8 @@ static void __init check_fpu(void)
                : "=m" (*&fdiv_bug)
                : "m" (*&x), "m" (*&y));
 
+       kernel_fpu_end();
+
        boot_cpu_data.fdiv_bug = fdiv_bug;
        if (boot_cpu_data.fdiv_bug)
                printk(KERN_WARNING "Hmm, FPU with FDIV bug.\n");
index 8095f86..755f64f 100644 (file)
  */
 static const __initconst struct hypervisor_x86 * const hypervisors[] =
 {
-       &x86_hyper_vmware,
-       &x86_hyper_ms_hyperv,
 #ifdef CONFIG_XEN_PVHVM
        &x86_hyper_xen_hvm,
 #endif
+       &x86_hyper_vmware,
+       &x86_hyper_ms_hyperv,
 };
 
 const struct hypervisor_x86 *x86_hyper;
index 8bbe8c5..b78643d 100644 (file)
@@ -10,7 +10,7 @@
 
 static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
 {
-       u8 config, rev;
+       u8 config;
        u16 word;
 
        /* BIOS may enable hardware IRQ balancing for
@@ -18,8 +18,7 @@ static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
         * based platforms.
         * Disable SW irqbalance/affinity on those platforms.
         */
-       pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
-       if (rev > 0x9)
+       if (dev->revision > 0x9)
                return;
 
        /* enable access to config space*/
index 4123553..36818f8 100644 (file)
@@ -97,6 +97,8 @@ relocate_kernel:
        ret
 
 identity_mapped:
+       /* set return address to 0 if not preserving context */
+       pushl   $0
        /* store the start address on the stack */
        pushl   %edx
 
index 4de8f5b..7a6f3b3 100644 (file)
@@ -100,6 +100,8 @@ relocate_kernel:
        ret
 
 identity_mapped:
+       /* set return address to 0 if not preserving context */
+       pushq   $0
        /* store the start address on the stack */
        pushq   %rdx
 
index 56c633a..db48336 100644 (file)
@@ -5,7 +5,6 @@
 #include <linux/timer.h>
 #include <linux/acpi_pmtmr.h>
 #include <linux/cpufreq.h>
-#include <linux/dmi.h>
 #include <linux/delay.h>
 #include <linux/clocksource.h>
 #include <linux/percpu.h>
@@ -800,27 +799,6 @@ void mark_tsc_unstable(char *reason)
 
 EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
-static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d)
-{
-       printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
-                       d->ident);
-       tsc_unstable = 1;
-       return 0;
-}
-
-/* List of systems that have known TSC problems */
-static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
-       {
-               .callback = dmi_mark_tsc_unstable,
-               .ident = "IBM Thinkpad 380XD",
-               .matches = {
-                       DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-                       DMI_MATCH(DMI_BOARD_NAME, "2635FA0"),
-               },
-       },
-       {}
-};
-
 static void __init check_system_tsc_reliable(void)
 {
 #ifdef CONFIG_MGEODE_LX
@@ -1010,8 +988,6 @@ void __init tsc_init(void)
        lpj_fine = lpj;
 
        use_tsc_delay();
-       /* Check and install the TSC clocksource */
-       dmi_check_system(bad_tsc_dmi_table);
 
        if (unsynchronized_tsc())
                mark_tsc_unstable("TSCs unsynchronized");