]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 17 Jul 2008 00:25:46 +0000 (17:25 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 17 Jul 2008 00:25:46 +0000 (17:25 -0700)
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: (72 commits)
  Revert "x86/PCI: ACPI based PCI gap calculation"
  PCI: remove unnecessary volatile in PCIe hotplug struct controller
  x86/PCI: ACPI based PCI gap calculation
  PCI: include linux/pm_wakeup.h for device_set_wakeup_capable
  PCI PM: Fix pci_prepare_to_sleep
  x86/PCI: Fix PCI config space for domains > 0
  Fix acpi_pm_device_sleep_wake() by providing a stub for CONFIG_PM_SLEEP=n
  PCI: Simplify PCI device PM code
  PCI PM: Introduce pci_prepare_to_sleep and pci_back_from_sleep
  PCI ACPI: Rework PCI handling of wake-up
  ACPI: Introduce new device wakeup flag 'prepared'
  ACPI: Introduce acpi_device_sleep_wake function
  PCI: rework pci_set_power_state function to call platform first
  PCI: Introduce platform_pci_power_manageable function
  ACPI: Introduce acpi_bus_power_manageable function
  PCI: make pci_name use dev_name
  PCI: handle pci_name() being const
  PCI: add stub for pci_set_consistent_dma_mask()
  PCI: remove unused arch pcibios_update_resource() functions
  PCI: fix pci_setup_device()'s sprinting into a const buffer
  ...

Fixed up conflicts in various files (arch/x86/kernel/setup_64.c,
arch/x86/pci/irq.c, arch/x86/pci/pci.h, drivers/acpi/sleep/main.c,
drivers/pci/pci.c, drivers/pci/pci.h, include/acpi/acpi_bus.h) from x86
and ACPI updates manually.

24 files changed:
1  2 
Documentation/kernel-parameters.txt
MAINTAINERS
arch/x86/kernel/acpi/sleep.c
arch/x86/kernel/apm_32.c
arch/x86/kernel/early-quirks.c
arch/x86/kernel/setup.c
arch/x86/pci/common.c
arch/x86/pci/irq.c
arch/x86/pci/pci.h
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/bus.c
drivers/acpi/glue.c
drivers/acpi/scan.c
drivers/acpi/sleep/main.c
drivers/base/power/trace.c
drivers/pci/hotplug/acpiphp_glue.c
drivers/pci/intel-iommu.c
drivers/pci/pci-driver.c
drivers/pci/pci.h
drivers/pci/quirks.c
include/asm-generic/vmlinux.lds.h
include/linux/acpi.h
include/linux/pci.h

index 5e497d16fb51a036e7b80af6b6151ddbe89603c9,18d793ea0dd37f5ab6035697a385a2e12b4817b6..09ad7450647bc81dff32a3eaf7ea3c0858f4a896
@@@ -147,10 -147,14 +147,14 @@@ and is between 256 and 4096 characters
                        default: 0
  
        acpi_sleep=     [HW,ACPI] Sleep options
-                       Format: { s3_bios, s3_mode, s3_beep }
+                       Format: { s3_bios, s3_mode, s3_beep, old_ordering }
                        See Documentation/power/video.txt for s3_bios and s3_mode.
                        s3_beep is for debugging; it makes the PC's speaker beep
                        as soon as the kernel's real-mode entry point is called.
+                       old_ordering causes the ACPI 1.0 ordering of the _PTS
+                       control method, wrt putting devices into low power
+                       states, to be enforced (the ACPI 2.0 ordering of _PTS is
+                       used by default).
  
        acpi_sci=       [HW,ACPI] ACPI System Control Interrupt trigger mode
                        Format: { level | edge | high | low }
        aic79xx=        [HW,SCSI]
                        See Documentation/scsi/aic79xx.txt.
  
 +      amd_iommu=      [HW,X86-84]
 +                      Pass parameters to the AMD IOMMU driver in the system.
 +                      Possible values are:
 +                      isolate - enable device isolation (each device, as far
 +                                as possible, will get its own protection
 +                                domain)
 +      amd_iommu_size= [HW,X86-64]
 +                      Define the size of the aperture for the AMD IOMMU
 +                      driver. Possible values are:
 +                      '32M', '64M' (default), '128M', '256M', '512M', '1G'
 +
        amijoy.map=     [HW,JOY] Amiga joystick support
                        Map of devices attached to JOY0DAT and JOY1DAT
                        Format: <a>,<b>
                        when initialising the APIC and IO-APIC components.
  
        apm=            [APM] Advanced Power Management
 -                      See header of arch/i386/kernel/apm.c.
 +                      See header of arch/x86/kernel/apm_32.c.
  
        arcrimi=        [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
                        Format: <io>,<irq>,<nodeID>
  
        debug_objects   [KNL] Enable object debugging
  
 +      debugpat        [X86] Enable PAT debugging
 +
        decnet.addr=    [HW,NET]
                        Format: <area>[,<node>]
                        See also Documentation/networking/decnet.txt.
                        See drivers/char/README.epca and
                        Documentation/digiepca.txt.
  
 +      disable_mtrr_cleanup [X86]
 +      enable_mtrr_cleanup [X86]
 +                      The kernel tries to adjust MTRR layout from continuous
 +                      to discrete, to make X server driver able to add WB
 +                      entry later. This parameter enables/disables that.
 +
 +      mtrr_chunk_size=nn[KMG] [X86]
 +                      used for mtrr cleanup. It is largest continous chunk
 +                      that could hold holes aka. UC entries.
 +
 +      mtrr_gran_size=nn[KMG] [X86]
 +                      Used for mtrr cleanup. It is granularity of mtrr block.
 +                      Default is 1.
 +                      Large value could prevent small alignment from
 +                      using up MTRRs.
 +
 +      mtrr_spare_reg_nr=n [X86]
 +                      Format: <integer>
 +                      Range: 0,7 : spare reg number
 +                      Default : 1
 +                      Used for mtrr cleanup. It is spare mtrr entries number.
 +                      Set to 2 or more if your graphical card needs more.
 +
        disable_mtrr_trim [X86, Intel and AMD only]
                        By default the kernel will trim any uncacheable
                        memory out of your available memory pool based on
  
        elanfreq=       [X86-32]
                        See comment before function elanfreq_setup() in
 -                      arch/i386/kernel/cpu/cpufreq/elanfreq.c.
 +                      arch/x86/kernel/cpu/cpufreq/elanfreq.c.
  
        elevator=       [IOSCHED]
                        Format: {"anticipatory" | "cfq" | "deadline" | "noop"}
        hd=             [EIDE] (E)IDE hard drive subsystem geometry
                        Format: <cyl>,<head>,<sect>
  
 -      hd?=            [HW] (E)IDE subsystem
 -      hd?lun=         See Documentation/ide/ide.txt.
 -
        highmem=nn[KMG] [KNL,BOOT] forces the highmem zone to have an exact
                        size of <nn>. This works even on boxes that have no
                        highmem otherwise. This also works to reduce highmem
                        See Documentation/ide/ide.txt.
  
        idle=           [X86]
 -                      Format: idle=poll or idle=mwait
 +                      Format: idle=poll or idle=mwait, idle=halt, idle=nomwait
                        Poll forces a polling idle loop that can slightly improves the performance
                        of waking up a idle CPU, but will use a lot of power and make the system
                        run hot. Not recommended.
                        to not use it because it doesn't save as much power as a normal idle
                        loop use the MONITOR/MWAIT idle loop anyways. Performance should be the same
                        as idle=poll.
 +                      idle=halt. Halt is forced to be used for CPU idle.
 +                      In such case C2/C3 won't be used again.
 +                      idle=nomwait. Disable mwait for CPU C-states
  
        ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem
                        Claim all unknown PCI IDE storage controllers.
        mtdparts=       [MTD]
                        See drivers/mtd/cmdlinepart.c.
  
 +      mtdset=         [ARM]
 +                      ARM/S3C2412 JIVE boot control
 +
 +                      See arch/arm/mach-s3c2412/mach-jive.c
 +
        mtouchusb.raw_coordinates=
                        [HW] Make the MicroTouch USB driver use raw coordinates
                        ('y', default) or cooked coordinates ('n')
                                Use with caution as certain devices share
                                address decoders between ROMs and other
                                resources.
+               norom           [X86-32,X86_64] Do not assign address space to
+                               expansion ROMs that do not already have
+                               BIOS assigned address ranges.
                irqmask=0xMMMM  [X86-32] Set a bit mask of IRQs allowed to be
                                assigned automatically to PCI devices. You can
                                make the kernel exclude IRQs of your ISA cards
                        Format: { parport<nr> | timid | 0 }
                        See also Documentation/parport.txt.
  
 +      pmtmr=          [X86] Manual setup of pmtmr I/O Port. 
 +                      Override pmtimer IOPort with a hex value.
 +                      e.g. pmtmr=0x508
 +
        pnpacpi=        [ACPI]
                        { off }
  
                        Format: <reboot_mode>[,<reboot_mode2>[,...]]
                        See arch/*/kernel/reboot.c or arch/*/kernel/process.c                   
  
 +      relax_domain_level=
 +                      [KNL, SMP] Set scheduler's default relax_domain_level.
 +                      See Documentation/cpusets.txt.
 +
        reserve=        [KNL,BUGS] Force the kernel to ignore some iomem area
  
        reservetop=     [X86-32]
        usbhid.mousepoll=
                        [USBHID] The interval which mice are to be polled at.
  
 +      add_efi_memmap  [EFI; x86-32,X86-64] Include EFI memory map in
 +                      kernel's map of available physical RAM.
 +
        vdso=           [X86-32,SH,x86-64]
                        vdso=2: enable compat VDSO (default with COMPAT_VDSO)
                        vdso=1: enable VDSO (default)
diff --combined MAINTAINERS
index 2b9212f90446f288ab1d5f9bf7b1067946790626,02a85ab7387d632e3f9aed6f45c820b63dd8b25b..93fd6b2efeee80c4948e0f33f02d8081a26c637c
@@@ -216,8 -216,8 +216,8 @@@ W: http://code.google.com/p/aceracp
  S:    Maintained
  
  ACPI
 -P:    Len Brown
 -M:    len.brown@intel.com
 +P:    Andi Kleen
 +M:    ak@linux.intel.com
  M:    lenb@kernel.org
  L:    linux-acpi@vger.kernel.org
  W:    http://www.lesswatts.org/projects/acpi/
@@@ -228,41 -228,41 +228,41 @@@ ACPI BATTERY DRIVER
  P:    Alexey Starikovskiy
  M:    astarikovskiy@suse.de
  L:    linux-acpi@vger.kernel.org
 -W:    http://acpi.sourceforge.net/
 +W:    http://www.lesswatts.org/projects/acpi/
  S:    Supported
  
  ACPI EC DRIVER
  P:    Alexey Starikovskiy
  M:    astarikovskiy@suse.de
  L:    linux-acpi@vger.kernel.org
 -W:    http://acpi.sourceforge.net/
 +W:    http://www.lesswatts.org/projects/acpi/
  S:    Supported
  
  ACPI FAN DRIVER
 -P:    Len Brown
 -M:    len.brown@intel.com
 +P:    Zhang Rui
 +M:    rui.zhang@intel.com
  L:    linux-acpi@vger.kernel.org
 -W:    http://acpi.sourceforge.net/
 +W:    http://www.lesswatts.org/projects/acpi/
  S:    Supported
  
  ACPI PCI HOTPLUG DRIVER
  P:    Kristen Carlson Accardi
  M:    kristen.c.accardi@intel.com
- L:    pcihpd-discuss@lists.sourceforge.net
+ L:    linux-pci@vger.kernel.org
  S:    Supported
  
  ACPI THERMAL DRIVER
 -P:    Len Brown
 -M:    len.brown@intel.com
 +P:    Zhang Rui
 +M:    rui.zhang@intel.com
  L:    linux-acpi@vger.kernel.org
 -W:    http://acpi.sourceforge.net/
 +W:    http://www.lesswatts.org/projects/acpi/
  S:    Supported
  
  ACPI VIDEO DRIVER
 -P:    Rui Zhang
 +P:    Zhang Rui
  M:    rui.zhang@intel.com
  L:    linux-acpi@vger.kernel.org
 -W:    http://acpi.sourceforge.net/
 +W:    http://www.lesswatts.org/projects/acpi/
  S:    Supported
  
  ACPI WMI DRIVER
@@@ -274,7 -274,7 +274,7 @@@ S:      Maintaine
  
  AD1889 ALSA SOUND DRIVER
  P:     Kyle McMartin
 -M:     kyle@parisc-linux.org
 +M:     kyle@mcmartin.ca
  P:     Thibaut Varene
  M:     T-Bone@parisc-linux.org
  W:     http://wiki.parisc-linux.org/AD1889
@@@ -348,9 -348,7 +348,9 @@@ W: http://www.linux-usb.org/SpeedTouch
  S:    Maintained
  
  ALCHEMY AU1XX0 MMC DRIVER
 -S:    Orphan
 +P:    Manuel Lauss
 +M:    manuel.lauss@gmail.com
 +S:    Maintained
  
  ALI1563 I2C DRIVER
  P:    Rudolf Marek
@@@ -378,12 -376,6 +378,12 @@@ L:       linux-geode@lists.infradead.org (mod
  W:    http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
  S:    Supported
  
 +AMD IOMMU (AMD-VI)
 +P:    Joerg Roedel
 +M:    joerg.roedel@amd.com
 +L:    iommu@lists.linux-foundation.org
 +S:    Supported
 +
  AMS (Apple Motion Sensor) DRIVER
  P:    Stelian Pop
  M:    stelian@popies.net
@@@ -771,10 -763,9 +771,10 @@@ S:       Maintaine
  
  AUXILIARY DISPLAY DRIVERS
  P:    Miguel Ojeda Sandonis
 -M:    maxextreme@gmail.com
 +M:    miguel.ojeda.sandonis@gmail.com
  L:    linux-kernel@vger.kernel.org
 -W:    http://auxdisplay.googlepages.com/
 +W:    http://miguelojeda.es/auxdisplay.htm
 +W:    http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
  S:    Maintained
  
  AVR32 ARCHITECTURE
@@@ -1004,8 -995,8 +1004,8 @@@ L:       netdev@vger.kernel.or
  S:    Supported
  
  BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
 -P:    Eliezer Tamir
 -M:    eliezert@broadcom.com
 +P:    Eilon Greenstein
 +M:    eilong@broadcom.com
  L:    netdev@vger.kernel.org
  S:    Supported
  
@@@ -1064,18 -1055,16 +1064,18 @@@ S:   Supporte
  
  CFAG12864B LCD DRIVER
  P:    Miguel Ojeda Sandonis
 -M:    maxextreme@gmail.com
 +M:    miguel.ojeda.sandonis@gmail.com
  L:    linux-kernel@vger.kernel.org
 -W:    http://auxdisplay.googlepages.com/
 +W:    http://miguelojeda.es/auxdisplay.htm
 +W:    http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
  S:    Maintained
  
  CFAG12864BFB LCD FRAMEBUFFER DRIVER
  P:    Miguel Ojeda Sandonis
 -M:    maxextreme@gmail.com
 +M:    miguel.ojeda.sandonis@gmail.com
  L:    linux-kernel@vger.kernel.org
 -W:    http://auxdisplay.googlepages.com/
 +W:    http://miguelojeda.es/auxdisplay.htm
 +W:    http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
  S:    Maintained
  
  CFG80211 and NL80211
@@@ -1145,28 -1134,23 +1145,28 @@@ COMPACTPCI HOTPLUG COR
  P:    Scott Murray
  M:    scottm@somanetworks.com
  M:    scott@spiteful.org
- L:    pcihpd-discuss@lists.sourceforge.net
+ L:    linux-pci@vger.kernel.org
  S:    Supported
  
  COMPACTPCI HOTPLUG ZIATECH ZT5550 DRIVER
  P:    Scott Murray
  M:    scottm@somanetworks.com
  M:    scott@spiteful.org
- L:    pcihpd-discuss@lists.sourceforge.net
+ L:    linux-pci@vger.kernel.org
  S:    Supported
  
  COMPACTPCI HOTPLUG GENERIC DRIVER
  P:    Scott Murray
  M:    scottm@somanetworks.com
  M:    scott@spiteful.org
- L:    pcihpd-discuss@lists.sourceforge.net
+ L:    linux-pci@vger.kernel.org
  S:    Supported
  
 +COMPAL LAPTOP SUPPORT
 +P:    Cezary Jackiewicz
 +M:    cezary.jackiewicz@gmail.com
 +S:    Maintained
 +
  COMPUTONE INTELLIPORT MULTIPORT CARD
  P:    Michael H. Warfield
  M:    mhw@wittsend.com
@@@ -1218,7 -1202,6 +1218,7 @@@ M:      pj@sgi.co
  M:    menage@google.com
  L:    linux-kernel@vger.kernel.org
  W:    http://www.bullopensource.org/cpuset/
 +W:    http://oss.sgi.com/projects/cpusets/
  S:    Supported
  
  CRAMFS FILESYSTEM
@@@ -1436,14 -1419,6 +1436,14 @@@ M:    kristen.c.accardi@intel.co
  L:    linux-acpi@vger.kernel.org
  S:    Supported
  
 +DOCUMENTATION (/Documentation directory)
 +P:     Michael Kerrisk
 +M:     mtk.manpages@gmail.com
 +P:     Randy Dunlap
 +M:     rdunlap@xenotime.net
 +L:     linux-doc@vger.kernel.org
 +S:     Maintained
 +
  DOUBLETALK DRIVER
  P:    James R. Van Zandt
  M:    jrv@vanzandt.mv.com
@@@ -1650,13 -1625,13 +1650,13 @@@ S:   Maintaine
  
  EXT3 FILE SYSTEM
  P:    Stephen Tweedie, Andrew Morton
 -M:    sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
 +M:    sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
  L:    linux-ext4@vger.kernel.org
  S:    Maintained
  
  EXT4 FILE SYSTEM
  P:    Stephen Tweedie, Andrew Morton
 -M:    sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
 +M:    sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
  L:    linux-ext4@vger.kernel.org
  S:    Maintained
  
@@@ -1693,13 -1668,6 +1693,13 @@@ L:    linuxppc-embedded@ozlabs.or
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  
 +FREESCALE I2C CPM DRIVER
 +P:    Jochen Friedrich
 +M:    jochen@scram.de
 +L:    linuxppc-dev@ozlabs.org
 +L:    i2c@lm-sensors.org
 +S:    Maintained
 +
  FREESCALE SOC FS_ENET DRIVER
  P:    Pantelis Antoniou
  M:    pantelis.antoniou@gmail.com
@@@ -1784,22 -1752,11 +1784,22 @@@ M:   hch@infradead.or
  W:    ftp://ftp.openlinux.org/pub/people/hch/vxfs
  S:    Maintained
  
 +FTRACE
 +P:    Steven Rostedt
 +M:    srostedt@redhat.com
 +S:    Maintained
 +
  FUJITSU FR-V (FRV) PORT
  P:    David Howells
  M:    dhowells@redhat.com
  S:    Maintained
  
 +FUJITSU LAPTOP EXTRAS
 +P:    Jonathan Woithe
 +M:    jwoithe@physics.adelaide.edu.au
 +L:    linux-acpi@vger.kernel.org
 +S:    Maintained
 +
  FUSE: FILESYSTEM IN USERSPACE
  P:    Miklos Szeredi
  M:    miklos@szeredi.hu
@@@ -1870,7 -1827,7 +1870,7 @@@ S:      Maintaine
  
  HARMONY SOUND DRIVER
  P:    Kyle McMartin
 -M:    kyle@parisc-linux.org
 +M:    kyle@mcmartin.ca
  L:    linux-parisc@vger.kernel.org
  S:    Maintained
  
@@@ -2338,16 -2295,6 +2338,16 @@@ L:    linux-mtd@lists.infradead.or
  W:    http://www.linux-mtd.infradead.org/doc/jffs2.html
  S:    Maintained
  
 +UBI FILE SYSTEM (UBIFS)
 +P:    Artem Bityutskiy
 +M:    dedekind@infradead.org
 +P:    Adrian Hunter
 +M:    ext-adrian.hunter@nokia.com
 +L:    linux-mtd@lists.infradead.org
 +T:    git git://git.infradead.org/~dedekind/ubifs-2.6.git
 +W:    http://www.linux-mtd.infradead.org/doc/ubifs.html
 +S:    Maintained
 +
  JFS FILESYSTEM
  P:    Dave Kleikamp
  M:    shaggy@austin.ibm.com
@@@ -2480,10 -2427,9 +2480,10 @@@ S:    Maintaine
  
  KS0108 LCD CONTROLLER DRIVER
  P:    Miguel Ojeda Sandonis
 -M:    maxextreme@gmail.com
 +M:    miguel.ojeda.sandonis@gmail.com
  L:    linux-kernel@vger.kernel.org
 -W:    http://auxdisplay.googlepages.com/
 +W:    http://miguelojeda.es/auxdisplay.htm
 +W:    http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
  S:    Maintained
  
  LAPB module
@@@ -2527,11 -2473,9 +2527,11 @@@ M:    James.Bottomley@HansenPartnership.co
  W:    http://www.hansenpartnership.com/voyager
  S:    Maintained
  
 -LINUX FOR POWERPC
 +LINUX FOR POWERPC (32-BIT AND 64-BIT)
  P:    Paul Mackerras
  M:    paulus@samba.org
 +P:    Benjamin Herrenschmidt
 +M:    benh@kernel.crashing.org
  W:    http://www.penguinppc.org/
  L:    linuxppc-dev@ozlabs.org
  T:    git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
@@@ -2544,11 -2488,13 +2544,11 @@@ W:   http://www.penguinppc.org
  L:    linuxppc-dev@ozlabs.org
  S:    Maintained
  
 -LINUX FOR POWERPC EMBEDDED MPC52XX
 +LINUX FOR POWERPC EMBEDDED MPC5XXX
  P:    Sylvain Munaut
  M:    tnt@246tNt.com
  P:    Grant Likely
  M:    grant.likely@secretlab.ca
 -W:    http://www.246tNt.com/mpc52xx/
 -W:    http://www.penguinppc.org/
  L:    linuxppc-dev@ozlabs.org
  S:    Maintained
  
@@@ -2569,6 -2515,13 +2569,6 @@@ W:     http://wiki.secretlab.ca/index.php/L
  L:    linuxppc-dev@ozlabs.org
  S:    Maintained
  
 -LINUX FOR POWERPC BOOT CODE
 -P:    Tom Rini
 -M:    trini@kernel.crashing.org
 -W:    http://www.penguinppc.org/
 -L:    linuxppc-dev@ozlabs.org
 -S:    Maintained
 -
  LINUX FOR POWERPC EMBEDDED PPC8XX
  P:    Vitaly Bordug
  M:    vitb@kernel.crashing.org
@@@ -2597,6 -2550,17 +2597,6 @@@ P:     Arnaldo Carvalho de Mel
  M:    acme@ghostprotocols.net
  S:    Maintained
  
 -LINUX FOR 64BIT POWERPC
 -P:    Paul Mackerras
 -M:    paulus@samba.org
 -M:    paulus@au.ibm.com
 -P:    Anton Blanchard
 -M:    anton@samba.org
 -M:    anton@au.ibm.com
 -W:    http://www.penguinppc.org/ppc64/
 -L:    linuxppc-dev@ozlabs.org
 -S:    Supported
 -
  LINUX SECURITY MODULE (LSM) FRAMEWORK
  P:    Chris Wright
  M:    chrisw@sous-sol.org
@@@ -2715,8 -2679,8 +2715,8 @@@ S:      Supporte
  MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
  P:    Michael Kerrisk
  M:    mtk.manpages@gmail.com
 -W:    ftp://ftp.kernel.org/pub/linux/docs/manpages
 -S:    Maintained
 +W:     http://www.kernel.org/doc/man-pages
 +S:     Supported
  
  MARVELL LIBERTAS WIRELESS DRIVER
  P:    Dan Williams
@@@ -2849,12 -2813,6 +2849,12 @@@ W:    https://tango.0pointer.de/mailman/li
  W:    http://0pointer.de/lennart/tchibo.html
  S:    Maintained
  
 +MULTIFUNCTION DEVICES (MFD)
 +P:    Samuel Ortiz
 +M:    sameo@openedhand.com
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +
  MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
  P:    Pierre Ossman
  M:    drzeus-mmc@drzeus.cx
@@@ -3121,8 -3079,8 +3121,8 @@@ L:      linux-scsi@vger.kernel.or
  S:    Maintained
  
  OPROFILE
 -P:    Philippe Elie
 -M:    phil.el@wanadoo.fr
 +P:    Robert Richter
 +M:    robert.richter@amd.com
  L:    oprofile-list@lists.sf.net
  S:    Maintained
  
@@@ -3162,7 -3120,7 +3162,7 @@@ S:      Maintaine
  
  PARISC ARCHITECTURE
  P:    Kyle McMartin
 -M:    kyle@parisc-linux.org
 +M:    kyle@mcmartin.ca
  P:    Matthew Wilcox
  M:    matthew@wil.cx
  P:    Grant Grundler
@@@ -3219,7 -3177,7 +3219,7 @@@ S:      Supporte
  PCIE HOTPLUG DRIVER
  P:    Kristen Carlson Accardi
  M:    kristen.c.accardi@intel.com
- L:    pcihpd-discuss@lists.sourceforge.net
+ L:    linux-pci@vger.kernel.org
  S:    Supported
  
  PCMCIA SUBSYSTEM
@@@ -3236,8 -3194,8 +3236,8 @@@ L:      netdev@vger.kernel.or
  S:    Maintained
  
  PER-TASK DELAY ACCOUNTING
 -P:    Shailabh Nagar
 -M:    nagar@watson.ibm.com
 +P:    Balbir Singh
 +M:    balbir@linux.vnet.ibm.com
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  
@@@ -3371,11 -3329,9 +3371,11 @@@ L:    video4linux-list@redhat.co
  W:    http://www.isely.net/pvrusb2/
  S:    Maintained
  
 -PXA2xx SUPPORT
 -P:    Nicolas Pitre
 -M:    nico@cam.org
 +PXA2xx/PXA3xx SUPPORT
 +P:    Eric Miao
 +M:    eric.miao@marvell.com
 +P:    Russell King
 +M:    linux@arm.linux.org.uk
  L:    linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
  S:    Maintained
  
@@@ -3561,13 -3517,6 +3561,13 @@@ L:    linux-s390@vger.kernel.or
  W:    http://www.ibm.com/developerworks/linux/linux390/
  S:    Supported
  
 +S3C24XX SD/MMC Driver
 +P:    Ben Dooks
 +M:    ben-linux@fluff.org
 +L:    linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +
  SAA7146 VIDEO4LINUX-2 DRIVER
  P:    Michael Hunold
  M:    michael@mihu.de
@@@ -3640,12 -3589,6 +3640,12 @@@ P:    Jim Cromi
  M:    jim.cromie@gmail.com
  S:    Maintained
  
 +SDRICOH_CS MMC/SD HOST CONTROLLER INTERFACE DRIVER
 +P:    Sascha Sommer
 +M:    saschasommer@freenet.de
 +L:    sdricohcs-devel@lists.sourceforge.net (subscribers-only)
 +S:    Maintained
 +
  SECURITY CONTACT
  P:    Security Officers
  M:    security@kernel.org
@@@ -3742,7 -3685,7 +3742,7 @@@ S:      Maintaine
  
  SLAB ALLOCATOR
  P:    Christoph Lameter
 -M:    clameter@sgi.com
 +M:    cl@linux-foundation.org
  P:    Pekka Enberg
  M:    penberg@cs.helsinki.fi
  P:    Matt Mackall
@@@ -3865,7 -3808,7 +3865,7 @@@ S:      Maintaine
  SHPC HOTPLUG DRIVER
  P:    Kristen Carlson Accardi
  M:    kristen.c.accardi@intel.com
- L:    pcihpd-discuss@lists.sourceforge.net
+ L:    linux-pci@vger.kernel.org
  S:    Supported
  
  SECURE DIGITAL HOST CONTROLLER INTERFACE DRIVER
@@@ -3952,8 -3895,8 +3952,8 @@@ M:      hch@infradead.or
  S:    Maintained
  
  TASKSTATS STATISTICS INTERFACE
 -P:    Shailabh Nagar
 -M:    nagar@watson.ibm.com
 +P:    Balbir Singh
 +M:    balbir@linux.vnet.ibm.com
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  
@@@ -4049,8 -3992,7 +4049,8 @@@ W:      http://www.buzzard.org.uk/toshiba
  S:    Maintained
  
  TPM DEVICE DRIVER
 -P:    Kylene Hall
 +P:     Debora Velarde
 +P:     Rajiv Andrade
  M:    tpmdd-devel@lists.sourceforge.net
  W:    http://tpmdd.sourceforge.net
  P:    Marcel Selhorst
@@@ -4081,7 -4023,7 +4081,7 @@@ TULIP NETWORK DRIVER
  P:    Grant Grundler
  M:    grundler@parisc-linux.org
  P:    Kyle McMartin
 -M:    kyle@parisc-linux.org
 +M:    kyle@mcmartin.ca
  L:    netdev@vger.kernel.org
  S:    Maintained
  
@@@ -4369,14 -4311,6 +4369,14 @@@ L:    netdev@vger.kernel.or
  W:    http://www.linux-usb.org/usbnet
  S:    Maintained
  
 +USB VIDEO CLASS
 +P:    Laurent Pinchart
 +M:    laurent.pinchart@skynet.be
 +L:    linx-uvc-devel@berlios.de
 +L:    video4linux-list@redhat.com
 +W:    http://linux-uvc.berlios.de
 +S:    Maintained
 +
  USB W996[87]CF DRIVER
  P:    Luca Risolia
  M:    luca.risolia@studio.unibo.it
@@@ -4494,10 -4428,10 +4494,10 @@@ M:   johnpol@2ka.mipt.r
  S:    Maintained
  
  W83791D HARDWARE MONITORING DRIVER
 -P:    Charles Spirakis
 -M:    bezaur@gmail.com
 +P:    Marc Hulsman
 +M:    m.hulsman@tudelft.nl
  L:    lm-sensors@lm-sensors.org
 -S:    Odd Fixes
 +S:    Maintained
  
  W83793 HARDWARE MONITORING DRIVER
  P:    Rudolf Marek
index 793ad2045f585acceb8501d5c08c86f20803f871,882e970032d5c8054df337b35b1bbd7dfe65a3d8..868de3d5c39de9144bfc42574bcb8dd0d24cca3e
@@@ -23,15 -23,6 +23,15 @@@ static unsigned long acpi_realmode
  static char temp_stack[10240];
  #endif
  
 +/* XXX: this macro should move to asm-x86/segment.h and be shared with the
 +   boot code... */
 +#define GDT_ENTRY(flags, base, limit)         \
 +      (((u64)(base & 0xff000000) << 32) |     \
 +       ((u64)flags << 40) |                   \
 +       ((u64)(limit & 0x00ff0000) << 32) |    \
 +       ((u64)(base & 0x00ffffff) << 16) |     \
 +       ((u64)(limit & 0x0000ffff)))
 +
  /**
   * acpi_save_state_mem - save kernel state
   *
@@@ -59,29 -50,6 +59,29 @@@ int acpi_save_state_mem(void
  
        header->video_mode = saved_video_mode;
  
 +      header->wakeup_jmp_seg = acpi_wakeup_address >> 4;
 +
 +      /*
 +       * Set up the wakeup GDT.  We set these up as Big Real Mode,
 +       * that is, with limits set to 4 GB.  At least the Lenovo
 +       * Thinkpad X61 is known to need this for the video BIOS
 +       * initialization quirk to work; this is likely to also
 +       * be the case for other laptops or integrated video devices.
 +       */
 +
 +      /* GDT[0]: GDT self-pointer */
 +      header->wakeup_gdt[0] =
 +              (u64)(sizeof(header->wakeup_gdt) - 1) +
 +              ((u64)(acpi_wakeup_address +
 +                      ((char *)&header->wakeup_gdt - (char *)acpi_realmode))
 +                              << 16);
 +      /* GDT[1]: big real mode-like code segment */
 +      header->wakeup_gdt[1] =
 +              GDT_ENTRY(0x809b, acpi_wakeup_address, 0xfffff);
 +      /* GDT[2]: big real mode-like data segment */
 +      header->wakeup_gdt[2] =
 +              GDT_ENTRY(0x8093, acpi_wakeup_address, 0xfffff);
 +
  #ifndef CONFIG_64BIT
        store_gdt((struct desc_ptr *)&header->pmode_gdt);
  
        saved_magic = 0x12345678;
  #else /* CONFIG_64BIT */
        header->trampoline_segment = setup_trampoline() >> 4;
 -      init_rsp = (unsigned long)temp_stack + 4096;
 +#ifdef CONFIG_SMP
 +      stack_start.sp = temp_stack + 4096;
 +#endif
        initial_code = (unsigned long)wakeup_long64;
        saved_magic = 0x123456789abcdef0;
  #endif /* CONFIG_64BIT */
@@@ -145,7 -111,7 +145,7 @@@ void __init acpi_reserve_bootmem(void
                return;
        }
  
 -      acpi_wakeup_address = acpi_realmode;
 +      acpi_wakeup_address = virt_to_phys((void *)acpi_realmode);
  }
  
  
@@@ -158,6 -124,8 +158,8 @@@ static int __init acpi_sleep_setup(cha
                        acpi_realmode_flags |= 2;
                if (strncmp(str, "s3_beep", 7) == 0)
                        acpi_realmode_flags |= 4;
+               if (strncmp(str, "old_ordering", 12) == 0)
+                       acpi_old_suspend_ordering();
                str = strchr(str, ',');
                if (str != NULL)
                        str += strspn(str, ", \t");
diff --combined arch/x86/kernel/apm_32.c
index 75cb5da4ea0ad1880d6c25f02f8b510cb5d9ac97,c1735f61a2c00e08a1cb865db361bc24023ec458..bf9b441331e9fb2f42ec1a89fcc683d48c6af839
  #include <linux/module.h>
  
  #include <linux/poll.h>
 +#include <linux/smp_lock.h>
  #include <linux/types.h>
  #include <linux/stddef.h>
  #include <linux/timer.h>
  #include <linux/suspend.h>
  #include <linux/kthread.h>
  #include <linux/jiffies.h>
 +#include <linux/smp_lock.h>
  
  #include <asm/system.h>
  #include <asm/uaccess.h>
@@@ -1151,7 -1149,7 +1151,7 @@@ static void queue_event(apm_event_t eve
                                as->event_tail = 0;
                }
                as->events[as->event_head] = event;
 -              if ((!as->suser) || (!as->writer))
 +              if (!as->suser || !as->writer)
                        continue;
                switch (event) {
                case APM_SYS_SUSPEND:
@@@ -1213,9 -1211,9 +1213,9 @@@ static int suspend(int vetoable
        if (err != APM_SUCCESS)
                apm_error("suspend", err);
        err = (err == APM_SUCCESS) ? 0 : -EIO;
-       device_power_up();
+       device_power_up(PMSG_RESUME);
        local_irq_enable();
-       device_resume();
+       device_resume(PMSG_RESUME);
        queue_event(APM_NORMAL_RESUME, NULL);
        spin_lock(&user_list_lock);
        for (as = user_list; as != NULL; as = as->next) {
@@@ -1240,7 -1238,7 +1240,7 @@@ static void standby(void
                apm_error("standby", err);
  
        local_irq_disable();
-       device_power_up();
+       device_power_up(PMSG_RESUME);
        local_irq_enable();
  }
  
@@@ -1326,7 -1324,7 +1326,7 @@@ static void check_events(void
                        ignore_bounce = 1;
                        if ((event != APM_NORMAL_RESUME)
                            || (ignore_normal_resume == 0)) {
-                               device_resume();
+                               device_resume(PMSG_RESUME);
                                queue_event(event, NULL);
                        }
                        ignore_normal_resume = 0;
@@@ -1398,7 -1396,7 +1398,7 @@@ static void apm_mainloop(void
  
  static int check_apm_user(struct apm_user *as, const char *func)
  {
 -      if ((as == NULL) || (as->magic != APM_BIOS_MAGIC)) {
 +      if (as == NULL || as->magic != APM_BIOS_MAGIC) {
                printk(KERN_ERR "apm: %s passed bad filp\n", func);
                return 1;
        }
@@@ -1461,19 -1459,18 +1461,19 @@@ static unsigned int do_poll(struct fil
        return 0;
  }
  
 -static int do_ioctl(struct inode *inode, struct file *filp,
 -                  u_int cmd, u_long arg)
 +static long do_ioctl(struct file *filp, u_int cmd, u_long arg)
  {
        struct apm_user *as;
 +      int ret;
  
        as = filp->private_data;
        if (check_apm_user(as, "ioctl"))
                return -EIO;
 -      if ((!as->suser) || (!as->writer))
 +      if (!as->suser || !as->writer)
                return -EPERM;
        switch (cmd) {
        case APM_IOC_STANDBY:
 +              lock_kernel();
                if (as->standbys_read > 0) {
                        as->standbys_read--;
                        as->standbys_pending--;
                        queue_event(APM_USER_STANDBY, as);
                if (standbys_pending <= 0)
                        standby();
 +              unlock_kernel();
                break;
        case APM_IOC_SUSPEND:
 +              lock_kernel();
                if (as->suspends_read > 0) {
                        as->suspends_read--;
                        as->suspends_pending--;
                } else
                        queue_event(APM_USER_SUSPEND, as);
                if (suspends_pending <= 0) {
 -                      return suspend(1);
 +                      ret = suspend(1);
                } else {
                        as->suspend_wait = 1;
                        wait_event_interruptible(apm_suspend_waitqueue,
                                        as->suspend_wait == 0);
 -                      return as->suspend_result;
 +                      ret = as->suspend_result;
                }
 -              break;
 +              unlock_kernel();
 +              return ret;
        default:
 -              return -EINVAL;
 +              return -ENOTTY;
        }
        return 0;
  }
@@@ -1550,12 -1544,10 +1550,12 @@@ static int do_open(struct inode *inode
  {
        struct apm_user *as;
  
 +      lock_kernel();
        as = kmalloc(sizeof(*as), GFP_KERNEL);
        if (as == NULL) {
                printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n",
                       sizeof(*as));
 +                     unlock_kernel();
                return -ENOMEM;
        }
        as->magic = APM_BIOS_MAGIC;
        user_list = as;
        spin_unlock(&user_list_lock);
        filp->private_data = as;
 +      unlock_kernel();
        return 0;
  }
  
@@@ -1869,7 -1860,7 +1869,7 @@@ static const struct file_operations apm
        .owner          = THIS_MODULE,
        .read           = do_read,
        .poll           = do_poll,
 -      .ioctl          = do_ioctl,
 +      .unlocked_ioctl = do_ioctl,
        .open           = do_open,
        .release        = do_release,
  };
index a4665f37cfc5dc9f3d3b7097c08166d061643de6,8566fea647eb6abfae9ce264ad0f5b23cce4441c..a0e11c0cc872f03b1ca9b85fd9521f19fa8a3269
@@@ -50,7 -50,7 +50,7 @@@ static void __init fix_hypertransport_c
  static void __init via_bugs(int  num, int slot, int func)
  {
  #ifdef CONFIG_GART_IOMMU
 -      if ((end_pfn > MAX_DMA32_PFN ||  force_iommu) &&
 +      if ((max_pfn > MAX_DMA32_PFN ||  force_iommu) &&
            !gart_iommu_aperture_allowed) {
                printk(KERN_INFO
                       "Looks like a VIA chipset. Disabling IOMMU."
@@@ -98,6 -98,17 +98,6 @@@ static void __init nvidia_bugs(int num
  
  }
  
 -static void __init ati_bugs(int num, int slot, int func)
 -{
 -#ifdef CONFIG_X86_IO_APIC
 -      if (timer_over_8254 == 1) {
 -              timer_over_8254 = 0;
 -              printk(KERN_INFO
 -              "ATI board detected. Disabling timer routing over 8254.\n");
 -      }
 -#endif
 -}
 -
  #define QFLAG_APPLY_ONCE      0x1
  #define QFLAG_APPLIED         0x2
  #define QFLAG_DONE            (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
@@@ -115,12 -126,25 +115,23 @@@ static struct chipset early_qrk[] __ini
          PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs },
        { PCI_VENDOR_ID_VIA, PCI_ANY_ID,
          PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs },
 -      { PCI_VENDOR_ID_ATI, PCI_ANY_ID,
 -        PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, ati_bugs },
        { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB,
          PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
        {}
  };
  
- static void __init check_dev_quirk(int num, int slot, int func)
+ /**
+  * check_dev_quirk - apply early quirks to a given PCI device
+  * @num: bus number
+  * @slot: slot number
+  * @func: PCI function
+  *
+  * Check the vendor & device ID against the early quirks table.
+  *
+  * If the device is single function, let early_quirks() know so we don't
+  * poke at this device again.
+  */
+ static int __init check_dev_quirk(int num, int slot, int func)
  {
        u16 class;
        u16 vendor;
        class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE);
  
        if (class == 0xffff)
-               return;
+               return -1; /* no class, treat as single function */
  
        vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID);
  
        type = read_pci_config_byte(num, slot, func,
                                    PCI_HEADER_TYPE);
        if (!(type & 0x80))
-               return;
+               return -1;
+       return 0;
  }
  
  void __init early_quirks(void)
        /* Poor man's PCI discovery */
        for (num = 0; num < 32; num++)
                for (slot = 0; slot < 32; slot++)
-                       for (func = 0; func < 8; func++)
-                               check_dev_quirk(num, slot, func);
+                       for (func = 0; func < 8; func++) {
+                               /* Only probe function 0 on single fn devices */
+                               if (check_dev_quirk(num, slot, func))
+                                       break;
+                       }
  }
diff --combined arch/x86/kernel/setup.c
index 36c540d4ac4b6164dbd02d6b23951ea1315f134f,6f80b852a1961a6b496bc2404c5194769557d97a..531b55b8e81a1de1827eac5691d5f8aef1d8d10c
 -#include <linux/kernel.h>
 +/*
 + *  Copyright (C) 1995  Linus Torvalds
 + *
 + *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
 + *
 + *  Memory region support
 + *    David Parsons <orc@pell.chi.il.us>, July-August 1999
 + *
 + *  Added E820 sanitization routine (removes overlapping memory regions);
 + *  Brian Moyle <bmoyle@mvista.com>, February 2001
 + *
 + * Moved CPU detection code to cpu/${cpu}.c
 + *    Patrick Mochel <mochel@osdl.org>, March 2002
 + *
 + *  Provisions for empty E820 memory regions (reported by certain BIOSes).
 + *  Alex Achenbach <xela@slit.de>, December 2002.
 + *
 + */
 +
 +/*
 + * This file handles the architecture-dependent parts of initialization
 + */
 +
 +#include <linux/sched.h>
 +#include <linux/mm.h>
 +#include <linux/mmzone.h>
 +#include <linux/screen_info.h>
 +#include <linux/ioport.h>
 +#include <linux/acpi.h>
 +#include <linux/apm_bios.h>
 +#include <linux/initrd.h>
 +#include <linux/bootmem.h>
 +#include <linux/seq_file.h>
 +#include <linux/console.h>
 +#include <linux/mca.h>
 +#include <linux/root_dev.h>
 +#include <linux/highmem.h>
  #include <linux/module.h>
 +#include <linux/efi.h>
  #include <linux/init.h>
 -#include <linux/bootmem.h>
 +#include <linux/edd.h>
 +#include <linux/iscsi_ibft.h>
 +#include <linux/nodemask.h>
 +#include <linux/kexec.h>
 +#include <linux/dmi.h>
 +#include <linux/pfn.h>
 +#include <linux/pci.h>
 +#include <asm/pci-direct.h>
 +#include <linux/init_ohci1394_dma.h>
 +#include <linux/kvm_para.h>
 +
 +#include <linux/errno.h>
 +#include <linux/kernel.h>
 +#include <linux/stddef.h>
 +#include <linux/unistd.h>
 +#include <linux/ptrace.h>
 +#include <linux/slab.h>
 +#include <linux/user.h>
 +#include <linux/delay.h>
 +#include <linux/highmem.h>
 +
 +#include <linux/kallsyms.h>
 +#include <linux/edd.h>
 +#include <linux/iscsi_ibft.h>
 +#include <linux/kexec.h>
 +#include <linux/cpufreq.h>
 +#include <linux/dma-mapping.h>
 +#include <linux/ctype.h>
 +#include <linux/uaccess.h>
 +
  #include <linux/percpu.h>
 +#include <linux/crash_dump.h>
 +
 +#include <video/edid.h>
 +
 +#include <asm/mtrr.h>
 +#include <asm/apic.h>
 +#include <asm/e820.h>
 +#include <asm/mpspec.h>
 +#include <asm/setup.h>
 +#include <asm/arch_hooks.h>
 +#include <asm/efi.h>
 +#include <asm/sections.h>
 +#include <asm/dmi.h>
 +#include <asm/io_apic.h>
 +#include <asm/ist.h>
 +#include <asm/vmi.h>
 +#include <setup_arch.h>
 +#include <asm/bios_ebda.h>
 +#include <asm/cacheflush.h>
 +#include <asm/processor.h>
 +#include <asm/bugs.h>
 +
 +#include <asm/system.h>
 +#include <asm/vsyscall.h>
  #include <asm/smp.h>
 +#include <asm/desc.h>
 +#include <asm/dma.h>
 +#include <asm/gart.h>
 +#include <asm/mmu_context.h>
 +#include <asm/proto.h>
 +
 +#include <mach_apic.h>
 +#include <asm/paravirt.h>
 +
  #include <asm/percpu.h>
  #include <asm/sections.h>
 -#include <asm/processor.h>
 -#include <asm/setup.h>
  #include <asm/topology.h>
 -#include <asm/mpspec.h>
  #include <asm/apicdef.h>
 +#ifdef CONFIG_X86_64
 +#include <asm/numa_64.h>
 +#endif
  
 -#ifdef CONFIG_X86_LOCAL_APIC
 -unsigned int num_processors;
 -unsigned disabled_cpus __cpuinitdata;
 -/* Processor that is doing the boot up */
 -unsigned int boot_cpu_physical_apicid = -1U;
 -EXPORT_SYMBOL(boot_cpu_physical_apicid);
 +#ifndef ARCH_SETUP
 +#define ARCH_SETUP
 +#endif
 +
 +#ifndef CONFIG_DEBUG_BOOT_PARAMS
 +struct boot_params __initdata boot_params;
 +#else
 +struct boot_params boot_params;
 +#endif
 +
 +/*
 + * Machine setup..
 + */
 +static struct resource data_resource = {
 +      .name   = "Kernel data",
 +      .start  = 0,
 +      .end    = 0,
 +      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
 +};
 +
 +static struct resource code_resource = {
 +      .name   = "Kernel code",
 +      .start  = 0,
 +      .end    = 0,
 +      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
 +};
 +
 +static struct resource bss_resource = {
 +      .name   = "Kernel bss",
 +      .start  = 0,
 +      .end    = 0,
 +      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
 +};
 +
 +
 +#ifdef CONFIG_X86_32
 +/* This value is set up by the early boot code to point to the value
 +   immediately after the boot time page tables.  It contains a *physical*
 +   address, and must not be in the .bss segment! */
 +unsigned long init_pg_tables_start __initdata = ~0UL;
 +unsigned long init_pg_tables_end __initdata = ~0UL;
 +
 +static struct resource video_ram_resource = {
 +      .name   = "Video RAM area",
 +      .start  = 0xa0000,
 +      .end    = 0xbffff,
 +      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
 +};
 +
 +/* cpu data as detected by the assembly code in head.S */
 +struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1};
 +/* common cpu data for all cpus */
 +struct cpuinfo_x86 boot_cpu_data __read_mostly = {0, 0, 0, 0, -1, 1, 0, 0, -1};
 +EXPORT_SYMBOL(boot_cpu_data);
 +static void set_mca_bus(int x)
 +{
 +#ifdef CONFIG_MCA
 +      MCA_bus = x;
 +#endif
 +}
 +
 +unsigned int def_to_bigsmp;
 +
 +/* for MCA, but anyone else can use it if they want */
 +unsigned int machine_id;
 +unsigned int machine_submodel_id;
 +unsigned int BIOS_revision;
 +
 +struct apm_info apm_info;
 +EXPORT_SYMBOL(apm_info);
 +
 +#if defined(CONFIG_X86_SPEEDSTEP_SMI) || \
 +      defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
 +struct ist_info ist_info;
 +EXPORT_SYMBOL(ist_info);
 +#else
 +struct ist_info ist_info;
 +#endif
 +
 +#else
 +struct cpuinfo_x86 boot_cpu_data __read_mostly;
 +EXPORT_SYMBOL(boot_cpu_data);
 +#endif
  
 -DEFINE_PER_CPU(u16, x86_cpu_to_apicid) = BAD_APICID;
 -EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid);
  
 -/* Bitmask of physically existing CPUs */
 -physid_mask_t phys_cpu_present_map;
 +#if !defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
 +unsigned long mmu_cr4_features;
 +#else
 +unsigned long mmu_cr4_features = X86_CR4_PAE;
  #endif
  
 -#if defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) && defined(CONFIG_X86_SMP)
 +/* Boot loader ID as an integer, for the benefit of proc_dointvec */
 +int bootloader_type;
 +
  /*
 - * Copy data used in early init routines from the initial arrays to the
 - * per cpu data areas.  These arrays then become expendable and the
 - * *_early_ptr's are zeroed indicating that the static arrays are gone.
 + * Early DMI memory
 + */
 +int dmi_alloc_index;
 +char dmi_alloc_data[DMI_MAX_DATA];
 +
 +/*
 + * Setup options
 + */
 +struct screen_info screen_info;
 +EXPORT_SYMBOL(screen_info);
 +struct edid_info edid_info;
 +EXPORT_SYMBOL_GPL(edid_info);
 +
 +extern int root_mountflags;
 +
 +unsigned long saved_video_mode;
 +
 +#define RAMDISK_IMAGE_START_MASK      0x07FF
 +#define RAMDISK_PROMPT_FLAG           0x8000
 +#define RAMDISK_LOAD_FLAG             0x4000
 +
 +static char __initdata command_line[COMMAND_LINE_SIZE];
 +
 +#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
 +struct edd edd;
 +#ifdef CONFIG_EDD_MODULE
 +EXPORT_SYMBOL(edd);
 +#endif
 +/**
 + * copy_edd() - Copy the BIOS EDD information
 + *              from boot_params into a safe place.
 + *
   */
 -static void __init setup_per_cpu_maps(void)
 +static inline void copy_edd(void)
 +{
 +     memcpy(edd.mbr_signature, boot_params.edd_mbr_sig_buffer,
 +          sizeof(edd.mbr_signature));
 +     memcpy(edd.edd_info, boot_params.eddbuf, sizeof(edd.edd_info));
 +     edd.mbr_signature_nr = boot_params.edd_mbr_sig_buf_entries;
 +     edd.edd_info_nr = boot_params.eddbuf_entries;
 +}
 +#else
 +static inline void copy_edd(void)
 +{
 +}
 +#endif
 +
 +#ifdef CONFIG_BLK_DEV_INITRD
 +
 +#ifdef CONFIG_X86_32
 +
 +#define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT)
 +static void __init relocate_initrd(void)
  {
 -      int cpu;
  
 -      for_each_possible_cpu(cpu) {
 -              per_cpu(x86_cpu_to_apicid, cpu) = x86_cpu_to_apicid_init[cpu];
 -              per_cpu(x86_bios_cpu_apicid, cpu) =
 -                                              x86_bios_cpu_apicid_init[cpu];
 -#ifdef CONFIG_NUMA
 -              per_cpu(x86_cpu_to_node_map, cpu) =
 -                                              x86_cpu_to_node_map_init[cpu];
 +      u64 ramdisk_image = boot_params.hdr.ramdisk_image;
 +      u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
 +      u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
 +      u64 ramdisk_here;
 +      unsigned long slop, clen, mapaddr;
 +      char *p, *q;
 +
 +      /* We need to move the initrd down into lowmem */
 +      ramdisk_here = find_e820_area(0, end_of_lowmem, ramdisk_size,
 +                                       PAGE_SIZE);
 +
 +      if (ramdisk_here == -1ULL)
 +              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 + ramdisk_size,
 +                       "NEW RAMDISK");
 +      initrd_start = ramdisk_here + PAGE_OFFSET;
 +      initrd_end   = initrd_start + ramdisk_size;
 +      printk(KERN_INFO "Allocated new RAMDISK: %08llx - %08llx\n",
 +                       ramdisk_here, ramdisk_here + ramdisk_size);
 +
 +      q = (char *)initrd_start;
 +
 +      /* Copy any lowmem portion of the initrd */
 +      if (ramdisk_image < end_of_lowmem) {
 +              clen = end_of_lowmem - ramdisk_image;
 +              p = (char *)__va(ramdisk_image);
 +              memcpy(q, p, clen);
 +              q += clen;
 +              ramdisk_image += clen;
 +              ramdisk_size  -= clen;
 +      }
 +
 +      /* Copy the highmem portion of the initrd */
 +      while (ramdisk_size) {
 +              slop = ramdisk_image & ~PAGE_MASK;
 +              clen = ramdisk_size;
 +              if (clen > MAX_MAP_CHUNK-slop)
 +                      clen = MAX_MAP_CHUNK-slop;
 +              mapaddr = ramdisk_image & PAGE_MASK;
 +              p = early_ioremap(mapaddr, clen+slop);
 +              memcpy(q, p+slop, clen);
 +              early_iounmap(p, clen+slop);
 +              q += clen;
 +              ramdisk_image += clen;
 +              ramdisk_size  -= clen;
 +      }
 +      /* high pages is not converted by early_res_to_bootmem */
 +      ramdisk_image = boot_params.hdr.ramdisk_image;
 +      ramdisk_size  = boot_params.hdr.ramdisk_size;
 +      printk(KERN_INFO "Move RAMDISK from %016llx - %016llx to"
 +              " %08llx - %08llx\n",
 +              ramdisk_image, ramdisk_image + ramdisk_size - 1,
 +              ramdisk_here, ramdisk_here + ramdisk_size - 1);
 +}
  #endif
 +
 +static void __init reserve_initrd(void)
 +{
 +      u64 ramdisk_image = boot_params.hdr.ramdisk_image;
 +      u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
 +      u64 ramdisk_end   = ramdisk_image + ramdisk_size;
 +      u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
 +
 +      if (!boot_params.hdr.type_of_loader ||
 +          !ramdisk_image || !ramdisk_size)
 +              return;         /* No initrd provided by bootloader */
 +
 +      initrd_start = 0;
 +
 +      if (ramdisk_size >= (end_of_lowmem>>1)) {
 +              free_early(ramdisk_image, ramdisk_end);
 +              printk(KERN_ERR "initrd too large to handle, "
 +                     "disabling initrd\n");
 +              return;
 +      }
 +
 +      printk(KERN_INFO "RAMDISK: %08llx - %08llx\n", ramdisk_image,
 +                      ramdisk_end);
 +
 +
 +      if (ramdisk_end <= end_of_lowmem) {
 +              /* All in lowmem, easy case */
 +              /*
 +               * don't need to reserve again, already reserved early
 +               * in i386_start_kernel
 +               */
 +              initrd_start = ramdisk_image + PAGE_OFFSET;
 +              initrd_end = initrd_start + ramdisk_size;
 +              return;
        }
  
 -      /* indicate the early static arrays will soon be gone */
 -      x86_cpu_to_apicid_early_ptr = NULL;
 -      x86_bios_cpu_apicid_early_ptr = NULL;
 -#ifdef CONFIG_NUMA
 -      x86_cpu_to_node_map_early_ptr = NULL;
 +#ifdef CONFIG_X86_32
 +      relocate_initrd();
 +#else
 +      printk(KERN_ERR "initrd extends beyond end of memory "
 +             "(0x%08llx > 0x%08llx)\ndisabling initrd\n",
 +             ramdisk_end, end_of_lowmem);
 +      initrd_start = 0;
  #endif
 +      free_early(ramdisk_image, ramdisk_end);
  }
 +#else
 +static void __init reserve_initrd(void)
 +{
 +}
 +#endif /* CONFIG_BLK_DEV_INITRD */
 +
 +static void __init parse_setup_data(void)
 +{
 +      struct setup_data *data;
 +      u64 pa_data;
 +
 +      if (boot_params.hdr.version < 0x0209)
 +              return;
 +      pa_data = boot_params.hdr.setup_data;
 +      while (pa_data) {
 +              data = early_ioremap(pa_data, PAGE_SIZE);
 +              switch (data->type) {
 +              case SETUP_E820_EXT:
 +                      parse_e820_ext(data, pa_data);
 +                      break;
 +              default:
 +                      break;
 +              }
 +              pa_data = data->next;
 +              early_iounmap(data, PAGE_SIZE);
 +      }
 +}
 +
 +static void __init e820_reserve_setup_data(void)
 +{
 +      struct setup_data *data;
 +      u64 pa_data;
 +      int found = 0;
 +
 +      if (boot_params.hdr.version < 0x0209)
 +              return;
 +      pa_data = boot_params.hdr.setup_data;
 +      while (pa_data) {
 +              data = early_ioremap(pa_data, sizeof(*data));
 +              e820_update_range(pa_data, sizeof(*data)+data->len,
 +                       E820_RAM, E820_RESERVED_KERN);
 +              found = 1;
 +              pa_data = data->next;
 +              early_iounmap(data, sizeof(*data));
 +      }
 +      if (!found)
 +              return;
  
 -#ifdef CONFIG_HAVE_CPUMASK_OF_CPU_MAP
 -cpumask_t *cpumask_of_cpu_map __read_mostly;
 -EXPORT_SYMBOL(cpumask_of_cpu_map);
 +      sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
 +      memcpy(&e820_saved, &e820, sizeof(struct e820map));
 +      printk(KERN_INFO "extended physical RAM map:\n");
 +      e820_print_map("reserve setup_data");
 +}
  
 -/* requires nr_cpu_ids to be initialized */
 -static void __init setup_cpumask_of_cpu(void)
 +static void __init reserve_early_setup_data(void)
  {
 -      int i;
 +      struct setup_data *data;
 +      u64 pa_data;
 +      char buf[32];
 +
 +      if (boot_params.hdr.version < 0x0209)
 +              return;
 +      pa_data = boot_params.hdr.setup_data;
 +      while (pa_data) {
 +              data = early_ioremap(pa_data, sizeof(*data));
 +              sprintf(buf, "setup data %x", data->type);
 +              reserve_early(pa_data, pa_data+sizeof(*data)+data->len, buf);
 +              pa_data = data->next;
 +              early_iounmap(data, sizeof(*data));
 +      }
 +}
 +
 +/*
 + * --------- Crashkernel reservation ------------------------------
 + */
 +
 +#ifdef CONFIG_KEXEC
 +
 +/**
 + * Reserve @size bytes of crashkernel memory at any suitable offset.
 + *
 + * @size: Size of the crashkernel memory to reserve.
 + * Returns the base address on success, and -1ULL on failure.
 + */
 +unsigned long long find_and_reserve_crashkernel(unsigned long long size)
 +{
 +      const unsigned long long alignment = 16<<20;    /* 16M */
 +      unsigned long long start = 0LL;
 +
 +      while (1) {
 +              int ret;
 +
 +              start = find_e820_area(start, ULONG_MAX, size, alignment);
 +              if (start == -1ULL)
 +                      return start;
 +
 +              /* try to reserve it */
 +              ret = reserve_bootmem_generic(start, size, BOOTMEM_EXCLUSIVE);
 +              if (ret >= 0)
 +                      return start;
 +
 +              start += alignment;
 +      }
 +}
 +
 +static inline unsigned long long get_total_mem(void)
 +{
 +      unsigned long long total;
 +
 +      total = max_low_pfn - min_low_pfn;
 +#ifdef CONFIG_HIGHMEM
 +      total += highend_pfn - highstart_pfn;
 +#endif
 +
 +      return total << PAGE_SHIFT;
 +}
 +
 +static void __init reserve_crashkernel(void)
 +{
 +      unsigned long long total_mem;
 +      unsigned long long crash_size, crash_base;
 +      int ret;
 +
 +      total_mem = get_total_mem();
  
 -      /* alloc_bootmem zeroes memory */
 -      cpumask_of_cpu_map = alloc_bootmem_low(sizeof(cpumask_t) * nr_cpu_ids);
 -      for (i = 0; i < nr_cpu_ids; i++)
 -              cpu_set(i, cpumask_of_cpu_map[i]);
 +      ret = parse_crashkernel(boot_command_line, total_mem,
 +                      &crash_size, &crash_base);
 +      if (ret != 0 || crash_size <= 0)
 +              return;
 +
 +      /* 0 means: find the address automatically */
 +      if (crash_base <= 0) {
 +              crash_base = find_and_reserve_crashkernel(crash_size);
 +              if (crash_base == -1ULL) {
 +                      pr_info("crashkernel reservation failed. "
 +                              "No suitable area found.\n");
 +                      return;
 +              }
 +      } else {
 +              ret = reserve_bootmem_generic(crash_base, crash_size,
 +                                      BOOTMEM_EXCLUSIVE);
 +              if (ret < 0) {
 +                      pr_info("crashkernel reservation failed - "
 +                              "memory is in use\n");
 +                      return;
 +              }
 +      }
 +
 +      printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
 +                      "for crashkernel (System RAM: %ldMB)\n",
 +                      (unsigned long)(crash_size >> 20),
 +                      (unsigned long)(crash_base >> 20),
 +                      (unsigned long)(total_mem >> 20));
 +
 +      crashk_res.start = crash_base;
 +      crashk_res.end   = crash_base + crash_size - 1;
 +      insert_resource(&iomem_resource, &crashk_res);
  }
  #else
 -static inline void setup_cpumask_of_cpu(void) { }
 +static void __init reserve_crashkernel(void)
 +{
 +}
  #endif
  
 -#ifdef CONFIG_X86_32
 -/*
 - * Great future not-so-futuristic plan: make i386 and x86_64 do it
 - * the same way
 +static struct resource standard_io_resources[] = {
 +      { .name = "dma1", .start = 0x00, .end = 0x1f,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "pic1", .start = 0x20, .end = 0x21,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "timer0", .start = 0x40, .end = 0x43,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "timer1", .start = 0x50, .end = 0x53,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "keyboard", .start = 0x60, .end = 0x60,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "keyboard", .start = 0x64, .end = 0x64,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "dma page reg", .start = 0x80, .end = 0x8f,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "pic2", .start = 0xa0, .end = 0xa1,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "dma2", .start = 0xc0, .end = 0xdf,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
 +      { .name = "fpu", .start = 0xf0, .end = 0xff,
 +              .flags = IORESOURCE_BUSY | IORESOURCE_IO }
 +};
 +
 +static void __init reserve_standard_io_resources(void)
 +{
 +      int i;
 +
 +      /* request I/O space for devices used on all i[345]86 PCs */
 +      for (i = 0; i < ARRAY_SIZE(standard_io_resources); i++)
 +              request_resource(&ioport_resource, &standard_io_resources[i]);
 +
 +}
 +
 +#ifdef CONFIG_PROC_VMCORE
 +/* elfcorehdr= specifies the location of elf core header
 + * stored by the crashed kernel. This option will be passed
 + * by kexec loader to the capture kernel.
   */
 -unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
 -EXPORT_SYMBOL(__per_cpu_offset);
 +static int __init setup_elfcorehdr(char *arg)
 +{
 +      char *end;
 +      if (!arg)
 +              return -EINVAL;
 +      elfcorehdr_addr = memparse(arg, &end);
 +      return end > arg ? 0 : -EINVAL;
 +}
 +early_param("elfcorehdr", setup_elfcorehdr);
  #endif
  
  /*
 - * Great future plan:
 - * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
 - * Always point %gs to its beginning
 + * 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
 + * for initialization.  Note, the efi init code path is determined by the
 + * global efi_enabled. This allows the same kernel image to be used on existing
 + * systems (with a traditional BIOS) as well as on EFI systems.
 + */
 +/*
 + * setup_arch - architecture-specific boot-time initializations
 + *
 + * Note: On x86_64, fixmaps are ready for use even before this is called.
   */
 -void __init setup_per_cpu_areas(void)
 +
 +void __init setup_arch(char **cmdline_p)
  {
 -      int i, highest_cpu = 0;
 -      unsigned long size;
 +#ifdef CONFIG_X86_32
 +      memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
 +      visws_early_detect();
 +      pre_setup_arch_hook();
 +      early_cpu_init();
 +#else
 +      printk(KERN_INFO "Command line: %s\n", boot_command_line);
 +#endif
  
 -#ifdef CONFIG_HOTPLUG_CPU
 -      prefill_possible_map();
 +      early_ioremap_init();
 +
 +      ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev);
 +      screen_info = boot_params.screen_info;
 +      edid_info = boot_params.edid_info;
 +#ifdef CONFIG_X86_32
 +      apm_info.bios = boot_params.apm_bios_info;
 +      ist_info = boot_params.ist_info;
 +      if (boot_params.sys_desc_table.length != 0) {
 +              set_mca_bus(boot_params.sys_desc_table.table[3] & 0x2);
 +              machine_id = boot_params.sys_desc_table.table[0];
 +              machine_submodel_id = boot_params.sys_desc_table.table[1];
 +              BIOS_revision = boot_params.sys_desc_table.table[2];
 +      }
 +#endif
 +      saved_video_mode = boot_params.hdr.vid_mode;
 +      bootloader_type = boot_params.hdr.type_of_loader;
 +
 +#ifdef CONFIG_BLK_DEV_RAM
 +      rd_image_start = boot_params.hdr.ram_size & RAMDISK_IMAGE_START_MASK;
 +      rd_prompt = ((boot_params.hdr.ram_size & RAMDISK_PROMPT_FLAG) != 0);
 +      rd_doload = ((boot_params.hdr.ram_size & RAMDISK_LOAD_FLAG) != 0);
 +#endif
 +#ifdef CONFIG_EFI
 +      if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
 +#ifdef CONFIG_X86_32
 +                   "EL32",
 +#else
 +                   "EL64",
 +#endif
 +       4)) {
 +              efi_enabled = 1;
 +              efi_reserve_early();
 +      }
  #endif
  
 -      /* Copy section for each CPU (we discard the original) */
 -      size = PERCPU_ENOUGH_ROOM;
 -      printk(KERN_INFO "PERCPU: Allocating %lu bytes of per cpu data\n",
 -                        size);
 +      ARCH_SETUP
  
 -      for_each_possible_cpu(i) {
 -              char *ptr;
 -#ifndef CONFIG_NEED_MULTIPLE_NODES
 -              ptr = alloc_bootmem_pages(size);
 +      setup_memory_map();
 +      parse_setup_data();
 +      /* update the e820_saved too */
 +      e820_reserve_setup_data();
 +
 +      copy_edd();
 +
 +      if (!boot_params.hdr.root_flags)
 +              root_mountflags &= ~MS_RDONLY;
 +      init_mm.start_code = (unsigned long) _text;
 +      init_mm.end_code = (unsigned long) _etext;
 +      init_mm.end_data = (unsigned long) _edata;
 +#ifdef CONFIG_X86_32
 +      init_mm.brk = init_pg_tables_end + PAGE_OFFSET;
  #else
 -              int node = early_cpu_to_node(i);
 -              if (!node_online(node) || !NODE_DATA(node)) {
 -                      ptr = alloc_bootmem_pages(size);
 -                      printk(KERN_INFO
 -                             "cpu %d has no node or node-local memory\n", i);
 -              }
 -              else
 -                      ptr = alloc_bootmem_pages_node(NODE_DATA(node), size);
 +      init_mm.brk = (unsigned long) &_end;
  #endif
 -              if (!ptr)
 -                      panic("Cannot allocate cpu data for CPU %d\n", i);
 +
 +      code_resource.start = virt_to_phys(_text);
 +      code_resource.end = virt_to_phys(_etext)-1;
 +      data_resource.start = virt_to_phys(_etext);
 +      data_resource.end = virt_to_phys(_edata)-1;
 +      bss_resource.start = virt_to_phys(&__bss_start);
 +      bss_resource.end = virt_to_phys(&__bss_stop)-1;
 +
  #ifdef CONFIG_X86_64
 -              cpu_pda(i)->data_offset = ptr - __per_cpu_start;
 +      early_cpu_init();
 +#endif
 +      strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
 +      *cmdline_p = command_line;
 +
 +      parse_early_param();
 +
 +      /* after early param, so could get panic from serial */
 +      reserve_early_setup_data();
 +
 +      if (acpi_mps_check()) {
 +#ifdef CONFIG_X86_LOCAL_APIC
 +              disable_apic = 1;
 +#endif
 +              clear_cpu_cap(&boot_cpu_data, X86_FEATURE_APIC);
 +      }
 +
++#ifdef CONFIG_PCI
++      if (pci_early_dump_regs)
++              early_dump_pci_devices();
++#endif
++
 +      finish_e820_parsing();
 +
 +#ifdef CONFIG_X86_32
 +      probe_roms();
 +#endif
 +
 +      /* after parse_early_param, so could debug it */
 +      insert_resource(&iomem_resource, &code_resource);
 +      insert_resource(&iomem_resource, &data_resource);
 +      insert_resource(&iomem_resource, &bss_resource);
 +
 +      if (efi_enabled)
 +              efi_init();
 +
 +#ifdef CONFIG_X86_32
 +      if (ppro_with_ram_bug()) {
 +              e820_update_range(0x70000000ULL, 0x40000ULL, E820_RAM,
 +                                E820_RESERVED);
 +              sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
 +              printk(KERN_INFO "fixed physical RAM map:\n");
 +              e820_print_map("bad_ppro");
 +      }
 +#else
 +      early_gart_iommu_check();
 +#endif
 +
 +      /*
 +       * partially used pages are not usable - thus
 +       * we are rounding upwards:
 +       */
 +      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_pfn = e820_end_of_ram_pfn();
 +
 +#ifdef CONFIG_X86_32
 +      /* max_low_pfn get updated here */
 +      find_low_pfn_range();
  #else
 -              __per_cpu_offset[i] = ptr - __per_cpu_start;
 +      num_physpages = max_pfn;
 +
 +      check_efer();
 +
 +      /* How many end-of-memory variables you have, grandma! */
 +      /* need this before calling reserve_initrd */
 +      if (max_pfn > (1UL<<(32 - PAGE_SHIFT)))
 +              max_low_pfn = e820_end_of_low_ram_pfn();
 +      else
 +              max_low_pfn = max_pfn;
 +
 +      high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1;
  #endif
 -              memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
  
 -              highest_cpu = i;
 +      /* max_pfn_mapped is updated here */
 +      max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
 +      max_pfn_mapped = max_low_pfn_mapped;
 +
 +#ifdef CONFIG_X86_64
 +      if (max_pfn > max_low_pfn) {
 +              max_pfn_mapped = init_memory_mapping(1UL<<32,
 +                                                   max_pfn<<PAGE_SHIFT);
 +              /* can we preseve max_low_pfn ?*/
 +              max_low_pfn = max_pfn;
        }
 +#endif
  
 -      nr_cpu_ids = highest_cpu + 1;
 -      printk(KERN_DEBUG "NR_CPUS: %d, nr_cpu_ids: %d\n", NR_CPUS, nr_cpu_ids);
 +      /*
 +       * NOTE: On x86-32, only from this point on, fixmaps are ready for use.
 +       */
  
 -      /* Setup percpu data maps */
 -      setup_per_cpu_maps();
 +#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
 +      if (init_ohci1394_dma_early)
 +              init_ohci1394_dma_on_all_controllers();
 +#endif
  
 -      /* Setup cpumask_of_cpu map */
 -      setup_cpumask_of_cpu();
 -}
 +      reserve_initrd();
 +
 +#ifdef CONFIG_X86_64
 +      vsmp_init();
 +#endif
 +
 +      dmi_scan_machine();
 +
 +      io_delay_init();
 +
 +      /*
 +       * Parse the ACPI tables for possible boot-time SMP configuration.
 +       */
 +      acpi_boot_table_init();
 +
 +#ifdef CONFIG_ACPI_NUMA
 +      /*
 +       * Parse SRAT to discover nodes.
 +       */
 +      acpi_numa_init();
 +#endif
 +
 +      initmem_init(0, max_pfn);
 +
 +#ifdef CONFIG_X86_64
 +      dma32_reserve_bootmem();
 +#endif
 +
 +#ifdef CONFIG_ACPI_SLEEP
 +      /*
 +       * Reserve low memory region for sleep support.
 +       */
 +      acpi_reserve_bootmem();
 +#endif
 +#ifdef CONFIG_X86_FIND_SMP_CONFIG
 +      /*
 +       * Find and reserve possible boot-time SMP configuration:
 +       */
 +      find_smp_config();
 +#endif
 +      reserve_crashkernel();
 +
 +      reserve_ibft_region();
 +
 +#ifdef CONFIG_KVM_CLOCK
 +      kvmclock_init();
 +#endif
 +
 +#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
 +      /*
 +       * Must be after max_low_pfn is determined, and before kernel
 +       * pagetables are setup.
 +       */
 +      vmi_init();
 +#endif
 +
 +      paging_init();
 +
 +#ifdef CONFIG_X86_64
 +      map_vsyscall();
 +#endif
 +
 +#ifdef CONFIG_X86_GENERICARCH
 +      generic_apic_probe();
 +#endif
 +
 +      early_quirks();
 +
 +      /*
 +       * Read APIC and some other early information from ACPI tables.
 +       */
 +      acpi_boot_init();
 +
 +#if defined(CONFIG_X86_MPPARSE) || defined(CONFIG_X86_VISWS)
 +      /*
 +       * get boot-time SMP configuration:
 +       */
 +      if (smp_found_config)
 +              get_smp_config();
 +#endif
  
 +      prefill_possible_map();
 +#ifdef CONFIG_X86_64
 +      init_cpu_to_node();
 +#endif
 +
 +#ifdef CONFIG_X86_NUMAQ
 +      /*
 +       * need to check online nodes num, call it
 +       * here before time_init/tsc_init
 +       */
 +      numaq_tsc_disable();
 +#endif
 +
 +      init_apic_mappings();
 +      ioapic_init_mappings();
 +
 +#if defined(CONFIG_SMP) && defined(CONFIG_X86_PC) && defined(CONFIG_X86_32)
 +      if (def_to_bigsmp)
 +              printk(KERN_WARNING "More than 8 CPUs detected and "
 +                      "CONFIG_X86_PC cannot handle it.\nUse "
 +                      "CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");
 +#endif
 +      kvm_guest_init();
 +
 +      e820_reserve_resources();
 +      e820_mark_nosave_regions(max_low_pfn);
 +
 +#ifdef CONFIG_X86_32
 +      request_resource(&iomem_resource, &video_ram_resource);
 +#endif
 +      reserve_standard_io_resources();
 +
 +      e820_setup_gap();
 +
 +#ifdef CONFIG_VT
 +#if defined(CONFIG_VGA_CONSOLE)
 +      if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
 +              conswitchp = &vga_con;
 +#elif defined(CONFIG_DUMMY_CONSOLE)
 +      conswitchp = &dummy_con;
  #endif
 +#endif
 +}
diff --combined arch/x86/pci/common.c
index 20b9f59f95df85203009cce11d688f2510cbeab3,86aff81a08290dde5437b3179098c7e004ea4086..b67732bbb85a3a562063c36e579ee769ccdf86c1
@@@ -20,6 -20,7 +20,7 @@@
  unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 |
                                PCI_PROBE_MMCONF;
  
+ unsigned int pci_early_dump_regs;
  static int pci_bf_sort;
  int pci_routeirq;
  int pcibios_last_bus = -1;
@@@ -31,7 -32,7 +32,7 @@@ struct pci_raw_ops *raw_pci_ext_ops
  int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn,
                                                int reg, int len, u32 *val)
  {
-       if (reg < 256 && raw_pci_ops)
+       if (domain == 0 && reg < 256 && raw_pci_ops)
                return raw_pci_ops->read(domain, bus, devfn, reg, len, val);
        if (raw_pci_ext_ops)
                return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val);
@@@ -41,7 -42,7 +42,7 @@@
  int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn,
                                                int reg, int len, u32 val)
  {
-       if (reg < 256 && raw_pci_ops)
+       if (domain == 0 && reg < 256 && raw_pci_ops)
                return raw_pci_ops->write(domain, bus, devfn, reg, len, val);
        if (raw_pci_ext_ops)
                return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val);
@@@ -121,6 -122,21 +122,21 @@@ void __init dmi_check_skip_isa_align(vo
        dmi_check_system(can_skip_pciprobe_dmi_table);
  }
  
+ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
+ {
+       struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE];
+       if (pci_probe & PCI_NOASSIGN_ROMS) {
+               if (rom_r->parent)
+                       return;
+               if (rom_r->start) {
+                       /* we deal with BIOS assigned ROM later */
+                       return;
+               }
+               rom_r->start = rom_r->end = rom_r->flags = 0;
+       }
+ }
  /*
   *  Called after each bus is probed, but before its children
   *  are examined.
  
  void __devinit  pcibios_fixup_bus(struct pci_bus *b)
  {
+       struct pci_dev *dev;
        pci_read_bridge_bases(b);
+       list_for_each_entry(dev, &b->devices, bus_list)
+               pcibios_fixup_device_resources(dev);
  }
  
  /*
@@@ -384,7 -404,7 +404,7 @@@ struct pci_bus * __devinit pcibios_scan
  
  extern u8 pci_cache_line_size;
  
 -static int __init pcibios_init(void)
 +int __init pcibios_init(void)
  {
        struct cpuinfo_x86 *c = &boot_cpu_data;
  
        return 0;
  }
  
 -subsys_initcall(pcibios_init);
 -
  char * __devinit  pcibios_setup(char *str)
  {
        if (!strcmp(str, "off")) {
        else if (!strcmp(str, "rom")) {
                pci_probe |= PCI_ASSIGN_ROMS;
                return NULL;
+       } else if (!strcmp(str, "norom")) {
+               pci_probe |= PCI_NOASSIGN_ROMS;
+               return NULL;
        } else if (!strcmp(str, "assign-busses")) {
                pci_probe |= PCI_ASSIGN_ALL_BUSSES;
                return NULL;
        } else if (!strcmp(str, "use_crs")) {
                pci_probe |= PCI_USE__CRS;
                return NULL;
+       } else if (!strcmp(str, "earlydump")) {
+               pci_early_dump_regs = 1;
+               return NULL;
        } else if (!strcmp(str, "routeirq")) {
                pci_routeirq = 1;
                return NULL;
diff --combined arch/x86/pci/irq.c
index dc568c6b83f8b5a5203bc0452c06427ae9b97b2a,c422e10337be779f2841f14e9b8f7ace8798aa37..6a06a2eb05973c5e2f129de7a9d1bbcdefc6564a
@@@ -45,7 -45,8 +45,8 @@@ struct irq_router 
        char *name;
        u16 vendor, device;
        int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq);
-       int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new);
+       int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq,
+               int new);
  };
  
  struct irq_router_handler {
@@@ -77,7 -78,8 +78,8 @@@ static inline struct irq_routing_table 
        for (i = 0; i < rt->size; i++)
                sum += addr[i];
        if (!sum) {
-               DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", rt);
+               DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n",
+                       rt);
                return rt;
        }
        return NULL;
@@@ -100,7 -102,8 +102,7 @@@ static struct irq_routing_table * __ini
                        return rt;
                printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n");
        }
 -      for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000);
 -              addr += 16) {
 +      for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) {
                rt = pirq_check_routing_table(addr);
                if (rt)
                        return rt;
@@@ -122,14 -125,17 +124,14 @@@ static void __init pirq_peer_trick(void
        struct irq_info *e;
  
        memset(busmap, 0, sizeof(busmap));
 -      for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) /
 -              sizeof(struct irq_info); i++) {
 +      for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
                e = &rt->slots[i];
  #ifdef DEBUG
                {
                        int j;
 -                      DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus,
 -                              e->devfn/8, e->slot);
 +                      DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot);
                        for (j = 0; j < 4; j++)
 -                              DBG(" %d:%02x/%04x", j, e->irq[j].link,
 -                                      e->irq[j].bitmap);
 +                              DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap);
                        DBG("\n");
                }
  #endif
@@@ -174,7 -180,8 +176,7 @@@ void eisa_set_level_irq(unsigned int ir
   * Common IRQ routing practice: nibbles in config space,
   * offset by some magic constant.
   */
 -static unsigned int
 -read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
 +static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
  {
        u8 x;
        unsigned reg = offset + (nr >> 1);
        return (nr & 1) ? (x >> 4) : (x & 0xf);
  }
  
