Merge branches 'x86-detect-hyper-for-linus', 'x86-fpu-for-linus', 'x86-kexec-for...
Linus Torvalds [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

1  2  3  4  5  6  7  8 
arch/x86/Kconfig
arch/x86/kernel/apic/apic.c
arch/x86/kernel/tsc.c

diff --combined arch/x86/Kconfig
@@@@@@@@@ -20,7 -20,6 -20,6 -20,6 -20,6 -20,6 -20,6 -20,6 +20,7 @@@@@@@@@ config X8
                select HAVE_UNSTABLE_SCHED_CLOCK
                select HAVE_IDE
                select HAVE_OPROFILE
 +++++++        select HAVE_PCSPKR_PLATFORM
                select HAVE_PERF_EVENTS
                select HAVE_IRQ_WORK
                select HAVE_IOREMAP_PROT
                select IRQ_FORCED_THREADING
                select USE_GENERIC_SMP_HELPERS if SMP
                select HAVE_BPF_JIT if (X86_64 && NET)
 +++++++        select CLKEVT_I8253
        
        config INSTRUCTION_DECODER
                def_bool (KPROBES || PERF_EVENTS)
@@@@@@@@@ -95,10 -93,6 -93,6 -93,6 -93,6 -93,6 -93,6 -93,6 +95,10 @@@@@@@@@ config CLOCKSOURCE_WATCHDO
        config GENERIC_CLOCKEVENTS
                def_bool y
        
 +++++++config ARCH_CLOCKSOURCE_DATA
 +++++++        def_bool y
 +++++++        depends on X86_64
 +++++++
        config GENERIC_CLOCKEVENTS_BROADCAST
                def_bool y
                depends on X86_64 || (X86_32 && X86_LOCAL_APIC)
@@@@@@@@@ -390,12 -384,12 -384,12 -384,12 -384,21 -384,12 -384,12 -384,12 +390,21 @@@@@@@@@ config X86_INTEL_C
                  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
                  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
@@@@@@@@@ -623,7 -617,6 -617,6 -617,6 -628,6 -617,6 -617,6 -617,6 +634,7 @@@@@@@@@ config HPET_EMULATE_RT
        config APB_TIMER
               def_bool y if MRST
               prompt "Langwell APB Timer Support" if X86_MRST
 +++++++       select DW_APB_TIMER
               help
                 APB timer is the replacement for 8254, HPET on X86 MID platforms.
                 The APBT provides a stable time base on SMP
@@@@@@@@@ -687,6 -680,33 -680,33 -680,33 -691,33 -680,33 -680,33 -680,33 +698,6 @@@@@@@@@ config CALGARY_IOMMU_ENABLED_BY_DEFAUL
                  Calgary anyway, pass 'iommu=calgary' on the kernel command line.
                  If unsure, say Y.
        
 -------config AMD_IOMMU
 -------        bool "AMD IOMMU support"
 -------        select SWIOTLB
 -------        select PCI_MSI
 -------        select PCI_IOV
 -------        depends on X86_64 && PCI && ACPI
 -------        ---help---
 -------          With this option you can enable support for AMD IOMMU hardware in
 -------          your system. An IOMMU is a hardware component which provides
 -------          remapping of DMA memory accesses from devices. With an AMD IOMMU you
 -------          can isolate the the DMA memory of different devices and protect the
 -------          system from misbehaving device drivers or hardware.
 -------
 -------          You can find out if your system has an AMD IOMMU if you look into
 -------          your BIOS for an option to enable it or if you have an IVRS ACPI
 -------          table.
 -------
 -------config AMD_IOMMU_STATS
 -------        bool "Export AMD IOMMU statistics to debugfs"
 -------        depends on AMD_IOMMU
 -------        select DEBUG_FS
 -------        ---help---
 -------          This option enables code in the AMD IOMMU driver to collect various
 -------          statistics about whats happening in the driver and exports that
 -------          information to userspace via debugfs.
 -------          If unsure, say N.
 -------
        # need this always selected by IOMMU for the VIA workaround
        config SWIOTLB
                def_bool y if X86_64
        config IOMMU_HELPER
                def_bool (CALGARY_IOMMU || GART_IOMMU || SWIOTLB || AMD_IOMMU)
        
 -------config IOMMU_API
 -------        def_bool (AMD_IOMMU || DMAR)
 -------
        config MAXSMP
                bool "Enable Maximum number of SMP Processors and NUMA Nodes"
                depends on X86_64 && SMP && DEBUG_KERNEL && EXPERIMENTAL
@@@@@@@@@ -1147,7 -1170,7 -1170,7 -1170,7 -1181,7 -1170,7 -1170,7 -1170,7 +1158,7 @@@@@@@@@ comment "NUMA (Summit) requires SMP, 64
        config AMD_NUMA
                def_bool y
                prompt "Old style AMD Opteron NUMA detection"
 --   --        depends on NUMA && PCI
 ++   ++        depends on X86_64 && NUMA && PCI
                ---help---
                  Enable AMD NUMA node topology detection.  You should say Y here if
                  you have a multi processor AMD system. This uses an old method to
@@@@@@@@@ -1919,6 -1942,55 -1942,55 -1942,55 -1953,55 -1942,55 -1942,55 -1942,55 +1930,6 @@@@@@@@@ config PCI_CNB20LE_QUIR
        
                  You should say N unless you know you need this.
        
 -------config DMAR
 -------        bool "Support for DMA Remapping Devices (EXPERIMENTAL)"
 -------        depends on PCI_MSI && ACPI && EXPERIMENTAL
 -------        help
 -------          DMA remapping (DMAR) devices support enables independent address
 -------          translations for Direct Memory Access (DMA) from devices.
 -------          These DMA remapping devices are reported via ACPI tables
 -------          and include PCI device scope covered by these DMA
 -------          remapping devices.
 -------
 -------config DMAR_DEFAULT_ON
 -------        def_bool y
 -------        prompt "Enable DMA Remapping Devices by default"
 -------        depends on DMAR
 -------        help
 -------          Selecting this option will enable a DMAR device at boot time if
 -------          one is found. If this option is not selected, DMAR support can
 -------          be enabled by passing intel_iommu=on to the kernel. It is
 -------          recommended you say N here while the DMAR code remains
 -------          experimental.
 -------
 -------config DMAR_BROKEN_GFX_WA
 -------        bool "Workaround broken graphics drivers (going away soon)"
 -------        depends on DMAR && BROKEN
 -------        ---help---
 -------          Current Graphics drivers tend to use physical address
 -------          for DMA and avoid using DMA APIs. Setting this config
 -------          option permits the IOMMU driver to set a unity map for
 -------          all the OS-visible memory. Hence the driver can continue
 -------          to use physical addresses for DMA, at least until this
 -------          option is removed in the 2.6.32 kernel.
 -------
 -------config DMAR_FLOPPY_WA
 -------        def_bool y
 -------        depends on DMAR
 -------        ---help---
 -------          Floppy disk drivers are known to bypass DMA API calls
 -------          thereby failing to work when IOMMU is enabled. This
 -------          workaround will setup a 1:1 mapping for the first
 -------          16MiB to make floppy (an ISA device) work.
 -------
 -------config INTR_REMAP
 -------        bool "Support for Interrupt Remapping (EXPERIMENTAL)"
 -------        depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI && EXPERIMENTAL
 -------        ---help---
 -------          Supports Interrupt remapping for IO-APIC and MSI devices.
 -------          To use x2apic mode in the CPU's which support x2APIC enhancements or
 -------          to support platforms with CPU's having > 8 bit APIC ID, say Y.
 -------
        source "drivers/pci/pcie/Kconfig"
        
        source "drivers/pci/Kconfig"
        #include <linux/syscore_ops.h>
        #include <linux/delay.h>
        #include <linux/timex.h>
 +++++++#include <linux/i8253.h>
        #include <linux/dmar.h>
        #include <linux/init.h>
        #include <linux/cpu.h>
        #include <asm/pgalloc.h>
        #include <asm/atomic.h>
        #include <asm/mpspec.h>
 -------#include <asm/i8253.h>
        #include <asm/i8259.h>
        #include <asm/proto.h>
        #include <asm/apic.h>
        #include <asm/hpet.h>
        #include <asm/idle.h>
        #include <asm/mtrr.h>
 +++++++#include <asm/time.h>
        #include <asm/smp.h>
        #include <asm/mce.h>
        #include <asm/tsc.h>
@@@@@@@@@ -391,8 -390,8 -390,8 -390,8 -390,8 -390,8 -390,7 -390,8 +391,8 @@@@@@@@@ static unsigned int reserve_eilvt_offse
        
        /*
         * If mask=1, the LVT entry does not generate interrupts while mask=0
      -  * enables the vector. See also the BKDGs.
      +  * enables the vector. See also the BKDGs. Must be called with
      +  * preemption disabled.
         */
        
        int setup_APIC_eilvt(u8 offset, u8 vector, u8 msg_type, u8 mask)
@@@@@@@@@ -1430,7 -1429,7 -1429,7 -1429,7 -1429,7 -1429,7 -1428,7 -1429,7 +1430,7 @@@@@@@@@ void enable_x2apic(void
                rdmsr(MSR_IA32_APICBASE, msr, msr2);
                if (!(msr & X2APIC_ENABLE)) {
                        printk_once(KERN_INFO "Enabling x2apic\n");
 -------                wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, 0);
 +++++++                wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, msr2);
                }
        }
        #endif /* CONFIG_X86_X2APIC */
@@@@@@@@@ -1944,10 -1943,10 -1943,10 -1943,10 -1943,10 -1943,10 -1942,10 -1943,28 +1944,28 @@@@@@@@@ void disconnect_bsp_APIC(int virt_wire_
        
        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(
diff --combined arch/x86/kernel/tsc.c
@@@@@@@@@ -5,7 -5,7 -5,7 -5,7 -5,7 -5,7 -5,6 -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>
@@@@@@@@@ -777,7 -777,7 -777,7 -777,7 -777,7 -777,7 -776,7 -777,7 +776,7 @@@@@@@@@ static struct clocksource clocksource_t
                .flags                  = CLOCK_SOURCE_IS_CONTINUOUS |
                                          CLOCK_SOURCE_MUST_VERIFY,
        #ifdef CONFIG_X86_64
 -------        .vread                  = vread_tsc,
 +++++++        .archdata               = { .vclock_mode = VCLOCK_TSC },
        #endif
        };
        
@@@@@@@@@ -800,27 -800,27 -800,27 -800,27 -800,27 -800,27 -799,6 -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 -1010,8 -1010,8 -1010,8 -1010,8 -1010,8 -988,6 -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");