]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Oct 2010 18:59:52 +0000 (11:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Oct 2010 18:59:52 +0000 (11:59 -0700)
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: (27 commits)
  x86: allocate space within a region top-down
  x86: update iomem_resource end based on CPU physical address capabilities
  x86/PCI: allocate space from the end of a region, not the beginning
  PCI: allocate bus resources from the top down
  resources: support allocating space within a region from the top down
  resources: handle overflow when aligning start of available area
  resources: ensure callback doesn't allocate outside available space
  resources: factor out resource_clip() to simplify find_resource()
  resources: add a default alignf to simplify find_resource()
  x86/PCI: MMCONFIG: fix region end calculation
  PCI: Add support for polling PME state on suspended legacy PCI devices
  PCI: Export some PCI PM functionality
  PCI: fix message typo
  PCI: log vendor/device ID always
  PCI: update Intel chipset names and defines
  PCI: use new ccflags variable in Makefile
  PCI: add PCI_MSIX_TABLE/PBA defines
  PCI: add PCI vendor id for STmicroelectronics
  x86/PCI: irq and pci_ids patch for Intel Patsburg DeviceIDs
  PCI: OLPC: Only enable PCI configuration type override on XO-1
  ...

1  2 
Documentation/kernel-parameters.txt
arch/x86/kernel/setup.c
drivers/pci/quirks.c
include/linux/pci_ids.h
kernel/resource.c

index 4bc2f3c3da5b1a6772eda0eaa712575fea3bf9c9,fe50cbd315b093c817a8f749d8e1f5be39d21b44..ed45e9802aa810a71e1f53fdde2a5d7bbba6789e
@@@ -43,11 -43,10 +43,11 @@@ parameter is applicable
        AVR32   AVR32 architecture is enabled.
        AX25    Appropriate AX.25 support is enabled.
        BLACKFIN Blackfin architecture is enabled.
 -      DRM     Direct Rendering Management support is enabled.
        EDD     BIOS Enhanced Disk Drive Services (EDD) is enabled
        EFI     EFI Partitioning (GPT) is enabled
        EIDE    EIDE/ATAPI support is enabled.
 +      DRM     Direct Rendering Management support is enabled.
 +      DYNAMIC_DEBUG Build in debug messages and enable them at runtime
        FB      The frame buffer device is enabled.
        GCOV    GCOV profiling is enabled.
        HW      Appropriate hardware is enabled.
@@@ -456,7 -455,7 +456,7 @@@ and is between 256 and 4096 characters
                        [ARM] imx_timer1,OSTS,netx_timer,mpu_timer2,
                                pxa_timer,timer3,32k_counter,timer0_1
                        [AVR32] avr32
 -                      [X86-32] pit,hpet,tsc,vmi-timer;
 +                      [X86-32] pit,hpet,tsc;
                                scx200_hrt on Geode; cyclone on IBM x440
                        [MIPS] MIPS
                        [PARISC] cr16
                        Format: <port#>,<type>
                        See also Documentation/input/joystick-parport.txt
  
 +      ddebug_query=   [KNL,DYNAMIC_DEBUG] Enable debug messages at early boot
 +                      time. See Documentation/dynamic-debug-howto.txt for
 +                      details.
 +
        debug           [KNL] Enable kernel debugging (events log level).
  
        debug_locks_verbose=
        kvm.oos_shadow= [KVM] Disable out-of-sync shadow paging.
                        Default is 1 (enabled)
  
 -      kvm-amd.nested= [KVM,AMD] Allow nested virtualization in KVM/SVM.
 +      kvm.mmu_audit=  [KVM] This is a R/W parameter which allows audit
 +                      KVM MMU at runtime.
                        Default is 0 (off)
  
 +      kvm-amd.nested= [KVM,AMD] Allow nested virtualization in KVM/SVM.
 +                      Default is 1 (enabled)
 +
        kvm-amd.npt=    [KVM,AMD] Disable nested paging (virtualized MMU)
                        for all guests.
                        Default is 1 (enabled) if in 64bit or 32bit-PAE mode
                        1 to enable accounting
                        Default value is 0.
  
 -      nfsaddrs=       [NFS]
 +      nfsaddrs=       [NFS] Deprecated.  Use ip= instead.
                        See Documentation/filesystems/nfs/nfsroot.txt.
  
        nfsroot=        [NFS] nfs root filesystem for disk-less boxes.
                        See Documentation/filesystems/nfs/nfsroot.txt.
  
 +      nfsrootdebug    [NFS] enable nfsroot debugging messages.
 +                      See Documentation/filesystems/nfs/nfsroot.txt.
 +
        nfs.callback_tcpport=
                        [NFS] set the TCP port on which the NFSv4 callback
                        channel should listen.
  
        nojitter        [IA64] Disables jitter checking for ITC timers.
  
 +      no-kvmclock     [X86,KVM] Disable paravirtualized KVM clock driver
 +
        nolapic         [X86-32,APIC] Do not enable or use the local APIC.
  
        nolapic_timer   [X86-32,APIC] Do not use the local APIC timer.
        norandmaps      Don't use address space randomization.  Equivalent to
                        echo 0 > /proc/sys/kernel/randomize_va_space
  
 -      noreplace-paravirt      [X86-32,PV_OPS] Don't patch paravirt_ops
 +      noreplace-paravirt      [X86,IA-64,PV_OPS] Don't patch paravirt_ops
  
        noreplace-smp   [X86-32,SMP] Don't replace SMP instructions
                        with UP alternatives
                        Reserves a hole at the top of the kernel virtual
                        address space.
  
 +      reservelow=     [X86]
 +                      Format: nn[K]
 +                      Set the amount of memory to reserve for BIOS at
 +                      the bottom of the address space.
 +
        reset_devices   [KNL] Force drivers to reset the underlying device
                        during initialization.
  
+       resource_alloc_from_bottom
+                       Allocate new resources from the beginning of available
+                       space, not the end.  If you need to use this, please
+                       report a bug.
        resume=         [SWSUSP]
                        Specify the partition device for software suspend
  
                        in <PAGE_SIZE> units (needed only for swap files).
                        See  Documentation/power/swsusp-and-swap-files.txt
  
 +      hibernate=      [HIBERNATION]
 +              noresume        Don't check if there's a hibernation image
 +                              present during boot.
 +              nocompress      Don't compress/decompress hibernation images.
 +
        retain_initrd   [RAM] Keep initrd memory after extraction
  
        rhash_entries=  [KNL,NET]
  
        switches=       [HW,M68k]
  
 +      sysfs.deprecated=0|1 [KNL]
 +                      Enable/disable old style sysfs layout for old udev
 +                      on older distributions. When this option is enabled
 +                      very new udev will not work anymore. When this option
 +                      is disabled (or CONFIG_SYSFS_DEPRECATED not compiled)
 +                      in older udev will not work anymore.
 +                      Default depends on CONFIG_SYSFS_DEPRECATED_V2 set in
 +                      the kernel configuration.
 +
        sysrq_always_enabled
                        [KNL]
                        Ignore sysrq setting - this boot parameter will
                        topology informations if the hardware supports these.
                        The scheduler will make use of these informations and
                        e.g. base its process migration decisions on it.
 -                      Default is off.
 +                      Default is on.
  
        tp720=          [HW,PS2]
  
                        disables clocksource verification at runtime.
                        Used to enable high-resolution timer mode on older
                        hardware, and in virtualized environment.
 +                      [x86] noirqtime: Do not use TSC to do irq accounting.
 +                      Used to run time disable IRQ_TIME_ACCOUNTING on any
 +                      platforms where RDTSC is slow and this accounting
 +                      can add overhead.
  
        turbografx.map[2|3]=    [HW,JOY]
                        TurboGraFX parallel port interface
diff --combined arch/x86/kernel/setup.c
index 95a32746fbf97d8a077acd9226ebb62950dab9c7,0fe76df866dbf7c545cc1e9ba488e9cd855a9b73..21c6746338afef0949e89f8b2c0442654401546e
@@@ -31,7 -31,6 +31,7 @@@
  #include <linux/apm_bios.h>
  #include <linux/initrd.h>
  #include <linux/bootmem.h>
 +#include <linux/memblock.h>
  #include <linux/seq_file.h>
  #include <linux/console.h>
  #include <linux/mca.h>
@@@ -84,6 -83,7 +84,6 @@@
  #include <asm/dmi.h>
  #include <asm/io_apic.h>
  #include <asm/ist.h>
 -#include <asm/vmi.h>
  #include <asm/setup_arch.h>
  #include <asm/bios_ebda.h>
  #include <asm/cacheflush.h>
  #include <asm/percpu.h>
  #include <asm/topology.h>
  #include <asm/apicdef.h>
 -#include <asm/k8.h>
 +#include <asm/amd_nb.h>
  #ifdef CONFIG_X86_64
  #include <asm/numa_64.h>
  #endif
  #include <asm/mce.h>
 +#include <asm/alternative.h>
  
  /*
   * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
@@@ -126,6 -125,7 +126,6 @@@ unsigned long max_pfn_mapped
  RESERVE_BRK(dmi_alloc, 65536);
  #endif
  
 -unsigned int boot_cpu_id __read_mostly;
  
  static __initdata unsigned long _brk_start = (unsigned long)__brk_base;
  unsigned long _brk_end = (unsigned long)__brk_base;
@@@ -302,7 -302,7 +302,7 @@@ static inline void init_gbpages(void
  static void __init reserve_brk(void)
  {
        if (_brk_end > _brk_start)
 -              reserve_early(__pa(_brk_start), __pa(_brk_end), "BRK");
 +              memblock_x86_reserve_range(__pa(_brk_start), __pa(_brk_end), "BRK");
  
        /* Mark brk area as locked down and no longer taking any
           new allocations */
@@@ -324,16 -324,17 +324,16 @@@ static void __init relocate_initrd(void
        char *p, *q;
  
        /* We need to move the initrd down into lowmem */
 -      ramdisk_here = find_e820_area(0, end_of_lowmem, area_size,
 +      ramdisk_here = memblock_find_in_range(0, end_of_lowmem, area_size,
                                         PAGE_SIZE);
  
 -      if (ramdisk_here == -1ULL)
 +      if (ramdisk_here == MEMBLOCK_ERROR)
                panic("Cannot find place for new RAMDISK of size %lld\n",
                         ramdisk_size);
  
        /* Note: this includes all the lowmem currently occupied by
           the initrd, we rely on that fact to keep the data intact. */
 -      reserve_early(ramdisk_here, ramdisk_here + area_size,
 -                       "NEW RAMDISK");
 +      memblock_x86_reserve_range(ramdisk_here, ramdisk_here + area_size, "NEW RAMDISK");
        initrd_start = ramdisk_here + PAGE_OFFSET;
        initrd_end   = initrd_start + ramdisk_size;
        printk(KERN_INFO "Allocated new RAMDISK: %08llx - %08llx\n",
@@@ -389,7 -390,7 +389,7 @@@ static void __init reserve_initrd(void
        initrd_start = 0;
  
        if (ramdisk_size >= (end_of_lowmem>>1)) {
 -              free_early(ramdisk_image, ramdisk_end);
 +              memblock_x86_free_range(ramdisk_image, ramdisk_end);
                printk(KERN_ERR "initrd too large to handle, "
                       "disabling initrd\n");
                return;
  
        relocate_initrd();
  
 -      free_early(ramdisk_image, ramdisk_end);
 +      memblock_x86_free_range(ramdisk_image, ramdisk_end);
  }
  #else
  static void __init reserve_initrd(void)
@@@ -468,7 -469,7 +468,7 @@@ static void __init e820_reserve_setup_d
        e820_print_map("reserve setup_data");
  }
  
 -static void __init reserve_early_setup_data(void)
 +static void __init memblock_x86_reserve_range_setup_data(void)
  {
        struct setup_data *data;
        u64 pa_data;
        while (pa_data) {
                data = early_memremap(pa_data, sizeof(*data));
                sprintf(buf, "setup data %x", data->type);
 -              reserve_early(pa_data, pa_data+sizeof(*data)+data->len, buf);
 +              memblock_x86_reserve_range(pa_data, pa_data+sizeof(*data)+data->len, buf);
                pa_data = data->next;
                early_iounmap(data, sizeof(*data));
        }
@@@ -501,7 -502,6 +501,7 @@@ static inline unsigned long long get_to
        return total << PAGE_SHIFT;
  }
  
 +#define DEFAULT_BZIMAGE_ADDR_MAX 0x37FFFFFF
  static void __init reserve_crashkernel(void)
  {
        unsigned long long total_mem;
        if (crash_base <= 0) {
                const unsigned long long alignment = 16<<20;    /* 16M */
  
 -              crash_base = find_e820_area(alignment, ULONG_MAX, crash_size,
 -                               alignment);
 -              if (crash_base == -1ULL) {
 +              /*
 +               *  kexec want bzImage is below DEFAULT_BZIMAGE_ADDR_MAX
 +               */
 +              crash_base = memblock_find_in_range(alignment,
 +                             DEFAULT_BZIMAGE_ADDR_MAX, crash_size, alignment);
 +
 +              if (crash_base == MEMBLOCK_ERROR) {
                        pr_info("crashkernel reservation failed - No suitable area found.\n");
                        return;
                }
        } else {
                unsigned long long start;
  
 -              start = find_e820_area(crash_base, ULONG_MAX, crash_size,
 -                               1<<20);
 +              start = memblock_find_in_range(crash_base,
 +                               crash_base + crash_size, crash_size, 1<<20);
                if (start != crash_base) {
                        pr_info("crashkernel reservation failed - memory is in use.\n");
                        return;
                }
        }
 -      reserve_early(crash_base, crash_base + crash_size, "CRASH KERNEL");
 +      memblock_x86_reserve_range(crash_base, crash_base + crash_size, "CRASH KERNEL");
  
        printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
                        "for crashkernel (System RAM: %ldMB)\n",
@@@ -619,10 -615,82 +619,10 @@@ static __init void reserve_ibft_region(
        addr = find_ibft_region(&size);
  
        if (size)
 -              reserve_early_overlap_ok(addr, addr + size, "ibft");
 +              memblock_x86_reserve_range(addr, addr + size, "* ibft");
  }
  
 -#ifdef CONFIG_X86_RESERVE_LOW_64K
 -static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
 -{
 -      printk(KERN_NOTICE
 -              "%s detected: BIOS may corrupt low RAM, working around it.\n",
 -              d->ident);
 -
 -      e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
 -      sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
 -
 -      return 0;
 -}
 -#endif
 -
 -/* List of systems that have known low memory corruption BIOS problems */
 -static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
 -#ifdef CONFIG_X86_RESERVE_LOW_64K
 -      {
 -              .callback = dmi_low_memory_corruption,
 -              .ident = "AMI BIOS",
 -              .matches = {
 -                      DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
 -              },
 -      },
 -      {
 -              .callback = dmi_low_memory_corruption,
 -              .ident = "Phoenix BIOS",
 -              .matches = {
 -                      DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
 -              },
 -      },
 -      {
 -              .callback = dmi_low_memory_corruption,
 -              .ident = "Phoenix/MSC BIOS",
 -              .matches = {
 -                      DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix/MSC"),
 -              },
 -      },
 -      /*
 -       * AMI BIOS with low memory corruption was found on Intel DG45ID and
 -       * DG45FC boards.
 -       * It has a different DMI_BIOS_VENDOR = "Intel Corp.", for now we will
 -       * match only DMI_BOARD_NAME and see if there is more bad products
 -       * with this vendor.
 -       */
 -      {
 -              .callback = dmi_low_memory_corruption,
 -              .ident = "AMI BIOS",
 -              .matches = {
 -                      DMI_MATCH(DMI_BOARD_NAME, "DG45ID"),
 -              },
 -      },
 -      {
 -              .callback = dmi_low_memory_corruption,
 -              .ident = "AMI BIOS",
 -              .matches = {
 -                      DMI_MATCH(DMI_BOARD_NAME, "DG45FC"),
 -              },
 -      },
 -      /*
 -       * The Dell Inspiron Mini 1012 has DMI_BIOS_VENDOR = "Dell Inc.", so
 -       * match on the product name.
 -       */
 -      {
 -              .callback = dmi_low_memory_corruption,
 -              .ident = "Phoenix BIOS",
 -              .matches = {
 -                      DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"),
 -              },
 -      },
 -#endif
 -      {}
 -};
 +static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10;
  
  static void __init trim_bios_range(void)
  {
         * A special case is the first 4Kb of memory;
         * This is a BIOS owned area, not kernel ram, but generally
         * not listed as such in the E820 table.
 +       *
 +       * This typically reserves additional memory (64KiB by default)
 +       * since some BIOSes are known to corrupt low memory.  See the
 +       * Kconfig help text for X86_RESERVE_LOW.
         */
 -      e820_update_range(0, PAGE_SIZE, E820_RAM, E820_RESERVED);
 +      e820_update_range(0, ALIGN(reserve_low, PAGE_SIZE),
 +                        E820_RAM, E820_RESERVED);
 +
        /*
         * special case: Some BIOSen report the PC BIOS
         * area (640->1Mb) as ram even though it is not.
        sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
  }
  
 +static int __init parse_reservelow(char *p)
 +{
 +      unsigned long long size;
 +
 +      if (!p)
 +              return -EINVAL;
 +
 +      size = memparse(p, &p);
 +
 +      if (size < 4096)
 +              size = 4096;
 +
 +      if (size > 640*1024)
 +              size = 640*1024;
 +
 +      reserve_low = size;
 +
 +      return 0;
 +}
 +
 +early_param("reservelow", parse_reservelow);
 +
 +static u64 __init get_max_mapped(void)
 +{
 +      u64 end = max_pfn_mapped;
 +
 +      end <<= PAGE_SHIFT;
 +
 +      return end;
 +}
 +
  /*
   * Determine if we were loaded by an EFI loader.  If so, then we have also been
   * passed the efi memmap, systab, etc., so we should use these data structures
@@@ -695,30 -726,18 +695,30 @@@ void __init setup_arch(char **cmdline_p
  {
        int acpi = 0;
        int k8 = 0;
 +      unsigned long flags;
  
  #ifdef CONFIG_X86_32
        memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
        visws_early_detect();
 +
 +      /*
 +       * copy kernel address range established so far and switch
 +       * to the proper swapper page table
 +       */
 +      clone_pgd_range(swapper_pg_dir     + KERNEL_PGD_BOUNDARY,
 +                      initial_page_table + KERNEL_PGD_BOUNDARY,
 +                      KERNEL_PGD_PTRS);
 +
 +      load_cr3(swapper_pg_dir);
 +      __flush_tlb_all();
  #else
        printk(KERN_INFO "Command line: %s\n", boot_command_line);
  #endif
  
 -      /* VMI may relocate the fixmap; do this before touching ioremap area */
 -      vmi_init();
 -
 -      /* OFW also may relocate the fixmap */
 +      /*
 +       * If we have OLPC OFW, we might end up relocating the fixmap due to
 +       * reserve_top(), so do this before touching the ioremap area.
 +       */
        olpc_ofw_detect();
  
        early_trap_init();
  #endif
         4)) {
                efi_enabled = 1;
 -              efi_reserve_early();
 +              efi_memblock_x86_reserve_range();
        }
  #endif
  
        x86_init.oem.arch_setup();
  
+       resource_alloc_from_bottom = 0;
+       iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1;
        setup_memory_map();
        parse_setup_data();
        /* update the e820_saved too */
  
        x86_report_nx();
  
 -      /* Must be before kernel pagetables are setup */
 -      vmi_activate();
 -
        /* after early param, so could get panic from serial */
 -      reserve_early_setup_data();
 +      memblock_x86_reserve_range_setup_data();
  
        if (acpi_mps_check()) {
  #ifdef CONFIG_X86_LOCAL_APIC
  
        dmi_scan_machine();
  
 -      dmi_check_system(bad_bios_dmi_table);
 -
        /*
         * VMware detection requires dmi to be available, so this
         * needs to be done after dmi_scan_machine, for the BP.
         */
        max_pfn = e820_end_of_ram_pfn();
  
 -      /* preallocate 4k for mptable mpc */
 -      early_reserve_e820_mpc_new();
        /* update e820 for memory not covered by WB MTRRs */
        mtrr_bp_init();
        if (mtrr_trim_uncached_memory(max_pfn))
                max_low_pfn = max_pfn;
  
        high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
 -      max_pfn_mapped = KERNEL_IMAGE_SIZE >> PAGE_SHIFT;
  #endif
  
 -#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
 -      setup_bios_corruption_check();
 -#endif
 -
 -      printk(KERN_DEBUG "initial memory mapped : 0 - %08lx\n",
 -                      max_pfn_mapped<<PAGE_SHIFT);
 -
 -      reserve_brk();
 -
        /*
         * Find and reserve possible boot-time SMP configuration:
         */
  
        reserve_ibft_region();
  
 +      /*
 +       * Need to conclude brk, before memblock_x86_fill()
 +       *  it could use memblock_find_in_range, could overlap with
 +       *  brk area.
 +       */
 +      reserve_brk();
 +
 +      memblock.current_limit = get_max_mapped();
 +      memblock_x86_fill();
 +
 +      /* preallocate 4k for mptable mpc */
 +      early_reserve_e820_mpc_new();
 +
 +#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
 +      setup_bios_corruption_check();
 +#endif
 +
 +      printk(KERN_DEBUG "initial memory mapped : 0 - %08lx\n",
 +                      max_pfn_mapped<<PAGE_SHIFT);
 +
        reserve_trampoline_memory();
  
  #ifdef CONFIG_ACPI_SLEEP
                max_low_pfn = max_pfn;
        }
  #endif
 +      memblock.current_limit = get_max_mapped();
  
        /*
         * NOTE: On x86-32, only from this point on, fixmaps are ready for use.
  #endif
  
        initmem_init(0, max_pfn, acpi, k8);
 -#ifndef CONFIG_NO_BOOTMEM
 -      early_res_to_bootmem(0, max_low_pfn<<PAGE_SHIFT);
 -#endif
 -
 +      memblock_find_dma_reserve();
        dma32_reserve_bootmem();
  
  #ifdef CONFIG_KVM_CLOCK
        paging_init();
        x86_init.paging.pagetable_setup_done(swapper_pg_dir);
  
 -      setup_trampoline_page_table();
 +#ifdef CONFIG_X86_32
 +      /* sync back kernel address range */
 +      clone_pgd_range(initial_page_table + KERNEL_PGD_BOUNDARY,
 +                      swapper_pg_dir     + KERNEL_PGD_BOUNDARY,
 +                      KERNEL_PGD_PTRS);
 +#endif
  
        tboot_probe();
  
        x86_init.oem.banner();
  
        mcheck_init();
 +
 +      local_irq_save(flags);
 +      arch_init_ideal_nop5();
 +      local_irq_restore(flags);
  }
  
  #ifdef CONFIG_X86_32
diff --combined drivers/pci/quirks.c
index cc96c7142dacdab47db9efbad91d345ec6590938,034430690a5bdfff57b74295fd7bfee6603e607d..f5c63fe9db5c5b6666001ae03a1a4c561c644986
@@@ -226,7 -226,6 +226,7 @@@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_I
   *    VIA Apollo KT133 needs PCI latency patch
   *    Made according to a windows driver based patch by George E. Breese
   *    see PCI Latency Adjust on http://www.viahardware.com/download/viatweak.shtm
 + *    and http://www.georgebreese.com/net/software/#PCI
   *      Also see http://www.au-ja.org/review-kt133a-1-en.phtml for
   *      the info on which Mr Breese based his work.
   *
@@@ -1017,7 -1016,7 +1017,7 @@@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_
  /*
   * Common misconfiguration of the MediaGX/Geode PCI master that will
   * reduce PCI bandwidth from 70MB/s to 25MB/s.  See the GXM/GXLV/GX1
 - * datasheets found at http://www.national.com/ds/GX for info on what
 + * datasheets found at http://www.national.com/analog for info on what
   * these bits do.  <christer@weinigel.se>
   */
  static void quirk_mediagx_master(struct pci_dev *dev)
@@@ -2297,6 -2296,37 +2297,37 @@@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_N
                        PCI_DEVICE_ID_NVIDIA_NVENET_15,
                        nvenet_msi_disable);
  
+ /*
+  * Some versions of the MCP55 bridge from nvidia have a legacy irq routing
+  * config register.  This register controls the routing of legacy interrupts
+  * from devices that route through the MCP55.  If this register is misprogramed
+  * interrupts are only sent to the bsp, unlike conventional systems where the
+  * irq is broadxast to all online cpus.  Not having this register set
+  * properly prevents kdump from booting up properly, so lets make sure that
+  * we have it set correctly.
+  * Note this is an undocumented register.
+  */
+ static void __devinit nvbridge_check_legacy_irq_routing(struct pci_dev *dev)
+ {
+       u32 cfg;
+       pci_read_config_dword(dev, 0x74, &cfg);
+       if (cfg & ((1 << 2) | (1 << 15))) {
+               printk(KERN_INFO "Rewriting irq routing register on MCP55\n");
+               cfg &= ~((1 << 2) | (1 << 15));
+               pci_write_config_dword(dev, 0x74, cfg);
+       }
+ }
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
+                       PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0,
+                       nvbridge_check_legacy_irq_routing);
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA,
+                       PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4,
+                       nvbridge_check_legacy_irq_routing);
  static int __devinit ht_check_msi_mapping(struct pci_dev *dev)
  {
        int pos, ttl = 48;
diff --combined include/linux/pci_ids.h
index 30d91838a19892f953749c6628458fa4fdf91d3e,bb6daa5f824042e2d56d8018899efabf26ada988..87e2c2e7aed3757748ca69c8b22a96c5ee1d5752
  #define PCI_DEVICE_ID_AMD_11H_NB_DRAM 0x1302
  #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303
  #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304
 +#define PCI_DEVICE_ID_AMD_15H_NB_MISC 0x1603
  #define PCI_DEVICE_ID_AMD_LANCE               0x2000
  #define PCI_DEVICE_ID_AMD_LANCE_HOME  0x2001
  #define PCI_DEVICE_ID_AMD_SCSI                0x2020
  #define PCI_DEVICE_ID_HP_CISSC                0x3230
  #define PCI_DEVICE_ID_HP_CISSD                0x3238
  #define PCI_DEVICE_ID_HP_CISSE                0x323a
 +#define PCI_DEVICE_ID_HP_CISSF                0x323b
  #define PCI_DEVICE_ID_HP_ZX2_IOC      0x4031
  
  #define PCI_VENDOR_ID_PCTECH          0x1042
  #define PCI_DEVICE_ID_ELSA_MICROLINK  0x1000
  #define PCI_DEVICE_ID_ELSA_QS3000     0x3000
  
+ #define PCI_VENDOR_ID_STMICRO         0x104A
  #define PCI_VENDOR_ID_BUSLOGIC                      0x104B
  #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC 0x0140
  #define PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER    0x1040
  
  #define PCI_VENDOR_ID_ANIGMA          0x1051
  #define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100
 -  
 +
  #define PCI_VENDOR_ID_EFAR            0x1055
  #define PCI_DEVICE_ID_EFAR_SLC90E66_1 0x9130
  #define PCI_DEVICE_ID_EFAR_SLC90E66_3 0x9463
  #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2    0x0348
  #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000       0x034C
  #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100         0x034E
+ #define PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V0      0x0360
+ #define PCI_DEVICE_ID_NVIDIA_MCP55_BRIDGE_V4      0x0364
  #define PCI_DEVICE_ID_NVIDIA_NVENET_15              0x0373
  #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA      0x03E7
  #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS           0x03EB
  
  #define PCI_VENDOR_ID_ZIATECH         0x1138
  #define PCI_DEVICE_ID_ZIATECH_5550_HC 0x5550
 - 
 +
  
  #define PCI_VENDOR_ID_SYSKONNECT      0x1148
  #define PCI_DEVICE_ID_SYSKONNECT_TR   0x4200
  #define PCI_DEVICE_ID_RP8OCTA         0x0005
  #define PCI_DEVICE_ID_RP8J            0x0006
  #define PCI_DEVICE_ID_RP4J            0x0007
 -#define PCI_DEVICE_ID_RP8SNI          0x0008  
 -#define PCI_DEVICE_ID_RP16SNI         0x0009  
 +#define PCI_DEVICE_ID_RP8SNI          0x0008
 +#define PCI_DEVICE_ID_RP16SNI         0x0009
  #define PCI_DEVICE_ID_RPP4            0x000A
  #define PCI_DEVICE_ID_RPP8            0x000B
  #define PCI_DEVICE_ID_RP4M            0x000D
  #define PCI_DEVICE_ID_URP8INTF                0x0802
  #define PCI_DEVICE_ID_URP16INTF               0x0803
  #define PCI_DEVICE_ID_URP8OCTA                0x0805
 -#define PCI_DEVICE_ID_UPCI_RM3_8PORT  0x080C       
 +#define PCI_DEVICE_ID_UPCI_RM3_8PORT  0x080C
  #define PCI_DEVICE_ID_UPCI_RM3_4PORT  0x080D
 -#define PCI_DEVICE_ID_CRP16INTF               0x0903       
 +#define PCI_DEVICE_ID_CRP16INTF               0x0903
  
  #define PCI_VENDOR_ID_CYCLADES                0x120e
  #define PCI_DEVICE_ID_CYCLOM_Y_Lo     0x0100
  #define PCI_DEVICE_ID_RASTEL_2PORT    0x2000
  
  #define PCI_VENDOR_ID_ZOLTRIX         0x15b0
 -#define PCI_DEVICE_ID_ZOLTRIX_2BD0    0x2bd0 
 +#define PCI_DEVICE_ID_ZOLTRIX_2BD0    0x2bd0
  
  #define PCI_VENDOR_ID_MELLANOX                0x15b3
  #define PCI_DEVICE_ID_MELLANOX_TAVOR  0x5a44
  #define PCI_VENDOR_ID_ARIMA           0x161f
  
  #define PCI_VENDOR_ID_BROCADE         0x1657
 +#define PCI_DEVICE_ID_BROCADE_CT      0x0014
 +#define PCI_DEVICE_ID_BROCADE_FC_8G1P 0x0017
 +#define PCI_DEVICE_ID_BROCADE_CT_FC   0x0021
  
  #define PCI_VENDOR_ID_SIBYTE          0x166d
  #define PCI_DEVICE_ID_BCM1250_PCI     0x0001
  
  #define PCI_VENDOR_ID_SILAN           0x1904
  
 +#define PCI_VENDOR_ID_RENESAS         0x1912
 +#define PCI_DEVICE_ID_RENESAS_SH7781  0x0001
 +#define PCI_DEVICE_ID_RENESAS_SH7780  0x0002
 +#define PCI_DEVICE_ID_RENESAS_SH7763  0x0004
 +#define PCI_DEVICE_ID_RENESAS_SH7785  0x0007
 +#define PCI_DEVICE_ID_RENESAS_SH7786  0x0010
 +
  #define PCI_VENDOR_ID_TDI               0x192E
  #define PCI_DEVICE_ID_TDI_EHCI          0x0101
  
  #define PCI_DEVICE_ID_P4080           0x0401
  #define PCI_DEVICE_ID_P4040E          0x0408
  #define PCI_DEVICE_ID_P4040           0x0409
 +#define PCI_DEVICE_ID_P2040E          0x0410
 +#define PCI_DEVICE_ID_P2040           0x0411
 +#define PCI_DEVICE_ID_P3041E          0x041E
 +#define PCI_DEVICE_ID_P3041           0x041F
 +#define PCI_DEVICE_ID_P5020E          0x0420
 +#define PCI_DEVICE_ID_P5020           0x0421
 +#define PCI_DEVICE_ID_P5010E          0x0428
 +#define PCI_DEVICE_ID_P5010           0x0429
  #define PCI_DEVICE_ID_MPC8641         0x7010
  #define PCI_DEVICE_ID_MPC8641D                0x7011
  #define PCI_DEVICE_ID_MPC8610         0x7018
  #define PCI_DEVICE_ID_INTEL_82375     0x0482
  #define PCI_DEVICE_ID_INTEL_82424     0x0483
  #define PCI_DEVICE_ID_INTEL_82378     0x0484
 +#define PCI_DEVICE_ID_INTEL_MRST_SD0  0x0807
 +#define PCI_DEVICE_ID_INTEL_MRST_SD1  0x0808
 +#define PCI_DEVICE_ID_INTEL_MFD_SD    0x0820
 +#define PCI_DEVICE_ID_INTEL_MFD_SDIO1 0x0821
 +#define PCI_DEVICE_ID_INTEL_MFD_SDIO2 0x0822
 +#define PCI_DEVICE_ID_INTEL_MFD_EMMC0 0x0823
 +#define PCI_DEVICE_ID_INTEL_MFD_EMMC1 0x0824
  #define PCI_DEVICE_ID_INTEL_I960      0x0960
  #define PCI_DEVICE_ID_INTEL_I960RM    0x0962
  #define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062
  #define PCI_DEVICE_ID_INTEL_82815_MC  0x1130
  #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132
  #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221
 -#define PCI_DEVICE_ID_INTEL_7505_0    0x2550  
 +#define PCI_DEVICE_ID_INTEL_7505_0    0x2550
  #define PCI_DEVICE_ID_INTEL_7205_0    0x255d
  #define PCI_DEVICE_ID_INTEL_82437     0x122d
  #define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e
  #define PCI_DEVICE_ID_INTEL_82840_HB  0x1a21
  #define PCI_DEVICE_ID_INTEL_82845_HB  0x1a30
  #define PCI_DEVICE_ID_INTEL_IOAT      0x1a38
- #define PCI_DEVICE_ID_INTEL_CPT_SMBUS 0x1c22
- #define PCI_DEVICE_ID_INTEL_CPT_LPC_MIN       0x1c41
- #define PCI_DEVICE_ID_INTEL_CPT_LPC_MAX       0x1c5f
+ #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22
+ #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN       0x1c41
+ #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX       0x1c5f
+ #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC      0x1d40
  #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410
  #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411
  #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413
  #define PCI_DEVICE_ID_INTEL_MCH_PC    0x3599
  #define PCI_DEVICE_ID_INTEL_MCH_PC1   0x359a
  #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e
 +#define PCI_DEVICE_ID_INTEL_I7300_MCH_ERR 0x360c
 +#define PCI_DEVICE_ID_INTEL_I7300_MCH_FB0 0x360f
 +#define PCI_DEVICE_ID_INTEL_I7300_MCH_FB1 0x3610
  #define PCI_DEVICE_ID_INTEL_IOAT_CNB  0x360b
  #define PCI_DEVICE_ID_INTEL_FBD_CNB   0x360c
  #define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710
  #define PCI_DEVICE_ID_INTEL_ICH10_3   0x3a1a
  #define PCI_DEVICE_ID_INTEL_ICH10_4   0x3a30
  #define PCI_DEVICE_ID_INTEL_ICH10_5   0x3a60
- #define PCI_DEVICE_ID_INTEL_PCH_LPC_MIN       0x3b00
- #define PCI_DEVICE_ID_INTEL_PCH_LPC_MAX       0x3b1f
- #define PCI_DEVICE_ID_INTEL_PCH_SMBUS 0x3b30
+ #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN     0x3b00
+ #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX     0x3b1f
+ #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS       0x3b30
  #define PCI_DEVICE_ID_INTEL_IOAT_SNB  0x402f
  #define PCI_DEVICE_ID_INTEL_5100_16   0x65f0
  #define PCI_DEVICE_ID_INTEL_5100_21   0x65f5
  #define PCI_DEVICE_ID_INTEL_5400_FBD0 0x4035
  #define PCI_DEVICE_ID_INTEL_5400_FBD1 0x4036
  #define PCI_DEVICE_ID_INTEL_IOAT_SCNB 0x65ff
- #define PCI_DEVICE_ID_INTEL_TOLAPAI_0 0x5031
- #define PCI_DEVICE_ID_INTEL_TOLAPAI_1 0x5032
+ #define PCI_DEVICE_ID_INTEL_EP80579_0 0x5031
+ #define PCI_DEVICE_ID_INTEL_EP80579_1 0x5032
  #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000
  #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010
  #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020
diff --combined kernel/resource.c
index 9c9841cb69021fdd259510ce7f117cedf14f0ad7,716b6804077ef0988da621899dda9cb70a1ec76b..9fad33efd0db50b3269572f598a1ce418731153c
@@@ -40,6 -40,23 +40,23 @@@ EXPORT_SYMBOL(iomem_resource)
  
  static DEFINE_RWLOCK(resource_lock);
  
+ /*
+  * By default, we allocate free space bottom-up.  The architecture can request
+  * top-down by clearing this flag.  The user can override the architecture's
+  * choice with the "resource_alloc_from_bottom" kernel boot option, but that
+  * should only be a debugging tool.
+  */
+ int resource_alloc_from_bottom = 1;
+ static __init int setup_alloc_from_bottom(char *s)
+ {
+       printk(KERN_INFO
+              "resource: allocating from bottom-up; please report a bug\n");
+       resource_alloc_from_bottom = 1;
+       return 0;
+ }
+ early_param("resource_alloc_from_bottom", setup_alloc_from_bottom);
  static void *r_next(struct seq_file *m, void *v, loff_t *pos)
  {
        struct resource *p = v;
@@@ -357,8 -374,97 +374,97 @@@ int __weak page_is_ram(unsigned long pf
        return walk_system_ram_range(pfn, 1, NULL, __is_ram) == 1;
  }
  
+ static resource_size_t simple_align_resource(void *data,
+                                            const struct resource *avail,
+                                            resource_size_t size,
+                                            resource_size_t align)
+ {
+       return avail->start;
+ }
+ static void resource_clip(struct resource *res, resource_size_t min,
+                         resource_size_t max)
+ {
+       if (res->start < min)
+               res->start = min;
+       if (res->end > max)
+               res->end = max;
+ }
+ static bool resource_contains(struct resource *res1, struct resource *res2)
+ {
+       return res1->start <= res2->start && res1->end >= res2->end;
+ }
+ /*
+  * Find the resource before "child" in the sibling list of "root" children.
+  */
+ static struct resource *find_sibling_prev(struct resource *root, struct resource *child)
+ {
+       struct resource *this;
+       for (this = root->child; this; this = this->sibling)
+               if (this->sibling == child)
+                       return this;
+       return NULL;
+ }
  /*
   * Find empty slot in the resource tree given range and alignment.
+  * This version allocates from the end of the root resource first.
+  */
+ static int find_resource_from_top(struct resource *root, struct resource *new,
+                                 resource_size_t size, resource_size_t min,
+                                 resource_size_t max, resource_size_t align,
+                                 resource_size_t (*alignf)(void *,
+                                                  const struct resource *,
+                                                  resource_size_t,
+                                                  resource_size_t),
+                                 void *alignf_data)
+ {
+       struct resource *this;
+       struct resource tmp, avail, alloc;
+       tmp.start = root->end;
+       tmp.end = root->end;
+       this = find_sibling_prev(root, NULL);
+       for (;;) {
+               if (this) {
+                       if (this->end < root->end)
+                               tmp.start = this->end + 1;
+               } else
+                       tmp.start = root->start;
+               resource_clip(&tmp, min, max);
+               /* Check for overflow after ALIGN() */
+               avail = *new;
+               avail.start = ALIGN(tmp.start, align);
+               avail.end = tmp.end;
+               if (avail.start >= tmp.start) {
+                       alloc.start = alignf(alignf_data, &avail, size, align);
+                       alloc.end = alloc.start + size - 1;
+                       if (resource_contains(&avail, &alloc)) {
+                               new->start = alloc.start;
+                               new->end = alloc.end;
+                               return 0;
+                       }
+               }
+               if (!this || this->start == root->start)
+                       break;
+               tmp.end = this->start - 1;
+               this = find_sibling_prev(root, this);
+       }
+       return -EBUSY;
+ }
+ /*
+  * Find empty slot in the resource tree given range and alignment.
+  * This version allocates from the beginning of the root resource first.
   */
  static int find_resource(struct resource *root, struct resource *new,
                         resource_size_t size, resource_size_t min,
                         void *alignf_data)
  {
        struct resource *this = root->child;
-       struct resource tmp = *new;
+       struct resource tmp = *new, avail, alloc;
  
        tmp.start = root->start;
        /*
-        * Skip past an allocated resource that starts at 0, since the assignment
-        * of this->start - 1 to tmp->end below would cause an underflow.
+        * Skip past an allocated resource that starts at 0, since the
+        * assignment of this->start - 1 to tmp->end below would cause an
+        * underflow.
         */
        if (this && this->start == 0) {
                tmp.start = this->end + 1;
                this = this->sibling;
        }
-       for(;;) {
+       for (;;) {
                if (this)
                        tmp.end = this->start - 1;
                else
                        tmp.end = root->end;
-               if (tmp.start < min)
-                       tmp.start = min;
-               if (tmp.end > max)
-                       tmp.end = max;
-               tmp.start = ALIGN(tmp.start, align);
-               if (alignf)
-                       tmp.start = alignf(alignf_data, &tmp, size, align);
-               if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) {
-                       new->start = tmp.start;
-                       new->end = tmp.start + size - 1;
-                       return 0;
+               resource_clip(&tmp, min, max);
+               /* Check for overflow after ALIGN() */
+               avail = *new;
+               avail.start = ALIGN(tmp.start, align);
+               avail.end = tmp.end;
+               if (avail.start >= tmp.start) {
+                       alloc.start = alignf(alignf_data, &avail, size, align);
+                       alloc.end = alloc.start + size - 1;
+                       if (resource_contains(&avail, &alloc)) {
+                               new->start = alloc.start;
+                               new->end = alloc.end;
+                               return 0;
+                       }
                }
                if (!this)
                        break;
                tmp.start = this->end + 1;
                this = this->sibling;
        }
@@@ -428,8 -541,14 +541,14 @@@ int allocate_resource(struct resource *
  {
        int err;
  
+       if (!alignf)
+               alignf = simple_align_resource;
        write_lock(&resource_lock);
-       err = find_resource(root, new, size, min, max, align, alignf, alignf_data);
+       if (resource_alloc_from_bottom)
+               err = find_resource(root, new, size, min, max, align, alignf, alignf_data);
+       else
+               err = find_resource_from_top(root, new, size, min, max, align, alignf, alignf_data);
        if (err >= 0 && __request_resource(root, new))
                err = -EBUSY;
        write_unlock(&resource_lock);
@@@ -453,8 -572,6 +572,8 @@@ static struct resource * __insert_resou
  
                if (first == parent)
                        return first;
 +              if (WARN_ON(first == new))      /* duplicated insertion */
 +                      return first;
  
                if ((first->start > new->start) || (first->end < new->end))
                        break;