- static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val)
+ static void write_config_nybble(struct pci_dev *router, unsigned offset,
+       unsigned nr, unsigned int val)
  {
        u8 x;
        unsigned reg = offset + (nr >> 1);
   */
  static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
  {
 -      static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1,
 -              11, 0, 12, 0, 14, 0, 15 };
 +      static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
  
        WARN_ON_ONCE(pirq > 16);
        return irqmap[read_config_nybble(router, 0x48, pirq-1)];
  }
  
 -static int
 -pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
 -      static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1,
 -              3, 9, 11, 0, 13, 15 };
 +      static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
        unsigned int val = irqmap[irq];
  
        WARN_ON_ONCE(pirq > 16);
@@@ -231,7 -242,8 +234,7 @@@ static int pirq_piix_get(struct pci_de
        return (x < 16) ? x : 0;
  }
  
 -static int
 -pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        pci_write_config_byte(router, pirq, irq);
        return 1;
@@@ -247,7 -259,8 +250,7 @@@ static int pirq_via_get(struct pci_dev 
        return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
  }
  
 -static int
 -pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
        return 1;
   * but without the ugly irq number munging.
   * However, for 82C586, nibble map is different .
   */
 -static int
 -pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
 +static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
  {
        static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
  
        return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
  }
  
 -static int
 -pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
  
@@@ -288,7 -303,8 +291,7 @@@ static int pirq_ite_get(struct pci_dev 
        return read_config_nybble(router, 0x43, pirqmap[pirq-1]);
  }
  
 -static int
 -pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
  
@@@ -306,7 -322,8 +309,7 @@@ static int pirq_opti_get(struct pci_de
        return read_config_nybble(router, 0xb8, pirq >> 4);
  }
  
 -static int
 -pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        write_config_nybble(router, 0xb8, pirq >> 4, irq);
        return 1;
@@@ -322,7 -339,8 +325,7 @@@ static int pirq_cyrix_get(struct pci_de
        return read_config_nybble(router, 0x5C, (pirq-1)^1);
  }
  
 -static int
 -pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
        return 1;
@@@ -405,7 -423,8 +408,7 @@@ static int pirq_sis_get(struct pci_dev 
        return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK);
  }
  
 -static int
 -pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        u8 x;
        int reg;
@@@ -439,7 -458,8 +442,7 @@@ static int pirq_vlsi_get(struct pci_de
        return read_config_nybble(router, 0x74, pirq-1);
  }
  
 -static int
 -pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        WARN_ON_ONCE(pirq >= 9);
        if (pirq > 8) {
   * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1,
   * and 0x03 for SMBus.
   */
 -static int
 -pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
 +static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
  {
        outb(pirq, 0xc00);
        return inb(0xc01) & 0xf;
  }
  
- static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
+ static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev,
+       int pirq, int irq)
  {
        outb(pirq, 0xc00);
        outb(irq, 0xc01);
   * offset 0x56 0-3 PIRQA  4-7  PIRQB
   * offset 0x57 0-3 PIRQC  4-7  PIRQD
   */
 -static int
 -pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
 +static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
  {
        u8 irq;
        irq = 0;
        if (pirq <= 4)
                irq = read_config_nybble(router, 0x56, pirq - 1);
 -      printk(KERN_INFO
 -              "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n",
 +      printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n",
                dev->vendor, dev->device, pirq, irq);
        return irq;
  }
  
 -static int
 -pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
 -      printk(KERN_INFO
 -              "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n",
 +      printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n",
                dev->vendor, dev->device, pirq, irq);
        if (pirq <= 4)
                write_config_nybble(router, 0x56, pirq - 1, irq);
@@@ -524,7 -550,8 +528,7 @@@ static int pirq_pico_set(struct pci_de
  
  #ifdef CONFIG_PCI_BIOS
  
 -static int
 -pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
 +static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
  {
        struct pci_dev *bridge;
        int pin = pci_get_interrupt_pin(dev, &bridge);
  
  #endif
  
 -static __init int
 -intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        static struct pci_device_id __initdata pirq_440gx[] = {
 -              { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
 -                      PCI_DEVICE_ID_INTEL_82443GX_0) },
 -              { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
 -                      PCI_DEVICE_ID_INTEL_82443GX_2) },
 +              { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) },
 +              { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) },
                { },
        };
  
@@@ -647,7 -677,8 +651,7 @@@ static __init int via_router_probe(stru
        return 0;
  }
  
 -static __init int
 -vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_VLSI_82C534:
  }
  
  
- static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
+ static __init int serverworks_router_probe(struct irq_router *r,
+               struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_SERVERWORKS_OSB4:
        return 0;
  }
  
 -static __init int
 -sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        if (device != PCI_DEVICE_ID_SI_503)
                return 0;
        return 1;
  }
  
 -static __init int
 -cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_CYRIX_5520:
        return 0;
  }
  
 -static __init int
 -opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_OPTI_82C700:
        return 0;
  }
  
 -static __init int
 -ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_ITE_IT8330G_0:
        return 0;
  }
  
 -static __init int
 -ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_AL_M1533:
        return 0;
  }
  
 -static __init int
 -amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_AMD_VIPER_740B:
        return 1;
  }
  
 -static __init int
 -pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
 +static __init int pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
  {
        switch (device) {
        case PCI_DEVICE_ID_PICOPOWER_PT86C523:
@@@ -827,10 -866,12 +832,12 @@@ static void __init pirq_find_router(str
  
        for (h = pirq_routers; h->vendor; h++) {
                /* First look for a router match */
-               if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device))
+               if (rt->rtr_vendor == h->vendor &&
+                       h->probe(r, pirq_router_dev, rt->rtr_device))
                        break;
                /* Fall back to a device match */
-               if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device))
+               if (pirq_router_dev->vendor == h->vendor &&
+                       h->probe(r, pirq_router_dev, pirq_router_dev->device))
                        break;
        }
        printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n",
  static struct irq_info *pirq_get_info(struct pci_dev *dev)
  {
        struct irq_routing_table *rt = pirq_table;
-       int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info);
+       int entries = (rt->size - sizeof(struct irq_routing_table)) /
+               sizeof(struct irq_info);
        struct irq_info *info;
  
        for (info = rt->slots; entries--; info++)
-               if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn))
+               if (info->bus == dev->bus->number &&
+                       PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn))
                        return info;
        return NULL;
  }
@@@ -890,7 -933,8 +899,8 @@@ static int pcibios_lookup_irq(struct pc
                DBG(" -> not routed\n" KERN_DEBUG);
                return 0;
        }
-       DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs);
+       DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask,
+               pirq_table->exclusive_irqs);
        mask &= pcibios_irq_mask;
  
        /* Work around broken HP Pavilion Notebooks which assign USB to
        }
  
        /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */
-       if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) {
+       if (acer_tm360_irqrouting && dev->irq == 11 &&
+               dev->vendor == PCI_VENDOR_ID_O2) {
                pirq = 0x68;
                mask = 0x400;
                dev->irq = r->get(pirq_router_dev, dev, pirq);
                        newirq = 0;
                else
                        printk("\n" KERN_WARNING
-                       "PCI: IRQ %i for device %s doesn't match PIRQ mask "
-                       "- try pci=usepirqmask\n" KERN_DEBUG, newirq,
-                       pci_name(dev));
+                               "PCI: IRQ %i for device %s doesn't match PIRQ mask - try pci=usepirqmask\n"
+                               KERN_DEBUG, newirq,
+                               pci_name(dev));
        }
        if (!newirq && assign) {
                for (i = 0; i < 16; i++) {
                        if (!(mask & (1 << i)))
                                continue;
-                       if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, IRQF_SHARED))
+                       if (pirq_penalty[i] < pirq_penalty[newirq] &&
+                               can_request_irq(i, IRQF_SHARED))
                                newirq = i;
                }
        }
                DBG(" -> got IRQ %d\n", irq);
                msg = "Found";
                eisa_set_level_irq(irq);
-       } else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
+       } else if (newirq && r->set &&
+               (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
                DBG(" -> assigning IRQ %d", newirq);
                if (r->set(pirq_router_dev, dev, pirq, newirq)) {
                        eisa_set_level_irq(newirq);
                } else
                        return 0;
        }
-       printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev));
+       printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq,
+               pci_name(dev));
  
        /* Update IRQ for all devices with the same pirq value */
        while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) {
                if (!info)
                        continue;
                if (info->irq[pin].link == pirq) {
-                       /* We refuse to override the dev->irq information. Give a warning! */
+                       /*
+                        * We refuse to override the dev->irq
+                        * information. Give a warning!
+                        */
                        if (dev2->irq && dev2->irq != irq && \
                        (!(pci_probe & PCI_USE_PIRQ_MASK) || \
                        ((1 << dev2->irq) & mask))) {
  #ifndef CONFIG_PCI_MSI
 -                              printk(KERN_INFO
 -                                      "IRQ routing conflict for %s, have irq %d, want irq %d\n",
 -                                      pci_name(dev2), dev2->irq, irq);
 +                              printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
 +                                     pci_name(dev2), dev2->irq, irq);
  #endif
                                continue;
                        }
                        dev2->irq = irq;
                        pirq_penalty[irq]++;
                        if (dev != dev2)
-                               printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2));
+                               printk(KERN_INFO
+                                       "PCI: Sharing IRQ %d with %s\n",
+                                       irq, pci_name(dev2));
                }
        }
        return 1;
@@@ -1001,15 -1055,21 +1020,21 @@@ static void __init pcibios_fixup_irqs(v
        DBG(KERN_DEBUG "PCI: IRQ fixup\n");
        while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
                /*
-                * If the BIOS has set an out of range IRQ number, just ignore it.
-                * Also keep track of which IRQ's are already in use.
+                * If the BIOS has set an out of range IRQ number, just
+                * ignore it.  Also keep track of which IRQ's are
+                * already in use.
                 */
                if (dev->irq >= 16) {
-                       DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq);
+                       DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n",
+                               pci_name(dev), dev->irq);
                        dev->irq = 0;
                }
-               /* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */
-               if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000)
+               /*
+                * If the IRQ is already assigned to a PCI device,
+                * ignore its ISA use penalty
+                */
+               if (pirq_penalty[dev->irq] >= 100 &&
+                               pirq_penalty[dev->irq] < 100000)
                        pirq_penalty[dev->irq] = 0;
                pirq_penalty[dev->irq]++;
        }
                        int irq;
  
                        if (pin) {
-                               pin--;          /* interrupt pins are numbered starting from 1 */
-                               irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
+                               /*
+                                * interrupt pins are numbered starting
+                                * from 1
+                                */
+                               pin--;
+                               irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
+                                       PCI_SLOT(dev->devfn), pin);
        /*
         * Busses behind bridges are typically not listed in the MP-table.
         * In this case we have to look up the IRQ based on the parent bus,
         * parent slot, and pin number. The SMP code detects such bridged
         * busses itself so we should get into this branch reliably.
         */
 -                              if (irq < 0 && dev->bus->parent) {
 -                                      /* go back to the bridge */
 +                              if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
                                        struct pci_dev *bridge = dev->bus->self;
  
                                        pin = (pin + PCI_SLOT(dev->devfn)) % 4;
                                        irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
 -                                                      PCI_SLOT(bridge->devfn),
 -                                                      pin);
 +                                                      PCI_SLOT(bridge->devfn), pin);
                                        if (irq >= 0)
 -                                              printk(KERN_WARNING
 -                                                      "PCI: using PPB %s[%c] to get irq %d\n",
 -                                                      pci_name(bridge),
 -                                                      'A' + pin, irq);
 +                                              printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
 +                                                      pci_name(bridge), 'A' + pin, irq);
                                }
                                if (irq >= 0) {
 -                                      printk(KERN_INFO
 -                                              "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
 +                                      printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
                                                pci_name(dev), 'A' + pin, irq);
                                        dev->irq = irq;
                                }
@@@ -1067,7 -1137,8 +1097,8 @@@ static int __init fix_broken_hp_bios_ir
  {
        if (!broken_hp_bios_irq9) {
                broken_hp_bios_irq9 = 1;
-               printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
+               printk(KERN_INFO "%s detected - fixing broken IRQ routing\n",
+                       d->ident);
        }
        return 0;
  }
@@@ -1080,7 -1151,8 +1111,8 @@@ static int __init fix_acer_tm360_irqrou
  {
        if (!acer_tm360_irqrouting) {
                acer_tm360_irqrouting = 1;
-               printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
+               printk(KERN_INFO "%s detected - fixing broken IRQ routing\n",
+                       d->ident);
        }
        return 0;
  }
@@@ -1092,7 -1164,8 +1124,8 @@@ static struct dmi_system_id __initdata 
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
                        DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"),
-                       DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION,
+                               "HP Pavilion Notebook Model GE"),
                        DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
                },
        },
        { }
  };
  
 -static int __init pcibios_irq_init(void)
 +int __init pcibios_irq_init(void)
  {
        DBG(KERN_DEBUG "PCI: IRQ init\n");
  
                                if (!(pirq_table->exclusive_irqs & (1 << i)))
                                        pirq_penalty[i] += 100;
                }
-               /* If we're using the I/O APIC, avoid using the PCI IRQ routing table */
+               /*
+                * If we're using the I/O APIC, avoid using the PCI IRQ
+                * routing table
+                */
                if (io_apic_assign_pci_irqs)
                        pirq_table = NULL;
        }
        return 0;
  }
  
 -subsys_initcall(pcibios_irq_init);
 -
 -
  static void pirq_penalize_isa_irq(int irq, int active)
  {
        /*
@@@ -1175,33 -1254,40 +1211,36 @@@ static int pirq_enable_irq(struct pci_d
        if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
                char *msg = "";
  
-               pin--;          /* interrupt pins are numbered starting from 1 */
+               pin--; /* interrupt pins are numbered starting from 1 */
  
                if (io_apic_assign_pci_irqs) {
                        int irq;
  
 -                      irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
 -                              PCI_SLOT(dev->devfn), pin);
 +                      irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
                        /*
 -                       * Busses behind bridges are typically not
 -                       * listed in the MP-table.  In this case we have
 -                       * to look up the IRQ based on the parent bus,
 -                       * parent slot, and pin number. The SMP code
 -                       * detects such bridged busses itself so we
 -                       * should get into this branch reliably.
 +                       * Busses behind bridges are typically not listed in the MP-table.
 +                       * In this case we have to look up the IRQ based on the parent bus,
 +                       * parent slot, and pin number. The SMP code detects such bridged
 +                       * busses itself so we should get into this branch reliably.
                         */
                        temp_dev = dev;
 -                      while (irq < 0 && dev->bus->parent) {
 -                              /* go back to the bridge */
 +                      while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
                                struct pci_dev *bridge = dev->bus->self;
  
                                pin = (pin + PCI_SLOT(dev->devfn)) % 4;
                                irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
                                                PCI_SLOT(bridge->devfn), pin);
                                if (irq >= 0)
-                                       printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
-                                               pci_name(bridge), 'A' + pin, irq);
+                                       printk(KERN_WARNING
+                                               "PCI: using PPB %s[%c] to get irq %d\n",
+                                               pci_name(bridge),
+                                               'A' + pin, irq);
                                dev = bridge;
                        }
                        dev = temp_dev;
                        if (irq >= 0) {
-                               printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
+                               printk(KERN_INFO
+                                       "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
                                        pci_name(dev), 'A' + pin, irq);
                                dev->irq = irq;
                                return 0;
                else
                        msg = " Please try using pci=biosirq.";
  
-               /* With IDE legacy devices the IRQ lookup failure is not a problem.. */
-               if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5))
+               /*
+                * With IDE legacy devices the IRQ lookup failure is not
+                * a problem..
+                */
+               if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
+                               !(dev->class & 0x5))
                        return 0;
  
-               printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
-                      'A' + pin, pci_name(dev), msg);
+               printk(KERN_WARNING
+                       "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
+                       'A' + pin, pci_name(dev), msg);
        }
        return 0;
  }
diff --combined arch/x86/pci/pci.h
index b2270a55b0cf48ed934913d48a6c297cee38e1c8,291dafec07b703026e500ab07d7b1e9645d217a9..3e25deb821ac9152feb484db2414565c541f18de
@@@ -27,7 -27,7 +27,8 @@@
  #define PCI_CAN_SKIP_ISA_ALIGN        0x8000
  #define PCI_USE__CRS          0x10000
  #define PCI_CHECK_ENABLE_AMD_MMCONF   0x20000
 -#define PCI_NOASSIGN_ROMS     0x40000
 +#define PCI_HAS_IO_ECS                0x40000
++#define PCI_NOASSIGN_ROMS     0x80000
  
  extern unsigned int pci_probe;
  extern unsigned long pirq_table_addr;
@@@ -39,6 -39,9 +40,6 @@@ enum pci_bf_sort_state 
        pci_dmi_bf,
  };
  
 -extern void __init dmi_check_pciprobe(void);
 -extern void __init dmi_check_skip_isa_align(void);
 -
  /* pci-i386.c */
  
  extern unsigned int pcibios_max_latency;
@@@ -96,19 -99,10 +97,19 @@@ extern struct pci_raw_ops *raw_pci_ext_
  
  extern struct pci_raw_ops pci_direct_conf1;
  
 +/* arch_initcall level */
  extern int pci_direct_probe(void);
  extern void pci_direct_init(int type);
  extern void pci_pcbios_init(void);
  extern int pci_olpc_init(void);
 +extern void __init dmi_check_pciprobe(void);
 +extern void __init dmi_check_skip_isa_align(void);
 +
 +/* some common used subsys_initcalls */
 +extern int __init pci_acpi_init(void);
 +extern int __init pcibios_irq_init(void);
 +extern int __init pci_numa_init(void);
 +extern int __init pcibios_init(void);
  
  /* pci-mmconfig.c */
  
diff --combined drivers/acpi/Kconfig
index bba867391a85bff4c08f9e61632026084cf59cea,250d41a24f78df7c1237bc177498d3cab49c23d5..735f5ea17473152fc9560a49f15de97cb1dd71b4
@@@ -4,6 -4,8 +4,6 @@@
  
  menuconfig ACPI
        bool "ACPI (Advanced Configuration and Power Interface) Support"
 -      depends on !X86_NUMAQ
 -      depends on !X86_VISWS
        depends on !IA64_HP_SIM
        depends on IA64 || X86
        depends on PCI
@@@ -336,6 -338,15 +336,15 @@@ config ACPI_E
          the battery and thermal drivers.  If you are compiling for a 
          mobile system, say Y.
  
+ config ACPI_PCI_SLOT
+       tristate "PCI slot detection driver"
+       default n
+       help
+         This driver will attempt to discover all PCI slots in your system,
+         and creates entries in /sys/bus/pci/slots/. This feature can
+         help you correlate PCI bus addresses with the physical geography
+         of your slots. If you are unsure, say N.
  config ACPI_POWER
        bool
        default y
diff --combined drivers/acpi/Makefile
index 4efbe598c817cfdeb58b8c41a4e67a33a08623c5,579c29c0665f82e01c76a91ee8c505fedb88cc0b..52a4cd4b81d0735e916f4ab6ce037265106c27d5
@@@ -21,7 -21,7 +21,7 @@@ obj-$(CONFIG_X86)             += blacklist.
  #
  # ACPI Core Subsystem (Interpreter)
  #
 -obj-y                         += osl.o utils.o \
 +obj-y                         += osl.o utils.o reboot.o\
                                   dispatcher/ events/ executer/ hardware/ \
                                   namespace/ parser/ resources/ tables/ \
                                   utilities/
@@@ -48,6 -48,7 +48,7 @@@ obj-$(CONFIG_ACPI_DOCK)               += dock.
  obj-$(CONFIG_ACPI_BAY)                += bay.o
  obj-$(CONFIG_ACPI_VIDEO)      += video.o
  obj-y                         += pci_root.o pci_link.o pci_irq.o pci_bind.o
+ obj-$(CONFIG_ACPI_PCI_SLOT)   += pci_slot.o
  obj-$(CONFIG_ACPI_POWER)      += power.o
  obj-$(CONFIG_ACPI_PROCESSOR)  += processor.o
  obj-$(CONFIG_ACPI_CONTAINER)  += container.o
diff --combined drivers/acpi/bus.c
index afb34387d5f284b02709448b70beeb199587e1d4,fc1110d6a0787a5d2da8e85b0fe3b9e7b15c6fa8..ccae305ee55dcb554c441d908c20b43d509b3709
@@@ -295,6 -295,28 +295,28 @@@ int acpi_bus_set_power(acpi_handle hand
  
  EXPORT_SYMBOL(acpi_bus_set_power);
  
+ bool acpi_bus_power_manageable(acpi_handle handle)
+ {
+       struct acpi_device *device;
+       int result;
+       result = acpi_bus_get_device(handle, &device);
+       return result ? false : device->flags.power_manageable;
+ }
+ EXPORT_SYMBOL(acpi_bus_power_manageable);
+ bool acpi_bus_can_wakeup(acpi_handle handle)
+ {
+       struct acpi_device *device;
+       int result;
+       result = acpi_bus_get_device(handle, &device);
+       return result ? false : device->wakeup.flags.valid;
+ }
+ EXPORT_SYMBOL(acpi_bus_can_wakeup);
  /* --------------------------------------------------------------------------
                                  Event Management
     -------------------------------------------------------------------------- */
@@@ -612,7 -634,7 +634,7 @@@ static int __init acpi_bus_init_irq(voi
        return 0;
  }
  
 -acpi_native_uint acpi_gbl_permanent_mmap;
 +u8 acpi_gbl_permanent_mmap;
  
  
  void __init acpi_early_init(void)
diff --combined drivers/acpi/glue.c
index 6d18ca34b6aa737f49deeca27982252ad1d3d076,87c5d456e180fa27d130fee74ec19c967a851d70..0f2dd81736bda796c8ace56f1f216edca65f88fd
@@@ -166,6 -166,8 +166,8 @@@ static int acpi_bind_one(struct device 
                                "firmware_node");
                ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj,
                                "physical_node");
+               if (acpi_dev->wakeup.flags.valid)
+                       device_set_wakeup_capable(dev, true);
        }
  
        return 0;
@@@ -272,12 -274,6 +274,12 @@@ static u32 rtc_handler(void *context
  static inline void rtc_wake_setup(void)
  {
        acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL);
 +      /*
 +       * After the RTC handler is installed, the Fixed_RTC event should
 +       * be disabled. Only when the RTC alarm is set will it be enabled.
 +       */
 +      acpi_clear_event(ACPI_EVENT_RTC);
 +      acpi_disable_event(ACPI_EVENT_RTC, 0);
  }
  
  static void rtc_wake_on(struct device *dev)
@@@ -333,12 -329,6 +335,12 @@@ static int __init acpi_rtc_init(void
  {
        struct device *dev = get_rtc_dev();
  
 +      if (acpi_disabled)
 +              return 0;
 +
 +      if (acpi_disabled)
 +              return 0;
 +
        if (dev) {
                rtc_wake_setup();
                rtc_info.wake_on = rtc_wake_on;
diff --combined drivers/acpi/scan.c
index 5b049cd795530a683393d1bca044ba6aa20498e4,f276890cfde7924767cd555d584e1d960269cf86..f3132aa47a69d7b0656d9fe4fa40e9c5a9f8edcf
@@@ -6,8 -6,6 +6,8 @@@
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/acpi.h>
 +#include <linux/signal.h>
 +#include <linux/kthread.h>
  
  #include <acpi/acpi_drivers.h>
  #include <acpi/acinterp.h>    /* for acpi_ex_eisa_id_to_string() */
@@@ -94,37 -92,17 +94,37 @@@ acpi_device_modalias_show(struct devic
  }
  static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL);
  
 -static int acpi_eject_operation(acpi_handle handle, int lockable)
 +static int acpi_bus_hot_remove_device(void *context)
  {
 +      struct acpi_device *device;
 +      acpi_handle handle = context;
        struct acpi_object_list arg_list;
        union acpi_object arg;
        acpi_status status = AE_OK;
  
 -      /*
 -       * TBD: evaluate _PS3?
 -       */
 +      if (acpi_bus_get_device(handle, &device))
 +              return 0;
 +
 +      if (!device)
 +              return 0;
 +
 +      ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 +              "Hot-removing device %s...\n", device->dev.bus_id));
 +
 +
 +      if (acpi_bus_trim(device, 1)) {
 +              ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
 +                              "Removing device failed\n"));
 +              return -1;
 +      }
  
 -      if (lockable) {
 +      /* power off device */
 +      status = acpi_evaluate_object(handle, "_PS3", NULL, NULL);
 +      if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
 +              ACPI_DEBUG_PRINT((ACPI_DB_WARN,
 +                              "Power-off device failed\n"));
 +
 +      if (device->flags.lockable) {
                arg_list.count = 1;
                arg_list.pointer = &arg;
                arg.type = ACPI_TYPE_INTEGER;
        /*
         * TBD: _EJD support.
         */
 -
        status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL);
 -      if (ACPI_FAILURE(status)) {
 -              return (-ENODEV);
 -      }
 +      if (ACPI_FAILURE(status))
 +              return -ENODEV;
  
 -      return (0);
 +      return 0;
  }
  
  static ssize_t
  acpi_eject_store(struct device *d, struct device_attribute *attr,
                const char *buf, size_t count)
  {
 -      int result;
        int ret = count;
 -      int islockable;
        acpi_status status;
 -      acpi_handle handle;
        acpi_object_type type = 0;
        struct acpi_device *acpi_device = to_acpi_device(d);
 +      struct task_struct *task;
  
        if ((!count) || (buf[0] != '1')) {
                return -EINVAL;
                goto err;
        }
  
 -      islockable = acpi_device->flags.lockable;
 -      handle = acpi_device->handle;
 -
 -      result = acpi_bus_trim(acpi_device, 1);
 -
 -      if (!result)
 -              result = acpi_eject_operation(handle, islockable);
 -
 -      if (result) {
 -              ret = -EBUSY;
 -      }
 -      err:
 +      /* remove the device in another thread to fix the deadlock issue */
 +      task = kthread_run(acpi_bus_hot_remove_device,
 +                              acpi_device->handle, "acpi_hot_remove_device");
 +      if (IS_ERR(task))
 +              ret = PTR_ERR(task);
 +err:
        return ret;
  }
  
@@@ -703,9 -691,7 +703,7 @@@ static int acpi_bus_get_wakeup_device_f
        acpi_status status = 0;
        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        union acpi_object *package = NULL;
-       union acpi_object in_arg[3];
-       struct acpi_object_list arg_list = { 3, in_arg };
-       acpi_status psw_status = AE_OK;
+       int psw_error;
  
        struct acpi_device_id button_device_ids[] = {
                {"PNP0C0D", 0},
         * So it is necessary to call _DSW object first. Only when it is not
         * present will the _PSW object used.
         */
-       /*
-        * Three agruments are needed for the _DSW object.
-        * Argument 0: enable/disable the wake capabilities
-        * When _DSW object is called to disable the wake capabilities, maybe
-        * the first argument is filled. The value of the other two agruments
-        * is meaningless.
-        */
-       in_arg[0].type = ACPI_TYPE_INTEGER;
-       in_arg[0].integer.value = 0;
-       in_arg[1].type = ACPI_TYPE_INTEGER;
-       in_arg[1].integer.value = 0;
-       in_arg[2].type = ACPI_TYPE_INTEGER;
-       in_arg[2].integer.value = 0;
-       psw_status = acpi_evaluate_object(device->handle, "_DSW",
-                                               &arg_list, NULL);
-       if (ACPI_FAILURE(psw_status) && (psw_status != AE_NOT_FOUND))
-               ACPI_DEBUG_PRINT((ACPI_DB_INFO, "error in evaluate _DSW\n"));
-       /*
-        * When the _DSW object is not present, OSPM will call _PSW object.
-        */
-       if (psw_status == AE_NOT_FOUND) {
-               /*
-                * Only one agruments is required for the _PSW object.
-                * agrument 0: enable/disable the wake capabilities
-                */
-               arg_list.count = 1;
-               in_arg[0].integer.value = 0;
-               psw_status = acpi_evaluate_object(device->handle, "_PSW",
-                                               &arg_list, NULL);
-               if (ACPI_FAILURE(psw_status) && (psw_status != AE_NOT_FOUND))
-                       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "error in "
-                                               "evaluate _PSW\n"));
-       }
+       psw_error = acpi_device_sleep_wake(device, 0, 0, 0);
+       if (psw_error)
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                               "error in _DSW or _PSW evaluation\n"));
        /* Power button, Lid switch always enable wakeup */
        if (!acpi_match_device_ids(device, button_device_ids))
                device->wakeup.flags.run_wake = 1;
index 244e352f7661a6332ddaffa933d84c6b7edd2973,af7f4663deaa40c044a7be4aff7775e9db407559..0489a7d1d42c91dcf404c50c56e07c722a41ea1f
  
  u8 sleep_states[ACPI_S_STATE_COUNT];
  
- #ifdef CONFIG_PM_SLEEP
- static u32 acpi_target_sleep_state = ACPI_STATE_S0;
- #endif
  static int acpi_sleep_prepare(u32 acpi_state)
  {
  #ifdef CONFIG_ACPI_SLEEP
@@@ -36,8 -32,9 +32,8 @@@
                if (!acpi_wakeup_address) {
                        return -EFAULT;
                }
 -              acpi_set_firmware_waking_vector((acpi_physical_address)
 -                                              virt_to_phys((void *)
 -                                                           acpi_wakeup_address));
 +              acpi_set_firmware_waking_vector(
 +                              (acpi_physical_address)acpi_wakeup_address);
  
        }
        ACPI_FLUSH_CPU_CACHE();
        return 0;
  }
  
- #ifdef CONFIG_SUSPEND
- static struct platform_suspend_ops acpi_suspend_ops;
+ #ifdef CONFIG_PM_SLEEP
+ static u32 acpi_target_sleep_state = ACPI_STATE_S0;
+ /*
+  * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
+  * user to request that behavior by using the 'acpi_old_suspend_ordering'
+  * kernel command line option that causes the following variable to be set.
+  */
+ static bool old_suspend_ordering;
+ void __init acpi_old_suspend_ordering(void)
+ {
+       old_suspend_ordering = true;
+ }
+ /**
+  *    acpi_pm_disable_gpes - Disable the GPEs.
+  */
+ static int acpi_pm_disable_gpes(void)
+ {
+       acpi_hw_disable_all_gpes();
+       return 0;
+ }
+ /**
+  *    __acpi_pm_prepare - Prepare the platform to enter the target state.
+  *
+  *    If necessary, set the firmware waking vector and do arch-specific
+  *    nastiness to get the wakeup code to the waking vector.
+  */
+ static int __acpi_pm_prepare(void)
+ {
+       int error = acpi_sleep_prepare(acpi_target_sleep_state);
+       if (error)
+               acpi_target_sleep_state = ACPI_STATE_S0;
+       return error;
+ }
+ /**
+  *    acpi_pm_prepare - Prepare the platform to enter the target sleep
+  *            state and disable the GPEs.
+  */
+ static int acpi_pm_prepare(void)
+ {
+       int error = __acpi_pm_prepare();
+       if (!error)
+               acpi_hw_disable_all_gpes();
+       return error;
+ }
+ /**
+  *    acpi_pm_finish - Instruct the platform to leave a sleep state.
+  *
+  *    This is called after we wake back up (or if entering the sleep state
+  *    failed).
+  */
+ static void acpi_pm_finish(void)
+ {
+       u32 acpi_state = acpi_target_sleep_state;
+       if (acpi_state == ACPI_STATE_S0)
+               return;
+       printk(KERN_INFO PREFIX "Waking up from system sleep state S%d\n",
+               acpi_state);
+       acpi_disable_wakeup_device(acpi_state);
+       acpi_leave_sleep_state(acpi_state);
+       /* reset firmware waking vector */
+       acpi_set_firmware_waking_vector((acpi_physical_address) 0);
+       acpi_target_sleep_state = ACPI_STATE_S0;
+ }
+ /**
+  *    acpi_pm_end - Finish up suspend sequence.
+  */
+ static void acpi_pm_end(void)
+ {
+       /*
+        * This is necessary in case acpi_pm_finish() is not called during a
+        * failing transition to a sleep state.
+        */
+       acpi_target_sleep_state = ACPI_STATE_S0;
+ }
+ #endif /* CONFIG_PM_SLEEP */
  
+ #ifdef CONFIG_SUSPEND
  extern void do_suspend_lowlevel(void);
  
  static u32 acpi_suspend_states[] = {
   *    acpi_suspend_begin - Set the target system sleep state to the state
   *            associated with given @pm_state, if supported.
   */
  static int acpi_suspend_begin(suspend_state_t pm_state)
  {
        u32 acpi_state = acpi_suspend_states[pm_state];
        return error;
  }
  
- /**
-  *    acpi_suspend_prepare - Do preliminary suspend work.
-  *
-  *    If necessary, set the firmware waking vector and do arch-specific
-  *    nastiness to get the wakeup code to the waking vector.
-  */
- static int acpi_suspend_prepare(void)
- {
-       int error = acpi_sleep_prepare(acpi_target_sleep_state);
-       if (error) {
-               acpi_target_sleep_state = ACPI_STATE_S0;
-               return error;
-       }
-       return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT;
- }
  /**
   *    acpi_suspend_enter - Actually enter a sleep state.
   *    @pm_state: ignored
   *    assembly, which in turn call acpi_enter_sleep_state().
   *    It's unfortunate, but it works. Please fix if you're feeling frisky.
   */
  static int acpi_suspend_enter(suspend_state_t pm_state)
  {
        acpi_status status = AE_OK;
        return ACPI_SUCCESS(status) ? 0 : -EFAULT;
  }
  
- /**
-  *    acpi_suspend_finish - Instruct the platform to leave a sleep state.
-  *
-  *    This is called after we wake back up (or if entering the sleep state
-  *    failed). 
-  */
- static void acpi_suspend_finish(void)
- {
-       u32 acpi_state = acpi_target_sleep_state;
-       acpi_disable_wakeup_device(acpi_state);
-       acpi_leave_sleep_state(acpi_state);
-       /* reset firmware waking vector */
-       acpi_set_firmware_waking_vector((acpi_physical_address) 0);
-       acpi_target_sleep_state = ACPI_STATE_S0;
- }
- /**
-  *    acpi_suspend_end - Finish up suspend sequence.
-  */
- static void acpi_suspend_end(void)
- {
-       /*
-        * This is necessary in case acpi_suspend_finish() is not called during a
-        * failing transition to a sleep state.
-        */
-       acpi_target_sleep_state = ACPI_STATE_S0;
- }
  static int acpi_suspend_state_valid(suspend_state_t pm_state)
  {
        u32 acpi_state;
  static struct platform_suspend_ops acpi_suspend_ops = {
        .valid = acpi_suspend_state_valid,
        .begin = acpi_suspend_begin,
-       .prepare = acpi_suspend_prepare,
+       .prepare = acpi_pm_prepare,
        .enter = acpi_suspend_enter,
-       .finish = acpi_suspend_finish,
-       .end = acpi_suspend_end,
+       .finish = acpi_pm_finish,
+       .end = acpi_pm_end,
+ };
+ /**
+  *    acpi_suspend_begin_old - Set the target system sleep state to the
+  *            state associated with given @pm_state, if supported, and
+  *            execute the _PTS control method.  This function is used if the
+  *            pre-ACPI 2.0 suspend ordering has been requested.
+  */
+ static int acpi_suspend_begin_old(suspend_state_t pm_state)
+ {
+       int error = acpi_suspend_begin(pm_state);
+       if (!error)
+               error = __acpi_pm_prepare();
+       return error;
+ }
+ /*
+  * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has
+  * been requested.
+  */
+ static struct platform_suspend_ops acpi_suspend_ops_old = {
+       .valid = acpi_suspend_state_valid,
+       .begin = acpi_suspend_begin_old,
+       .prepare = acpi_pm_disable_gpes,
+       .enter = acpi_suspend_enter,
+       .finish = acpi_pm_finish,
+       .end = acpi_pm_end,
+       .recover = acpi_pm_finish,
  };
  #endif /* CONFIG_SUSPEND */
  
  static int acpi_hibernation_begin(void)
  {
        acpi_target_sleep_state = ACPI_STATE_S4;
        return 0;
  }
  
- static int acpi_hibernation_prepare(void)
- {
-       int error = acpi_sleep_prepare(ACPI_STATE_S4);
-       if (error) {
-               acpi_target_sleep_state = ACPI_STATE_S0;
-               return error;
-       }
-       return ACPI_SUCCESS(acpi_hw_disable_all_gpes()) ? 0 : -EFAULT;
- }
  static int acpi_hibernation_enter(void)
  {
        acpi_status status = AE_OK;
@@@ -273,52 -319,55 +318,55 @@@ static void acpi_hibernation_leave(void
        acpi_leave_sleep_state_prep(ACPI_STATE_S4);
  }
  
- static void acpi_hibernation_finish(void)
+ static void acpi_pm_enable_gpes(void)
  {
-       acpi_disable_wakeup_device(ACPI_STATE_S4);
-       acpi_leave_sleep_state(ACPI_STATE_S4);
-       /* reset firmware waking vector */
-       acpi_set_firmware_waking_vector((acpi_physical_address) 0);
-       acpi_target_sleep_state = ACPI_STATE_S0;
+       acpi_hw_enable_all_runtime_gpes();
  }
  
- static void acpi_hibernation_end(void)
- {
-       /*
-        * This is necessary in case acpi_hibernation_finish() is not called
-        * during a failing transition to the sleep state.
-        */
-       acpi_target_sleep_state = ACPI_STATE_S0;
- }
+ static struct platform_hibernation_ops acpi_hibernation_ops = {
+       .begin = acpi_hibernation_begin,
+       .end = acpi_pm_end,
+       .pre_snapshot = acpi_pm_prepare,
+       .finish = acpi_pm_finish,
+       .prepare = acpi_pm_prepare,
+       .enter = acpi_hibernation_enter,
+       .leave = acpi_hibernation_leave,
+       .pre_restore = acpi_pm_disable_gpes,
+       .restore_cleanup = acpi_pm_enable_gpes,
+ };
  
- static int acpi_hibernation_pre_restore(void)
+ /**
+  *    acpi_hibernation_begin_old - Set the target system sleep state to
+  *            ACPI_STATE_S4 and execute the _PTS control method.  This
+  *            function is used if the pre-ACPI 2.0 suspend ordering has been
+  *            requested.
+  */
+ static int acpi_hibernation_begin_old(void)
  {
-       acpi_status status;
-       status = acpi_hw_disable_all_gpes();
-       return ACPI_SUCCESS(status) ? 0 : -EFAULT;
- }
+       int error = acpi_sleep_prepare(ACPI_STATE_S4);
  
static void acpi_hibernation_restore_cleanup(void)
- {
-       acpi_hw_enable_all_runtime_gpes();
      if (!error)
+               acpi_target_sleep_state = ACPI_STATE_S4;
+       return error;
  }
  
- static struct platform_hibernation_ops acpi_hibernation_ops = {
-       .begin = acpi_hibernation_begin,
-       .end = acpi_hibernation_end,
-       .pre_snapshot = acpi_hibernation_prepare,
-       .finish = acpi_hibernation_finish,
-       .prepare = acpi_hibernation_prepare,
+ /*
+  * The following callbacks are used if the pre-ACPI 2.0 suspend ordering has
+  * been requested.
+  */
+ static struct platform_hibernation_ops acpi_hibernation_ops_old = {
+       .begin = acpi_hibernation_begin_old,
+       .end = acpi_pm_end,
+       .pre_snapshot = acpi_pm_disable_gpes,
+       .finish = acpi_pm_finish,
+       .prepare = acpi_pm_disable_gpes,
        .enter = acpi_hibernation_enter,
        .leave = acpi_hibernation_leave,
-       .pre_restore = acpi_hibernation_pre_restore,
-       .restore_cleanup = acpi_hibernation_restore_cleanup,
+       .pre_restore = acpi_pm_disable_gpes,
+       .restore_cleanup = acpi_pm_enable_gpes,
+       .recover = acpi_pm_finish,
  };
- #endif                                /* CONFIG_HIBERNATION */
+ #endif /* CONFIG_HIBERNATION */
  
  int acpi_suspend(u32 acpi_state)
  {
@@@ -419,6 -468,31 +467,31 @@@ int acpi_pm_device_sleep_state(struct d
                *d_min_p = d_min;
        return d_max;
  }
+ /**
+  *    acpi_pm_device_sleep_wake - enable or disable the system wake-up
+  *                                  capability of given device
+  *    @dev: device to handle
+  *    @enable: 'true' - enable, 'false' - disable the wake-up capability
+  */
+ int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
+ {
+       acpi_handle handle;
+       struct acpi_device *adev;
+       if (!device_may_wakeup(dev))
+               return -EINVAL;
+       handle = DEVICE_ACPI_HANDLE(dev);
+       if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
+               printk(KERN_DEBUG "ACPI handle has no context!\n");
+               return -ENODEV;
+       }
+       return enable ?
+               acpi_enable_wakeup_device_power(adev, acpi_target_sleep_state) :
+               acpi_disable_wakeup_device_power(adev);
+ }
  #endif
  
  static void acpi_power_off_prepare(void)
@@@ -460,13 -534,15 +533,15 @@@ int __init acpi_sleep_init(void
                }
        }
  
-       suspend_set_ops(&acpi_suspend_ops);
+       suspend_set_ops(old_suspend_ordering ?
+               &acpi_suspend_ops_old : &acpi_suspend_ops);
  #endif
  
  #ifdef CONFIG_HIBERNATION
        status = acpi_get_sleep_type_data(ACPI_STATE_S4, &type_a, &type_b);
        if (ACPI_SUCCESS(status)) {
-               hibernation_set_ops(&acpi_hibernation_ops);
+               hibernation_set_ops(old_suspend_ordering ?
+                       &acpi_hibernation_ops_old : &acpi_hibernation_ops);
                sleep_states[ACPI_STATE_S4] = 1;
                printk(" S4");
        }
index 87a7f1d02578f194c821eb26049cbaafcf46a54c,8c1e656b5f8bd39330f4d33576334799bfec45c4..9b1b20b59e0a7b2dcc61bad05f078813e65f92fe
@@@ -153,7 -153,7 +153,7 @@@ EXPORT_SYMBOL(set_trace_device)
   * it's not any guarantee, but it's a high _likelihood_ that
   * the match is valid).
   */
 -void generate_resume_trace(void *tracedata, unsigned int user)
 +void generate_resume_trace(const void *tracedata, unsigned int user)
  {
        unsigned short lineno = *(unsigned short *)tracedata;
        const char *file = *(const char **)(tracedata + 2);
@@@ -188,9 -188,9 +188,9 @@@ static int show_file_hash(unsigned int 
  static int show_dev_hash(unsigned int value)
  {
        int match = 0;
-       struct list_head * entry = dpm_active.prev;
+       struct list_head *entry = dpm_list.prev;
  
-       while (entry != &dpm_active) {
+       while (entry != &dpm_list) {
                struct device * dev = to_device(entry);
                unsigned int hash = hash_string(DEVSEED, dev->bus_id, DEVHASH);
                if (hash == value) {
index 91156f85a9267371c1c9354646bdcc6975e206af,9342c848db29f8888b82000c6defcf07a435b968..a3e4705dd8f0f11ef477ddfeaec284990780c87f
@@@ -258,7 -258,12 +258,12 @@@ register_slot(acpi_handle handle, u32 l
                                bridge->pci_bus->number, slot->device);
                retval = acpiphp_register_hotplug_slot(slot);
                if (retval) {
-                       warn("acpiphp_register_hotplug_slot failed(err code = 0x%x)\n", retval);
+                       if (retval == -EBUSY)
+                               warn("Slot %d already registered by another "
+                                       "hotplug driver\n", slot->sun);
+                       else
+                               warn("acpiphp_register_hotplug_slot failed "
+                                       "(err code = 0x%x)\n", retval);
                        goto err_exit;
                }
        }
@@@ -700,10 -705,9 +705,10 @@@ cleanup_p2p_bridge(acpi_handle handle, 
        acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1,
                                cleanup_p2p_bridge, NULL, NULL);
  
 -      if (!(bridge = acpiphp_handle_to_bridge(handle)))
 -              return AE_OK;
 -      cleanup_bridge(bridge);
 +      bridge = acpiphp_handle_to_bridge(handle);
 +      if (bridge)
 +              cleanup_bridge(bridge);
 +
        return AE_OK;
  }
  
@@@ -716,19 -720,9 +721,19 @@@ static void remove_bridge(acpi_handle h
        acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
                                (u32)1, cleanup_p2p_bridge, NULL, NULL);
  
 +      /*
 +       * On root bridges with hotplug slots directly underneath (ie,
 +       * no p2p bridge inbetween), we call cleanup_bridge(). 
 +       *
 +       * The else clause cleans up root bridges that either had no
 +       * hotplug slots at all, or had a p2p bridge underneath.
 +       */
        bridge = acpiphp_handle_to_bridge(handle);
        if (bridge)
                cleanup_bridge(bridge);
 +      else
 +              acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
 +                                         handle_hotplug_event_bridge);
  }
  
  static struct pci_dev * get_apic_pci_info(acpi_handle handle)
@@@ -1878,19 -1872,3 +1883,3 @@@ u8 acpiphp_get_adapter_status(struct ac
  
        return (sta == 0) ? 0 : 1;
  }
- /*
-  * pci address (seg/bus/dev)
-  */
- u32 acpiphp_get_address(struct acpiphp_slot *slot)
- {
-       u32 address;
-       struct pci_bus *pci_bus = slot->bridge->pci_bus;
-       address = (pci_domain_nr(pci_bus) << 16) |
-                 (pci_bus->number << 8) |
-                 slot->device;
-       return address;
- }
index bb0642318a959453e9ef0c68190070ac7d9290a4,4f05d91a0fd82f6ca74f633e80401cb1c1cfaa98..3f7b81c065d25188e17d82665b63575a91c92e19
@@@ -1637,43 -1637,12 +1637,43 @@@ static inline int iommu_prepare_rmrr_de
  }
  
  #ifdef CONFIG_DMAR_GFX_WA
 -extern int arch_get_ram_range(int slot, u64 *addr, u64 *size);
 +struct iommu_prepare_data {
 +      struct pci_dev *pdev;
 +      int ret;
 +};
 +
 +static int __init iommu_prepare_work_fn(unsigned long start_pfn,
 +                                       unsigned long end_pfn, void *datax)
 +{
 +      struct iommu_prepare_data *data;
 +
 +      data = (struct iommu_prepare_data *)datax;
 +
 +      data->ret = iommu_prepare_identity_map(data->pdev,
 +                              start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT);
 +      return data->ret;
 +
 +}
 +
 +static int __init iommu_prepare_with_active_regions(struct pci_dev *pdev)
 +{
 +      int nid;
 +      struct iommu_prepare_data data;
 +
 +      data.pdev = pdev;
 +      data.ret = 0;
 +
 +      for_each_online_node(nid) {
 +              work_with_active_regions(nid, iommu_prepare_work_fn, &data);
 +              if (data.ret)
 +                      return data.ret;
 +      }
 +      return data.ret;
 +}
 +
  static void __init iommu_prepare_gfx_mapping(void)
  {
        struct pci_dev *pdev = NULL;
 -      u64 base, size;
 -      int slot;
        int ret;
  
        for_each_pci_dev(pdev) {
                        continue;
                printk(KERN_INFO "IOMMU: gfx device %s 1-1 mapping\n",
                        pci_name(pdev));
 -              slot = arch_get_ram_range(0, &base, &size);
 -              while (slot >= 0) {
 -                      ret = iommu_prepare_identity_map(pdev,
 -                                      base, base + size);
 -                      if (ret)
 -                              goto error;
 -                      slot = arch_get_ram_range(slot, &base, &size);
 -              }
 -              continue;
 -error:
 -              printk(KERN_ERR "IOMMU: mapping reserved region failed\n");
 +              ret = iommu_prepare_with_active_regions(pdev);
 +              if (ret)
 +                      printk(KERN_ERR "IOMMU: mapping reserved region failed\n");
        }
  }
  #endif
@@@ -1748,7 -1725,6 +1748,6 @@@ int __init init_dmars(void
        deferred_flush = kzalloc(g_num_of_iommus *
                sizeof(struct deferred_flush_tables), GFP_KERNEL);
        if (!deferred_flush) {
-               kfree(g_iommus);
                ret = -ENOMEM;
                goto error;
        }
diff --combined drivers/pci/pci-driver.c
index e1637bd82b8e4cc28710ed4c2f02d581155764d6,8eb8a3091dc74bb027284dbaa9d4f61219eaf692..a13f53486114fe27e665bfc7451933d823465ca1
@@@ -181,7 -181,7 +181,7 @@@ static int pci_call_probe(struct pci_dr
           any need to change it. */
        struct mempolicy *oldpol;
        cpumask_t oldmask = current->cpus_allowed;
 -      int node = pcibus_to_node(dev->bus);
 +      int node = dev_to_node(&dev->dev);
  
        if (node >= 0) {
                node_to_cpumask_ptr(nodecpumask, node);
@@@ -274,7 -274,57 +274,57 @@@ static int pci_device_remove(struct dev
        return 0;
  }
  
- static int pci_device_suspend(struct device * dev, pm_message_t state)
+ static void pci_device_shutdown(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *drv = pci_dev->driver;
+       if (drv && drv->shutdown)
+               drv->shutdown(pci_dev);
+       pci_msi_shutdown(pci_dev);
+       pci_msix_shutdown(pci_dev);
+ }
+ #ifdef CONFIG_PM_SLEEP
+ /*
+  * Default "suspend" method for devices that have no driver provided suspend,
+  * or not even a driver at all.
+  */
+ static void pci_default_pm_suspend(struct pci_dev *pci_dev)
+ {
+       pci_save_state(pci_dev);
+       /*
+        * mark its power state as "unknown", since we don't know if
+        * e.g. the BIOS will change its device state when we suspend.
+        */
+       if (pci_dev->current_state == PCI_D0)
+               pci_dev->current_state = PCI_UNKNOWN;
+ }
+ /*
+  * Default "resume" method for devices that have no driver provided resume,
+  * or not even a driver at all.
+  */
+ static int pci_default_pm_resume(struct pci_dev *pci_dev)
+ {
+       int retval = 0;
+       /* restore the PCI config space */
+       pci_restore_state(pci_dev);
+       /* if the device was enabled before suspend, reenable */
+       retval = pci_reenable_device(pci_dev);
+       /*
+        * if the device was busmaster before the suspend, make it busmaster
+        * again
+        */
+       if (pci_dev->is_busmaster)
+               pci_set_master(pci_dev);
+       return retval;
+ }
+ static int pci_legacy_suspend(struct device *dev, pm_message_t state)
  {
        struct pci_dev * pci_dev = to_pci_dev(dev);
        struct pci_driver * drv = pci_dev->driver;
                i = drv->suspend(pci_dev, state);
                suspend_report_result(drv->suspend, i);
        } else {
-               pci_save_state(pci_dev);
-               /*
-                * mark its power state as "unknown", since we don't know if
-                * e.g. the BIOS will change its device state when we suspend.
-                */
-               if (pci_dev->current_state == PCI_D0)
-                       pci_dev->current_state = PCI_UNKNOWN;
+               pci_default_pm_suspend(pci_dev);
        }
        return i;
  }
  
- static int pci_device_suspend_late(struct device * dev, pm_message_t state)
+ static int pci_legacy_suspend_late(struct device *dev, pm_message_t state)
  {
        struct pci_dev * pci_dev = to_pci_dev(dev);
        struct pci_driver * drv = pci_dev->driver;
        return i;
  }
  
- /*
-  * Default resume method for devices that have no driver provided resume,
-  * or not even a driver at all.
-  */
- static int pci_default_resume(struct pci_dev *pci_dev)
- {
-       int retval = 0;
-       /* restore the PCI config space */
-       pci_restore_state(pci_dev);
-       /* if the device was enabled before suspend, reenable */
-       retval = pci_reenable_device(pci_dev);
-       /* if the device was busmaster before the suspend, make it busmaster again */
-       if (pci_dev->is_busmaster)
-               pci_set_master(pci_dev);
-       return retval;
- }
- static int pci_device_resume(struct device * dev)
+ static int pci_legacy_resume(struct device *dev)
  {
        int error;
        struct pci_dev * pci_dev = to_pci_dev(dev);
        if (drv && drv->resume)
                error = drv->resume(pci_dev);
        else
-               error = pci_default_resume(pci_dev);
+               error = pci_default_pm_resume(pci_dev);
        return error;
  }
  
- static int pci_device_resume_early(struct device * dev)
+ static int pci_legacy_resume_early(struct device *dev)
  {
        int error = 0;
        struct pci_dev * pci_dev = to_pci_dev(dev);
        struct pci_driver * drv = pci_dev->driver;
  
-       pci_fixup_device(pci_fixup_resume, pci_dev);
        if (drv && drv->resume_early)
                error = drv->resume_early(pci_dev);
        return error;
  }
  
- static void pci_device_shutdown(struct device *dev)
+ static int pci_pm_prepare(struct device *dev)
+ {
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+       if (drv && drv->pm && drv->pm->prepare)
+               error = drv->pm->prepare(dev);
+       return error;
+ }
+ static void pci_pm_complete(struct device *dev)
+ {
+       struct device_driver *drv = dev->driver;
+       if (drv && drv->pm && drv->pm->complete)
+               drv->pm->complete(dev);
+ }
+ #ifdef CONFIG_SUSPEND
+ static int pci_pm_suspend(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->suspend) {
+                       error = drv->pm->suspend(dev);
+                       suspend_report_result(drv->pm->suspend, error);
+               } else {
+                       pci_default_pm_suspend(pci_dev);
+               }
+       } else {
+               error = pci_legacy_suspend(dev, PMSG_SUSPEND);
+       }
+       pci_fixup_device(pci_fixup_suspend, pci_dev);
+       return error;
+ }
+ static int pci_pm_suspend_noirq(struct device *dev)
  {
        struct pci_dev *pci_dev = to_pci_dev(dev);
        struct pci_driver *drv = pci_dev->driver;
+       int error = 0;
  
-       if (drv && drv->shutdown)
-               drv->shutdown(pci_dev);
-       pci_msi_shutdown(pci_dev);
-       pci_msix_shutdown(pci_dev);
+       if (drv && drv->pm) {
+               if (drv->pm->suspend_noirq) {
+                       error = drv->pm->suspend_noirq(dev);
+                       suspend_report_result(drv->pm->suspend_noirq, error);
+               }
+       } else {
+               error = pci_legacy_suspend_late(dev, PMSG_SUSPEND);
+       }
+       return error;
  }
  
+ static int pci_pm_resume(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+       int error;
+       pci_fixup_device(pci_fixup_resume, pci_dev);
+       if (drv && drv->pm) {
+               error = drv->pm->resume ? drv->pm->resume(dev) :
+                       pci_default_pm_resume(pci_dev);
+       } else {
+               error = pci_legacy_resume(dev);
+       }
+       return error;
+ }
+ static int pci_pm_resume_noirq(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *drv = pci_dev->driver;
+       int error = 0;
+       pci_fixup_device(pci_fixup_resume_early, pci_dev);
+       if (drv && drv->pm) {
+               if (drv->pm->resume_noirq)
+                       error = drv->pm->resume_noirq(dev);
+       } else {
+               error = pci_legacy_resume_early(dev);
+       }
+       return error;
+ }
+ #else /* !CONFIG_SUSPEND */
+ #define pci_pm_suspend                NULL
+ #define pci_pm_suspend_noirq  NULL
+ #define pci_pm_resume         NULL
+ #define pci_pm_resume_noirq   NULL
+ #endif /* !CONFIG_SUSPEND */
+ #ifdef CONFIG_HIBERNATION
+ static int pci_pm_freeze(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->freeze) {
+                       error = drv->pm->freeze(dev);
+                       suspend_report_result(drv->pm->freeze, error);
+               } else {
+                       pci_default_pm_suspend(pci_dev);
+               }
+       } else {
+               error = pci_legacy_suspend(dev, PMSG_FREEZE);
+               pci_fixup_device(pci_fixup_suspend, pci_dev);
+       }
+       return error;
+ }
+ static int pci_pm_freeze_noirq(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *drv = pci_dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->freeze_noirq) {
+                       error = drv->pm->freeze_noirq(dev);
+                       suspend_report_result(drv->pm->freeze_noirq, error);
+               }
+       } else {
+               error = pci_legacy_suspend_late(dev, PMSG_FREEZE);
+       }
+       return error;
+ }
+ static int pci_pm_thaw(struct device *dev)
+ {
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->thaw)
+                       error =  drv->pm->thaw(dev);
+       } else {
+               pci_fixup_device(pci_fixup_resume, to_pci_dev(dev));
+               error = pci_legacy_resume(dev);
+       }
+       return error;
+ }
+ static int pci_pm_thaw_noirq(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *drv = pci_dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->thaw_noirq)
+                       error = drv->pm->thaw_noirq(dev);
+       } else {
+               pci_fixup_device(pci_fixup_resume_early, pci_dev);
+               error = pci_legacy_resume_early(dev);
+       }
+       return error;
+ }
+ static int pci_pm_poweroff(struct device *dev)
+ {
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+       pci_fixup_device(pci_fixup_suspend, to_pci_dev(dev));
+       if (drv && drv->pm) {
+               if (drv->pm->poweroff) {
+                       error = drv->pm->poweroff(dev);
+                       suspend_report_result(drv->pm->poweroff, error);
+               }
+       } else {
+               error = pci_legacy_suspend(dev, PMSG_HIBERNATE);
+       }
+       return error;
+ }
+ static int pci_pm_poweroff_noirq(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *drv = pci_dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->poweroff_noirq) {
+                       error = drv->pm->poweroff_noirq(dev);
+                       suspend_report_result(drv->pm->poweroff_noirq, error);
+               }
+       } else {
+               error = pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
+       }
+       return error;
+ }
+ static int pci_pm_restore(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+       int error;
+       if (drv && drv->pm) {
+               error = drv->pm->restore ? drv->pm->restore(dev) :
+                       pci_default_pm_resume(pci_dev);
+       } else {
+               error = pci_legacy_resume(dev);
+       }
+       pci_fixup_device(pci_fixup_resume, pci_dev);
+       return error;
+ }
+ static int pci_pm_restore_noirq(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct pci_driver *drv = pci_dev->driver;
+       int error = 0;
+       pci_fixup_device(pci_fixup_resume, pci_dev);
+       if (drv && drv->pm) {
+               if (drv->pm->restore_noirq)
+                       error = drv->pm->restore_noirq(dev);
+       } else {
+               error = pci_legacy_resume_early(dev);
+       }
+       pci_fixup_device(pci_fixup_resume_early, pci_dev);
+       return error;
+ }
+ #else /* !CONFIG_HIBERNATION */
+ #define pci_pm_freeze         NULL
+ #define pci_pm_freeze_noirq   NULL
+ #define pci_pm_thaw           NULL
+ #define pci_pm_thaw_noirq     NULL
+ #define pci_pm_poweroff               NULL
+ #define pci_pm_poweroff_noirq NULL
+ #define pci_pm_restore                NULL
+ #define pci_pm_restore_noirq  NULL
+ #endif /* !CONFIG_HIBERNATION */
+ struct pm_ext_ops pci_pm_ops = {
+       .base = {
+               .prepare = pci_pm_prepare,
+               .complete = pci_pm_complete,
+               .suspend = pci_pm_suspend,
+               .resume = pci_pm_resume,
+               .freeze = pci_pm_freeze,
+               .thaw = pci_pm_thaw,
+               .poweroff = pci_pm_poweroff,
+               .restore = pci_pm_restore,
+       },
+       .suspend_noirq = pci_pm_suspend_noirq,
+       .resume_noirq = pci_pm_resume_noirq,
+       .freeze_noirq = pci_pm_freeze_noirq,
+       .thaw_noirq = pci_pm_thaw_noirq,
+       .poweroff_noirq = pci_pm_poweroff_noirq,
+       .restore_noirq = pci_pm_restore_noirq,
+ };
+ #define PCI_PM_OPS_PTR        &pci_pm_ops
+ #else /* !CONFIG_PM_SLEEP */
+ #define PCI_PM_OPS_PTR        NULL
+ #endif /* !CONFIG_PM_SLEEP */
  /**
   * __pci_register_driver - register a new pci driver
   * @drv: the driver structure to register
@@@ -386,6 -690,9 +690,9 @@@ int __pci_register_driver(struct pci_dr
        drv->driver.owner = owner;
        drv->driver.mod_name = mod_name;
  
+       if (drv->pm)
+               drv->driver.pm = &drv->pm->base;
        spin_lock_init(&drv->dynids.lock);
        INIT_LIST_HEAD(&drv->dynids.list);
  
@@@ -511,12 -818,9 +818,9 @@@ struct bus_type pci_bus_type = 
        .uevent         = pci_uevent,
        .probe          = pci_device_probe,
        .remove         = pci_device_remove,
-       .suspend        = pci_device_suspend,
-       .suspend_late   = pci_device_suspend_late,
-       .resume_early   = pci_device_resume_early,
-       .resume         = pci_device_resume,
        .shutdown       = pci_device_shutdown,
        .dev_attrs      = pci_dev_attrs,
+       .pm             = PCI_PM_OPS_PTR,
  };
  
  static int __init pci_driver_init(void)
diff --combined drivers/pci/pci.h
index 312daff834b62c86387ad8043640e0cb306b602f,b08dfc9746afea97ec7e31b070605bbab61771e6..d807cd786f20a18419105df88d8cf816019cab48
@@@ -5,10 -5,36 +5,36 @@@ extern int pci_create_sysfs_dev_files(s
  extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
  extern void pci_cleanup_rom(struct pci_dev *dev);
  
- /* Firmware callbacks */
- extern pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev);
- extern int (*platform_pci_set_power_state)(struct pci_dev *dev,
-                                               pci_power_t state);
+ /**
+  * Firmware PM callbacks
+  *
+  * @is_manageable - returns 'true' if given device is power manageable by the
+  *                  platform firmware
+  *
+  * @set_state - invokes the platform firmware to set the device's power state
+  *
+  * @choose_state - returns PCI power state of given device preferred by the
+  *                 platform; to be used during system-wide transitions from a
+  *                 sleeping state to the working state and vice versa
+  *
+  * @can_wakeup - returns 'true' if given device is capable of waking up the
+  *               system from a sleeping state
+  *
+  * @sleep_wake - enables/disables the system wake up capability of given device
+  *
+  * If given platform is generally capable of power managing PCI devices, all of
+  * these callbacks are mandatory.
+  */
+ struct pci_platform_pm_ops {
+       bool (*is_manageable)(struct pci_dev *dev);
+       int (*set_state)(struct pci_dev *dev, pci_power_t state);
+       pci_power_t (*choose_state)(struct pci_dev *dev);
+       bool (*can_wakeup)(struct pci_dev *dev);
+       int (*sleep_wake)(struct pci_dev *dev, bool enable);
+ };
+ extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops);
+ extern void pci_pm_init(struct pci_dev *dev);
  
  extern int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val);
  extern int pci_user_read_config_word(struct pci_dev *dev, int where, u16 *val);
@@@ -20,11 -46,11 +46,11 @@@ extern int pci_user_write_config_dword(
  struct pci_vpd_ops {
        int (*read)(struct pci_dev *dev, int pos, int size, char *buf);
        int (*write)(struct pci_dev *dev, int pos, int size, const char *buf);
 -      int (*get_size)(struct pci_dev *dev);
        void (*release)(struct pci_dev *dev);
  };
  
  struct pci_vpd {
 +      unsigned int len;
        struct pci_vpd_ops *ops;
        struct bin_attribute *attr; /* descriptor for sysfs VPD entry */
  };
@@@ -105,3 -131,16 +131,16 @@@ pci_match_one_device(const struct pci_d
  }
  
  struct pci_dev *pci_find_upstream_pcie_bridge(struct pci_dev *pdev);
+ /* PCI slot sysfs helper code */
+ #define to_pci_slot(s) container_of(s, struct pci_slot, kobj)
+ extern struct kset *pci_slots_kset;
+ struct pci_slot_attribute {
+       struct attribute attr;
+       ssize_t (*show)(struct pci_slot *, char *);
+       ssize_t (*store)(struct pci_slot *, const char *, size_t);
+ };
+ #define to_pci_slot_attr(s) container_of(s, struct pci_slot_attribute, attr)
diff --combined drivers/pci/quirks.c
index 338a3f94b4d43bdf3d44dd0548e018199a49774a,92b52ebd0eb635c67d94a8ad21539f25762430d9..12d489395fad0496d7953a78a30d6237ae9018ac
@@@ -556,7 -556,7 +556,7 @@@ static void quirk_via_ioapic(struct pci
        pci_write_config_byte (dev, 0x58, tmp);
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C686,       quirk_via_ioapic);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,   PCI_DEVICE_ID_VIA_82C686,       quirk_via_ioapic);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,     PCI_DEVICE_ID_VIA_82C686,       quirk_via_ioapic);
  
  /*
   * VIA 8237: Some BIOSs don't set the 'Bypass APIC De-Assert Message' Bit.
@@@ -576,7 -576,7 +576,7 @@@ static void quirk_via_vt8237_bypass_api
        }
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_8237,         quirk_via_vt8237_bypass_apic_deassert);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,   PCI_DEVICE_ID_VIA_8237,         quirk_via_vt8237_bypass_apic_deassert);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,     PCI_DEVICE_ID_VIA_8237,         quirk_via_vt8237_bypass_apic_deassert);
  
  /*
   * The AMD io apic can hang the box when an apic irq is masked.
@@@ -622,7 -622,7 +622,7 @@@ static void quirk_amd_8131_ioapic(struc
          }
  } 
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic);
  #endif /* CONFIG_X86_IO_APIC */
  
  /*
@@@ -774,7 -774,7 +774,7 @@@ static void quirk_cardbus_legacy(struc
        pci_write_config_dword(dev, PCI_CB_LEGACY_MODE_BASE, 0);
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy);
- DECLARE_PCI_FIXUP_RESUME(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy);
  
  /*
   * Following the PCI ordering rules is optional on the AMD762. I'm not
@@@ -797,7 -797,7 +797,7 @@@ static void quirk_amd_ordering(struct p
        }
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD,    PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD,   PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD,     PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering);
  
  /*
   *    DreamWorks provided workaround for Dunord I-3000 problem
@@@ -865,7 -865,7 +865,7 @@@ static void quirk_disable_pxb(struct pc
        }
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_82454NX,    quirk_disable_pxb);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX,    quirk_disable_pxb);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82454NX,    quirk_disable_pxb);
  
  static void __devinit quirk_amd_ide_mode(struct pci_dev *pdev)
  {
        }
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode);
  
  /*
   *    Serverworks CSB5 IDE does not fully support native mode
@@@ -1054,6 -1054,20 +1054,20 @@@ static void __init asus_hides_smbus_hos
                                 * its on-board VGA controller */
                                asus_hides_smbus = 1;
                        }
+               else if (dev->device == PCI_DEVICE_ID_INTEL_82845G_IG)
+                       switch(dev->subsystem_device) {
+                       case 0x00b8: /* Compaq Evo D510 CMT */
+                       case 0x00b9: /* Compaq Evo D510 SFF */
+                               asus_hides_smbus = 1;
+                       }
+               else if (dev->device == PCI_DEVICE_ID_INTEL_82815_CGC)
+                       switch (dev->subsystem_device) {
+                       case 0x001A: /* Compaq Deskpro EN SSF P667 815E */
+                               /* Motherboard doesn't have host bridge
+                                * subvendor/subdevice IDs, therefore checking
+                                * its on-board VGA controller */
+                               asus_hides_smbus = 1;
+                       }
        }
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845_HB,   asus_hides_smbus_hostbridge);
@@@ -1068,6 -1082,8 +1082,8 @@@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge);
  
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82810_IG3,  asus_hides_smbus_hostbridge);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_IG,  asus_hides_smbus_hostbridge);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_CGC,  asus_hides_smbus_hostbridge);
  
  static void asus_hides_smbus_lpc(struct pci_dev *dev)
  {
@@@ -1093,31 -1109,61 +1109,61 @@@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0,  asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0,  asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0,  asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0,  asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0,  asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0,  asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801AA_0,  asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801DB_0,  asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801BA_0,  asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801CA_0,  asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_82801EB_0,  asus_hides_smbus_lpc);
  
- static void asus_hides_smbus_lpc_ich6(struct pci_dev *dev)
+ /* It appears we just have one such device. If not, we have a warning */
+ static void __iomem *asus_rcba_base;
+ static void asus_hides_smbus_lpc_ich6_suspend(struct pci_dev *dev)
  {
-       u32 val, rcba;
-       void __iomem *base;
+       u32 rcba;
  
        if (likely(!asus_hides_smbus))
                return;
+       WARN_ON(asus_rcba_base);
        pci_read_config_dword(dev, 0xF0, &rcba);
-       base = ioremap_nocache(rcba & 0xFFFFC000, 0x4000); /* use bits 31:14, 16 kB aligned */
-       if (base == NULL) return;
-       val=readl(base + 0x3418); /* read the Function Disable register, dword mode only */
-       writel(val & 0xFFFFFFF7, base + 0x3418); /* enable the SMBus device */
-       iounmap(base);
+       /* use bits 31:14, 16 kB aligned */
+       asus_rcba_base = ioremap_nocache(rcba & 0xFFFFC000, 0x4000);
+       if (asus_rcba_base == NULL)
+               return;
+ }
+ static void asus_hides_smbus_lpc_ich6_resume_early(struct pci_dev *dev)
+ {
+       u32 val;
+       if (likely(!asus_hides_smbus || !asus_rcba_base))
+               return;
+       /* read the Function Disable register, dword mode only */
+       val = readl(asus_rcba_base + 0x3418);
+       writel(val & 0xFFFFFFF7, asus_rcba_base + 0x3418); /* enable the SMBus device */
+ }
+ static void asus_hides_smbus_lpc_ich6_resume(struct pci_dev *dev)
+ {
+       if (likely(!asus_hides_smbus || !asus_rcba_base))
+               return;
+       iounmap(asus_rcba_base);
+       asus_rcba_base = NULL;
        dev_info(&dev->dev, "Enabled ICH6/i801 SMBus device\n");
  }
+ static void asus_hides_smbus_lpc_ich6(struct pci_dev *dev)
+ {
+       asus_hides_smbus_lpc_ich6_suspend(dev);
+       asus_hides_smbus_lpc_ich6_resume_early(dev);
+       asus_hides_smbus_lpc_ich6_resume(dev);
+ }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1,     asus_hides_smbus_lpc_ich6);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1,     asus_hides_smbus_lpc_ich6);
+ DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_INTEL,        PCI_DEVICE_ID_INTEL_ICH6_1,     asus_hides_smbus_lpc_ich6_suspend);
+ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1,     asus_hides_smbus_lpc_ich6_resume);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_ICH6_1,     asus_hides_smbus_lpc_ich6_resume_early);
  
  /*
   * SiS 96x south bridge: BIOS typically hides SMBus device...
@@@ -1135,10 -1181,10 +1181,10 @@@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_962,           quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_963,           quirk_sis_96x_smbus);
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_LPC,           quirk_sis_96x_smbus);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_961,           quirk_sis_96x_smbus);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_962,           quirk_sis_96x_smbus);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_963,           quirk_sis_96x_smbus);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_LPC,           quirk_sis_96x_smbus);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,      PCI_DEVICE_ID_SI_961,           quirk_sis_96x_smbus);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,      PCI_DEVICE_ID_SI_962,           quirk_sis_96x_smbus);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,      PCI_DEVICE_ID_SI_963,           quirk_sis_96x_smbus);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,      PCI_DEVICE_ID_SI_LPC,           quirk_sis_96x_smbus);
  
  /*
   * ... This is further complicated by the fact that some SiS96x south
@@@ -1172,7 -1218,7 +1218,7 @@@ static void quirk_sis_503(struct pci_de
        quirk_sis_96x_smbus(dev);
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_503,           quirk_sis_503);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI,    PCI_DEVICE_ID_SI_503,           quirk_sis_503);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI,      PCI_DEVICE_ID_SI_503,           quirk_sis_503);
  
  
  /*
@@@ -1205,7 -1251,7 +1251,7 @@@ static void asus_hides_ac97_lpc(struct 
        }
  }
  DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA,   PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA,   PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA,     PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc);
  
  #if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE)
  
@@@ -1270,12 -1316,12 +1316,12 @@@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_J
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata);
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata);
  
  #endif
  
@@@ -1521,6 -1567,10 +1567,10 @@@ extern struct pci_fixup __start_pci_fix
  extern struct pci_fixup __end_pci_fixups_enable[];
  extern struct pci_fixup __start_pci_fixups_resume[];
  extern struct pci_fixup __end_pci_fixups_resume[];
+ extern struct pci_fixup __start_pci_fixups_resume_early[];
+ extern struct pci_fixup __end_pci_fixups_resume_early[];
+ extern struct pci_fixup __start_pci_fixups_suspend[];
+ extern struct pci_fixup __end_pci_fixups_suspend[];
  
  
  void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
                end = __end_pci_fixups_resume;
                break;
  
+       case pci_fixup_resume_early:
+               start = __start_pci_fixups_resume_early;
+               end = __end_pci_fixups_resume_early;
+               break;
+       case pci_fixup_suspend:
+               start = __start_pci_fixups_suspend;
+               end = __end_pci_fixups_suspend;
+               break;
        default:
                /* stupid compiler warning, you would think with an enum... */
                return;
@@@ -1629,7 -1689,7 +1689,7 @@@ static void quirk_nvidia_ck804_pcie_aer
  }
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA,  PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
                        quirk_nvidia_ck804_pcie_aer_ext_cap);
- DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA,  PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
+ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA,  PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
                        quirk_nvidia_ck804_pcie_aer_ext_cap);
  
  static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)
  }
  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching);
  
 +/*
 + * For Broadcom 5706, 5708, 5709 rev. A nics, any read beyond the
 + * VPD end tag will hang the device.  This problem was initially
 + * observed when a vpd entry was created in sysfs
 + * ('/sys/bus/pci/devices/<id>/vpd').   A read to this sysfs entry
 + * will dump 32k of data.  Reading a full 32k will cause an access
 + * beyond the VPD end tag causing the device to hang.  Once the device
 + * is hung, the bnx2 driver will not be able to reset the device.
 + * We believe that it is legal to read beyond the end tag and
 + * therefore the solution is to limit the read/write length.
 + */
 +static void __devinit quirk_brcm_570x_limit_vpd(struct pci_dev *dev)
 +{
 +      /*  Only disable the VPD capability for 5706, 5708, and 5709 rev. A */
 +      if ((dev->device == PCI_DEVICE_ID_NX2_5706) ||
 +          (dev->device == PCI_DEVICE_ID_NX2_5708) ||
 +          ((dev->device == PCI_DEVICE_ID_NX2_5709) &&
 +           (dev->revision & 0xf0) == 0x0)) {
 +              if (dev->vpd)
 +                      dev->vpd->len = 0x80;
 +      }
 +}
 +
 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM,
 +                       PCI_DEVICE_ID_NX2_5706,
 +                       quirk_brcm_570x_limit_vpd);
 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM,
 +                       PCI_DEVICE_ID_NX2_5706S,
 +                       quirk_brcm_570x_limit_vpd);
 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM,
 +                       PCI_DEVICE_ID_NX2_5708,
 +                       quirk_brcm_570x_limit_vpd);
 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM,
 +                       PCI_DEVICE_ID_NX2_5708S,
 +                       quirk_brcm_570x_limit_vpd);
 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM,
 +                       PCI_DEVICE_ID_NX2_5709,
 +                       quirk_brcm_570x_limit_vpd);
 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM,
 +                       PCI_DEVICE_ID_NX2_5709S,
 +                       quirk_brcm_570x_limit_vpd);
 +
  #ifdef CONFIG_PCI_MSI
  /* Some chipsets do not support MSI. We cannot easily rely on setting
   * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually
@@@ -1727,7 -1745,6 +1787,7 @@@ static void __init quirk_disable_all_ms
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
  
  /* Disable MSI on chipsets that are known to not support it */
index b20409404c7dac724761f2e4df39d228f25b9026,cf108a3c7f59eed5495a2e83d769a76ff2dd39f7..729f6b0a60e9d1655cfa5005236c5bf11fb83d5c
@@@ -67,8 -67,6 +67,8 @@@
                *(.rodata1)                                             \
        }                                                               \
                                                                        \
 +      BUG_TABLE                                                       \
 +                                                                      \
        /* PCI quirks */                                                \
        .pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {        \
                VMLINUX_SYMBOL(__start_pci_fixups_early) = .;           \
                VMLINUX_SYMBOL(__start_pci_fixups_resume) = .;          \
                *(.pci_fixup_resume)                                    \
                VMLINUX_SYMBOL(__end_pci_fixups_resume) = .;            \
+               VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .;    \
+               *(.pci_fixup_resume_early)                              \
+               VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .;      \
+               VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .;         \
+               *(.pci_fixup_suspend)                                   \
+               VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .;           \
        }                                                               \
                                                                        \
 +      /* Built-in firmware blobs */                                   \
 +      .builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {      \
 +              VMLINUX_SYMBOL(__start_builtin_fw) = .;                 \
 +              *(.builtin_fw)                                          \
 +              VMLINUX_SYMBOL(__end_builtin_fw) = .;                   \
 +      }                                                               \
 +                                                                      \
        /* RapidIO route ops */                                         \
        .rio_route        : AT(ADDR(.rio_route) - LOAD_OFFSET) {        \
                VMLINUX_SYMBOL(__start_rio_route_ops) = .;              \
                VMLINUX_SYMBOL(__end_rio_route_ops) = .;                \
        }                                                               \
                                                                        \
 +      TRACEDATA                                                       \
 +                                                                      \
        /* Kernel symbol table: Normal symbols */                       \
        __ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {         \
                VMLINUX_SYMBOL(__start___ksymtab) = .;                  \
                .stab.indexstr 0 : { *(.stab.indexstr) }                \
                .comment 0 : { *(.comment) }
  
 +#ifdef CONFIG_GENERIC_BUG
  #define BUG_TABLE                                                     \
        . = ALIGN(8);                                                   \
        __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {             \
                *(__bug_table)                                          \
                __stop___bug_table = .;                                 \
        }
 +#else
 +#define BUG_TABLE
 +#endif
 +
 +#ifdef CONFIG_PM_TRACE
 +#define TRACEDATA                                                     \
 +      . = ALIGN(4);                                                   \
 +      .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {               \
 +              __tracedata_start = .;                                  \
 +              *(.tracedata)                                           \
 +              __tracedata_end = .;                                    \
 +      }
 +#else
 +#define TRACEDATA
 +#endif
  
  #define NOTES                                                         \
        .notes : AT(ADDR(.notes) - LOAD_OFFSET) {                       \
diff --combined include/linux/acpi.h
index 0601075d09a13565d0b1ea94e9d0bba1947e95df,33adcf91ef41da07069e761cdd0cc24a471fbacb..a171776393767ab0e23411c4ff2d8a89f15676e2
@@@ -82,7 -82,6 +82,7 @@@ char * __acpi_map_table (unsigned long 
  int early_acpi_boot_init(void);
  int acpi_boot_init (void);
  int acpi_boot_table_init (void);
 +int acpi_mps_check (void);
  int acpi_numa_init (void);
  
  int acpi_table_init (void);
@@@ -235,6 -234,9 +235,9 @@@ int acpi_check_region(resource_size_t s
  int acpi_check_mem_region(resource_size_t start, resource_size_t n,
                      const char *name);
  
+ #ifdef CONFIG_PM_SLEEP
+ void __init acpi_old_suspend_ordering(void);
+ #endif /* CONFIG_PM_SLEEP */
  #else /* CONFIG_ACPI */
  
  static inline int early_acpi_boot_init(void)
@@@ -251,11 -253,6 +254,11 @@@ static inline int acpi_boot_table_init(
        return 0;
  }
  
 +static inline int acpi_mps_check(void)
 +{
 +      return 0;
 +}
 +
  static inline int acpi_check_resource_conflict(struct resource *res)
  {
        return 0;
diff --combined include/linux/pci.h
index d18b1dd49faba947acd56a77e1ccbb55df562b0f,68a29f0f2748cea101115da90252eedec395455e..a6a088e1a8049bf7b15fe5dac91b87f9a938133a
@@@ -17,8 -17,7 +17,7 @@@
  #ifndef LINUX_PCI_H
  #define LINUX_PCI_H
  
- /* Include the pci register defines */
- #include <linux/pci_regs.h>
+ #include <linux/pci_regs.h>   /* The pci register defines */
  
  /*
   * The PCI interface treats multi-function devices as independent
  #include <linux/list.h>
  #include <linux/compiler.h>
  #include <linux/errno.h>
+ #include <linux/kobject.h>
  #include <asm/atomic.h>
  #include <linux/device.h>
  
  /* Include the ID list */
  #include <linux/pci_ids.h>
  
+ /* pci_slot represents a physical slot */
+ struct pci_slot {
+       struct pci_bus *bus;            /* The bus this slot is on */
+       struct list_head list;          /* node in list of slots on this bus */
+       struct hotplug_slot *hotplug;   /* Hotplug info (migrate over time) */
+       unsigned char number;           /* PCI_SLOT(pci_dev->devfn) */
+       struct kobject kobj;
+ };
  /* File state for mmap()s on /proc/bus/pci/X/Y */
  enum pci_mmap_state {
        pci_mmap_io,
@@@ -142,6 -151,7 +151,7 @@@ struct pci_dev 
  
        void            *sysdata;       /* hook for sys-specific extension */
        struct proc_dir_entry *procent; /* device entry in /proc/bus/pci */
+       struct pci_slot *slot;          /* Physical slot this device is in */
  
        unsigned int    devfn;          /* encoded device & function index */
        unsigned short  vendor;
        pci_power_t     current_state;  /* Current operating state. In ACPI-speak,
                                           this is D0-D3, D0 being fully functional,
                                           and D3 being off. */
+       int             pm_cap;         /* PM capability offset in the
+                                          configuration space */
+       unsigned int    pme_support:5;  /* Bitmask of states from which PME#
+                                          can be generated */
+       unsigned int    d1_support:1;   /* Low power state D1 is supported */
+       unsigned int    d2_support:1;   /* Low power state D2 is supported */
+       unsigned int    no_d1d2:1;      /* Only allow D0 and D3 */
  
  #ifdef CONFIG_PCIEASPM
        struct pcie_link_state  *link_state;    /* ASPM link state. */
        unsigned int    is_added:1;
        unsigned int    is_busmaster:1; /* device is busmaster */
        unsigned int    no_msi:1;       /* device may not use msi */
-       unsigned int    no_d1d2:1;   /* only allow d0 or d3 */
        unsigned int    block_ucfg_access:1;    /* userspace config space access is blocked */
        unsigned int    broken_parity_status:1; /* Device generates false positive parity */
        unsigned int    msi_enabled:1;
        struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
        int rom_attr_enabled;           /* has display of the rom attribute been enabled? */
        struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
 +      struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE]; /* sysfs file for WC mapping of resources */
  #ifdef CONFIG_PCI_MSI
        struct list_head msi_list;
  #endif
@@@ -267,6 -282,7 +283,7 @@@ struct pci_bus 
        struct list_head children;      /* list of child buses */
        struct list_head devices;       /* list of devices on this bus */
        struct pci_dev  *self;          /* bridge device as seen by parent */
+       struct list_head slots;         /* list of slots on this bus */
        struct resource *resource[PCI_BUS_NUM_RESOURCES];
                                        /* address space routed to this bus */
  
@@@ -328,7 -344,7 +345,7 @@@ struct pci_bus_region 
  struct pci_dynids {
        spinlock_t lock;            /* protects list, index */
        struct list_head list;      /* for IDs added at runtime */
-       unsigned int use_driver_data:1; /* pci_driver->driver_data is used */
+       unsigned int use_driver_data:1; /* pci_device_id->driver_data is used */
  };
  
  /* ---------------------------------------------------------------- */
@@@ -390,7 -406,7 +407,7 @@@ struct pci_driver 
        int  (*resume_early) (struct pci_dev *dev);
        int  (*resume) (struct pci_dev *dev);                   /* Device woken up */
        void (*shutdown) (struct pci_dev *dev);
+       struct pm_ext_ops *pm;
        struct pci_error_handlers *err_handler;
        struct device_driver    driver;
        struct pci_dynids dynids;
@@@ -489,6 -505,10 +506,10 @@@ struct pci_bus *pci_create_bus(struct d
                               struct pci_ops *ops, void *sysdata);
  struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
                                int busnr);
+ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,
+                                const char *name);
+ void pci_destroy_slot(struct pci_slot *slot);
+ void pci_update_slot_number(struct pci_slot *slot, int slot_nr);
  int pci_scan_slot(struct pci_bus *bus, int devfn);
  struct pci_dev *pci_scan_single_device(struct pci_bus *bus, int devfn);
  void pci_device_add(struct pci_dev *dev, struct pci_bus *bus);
@@@ -618,6 -638,8 +639,8 @@@ int pci_restore_state(struct pci_dev *d
  int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
  pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
  int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable);
+ int pci_prepare_to_sleep(struct pci_dev *dev);
+ int pci_back_from_sleep(struct pci_dev *dev);
  
  /* Functions for PCI Hotplug drivers to use */
  int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap);
@@@ -839,6 -861,11 +862,11 @@@ static inline int pci_set_dma_mask(stru
        return -EIO;
  }
  
+ static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
+ {
+       return -EIO;
+ }
  static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
                                        unsigned int size)
  {
@@@ -977,9 -1004,9 +1005,9 @@@ static inline void pci_set_drvdata(stru
  /* If you want to know what to call your pci_dev, ask this function.
   * Again, it's a wrapper around the generic device.
   */
- static inline char *pci_name(struct pci_dev *pdev)
+ static inline const char *pci_name(struct pci_dev *pdev)
  {
-       return pdev->dev.bus_id;
+       return dev_name(&pdev->dev);
  }
  
  
@@@ -1014,7 -1041,9 +1042,9 @@@ enum pci_fixup_pass 
        pci_fixup_header,       /* After reading configuration header */
        pci_fixup_final,        /* Final phase of device fixups */
        pci_fixup_enable,       /* pci_enable_device() time */
-       pci_fixup_resume,       /* pci_enable_device() time */
+       pci_fixup_resume,       /* pci_device_resume() */
+       pci_fixup_suspend,      /* pci_device_suspend */
+       pci_fixup_resume_early, /* pci_device_resume_early() */
  };
  
  /* Anonymous variables would be nice... */
  #define DECLARE_PCI_FIXUP_RESUME(vendor, device, hook)                        \
        DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume,                    \
                        resume##vendor##device##hook, vendor, device, hook)
+ #define DECLARE_PCI_FIXUP_RESUME_EARLY(vendor, device, hook)          \
+       DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume_early,              \
+                       resume_early##vendor##device##hook, vendor, device, hook)
+ #define DECLARE_PCI_FIXUP_SUSPEND(vendor, device, hook)                       \
+       DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend,                   \
+                       suspend##vendor##device##hook, vendor, device, hook)
  
  
  void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);
@@@ -1060,7 -1095,10 +1096,10 @@@ extern int pci_pci_problems
  extern unsigned long pci_cardbus_io_size;
  extern unsigned long pci_cardbus_mem_size;
  
- extern int pcibios_add_platform_entries(struct pci_dev *dev);
+ int pcibios_add_platform_entries(struct pci_dev *dev);
+ void pcibios_disable_device(struct pci_dev *dev);
+ int pcibios_set_pcie_reset_state(struct pci_dev *dev,
+                                enum pcie_reset_state state);
  
  #ifdef CONFIG_PCI_MMCONFIG
  extern void __init pci_mmcfg_early_init(void);