2009-09-19 06:42:43

by Len Brown

[permalink] [raw]
Subject: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Hi Linus,

please pull from:

git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git release

Two new drivers, bring the ACPICA core up to date with ACPI 4.0,
and a bunch of other stuff...

This will update the files shown below.

thanks!

--
Len Brown
Intel Open Source Technology Center


ps. individual patches are available on [email protected]
and a consolidated plain patch is available here:
http://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/patches/2.6.31/acpi-release-20090903-2.6.31.diff.gz

Documentation/ABI/stable/sysfs-class-backlight | 36 +
Documentation/ABI/testing/sysfs-class-lcd | 23 +
Documentation/ABI/testing/sysfs-class-led | 28 +
.../ABI/testing/sysfs-platform-asus-laptop | 52 +
.../ABI/testing/sysfs-platform-eeepc-laptop | 50 +
Documentation/hwmon/acpi_power_meter | 51 +
Documentation/laptops/asus-laptop.txt | 258 +++++
Documentation/laptops/thinkpad-acpi.txt | 8 +-
Documentation/leds-class.txt | 9 +-
MAINTAINERS | 5 +
arch/ia64/hp/common/sba_iommu.c | 7 +-
arch/x86/include/asm/acpi.h | 1 -
arch/x86/pci/mmconfig-shared.c | 2 +
drivers/acpi/Kconfig | 17 +-
drivers/acpi/Makefile | 1 +
drivers/acpi/ac.c | 2 +
drivers/acpi/acpi_memhotplug.c | 51 +-
drivers/acpi/acpica/Makefile | 4 +-
drivers/acpi/acpica/acconfig.h | 10 +-
drivers/acpi/acpica/acdebug.h | 4 -
drivers/acpi/acpica/acglobal.h | 37 +-
drivers/acpi/acpica/achware.h | 8 +
drivers/acpi/acpica/acinterp.h | 4 +-
drivers/acpi/acpica/aclocal.h | 16 +
drivers/acpi/acpica/acmacros.h | 2 +
drivers/acpi/acpica/acnamesp.h | 25 +
drivers/acpi/acpica/acobject.h | 1 +
drivers/acpi/acpica/acparser.h | 2 +
drivers/acpi/acpica/acpredef.h | 584 +++++++-----
drivers/acpi/acpica/acutils.h | 30 +-
drivers/acpi/acpica/amlcode.h | 1 +
drivers/acpi/acpica/dsfield.c | 18 +-
drivers/acpi/acpica/dsmethod.c | 15 +-
drivers/acpi/acpica/dsmthdat.c | 8 +-
drivers/acpi/acpica/dsobject.c | 23 +-
drivers/acpi/acpica/dswload.c | 41 +-
drivers/acpi/acpica/evgpe.c | 8 +-
drivers/acpi/acpica/evgpeblk.c | 4 +-
drivers/acpi/acpica/evrgnini.c | 45 +-
drivers/acpi/acpica/exconfig.c | 7 +
drivers/acpi/acpica/exdump.c | 6 +-
drivers/acpi/acpica/exfield.c | 82 ++-
drivers/acpi/acpica/exfldio.c | 7 +-
drivers/acpi/acpica/exutils.c | 53 +-
drivers/acpi/acpica/hwgpe.c | 34 +-
drivers/acpi/acpica/hwregs.c | 206 ++++-
drivers/acpi/acpica/hwtimer.c | 2 +-
drivers/acpi/acpica/hwxface.c | 195 +++--
drivers/acpi/acpica/nsalloc.c | 88 ++-
drivers/acpi/acpica/nsdumpdv.c | 7 +-
drivers/acpi/acpica/nseval.c | 137 +++
drivers/acpi/acpica/nsinit.c | 15 +
drivers/acpi/acpica/nsload.c | 3 +-
drivers/acpi/acpica/nspredef.c | 718 +++++++-------
drivers/acpi/acpica/nsrepair.c | 203 ++++
drivers/acpi/acpica/nsutils.c | 5 +-
drivers/acpi/acpica/nsxfeval.c | 23 +-
drivers/acpi/acpica/nsxfname.c | 237 ++++--
drivers/acpi/acpica/psloop.c | 119 +++-
drivers/acpi/acpica/psxface.c | 4 +
drivers/acpi/acpica/tbutils.c | 82 ++-
drivers/acpi/acpica/utdelete.c | 6 +
drivers/acpi/acpica/uteval.c | 378 +-------
drivers/acpi/acpica/utglobal.c | 12 +-
drivers/acpi/acpica/utids.c | 382 ++++++++
drivers/acpi/acpica/utinit.c | 22 +-
drivers/acpi/acpica/utmisc.c | 85 ++-
drivers/acpi/acpica/utxface.c | 26 +-
drivers/acpi/battery.c | 22 +
drivers/acpi/blacklist.c | 2 +
drivers/acpi/bus.c | 3 +-
drivers/acpi/button.c | 2 +
drivers/acpi/cm_sbs.c | 2 +
drivers/acpi/container.c | 13 +-
drivers/acpi/debug.c | 82 +-
drivers/acpi/dock.c | 10 +-
drivers/acpi/ec.c | 270 ++----
drivers/acpi/event.c | 2 +
drivers/acpi/fan.c | 2 +
drivers/acpi/glue.c | 10 +-
drivers/acpi/internal.h | 22 +-
drivers/acpi/numa.c | 2 +
drivers/acpi/osl.c | 126 ++-
drivers/acpi/pci_irq.c | 2 +
drivers/acpi/pci_link.c | 2 +
drivers/acpi/pci_root.c | 2 +
drivers/acpi/pci_slot.c | 5 +-
drivers/acpi/power.c | 3 +-
drivers/acpi/power_meter.c | 1018 ++++++++++++++++++++
drivers/acpi/processor_core.c | 246 +++---
drivers/acpi/processor_idle.c | 12 +-
drivers/acpi/processor_perflib.c | 2 +
drivers/acpi/processor_thermal.c | 5 +-
drivers/acpi/processor_throttling.c | 5 +-
drivers/acpi/sbs.c | 2 +
drivers/acpi/sbshc.c | 2 +
drivers/acpi/scan.c | 183 +++--
drivers/acpi/sleep.c | 8 +
drivers/acpi/system.c | 2 +
drivers/acpi/tables.c | 6 +
drivers/acpi/thermal.c | 2 +
drivers/acpi/utils.c | 2 +
drivers/acpi/video.c | 80 +-
drivers/acpi/video_detect.c | 2 +
drivers/char/agp/hp-agp.c | 9 +-
drivers/ide/ide-acpi.c | 5 +-
drivers/pci/dmar.c | 4 +-
drivers/pci/hotplug/acpiphp_ibm.c | 12 +-
drivers/platform/x86/Kconfig | 10 +
drivers/platform/x86/Makefile | 1 +
drivers/platform/x86/acerhdf.c | 121 ++-
drivers/platform/x86/asus-laptop.c | 227 ++++-
drivers/platform/x86/eeepc-laptop.c | 340 ++++---
drivers/platform/x86/fujitsu-laptop.c | 109 +--
drivers/platform/x86/hp-wmi.c | 2 +-
drivers/platform/x86/sony-laptop.c | 7 +-
drivers/platform/x86/thinkpad_acpi.c | 382 ++++++--
drivers/platform/x86/topstar-laptop.c | 265 +++++
drivers/platform/x86/wmi.c | 1 -
drivers/pnp/pnpacpi/core.c | 6 +-
drivers/thermal/Kconfig | 1 +
include/acpi/acpi_bus.h | 16 +-
include/acpi/acpiosxf.h | 3 +
include/acpi/acpixf.h | 10 +-
include/acpi/actbl.h | 78 +-
include/acpi/actbl1.h | 872 +++++-------------
include/acpi/actbl2.h | 868 +++++++++++++++++
include/acpi/actypes.h | 92 +-
include/acpi/platform/aclinux.h | 4 +-
include/linux/acpi.h | 15 +-
130 files changed, 7234 insertions(+), 3022 deletions(-)
create mode 100644 Documentation/ABI/stable/sysfs-class-backlight
create mode 100644 Documentation/ABI/testing/sysfs-class-lcd
create mode 100644 Documentation/ABI/testing/sysfs-class-led
create mode 100644 Documentation/ABI/testing/sysfs-platform-asus-laptop
create mode 100644 Documentation/ABI/testing/sysfs-platform-eeepc-laptop
create mode 100644 Documentation/hwmon/acpi_power_meter
create mode 100644 Documentation/laptops/asus-laptop.txt
create mode 100644 drivers/acpi/acpica/nsrepair.c
create mode 100644 drivers/acpi/acpica/utids.c
create mode 100644 drivers/acpi/power_meter.c
create mode 100644 drivers/platform/x86/topstar-laptop.c
create mode 100644 include/acpi/actbl2.h

through these commits:

Alan Jenkins (11):
eeepc-laptop: don't touch the pci slot if it was claimed by a different driver
eeepc-laptop: use a mutex to serialize pci hotplug (resume vs. notify)
eeepc-laptop: fix pci hotplug race on load and unload
eeepc-laptop: fix ordering of init and exit functions
eeepc-laptop: make input device a child of the platform device
eeepc-laptop: remove redundant rfkill_set_sw_state in resume handler
eeepc-laptop: check the 3G rfkill state on resume
eeepc-laptop: correct the description of the hibernation abort bug
eeepc-laptop: switch to dev_pm_ops
eeepc-laptop: fix rfkill memory leak on unload
eeepc-laptop: allow rfkill hotplug to work on the 900A model

Alex Chiang (1):
ACPI: pci_slot.ko wants a 64-bit _SUN

Alexey Dobriyan (1):
acpi: switch /proc/acpi/{debug_layer,debug_level} to seq_file

Alexey Starikovskiy (4):
ACPICA: Don't switch task then not allowed
ACPI: EC: Merge IRQ and POLL modes
ACPI: EC: use BURST mode only for MSI notebooks
ACPI: EC: Drop orphan comment

Bartlomiej Zolnierkiewicz (2):
fujitsu-laptop: remove superfluous NULL pointer checks
fujitsu-laptop: driver [un]registration fixes

Bjorn Helgaas (12):
ACPI: processor: remove KOBJ_ONLINE/KOBJ_OFFLINE events
ACPI: processor: clean up in acpi_processor_start() error exits
ACPI: processor: move acpi_processor_start() after acpi_processor_add()
ACPI: processor: remove .start() method
ACPI: memory hotplug: remove .start() method
ACPI: EC: move acpi_ec_start() after acpi_ec_add()
ACPI: EC: remove .start() method
ACPI: EC: remove .stop() method
ACPI: remove unused acpi_device_ops .stop method
ACPI: simplify deferred execution path
ACPI: remove null pointer checks in deferred execution path
ACPI: don't pass handle for fixed hardware notifications

Bob Moore (29):
ACPICA: Fix several pointer casts to avoid possible compile warnings
ACPICA: Remove duplicate extern declarations for public globals
ACPICA: Add 64-bit support to acpi_read and acpi_write
ACPICA: Remove duplicate prototypes from header
ACPICA: Major update for acpi_get_object_info external interface
ACPICA: Fix possible memory leak in nspredef
ACPICA: Fix several acpi_attach_data problems
ACPICA: Dump table header - suppress output of non-printable characters
ACPICA: Fix: Predefined object repair executed only once
ACPICA: Clarify common suffix for error/warning messages
ACPICA: ACPI 4.0: Changes for existing ACPI tables.
ACPICA: Update version to 20090625
ACPICA: Move predefined repair code to new file, no functional change
ACPICA: Add repair for predefined methods that return nested packages
ACPICA: ACPI 4.0 : Add new return package type, restructure module.
ACPICA: Fix fault if acpi_terminate is called twice
ACPICA: Split large ACPI table header
ACPICA: ACPI 4: Update headers for new and changed ACPI tables.
ACPICA: ACPI 4: Add validation for new predefined names.
ACPICA: Update definitions for HEST table
ACPICA: Fix typo for HEST ACPI table
ACPICA: acpi_reset: Bypass port validation mechanism
ACPICA: Update version to 20090730
ACPICA: Fix extraneous warning if _DSM returns a package
ACPICA: Remove error message for Store(Localx,Localx)
ACPICA: Fix memory leak for ill-formed Package objects
ACPICA: Update _OSI with new Windows OS strings
ACPICA: Windows compatibility: autoexecute root _INI method
ACPICA: Update version to 20090903.

Borislav Petkov (1):
acerhdf: convert to dev_pm_ops

Corentin Chary (18):
eeepc-laptop: add rfkill support for the Wimax in ASUS Eee PC 1000HG
eeepc-laptop: document sysfs interface
video/backlight: document sysfs interface
video/lcd: document sysfs interface
led: document sysfs interface
asus-laptop: Show HRWS in infos and fix output format
asus-laptop: Add *_led_get() functions
asus-laptop: Map X50R hotkeys
asus-laptop: set maximum led brightness
asus-laptop: Add support for Keyboard backlight
asus-laptop: handle keyboard backlight keys
asus-laptop: Add suport for another "Media" key
asus-laptop: Add "calculator" hotkey
asus-laptop: document the module
asus-laptop: document sysfs interface
asus-laptop: Fix coding style for comments
thinkpad_acpi: fix rfkill memory leak on unload
hp-wmi: fix rfkill memory leak on unload

Darrick J. Wong (1):
hwmon driver for ACPI 4.0 power meters

Dmitry Torokhov (2):
ACPI: video - fix potential crash when unloading
ACPI: video - rename cdev to cooling_dev -- syntax only

Feng Tang (1):
ACPI: Handle CONFIG_ACPI=n better from linux/acpi.h

Hector Martin (1):
ACPI battery: work around negative s16 battery current on Acer

Henrique de Moraes Holschuh (8):
thinkpad-acpi: don't ask about brightness_mode for fw. 1V and 1R
thinkpad-acpi: firmware version checks
thinkpad-acpi: be more strict when detecting a ThinkPad
thinkpad-acpi: hotkey poll fixes
thinkpad-acpi: deprecate hotkey_bios_mask
thinkpad-acpi: Fix procfs hotkey reset command
thinkpad-acpi: don't poll by default any of the reserved hotkeys
thinkpad-acpi: report brightness events when required

Herton Ronaldo Krzesinski (1):
topstar-laptop: add new driver for hotkeys support on Topstar N01

Hugh Dickins (1):
ACPI: fix NULL bug for HID/UID string

Jan Beulich (1):
thermal: add missing Kconfig dependency

Jonathan Woithe (2):
fujitsu-laptop: fix config corner case
fujitsu-laptop: increment driver version

Julia Lawall (1):
fujitsu-laptop: Correct redundant test

Len Brown (9):
ACPI: fix CONFIG_ACPI_PROCFS=n build warning
eeepc-laptop: whitespace for checkpatch.pl
ACPI: Move definition of PREFIX from acpi_bus.h to internal..h
ACPI, PCI: Change PREFIX to "PCI" from "ACPI" in mmconfig-shared.c
ACPI: check acpi_disabled in acpi_table_parse() and acpi_table_parse_entries()
ACPI: sleep: another HP DMI entry for init_set_sci_en_on_resume
Revert "ACPI: Attach the ACPI device to the ACPI handle as early as possible"
ACPI: linux/acpi.h should not include linux/dmi.h
ACPI: remove unnecessary #ifdef CONFIG_DMI

Lin Ming (5):
ACPICA: ACPI 4.0: iASL/Disassembler - IPMI keyword support.
ACPICA: ACPI 4.0: Interpreter support for IPMI.
ACPICA: fix leak of acpi_os_validate_address
ACPICA: reformat predefined method table, no functional change
ACPICA: Add support for module-level executable AML code

Peter Feuerer (2):
acerhdf: fix fan control for AOA150 model
acerhdf: additional BIOS versions

Stephen Gildea (1):
fujitsu-laptop: support led-class as module

Vladimir Serbinenko (1):
ACPI video: ignore buggy _BQC

Zhang Rui (2):
ACPI: video: remove unneeded memsets
ACPI video: work-around BIOS AML bug in _BQC

Zhao Yakui (1):
ACPI: Make ACPI processor proc I/F depend on the ACPI_PROCFS

with this log:

commit 193a6dec1c0246a80b6d0101e4f351ccf877bcac
Merge: 53de535 90c53ca
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:31:39 2009 -0400

Merge branch 'video' into release

Conflicts:
drivers/acpi/video.c

Signed-off-by: Len Brown <[email protected]>

commit 53de5356be3ac62c22ae1da266943059b169d9b1
Author: Bjorn Helgaas <[email protected]>
Date: Mon Aug 31 22:32:20 2009 +0000

ACPI: don't pass handle for fixed hardware notifications

Fixed hardware devices have no handles, so just pass an explicit
NULL rather than something that looks like it might be meaningful.
acpi_device_notify() doesn't need the handle anyway; the only
reason it takes it as an argument is because the acpi_notify_handler
typedef requires it.

Signed-off-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 59fc9e5e21baf2bf5c87d8006e006007c3a708c2
Author: Bjorn Helgaas <[email protected]>
Date: Mon Aug 31 22:32:15 2009 +0000

ACPI: remove null pointer checks in deferred execution path

Better to oops and learn about a bug than to silently cover it up.

Signed-off-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 9ac6185669d0d277c4082fa92ba8eb2e55534cbf
Author: Bjorn Helgaas <[email protected]>
Date: Mon Aug 31 22:32:10 2009 +0000

ACPI: simplify deferred execution path

We had two functions, acpi_os_execute_deferred() and
acpi_os_execute_hp_deferred() that differed only in that the
latter did acpi_os_wait_events_complete(NULL) before executing
the deferred function.

This patch consolidates those two functions and uses a flag in
the struct acpi_os_dpc to determine whether to do the wait.

Signed-off-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d26f0528d588e596955bf296a609afe52eafc099
Merge: b963bd3 df43176
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:14:45 2009 -0400

Merge branch 'misc-2.6.32' into release

Conflicts:
drivers/pci/dmar.c

Signed-off-by: Len Brown <[email protected]>

commit b963bd39c9000328f6ce4f12aa52abbb0c68ee91
Merge: cbeee13 5f0dadb
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:11:06 2009 -0400

Merge branch 'thinkpad' into release

commit cbeee13570adfb0af494a07074958e4888c2351c
Merge: 7ef0143 b188e4c
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:10:40 2009 -0400

Merge branch 'processor-procfs-2.6.32' into release

commit 7ef0143e2f898f9bf675c81bdf0e045c8dd53c57
Merge: 44396a2 138d156
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:10:27 2009 -0400

Merge branch 'preempt' into release

commit 44396a262286d1a07216a7c7792d4ed7a4c89ea7
Merge: 89ae400 de584af
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:10:22 2009 -0400

Merge branch 'power-meter' into release

commit 89ae400e3f57c9d60cd4da3501bb09c1502b723c
Merge: bf25400 84a6ce2
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:09:50 2009 -0400

Merge branch 'fujitsu' into release

commit bf25400e889dac3f9a3d5a5b77e8ec4c170a5006
Merge: 762caf0 a5fe1a0
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:09:37 2009 -0400

Merge branch 'bugzilla-13620' into release

commit 762caf0baafc657c410b9c04f4a95d4e3aa4dda1
Merge: 3b87bb6 f25752e
Author: Len Brown <[email protected]>
Date: Sat Sep 19 02:05:34 2009 -0400

Merge branch 'ec' into release

Conflicts:
drivers/acpi/ec.c

Signed-off-by: Len Brown <[email protected]>

commit 3b87bb640e77023c97cf209e3dd85887a1113ad0
Merge: 7a92d80 dcf52fb
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:56:39 2009 -0400

Merge branch 'bjorn-start-stop-2.6.32' into release

commit 7a92d803227a523a9a5546e4e0dce1325a4b5926
Merge: b4549a2 bc76f90
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:56:17 2009 -0400

Merge branch 'battery' into release

commit b4549a24b6194201077d0295207ec204f785fab1
Merge: 3bb29ec 52cc96b
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:55:27 2009 -0400

Merge branch 'asus' into release

commit 3bb29ec14ce5f448ab37a5da16c3d720ae5af9cf
Merge: 985f387 f944915
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:54:35 2009 -0400

Merge branch 'acer' into release

commit f944915187f53810130eb1c56985e27e3cbe4a6d
Author: Peter Feuerer <[email protected]>
Date: Fri Sep 18 12:41:07 2009 -0700

acerhdf: additional BIOS versions

Added BIOS versions:
Acer: AOA110-v0.3307, AOA150-v0.3301, AOA150-v0.3307
Packard Bell: AOA150-v0.3105

Signed-off-by: Peter Feuerer <[email protected]>
Cc: Andreas Mohr <[email protected]>
Cc: Borislav Petkov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit ff27e1f3037535a547e2474eecb688428d654dc3
Author: Borislav Petkov <[email protected]>
Date: Fri Sep 18 12:41:05 2009 -0700

acerhdf: convert to dev_pm_ops

Signed-off-by: Borislav Petkov <[email protected]>
Signed-off-by: Peter Feuerer <[email protected]>
Cc: Andreas Mohr <[email protected]>
Cc: Dmitry Torokhov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit ded0cdfc6a7673916b0878c32fa8ba566b4f8cdb
Author: Peter Feuerer <[email protected]>
Date: Thu Aug 6 15:57:52 2009 -0700

acerhdf: fix fan control for AOA150 model

- Apply Borislav Petkov's patch (convert the fancmd[] array to a real
struct thus disambiguating command handling and making code more
readable.)

- Add BIOS product to BIOS table as AOA110 and AOA150 have different
register values

- Add force_product parameter to allow forcing different product

- fix linker warning caused by "acerhdf_drv" not being named
"acerhdf_driver"

Signed-off-by: Peter Feuerer <[email protected]>
Cc: Andreas Mohr <[email protected]>
Acked-by: Borislav Petkov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 985f38781d19101aba121df423f92c87b208c6df
Merge: d093d70 c976623
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:45:22 2009 -0400

Merge branch 'acpica' into release

commit df43176c934f2bc01f7615a6e20a4b8e77dcdd11
Author: Jan Beulich <[email protected]>
Date: Fri Sep 18 12:41:10 2009 -0700

thermal: add missing Kconfig dependency

Otherwise THERMAL_HWMON can be selected when HWMON=n and THERMAL=n, which
fails to build.

Signed-off-by: Jan Beulich <[email protected]>
Cc: Zhang Rui <[email protected]>
Cc: Matthew Garrett <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 7d7decb213a65dea0973ed980c02dae2b1b88dbe
Author: Alexey Dobriyan <[email protected]>
Date: Fri Sep 18 12:41:08 2009 -0700

acpi: switch /proc/acpi/{debug_layer,debug_level} to seq_file

Signed-off-by: Alexey Dobriyan <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 09729f0b11a389e046f621f3e4841043f460b603
Author: Corentin Chary <[email protected]>
Date: Mon Sep 14 12:43:51 2009 +0200

hp-wmi: fix rfkill memory leak on unload

rfkill_unregister() should always be followed by rfkill_destroy()
In this case, rfkill_destroy was called two times on wifi_rfkill and
never on bluetooth_rfkill.

Signed-off-by: Corentin Chary <[email protected]>
Acked-by: Matthew Garrett <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e4f55966d02c5dfade2978c2aa05fb202a78a4d1
Author: Len Brown <[email protected]>
Date: Mon Jul 6 23:42:10 2009 -0400

ACPI: remove unnecessary #ifdef CONFIG_DMI

acpi_osi_setup() does not depend on CONFIG_DMI
acpi_dmi_osi_linux()'s definition doesn't depend on CONFIG_DMI either

Signed-off-by: Len Brown <[email protected]>

commit eb27cae8adaa658a0bf31631baa1ce29d8183759
Author: Len Brown <[email protected]>
Date: Mon Jul 6 23:40:19 2009 -0400

ACPI: linux/acpi.h should not include linux/dmi.h

users of acpi.h that need dmi.h should include it directly.

Signed-off-by: Len Brown <[email protected]>

commit de584afa5e188a2da484bb5373d449598cdb9f5e
Author: Darrick J. Wong <[email protected]>
Date: Fri Sep 18 12:41:09 2009 -0700

hwmon driver for ACPI 4.0 power meters

This driver exposes ACPI 4.0 compliant power meters as hardware monitoring
devices. This second revision of the driver also exports the ACPI string
info as sysfs attributes, a list of the devices that the meter measures,
and will send ACPI notifications over the ACPI netlink socket. This
latest revision only enables the power capping controls if it can be
confirmed that the power cap can be enforced by the hardware and explains
how the notification interfaces work.

[[email protected]: remove default-y]
[[email protected]: build fix]
Signed-off-by: Darrick J. Wong <[email protected]>
Cc: Zhang Rui <[email protected]>
Cc: Pavel Machek <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d093d70a81b08673d1577ad73419998f02be9d29
Merge: 596fb7a 9caeb53
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:29:01 2009 -0400

Merge branch 'topstar-laptop' into release

commit 9caeb5324427990db7bc97e674794d201c1f0797
Author: Herton Ronaldo Krzesinski <[email protected]>
Date: Mon Sep 14 21:11:21 2009 -0300

topstar-laptop: add new driver for hotkeys support on Topstar N01

This adds Topstar Laptop Extras ACPI driver. It enables hotkeys
functionality with Topstar N01 netbook. Besides hotkeys there are
other functions exposed by its ACPI firmware, but for now only
hotkeys reporting on Topstar N01 is supported. Topstar is a chinese
manufacturer, its website can be currently reached at
http://www.topstardigital.cn/

Signed-off-by: Herton Ronaldo Krzesinski <[email protected]>
Reviewed-by: Alan Jenkins <[email protected]>
Reviewed-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 5f0dadb4bd259c3b832e19702f552947244edfb9
Author: Corentin Chary <[email protected]>
Date: Mon Sep 14 12:43:52 2009 +0200

thinkpad_acpi: fix rfkill memory leak on unload

rfkill_unregister() should always be followed by rfkill_destroy()

Signed-off-by: Corentin Chary <[email protected]>
Acked-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 596fb7ae462f5c82a1d663fe04f8c98464c963c9
Merge: 003d6a3 de4c8cc
Author: Len Brown <[email protected]>
Date: Sat Sep 19 01:06:16 2009 -0400

Merge branch 'thinkpad' into release

commit de4c8cc7bddd9c43dc1b85517ab445ffa8163058
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:18 2009 -0300

thinkpad-acpi: report brightness events when required

Report KEY_BRIGHTNESSUP and KEY_BRIGHTNESSDOWN input events when the
ThinkPad is in "passive brightness control" mode (because either we or
ACPI video touched _BCL), and ACPI video is not processing these
events by itself.

This happens only on Lenovo ThinkPads with ACPI video support, when
operating with the ACPI video driver in acpi_backlight=vendor mode.

Issuing these events is the right thing to do, and will work around
bugzilla #13368, if userspace is properly configured and actively
handles these events.

For other ThinkPads, and when ACPI video is handling brightness
changes, thinkpad-acpi will continue NOT sending KEY_BRIGHTNESS*
events by default.

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 230d8cf25ac32c7d2fdb4dda861ec5d954000ffb
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:17 2009 -0300

thinkpad-acpi: don't poll by default any of the reserved hotkeys

Init hotkey_source_mask late, so that we can make use of
hotkey_reserved_mask to avoid polling any of the reserved
hotkeys by default.

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 20c9aa46f644b3ddb161a819d1b0c2b07097c4ee
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:16 2009 -0300

thinkpad-acpi: Fix procfs hotkey reset command

echo "reset" > /proc/acpi/ibm/hotkey should do something non-useless,
so instead of setting it to Fn+F2, Fn+F3, Fn+F5, set it to
hotkey_recommended_mask.

It is not like it will survive for much longer, anyway.

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 06777be6d8688ba93103fffbbe9e64a5e6fab3c8
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:15 2009 -0300

thinkpad-acpi: deprecate hotkey_bios_mask

Some analysis of the ACPI DSDTs shows that the HKEY pre-enabled mask
is always 0x80c (FN+F3,FN+F4 and FN+F12), which are the hotkeys that
the second gen of HKEY firmware supported (the first gen didn't report
any hotkeys, the second reported these tree hotkeys but had no mask
support, and the third added mask support).

So, this is probably some sort of backwards compatibility with older
versions of the IBM ThinkVantage suite. We have no use for that, and
I know of exactly ZERO users of that attribute, anyway. Start the
process of getting rid of it.

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit db25f16d1dcce8de12f2f5daf884cda02196b28c
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:14 2009 -0300

thinkpad-acpi: hotkey poll fixes

Fix some locking, avoid exiting the kthread before kthread_stop() is
called on it, and clean up the hotkey poll routines a little bit.

Also, restore bits in the firmware mask after hotkey_source_mask is
changed. Without this, we leave events disabled...

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e675abafcc0df38125e6e94a9ba91c92fe774f52
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:13 2009 -0300

thinkpad-acpi: be more strict when detecting a ThinkPad

Use stricter checks to decide that we're running on a supported ThinkPad.
This should remove some possible false positives, although nobody ever
bothered to report any.

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 600a99fa3b4ce4a54375fb089e5ce0f3a1c9a7e1
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:12 2009 -0300

thinkpad-acpi: firmware version checks

Use the quirk infrastructure to warn of outdated firmware and also of
firmware versions that are known to cause problems.

Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 6da25bf51689a5cc60370d30275dbb9e6852e0cb
Author: Henrique de Moraes Holschuh <[email protected]>
Date: Sat Sep 12 15:22:11 2009 -0300

thinkpad-acpi: don't ask about brightness_mode for fw. 1V and 1R

X40 (firmware 1V) and T41 (firmware 1R) have been confirmed to work
well with the new defaults, so we can stop pestering people to confirm
that fact.

For now, whitelist just these two firmware types. It is best to have
at least one more firmware type confirmed for Radeon 9xxx and Intel
GMA-2 ThinkPads before removing the confirmation requests entirely.

Reported-by: Robert de Rooy <[email protected]>
Signed-off-by: Henrique de Moraes Holschuh <[email protected]>
Cc: [email protected]
Signed-off-by: Len Brown <[email protected]>

commit 003d6a38ce1a59e0053a02fd9e9a65b588bc8e33
Merge: 71fd68e e55a599
Author: Len Brown <[email protected]>
Date: Sat Sep 19 00:37:13 2009 -0400

Merge branch 'sfi-base' into release

Conflicts:
drivers/acpi/power.c

Signed-off-by: Len Brown <[email protected]>

commit 71fd68e7d234f6b7d8407c8f486764d24f8411f4
Merge: 8ff0e08 78f28b7
Author: Len Brown <[email protected]>
Date: Sat Sep 19 00:06:59 2009 -0400

Merge branch 'linus' into release

commit c9766237afa92e8d7f27bbcd4964f1b43fa0bce8
Author: Bob Moore <[email protected]>
Date: Fri Sep 4 08:56:17 2009 +0800

ACPICA: Update version to 20090903.

Version 20090903.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 9e64155eb1b6ab78980db58cfd21385fa5f6b024
Author: Bob Moore <[email protected]>
Date: Thu Sep 3 10:21:03 2009 +0800

ACPICA: Windows compatibility: autoexecute root _INI method

Add support for execution of an _INI method at the namespace root.
Although not defined in the ACPI specification, this support was
added to Windows around the Vista timeframe. It is added here
for Windows compatibility.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit eb752552464dbb7a99f8a975ec3b9355893cedd4
Author: Bob Moore <[email protected]>
Date: Thu Sep 3 10:05:08 2009 +0800

ACPICA: Update _OSI with new Windows OS strings

Added strings for Windows server 2008, Windows Vista SP1,
Windows 7, and Windows server 2008 R2.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e3fe0913b8e732ae636cf23afca76cf2c30718e5
Author: Bob Moore <[email protected]>
Date: Thu Sep 3 10:03:37 2009 +0800

ACPICA: Fix memory leak for ill-formed Package objects

Fixes a possible memory leak in the interpreter for package
objects if the package initializer list is longer than the
defined size of the package. This apparently can only happen
if the BIOS changes the package size on the fly (seen in a _PSS
object), as both iASL and the other compiler do not allow this.
The interpreter will truncate the package to the defined size
(and issue an error message), but can leave the extra objects
undeleted if they have been pre-created during the argument
processing (such is the case if the package consists of a number
of sub-packages as in the _PSS.) ACPICA BZ 805.

http://www.acpica.org/bugzilla/show_bug.cgi?id=805

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e678902ee899f6b0ab48166b410cdc9f1c27a350
Author: Bob Moore <[email protected]>
Date: Thu Sep 3 09:58:14 2009 +0800

ACPICA: Remove error message for Store(Localx,Localx)

We silently ignore this construct for Windows compatibility
ACPICA BZ 785.

http://www.acpica.org/bugzilla/show_bug.cgi?id=785

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 307a042416dfc2216251a85b79e8578b65fdc0e7
Author: Bob Moore <[email protected]>
Date: Thu Sep 3 09:55:40 2009 +0800

ACPICA: Fix extraneous warning if _DSM returns a package

_DSM can return any type of object, so validation on the return
type cannot be performed. ACPICA BZ 802.

http://www.acpica.org/bugzilla/show_bug.cgi?id=802

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 8ff0e082f0833d32c7523a6cd72b6cf6a2142ce8
Merge: 8aeb0a3 f61f925
Author: Len Brown <[email protected]>
Date: Sat Sep 5 13:38:34 2009 -0400

Merge branch 'bugzilla-13002' into release

commit f61f925859c57f6175082aeeee17743c68558a6e
Author: Len Brown <[email protected]>
Date: Sat Sep 5 13:33:23 2009 -0400

Revert "ACPI: Attach the ACPI device to the ACPI handle as early as possible"

This reverts commit eab4b645769fa2f8703f5a3cb0cc4ac090d347af.

http://bugzilla.kernel.org/show_bug.cgi?id=13002

Signed-off-by: Len Brown <[email protected]>

commit 8aeb0a352af7eb26863e53c203eeb852fd4590c3
Merge: 7e24bc1 eb0ca84
Author: Len Brown <[email protected]>
Date: Mon Aug 31 23:42:51 2009 -0400

Merge branch 'bugzilla-13745' into release

commit 718fb0de8ff88f71b3b91a8ee8e42e60c88e5128
Author: Hugh Dickins <[email protected]>
Date: Thu Aug 6 23:18:12 2009 +0000

ACPI: fix NULL bug for HID/UID string

acpi_device->pnp.hardware_id and unique_id are now allocated pointers,
replacing the previous arrays. acpi_device_install_notify_handler()
oopsed on the NULL hid when probing the video device, and perhaps other
uses are vulnerable too. So initialize those pointers to empty strings
when there is no hid or uid. Also, free hardware_id and unique_id when
when acpi_device is going to be freed.

http://bugzilla.kernel.org/show_bug.cgi?id=14096

Signed-off-by: Hugh Dickins <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 7e24bc1ce669b2876ffa475ea1147f2bb9ffdc52
Author: Alex Chiang <[email protected]>
Date: Tue Aug 4 14:44:17 2009 -0600

ACPI: pci_slot.ko wants a 64-bit _SUN

Similar to commit b6adc195 (PCI hotplug: acpiphp wants a 64-bit
_SUN), pci_slot.ko reads and creates sysfs directories based on
the _SUN method.

Certain HP platforms return 64 bits in _SUN. This change to
pci_slot.ko allows us to see the correct sysfs directories.

Reported-by: Chad Smith <[email protected]>
Cc: [email protected]
Signed-off-by: Alex Chiang <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 90c53ca426cb93d15eefea79dcf6bd15ad3ffeb4
Author: Zhang Rui <[email protected]>
Date: Mon Aug 31 12:39:54 2009 -0400

ACPI video: work-around BIOS AML bug in _BQC

_BQC on some laptops returns an uninitialized value when it's
invoked for the first time.

Set the laptop to the maximum backlight level in this case.
http://bugzilla.kernel.org/attachment.cgi?id=22675

Signed-off-by: Zhang Rui <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 4a703a8fe562824f269943d995ddff35077253a9
Author: Dmitry Torokhov <[email protected]>
Date: Sat Aug 29 23:03:16 2009 -0400

ACPI: video - rename cdev to cooling_dev -- syntax only

Cdev name is normally used for ether class devices or character
devices so rename member to avoid confusion for casual reader
of the code.

Signed-off-by: Dmitry Torokhov <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 4b4fe3b62e8d88068083218d3e42c45223b51d29
Author: Dmitry Torokhov <[email protected]>
Date: Sat Aug 8 00:26:25 2009 -0700

ACPI: video - fix potential crash when unloading

thermal_cooling_device_register() returns error encoded in a pointer
when it fails in which case we need to explictly set device->cdev
to NULL so we don't try to unregister it when unloading.

Signed-off-by: Dmitry Torokhov <[email protected]>
Acked-by: Zhang Rui <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit eb0ca849863ecdc593ba7faa95fda5695af891c8
Author: Len Brown <[email protected]>
Date: Sat Aug 29 22:39:06 2009 -0400

ACPI: sleep: another HP DMI entry for init_set_sci_en_on_resume

DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv3 Notebook PC")

http://bugzilla.kernel.org/show_bug.cgi?id=13745

Signed-off-by: Len Brown <[email protected]>

commit f25752e67d9d9ee7562ae9944314dd8c057d3fa2
Author: Alexey Starikovskiy <[email protected]>
Date: Fri Aug 28 23:29:51 2009 +0400

ACPI: EC: Drop orphan comment

Signed-off-by: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 6a63b06f3c494cc87eade97f081300bda60acec7
Author: Alexey Starikovskiy <[email protected]>
Date: Fri Aug 28 23:29:44 2009 +0400

ACPI: EC: use BURST mode only for MSI notebooks

Signed-off-by: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc
Author: Alexey Starikovskiy <[email protected]>
Date: Sun Aug 30 03:06:14 2009 +0400

ACPI: EC: Merge IRQ and POLL modes

In general, EC transaction should complete in less than 1ms, thus it is possible to merge wait for
1ms in poll mode and 1ms of interrupt transaction timeout.
Still, driver will wait 500ms for EC to complete transaction.

This significantly simplifies driver and makes it immune to problematic EC interrupt
implementations.

It also may lessen kernel start-up time by 500ms.

References: http://bugzilla.kernel.org/show_bug.cgi?id=12949

Signed-off-by: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit bc76f90b8a5cf4aceedf210d08d5e8292f820cec
Author: Hector Martin <[email protected]>
Date: Thu Aug 6 15:57:48 2009 -0700

ACPI battery: work around negative s16 battery current on Acer

Acer Aspire 8930G laptops (and possibly others) report the battery current
as a 16-bit signed negative when it is charging. It also reports it as
0x10000 when the current is 0. This patch adds a quirk for this which
takes the absolute value of the reported current cast to an s16. This is
a DSDT bug present in the latest BIOS revision (the EC register is 16 bits
signed and the DSDT attempts to take the 16-bit two's complement of this,
which works for discharge but not charge. It also breaks zero values
because a 32-bit register is used and the high bits aren't thrown away).

I've enabled this for all Acer systems which report in mA units. This
should be safe since it won't break compliant systems unless they report a
current above 32A, which is insane. The patch also detects the valid
32-bit value -1, which indicates unknown status, and does not attempt the
fix in that case (note that this does not conflict with 16-bit -1, which
is 65535 as read normally and gets translated to 1mA).

Signed-off-by: Hector Martin <[email protected]>
Acked-by: Alexey Starikovskiy <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 4e231fa4cbd3ff53fcb7d76eccd6fd86a152a95f
Author: Vladimir Serbinenko <[email protected]>
Date: Wed Jun 24 15:17:36 2009 +0800

ACPI video: ignore buggy _BQC

_BQC doesn't return a value listed in _BCL method.
http://bugzilla.kernel.org/show_bug.cgi?id=13511

ingore the buggy _BQC method in this case

Signed-off-by: Vladimir Serbinenko <[email protected]>
Signed-off-by: Scott Howard <[email protected]>
Acked-by: Zhang Rui <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 138d15692bf76841f252d4b836a535cf5f9154e9
Author: Alexey Starikovskiy <[email protected]>
Date: Fri Aug 28 23:29:38 2009 +0400

ACPICA: Don't switch task then not allowed

Signed-off-by: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 52cc96bd5b61775db2792780c610979fc02313eb
Author: Alan Jenkins <[email protected]>
Date: Sat Aug 29 10:28:31 2009 +0200

eeepc-laptop: allow rfkill hotplug to work on the 900A model

The 900A provides hotplug notifications on a different ACPI object to
other models.

Reported-by: Trevor <[email protected]>
Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit a8258069793609903b5ebf0bca3320249154c379
Author: Alan Jenkins <[email protected]>
Date: Sat Aug 29 10:28:30 2009 +0200

eeepc-laptop: fix rfkill memory leak on unload

rfkill_unregister() should always be followed by rfkill_destroy()

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit be96666065fd36ccfa09a13903d31d7ff5f4ef91
Author: Corentin Chary <[email protected]>
Date: Sat Aug 29 10:28:29 2009 +0200

asus-laptop: Fix coding style for comments

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e55a5999ffcf72dc4d43d73618957964cb87065a
Author: Feng Tang <[email protected]>
Date: Tue Jul 28 17:41:53 2009 +0800

ACPI: Handle CONFIG_ACPI=n better from linux/acpi.h

linux/acpi.h is the top level header for interfacing
with the ACPI sub-system, so acpi_disabled should be
up there instead of down in asm/acpi.h -- particularly
since asm/acpi.h doesn't exist for all architectures.

Same story for acpi_table_parse(), which is a top-level
API to Linux/ACPI.

This is necessary for building some code that
used to always depend on CONFIG_ACPI=y, but will soon
also need to build with CONFIG_ACPI=n.

Signed-off-by: Feng Tang <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e5b8fc6ac158f65598f58dba2c0d52ba3b412f52
Author: Len Brown <[email protected]>
Date: Tue Jul 7 23:22:58 2009 -0400

ACPI: check acpi_disabled in acpi_table_parse() and acpi_table_parse_entries()

Allow consumers of the acpi_table_parse()/acpi_table_parse_entries() API
to gracefully handle the acpi_disabled=1 case via return value
rather than checking the global flag themselves.

Signed-off-by: Feng Tang <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit f4a2d5840e9f0e48d1a787b66e7346087a756029
Author: Len Brown <[email protected]>
Date: Tue Jul 28 16:48:02 2009 -0400

ACPI, PCI: Change PREFIX to "PCI" from "ACPI" in mmconfig-shared.c

Signed-off-by: Len Brown <[email protected]>
Acked-by: Jesse Barnes <[email protected]>

commit a192a9580bcc41692be1f36b77c3b681827f566a
Author: Len Brown <[email protected]>
Date: Tue Jul 28 16:45:54 2009 -0400

ACPI: Move definition of PREFIX from acpi_bus.h to internal..h

Linux/ACPI core files using internal.h all PREFIX "ACPI: ",
however, not all ACPI drivers use/want it -- and they
should not have to #undef PREFIX to define their own.

Add GPL commment to internal.h while we are there.

This does not change any actual console output,
asside from a whitespace fix.

Signed-off-by: Len Brown <[email protected]>

commit 49ae80c9944401222e47108883c486b5a5a24006
Author: Bob Moore <[email protected]>
Date: Thu Aug 13 13:43:12 2009 +0800

ACPICA: Update version to 20090730

Version 20090730.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 8a964236800839263b3dddd7f7851d666e7d53e1
Author: Bob Moore <[email protected]>
Date: Thu Aug 13 13:42:19 2009 +0800

ACPICA: acpi_reset: Bypass port validation mechanism

Allow writes to reserved ports. This change may eventually be
driven down in to acpi_write and acpi_read.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 1872bbc94b2d092ece22a8fbf1c3e81f0fba0052
Author: Bob Moore <[email protected]>
Date: Thu Aug 13 13:31:00 2009 +0800

ACPICA: Fix typo for HEST ACPI table

Problem with the name of one of the subtables.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit c276e3884163355464a76e60ed9e272b52b4acc2
Author: Bob Moore <[email protected]>
Date: Mon Jul 27 14:55:02 2009 +0800

ACPICA: Update definitions for HEST table

Eliminate duplicated code in disassembler.
Shorten identifiers that were too long.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 7f0c826a437157d2b19662977e9cf3b472cf24a6
Author: Lin Ming <[email protected]>
Date: Thu Aug 13 14:03:15 2009 +0800

ACPICA: Add support for module-level executable AML code

Add limited support for executable AML code that exists outside
of any control method. This type of code has been illegal since
ACPI 2.0. The code must exist in an If/Else/While block. All AML
tables are supported, including tables that are dynamically loaded.
ACPICA BZ 762.

http://acpica.org/bugzilla/show_bug.cgi?id=762

Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 999e08f99846a1fd6ee9642ec306a2d318925116
Author: Bob Moore <[email protected]>
Date: Thu Aug 13 14:30:16 2009 +0800

ACPICA: ACPI 4: Add validation for new predefined names.

Added 31 new names for ACPI 4.0.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d9adc2e031bd22d5d9607a53a8d3b30e0b675f39
Author: Lin Ming <[email protected]>
Date: Mon Jul 27 11:31:10 2009 +0800

ACPICA: reformat predefined method table, no functional change

Reformatted the methods that return package objects.

Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 6e2d5ebd0d36199920676fdceaff4f4bfe66297b
Author: Bob Moore <[email protected]>
Date: Mon Jul 27 10:53:00 2009 +0800

ACPICA: ACPI 4: Update headers for new and changed ACPI tables.

Add IVRS,MSCT,UEFI,WAET,WDAT.
Updated several existing tables for ACPI 4.0-related changes.
Added document references for all tables not defined in ACPI spec.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit b24aad44438d5bc21cbbfb94a99d9bf710d8295b
Author: Bob Moore <[email protected]>
Date: Fri Jul 24 13:30:17 2009 +0800

ACPICA: Split large ACPI table header

Split out the non-acpi-defined ACPI tables into the existing
(but empty) actbl2.h file. Preparation for new ACPI 4.0 tables.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 2f977b36e5f175e5126f280e7a94f0c53d1b1a16
Author: Bob Moore <[email protected]>
Date: Fri Jul 24 11:25:16 2009 +0800

ACPICA: Fix fault if acpi_terminate is called twice

Fixes a problem with the mechanism that prevents problems if the
acpi_terminate interface is inadvertently called more than once
before the ACPICA code is re-initialized. ACPICA BZ 795.

http://acpica.org/bugzilla/show_bug.cgi?id=795

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 53e9387bdd8bfef6cffff2d2eb6bd28eca812682
Author: Bob Moore <[email protected]>
Date: Fri Jul 24 11:22:11 2009 +0800

ACPICA: ACPI 4.0 : Add new return package type, restructure module.

Added one new package type, a package that contains a revision number and
a variable number of sub-packages. Restructured the module to
put the sub-package list traversal in a separate function.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit e5f69d6ef7a6b0dbad8d4c00d83009960be02155
Author: Bob Moore <[email protected]>
Date: Fri Jul 24 11:03:09 2009 +0800

ACPICA: Add repair for predefined methods that return nested packages

Fixes a problem where a predefined method is defined to return
a variable-length Package of sub-packages. If the length is one,
the BIOS code occasionally creates a simple single package with
no sub-packages. This code attempts to fix the problem by wrapping
a new package object around the existing package. ACPICA BZ 790.

http://acpica.org/bugzilla/show_bug.cgi?id=790

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit b2deadd53c3630786e73746fb0ad8450f4e015bf
Author: Bob Moore <[email protected]>
Date: Fri Jul 24 10:56:43 2009 +0800

ACPICA: Move predefined repair code to new file, no functional change

New file is nsrepair.c. This is in preparation for additional
errror correcting code.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit aeb41b852fe90764b75ef7a9f185ca94696af6ff
Author: Len Brown <[email protected]>
Date: Fri Aug 28 19:03:11 2009 -0400

eeepc-laptop: whitespace for checkpatch.pl

checkpatch doesn't like tab+space for a return statement.

WARNING: suspect code indent for conditional statements (8, 17)
+ if (!device)
+ return -EINVAL;

Signed-off-by: Len Brown <[email protected]>

commit b09f5fecf8b97c9de7add3e2eb0cfeb91ef28dbb
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:55 2009 +0000

asus-laptop: document sysfs interface

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 6ce2c9d9a531e8753005a25a686dafab9a5d04bb
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:54 2009 +0000

asus-laptop: document the module

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 0aa20f7d720ed1feeb74df8c63a6427d9a2d3ebd
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:53 2009 +0000

asus-laptop: Add "calculator" hotkey

Found on UX50V.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 4644d0e5bd1412bbaed77e46c0c3376c6d060a74
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:52 2009 +0000

asus-laptop: Add suport for another "Media" key

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit dc79526078d2c0f01445e54e1d9fdf7c15ffd63d
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:51 2009 +0000

asus-laptop: handle keyboard backlight keys

Add support for the Fn+F3/Fn+F4 keys and map them
as KEY_KBDILLUMUP and KEY_KBDILLUMDOWN.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit b7d3fbc2ed624cc216adda0f2574570e6d6d6aed
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:50 2009 +0000

asus-laptop: Add support for Keyboard backlight

Add support for keyboard backlight found in Asus U50VG.

The SMC driver for the Apples does it via LED. To be
consistent with that we create /sys/class/leds/asus::kbd_backlight/
to control the keyboard backlight.

SLKB and GLKB are used to get/set the backlight. On
the U50VG is supports 4 brightness level, but this may
change with other models.

SLKB take a 8 bit integer where the higher bit is used
to toggle the backlight, and the over 7 bits control the
brightness level.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 977c328d81e31fde70c5ba381d9cf7357451dd74
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:49 2009 +0000

asus-laptop: set maximum led brightness

Set the right maximum brightness which is one, because
they can only be on or off.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit f641375b65f64e83be8be68ae1ebce21ee4fd578
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:48 2009 +0000

asus-laptop: Map X50R hotkeys

Map some new hotkeys found on X50R.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit abfa57e15acaa6e1ec567c250e5212bc55d79e43
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:47 2009 +0000

asus-laptop: Add *_led_get() functions

Add support for getting led brightness directly from
the hardware. Currently we don't need it, but it is needed
to support keyboard backlight/led.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 1d4a3800c764d111d67462a14589ed1611b2f55e
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:46 2009 +0000

asus-laptop: Show HRWS in infos and fix output format

Show HRWS in /sys/platform/devices/asus-laptop/infos.
HRWS is a bitfield used to get information about Hardware
available in the laptop.
Also change sprintf format from 0x%04x to %#x.

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 5f634c6527249275df4199a294ee9cec2f3ff3b1
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:45 2009 +0000

led: document sysfs interface

Also fix Documentation/led-class.txt, the acceptable
range of values for brightness is 0-max_brightness, not 0-255.

Cc: Richard Purdie <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 243ca3e401bc62e704785d215931f1a51fd53bd7
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:44 2009 +0000

video/lcd: document sysfs interface

Date and KernelVersion may be wrong because the lcd
interface was introduced before git initial import.

Cc: Richard Purdie <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 3c4c1b69a2d76ac9a1c716233fde956dba757d76
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:43 2009 +0000

video/backlight: document sysfs interface

Date and KernelVersion may be wrong because the backlight
interface was introduced before git initial import.

Cc:Richard Purdie <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d0a6825c9217cfc52d39b2b2bedd73bef8019f79
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:42 2009 +0000

eeepc-laptop: document sysfs interface

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d1ec9c3d434d94e3674bcf433e8e8e7462b8e1c0
Author: Corentin Chary <[email protected]>
Date: Fri Aug 28 12:56:41 2009 +0000

eeepc-laptop: add rfkill support for the Wimax in ASUS Eee PC 1000HG

Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit c200da5d2900df9c24fb8041870d92a4175bbef3
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:40 2009 +0000

eeepc-laptop: switch to dev_pm_ops

This also involves switching the resume handler from the acpi device
to the platform device. Using the more fine grained handlers allows
two improvements:

1. We only need to recheck rfkill state after resume from hibernation.

2. The wireless LED workaround accounts for up to 1.1s out of 1.7s
resuming devices (when wireless is enabled). We can limit the
workaround to thaw(), so that it only delays suspend to disk.

The workaround is only likely to help when hibernation is aborted.
Suspend to ram cannot be aborted by the user. Device suspend errors may
well happen before eeepc-laptop would even be frozen. Suspend errors
which happen after that could be pretty funky anyway.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit c1edd99f1c2b0285ce810d217180bf37bbae550e
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:39 2009 +0000

eeepc-laptop: correct the description of the hibernation abort bug

Actually it is only the LED which is affected. The bios bug does not
disable the wifi.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit a47461011a0f5110c497b9b163d1125d258418b2
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:38 2009 +0000

eeepc-laptop: check the 3G rfkill state on resume

All the rfkill devices are treated as "persistent", 3G is no exception.
This means their state may change over hibernation.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit ffb03575284e0f72d7ea001178c793afa265b8b5
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:37 2009 +0000

eeepc-laptop: remove redundant rfkill_set_sw_state in resume handler

rfkill_set_sw_state() will already be called by eeepc_rfkill_hotplug().

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit f2a9d5e8a649c606f520b7a7b9f4f46fba79c327
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:36 2009 +0000

eeepc-laptop: make input device a child of the platform device

Sysfs showed the ehotk input device as a "virtual" device - lies!
The input device is provided by a physical device, the eeepc platform.

This requires that we move the creation of the input device to come
after platform device is created. Input initialization is moved from
ehotk_check() [sic] to a new function called eeepc_input_init(). This
brings the input device into line with the other eeepc-laptop devices.

Also, refuse to load if we fail to register the input device.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 1e7798547fe6920ae27fb92c9202353e9e4c55db
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:35 2009 +0000

eeepc-laptop: fix ordering of init and exit functions

1. input and backlight devices were registered after acpi notifications
are enabled. This left a window where eeepc_hotk_notify() might
find these devices in an inconsistent (half-initialized) state.

-> Move all device registration into eeepc_hotk_add(), which is called
before enabling acpi notifications.

2. input and backlight devices were unregistered before acpi
notifications are disabled. This left a window where
eeepc_hotk_notify() might find these devices in an inconsistent
(half-destroyed) state.

-> Move all device unregistration into eeepc_hotk_remove(), which is
called after disabling acpi notifications.

3. The acpi driver was not freed if an error occured further down in
eeepc_laptop_init().

-> The rest of eeepc_laptop_init() has been moved to eeepc_hotk_add(),
so this is no longer a problem.

4. The acpi driver was unregistered before the platform driver. This
left a window where a sysfs access could attempt to read the ehotk
structure after it had been freed by eeepc_hotk_remove().

-> The acpi driver is now unregistered as the last step in
eeepc_laptop_exit(), so this is no longer a problem.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 07e84aa98f6b3a7278d3267f6f657955ed3eb973
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:34 2009 +0000

eeepc-laptop: fix pci hotplug race on load and unload

Wifi rfkill state changes can race with pci hotplug cleanup. A simple
fix is to refresh the hotplug state just before deregistering the pci
hotplug slot.

There is also potential for a hotplug notification to fire too early
during setup, while the structures it uses are still being initialised.
(This could only happen if the BIOS performs hotplug itself; a bug
triggered by removing the battery while hibernated). Avoid this by
registering the notifier later. The same refresh mechanism is used
to handle rfkill state changes which can now race with registration.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit dcf443b5813074031a45b05ad9c57da98bcae329
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:33 2009 +0000

eeepc-laptop: use a mutex to serialize pci hotplug (resume vs. notify)

Commit d0265f0 "eeepc-laptop: fix hot-unplug on resume" used a workqueue
to protect pci hotplug against multiple simultaneous calls during
resume. It seems to work, but a mutex would be more appropriate.

This is in preparation to fix the potential pci hotplug race on unload.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 6d41839e762f8b8b03dbb97fd0d41b244d0bc902
Author: Alan Jenkins <[email protected]>
Date: Fri Aug 28 12:56:32 2009 +0000

eeepc-laptop: don't touch the pci slot if it was claimed by a different driver

The whole point of registering as a PCI hotplug driver was to prevent
conflict with pciehp. At the moment it happens to work because
eeepc-laptop is loaded first, but it doesn't work the other way round.
If pciehp is loaded first then we fail to claim the slot - we need to
respect this and not handle hotplug events.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Corentin Chary <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 84a6ce267296dabdf427ea4aff73dc58164863bb
Author: Jonathan Woithe <[email protected]>
Date: Fri Jul 31 18:16:59 2009 +0930

fujitsu-laptop: increment driver version

Increment driver version to reflect the changes from this patch series.

Signed-off-by: Jonathan Woithe <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 72afeeafe54853881a4e53dc78d538e249130ad8
Author: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Fri Jul 31 18:16:02 2009 +0930

fujitsu-laptop: driver [un]registration fixes

* Move led_classdev_unregister() calls from fujitsu_cleanup() to
acpi_fujitsu_hotkey_remove().

* Fix ordering in fujitsu_cleanup().

* Fix backlight_device_register() failure handling in fujitsu_init().

* Add missing sysfs group removal on failure to fujitsu_init().

* Add input device unregistering on failure to acpi_fujitsu_add()
and acpi_fujitsu_hotkey_add().

* Add input device unregistering/freeing to acpi_fujitsu_remove()
and acpi_fujitsu_hotkey_remove() (also remove superfluous 'device'
and 'acpi_driver_data(device)' checks while at it).

* Do few minor cleanups.

Signed-off-by: Bartlomiej Zolnierkiewicz <[email protected]>
Acked-by: Jonathan Woithe <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 67059406219d30a36b7ca93f863eb1f3032f05ce
Author: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Fri Jul 31 08:43:56 2009 +0000

fujitsu-laptop: remove superfluous NULL pointer checks

This takes care of the following entries from Dan's list:

drivers/platform/x86/fujitsu-laptop.c +327 set_lcd_level(13) warning:
variable derefenced before check 'fujitsu'
drivers/platform/x86/fujitsu-laptop.c +358 set_lcd_level_alt(13) warning:
variable derefenced before check 'fujitsu'

Reported-by: Dan Carpenter <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: Julia Lawall <[email protected]>
Signed-off-by: Bartlomiej Zolnierkiewicz <[email protected]>
Acked-by: Jonathan Woithe <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 14485c57270e8f3de2a25abaf93bae5712c97e9e
Author: Julia Lawall <[email protected]>
Date: Fri Jul 31 18:12:00 2009 +0930

fujitsu-laptop: Correct redundant test

device and acpi_driver_data(device) were tested just a few lines above.

A simplified version of the semantic match that finds this problem is as
follows: (http://www.emn.fr/x-info/coccinelle/)

// <smpl>
@r exists@
local idexpression x;
expression E;
@@

if (x == NULL || ...) { ... when forall
return ...; }
.. when != \(x=E\|x--\|x++\|--x\|++x\|x-=E\|x+=E\|x|=E\|x&=E\|&x\)
(
*x == NULL
|
*x != NULL
)
// </smpl>

Signed-off-by: Julia Lawall <[email protected]>
Acked-by: Jonathan Woithe <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 1e384cb0f9a940f2a431d1708f963987e61d71e3
Author: Stephen Gildea <[email protected]>
Date: Tue Aug 25 14:41:52 2009 +0930

fujitsu-laptop: support led-class as module

Support fujitsu-laptop with led-class built as a module instead of
being compiled in.

Signed-off-by: Stephen Gildea <[email protected]>
Acked-by: Jonathan Woithe <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit c1b5310a957c47d1c66bb53035c6ba6aa20a150f
Author: Jonathan Woithe <[email protected]>
Date: Thu Aug 27 18:45:33 2009 -0400

fujitsu-laptop: fix config corner case

This patch is a trivial fix for a config corner case, ensuring that
fujitsu-laptop doesn't get compiled into the kernel when the led class
is a module.

Signed-off-by: Alan Jenkins <[email protected]>
Signed-off-by: Jonathan Woithe <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 3b5e634103a5471d74e55d774e53db3df5c7b650
Author: Zhang Rui <[email protected]>
Date: Thu Aug 6 15:57:54 2009 -0700

ACPI: video: remove unneeded memsets

device->cap and video->cap are zeroed initially so we don't need to clear
them again.

Signed-off-by: Zhang Rui <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit a5fe1a03f7720b8da8364a1737e1e5a357904e99
Author: Lin Ming <[email protected]>
Date: Thu Aug 13 10:43:27 2009 +0800

ACPICA: fix leak of acpi_os_validate_address

http://bugzilla.kernel.org/show_bug.cgi?id=13620

If the dynamic region is created and added to resource list over and over again,
it has the potential to be a memory leak by growing the list every time.

This patch fixes the memory leak, as below

1) add a new field "count" to struct acpi_res_list.

When inserting, if the region(addr, len) is already in the resource
list, we just increase "count", otherwise, the region is inserted
with count=1.

When deleting, the "count" is decreased, if it's decreased to 0,
the region is deleted from the resource list.

With "count", the region with same address and length can only be
inserted to the resource list once, so prevent potential memory leak.

2) add a new function acpi_os_invalidate_address, which is called when
region is deleted.

Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 3ce804ed83827a7fd27190836f9421b29ac64512
Author: Bob Moore <[email protected]>
Date: Thu Jun 25 10:31:32 2009 -0700

ACPICA: Update version to 20090625

Update version number.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit eb2289ba1ba994de25af0d94b5e80ba93d2c1c3c
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 13:42:00 2009 +0800

ACPICA: ACPI 4.0: Changes for existing ACPI tables.

FACS: new flag and new OspmFlags field.
SRAT: x2APIC - add ClockDomain field to descriptor #2

Includes header and disassembler support.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 8d590c7af1152685efcf302905baeb6dda3c2d2f
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 13:39:29 2009 +0800

ACPICA: Clarify common suffix for error/warning messages

Added parens around the acpica version/modulename/linenumber to
clearly differentiate this group from the rest of the message.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 0444e8f6d72d6e38f92d48884bc90bbc6c22fd5a
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 13:38:02 2009 +0800

ACPICA: Fix: Predefined object repair executed only once

This fixes a problem where the code that attempts to repair/convert
an object of incorrect type is only executed on the first time the
predefined method is called. The mechanism that disables warnings
on subsequent calls was interfering with the repair mechanism.
ACPICA BZ 781.

http://acpica.org/bugzilla/show_bug.cgi?id=781

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit cf02cd47d4747abf8ff0617e15fc05a00202e6d5
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 11:38:46 2009 +0800

ACPICA: Dump table header - suppress output of non-printable characters

Function acpi_tb_print_table_header. Some ACPI tables contain
non-printable characters in one of the string fields of the the
header - Signature, OemId, OemTableId, or CompilerId. Invalid
characters are replaced by '?'. ACPICA BZ 788.

http://acpica.org/bugzilla/show_bug.cgi?id=788

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 8e4319c425077c4cc540696a5bb6c4d12f017dcd
Author: Bob Moore <[email protected]>
Date: Mon Jun 29 13:43:27 2009 +0800

ACPICA: Fix several acpi_attach_data problems

Handler was never invoked. Now invoked if/when host node is deleted.
Data object was not automatically deleted when host node was deleted.
Interface to handler had an unused parameter, removed it.
ACPICA BZ 778.

http://acpica.org/bugzilla/show_bug.cgi?id=778

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 6557a49a443a347d24aed58076365432ded30edc
Author: Lin Ming <[email protected]>
Date: Wed Jun 24 11:32:04 2009 +0800

ACPICA: ACPI 4.0: Interpreter support for IPMI.

Adds support for IPMI which is similar to SMBus and uses a bi-directional data buffer.
ACPICA BZ 773.

http://acpica.org/bugzilla/show_bug.cgi?id=773

Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 3db20bed579bc4e7fe581c48ad1bde853aa9ff68
Author: Lin Ming <[email protected]>
Date: Wed Jun 24 11:25:17 2009 +0800

ACPICA: ACPI 4.0: iASL/Disassembler - IPMI keyword support.

Adds support for the new IPMI operation region keyword.
ACPICA BZ 771, 772.

http://acpica.org/bugzilla/show_bug.cgi?id=771
http://acpica.org/bugzilla/show_bug.cgi?id=772

Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit dbdc8f02fe8339686623c84745ba15b0f4f889a1
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 11:22:22 2009 +0800

ACPICA: Fix possible memory leak in nspredef

Fixed a possible leak when an attempt is made to repair a return
object. The only current repair is an automatic buffer to string
conversion.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f
Author: Bob Moore <[email protected]>
Date: Mon Jun 29 13:39:29 2009 +0800

ACPICA: Major update for acpi_get_object_info external interface

Completed a major update for the acpi_get_object_info external interface.
Changes include:
- Support for variable, unlimited length HID, UID, and CID strings
- Support Processor objects the same as Devices (HID,UID,CID,ADR,STA, etc.)
- Call the _SxW power methods on behalf of a device object
- Determine if a device is a PCI root bridge
- Change the ACPI_BUFFER parameter to ACPI_DEVICE_INFO.
These changes will require an update to all callers of this interface.
See the ACPICA Programmer Reference for details.

Also, update all invocations of acpi_get_object_info interface

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 9c61b34cf7078da72cce276ff8cfae5d6e9955bc
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 09:45:17 2009 +0800

ACPICA: Remove duplicate prototypes from header

Two duplicates in acdebug.h.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit c6b5774caafa4c12b6019366e2fdaaff117e95a4
Author: Bob Moore <[email protected]>
Date: Wed Jun 24 09:44:06 2009 +0800

ACPICA: Add 64-bit support to acpi_read and acpi_write

Needed by drivers for new ACPi tables. Internal versions of
these functions still use 32-bit max transfers, in order to
minimize disruption and stack use for the standard ACPI registers
(FADT-based).

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit f8d80cdf40fe4d2393159012b38ce9f85a488686
Author: Bob Moore <[email protected]>
Date: Tue Jun 2 13:28:13 2009 +0800

ACPICA: Remove duplicate extern declarations for public globals

Some were defined twice, causes a warning with gcc
-Wredundant-decls.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 5853a9f6dda244b4163b9daad663bdc41a74f596
Author: Bob Moore <[email protected]>
Date: Tue Jun 2 13:20:00 2009 +0800

ACPICA: Fix several pointer casts to avoid possible compile warnings

Fixes warnings with gcc -Wcast-qual flag.

Signed-off-by: Bob Moore <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit dcf52fb71d988ba945054308f661bddf9b2455fb
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:45 2009 +0000

ACPI: remove unused acpi_device_ops .stop method

No drivers use the .stop method, so remove it.

Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Alex Chiang <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit cf745ec7a1222a661b2c5f0e8c2c4be81300d2a4
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:40 2009 +0000

ACPI: EC: remove .stop() method

This patch folds the .stop() method into .remove().

acpi_ec_stop() is only called via acpi_device_probe() and
acpi_device_remove(), and in both cases it is called immediately before
acpi_ec_remove(), so there's no need to have it be a separate method.

Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Alex Chiang <[email protected]>
CC: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d02be04707b8ff5375a76c027327e8708877da39
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:35 2009 +0000

ACPI: EC: remove .start() method

This patch folds the .start() method into .add().

acpi_ec_start() is always called immediately after acpi_ec_add(),
so there's no need to have it be a separate method.

Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Alex Chiang <[email protected]>
CC: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 5efc5476184173996dfcce780c2bb5e727df674e
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:30 2009 +0000

ACPI: EC: move acpi_ec_start() after acpi_ec_add()

This patch rearranges ec_install_handlers() and acpi_ec_start() so
acpi_ec_start() ends up just after acpi_ec_add(). A subsequent patch
will merge them.

Code movement only; no functional change.

Signed-off-by: Bjorn Helgaas <[email protected]>
CC: Alexey Starikovskiy <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 80f20fef6a2381402e59b169eb51b989cc175ab7
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:25 2009 +0000

ACPI: memory hotplug: remove .start() method

This patch folds the .start() method into .add().

The .start() method is called in two paths: boot-time device enumeration
and run-time node addition, currently via container_device_add(). In both
cases, .start() is called immediately after .add(), so there's no reason
to make them separate methods.

Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Alex Chiang <[email protected]>
CC: Yasunori Goto <[email protected]>
CC: Dave Hansen <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit 970b04929a68134acca17878b1d93e115e58c12a
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:19 2009 +0000

ACPI: processor: remove .start() method

This patch folds the .start() method into .add().

acpi_processor_start() is always called immediately after
acpi_processor_add(), so there's really no point in having them be
separate methods.

Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Alex Chiang <[email protected]>
CC: Venkatesh Pallipadi <[email protected]>
CC: Zhao Yakui <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit ddcd62d89e8c919cc75aeffd2ca37c986141b0f0
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:14 2009 +0000

ACPI: processor: move acpi_processor_start() after acpi_processor_add()

Move acpi_processor_start() to just after acpi_processor_add().
A subsequent patch will merge them.

Code movement only; no functional change.

Signed-off-by: Bjorn Helgaas <[email protected]>
CC: Venkatesh Pallipadi <[email protected]>
CC: Zhao Yakui <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit d4e0526184199e23ac1460fe59b8a3741b17a8b5
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:09 2009 +0000

ACPI: processor: clean up in acpi_processor_start() error exits

We used to leave crud around if things failed in acpi_processor_start().
This patch cleans up as much as we can before returning.

Signed-off-by: Bjorn Helgaas <[email protected]>
Reviewed-by: Alex Chiang <[email protected]>
CC: Venkatesh Pallipadi <[email protected]>
CC: Zhao Yakui <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit c1815e074079838d36d89e45e92b7ee317190700
Author: Bjorn Helgaas <[email protected]>
Date: Mon Jun 22 20:41:04 2009 +0000

ACPI: processor: remove KOBJ_ONLINE/KOBJ_OFFLINE events

This patch removes the KOBJ_ONLINE/KOBJ_OFFLINE events the driver used
to generate for CPU hotplug. As far as I know, nobody consumes these.
The driver core still generates KOBJ_ADD and KOBJ_REMOVE, of course.

Signed-off-by: Bjorn Helgaas <[email protected]>
CC: Venkatesh Pallipadi <[email protected]>
CC: Zhao Yakui <[email protected]>
CC: Matthew Garrett <[email protected]>
CC: Thomas Renninger <[email protected]>
CC: Dave Jones <[email protected]>
CC: Kay Sievers <[email protected]>
CC: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Len Brown <[email protected]>

commit b188e4ce3b7965ecc8d45191042cc9d25f6b90ee
Author: Len Brown <[email protected]>
Date: Wed Jun 24 01:48:32 2009 -0400

ACPI: fix CONFIG_ACPI_PROCFS=n build warning

drivers/acpi/processor_idle.c:1162: warning: unused variable ?entry?

Signed-off-by: Len Brown <[email protected]>

commit 74cad4ee9839669ad920257678ea0bf0a818cd3b
Author: Zhao Yakui <[email protected]>
Date: Wed Jun 24 11:49:49 2009 +0800

ACPI: Make ACPI processor proc I/F depend on the ACPI_PROCFS

Now whether the ACPI processor proc I/F is registered depends on the
CONFIG_PROC. It had better depend on the CONFIG_ACPI_PROCFS.
When the CONFIG_ACPI_PROCFS is unset in kernel configuration, the
ACPI processor proc I/F won't be registered.

Signed-off-by: Zhao Yakui <[email protected]>
Signed-off-by: Len Brown <[email protected]>


2009-09-23 21:31:16

by Ingo Molnar

[permalink] [raw]
Subject: [origin tree boot crash] NULL pointer dereference, IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5


> commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f
> Date: Mon Jun 29 13:39:29 2009 +0800
>
> ACPICA: Major update for acpi_get_object_info external interface

this one is causing boot crashes in -tip testing:

acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
initcall acpiphp_init+0x0/0x83 returned -19 after 16410 usecs
calling ibm_acpiphp_init+0x0/0x190 @ 1
BUG: unable to handle kernel NULL pointer dereference at 0000000000000003
IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
PGD 0
Oops: 0002 [#1] SMP DEBUG_PAGEALLOC
last sysfs file:
CPU 0
Pid: 1, comm: swapper Not tainted 2.6.31-tip #16786 System Product Name
RIP: 0010:[<ffffffff82b07130>] [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
RSP: 0018:ffff88003f2d1d60 EFLAGS: 00010246
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
RDX: ffff88003f2d1d68 RSI: 00000000000001e4 RDI: 0000000000000000
RBP: ffff88003f2d1d90 R08: 0000000000000001 R09: ffffffff824b645b
R10: 000000002d0ef63b R11: ffff88003f2d1a80 R12: ffff88003fa780d0
R13: ffffffff83940dc8 R14: 0000000000000001 R15: ffffffff83942e10
FS: 0000000000000000(0000) GS:ffff880005800000(0000) knlGS:0000000000000000
CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
CR2: 0000000000000003 CR3: 0000000001001000 CR4: 00000000000006b0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process swapper (pid: 1, threadinfo ffff88003f2d0000, task ffff88003f2c8000)
Stack:
ffff88003f2c8000 ffff88003cfbb690 000000002d0ef63b 0000000000000000
<0> 0000000000000000 ffff88003fa780d0 ffff88003f2d1e10 ffffffff8156b6b6
<0> 0000000000000001 0000000100000000 0000000000000000 ffffffff83940dc8
Call Trace:
[<ffffffff8156b6b6>] acpi_ns_walk_namespace+0x11d/0x234
[<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
[<ffffffff8157b159>] ? acpi_ut_acquire_mutex+0xd9/0x12e
[<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
[<ffffffff81566dfa>] acpi_walk_namespace+0x105/0x162
[<ffffffff81d067bf>] ? acpi_pm_read+0xd/0x3e
[<ffffffff82b06f44>] ? ibm_acpiphp_init+0x0/0x190
[<ffffffff82b06fa8>] ibm_acpiphp_init+0x64/0x190
[<ffffffff810090b4>] do_one_initcall+0x82/0x1a6
[<ffffffff810edecc>] ? init_irq_proc+0x77/0x9a
[<ffffffff82ad8975>] do_basic_setup+0x5e/0x87
[<ffffffff82ad8a26>] kernel_init+0x88/0xe2
[<ffffffff8103ddfa>] child_rip+0xa/0x20
[<ffffffff8103d7bc>] ? restore_args+0x0/0x30
[<ffffffff82ad899e>] ? kernel_init+0x0/0xe2
[<ffffffff8103ddf0>] ? child_rip+0x0/0x20
Code: 48 c7 c2 c0 7b 0b 82 48 c7 c6 95 39 4a 82 48 c7 c7 1a 3c 4a 82 31 c0 e8 02 84 4b ff 31 c0 e9 82 00 00 00 48 8b 45 d8 48 8b 40 30 <c6> 40 03 00 48 8b 45 d8 83 78 18 00 74 5f f6 40 0d 04 74 59 48
RIP [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
RSP <ffff88003f2d1d60>
CR2: 0000000000000003
---[ end trace 5a5d197966b56a2e ]---
Kernel panic - not syncing: Fatal exception
Pid: 1, comm: swapper Tainted: G D 2.6.31-tip #16786

This is a huge commit which doesnt revert cleanly. I took a stab at it,
see that revert below - it didnt help.

Obviously we'd want a fix instead of that - i'm willing to test any
patch.

oh. I should have looked at the crash site before bisecting and
reverting. That sure looks like an unconverted acpi_get_object_info()
call, right?

Ingo

-------------->
>From 2773b5bd6e64ec04dfbc123841bf6f4c5e58dea5 Mon Sep 17 00:00:00 2001
From: Ingo Molnar <[email protected]>
Date: Wed, 23 Sep 2009 23:22:49 +0200
Subject: [PATCH] Revert "ACPICA: Major update for acpi_get_object_info external interface"

This reverts commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f.

Conflicts:

drivers/acpi/scan.c

Causes this crash:

acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
initcall acpiphp_init+0x0/0x83 returned -19 after 16410 usecs
calling ibm_acpiphp_init+0x0/0x190 @ 1
BUG: unable to handle kernel NULL pointer dereference at 0000000000000003
IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
PGD 0
Oops: 0002 [#1] SMP DEBUG_PAGEALLOC
last sysfs file:
CPU 0
Pid: 1, comm: swapper Not tainted 2.6.31-tip #16786 System Product Name
RIP: 0010:[<ffffffff82b07130>] [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
RSP: 0018:ffff88003f2d1d60 EFLAGS: 00010246
RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
RDX: ffff88003f2d1d68 RSI: 00000000000001e4 RDI: 0000000000000000
RBP: ffff88003f2d1d90 R08: 0000000000000001 R09: ffffffff824b645b
R10: 000000002d0ef63b R11: ffff88003f2d1a80 R12: ffff88003fa780d0
R13: ffffffff83940dc8 R14: 0000000000000001 R15: ffffffff83942e10
FS: 0000000000000000(0000) GS:ffff880005800000(0000) knlGS:0000000000000000
CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
CR2: 0000000000000003 CR3: 0000000001001000 CR4: 00000000000006b0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process swapper (pid: 1, threadinfo ffff88003f2d0000, task ffff88003f2c8000)
Stack:
ffff88003f2c8000 ffff88003cfbb690 000000002d0ef63b 0000000000000000
<0> 0000000000000000 ffff88003fa780d0 ffff88003f2d1e10 ffffffff8156b6b6
<0> 0000000000000001 0000000100000000 0000000000000000 ffffffff83940dc8
Call Trace:
[<ffffffff8156b6b6>] acpi_ns_walk_namespace+0x11d/0x234
[<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
[<ffffffff8157b159>] ? acpi_ut_acquire_mutex+0xd9/0x12e
[<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
[<ffffffff81566dfa>] acpi_walk_namespace+0x105/0x162
[<ffffffff81d067bf>] ? acpi_pm_read+0xd/0x3e
[<ffffffff82b06f44>] ? ibm_acpiphp_init+0x0/0x190
[<ffffffff82b06fa8>] ibm_acpiphp_init+0x64/0x190
[<ffffffff810090b4>] do_one_initcall+0x82/0x1a6
[<ffffffff810edecc>] ? init_irq_proc+0x77/0x9a
[<ffffffff82ad8975>] do_basic_setup+0x5e/0x87
[<ffffffff82ad8a26>] kernel_init+0x88/0xe2
[<ffffffff8103ddfa>] child_rip+0xa/0x20
[<ffffffff8103d7bc>] ? restore_args+0x0/0x30
[<ffffffff82ad899e>] ? kernel_init+0x0/0xe2
[<ffffffff8103ddf0>] ? child_rip+0x0/0x20
Code: 48 c7 c2 c0 7b 0b 82 48 c7 c6 95 39 4a 82 48 c7 c7 1a 3c 4a 82 31 c0 e8 02 84 4b ff 31 c0 e9 82 00 00 00 48 8b 45 d8 48 8b 40 30 <c6> 40 03 00 48 8b 45 d8 83 78 18 00 74 5f f6 40 0d 04 74 59 48
RIP [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
RSP <ffff88003f2d1d60>
CR2: 0000000000000003
---[ end trace 5a5d197966b56a2e ]---
Kernel panic - not syncing: Fatal exception
Pid: 1, comm: swapper Tainted: G D 2.6.31-tip #16786

Signed-off-by: Ingo Molnar <[email protected]>
---
arch/ia64/hp/common/sba_iommu.c | 7 +-
drivers/acpi/acpi_memhotplug.c | 11 +-
drivers/acpi/acpica/Makefile | 2 +-
drivers/acpi/acpica/acconfig.h | 5 -
drivers/acpi/acpica/acglobal.h | 3 +-
drivers/acpi/acpica/acinterp.h | 4 +-
drivers/acpi/acpica/acutils.h | 24 +--
drivers/acpi/acpica/evrgnini.c | 45 ++++-
drivers/acpi/acpica/exutils.c | 53 ++----
drivers/acpi/acpica/nsdumpdv.c | 7 +-
drivers/acpi/acpica/nsxfeval.c | 23 +--
drivers/acpi/acpica/nsxfname.c | 237 +++++-----------------
drivers/acpi/acpica/uteval.c | 375 +++++++++++++++++++++++++++++++----
drivers/acpi/acpica/utglobal.c | 10 +-
drivers/acpi/acpica/utids.c | 382 ------------------------------------
drivers/acpi/acpica/utmisc.c | 28 ---
drivers/acpi/container.c | 11 +-
drivers/acpi/dock.c | 8 +-
drivers/acpi/glue.c | 6 +-
drivers/acpi/scan.c | 151 +++++----------
drivers/char/agp/hp-agp.c | 9 +-
drivers/ide/ide-acpi.c | 5 +-
drivers/pci/hotplug/acpiphp_ibm.c | 12 +-
drivers/platform/x86/sony-laptop.c | 7 +-
drivers/pnp/pnpacpi/core.c | 6 +-
include/acpi/acpi_bus.h | 8 +-
include/acpi/acpixf.h | 3 +-
include/acpi/actypes.h | 87 ++++----
28 files changed, 628 insertions(+), 901 deletions(-)

diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
index 674a837..8cfb001 100644
--- a/arch/ia64/hp/common/sba_iommu.c
+++ b/arch/ia64/hp/common/sba_iommu.c
@@ -2026,21 +2026,24 @@ acpi_sba_ioc_add(struct acpi_device *device)
struct ioc *ioc;
acpi_status status;
u64 hpa, length;
+ struct acpi_buffer buffer;
struct acpi_device_info *dev_info;

status = hp_acpi_csr_space(device->handle, &hpa, &length);
if (ACPI_FAILURE(status))
return 1;

- status = acpi_get_object_info(device->handle, &dev_info);
+ buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ status = acpi_get_object_info(device->handle, &buffer);
if (ACPI_FAILURE(status))
return 1;
+ dev_info = buffer.pointer;

/*
* For HWP0001, only SBA appears in ACPI namespace. It encloses the PCI
* root bridges, and its CSR space includes the IOC function.
*/
- if (strncmp("HWP0001", dev_info->hardware_id.string, 7) == 0) {
+ if (strncmp("HWP0001", dev_info->hardware_id.value, 7) == 0) {
hpa += ZX1_IOC_OFFSET;
/* zx1 based systems default to kernel page size iommu pages */
if (!iovp_shift)
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index 28ccdbc..ad9e60a 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -469,23 +469,26 @@ static acpi_status is_memory_device(acpi_handle handle)
{
char *hardware_id;
acpi_status status;
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_device_info *info;

- status = acpi_get_object_info(handle, &info);
+
+ status = acpi_get_object_info(handle, &buffer);
if (ACPI_FAILURE(status))
return status;

+ info = buffer.pointer;
if (!(info->valid & ACPI_VALID_HID)) {
- kfree(info);
+ kfree(buffer.pointer);
return AE_ERROR;
}

- hardware_id = info->hardware_id.string;
+ hardware_id = info->hardware_id.value;
if ((hardware_id == NULL) ||
(strcmp(hardware_id, ACPI_MEMORY_DEVICE_HID)))
status = AE_ERROR;

- kfree(info);
+ kfree(buffer.pointer);
return status;
}

diff --git a/drivers/acpi/acpica/Makefile b/drivers/acpi/acpica/Makefile
index e7973bc..0ff924e 100644
--- a/drivers/acpi/acpica/Makefile
+++ b/drivers/acpi/acpica/Makefile
@@ -44,4 +44,4 @@ acpi-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o

acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
- utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o
+ utstate.o utmutex.o utobject.o utresrc.o utlock.o
diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h
index 8e679ef..581be4b 100644
--- a/drivers/acpi/acpica/acconfig.h
+++ b/drivers/acpi/acpica/acconfig.h
@@ -204,11 +204,6 @@
#define ACPI_SMBUS_BUFFER_SIZE 34
#define ACPI_IPMI_BUFFER_SIZE 66

-/* _sx_d and _sx_w control methods */
-
-#define ACPI_NUM_sx_d_METHODS 4
-#define ACPI_NUM_sx_w_METHODS 5
-
/******************************************************************************
*
* ACPI AML Debugger
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
index 29ba66d..91c6cb1 100644
--- a/drivers/acpi/acpica/acglobal.h
+++ b/drivers/acpi/acpica/acglobal.h
@@ -265,8 +265,7 @@ ACPI_EXTERN u8 acpi_gbl_osi_data;
extern u8 acpi_gbl_shutdown;
extern u32 acpi_gbl_startup_flags;
extern const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT];
-extern const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS];
-extern const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS];
+extern const char *acpi_gbl_highest_dstate_names[4];
extern const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES];
extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];

diff --git a/drivers/acpi/acpica/acinterp.h b/drivers/acpi/acpica/acinterp.h
index 5db9f29..e8db7a3 100644
--- a/drivers/acpi/acpica/acinterp.h
+++ b/drivers/acpi/acpica/acinterp.h
@@ -461,9 +461,9 @@ void acpi_ex_acquire_global_lock(u32 rule);

void acpi_ex_release_global_lock(u32 rule);

-void acpi_ex_eisa_id_to_string(char *dest, acpi_integer compressed_id);
+void acpi_ex_eisa_id_to_string(u32 numeric_id, char *out_string);

-void acpi_ex_integer_to_string(char *dest, acpi_integer value);
+void acpi_ex_unsigned_integer_to_string(acpi_integer value, char *out_string);

/*
* exregion - default op_region handlers
diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h
index 863a264..14cc666 100644
--- a/drivers/acpi/acpica/acutils.h
+++ b/drivers/acpi/acpica/acutils.h
@@ -324,30 +324,26 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
acpi_status
acpi_ut_evaluate_numeric_object(char *object_name,
struct acpi_namespace_node *device_node,
- acpi_integer *value);
+ acpi_integer * address);

acpi_status
-acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 *status_flags);
+acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
+ struct acpica_device_id *hid);

acpi_status
-acpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
- const char **method_names,
- u8 method_count, u8 *out_values);
+acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
+ struct acpi_compatible_id_list **return_cid_list);

-/*
- * utids - device ID support
- */
acpi_status
-acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
- struct acpica_device_id **return_id);
+acpi_ut_execute_STA(struct acpi_namespace_node *device_node,
+ u32 * status_flags);

acpi_status
acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
- struct acpica_device_id **return_id);
+ struct acpica_device_id *uid);

acpi_status
-acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
- struct acpica_device_id_list **return_cid_list);
+acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest);

/*
* utlock - reader/writer locks
@@ -449,8 +445,6 @@ acpi_ut_short_divide(acpi_integer in_dividend,
*/
const char *acpi_ut_validate_exception(acpi_status status);

-u8 acpi_ut_is_pci_root_bridge(char *id);
-
u8 acpi_ut_is_aml_table(struct acpi_table_header *table);

acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id);
diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c
index cf29c49..284a7be 100644
--- a/drivers/acpi/acpica/evrgnini.c
+++ b/drivers/acpi/acpica/evrgnini.c
@@ -50,6 +50,8 @@
ACPI_MODULE_NAME("evrgnini")

/* Local prototypes */
+static u8 acpi_ev_match_pci_root_bridge(char *id);
+
static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node);

/*******************************************************************************
@@ -330,6 +332,37 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,

/*******************************************************************************
*
+ * FUNCTION: acpi_ev_match_pci_root_bridge
+ *
+ * PARAMETERS: Id - The HID/CID in string format
+ *
+ * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
+ *
+ * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
+ *
+ ******************************************************************************/
+
+static u8 acpi_ev_match_pci_root_bridge(char *id)
+{
+
+ /*
+ * Check if this is a PCI root.
+ * ACPI 3.0+: check for a PCI Express root also.
+ */
+ if (!(ACPI_STRNCMP(id,
+ PCI_ROOT_HID_STRING,
+ sizeof(PCI_ROOT_HID_STRING))) ||
+ !(ACPI_STRNCMP(id,
+ PCI_EXPRESS_ROOT_HID_STRING,
+ sizeof(PCI_EXPRESS_ROOT_HID_STRING)))) {
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+/*******************************************************************************
+ *
* FUNCTION: acpi_ev_is_pci_root_bridge
*
* PARAMETERS: Node - Device node being examined
@@ -344,10 +377,9 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
{
acpi_status status;
- struct acpica_device_id *hid;
- struct acpica_device_id_list *cid;
+ struct acpica_device_id hid;
+ struct acpi_compatible_id_list *cid;
u32 i;
- u8 match;

/* Get the _HID and check for a PCI Root Bridge */

@@ -356,10 +388,7 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
return (FALSE);
}

- match = acpi_ut_is_pci_root_bridge(hid->string);
- ACPI_FREE(hid);
-
- if (match) {
+ if (acpi_ev_match_pci_root_bridge(hid.value)) {
return (TRUE);
}

@@ -373,7 +402,7 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
/* Check all _CIDs in the returned list */

for (i = 0; i < cid->count; i++) {
- if (acpi_ut_is_pci_root_bridge(cid->ids[i].string)) {
+ if (acpi_ev_match_pci_root_bridge(cid->id[i].value)) {
ACPI_FREE(cid);
return (TRUE);
}
diff --git a/drivers/acpi/acpica/exutils.c b/drivers/acpi/acpica/exutils.c
index 7d41f99..87730e9 100644
--- a/drivers/acpi/acpica/exutils.c
+++ b/drivers/acpi/acpica/exutils.c
@@ -358,67 +358,50 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base)
*
* FUNCTION: acpi_ex_eisa_id_to_string
*
- * PARAMETERS: compressed_id - EISAID to be converted
+ * PARAMETERS: numeric_id - EISA ID to be converted
* out_string - Where to put the converted string (8 bytes)
*
* RETURN: None
*
- * DESCRIPTION: Convert a numeric EISAID to string representation. Return
- * buffer must be large enough to hold the string. The string
- * returned is always exactly of length ACPI_EISAID_STRING_SIZE
- * (includes null terminator). The EISAID is always 32 bits.
+ * DESCRIPTION: Convert a numeric EISA ID to string representation
*
******************************************************************************/

-void acpi_ex_eisa_id_to_string(char *out_string, acpi_integer compressed_id)
+void acpi_ex_eisa_id_to_string(u32 numeric_id, char *out_string)
{
- u32 swapped_id;
+ u32 eisa_id;

ACPI_FUNCTION_ENTRY();

- /* The EISAID should be a 32-bit integer */
-
- if (compressed_id > ACPI_UINT32_MAX) {
- ACPI_WARNING((AE_INFO,
- "Expected EISAID is larger than 32 bits: 0x%8.8X%8.8X, truncating",
- ACPI_FORMAT_UINT64(compressed_id)));
- }
-
/* Swap ID to big-endian to get contiguous bits */

- swapped_id = acpi_ut_dword_byte_swap((u32)compressed_id);
+ eisa_id = acpi_ut_dword_byte_swap(numeric_id);

- /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */
-
- out_string[0] =
- (char)(0x40 + (((unsigned long)swapped_id >> 26) & 0x1F));
- out_string[1] = (char)(0x40 + ((swapped_id >> 21) & 0x1F));
- out_string[2] = (char)(0x40 + ((swapped_id >> 16) & 0x1F));
- out_string[3] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 12);
- out_string[4] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 8);
- out_string[5] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 4);
- out_string[6] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 0);
+ out_string[0] = (char)('@' + (((unsigned long)eisa_id >> 26) & 0x1f));
+ out_string[1] = (char)('@' + ((eisa_id >> 21) & 0x1f));
+ out_string[2] = (char)('@' + ((eisa_id >> 16) & 0x1f));
+ out_string[3] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 12);
+ out_string[4] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 8);
+ out_string[5] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 4);
+ out_string[6] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 0);
out_string[7] = 0;
}

/*******************************************************************************
*
- * FUNCTION: acpi_ex_integer_to_string
+ * FUNCTION: acpi_ex_unsigned_integer_to_string
*
- * PARAMETERS: out_string - Where to put the converted string. At least
- * 21 bytes are needed to hold the largest
- * possible 64-bit integer.
- * Value - Value to be converted
+ * PARAMETERS: Value - Value to be converted
+ * out_string - Where to put the converted string (8 bytes)
*
* RETURN: None, string
*
- * DESCRIPTION: Convert a 64-bit integer to decimal string representation.
- * Assumes string buffer is large enough to hold the string. The
- * largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1).
+ * DESCRIPTION: Convert a number to string representation. Assumes string
+ * buffer is large enough to hold the string.
*
******************************************************************************/

-void acpi_ex_integer_to_string(char *out_string, acpi_integer value)
+void acpi_ex_unsigned_integer_to_string(acpi_integer value, char *out_string)
{
u32 count;
u32 digits_needed;
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
index 0fe87f1..41994fe 100644
--- a/drivers/acpi/acpica/nsdumpdv.c
+++ b/drivers/acpi/acpica/nsdumpdv.c
@@ -70,6 +70,7 @@ static acpi_status
acpi_ns_dump_one_device(acpi_handle obj_handle,
u32 level, void *context, void **return_value)
{
+ struct acpi_buffer buffer;
struct acpi_device_info *info;
acpi_status status;
u32 i;
@@ -79,15 +80,17 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
status =
acpi_ns_dump_one_object(obj_handle, level, context, return_value);

- status = acpi_get_object_info(obj_handle, &info);
+ buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ status = acpi_get_object_info(obj_handle, &buffer);
if (ACPI_SUCCESS(status)) {
+ info = buffer.pointer;
for (i = 0; i < level; i++) {
ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES, " "));
}

ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
" HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
- info->hardware_id.string,
+ info->hardware_id.value,
ACPI_FORMAT_UINT64(info->address),
info->current_status));
ACPI_FREE(info);
diff --git a/drivers/acpi/acpica/nsxfeval.c b/drivers/acpi/acpica/nsxfeval.c
index eaacbf4..18d0ca1 100644
--- a/drivers/acpi/acpica/nsxfeval.c
+++ b/drivers/acpi/acpica/nsxfeval.c
@@ -538,11 +538,10 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
acpi_status status;
struct acpi_namespace_node *node;
u32 flags;
- struct acpica_device_id *hid;
- struct acpica_device_id_list *cid;
+ struct acpica_device_id hid;
+ struct acpi_compatible_id_list *cid;
u32 i;
- u8 found;
- int no_match;
+ int found;

status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
@@ -586,14 +585,10 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
return (AE_CTRL_DEPTH);
}

- no_match = ACPI_STRCMP(hid->string, info->hid);
- ACPI_FREE(hid);
+ if (ACPI_STRNCMP(hid.value, info->hid, sizeof(hid.value)) != 0) {
+
+ /* Get the list of Compatible IDs */

- if (no_match) {
- /*
- * HID does not match, attempt match within the
- * list of Compatible IDs (CIDs)
- */
status = acpi_ut_execute_CID(node, &cid);
if (status == AE_NOT_FOUND) {
return (AE_OK);
@@ -605,8 +600,10 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,

found = 0;
for (i = 0; i < cid->count; i++) {
- if (ACPI_STRCMP(cid->ids[i].string, info->hid)
- == 0) {
+ if (ACPI_STRNCMP(cid->id[i].value, info->hid,
+ sizeof(struct
+ acpi_compatible_id)) ==
+ 0) {
found = 1;
break;
}
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
index ddc84af..f23593d 100644
--- a/drivers/acpi/acpica/nsxfname.c
+++ b/drivers/acpi/acpica/nsxfname.c
@@ -51,11 +51,6 @@
#define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME("nsxfname")

-/* Local prototypes */
-static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
- struct acpica_device_id *source,
- char *string_area);
-
/******************************************************************************
*
* FUNCTION: acpi_get_handle
@@ -73,7 +68,6 @@ static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
* namespace handle.
*
******************************************************************************/
-
acpi_status
acpi_get_handle(acpi_handle parent,
acpi_string pathname, acpi_handle * ret_handle)
@@ -216,38 +210,10 @@ ACPI_EXPORT_SYMBOL(acpi_get_name)

/******************************************************************************
*
- * FUNCTION: acpi_ns_copy_device_id
- *
- * PARAMETERS: Dest - Pointer to the destination DEVICE_ID
- * Source - Pointer to the source DEVICE_ID
- * string_area - Pointer to where to copy the dest string
- *
- * RETURN: Pointer to the next string area
- *
- * DESCRIPTION: Copy a single DEVICE_ID, including the string data.
- *
- ******************************************************************************/
-static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
- struct acpica_device_id *source,
- char *string_area)
-{
- /* Create the destination DEVICE_ID */
-
- dest->string = string_area;
- dest->length = source->length;
-
- /* Copy actual string and return a pointer to the next string area */
-
- ACPI_MEMCPY(string_area, source->string, source->length);
- return (string_area + source->length);
-}
-
-/******************************************************************************
- *
* FUNCTION: acpi_get_object_info
*
- * PARAMETERS: Handle - Object Handle
- * return_buffer - Where the info is returned
+ * PARAMETERS: Handle - Object Handle
+ * Buffer - Where the info is returned
*
* RETURN: Status
*
@@ -255,37 +221,33 @@ static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
* namespace node and possibly by running several standard
* control methods (Such as in the case of a device.)
*
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
- * _ADR, _sx_w, and _sx_d methods.
- *
- * Note: Allocates the return buffer, must be freed by the caller.
- *
******************************************************************************/
-
acpi_status
-acpi_get_object_info(acpi_handle handle,
- struct acpi_device_info **return_buffer)
+acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
{
+ acpi_status status;
struct acpi_namespace_node *node;
struct acpi_device_info *info;
- struct acpica_device_id_list *cid_list = NULL;
- struct acpica_device_id *hid = NULL;
- struct acpica_device_id *uid = NULL;
- char *next_id_string;
- acpi_object_type type;
- acpi_name name;
- u8 param_count = 0;
- u8 valid = 0;
- u32 info_size;
- u32 i;
- acpi_status status;
+ struct acpi_device_info *return_info;
+ struct acpi_compatible_id_list *cid_list = NULL;
+ acpi_size size;

/* Parameter validation */

- if (!handle || !return_buffer) {
+ if (!handle || !buffer) {
return (AE_BAD_PARAMETER);
}

+ status = acpi_ut_validate_buffer(buffer);
+ if (ACPI_FAILURE(status)) {
+ return (status);
+ }
+
+ info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_device_info));
+ if (!info) {
+ return (AE_NO_MEMORY);
+ }
+
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto cleanup;
@@ -294,91 +256,66 @@ acpi_get_object_info(acpi_handle handle,
node = acpi_ns_map_handle_to_node(handle);
if (!node) {
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
- return (AE_BAD_PARAMETER);
+ status = AE_BAD_PARAMETER;
+ goto cleanup;
}

- /* Get the namespace node data while the namespace is locked */
+ /* Init return structure */
+
+ size = sizeof(struct acpi_device_info);

- info_size = sizeof(struct acpi_device_info);
- type = node->type;
- name = node->name.integer;
+ info->type = node->type;
+ info->name = node->name.integer;
+ info->valid = 0;

if (node->type == ACPI_TYPE_METHOD) {
- param_count = node->object->method.param_count;
+ info->param_count = node->object->method.param_count;
}

status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
- return (status);
+ goto cleanup;
}

- if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
+ /* If not a device, we are all done */
+
+ if (info->type == ACPI_TYPE_DEVICE) {
/*
- * Get extra info for ACPI Device/Processor objects only:
- * Run the Device _HID, _UID, and _CID methods.
+ * Get extra info for ACPI Devices objects only:
+ * Run the Device _HID, _UID, _CID, _STA, _ADR and _sx_d methods.
*
* Note: none of these methods are required, so they may or may
- * not be present for this device. The Info->Valid bitfield is used
- * to indicate which methods were found and run successfully.
+ * not be present for this device. The Info->Valid bitfield is used
+ * to indicate which methods were found and ran successfully.
*/

/* Execute the Device._HID method */

- status = acpi_ut_execute_HID(node, &hid);
+ status = acpi_ut_execute_HID(node, &info->hardware_id);
if (ACPI_SUCCESS(status)) {
- info_size += hid->length;
- valid |= ACPI_VALID_HID;
+ info->valid |= ACPI_VALID_HID;
}

/* Execute the Device._UID method */

- status = acpi_ut_execute_UID(node, &uid);
+ status = acpi_ut_execute_UID(node, &info->unique_id);
if (ACPI_SUCCESS(status)) {
- info_size += uid->length;
- valid |= ACPI_VALID_UID;
+ info->valid |= ACPI_VALID_UID;
}

/* Execute the Device._CID method */

status = acpi_ut_execute_CID(node, &cid_list);
if (ACPI_SUCCESS(status)) {
-
- /* Add size of CID strings and CID pointer array */
-
- info_size +=
- (cid_list->list_size -
- sizeof(struct acpica_device_id_list));
- valid |= ACPI_VALID_CID;
+ size += cid_list->size;
+ info->valid |= ACPI_VALID_CID;
}
- }
-
- /*
- * Now that we have the variable-length data, we can allocate the
- * return buffer
- */
- info = ACPI_ALLOCATE_ZEROED(info_size);
- if (!info) {
- status = AE_NO_MEMORY;
- goto cleanup;
- }
-
- /* Get the fixed-length data */
-
- if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
- /*
- * Get extra info for ACPI Device/Processor objects only:
- * Run the _STA, _ADR and, sx_w, and _sx_d methods.
- *
- * Note: none of these methods are required, so they may or may
- * not be present for this device. The Info->Valid bitfield is used
- * to indicate which methods were found and run successfully.
- */

/* Execute the Device._STA method */

status = acpi_ut_execute_STA(node, &info->current_status);
if (ACPI_SUCCESS(status)) {
- valid |= ACPI_VALID_STA;
+ info->valid |= ACPI_VALID_STA;
}

/* Execute the Device._ADR method */
@@ -386,100 +323,36 @@ acpi_get_object_info(acpi_handle handle,
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node,
&info->address);
if (ACPI_SUCCESS(status)) {
- valid |= ACPI_VALID_ADR;
- }
-
- /* Execute the Device._sx_w methods */
-
- status = acpi_ut_execute_power_methods(node,
- acpi_gbl_lowest_dstate_names,
- ACPI_NUM_sx_w_METHODS,
- info->lowest_dstates);
- if (ACPI_SUCCESS(status)) {
- valid |= ACPI_VALID_SXWS;
+ info->valid |= ACPI_VALID_ADR;
}

/* Execute the Device._sx_d methods */

- status = acpi_ut_execute_power_methods(node,
- acpi_gbl_highest_dstate_names,
- ACPI_NUM_sx_d_METHODS,
- info->highest_dstates);
+ status = acpi_ut_execute_sxds(node, info->highest_dstates);
if (ACPI_SUCCESS(status)) {
- valid |= ACPI_VALID_SXDS;
+ info->valid |= ACPI_VALID_SXDS;
}
}

- /*
- * Create a pointer to the string area of the return buffer.
- * Point to the end of the base struct acpi_device_info structure.
- */
- next_id_string = ACPI_CAST_PTR(char, info->compatible_id_list.ids);
- if (cid_list) {
-
- /* Point past the CID DEVICE_ID array */
+ /* Validate/Allocate/Clear caller buffer */

- next_id_string +=
- ((acpi_size) cid_list->count *
- sizeof(struct acpica_device_id));
+ status = acpi_ut_initialize_buffer(buffer, size);
+ if (ACPI_FAILURE(status)) {
+ goto cleanup;
}

- /*
- * Copy the HID, UID, and CIDs to the return buffer. The variable-length
- * strings are copied to the reserved area at the end of the buffer.
- *
- * For HID and CID, check if the ID is a PCI Root Bridge.
- */
- if (hid) {
- next_id_string = acpi_ns_copy_device_id(&info->hardware_id,
- hid, next_id_string);
-
- if (acpi_ut_is_pci_root_bridge(hid->string)) {
- info->flags |= ACPI_PCI_ROOT_BRIDGE;
- }
- }
+ /* Populate the return buffer */

- if (uid) {
- next_id_string = acpi_ns_copy_device_id(&info->unique_id,
- uid, next_id_string);
- }
+ return_info = buffer->pointer;
+ ACPI_MEMCPY(return_info, info, sizeof(struct acpi_device_info));

if (cid_list) {
- info->compatible_id_list.count = cid_list->count;
- info->compatible_id_list.list_size = cid_list->list_size;
-
- /* Copy each CID */
-
- for (i = 0; i < cid_list->count; i++) {
- next_id_string =
- acpi_ns_copy_device_id(&info->compatible_id_list.
- ids[i], &cid_list->ids[i],
- next_id_string);
-
- if (acpi_ut_is_pci_root_bridge(cid_list->ids[i].string)) {
- info->flags |= ACPI_PCI_ROOT_BRIDGE;
- }
- }
+ ACPI_MEMCPY(&return_info->compatibility_id, cid_list,
+ cid_list->size);
}

- /* Copy the fixed-length data */
-
- info->info_size = info_size;
- info->type = type;
- info->name = name;
- info->param_count = param_count;
- info->valid = valid;
-
- *return_buffer = info;
- status = AE_OK;
-
cleanup:
- if (hid) {
- ACPI_FREE(hid);
- }
- if (uid) {
- ACPI_FREE(uid);
- }
+ ACPI_FREE(info);
if (cid_list) {
ACPI_FREE(cid_list);
}
diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c
index 5d54e36..a4734ac 100644
--- a/drivers/acpi/acpica/uteval.c
+++ b/drivers/acpi/acpica/uteval.c
@@ -44,10 +44,19 @@
#include <acpi/acpi.h>
#include "accommon.h"
#include "acnamesp.h"
+#include "acinterp.h"

#define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME("uteval")

+/* Local prototypes */
+static void
+acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length);
+
+static acpi_status
+acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
+ struct acpi_compatible_id *one_cid);
+
/*
* Strings supported by the _OSI predefined (internal) method.
*
@@ -207,7 +216,7 @@ acpi_status acpi_osi_invalidate(char *interface)
* RETURN: Status
*
* DESCRIPTION: Evaluates a namespace object and verifies the type of the
- * return object. Common code that simplifies accessing objects
+ * return object. Common code that simplifies accessing objects
* that have required return objects of fixed types.
*
* NOTE: Internal function, no parameter validation
@@ -292,7 +301,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,

if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
/*
- * We received a return object, but one was not expected. This can
+ * We received a return object, but one was not expected. This can
* happen frequently if the "implicit return" feature is enabled.
* Just delete the return object and return AE_OK.
*/
@@ -334,12 +343,12 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
*
* PARAMETERS: object_name - Object name to be evaluated
* device_node - Node for the device
- * Value - Where the value is returned
+ * Address - Where the value is returned
*
* RETURN: Status
*
* DESCRIPTION: Evaluates a numeric namespace object for a selected device
- * and stores result in *Value.
+ * and stores result in *Address.
*
* NOTE: Internal function, no parameter validation
*
@@ -348,7 +357,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
acpi_status
acpi_ut_evaluate_numeric_object(char *object_name,
struct acpi_namespace_node *device_node,
- acpi_integer *value)
+ acpi_integer * address)
{
union acpi_operand_object *obj_desc;
acpi_status status;
@@ -363,7 +372,295 @@ acpi_ut_evaluate_numeric_object(char *object_name,

/* Get the returned Integer */

- *value = obj_desc->integer.value;
+ *address = obj_desc->integer.value;
+
+ /* On exit, we must delete the return object */
+
+ acpi_ut_remove_reference(obj_desc);
+ return_ACPI_STATUS(status);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_copy_id_string
+ *
+ * PARAMETERS: Destination - Where to copy the string
+ * Source - Source string
+ * max_length - Length of the destination buffer
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
+ * Performs removal of a leading asterisk if present -- workaround
+ * for a known issue on a bunch of machines.
+ *
+ ******************************************************************************/
+
+static void
+acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length)
+{
+
+ /*
+ * Workaround for ID strings that have a leading asterisk. This construct
+ * is not allowed by the ACPI specification (ID strings must be
+ * alphanumeric), but enough existing machines have this embedded in their
+ * ID strings that the following code is useful.
+ */
+ if (*source == '*') {
+ source++;
+ }
+
+ /* Do the actual copy */
+
+ ACPI_STRNCPY(destination, source, max_length);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_execute_HID
+ *
+ * PARAMETERS: device_node - Node for the device
+ * Hid - Where the HID is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes the _HID control method that returns the hardware
+ * ID of the device.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
+ struct acpica_device_id *hid)
+{
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
+
+ ACPI_FUNCTION_TRACE(ut_execute_HID);
+
+ status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
+ ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
+ &obj_desc);
+ if (ACPI_FAILURE(status)) {
+ return_ACPI_STATUS(status);
+ }
+
+ if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
+
+ /* Convert the Numeric HID to string */
+
+ acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
+ hid->value);
+ } else {
+ /* Copy the String HID from the returned object */
+
+ acpi_ut_copy_id_string(hid->value, obj_desc->string.pointer,
+ sizeof(hid->value));
+ }
+
+ /* On exit, we must delete the return object */
+
+ acpi_ut_remove_reference(obj_desc);
+ return_ACPI_STATUS(status);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_translate_one_cid
+ *
+ * PARAMETERS: obj_desc - _CID object, must be integer or string
+ * one_cid - Where the CID string is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return a numeric or string _CID value as a string.
+ * (Compatible ID)
+ *
+ * NOTE: Assumes a maximum _CID string length of
+ * ACPI_MAX_CID_LENGTH.
+ *
+ ******************************************************************************/
+
+static acpi_status
+acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
+ struct acpi_compatible_id *one_cid)
+{
+
+ switch (obj_desc->common.type) {
+ case ACPI_TYPE_INTEGER:
+
+ /* Convert the Numeric CID to string */
+
+ acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
+ one_cid->value);
+ return (AE_OK);
+
+ case ACPI_TYPE_STRING:
+
+ if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) {
+ return (AE_AML_STRING_LIMIT);
+ }
+
+ /* Copy the String CID from the returned object */
+
+ acpi_ut_copy_id_string(one_cid->value, obj_desc->string.pointer,
+ ACPI_MAX_CID_LENGTH);
+ return (AE_OK);
+
+ default:
+
+ return (AE_TYPE);
+ }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_execute_CID
+ *
+ * PARAMETERS: device_node - Node for the device
+ * return_cid_list - Where the CID list is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes the _CID control method that returns one or more
+ * compatible hardware IDs for the device.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
+ struct acpi_compatible_id_list ** return_cid_list)
+{
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
+ u32 count;
+ u32 size;
+ struct acpi_compatible_id_list *cid_list;
+ u32 i;
+
+ ACPI_FUNCTION_TRACE(ut_execute_CID);
+
+ /* Evaluate the _CID method for this device */
+
+ status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
+ ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
+ | ACPI_BTYPE_PACKAGE, &obj_desc);
+ if (ACPI_FAILURE(status)) {
+ return_ACPI_STATUS(status);
+ }
+
+ /* Get the number of _CIDs returned */
+
+ count = 1;
+ if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
+ count = obj_desc->package.count;
+ }
+
+ /* Allocate a worst-case buffer for the _CIDs */
+
+ size = (((count - 1) * sizeof(struct acpi_compatible_id)) +
+ sizeof(struct acpi_compatible_id_list));
+
+ cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
+ if (!cid_list) {
+ return_ACPI_STATUS(AE_NO_MEMORY);
+ }
+
+ /* Init CID list */
+
+ cid_list->count = count;
+ cid_list->size = size;
+
+ /*
+ * A _CID can return either a single compatible ID or a package of
+ * compatible IDs. Each compatible ID can be one of the following:
+ * 1) Integer (32 bit compressed EISA ID) or
+ * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
+ */
+
+ /* The _CID object can be either a single CID or a package (list) of CIDs */
+
+ if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
+
+ /* Translate each package element */
+
+ for (i = 0; i < count; i++) {
+ status =
+ acpi_ut_translate_one_cid(obj_desc->package.
+ elements[i],
+ &cid_list->id[i]);
+ if (ACPI_FAILURE(status)) {
+ break;
+ }
+ }
+ } else {
+ /* Only one CID, translate to a string */
+
+ status = acpi_ut_translate_one_cid(obj_desc, cid_list->id);
+ }
+
+ /* Cleanup on error */
+
+ if (ACPI_FAILURE(status)) {
+ ACPI_FREE(cid_list);
+ } else {
+ *return_cid_list = cid_list;
+ }
+
+ /* On exit, we must delete the _CID return object */
+
+ acpi_ut_remove_reference(obj_desc);
+ return_ACPI_STATUS(status);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_ut_execute_UID
+ *
+ * PARAMETERS: device_node - Node for the device
+ * Uid - Where the UID is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes the _UID control method that returns the hardware
+ * ID of the device.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
+ struct acpica_device_id *uid)
+{
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
+
+ ACPI_FUNCTION_TRACE(ut_execute_UID);
+
+ status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
+ ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
+ &obj_desc);
+ if (ACPI_FAILURE(status)) {
+ return_ACPI_STATUS(status);
+ }
+
+ if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
+
+ /* Convert the Numeric UID to string */
+
+ acpi_ex_unsigned_integer_to_string(obj_desc->integer.value,
+ uid->value);
+ } else {
+ /* Copy the String UID from the returned object */
+
+ acpi_ut_copy_id_string(uid->value, obj_desc->string.pointer,
+ sizeof(uid->value));
+ }

/* On exit, we must delete the return object */

@@ -422,64 +719,60 @@ acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)

/*******************************************************************************
*
- * FUNCTION: acpi_ut_execute_power_methods
+ * FUNCTION: acpi_ut_execute_Sxds
*
* PARAMETERS: device_node - Node for the device
- * method_names - Array of power method names
- * method_count - Number of methods to execute
- * out_values - Where the power method values are returned
+ * Flags - Where the status flags are returned
*
- * RETURN: Status, out_values
+ * RETURN: Status
*
- * DESCRIPTION: Executes the specified power methods for the device and returns
- * the result(s).
+ * DESCRIPTION: Executes _STA for selected device and stores results in
+ * *Flags.
*
* NOTE: Internal function, no parameter validation
*
-******************************************************************************/
+ ******************************************************************************/

acpi_status
-acpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
- const char **method_names,
- u8 method_count, u8 *out_values)
+acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
{
union acpi_operand_object *obj_desc;
acpi_status status;
- acpi_status final_status = AE_NOT_FOUND;
u32 i;

- ACPI_FUNCTION_TRACE(ut_execute_power_methods);
+ ACPI_FUNCTION_TRACE(ut_execute_sxds);

- for (i = 0; i < method_count; i++) {
- /*
- * Execute the power method (_sx_d or _sx_w). The only allowable
- * return type is an Integer.
- */
+ for (i = 0; i < 4; i++) {
+ highest[i] = 0xFF;
status = acpi_ut_evaluate_object(device_node,
ACPI_CAST_PTR(char,
- method_names[i]),
+ acpi_gbl_highest_dstate_names
+ [i]),
ACPI_BTYPE_INTEGER, &obj_desc);
- if (ACPI_SUCCESS(status)) {
- out_values[i] = (u8)obj_desc->integer.value;
+ if (ACPI_FAILURE(status)) {
+ if (status != AE_NOT_FOUND) {
+ ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+ "%s on Device %4.4s, %s\n",
+ ACPI_CAST_PTR(char,
+ acpi_gbl_highest_dstate_names
+ [i]),
+ acpi_ut_get_node_name
+ (device_node),
+ acpi_format_exception
+ (status)));
+
+ return_ACPI_STATUS(status);
+ }
+ } else {
+ /* Extract the Dstate value */
+
+ highest[i] = (u8) obj_desc->integer.value;

/* Delete the return object */

acpi_ut_remove_reference(obj_desc);
- final_status = AE_OK; /* At least one value is valid */
- continue;
}
-
- out_values[i] = ACPI_UINT8_MAX;
- if (status == AE_NOT_FOUND) {
- continue; /* Ignore if not found */
- }
-
- ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
- "Failed %s on Device %4.4s, %s\n",
- ACPI_CAST_PTR(char, method_names[i]),
- acpi_ut_get_node_name(device_node),
- acpi_format_exception(status)));
}

- return_ACPI_STATUS(final_status);
+ return_ACPI_STATUS(AE_OK);
}
diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c
index 3f2c68f..1d83dd5 100644
--- a/drivers/acpi/acpica/utglobal.c
+++ b/drivers/acpi/acpica/utglobal.c
@@ -90,15 +90,7 @@ const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = {
"\\_S5_"
};

-const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS] = {
- "_S0W",
- "_S1W",
- "_S2W",
- "_S3W",
- "_S4W"
-};
-
-const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS] = {
+const char *acpi_gbl_highest_dstate_names[4] = {
"_S1D",
"_S2D",
"_S3D",
diff --git a/drivers/acpi/acpica/utids.c b/drivers/acpi/acpica/utids.c
deleted file mode 100644
index 52eaae4..0000000
--- a/drivers/acpi/acpica/utids.c
+++ /dev/null
@@ -1,382 +0,0 @@
-/******************************************************************************
- *
- * Module Name: utids - support for device IDs - HID, UID, CID
- *
- *****************************************************************************/
-
-/*
- * Copyright (C) 2000 - 2009, Intel Corp.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions, and the following disclaimer,
- * without modification.
- * 2. Redistributions in binary form must reproduce at minimum a disclaimer
- * substantially similar to the "NO WARRANTY" disclaimer below
- * ("Disclaimer") and any redistribution must be conditioned upon
- * including a substantially similar Disclaimer requirement for further
- * binary redistribution.
- * 3. Neither the names of the above-listed copyright holders nor the names
- * of any contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * Alternatively, this software may be distributed under the terms of the
- * GNU General Public License ("GPL") version 2 as published by the Free
- * Software Foundation.
- *
- * NO WARRANTY
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- */
-
-#include <acpi/acpi.h>
-#include "accommon.h"
-#include "acinterp.h"
-
-#define _COMPONENT ACPI_UTILITIES
-ACPI_MODULE_NAME("utids")
-
-/* Local prototypes */
-static void acpi_ut_copy_id_string(char *destination, char *source);
-
-/*******************************************************************************
- *
- * FUNCTION: acpi_ut_copy_id_string
- *
- * PARAMETERS: Destination - Where to copy the string
- * Source - Source string
- *
- * RETURN: None
- *
- * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
- * Performs removal of a leading asterisk if present -- workaround
- * for a known issue on a bunch of machines.
- *
- ******************************************************************************/
-
-static void acpi_ut_copy_id_string(char *destination, char *source)
-{
-
- /*
- * Workaround for ID strings that have a leading asterisk. This construct
- * is not allowed by the ACPI specification (ID strings must be
- * alphanumeric), but enough existing machines have this embedded in their
- * ID strings that the following code is useful.
- */
- if (*source == '*') {
- source++;
- }
-
- /* Do the actual copy */
-
- ACPI_STRCPY(destination, source);
-}
-
-/*******************************************************************************
- *
- * FUNCTION: acpi_ut_execute_HID
- *
- * PARAMETERS: device_node - Node for the device
- * return_id - Where the string HID is returned
- *
- * RETURN: Status
- *
- * DESCRIPTION: Executes the _HID control method that returns the hardware
- * ID of the device. The HID is either an 32-bit encoded EISAID
- * Integer or a String. A string is always returned. An EISAID
- * is converted to a string.
- *
- * NOTE: Internal function, no parameter validation
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
- struct acpica_device_id **return_id)
-{
- union acpi_operand_object *obj_desc;
- struct acpica_device_id *hid;
- u32 length;
- acpi_status status;
-
- ACPI_FUNCTION_TRACE(ut_execute_HID);
-
- status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
- ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
- &obj_desc);
- if (ACPI_FAILURE(status)) {
- return_ACPI_STATUS(status);
- }
-
- /* Get the size of the String to be returned, includes null terminator */
-
- if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
- length = ACPI_EISAID_STRING_SIZE;
- } else {
- length = obj_desc->string.length + 1;
- }
-
- /* Allocate a buffer for the HID */
-
- hid =
- ACPI_ALLOCATE_ZEROED(sizeof(struct acpica_device_id) +
- (acpi_size) length);
- if (!hid) {
- status = AE_NO_MEMORY;
- goto cleanup;
- }
-
- /* Area for the string starts after DEVICE_ID struct */
-
- hid->string = ACPI_ADD_PTR(char, hid, sizeof(struct acpica_device_id));
-
- /* Convert EISAID to a string or simply copy existing string */
-
- if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
- acpi_ex_eisa_id_to_string(hid->string, obj_desc->integer.value);
- } else {
- acpi_ut_copy_id_string(hid->string, obj_desc->string.pointer);
- }
-
- hid->length = length;
- *return_id = hid;
-
-cleanup:
-
- /* On exit, we must delete the return object */
-
- acpi_ut_remove_reference(obj_desc);
- return_ACPI_STATUS(status);
-}
-
-/*******************************************************************************
- *
- * FUNCTION: acpi_ut_execute_UID
- *
- * PARAMETERS: device_node - Node for the device
- * return_id - Where the string UID is returned
- *
- * RETURN: Status
- *
- * DESCRIPTION: Executes the _UID control method that returns the unique
- * ID of the device. The UID is either a 64-bit Integer (NOT an
- * EISAID) or a string. Always returns a string. A 64-bit integer
- * is converted to a decimal string.
- *
- * NOTE: Internal function, no parameter validation
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
- struct acpica_device_id **return_id)
-{
- union acpi_operand_object *obj_desc;
- struct acpica_device_id *uid;
- u32 length;
- acpi_status status;
-
- ACPI_FUNCTION_TRACE(ut_execute_UID);
-
- status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
- ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
- &obj_desc);
- if (ACPI_FAILURE(status)) {
- return_ACPI_STATUS(status);
- }
-
- /* Get the size of the String to be returned, includes null terminator */
-
- if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
- length = ACPI_MAX64_DECIMAL_DIGITS + 1;
- } else {
- length = obj_desc->string.length + 1;
- }
-
- /* Allocate a buffer for the UID */
-
- uid =
- ACPI_ALLOCATE_ZEROED(sizeof(struct acpica_device_id) +
- (acpi_size) length);
- if (!uid) {
- status = AE_NO_MEMORY;
- goto cleanup;
- }
-
- /* Area for the string starts after DEVICE_ID struct */
-
- uid->string = ACPI_ADD_PTR(char, uid, sizeof(struct acpica_device_id));
-
- /* Convert an Integer to string, or just copy an existing string */
-
- if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
- acpi_ex_integer_to_string(uid->string, obj_desc->integer.value);
- } else {
- acpi_ut_copy_id_string(uid->string, obj_desc->string.pointer);
- }
-
- uid->length = length;
- *return_id = uid;
-
-cleanup:
-
- /* On exit, we must delete the return object */
-
- acpi_ut_remove_reference(obj_desc);
- return_ACPI_STATUS(status);
-}
-
-/*******************************************************************************
- *
- * FUNCTION: acpi_ut_execute_CID
- *
- * PARAMETERS: device_node - Node for the device
- * return_cid_list - Where the CID list is returned
- *
- * RETURN: Status, list of CID strings
- *
- * DESCRIPTION: Executes the _CID control method that returns one or more
- * compatible hardware IDs for the device.
- *
- * NOTE: Internal function, no parameter validation
- *
- * A _CID method can return either a single compatible ID or a package of
- * compatible IDs. Each compatible ID can be one of the following:
- * 1) Integer (32 bit compressed EISA ID) or
- * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
- *
- * The Integer CIDs are converted to string format by this function.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
- struct acpica_device_id_list **return_cid_list)
-{
- union acpi_operand_object **cid_objects;
- union acpi_operand_object *obj_desc;
- struct acpica_device_id_list *cid_list;
- char *next_id_string;
- u32 string_area_size;
- u32 length;
- u32 cid_list_size;
- acpi_status status;
- u32 count;
- u32 i;
-
- ACPI_FUNCTION_TRACE(ut_execute_CID);
-
- /* Evaluate the _CID method for this device */
-
- status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
- ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
- | ACPI_BTYPE_PACKAGE, &obj_desc);
- if (ACPI_FAILURE(status)) {
- return_ACPI_STATUS(status);
- }
-
- /*
- * Get the count and size of the returned _CIDs. _CID can return either
- * a Package of Integers/Strings or a single Integer or String.
- * Note: This section also validates that all CID elements are of the
- * correct type (Integer or String).
- */
- if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
- count = obj_desc->package.count;
- cid_objects = obj_desc->package.elements;
- } else { /* Single Integer or String CID */
-
- count = 1;
- cid_objects = &obj_desc;
- }
-
- string_area_size = 0;
- for (i = 0; i < count; i++) {
-
- /* String lengths include null terminator */
-
- switch (cid_objects[i]->common.type) {
- case ACPI_TYPE_INTEGER:
- string_area_size += ACPI_EISAID_STRING_SIZE;
- break;
-
- case ACPI_TYPE_STRING:
- string_area_size += cid_objects[i]->string.length + 1;
- break;
-
- default:
- status = AE_TYPE;
- goto cleanup;
- }
- }
-
- /*
- * Now that we know the length of the CIDs, allocate return buffer:
- * 1) Size of the base structure +
- * 2) Size of the CID DEVICE_ID array +
- * 3) Size of the actual CID strings
- */
- cid_list_size = sizeof(struct acpica_device_id_list) +
- ((count - 1) * sizeof(struct acpica_device_id)) + string_area_size;
-
- cid_list = ACPI_ALLOCATE_ZEROED(cid_list_size);
- if (!cid_list) {
- status = AE_NO_MEMORY;
- goto cleanup;
- }
-
- /* Area for CID strings starts after the CID DEVICE_ID array */
-
- next_id_string = ACPI_CAST_PTR(char, cid_list->ids) +
- ((acpi_size) count * sizeof(struct acpica_device_id));
-
- /* Copy/convert the CIDs to the return buffer */
-
- for (i = 0; i < count; i++) {
- if (cid_objects[i]->common.type == ACPI_TYPE_INTEGER) {
-
- /* Convert the Integer (EISAID) CID to a string */
-
- acpi_ex_eisa_id_to_string(next_id_string,
- cid_objects[i]->integer.
- value);
- length = ACPI_EISAID_STRING_SIZE;
- } else { /* ACPI_TYPE_STRING */
-
- /* Copy the String CID from the returned object */
-
- acpi_ut_copy_id_string(next_id_string,
- cid_objects[i]->string.pointer);
- length = cid_objects[i]->string.length + 1;
- }
-
- cid_list->ids[i].string = next_id_string;
- cid_list->ids[i].length = length;
- next_id_string += length;
- }
-
- /* Finish the CID list */
-
- cid_list->count = count;
- cid_list->list_size = cid_list_size;
- *return_cid_list = cid_list;
-
-cleanup:
-
- /* On exit, we must delete the _CID return object */
-
- acpi_ut_remove_reference(obj_desc);
- return_ACPI_STATUS(status);
-}
diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c
index 61f6315..75d2d93 100644
--- a/drivers/acpi/acpica/utmisc.c
+++ b/drivers/acpi/acpica/utmisc.c
@@ -125,34 +125,6 @@ const char *acpi_ut_validate_exception(acpi_status status)

/*******************************************************************************
*
- * FUNCTION: acpi_ut_is_pci_root_bridge
- *
- * PARAMETERS: Id - The HID/CID in string format
- *
- * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
- *
- * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
- *
- ******************************************************************************/
-
-u8 acpi_ut_is_pci_root_bridge(char *id)
-{
-
- /*
- * Check if this is a PCI root bridge.
- * ACPI 3.0+: check for a PCI Express root also.
- */
- if (!(ACPI_STRCMP(id,
- PCI_ROOT_HID_STRING)) ||
- !(ACPI_STRCMP(id, PCI_EXPRESS_ROOT_HID_STRING))) {
- return (TRUE);
- }
-
- return (FALSE);
-}
-
-/*******************************************************************************
- *
* FUNCTION: acpi_ut_is_aml_table
*
* PARAMETERS: Table - An ACPI table
diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
index 642bb30..5f2c3c0 100644
--- a/drivers/acpi/container.c
+++ b/drivers/acpi/container.c
@@ -202,17 +202,20 @@ container_walk_namespace_cb(acpi_handle handle,
u32 lvl, void *context, void **rv)
{
char *hid = NULL;
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_device_info *info;
acpi_status status;
int *action = context;

- status = acpi_get_object_info(handle, &info);
- if (ACPI_FAILURE(status)) {
+
+ status = acpi_get_object_info(handle, &buffer);
+ if (ACPI_FAILURE(status) || !buffer.pointer) {
return AE_OK;
}

+ info = buffer.pointer;
if (info->valid & ACPI_VALID_HID)
- hid = info->hardware_id.string;
+ hid = info->hardware_id.value;

if (hid == NULL) {
goto end;
@@ -239,7 +242,7 @@ container_walk_namespace_cb(acpi_handle handle,
}

end:
- kfree(info);
+ kfree(buffer.pointer);

return AE_OK;
}
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
index 3a2cfef..9a85566 100644
--- a/drivers/acpi/dock.c
+++ b/drivers/acpi/dock.c
@@ -233,16 +233,18 @@ static int is_ata(acpi_handle handle)
static int is_battery(acpi_handle handle)
{
struct acpi_device_info *info;
+ struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
int ret = 1;

- if (!ACPI_SUCCESS(acpi_get_object_info(handle, &info)))
+ if (!ACPI_SUCCESS(acpi_get_object_info(handle, &buffer)))
return 0;
+ info = buffer.pointer;
if (!(info->valid & ACPI_VALID_HID))
ret = 0;
else
- ret = !strcmp("PNP0C0A", info->hardware_id.string);
+ ret = !strcmp("PNP0C0A", info->hardware_id.value);

- kfree(info);
+ kfree(buffer.pointer);
return ret;
}

diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index c6645f2..82daa75 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -95,13 +95,15 @@ do_acpi_find_child(acpi_handle handle, u32 lvl, void *context, void **rv)
{
acpi_status status;
struct acpi_device_info *info;
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_find_child *find = context;

- status = acpi_get_object_info(handle, &info);
+ status = acpi_get_object_info(handle, &buffer);
if (ACPI_SUCCESS(status)) {
+ info = buffer.pointer;
if (info->address == find->address)
find->handle = handle;
- kfree(info);
+ kfree(buffer.pointer);
}
return AE_OK;
}
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 408ebde..056f17c 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -60,13 +60,13 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
}

if (acpi_dev->flags.compatible_ids) {
- struct acpica_device_id_list *cid_list;
+ struct acpi_compatible_id_list *cid_list;
int i;

cid_list = acpi_dev->pnp.cid_list;
for (i = 0; i < cid_list->count; i++) {
count = snprintf(&modalias[len], size, "%s:",
- cid_list->ids[i].string);
+ cid_list->id[i].value);
if (count < 0 || count >= size) {
printk(KERN_ERR PREFIX "%s cid[%i] exceeds event buffer size",
acpi_dev->pnp.device_name, i);
@@ -287,14 +287,14 @@ int acpi_match_device_ids(struct acpi_device *device,
}

if (device->flags.compatible_ids) {
- struct acpica_device_id_list *cid_list = device->pnp.cid_list;
+ struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
int i;

for (id = ids; id->id[0]; id++) {
/* compare multiple _CID entries against driver ids */
for (i = 0; i < cid_list->count; i++) {
if (!strcmp((char*)id->id,
- cid_list->ids[i].string))
+ cid_list->id[i].value))
return 0;
}
}
@@ -1000,89 +1000,33 @@ static int acpi_dock_match(struct acpi_device *device)
return acpi_get_handle(device->handle, "_DCK", &tmp);
}

-static struct acpica_device_id_list*
-acpi_add_cid(
- struct acpi_device_info *info,
- struct acpica_device_id *new_cid)
-{
- struct acpica_device_id_list *cid;
- char *next_id_string;
- acpi_size cid_length;
- acpi_size new_cid_length;
- u32 i;
-
-
- /* Allocate new CID list with room for the new CID */
-
- if (!new_cid)
- new_cid_length = info->compatible_id_list.list_size;
- else if (info->compatible_id_list.list_size)
- new_cid_length = info->compatible_id_list.list_size +
- new_cid->length + sizeof(struct acpica_device_id);
- else
- new_cid_length = sizeof(struct acpica_device_id_list) + new_cid->length;
-
- cid = ACPI_ALLOCATE_ZEROED(new_cid_length);
- if (!cid) {
- return NULL;
- }
-
- cid->list_size = new_cid_length;
- cid->count = info->compatible_id_list.count;
- if (new_cid)
- cid->count++;
- next_id_string = (char *) cid->ids + (cid->count * sizeof(struct acpica_device_id));
-
- /* Copy all existing CIDs */
-
- for (i = 0; i < info->compatible_id_list.count; i++) {
- cid_length = info->compatible_id_list.ids[i].length;
- cid->ids[i].string = next_id_string;
- cid->ids[i].length = cid_length;
-
- ACPI_MEMCPY(next_id_string, info->compatible_id_list.ids[i].string,
- cid_length);
-
- next_id_string += cid_length;
- }
-
- /* Append the new CID */
-
- if (new_cid) {
- cid->ids[i].string = next_id_string;
- cid->ids[i].length = new_cid->length;
-
- ACPI_MEMCPY(next_id_string, new_cid->string, new_cid->length);
- }
-
- return cid;
-}
-
static void acpi_device_set_id(struct acpi_device *device,
struct acpi_device *parent, acpi_handle handle,
int type)
{
- struct acpi_device_info *info = NULL;
+ struct acpi_device_info *info;
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
char *hid = NULL;
char *uid = NULL;
- struct acpica_device_id_list *cid_list = NULL;
- char *cid_add = NULL;
+ struct acpi_compatible_id_list *cid_list = NULL;
+ const char *cid_add = NULL;
acpi_status status;

switch (type) {
case ACPI_BUS_TYPE_DEVICE:
- status = acpi_get_object_info(handle, &info);
+ status = acpi_get_object_info(handle, &buffer);
if (ACPI_FAILURE(status)) {
printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__);
return;
}

+ info = buffer.pointer;
if (info->valid & ACPI_VALID_HID)
- hid = info->hardware_id.string;
+ hid = info->hardware_id.value;
if (info->valid & ACPI_VALID_UID)
- uid = info->unique_id.string;
+ uid = info->unique_id.value;
if (info->valid & ACPI_VALID_CID)
- cid_list = &info->compatible_id_list;
+ cid_list = &info->compatibility_id;
if (info->valid & ACPI_VALID_ADR) {
device->pnp.bus_address = info->address;
device->flags.bus_address = 1;
@@ -1133,46 +1077,55 @@ static void acpi_device_set_id(struct acpi_device *device,
}

if (hid) {
- device->pnp.hardware_id = ACPI_ALLOCATE_ZEROED(strlen (hid) + 1);
- if (device->pnp.hardware_id) {
- strcpy(device->pnp.hardware_id, hid);
- device->flags.hardware_id = 1;
- }
+ strcpy(device->pnp.hardware_id, hid);
+ device->flags.hardware_id = 1;
}
- if (!device->flags.hardware_id)
- device->pnp.hardware_id = "";
-
if (uid) {
- device->pnp.unique_id = ACPI_ALLOCATE_ZEROED(strlen (uid) + 1);
- if (device->pnp.unique_id) {
- strcpy(device->pnp.unique_id, uid);
- device->flags.unique_id = 1;
- }
+ strcpy(device->pnp.unique_id, uid);
+ device->flags.unique_id = 1;
}
- if (!device->flags.unique_id)
- device->pnp.unique_id = "";
-
if (cid_list || cid_add) {
- struct acpica_device_id_list *list;
-
- if (cid_add) {
- struct acpica_device_id cid;
- cid.length = strlen (cid_add) + 1;
- cid.string = cid_add;
-
- list = acpi_add_cid(info, &cid);
- } else {
- list = acpi_add_cid(info, NULL);
+ struct acpi_compatible_id_list *list;
+ int size = 0;
+ int count = 0;
+
+ if (cid_list) {
+ size = cid_list->size;
+ } else if (cid_add) {
+ size = sizeof(struct acpi_compatible_id_list);
+ cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
+ if (!cid_list) {
+ printk(KERN_ERR "Memory allocation error\n");
+ kfree(buffer.pointer);
+ return;
+ } else {
+ cid_list->count = 0;
+ cid_list->size = size;
+ }
}
+ if (cid_add)
+ size += sizeof(struct acpi_compatible_id);
+ list = kmalloc(size, GFP_KERNEL);

if (list) {
- device->pnp.cid_list = list;
- if (cid_add)
+ if (cid_list) {
+ memcpy(list, cid_list, cid_list->size);
+ count = cid_list->count;
+ }
+ if (cid_add) {
+ strncpy(list->id[count].value, cid_add,
+ ACPI_MAX_CID_LENGTH);
+ count++;
device->flags.compatible_ids = 1;
- }
+ }
+ list->size = size;
+ list->count = count;
+ device->pnp.cid_list = list;
+ } else
+ printk(KERN_ERR PREFIX "Memory allocation error\n");
}

- kfree(info);
+ kfree(buffer.pointer);
}

static int acpi_device_set_context(struct acpi_device *device, int type)
diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c
index 9047b27..501e293 100644
--- a/drivers/char/agp/hp-agp.c
+++ b/drivers/char/agp/hp-agp.c
@@ -476,6 +476,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
{
acpi_handle handle, parent;
acpi_status status;
+ struct acpi_buffer buffer;
struct acpi_device_info *info;
u64 lba_hpa, sba_hpa, length;
int match;
@@ -487,11 +488,13 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
/* Look for an enclosing IOC scope and find its CSR space */
handle = obj;
do {
- status = acpi_get_object_info(handle, &info);
+ buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ status = acpi_get_object_info(handle, &buffer);
if (ACPI_SUCCESS(status)) {
/* TBD check _CID also */
- info->hardware_id.string[sizeof(info->hardware_id.length)-1] = '\0';
- match = (strcmp(info->hardware_id.string, "HWP0001") == 0);
+ info = buffer.pointer;
+ info->hardware_id.value[sizeof(info->hardware_id)-1] = '\0';
+ match = (strcmp(info->hardware_id.value, "HWP0001") == 0);
kfree(info);
if (match) {
status = hp_acpi_csr_space(handle, &sba_hpa, &length);
diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c
index c0cf45a..c509c99 100644
--- a/drivers/ide/ide-acpi.c
+++ b/drivers/ide/ide-acpi.c
@@ -114,6 +114,8 @@ static int ide_get_dev_handle(struct device *dev, acpi_handle *handle,
unsigned int bus, devnum, func;
acpi_integer addr;
acpi_handle dev_handle;
+ struct acpi_buffer buffer = {.length = ACPI_ALLOCATE_BUFFER,
+ .pointer = NULL};
acpi_status status;
struct acpi_device_info *dinfo = NULL;
int ret = -ENODEV;
@@ -132,11 +134,12 @@ static int ide_get_dev_handle(struct device *dev, acpi_handle *handle,
goto err;
}

- status = acpi_get_object_info(dev_handle, &dinfo);
+ status = acpi_get_object_info(dev_handle, &buffer);
if (ACPI_FAILURE(status)) {
DEBPRINT("get_object_info for device failed\n");
goto err;
}
+ dinfo = buffer.pointer;
if (dinfo && (dinfo->valid & ACPI_VALID_ADR) &&
dinfo->address == addr) {
*pcidevfn = addr;
diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
index a9d926b..5befa7e 100644
--- a/drivers/pci/hotplug/acpiphp_ibm.c
+++ b/drivers/pci/hotplug/acpiphp_ibm.c
@@ -398,21 +398,23 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
acpi_handle *phandle = (acpi_handle *)context;
acpi_status status;
struct acpi_device_info *info;
+ struct acpi_buffer info_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
int retval = 0;

- status = acpi_get_object_info(handle, &info);
+ status = acpi_get_object_info(handle, &info_buffer);
if (ACPI_FAILURE(status)) {
err("%s: Failed to get device information status=0x%x\n",
__func__, status);
return retval;
}
- info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';
+ info = info_buffer.pointer;
+ info->hardware_id.value[sizeof(info->hardware_id.value) - 1] = '\0';

if (info->current_status && (info->valid & ACPI_VALID_HID) &&
- (!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
- !strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
+ (!strcmp(info->hardware_id.value, IBM_HARDWARE_ID1) ||
+ !strcmp(info->hardware_id.value, IBM_HARDWARE_ID2))) {
dbg("found hardware: %s, handle: %p\n",
- info->hardware_id.string, handle);
+ info->hardware_id.value, handle);
*phandle = handle;
/* returning non-zero causes the search to stop
* and returns this value to the caller of
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index f9f68e0..dafaa4a 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -976,12 +976,15 @@ static acpi_status sony_walk_callback(acpi_handle handle, u32 level,
void *context, void **return_value)
{
struct acpi_device_info *info;
+ struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+
+ if (ACPI_SUCCESS(acpi_get_object_info(handle, &buffer))) {
+ info = buffer.pointer;

- if (ACPI_SUCCESS(acpi_get_object_info(handle, &info))) {
printk(KERN_WARNING DRV_PFX "method: name: %4.4s, args %X\n",
(char *)&info->name, info->param_count);

- kfree(info);
+ kfree(buffer.pointer);
}

return AE_OK;
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
index c07fdb9..9496494 100644
--- a/drivers/pnp/pnpacpi/core.c
+++ b/drivers/pnp/pnpacpi/core.c
@@ -194,13 +194,13 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
pnpacpi_parse_resource_option_data(dev);

if (device->flags.compatible_ids) {
- struct acpica_device_id_list *cid_list = device->pnp.cid_list;
+ struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
int i;

for (i = 0; i < cid_list->count; i++) {
- if (!ispnpidacpi(cid_list->ids[i].string))
+ if (!ispnpidacpi(cid_list->id[i].value))
continue;
- pnp_add_id(dev, cid_list->ids[i].string);
+ pnp_add_id(dev, cid_list->id[i].value);
}
}

diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 1cef139..7f2cabb 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -169,15 +169,17 @@ struct acpi_device_dir {

typedef char acpi_bus_id[8];
typedef unsigned long acpi_bus_address;
+typedef char acpi_hardware_id[15];
+typedef char acpi_unique_id[9];
typedef char acpi_device_name[40];
typedef char acpi_device_class[20];

struct acpi_device_pnp {
acpi_bus_id bus_id; /* Object name */
acpi_bus_address bus_address; /* _ADR */
- char *hardware_id; /* _HID */
- struct acpica_device_id_list *cid_list; /* _CIDs */
- char *unique_id; /* _UID */
+ acpi_hardware_id hardware_id; /* _HID */
+ struct acpi_compatible_id_list *cid_list; /* _CIDs */
+ acpi_unique_id unique_id; /* _UID */
acpi_device_name device_name; /* Driver-determined */
acpi_device_class device_class; /* " */
};
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index e723b0f..a7eecb4 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -200,8 +200,7 @@ acpi_evaluate_object_typed(acpi_handle object,
acpi_object_type return_type);

acpi_status
-acpi_get_object_info(acpi_handle handle,
- struct acpi_device_info **return_buffer);
+acpi_get_object_info(acpi_handle handle, struct acpi_buffer *return_buffer);

acpi_status acpi_install_method(u8 *buffer);

diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
index 153f12d..90df86f 100644
--- a/include/acpi/actypes.h
+++ b/include/acpi/actypes.h
@@ -338,7 +338,7 @@ typedef u32 acpi_physical_address;

/* PM Timer ticks per second (HZ) */

-#define PM_TIMER_FREQUENCY 3579545
+#define PM_TIMER_FREQUENCY 3579545

/*******************************************************************************
*
@@ -970,60 +970,38 @@ acpi_status(*acpi_walk_callback) (acpi_handle obj_handle,
#define ACPI_INTERRUPT_NOT_HANDLED 0x00
#define ACPI_INTERRUPT_HANDLED 0x01

-/* Length of 32-bit EISAID values when converted back to a string */
-
-#define ACPI_EISAID_STRING_SIZE 8 /* Includes null terminator */
-
-/* Length of UUID (string) values */
+/* Length of _HID, _UID, _CID, and UUID values */

+#define ACPI_DEVICE_ID_LENGTH 0x09
+#define ACPI_MAX_CID_LENGTH 48
#define ACPI_UUID_LENGTH 16

-/* Structures used for device/processor HID, UID, CID */
+/* Common string version of device HIDs and UIDs */

struct acpica_device_id {
- u32 length; /* Length of string + null */
- char *string;
+ char value[ACPI_DEVICE_ID_LENGTH];
};

-struct acpica_device_id_list {
- u32 count; /* Number of IDs in Ids array */
- u32 list_size; /* Size of list, including ID strings */
- struct acpica_device_id ids[1]; /* ID array */
-};
+/* Common string version of device CIDs */

-/*
- * Structure returned from acpi_get_object_info.
- * Optimized for both 32- and 64-bit builds
- */
-struct acpi_device_info {
- u32 info_size; /* Size of info, including ID strings */
- u32 name; /* ACPI object Name */
- acpi_object_type type; /* ACPI object Type */
- u8 param_count; /* If a method, required parameter count */
- u8 valid; /* Indicates which optional fields are valid */
- u8 flags; /* Miscellaneous info */
- u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
- u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */
- u32 current_status; /* _STA value */
- acpi_integer address; /* _ADR value */
- struct acpica_device_id hardware_id; /* _HID value */
- struct acpica_device_id unique_id; /* _UID value */
- struct acpica_device_id_list compatible_id_list; /* _CID list <must be last> */
+struct acpi_compatible_id {
+ char value[ACPI_MAX_CID_LENGTH];
};

-/* Values for Flags field above (acpi_get_object_info) */
-
-#define ACPI_PCI_ROOT_BRIDGE 0x01
+struct acpi_compatible_id_list {
+ u32 count;
+ u32 size;
+ struct acpi_compatible_id id[1];
+};

-/* Flags for Valid field above (acpi_get_object_info) */
+/* Structure and flags for acpi_get_object_info */

-#define ACPI_VALID_STA 0x01
-#define ACPI_VALID_ADR 0x02
-#define ACPI_VALID_HID 0x04
-#define ACPI_VALID_UID 0x08
-#define ACPI_VALID_CID 0x10
-#define ACPI_VALID_SXDS 0x20
-#define ACPI_VALID_SXWS 0x40
+#define ACPI_VALID_STA 0x0001
+#define ACPI_VALID_ADR 0x0002
+#define ACPI_VALID_HID 0x0004
+#define ACPI_VALID_UID 0x0008
+#define ACPI_VALID_CID 0x0010
+#define ACPI_VALID_SXDS 0x0020

/* Flags for _STA method */

@@ -1034,6 +1012,29 @@ struct acpi_device_info {
#define ACPI_STA_DEVICE_OK 0x08 /* Synonym */
#define ACPI_STA_BATTERY_PRESENT 0x10

+#define ACPI_COMMON_OBJ_INFO \
+ acpi_object_type type; /* ACPI object type */ \
+ acpi_name name /* ACPI object Name */
+
+struct acpi_obj_info_header {
+ ACPI_COMMON_OBJ_INFO;
+};
+
+/* Structure returned from Get Object Info */
+
+struct acpi_device_info {
+ ACPI_COMMON_OBJ_INFO;
+
+ u32 param_count; /* If a method, required parameter count */
+ u32 valid; /* Indicates which fields below are valid */
+ u32 current_status; /* _STA value */
+ acpi_integer address; /* _ADR value if any */
+ struct acpica_device_id hardware_id; /* _HID value if any */
+ struct acpica_device_id unique_id; /* _UID value if any */
+ u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
+ struct acpi_compatible_id_list compatibility_id; /* List of _CIDs if any */
+};
+
/* Context structs for address space handlers */

struct acpi_pci_id {

2009-09-24 01:44:00

by Lin Ming

[permalink] [raw]
Subject: Re: [origin tree boot crash] NULL pointer dereference, IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5

On Thu, 2009-09-24 at 05:30 +0800, Ingo Molnar wrote:
> > commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f
> > Date: Mon Jun 29 13:39:29 2009 +0800
> >
> > ACPICA: Major update for acpi_get_object_info external interface
>
> this one is causing boot crashes in -tip testing:

Hi,

Could you please try below commit at linux-acpi-2.6/release branch.

commit 718fb0de8ff88f71b3b91a8ee8e42e60c88e5128
Author: Hugh Dickins <[email protected]>
Date: Thu Aug 6 23:18:12 2009 +0000

ACPI: fix NULL bug for HID/UID string

acpi_device->pnp.hardware_id and unique_id are now allocated pointers,
replacing the previous arrays. acpi_device_install_notify_handler()
oopsed on the NULL hid when probing the video device, and perhaps other
uses are vulnerable too. So initialize those pointers to empty strings
when there is no hid or uid. Also, free hardware_id and unique_id when
when acpi_device is going to be freed.

http://bugzilla.kernel.org/show_bug.cgi?id=14096

Signed-off-by: Hugh Dickins <[email protected]>
Signed-off-by: Lin Ming <[email protected]>
Signed-off-by: Len Brown <[email protected]>

Thanks,
Lin Ming

>
> acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
> initcall acpiphp_init+0x0/0x83 returned -19 after 16410 usecs
> calling ibm_acpiphp_init+0x0/0x190 @ 1
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000003
> IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
> PGD 0
> Oops: 0002 [#1] SMP DEBUG_PAGEALLOC
> last sysfs file:
> CPU 0
> Pid: 1, comm: swapper Not tainted 2.6.31-tip #16786 System Product Name
> RIP: 0010:[<ffffffff82b07130>] [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
> RSP: 0018:ffff88003f2d1d60 EFLAGS: 00010246
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
> RDX: ffff88003f2d1d68 RSI: 00000000000001e4 RDI: 0000000000000000
> RBP: ffff88003f2d1d90 R08: 0000000000000001 R09: ffffffff824b645b
> R10: 000000002d0ef63b R11: ffff88003f2d1a80 R12: ffff88003fa780d0
> R13: ffffffff83940dc8 R14: 0000000000000001 R15: ffffffff83942e10
> FS: 0000000000000000(0000) GS:ffff880005800000(0000) knlGS:0000000000000000
> CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
> CR2: 0000000000000003 CR3: 0000000001001000 CR4: 00000000000006b0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> Process swapper (pid: 1, threadinfo ffff88003f2d0000, task ffff88003f2c8000)
> Stack:
> ffff88003f2c8000 ffff88003cfbb690 000000002d0ef63b 0000000000000000
> <0> 0000000000000000 ffff88003fa780d0 ffff88003f2d1e10 ffffffff8156b6b6
> <0> 0000000000000001 0000000100000000 0000000000000000 ffffffff83940dc8
> Call Trace:
> [<ffffffff8156b6b6>] acpi_ns_walk_namespace+0x11d/0x234
> [<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
> [<ffffffff8157b159>] ? acpi_ut_acquire_mutex+0xd9/0x12e
> [<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
> [<ffffffff81566dfa>] acpi_walk_namespace+0x105/0x162
> [<ffffffff81d067bf>] ? acpi_pm_read+0xd/0x3e
> [<ffffffff82b06f44>] ? ibm_acpiphp_init+0x0/0x190
> [<ffffffff82b06fa8>] ibm_acpiphp_init+0x64/0x190
> [<ffffffff810090b4>] do_one_initcall+0x82/0x1a6
> [<ffffffff810edecc>] ? init_irq_proc+0x77/0x9a
> [<ffffffff82ad8975>] do_basic_setup+0x5e/0x87
> [<ffffffff82ad8a26>] kernel_init+0x88/0xe2
> [<ffffffff8103ddfa>] child_rip+0xa/0x20
> [<ffffffff8103d7bc>] ? restore_args+0x0/0x30
> [<ffffffff82ad899e>] ? kernel_init+0x0/0xe2
> [<ffffffff8103ddf0>] ? child_rip+0x0/0x20
> Code: 48 c7 c2 c0 7b 0b 82 48 c7 c6 95 39 4a 82 48 c7 c7 1a 3c 4a 82 31 c0 e8 02 84 4b ff 31 c0 e9 82 00 00 00 48 8b 45 d8 48 8b 40 30 <c6> 40 03 00 48 8b 45 d8 83 78 18 00 74 5f f6 40 0d 04 74 59 48
> RIP [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
> RSP <ffff88003f2d1d60>
> CR2: 0000000000000003
> ---[ end trace 5a5d197966b56a2e ]---
> Kernel panic - not syncing: Fatal exception
> Pid: 1, comm: swapper Tainted: G D 2.6.31-tip #16786
>
> This is a huge commit which doesnt revert cleanly. I took a stab at it,
> see that revert below - it didnt help.
>
> Obviously we'd want a fix instead of that - i'm willing to test any
> patch.
>
> oh. I should have looked at the crash site before bisecting and
> reverting. That sure looks like an unconverted acpi_get_object_info()
> call, right?
>
> Ingo
>
> -------------->
> From 2773b5bd6e64ec04dfbc123841bf6f4c5e58dea5 Mon Sep 17 00:00:00 2001
> From: Ingo Molnar <[email protected]>
> Date: Wed, 23 Sep 2009 23:22:49 +0200
> Subject: [PATCH] Revert "ACPICA: Major update for acpi_get_object_info external interface"
>
> This reverts commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f.
>
> Conflicts:
>
> drivers/acpi/scan.c
>
> Causes this crash:
>
> acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
> initcall acpiphp_init+0x0/0x83 returned -19 after 16410 usecs
> calling ibm_acpiphp_init+0x0/0x190 @ 1
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000003
> IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
> PGD 0
> Oops: 0002 [#1] SMP DEBUG_PAGEALLOC
> last sysfs file:
> CPU 0
> Pid: 1, comm: swapper Not tainted 2.6.31-tip #16786 System Product Name
> RIP: 0010:[<ffffffff82b07130>] [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
> RSP: 0018:ffff88003f2d1d60 EFLAGS: 00010246
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
> RDX: ffff88003f2d1d68 RSI: 00000000000001e4 RDI: 0000000000000000
> RBP: ffff88003f2d1d90 R08: 0000000000000001 R09: ffffffff824b645b
> R10: 000000002d0ef63b R11: ffff88003f2d1a80 R12: ffff88003fa780d0
> R13: ffffffff83940dc8 R14: 0000000000000001 R15: ffffffff83942e10
> FS: 0000000000000000(0000) GS:ffff880005800000(0000) knlGS:0000000000000000
> CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
> CR2: 0000000000000003 CR3: 0000000001001000 CR4: 00000000000006b0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> Process swapper (pid: 1, threadinfo ffff88003f2d0000, task ffff88003f2c8000)
> Stack:
> ffff88003f2c8000 ffff88003cfbb690 000000002d0ef63b 0000000000000000
> <0> 0000000000000000 ffff88003fa780d0 ffff88003f2d1e10 ffffffff8156b6b6
> <0> 0000000000000001 0000000100000000 0000000000000000 ffffffff83940dc8
> Call Trace:
> [<ffffffff8156b6b6>] acpi_ns_walk_namespace+0x11d/0x234
> [<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
> [<ffffffff8157b159>] ? acpi_ut_acquire_mutex+0xd9/0x12e
> [<ffffffff82b070d4>] ? ibm_find_acpi_device+0x0/0xf5
> [<ffffffff81566dfa>] acpi_walk_namespace+0x105/0x162
> [<ffffffff81d067bf>] ? acpi_pm_read+0xd/0x3e
> [<ffffffff82b06f44>] ? ibm_acpiphp_init+0x0/0x190
> [<ffffffff82b06fa8>] ibm_acpiphp_init+0x64/0x190
> [<ffffffff810090b4>] do_one_initcall+0x82/0x1a6
> [<ffffffff810edecc>] ? init_irq_proc+0x77/0x9a
> [<ffffffff82ad8975>] do_basic_setup+0x5e/0x87
> [<ffffffff82ad8a26>] kernel_init+0x88/0xe2
> [<ffffffff8103ddfa>] child_rip+0xa/0x20
> [<ffffffff8103d7bc>] ? restore_args+0x0/0x30
> [<ffffffff82ad899e>] ? kernel_init+0x0/0xe2
> [<ffffffff8103ddf0>] ? child_rip+0x0/0x20
> Code: 48 c7 c2 c0 7b 0b 82 48 c7 c6 95 39 4a 82 48 c7 c7 1a 3c 4a 82 31 c0 e8 02 84 4b ff 31 c0 e9 82 00 00 00 48 8b 45 d8 48 8b 40 30 <c6> 40 03 00 48 8b 45 d8 83 78 18 00 74 5f f6 40 0d 04 74 59 48
> RIP [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5
> RSP <ffff88003f2d1d60>
> CR2: 0000000000000003
> ---[ end trace 5a5d197966b56a2e ]---
> Kernel panic - not syncing: Fatal exception
> Pid: 1, comm: swapper Tainted: G D 2.6.31-tip #16786
>
> Signed-off-by: Ingo Molnar <[email protected]>
> ---
> arch/ia64/hp/common/sba_iommu.c | 7 +-
> drivers/acpi/acpi_memhotplug.c | 11 +-
> drivers/acpi/acpica/Makefile | 2 +-
> drivers/acpi/acpica/acconfig.h | 5 -
> drivers/acpi/acpica/acglobal.h | 3 +-
> drivers/acpi/acpica/acinterp.h | 4 +-
> drivers/acpi/acpica/acutils.h | 24 +--
> drivers/acpi/acpica/evrgnini.c | 45 ++++-
> drivers/acpi/acpica/exutils.c | 53 ++----
> drivers/acpi/acpica/nsdumpdv.c | 7 +-
> drivers/acpi/acpica/nsxfeval.c | 23 +--
> drivers/acpi/acpica/nsxfname.c | 237 +++++-----------------
> drivers/acpi/acpica/uteval.c | 375 +++++++++++++++++++++++++++++++----
> drivers/acpi/acpica/utglobal.c | 10 +-
> drivers/acpi/acpica/utids.c | 382 ------------------------------------
> drivers/acpi/acpica/utmisc.c | 28 ---
> drivers/acpi/container.c | 11 +-
> drivers/acpi/dock.c | 8 +-
> drivers/acpi/glue.c | 6 +-
> drivers/acpi/scan.c | 151 +++++----------
> drivers/char/agp/hp-agp.c | 9 +-
> drivers/ide/ide-acpi.c | 5 +-
> drivers/pci/hotplug/acpiphp_ibm.c | 12 +-
> drivers/platform/x86/sony-laptop.c | 7 +-
> drivers/pnp/pnpacpi/core.c | 6 +-
> include/acpi/acpi_bus.h | 8 +-
> include/acpi/acpixf.h | 3 +-
> include/acpi/actypes.h | 87 ++++----
> 28 files changed, 628 insertions(+), 901 deletions(-)
>
> diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
> index 674a837..8cfb001 100644
> --- a/arch/ia64/hp/common/sba_iommu.c
> +++ b/arch/ia64/hp/common/sba_iommu.c
> @@ -2026,21 +2026,24 @@ acpi_sba_ioc_add(struct acpi_device *device)
> struct ioc *ioc;
> acpi_status status;
> u64 hpa, length;
> + struct acpi_buffer buffer;
> struct acpi_device_info *dev_info;
>
> status = hp_acpi_csr_space(device->handle, &hpa, &length);
> if (ACPI_FAILURE(status))
> return 1;
>
> - status = acpi_get_object_info(device->handle, &dev_info);
> + buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
> + status = acpi_get_object_info(device->handle, &buffer);
> if (ACPI_FAILURE(status))
> return 1;
> + dev_info = buffer.pointer;
>
> /*
> * For HWP0001, only SBA appears in ACPI namespace. It encloses the PCI
> * root bridges, and its CSR space includes the IOC function.
> */
> - if (strncmp("HWP0001", dev_info->hardware_id.string, 7) == 0) {
> + if (strncmp("HWP0001", dev_info->hardware_id.value, 7) == 0) {
> hpa += ZX1_IOC_OFFSET;
> /* zx1 based systems default to kernel page size iommu pages */
> if (!iovp_shift)
> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index 28ccdbc..ad9e60a 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -469,23 +469,26 @@ static acpi_status is_memory_device(acpi_handle handle)
> {
> char *hardware_id;
> acpi_status status;
> + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
> struct acpi_device_info *info;
>
> - status = acpi_get_object_info(handle, &info);
> +
> + status = acpi_get_object_info(handle, &buffer);
> if (ACPI_FAILURE(status))
> return status;
>
> + info = buffer.pointer;
> if (!(info->valid & ACPI_VALID_HID)) {
> - kfree(info);
> + kfree(buffer.pointer);
> return AE_ERROR;
> }
>
> - hardware_id = info->hardware_id.string;
> + hardware_id = info->hardware_id.value;
> if ((hardware_id == NULL) ||
> (strcmp(hardware_id, ACPI_MEMORY_DEVICE_HID)))
> status = AE_ERROR;
>
> - kfree(info);
> + kfree(buffer.pointer);
> return status;
> }
>
> diff --git a/drivers/acpi/acpica/Makefile b/drivers/acpi/acpica/Makefile
> index e7973bc..0ff924e 100644
> --- a/drivers/acpi/acpica/Makefile
> +++ b/drivers/acpi/acpica/Makefile
> @@ -44,4 +44,4 @@ acpi-y += tbxface.o tbinstal.o tbutils.o tbfind.o tbfadt.o tbxfroot.o
>
> acpi-y += utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \
> utcopy.o utdelete.o utglobal.o utmath.o utobject.o \
> - utstate.o utmutex.o utobject.o utresrc.o utlock.o utids.o
> + utstate.o utmutex.o utobject.o utresrc.o utlock.o
> diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h
> index 8e679ef..581be4b 100644
> --- a/drivers/acpi/acpica/acconfig.h
> +++ b/drivers/acpi/acpica/acconfig.h
> @@ -204,11 +204,6 @@
> #define ACPI_SMBUS_BUFFER_SIZE 34
> #define ACPI_IPMI_BUFFER_SIZE 66
>
> -/* _sx_d and _sx_w control methods */
> -
> -#define ACPI_NUM_sx_d_METHODS 4
> -#define ACPI_NUM_sx_w_METHODS 5
> -
> /******************************************************************************
> *
> * ACPI AML Debugger
> diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h
> index 29ba66d..91c6cb1 100644
> --- a/drivers/acpi/acpica/acglobal.h
> +++ b/drivers/acpi/acpica/acglobal.h
> @@ -265,8 +265,7 @@ ACPI_EXTERN u8 acpi_gbl_osi_data;
> extern u8 acpi_gbl_shutdown;
> extern u32 acpi_gbl_startup_flags;
> extern const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT];
> -extern const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS];
> -extern const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS];
> +extern const char *acpi_gbl_highest_dstate_names[4];
> extern const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES];
> extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];
>
> diff --git a/drivers/acpi/acpica/acinterp.h b/drivers/acpi/acpica/acinterp.h
> index 5db9f29..e8db7a3 100644
> --- a/drivers/acpi/acpica/acinterp.h
> +++ b/drivers/acpi/acpica/acinterp.h
> @@ -461,9 +461,9 @@ void acpi_ex_acquire_global_lock(u32 rule);
>
> void acpi_ex_release_global_lock(u32 rule);
>
> -void acpi_ex_eisa_id_to_string(char *dest, acpi_integer compressed_id);
> +void acpi_ex_eisa_id_to_string(u32 numeric_id, char *out_string);
>
> -void acpi_ex_integer_to_string(char *dest, acpi_integer value);
> +void acpi_ex_unsigned_integer_to_string(acpi_integer value, char *out_string);
>
> /*
> * exregion - default op_region handlers
> diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h
> index 863a264..14cc666 100644
> --- a/drivers/acpi/acpica/acutils.h
> +++ b/drivers/acpi/acpica/acutils.h
> @@ -324,30 +324,26 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
> acpi_status
> acpi_ut_evaluate_numeric_object(char *object_name,
> struct acpi_namespace_node *device_node,
> - acpi_integer *value);
> + acpi_integer * address);
>
> acpi_status
> -acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 *status_flags);
> +acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
> + struct acpica_device_id *hid);
>
> acpi_status
> -acpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
> - const char **method_names,
> - u8 method_count, u8 *out_values);
> +acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
> + struct acpi_compatible_id_list **return_cid_list);
>
> -/*
> - * utids - device ID support
> - */
> acpi_status
> -acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
> - struct acpica_device_id **return_id);
> +acpi_ut_execute_STA(struct acpi_namespace_node *device_node,
> + u32 * status_flags);
>
> acpi_status
> acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
> - struct acpica_device_id **return_id);
> + struct acpica_device_id *uid);
>
> acpi_status
> -acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
> - struct acpica_device_id_list **return_cid_list);
> +acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest);
>
> /*
> * utlock - reader/writer locks
> @@ -449,8 +445,6 @@ acpi_ut_short_divide(acpi_integer in_dividend,
> */
> const char *acpi_ut_validate_exception(acpi_status status);
>
> -u8 acpi_ut_is_pci_root_bridge(char *id);
> -
> u8 acpi_ut_is_aml_table(struct acpi_table_header *table);
>
> acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id);
> diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c
> index cf29c49..284a7be 100644
> --- a/drivers/acpi/acpica/evrgnini.c
> +++ b/drivers/acpi/acpica/evrgnini.c
> @@ -50,6 +50,8 @@
> ACPI_MODULE_NAME("evrgnini")
>
> /* Local prototypes */
> +static u8 acpi_ev_match_pci_root_bridge(char *id);
> +
> static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node);
>
> /*******************************************************************************
> @@ -330,6 +332,37 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
>
> /*******************************************************************************
> *
> + * FUNCTION: acpi_ev_match_pci_root_bridge
> + *
> + * PARAMETERS: Id - The HID/CID in string format
> + *
> + * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
> + *
> + * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
> + *
> + ******************************************************************************/
> +
> +static u8 acpi_ev_match_pci_root_bridge(char *id)
> +{
> +
> + /*
> + * Check if this is a PCI root.
> + * ACPI 3.0+: check for a PCI Express root also.
> + */
> + if (!(ACPI_STRNCMP(id,
> + PCI_ROOT_HID_STRING,
> + sizeof(PCI_ROOT_HID_STRING))) ||
> + !(ACPI_STRNCMP(id,
> + PCI_EXPRESS_ROOT_HID_STRING,
> + sizeof(PCI_EXPRESS_ROOT_HID_STRING)))) {
> + return (TRUE);
> + }
> +
> + return (FALSE);
> +}
> +
> +/*******************************************************************************
> + *
> * FUNCTION: acpi_ev_is_pci_root_bridge
> *
> * PARAMETERS: Node - Device node being examined
> @@ -344,10 +377,9 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
> static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
> {
> acpi_status status;
> - struct acpica_device_id *hid;
> - struct acpica_device_id_list *cid;
> + struct acpica_device_id hid;
> + struct acpi_compatible_id_list *cid;
> u32 i;
> - u8 match;
>
> /* Get the _HID and check for a PCI Root Bridge */
>
> @@ -356,10 +388,7 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
> return (FALSE);
> }
>
> - match = acpi_ut_is_pci_root_bridge(hid->string);
> - ACPI_FREE(hid);
> -
> - if (match) {
> + if (acpi_ev_match_pci_root_bridge(hid.value)) {
> return (TRUE);
> }
>
> @@ -373,7 +402,7 @@ static u8 acpi_ev_is_pci_root_bridge(struct acpi_namespace_node *node)
> /* Check all _CIDs in the returned list */
>
> for (i = 0; i < cid->count; i++) {
> - if (acpi_ut_is_pci_root_bridge(cid->ids[i].string)) {
> + if (acpi_ev_match_pci_root_bridge(cid->id[i].value)) {
> ACPI_FREE(cid);
> return (TRUE);
> }
> diff --git a/drivers/acpi/acpica/exutils.c b/drivers/acpi/acpica/exutils.c
> index 7d41f99..87730e9 100644
> --- a/drivers/acpi/acpica/exutils.c
> +++ b/drivers/acpi/acpica/exutils.c
> @@ -358,67 +358,50 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base)
> *
> * FUNCTION: acpi_ex_eisa_id_to_string
> *
> - * PARAMETERS: compressed_id - EISAID to be converted
> + * PARAMETERS: numeric_id - EISA ID to be converted
> * out_string - Where to put the converted string (8 bytes)
> *
> * RETURN: None
> *
> - * DESCRIPTION: Convert a numeric EISAID to string representation. Return
> - * buffer must be large enough to hold the string. The string
> - * returned is always exactly of length ACPI_EISAID_STRING_SIZE
> - * (includes null terminator). The EISAID is always 32 bits.
> + * DESCRIPTION: Convert a numeric EISA ID to string representation
> *
> ******************************************************************************/
>
> -void acpi_ex_eisa_id_to_string(char *out_string, acpi_integer compressed_id)
> +void acpi_ex_eisa_id_to_string(u32 numeric_id, char *out_string)
> {
> - u32 swapped_id;
> + u32 eisa_id;
>
> ACPI_FUNCTION_ENTRY();
>
> - /* The EISAID should be a 32-bit integer */
> -
> - if (compressed_id > ACPI_UINT32_MAX) {
> - ACPI_WARNING((AE_INFO,
> - "Expected EISAID is larger than 32 bits: 0x%8.8X%8.8X, truncating",
> - ACPI_FORMAT_UINT64(compressed_id)));
> - }
> -
> /* Swap ID to big-endian to get contiguous bits */
>
> - swapped_id = acpi_ut_dword_byte_swap((u32)compressed_id);
> + eisa_id = acpi_ut_dword_byte_swap(numeric_id);
>
> - /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */
> -
> - out_string[0] =
> - (char)(0x40 + (((unsigned long)swapped_id >> 26) & 0x1F));
> - out_string[1] = (char)(0x40 + ((swapped_id >> 21) & 0x1F));
> - out_string[2] = (char)(0x40 + ((swapped_id >> 16) & 0x1F));
> - out_string[3] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 12);
> - out_string[4] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 8);
> - out_string[5] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 4);
> - out_string[6] = acpi_ut_hex_to_ascii_char((acpi_integer)swapped_id, 0);
> + out_string[0] = (char)('@' + (((unsigned long)eisa_id >> 26) & 0x1f));
> + out_string[1] = (char)('@' + ((eisa_id >> 21) & 0x1f));
> + out_string[2] = (char)('@' + ((eisa_id >> 16) & 0x1f));
> + out_string[3] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 12);
> + out_string[4] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 8);
> + out_string[5] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 4);
> + out_string[6] = acpi_ut_hex_to_ascii_char((acpi_integer) eisa_id, 0);
> out_string[7] = 0;
> }
>
> /*******************************************************************************
> *
> - * FUNCTION: acpi_ex_integer_to_string
> + * FUNCTION: acpi_ex_unsigned_integer_to_string
> *
> - * PARAMETERS: out_string - Where to put the converted string. At least
> - * 21 bytes are needed to hold the largest
> - * possible 64-bit integer.
> - * Value - Value to be converted
> + * PARAMETERS: Value - Value to be converted
> + * out_string - Where to put the converted string (8 bytes)
> *
> * RETURN: None, string
> *
> - * DESCRIPTION: Convert a 64-bit integer to decimal string representation.
> - * Assumes string buffer is large enough to hold the string. The
> - * largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1).
> + * DESCRIPTION: Convert a number to string representation. Assumes string
> + * buffer is large enough to hold the string.
> *
> ******************************************************************************/
>
> -void acpi_ex_integer_to_string(char *out_string, acpi_integer value)
> +void acpi_ex_unsigned_integer_to_string(acpi_integer value, char *out_string)
> {
> u32 count;
> u32 digits_needed;
> diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
> index 0fe87f1..41994fe 100644
> --- a/drivers/acpi/acpica/nsdumpdv.c
> +++ b/drivers/acpi/acpica/nsdumpdv.c
> @@ -70,6 +70,7 @@ static acpi_status
> acpi_ns_dump_one_device(acpi_handle obj_handle,
> u32 level, void *context, void **return_value)
> {
> + struct acpi_buffer buffer;
> struct acpi_device_info *info;
> acpi_status status;
> u32 i;
> @@ -79,15 +80,17 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
> status =
> acpi_ns_dump_one_object(obj_handle, level, context, return_value);
>
> - status = acpi_get_object_info(obj_handle, &info);
> + buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
> + status = acpi_get_object_info(obj_handle, &buffer);
> if (ACPI_SUCCESS(status)) {
> + info = buffer.pointer;
> for (i = 0; i < level; i++) {
> ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES, " "));
> }
>
> ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
> " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
> - info->hardware_id.string,
> + info->hardware_id.value,
> ACPI_FORMAT_UINT64(info->address),
> info->current_status));
> ACPI_FREE(info);
> diff --git a/drivers/acpi/acpica/nsxfeval.c b/drivers/acpi/acpica/nsxfeval.c
> index eaacbf4..18d0ca1 100644
> --- a/drivers/acpi/acpica/nsxfeval.c
> +++ b/drivers/acpi/acpica/nsxfeval.c
> @@ -538,11 +538,10 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
> acpi_status status;
> struct acpi_namespace_node *node;
> u32 flags;
> - struct acpica_device_id *hid;
> - struct acpica_device_id_list *cid;
> + struct acpica_device_id hid;
> + struct acpi_compatible_id_list *cid;
> u32 i;
> - u8 found;
> - int no_match;
> + int found;
>
> status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
> if (ACPI_FAILURE(status)) {
> @@ -586,14 +585,10 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
> return (AE_CTRL_DEPTH);
> }
>
> - no_match = ACPI_STRCMP(hid->string, info->hid);
> - ACPI_FREE(hid);
> + if (ACPI_STRNCMP(hid.value, info->hid, sizeof(hid.value)) != 0) {
> +
> + /* Get the list of Compatible IDs */
>
> - if (no_match) {
> - /*
> - * HID does not match, attempt match within the
> - * list of Compatible IDs (CIDs)
> - */
> status = acpi_ut_execute_CID(node, &cid);
> if (status == AE_NOT_FOUND) {
> return (AE_OK);
> @@ -605,8 +600,10 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
>
> found = 0;
> for (i = 0; i < cid->count; i++) {
> - if (ACPI_STRCMP(cid->ids[i].string, info->hid)
> - == 0) {
> + if (ACPI_STRNCMP(cid->id[i].value, info->hid,
> + sizeof(struct
> + acpi_compatible_id)) ==
> + 0) {
> found = 1;
> break;
> }
> diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
> index ddc84af..f23593d 100644
> --- a/drivers/acpi/acpica/nsxfname.c
> +++ b/drivers/acpi/acpica/nsxfname.c
> @@ -51,11 +51,6 @@
> #define _COMPONENT ACPI_NAMESPACE
> ACPI_MODULE_NAME("nsxfname")
>
> -/* Local prototypes */
> -static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
> - struct acpica_device_id *source,
> - char *string_area);
> -
> /******************************************************************************
> *
> * FUNCTION: acpi_get_handle
> @@ -73,7 +68,6 @@ static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
> * namespace handle.
> *
> ******************************************************************************/
> -
> acpi_status
> acpi_get_handle(acpi_handle parent,
> acpi_string pathname, acpi_handle * ret_handle)
> @@ -216,38 +210,10 @@ ACPI_EXPORT_SYMBOL(acpi_get_name)
>
> /******************************************************************************
> *
> - * FUNCTION: acpi_ns_copy_device_id
> - *
> - * PARAMETERS: Dest - Pointer to the destination DEVICE_ID
> - * Source - Pointer to the source DEVICE_ID
> - * string_area - Pointer to where to copy the dest string
> - *
> - * RETURN: Pointer to the next string area
> - *
> - * DESCRIPTION: Copy a single DEVICE_ID, including the string data.
> - *
> - ******************************************************************************/
> -static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
> - struct acpica_device_id *source,
> - char *string_area)
> -{
> - /* Create the destination DEVICE_ID */
> -
> - dest->string = string_area;
> - dest->length = source->length;
> -
> - /* Copy actual string and return a pointer to the next string area */
> -
> - ACPI_MEMCPY(string_area, source->string, source->length);
> - return (string_area + source->length);
> -}
> -
> -/******************************************************************************
> - *
> * FUNCTION: acpi_get_object_info
> *
> - * PARAMETERS: Handle - Object Handle
> - * return_buffer - Where the info is returned
> + * PARAMETERS: Handle - Object Handle
> + * Buffer - Where the info is returned
> *
> * RETURN: Status
> *
> @@ -255,37 +221,33 @@ static char *acpi_ns_copy_device_id(struct acpica_device_id *dest,
> * namespace node and possibly by running several standard
> * control methods (Such as in the case of a device.)
> *
> - * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
> - * _ADR, _sx_w, and _sx_d methods.
> - *
> - * Note: Allocates the return buffer, must be freed by the caller.
> - *
> ******************************************************************************/
> -
> acpi_status
> -acpi_get_object_info(acpi_handle handle,
> - struct acpi_device_info **return_buffer)
> +acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
> {
> + acpi_status status;
> struct acpi_namespace_node *node;
> struct acpi_device_info *info;
> - struct acpica_device_id_list *cid_list = NULL;
> - struct acpica_device_id *hid = NULL;
> - struct acpica_device_id *uid = NULL;
> - char *next_id_string;
> - acpi_object_type type;
> - acpi_name name;
> - u8 param_count = 0;
> - u8 valid = 0;
> - u32 info_size;
> - u32 i;
> - acpi_status status;
> + struct acpi_device_info *return_info;
> + struct acpi_compatible_id_list *cid_list = NULL;
> + acpi_size size;
>
> /* Parameter validation */
>
> - if (!handle || !return_buffer) {
> + if (!handle || !buffer) {
> return (AE_BAD_PARAMETER);
> }
>
> + status = acpi_ut_validate_buffer(buffer);
> + if (ACPI_FAILURE(status)) {
> + return (status);
> + }
> +
> + info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_device_info));
> + if (!info) {
> + return (AE_NO_MEMORY);
> + }
> +
> status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
> if (ACPI_FAILURE(status)) {
> goto cleanup;
> @@ -294,91 +256,66 @@ acpi_get_object_info(acpi_handle handle,
> node = acpi_ns_map_handle_to_node(handle);
> if (!node) {
> (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
> - return (AE_BAD_PARAMETER);
> + status = AE_BAD_PARAMETER;
> + goto cleanup;
> }
>
> - /* Get the namespace node data while the namespace is locked */
> + /* Init return structure */
> +
> + size = sizeof(struct acpi_device_info);
>
> - info_size = sizeof(struct acpi_device_info);
> - type = node->type;
> - name = node->name.integer;
> + info->type = node->type;
> + info->name = node->name.integer;
> + info->valid = 0;
>
> if (node->type == ACPI_TYPE_METHOD) {
> - param_count = node->object->method.param_count;
> + info->param_count = node->object->method.param_count;
> }
>
> status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
> if (ACPI_FAILURE(status)) {
> - return (status);
> + goto cleanup;
> }
>
> - if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
> + /* If not a device, we are all done */
> +
> + if (info->type == ACPI_TYPE_DEVICE) {
> /*
> - * Get extra info for ACPI Device/Processor objects only:
> - * Run the Device _HID, _UID, and _CID methods.
> + * Get extra info for ACPI Devices objects only:
> + * Run the Device _HID, _UID, _CID, _STA, _ADR and _sx_d methods.
> *
> * Note: none of these methods are required, so they may or may
> - * not be present for this device. The Info->Valid bitfield is used
> - * to indicate which methods were found and run successfully.
> + * not be present for this device. The Info->Valid bitfield is used
> + * to indicate which methods were found and ran successfully.
> */
>
> /* Execute the Device._HID method */
>
> - status = acpi_ut_execute_HID(node, &hid);
> + status = acpi_ut_execute_HID(node, &info->hardware_id);
> if (ACPI_SUCCESS(status)) {
> - info_size += hid->length;
> - valid |= ACPI_VALID_HID;
> + info->valid |= ACPI_VALID_HID;
> }
>
> /* Execute the Device._UID method */
>
> - status = acpi_ut_execute_UID(node, &uid);
> + status = acpi_ut_execute_UID(node, &info->unique_id);
> if (ACPI_SUCCESS(status)) {
> - info_size += uid->length;
> - valid |= ACPI_VALID_UID;
> + info->valid |= ACPI_VALID_UID;
> }
>
> /* Execute the Device._CID method */
>
> status = acpi_ut_execute_CID(node, &cid_list);
> if (ACPI_SUCCESS(status)) {
> -
> - /* Add size of CID strings and CID pointer array */
> -
> - info_size +=
> - (cid_list->list_size -
> - sizeof(struct acpica_device_id_list));
> - valid |= ACPI_VALID_CID;
> + size += cid_list->size;
> + info->valid |= ACPI_VALID_CID;
> }
> - }
> -
> - /*
> - * Now that we have the variable-length data, we can allocate the
> - * return buffer
> - */
> - info = ACPI_ALLOCATE_ZEROED(info_size);
> - if (!info) {
> - status = AE_NO_MEMORY;
> - goto cleanup;
> - }
> -
> - /* Get the fixed-length data */
> -
> - if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
> - /*
> - * Get extra info for ACPI Device/Processor objects only:
> - * Run the _STA, _ADR and, sx_w, and _sx_d methods.
> - *
> - * Note: none of these methods are required, so they may or may
> - * not be present for this device. The Info->Valid bitfield is used
> - * to indicate which methods were found and run successfully.
> - */
>
> /* Execute the Device._STA method */
>
> status = acpi_ut_execute_STA(node, &info->current_status);
> if (ACPI_SUCCESS(status)) {
> - valid |= ACPI_VALID_STA;
> + info->valid |= ACPI_VALID_STA;
> }
>
> /* Execute the Device._ADR method */
> @@ -386,100 +323,36 @@ acpi_get_object_info(acpi_handle handle,
> status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node,
> &info->address);
> if (ACPI_SUCCESS(status)) {
> - valid |= ACPI_VALID_ADR;
> - }
> -
> - /* Execute the Device._sx_w methods */
> -
> - status = acpi_ut_execute_power_methods(node,
> - acpi_gbl_lowest_dstate_names,
> - ACPI_NUM_sx_w_METHODS,
> - info->lowest_dstates);
> - if (ACPI_SUCCESS(status)) {
> - valid |= ACPI_VALID_SXWS;
> + info->valid |= ACPI_VALID_ADR;
> }
>
> /* Execute the Device._sx_d methods */
>
> - status = acpi_ut_execute_power_methods(node,
> - acpi_gbl_highest_dstate_names,
> - ACPI_NUM_sx_d_METHODS,
> - info->highest_dstates);
> + status = acpi_ut_execute_sxds(node, info->highest_dstates);
> if (ACPI_SUCCESS(status)) {
> - valid |= ACPI_VALID_SXDS;
> + info->valid |= ACPI_VALID_SXDS;
> }
> }
>
> - /*
> - * Create a pointer to the string area of the return buffer.
> - * Point to the end of the base struct acpi_device_info structure.
> - */
> - next_id_string = ACPI_CAST_PTR(char, info->compatible_id_list.ids);
> - if (cid_list) {
> -
> - /* Point past the CID DEVICE_ID array */
> + /* Validate/Allocate/Clear caller buffer */
>
> - next_id_string +=
> - ((acpi_size) cid_list->count *
> - sizeof(struct acpica_device_id));
> + status = acpi_ut_initialize_buffer(buffer, size);
> + if (ACPI_FAILURE(status)) {
> + goto cleanup;
> }
>
> - /*
> - * Copy the HID, UID, and CIDs to the return buffer. The variable-length
> - * strings are copied to the reserved area at the end of the buffer.
> - *
> - * For HID and CID, check if the ID is a PCI Root Bridge.
> - */
> - if (hid) {
> - next_id_string = acpi_ns_copy_device_id(&info->hardware_id,
> - hid, next_id_string);
> -
> - if (acpi_ut_is_pci_root_bridge(hid->string)) {
> - info->flags |= ACPI_PCI_ROOT_BRIDGE;
> - }
> - }
> + /* Populate the return buffer */
>
> - if (uid) {
> - next_id_string = acpi_ns_copy_device_id(&info->unique_id,
> - uid, next_id_string);
> - }
> + return_info = buffer->pointer;
> + ACPI_MEMCPY(return_info, info, sizeof(struct acpi_device_info));
>
> if (cid_list) {
> - info->compatible_id_list.count = cid_list->count;
> - info->compatible_id_list.list_size = cid_list->list_size;
> -
> - /* Copy each CID */
> -
> - for (i = 0; i < cid_list->count; i++) {
> - next_id_string =
> - acpi_ns_copy_device_id(&info->compatible_id_list.
> - ids[i], &cid_list->ids[i],
> - next_id_string);
> -
> - if (acpi_ut_is_pci_root_bridge(cid_list->ids[i].string)) {
> - info->flags |= ACPI_PCI_ROOT_BRIDGE;
> - }
> - }
> + ACPI_MEMCPY(&return_info->compatibility_id, cid_list,
> + cid_list->size);
> }
>
> - /* Copy the fixed-length data */
> -
> - info->info_size = info_size;
> - info->type = type;
> - info->name = name;
> - info->param_count = param_count;
> - info->valid = valid;
> -
> - *return_buffer = info;
> - status = AE_OK;
> -
> cleanup:
> - if (hid) {
> - ACPI_FREE(hid);
> - }
> - if (uid) {
> - ACPI_FREE(uid);
> - }
> + ACPI_FREE(info);
> if (cid_list) {
> ACPI_FREE(cid_list);
> }
> diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c
> index 5d54e36..a4734ac 100644
> --- a/drivers/acpi/acpica/uteval.c
> +++ b/drivers/acpi/acpica/uteval.c
> @@ -44,10 +44,19 @@
> #include <acpi/acpi.h>
> #include "accommon.h"
> #include "acnamesp.h"
> +#include "acinterp.h"
>
> #define _COMPONENT ACPI_UTILITIES
> ACPI_MODULE_NAME("uteval")
>
> +/* Local prototypes */
> +static void
> +acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length);
> +
> +static acpi_status
> +acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
> + struct acpi_compatible_id *one_cid);
> +
> /*
> * Strings supported by the _OSI predefined (internal) method.
> *
> @@ -207,7 +216,7 @@ acpi_status acpi_osi_invalidate(char *interface)
> * RETURN: Status
> *
> * DESCRIPTION: Evaluates a namespace object and verifies the type of the
> - * return object. Common code that simplifies accessing objects
> + * return object. Common code that simplifies accessing objects
> * that have required return objects of fixed types.
> *
> * NOTE: Internal function, no parameter validation
> @@ -292,7 +301,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
>
> if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
> /*
> - * We received a return object, but one was not expected. This can
> + * We received a return object, but one was not expected. This can
> * happen frequently if the "implicit return" feature is enabled.
> * Just delete the return object and return AE_OK.
> */
> @@ -334,12 +343,12 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
> *
> * PARAMETERS: object_name - Object name to be evaluated
> * device_node - Node for the device
> - * Value - Where the value is returned
> + * Address - Where the value is returned
> *
> * RETURN: Status
> *
> * DESCRIPTION: Evaluates a numeric namespace object for a selected device
> - * and stores result in *Value.
> + * and stores result in *Address.
> *
> * NOTE: Internal function, no parameter validation
> *
> @@ -348,7 +357,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
> acpi_status
> acpi_ut_evaluate_numeric_object(char *object_name,
> struct acpi_namespace_node *device_node,
> - acpi_integer *value)
> + acpi_integer * address)
> {
> union acpi_operand_object *obj_desc;
> acpi_status status;
> @@ -363,7 +372,295 @@ acpi_ut_evaluate_numeric_object(char *object_name,
>
> /* Get the returned Integer */
>
> - *value = obj_desc->integer.value;
> + *address = obj_desc->integer.value;
> +
> + /* On exit, we must delete the return object */
> +
> + acpi_ut_remove_reference(obj_desc);
> + return_ACPI_STATUS(status);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_ut_copy_id_string
> + *
> + * PARAMETERS: Destination - Where to copy the string
> + * Source - Source string
> + * max_length - Length of the destination buffer
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
> + * Performs removal of a leading asterisk if present -- workaround
> + * for a known issue on a bunch of machines.
> + *
> + ******************************************************************************/
> +
> +static void
> +acpi_ut_copy_id_string(char *destination, char *source, acpi_size max_length)
> +{
> +
> + /*
> + * Workaround for ID strings that have a leading asterisk. This construct
> + * is not allowed by the ACPI specification (ID strings must be
> + * alphanumeric), but enough existing machines have this embedded in their
> + * ID strings that the following code is useful.
> + */
> + if (*source == '*') {
> + source++;
> + }
> +
> + /* Do the actual copy */
> +
> + ACPI_STRNCPY(destination, source, max_length);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_ut_execute_HID
> + *
> + * PARAMETERS: device_node - Node for the device
> + * Hid - Where the HID is returned
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Executes the _HID control method that returns the hardware
> + * ID of the device.
> + *
> + * NOTE: Internal function, no parameter validation
> + *
> + ******************************************************************************/
> +
> +acpi_status
> +acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
> + struct acpica_device_id *hid)
> +{
> + union acpi_operand_object *obj_desc;
> + acpi_status status;
> +
> + ACPI_FUNCTION_TRACE(ut_execute_HID);
> +
> + status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
> + ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
> + &obj_desc);
> + if (ACPI_FAILURE(status)) {
> + return_ACPI_STATUS(status);
> + }
> +
> + if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> +
> + /* Convert the Numeric HID to string */
> +
> + acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
> + hid->value);
> + } else {
> + /* Copy the String HID from the returned object */
> +
> + acpi_ut_copy_id_string(hid->value, obj_desc->string.pointer,
> + sizeof(hid->value));
> + }
> +
> + /* On exit, we must delete the return object */
> +
> + acpi_ut_remove_reference(obj_desc);
> + return_ACPI_STATUS(status);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_ut_translate_one_cid
> + *
> + * PARAMETERS: obj_desc - _CID object, must be integer or string
> + * one_cid - Where the CID string is returned
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Return a numeric or string _CID value as a string.
> + * (Compatible ID)
> + *
> + * NOTE: Assumes a maximum _CID string length of
> + * ACPI_MAX_CID_LENGTH.
> + *
> + ******************************************************************************/
> +
> +static acpi_status
> +acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
> + struct acpi_compatible_id *one_cid)
> +{
> +
> + switch (obj_desc->common.type) {
> + case ACPI_TYPE_INTEGER:
> +
> + /* Convert the Numeric CID to string */
> +
> + acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value,
> + one_cid->value);
> + return (AE_OK);
> +
> + case ACPI_TYPE_STRING:
> +
> + if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) {
> + return (AE_AML_STRING_LIMIT);
> + }
> +
> + /* Copy the String CID from the returned object */
> +
> + acpi_ut_copy_id_string(one_cid->value, obj_desc->string.pointer,
> + ACPI_MAX_CID_LENGTH);
> + return (AE_OK);
> +
> + default:
> +
> + return (AE_TYPE);
> + }
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_ut_execute_CID
> + *
> + * PARAMETERS: device_node - Node for the device
> + * return_cid_list - Where the CID list is returned
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Executes the _CID control method that returns one or more
> + * compatible hardware IDs for the device.
> + *
> + * NOTE: Internal function, no parameter validation
> + *
> + ******************************************************************************/
> +
> +acpi_status
> +acpi_ut_execute_CID(struct acpi_namespace_node * device_node,
> + struct acpi_compatible_id_list ** return_cid_list)
> +{
> + union acpi_operand_object *obj_desc;
> + acpi_status status;
> + u32 count;
> + u32 size;
> + struct acpi_compatible_id_list *cid_list;
> + u32 i;
> +
> + ACPI_FUNCTION_TRACE(ut_execute_CID);
> +
> + /* Evaluate the _CID method for this device */
> +
> + status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
> + ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
> + | ACPI_BTYPE_PACKAGE, &obj_desc);
> + if (ACPI_FAILURE(status)) {
> + return_ACPI_STATUS(status);
> + }
> +
> + /* Get the number of _CIDs returned */
> +
> + count = 1;
> + if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
> + count = obj_desc->package.count;
> + }
> +
> + /* Allocate a worst-case buffer for the _CIDs */
> +
> + size = (((count - 1) * sizeof(struct acpi_compatible_id)) +
> + sizeof(struct acpi_compatible_id_list));
> +
> + cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
> + if (!cid_list) {
> + return_ACPI_STATUS(AE_NO_MEMORY);
> + }
> +
> + /* Init CID list */
> +
> + cid_list->count = count;
> + cid_list->size = size;
> +
> + /*
> + * A _CID can return either a single compatible ID or a package of
> + * compatible IDs. Each compatible ID can be one of the following:
> + * 1) Integer (32 bit compressed EISA ID) or
> + * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
> + */
> +
> + /* The _CID object can be either a single CID or a package (list) of CIDs */
> +
> + if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
> +
> + /* Translate each package element */
> +
> + for (i = 0; i < count; i++) {
> + status =
> + acpi_ut_translate_one_cid(obj_desc->package.
> + elements[i],
> + &cid_list->id[i]);
> + if (ACPI_FAILURE(status)) {
> + break;
> + }
> + }
> + } else {
> + /* Only one CID, translate to a string */
> +
> + status = acpi_ut_translate_one_cid(obj_desc, cid_list->id);
> + }
> +
> + /* Cleanup on error */
> +
> + if (ACPI_FAILURE(status)) {
> + ACPI_FREE(cid_list);
> + } else {
> + *return_cid_list = cid_list;
> + }
> +
> + /* On exit, we must delete the _CID return object */
> +
> + acpi_ut_remove_reference(obj_desc);
> + return_ACPI_STATUS(status);
> +}
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: acpi_ut_execute_UID
> + *
> + * PARAMETERS: device_node - Node for the device
> + * Uid - Where the UID is returned
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Executes the _UID control method that returns the hardware
> + * ID of the device.
> + *
> + * NOTE: Internal function, no parameter validation
> + *
> + ******************************************************************************/
> +
> +acpi_status
> +acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
> + struct acpica_device_id *uid)
> +{
> + union acpi_operand_object *obj_desc;
> + acpi_status status;
> +
> + ACPI_FUNCTION_TRACE(ut_execute_UID);
> +
> + status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
> + ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
> + &obj_desc);
> + if (ACPI_FAILURE(status)) {
> + return_ACPI_STATUS(status);
> + }
> +
> + if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> +
> + /* Convert the Numeric UID to string */
> +
> + acpi_ex_unsigned_integer_to_string(obj_desc->integer.value,
> + uid->value);
> + } else {
> + /* Copy the String UID from the returned object */
> +
> + acpi_ut_copy_id_string(uid->value, obj_desc->string.pointer,
> + sizeof(uid->value));
> + }
>
> /* On exit, we must delete the return object */
>
> @@ -422,64 +719,60 @@ acpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
>
> /*******************************************************************************
> *
> - * FUNCTION: acpi_ut_execute_power_methods
> + * FUNCTION: acpi_ut_execute_Sxds
> *
> * PARAMETERS: device_node - Node for the device
> - * method_names - Array of power method names
> - * method_count - Number of methods to execute
> - * out_values - Where the power method values are returned
> + * Flags - Where the status flags are returned
> *
> - * RETURN: Status, out_values
> + * RETURN: Status
> *
> - * DESCRIPTION: Executes the specified power methods for the device and returns
> - * the result(s).
> + * DESCRIPTION: Executes _STA for selected device and stores results in
> + * *Flags.
> *
> * NOTE: Internal function, no parameter validation
> *
> -******************************************************************************/
> + ******************************************************************************/
>
> acpi_status
> -acpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
> - const char **method_names,
> - u8 method_count, u8 *out_values)
> +acpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest)
> {
> union acpi_operand_object *obj_desc;
> acpi_status status;
> - acpi_status final_status = AE_NOT_FOUND;
> u32 i;
>
> - ACPI_FUNCTION_TRACE(ut_execute_power_methods);
> + ACPI_FUNCTION_TRACE(ut_execute_sxds);
>
> - for (i = 0; i < method_count; i++) {
> - /*
> - * Execute the power method (_sx_d or _sx_w). The only allowable
> - * return type is an Integer.
> - */
> + for (i = 0; i < 4; i++) {
> + highest[i] = 0xFF;
> status = acpi_ut_evaluate_object(device_node,
> ACPI_CAST_PTR(char,
> - method_names[i]),
> + acpi_gbl_highest_dstate_names
> + [i]),
> ACPI_BTYPE_INTEGER, &obj_desc);
> - if (ACPI_SUCCESS(status)) {
> - out_values[i] = (u8)obj_desc->integer.value;
> + if (ACPI_FAILURE(status)) {
> + if (status != AE_NOT_FOUND) {
> + ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
> + "%s on Device %4.4s, %s\n",
> + ACPI_CAST_PTR(char,
> + acpi_gbl_highest_dstate_names
> + [i]),
> + acpi_ut_get_node_name
> + (device_node),
> + acpi_format_exception
> + (status)));
> +
> + return_ACPI_STATUS(status);
> + }
> + } else {
> + /* Extract the Dstate value */
> +
> + highest[i] = (u8) obj_desc->integer.value;
>
> /* Delete the return object */
>
> acpi_ut_remove_reference(obj_desc);
> - final_status = AE_OK; /* At least one value is valid */
> - continue;
> }
> -
> - out_values[i] = ACPI_UINT8_MAX;
> - if (status == AE_NOT_FOUND) {
> - continue; /* Ignore if not found */
> - }
> -
> - ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
> - "Failed %s on Device %4.4s, %s\n",
> - ACPI_CAST_PTR(char, method_names[i]),
> - acpi_ut_get_node_name(device_node),
> - acpi_format_exception(status)));
> }
>
> - return_ACPI_STATUS(final_status);
> + return_ACPI_STATUS(AE_OK);
> }
> diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c
> index 3f2c68f..1d83dd5 100644
> --- a/drivers/acpi/acpica/utglobal.c
> +++ b/drivers/acpi/acpica/utglobal.c
> @@ -90,15 +90,7 @@ const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = {
> "\\_S5_"
> };
>
> -const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS] = {
> - "_S0W",
> - "_S1W",
> - "_S2W",
> - "_S3W",
> - "_S4W"
> -};
> -
> -const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS] = {
> +const char *acpi_gbl_highest_dstate_names[4] = {
> "_S1D",
> "_S2D",
> "_S3D",
> diff --git a/drivers/acpi/acpica/utids.c b/drivers/acpi/acpica/utids.c
> deleted file mode 100644
> index 52eaae4..0000000
> --- a/drivers/acpi/acpica/utids.c
> +++ /dev/null
> @@ -1,382 +0,0 @@
> -/******************************************************************************
> - *
> - * Module Name: utids - support for device IDs - HID, UID, CID
> - *
> - *****************************************************************************/
> -
> -/*
> - * Copyright (C) 2000 - 2009, Intel Corp.
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions, and the following disclaimer,
> - * without modification.
> - * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> - * substantially similar to the "NO WARRANTY" disclaimer below
> - * ("Disclaimer") and any redistribution must be conditioned upon
> - * including a substantially similar Disclaimer requirement for further
> - * binary redistribution.
> - * 3. Neither the names of the above-listed copyright holders nor the names
> - * of any contributors may be used to endorse or promote products derived
> - * from this software without specific prior written permission.
> - *
> - * Alternatively, this software may be distributed under the terms of the
> - * GNU General Public License ("GPL") version 2 as published by the Free
> - * Software Foundation.
> - *
> - * NO WARRANTY
> - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
> - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> - * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
> - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> - * POSSIBILITY OF SUCH DAMAGES.
> - */
> -
> -#include <acpi/acpi.h>
> -#include "accommon.h"
> -#include "acinterp.h"
> -
> -#define _COMPONENT ACPI_UTILITIES
> -ACPI_MODULE_NAME("utids")
> -
> -/* Local prototypes */
> -static void acpi_ut_copy_id_string(char *destination, char *source);
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: acpi_ut_copy_id_string
> - *
> - * PARAMETERS: Destination - Where to copy the string
> - * Source - Source string
> - *
> - * RETURN: None
> - *
> - * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
> - * Performs removal of a leading asterisk if present -- workaround
> - * for a known issue on a bunch of machines.
> - *
> - ******************************************************************************/
> -
> -static void acpi_ut_copy_id_string(char *destination, char *source)
> -{
> -
> - /*
> - * Workaround for ID strings that have a leading asterisk. This construct
> - * is not allowed by the ACPI specification (ID strings must be
> - * alphanumeric), but enough existing machines have this embedded in their
> - * ID strings that the following code is useful.
> - */
> - if (*source == '*') {
> - source++;
> - }
> -
> - /* Do the actual copy */
> -
> - ACPI_STRCPY(destination, source);
> -}
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: acpi_ut_execute_HID
> - *
> - * PARAMETERS: device_node - Node for the device
> - * return_id - Where the string HID is returned
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Executes the _HID control method that returns the hardware
> - * ID of the device. The HID is either an 32-bit encoded EISAID
> - * Integer or a String. A string is always returned. An EISAID
> - * is converted to a string.
> - *
> - * NOTE: Internal function, no parameter validation
> - *
> - ******************************************************************************/
> -
> -acpi_status
> -acpi_ut_execute_HID(struct acpi_namespace_node *device_node,
> - struct acpica_device_id **return_id)
> -{
> - union acpi_operand_object *obj_desc;
> - struct acpica_device_id *hid;
> - u32 length;
> - acpi_status status;
> -
> - ACPI_FUNCTION_TRACE(ut_execute_HID);
> -
> - status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID,
> - ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
> - &obj_desc);
> - if (ACPI_FAILURE(status)) {
> - return_ACPI_STATUS(status);
> - }
> -
> - /* Get the size of the String to be returned, includes null terminator */
> -
> - if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> - length = ACPI_EISAID_STRING_SIZE;
> - } else {
> - length = obj_desc->string.length + 1;
> - }
> -
> - /* Allocate a buffer for the HID */
> -
> - hid =
> - ACPI_ALLOCATE_ZEROED(sizeof(struct acpica_device_id) +
> - (acpi_size) length);
> - if (!hid) {
> - status = AE_NO_MEMORY;
> - goto cleanup;
> - }
> -
> - /* Area for the string starts after DEVICE_ID struct */
> -
> - hid->string = ACPI_ADD_PTR(char, hid, sizeof(struct acpica_device_id));
> -
> - /* Convert EISAID to a string or simply copy existing string */
> -
> - if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> - acpi_ex_eisa_id_to_string(hid->string, obj_desc->integer.value);
> - } else {
> - acpi_ut_copy_id_string(hid->string, obj_desc->string.pointer);
> - }
> -
> - hid->length = length;
> - *return_id = hid;
> -
> -cleanup:
> -
> - /* On exit, we must delete the return object */
> -
> - acpi_ut_remove_reference(obj_desc);
> - return_ACPI_STATUS(status);
> -}
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: acpi_ut_execute_UID
> - *
> - * PARAMETERS: device_node - Node for the device
> - * return_id - Where the string UID is returned
> - *
> - * RETURN: Status
> - *
> - * DESCRIPTION: Executes the _UID control method that returns the unique
> - * ID of the device. The UID is either a 64-bit Integer (NOT an
> - * EISAID) or a string. Always returns a string. A 64-bit integer
> - * is converted to a decimal string.
> - *
> - * NOTE: Internal function, no parameter validation
> - *
> - ******************************************************************************/
> -
> -acpi_status
> -acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
> - struct acpica_device_id **return_id)
> -{
> - union acpi_operand_object *obj_desc;
> - struct acpica_device_id *uid;
> - u32 length;
> - acpi_status status;
> -
> - ACPI_FUNCTION_TRACE(ut_execute_UID);
> -
> - status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID,
> - ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING,
> - &obj_desc);
> - if (ACPI_FAILURE(status)) {
> - return_ACPI_STATUS(status);
> - }
> -
> - /* Get the size of the String to be returned, includes null terminator */
> -
> - if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> - length = ACPI_MAX64_DECIMAL_DIGITS + 1;
> - } else {
> - length = obj_desc->string.length + 1;
> - }
> -
> - /* Allocate a buffer for the UID */
> -
> - uid =
> - ACPI_ALLOCATE_ZEROED(sizeof(struct acpica_device_id) +
> - (acpi_size) length);
> - if (!uid) {
> - status = AE_NO_MEMORY;
> - goto cleanup;
> - }
> -
> - /* Area for the string starts after DEVICE_ID struct */
> -
> - uid->string = ACPI_ADD_PTR(char, uid, sizeof(struct acpica_device_id));
> -
> - /* Convert an Integer to string, or just copy an existing string */
> -
> - if (obj_desc->common.type == ACPI_TYPE_INTEGER) {
> - acpi_ex_integer_to_string(uid->string, obj_desc->integer.value);
> - } else {
> - acpi_ut_copy_id_string(uid->string, obj_desc->string.pointer);
> - }
> -
> - uid->length = length;
> - *return_id = uid;
> -
> -cleanup:
> -
> - /* On exit, we must delete the return object */
> -
> - acpi_ut_remove_reference(obj_desc);
> - return_ACPI_STATUS(status);
> -}
> -
> -/*******************************************************************************
> - *
> - * FUNCTION: acpi_ut_execute_CID
> - *
> - * PARAMETERS: device_node - Node for the device
> - * return_cid_list - Where the CID list is returned
> - *
> - * RETURN: Status, list of CID strings
> - *
> - * DESCRIPTION: Executes the _CID control method that returns one or more
> - * compatible hardware IDs for the device.
> - *
> - * NOTE: Internal function, no parameter validation
> - *
> - * A _CID method can return either a single compatible ID or a package of
> - * compatible IDs. Each compatible ID can be one of the following:
> - * 1) Integer (32 bit compressed EISA ID) or
> - * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
> - *
> - * The Integer CIDs are converted to string format by this function.
> - *
> - ******************************************************************************/
> -
> -acpi_status
> -acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
> - struct acpica_device_id_list **return_cid_list)
> -{
> - union acpi_operand_object **cid_objects;
> - union acpi_operand_object *obj_desc;
> - struct acpica_device_id_list *cid_list;
> - char *next_id_string;
> - u32 string_area_size;
> - u32 length;
> - u32 cid_list_size;
> - acpi_status status;
> - u32 count;
> - u32 i;
> -
> - ACPI_FUNCTION_TRACE(ut_execute_CID);
> -
> - /* Evaluate the _CID method for this device */
> -
> - status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID,
> - ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
> - | ACPI_BTYPE_PACKAGE, &obj_desc);
> - if (ACPI_FAILURE(status)) {
> - return_ACPI_STATUS(status);
> - }
> -
> - /*
> - * Get the count and size of the returned _CIDs. _CID can return either
> - * a Package of Integers/Strings or a single Integer or String.
> - * Note: This section also validates that all CID elements are of the
> - * correct type (Integer or String).
> - */
> - if (obj_desc->common.type == ACPI_TYPE_PACKAGE) {
> - count = obj_desc->package.count;
> - cid_objects = obj_desc->package.elements;
> - } else { /* Single Integer or String CID */
> -
> - count = 1;
> - cid_objects = &obj_desc;
> - }
> -
> - string_area_size = 0;
> - for (i = 0; i < count; i++) {
> -
> - /* String lengths include null terminator */
> -
> - switch (cid_objects[i]->common.type) {
> - case ACPI_TYPE_INTEGER:
> - string_area_size += ACPI_EISAID_STRING_SIZE;
> - break;
> -
> - case ACPI_TYPE_STRING:
> - string_area_size += cid_objects[i]->string.length + 1;
> - break;
> -
> - default:
> - status = AE_TYPE;
> - goto cleanup;
> - }
> - }
> -
> - /*
> - * Now that we know the length of the CIDs, allocate return buffer:
> - * 1) Size of the base structure +
> - * 2) Size of the CID DEVICE_ID array +
> - * 3) Size of the actual CID strings
> - */
> - cid_list_size = sizeof(struct acpica_device_id_list) +
> - ((count - 1) * sizeof(struct acpica_device_id)) + string_area_size;
> -
> - cid_list = ACPI_ALLOCATE_ZEROED(cid_list_size);
> - if (!cid_list) {
> - status = AE_NO_MEMORY;
> - goto cleanup;
> - }
> -
> - /* Area for CID strings starts after the CID DEVICE_ID array */
> -
> - next_id_string = ACPI_CAST_PTR(char, cid_list->ids) +
> - ((acpi_size) count * sizeof(struct acpica_device_id));
> -
> - /* Copy/convert the CIDs to the return buffer */
> -
> - for (i = 0; i < count; i++) {
> - if (cid_objects[i]->common.type == ACPI_TYPE_INTEGER) {
> -
> - /* Convert the Integer (EISAID) CID to a string */
> -
> - acpi_ex_eisa_id_to_string(next_id_string,
> - cid_objects[i]->integer.
> - value);
> - length = ACPI_EISAID_STRING_SIZE;
> - } else { /* ACPI_TYPE_STRING */
> -
> - /* Copy the String CID from the returned object */
> -
> - acpi_ut_copy_id_string(next_id_string,
> - cid_objects[i]->string.pointer);
> - length = cid_objects[i]->string.length + 1;
> - }
> -
> - cid_list->ids[i].string = next_id_string;
> - cid_list->ids[i].length = length;
> - next_id_string += length;
> - }
> -
> - /* Finish the CID list */
> -
> - cid_list->count = count;
> - cid_list->list_size = cid_list_size;
> - *return_cid_list = cid_list;
> -
> -cleanup:
> -
> - /* On exit, we must delete the _CID return object */
> -
> - acpi_ut_remove_reference(obj_desc);
> - return_ACPI_STATUS(status);
> -}
> diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c
> index 61f6315..75d2d93 100644
> --- a/drivers/acpi/acpica/utmisc.c
> +++ b/drivers/acpi/acpica/utmisc.c
> @@ -125,34 +125,6 @@ const char *acpi_ut_validate_exception(acpi_status status)
>
> /*******************************************************************************
> *
> - * FUNCTION: acpi_ut_is_pci_root_bridge
> - *
> - * PARAMETERS: Id - The HID/CID in string format
> - *
> - * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
> - *
> - * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
> - *
> - ******************************************************************************/
> -
> -u8 acpi_ut_is_pci_root_bridge(char *id)
> -{
> -
> - /*
> - * Check if this is a PCI root bridge.
> - * ACPI 3.0+: check for a PCI Express root also.
> - */
> - if (!(ACPI_STRCMP(id,
> - PCI_ROOT_HID_STRING)) ||
> - !(ACPI_STRCMP(id, PCI_EXPRESS_ROOT_HID_STRING))) {
> - return (TRUE);
> - }
> -
> - return (FALSE);
> -}
> -
> -/*******************************************************************************
> - *
> * FUNCTION: acpi_ut_is_aml_table
> *
> * PARAMETERS: Table - An ACPI table
> diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
> index 642bb30..5f2c3c0 100644
> --- a/drivers/acpi/container.c
> +++ b/drivers/acpi/container.c
> @@ -202,17 +202,20 @@ container_walk_namespace_cb(acpi_handle handle,
> u32 lvl, void *context, void **rv)
> {
> char *hid = NULL;
> + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
> struct acpi_device_info *info;
> acpi_status status;
> int *action = context;
>
> - status = acpi_get_object_info(handle, &info);
> - if (ACPI_FAILURE(status)) {
> +
> + status = acpi_get_object_info(handle, &buffer);
> + if (ACPI_FAILURE(status) || !buffer.pointer) {
> return AE_OK;
> }
>
> + info = buffer.pointer;
> if (info->valid & ACPI_VALID_HID)
> - hid = info->hardware_id.string;
> + hid = info->hardware_id.value;
>
> if (hid == NULL) {
> goto end;
> @@ -239,7 +242,7 @@ container_walk_namespace_cb(acpi_handle handle,
> }
>
> end:
> - kfree(info);
> + kfree(buffer.pointer);
>
> return AE_OK;
> }
> diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
> index 3a2cfef..9a85566 100644
> --- a/drivers/acpi/dock.c
> +++ b/drivers/acpi/dock.c
> @@ -233,16 +233,18 @@ static int is_ata(acpi_handle handle)
> static int is_battery(acpi_handle handle)
> {
> struct acpi_device_info *info;
> + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
> int ret = 1;
>
> - if (!ACPI_SUCCESS(acpi_get_object_info(handle, &info)))
> + if (!ACPI_SUCCESS(acpi_get_object_info(handle, &buffer)))
> return 0;
> + info = buffer.pointer;
> if (!(info->valid & ACPI_VALID_HID))
> ret = 0;
> else
> - ret = !strcmp("PNP0C0A", info->hardware_id.string);
> + ret = !strcmp("PNP0C0A", info->hardware_id.value);
>
> - kfree(info);
> + kfree(buffer.pointer);
> return ret;
> }
>
> diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
> index c6645f2..82daa75 100644
> --- a/drivers/acpi/glue.c
> +++ b/drivers/acpi/glue.c
> @@ -95,13 +95,15 @@ do_acpi_find_child(acpi_handle handle, u32 lvl, void *context, void **rv)
> {
> acpi_status status;
> struct acpi_device_info *info;
> + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
> struct acpi_find_child *find = context;
>
> - status = acpi_get_object_info(handle, &info);
> + status = acpi_get_object_info(handle, &buffer);
> if (ACPI_SUCCESS(status)) {
> + info = buffer.pointer;
> if (info->address == find->address)
> find->handle = handle;
> - kfree(info);
> + kfree(buffer.pointer);
> }
> return AE_OK;
> }
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index 408ebde..056f17c 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -60,13 +60,13 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
> }
>
> if (acpi_dev->flags.compatible_ids) {
> - struct acpica_device_id_list *cid_list;
> + struct acpi_compatible_id_list *cid_list;
> int i;
>
> cid_list = acpi_dev->pnp.cid_list;
> for (i = 0; i < cid_list->count; i++) {
> count = snprintf(&modalias[len], size, "%s:",
> - cid_list->ids[i].string);
> + cid_list->id[i].value);
> if (count < 0 || count >= size) {
> printk(KERN_ERR PREFIX "%s cid[%i] exceeds event buffer size",
> acpi_dev->pnp.device_name, i);
> @@ -287,14 +287,14 @@ int acpi_match_device_ids(struct acpi_device *device,
> }
>
> if (device->flags.compatible_ids) {
> - struct acpica_device_id_list *cid_list = device->pnp.cid_list;
> + struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
> int i;
>
> for (id = ids; id->id[0]; id++) {
> /* compare multiple _CID entries against driver ids */
> for (i = 0; i < cid_list->count; i++) {
> if (!strcmp((char*)id->id,
> - cid_list->ids[i].string))
> + cid_list->id[i].value))
> return 0;
> }
> }
> @@ -1000,89 +1000,33 @@ static int acpi_dock_match(struct acpi_device *device)
> return acpi_get_handle(device->handle, "_DCK", &tmp);
> }
>
> -static struct acpica_device_id_list*
> -acpi_add_cid(
> - struct acpi_device_info *info,
> - struct acpica_device_id *new_cid)
> -{
> - struct acpica_device_id_list *cid;
> - char *next_id_string;
> - acpi_size cid_length;
> - acpi_size new_cid_length;
> - u32 i;
> -
> -
> - /* Allocate new CID list with room for the new CID */
> -
> - if (!new_cid)
> - new_cid_length = info->compatible_id_list.list_size;
> - else if (info->compatible_id_list.list_size)
> - new_cid_length = info->compatible_id_list.list_size +
> - new_cid->length + sizeof(struct acpica_device_id);
> - else
> - new_cid_length = sizeof(struct acpica_device_id_list) + new_cid->length;
> -
> - cid = ACPI_ALLOCATE_ZEROED(new_cid_length);
> - if (!cid) {
> - return NULL;
> - }
> -
> - cid->list_size = new_cid_length;
> - cid->count = info->compatible_id_list.count;
> - if (new_cid)
> - cid->count++;
> - next_id_string = (char *) cid->ids + (cid->count * sizeof(struct acpica_device_id));
> -
> - /* Copy all existing CIDs */
> -
> - for (i = 0; i < info->compatible_id_list.count; i++) {
> - cid_length = info->compatible_id_list.ids[i].length;
> - cid->ids[i].string = next_id_string;
> - cid->ids[i].length = cid_length;
> -
> - ACPI_MEMCPY(next_id_string, info->compatible_id_list.ids[i].string,
> - cid_length);
> -
> - next_id_string += cid_length;
> - }
> -
> - /* Append the new CID */
> -
> - if (new_cid) {
> - cid->ids[i].string = next_id_string;
> - cid->ids[i].length = new_cid->length;
> -
> - ACPI_MEMCPY(next_id_string, new_cid->string, new_cid->length);
> - }
> -
> - return cid;
> -}
> -
> static void acpi_device_set_id(struct acpi_device *device,
> struct acpi_device *parent, acpi_handle handle,
> int type)
> {
> - struct acpi_device_info *info = NULL;
> + struct acpi_device_info *info;
> + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
> char *hid = NULL;
> char *uid = NULL;
> - struct acpica_device_id_list *cid_list = NULL;
> - char *cid_add = NULL;
> + struct acpi_compatible_id_list *cid_list = NULL;
> + const char *cid_add = NULL;
> acpi_status status;
>
> switch (type) {
> case ACPI_BUS_TYPE_DEVICE:
> - status = acpi_get_object_info(handle, &info);
> + status = acpi_get_object_info(handle, &buffer);
> if (ACPI_FAILURE(status)) {
> printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__);
> return;
> }
>
> + info = buffer.pointer;
> if (info->valid & ACPI_VALID_HID)
> - hid = info->hardware_id.string;
> + hid = info->hardware_id.value;
> if (info->valid & ACPI_VALID_UID)
> - uid = info->unique_id.string;
> + uid = info->unique_id.value;
> if (info->valid & ACPI_VALID_CID)
> - cid_list = &info->compatible_id_list;
> + cid_list = &info->compatibility_id;
> if (info->valid & ACPI_VALID_ADR) {
> device->pnp.bus_address = info->address;
> device->flags.bus_address = 1;
> @@ -1133,46 +1077,55 @@ static void acpi_device_set_id(struct acpi_device *device,
> }
>
> if (hid) {
> - device->pnp.hardware_id = ACPI_ALLOCATE_ZEROED(strlen (hid) + 1);
> - if (device->pnp.hardware_id) {
> - strcpy(device->pnp.hardware_id, hid);
> - device->flags.hardware_id = 1;
> - }
> + strcpy(device->pnp.hardware_id, hid);
> + device->flags.hardware_id = 1;
> }
> - if (!device->flags.hardware_id)
> - device->pnp.hardware_id = "";
> -
> if (uid) {
> - device->pnp.unique_id = ACPI_ALLOCATE_ZEROED(strlen (uid) + 1);
> - if (device->pnp.unique_id) {
> - strcpy(device->pnp.unique_id, uid);
> - device->flags.unique_id = 1;
> - }
> + strcpy(device->pnp.unique_id, uid);
> + device->flags.unique_id = 1;
> }
> - if (!device->flags.unique_id)
> - device->pnp.unique_id = "";
> -
> if (cid_list || cid_add) {
> - struct acpica_device_id_list *list;
> -
> - if (cid_add) {
> - struct acpica_device_id cid;
> - cid.length = strlen (cid_add) + 1;
> - cid.string = cid_add;
> -
> - list = acpi_add_cid(info, &cid);
> - } else {
> - list = acpi_add_cid(info, NULL);
> + struct acpi_compatible_id_list *list;
> + int size = 0;
> + int count = 0;
> +
> + if (cid_list) {
> + size = cid_list->size;
> + } else if (cid_add) {
> + size = sizeof(struct acpi_compatible_id_list);
> + cid_list = ACPI_ALLOCATE_ZEROED((acpi_size) size);
> + if (!cid_list) {
> + printk(KERN_ERR "Memory allocation error\n");
> + kfree(buffer.pointer);
> + return;
> + } else {
> + cid_list->count = 0;
> + cid_list->size = size;
> + }
> }
> + if (cid_add)
> + size += sizeof(struct acpi_compatible_id);
> + list = kmalloc(size, GFP_KERNEL);
>
> if (list) {
> - device->pnp.cid_list = list;
> - if (cid_add)
> + if (cid_list) {
> + memcpy(list, cid_list, cid_list->size);
> + count = cid_list->count;
> + }
> + if (cid_add) {
> + strncpy(list->id[count].value, cid_add,
> + ACPI_MAX_CID_LENGTH);
> + count++;
> device->flags.compatible_ids = 1;
> - }
> + }
> + list->size = size;
> + list->count = count;
> + device->pnp.cid_list = list;
> + } else
> + printk(KERN_ERR PREFIX "Memory allocation error\n");
> }
>
> - kfree(info);
> + kfree(buffer.pointer);
> }
>
> static int acpi_device_set_context(struct acpi_device *device, int type)
> diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c
> index 9047b27..501e293 100644
> --- a/drivers/char/agp/hp-agp.c
> +++ b/drivers/char/agp/hp-agp.c
> @@ -476,6 +476,7 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
> {
> acpi_handle handle, parent;
> acpi_status status;
> + struct acpi_buffer buffer;
> struct acpi_device_info *info;
> u64 lba_hpa, sba_hpa, length;
> int match;
> @@ -487,11 +488,13 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
> /* Look for an enclosing IOC scope and find its CSR space */
> handle = obj;
> do {
> - status = acpi_get_object_info(handle, &info);
> + buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
> + status = acpi_get_object_info(handle, &buffer);
> if (ACPI_SUCCESS(status)) {
> /* TBD check _CID also */
> - info->hardware_id.string[sizeof(info->hardware_id.length)-1] = '\0';
> - match = (strcmp(info->hardware_id.string, "HWP0001") == 0);
> + info = buffer.pointer;
> + info->hardware_id.value[sizeof(info->hardware_id)-1] = '\0';
> + match = (strcmp(info->hardware_id.value, "HWP0001") == 0);
> kfree(info);
> if (match) {
> status = hp_acpi_csr_space(handle, &sba_hpa, &length);
> diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c
> index c0cf45a..c509c99 100644
> --- a/drivers/ide/ide-acpi.c
> +++ b/drivers/ide/ide-acpi.c
> @@ -114,6 +114,8 @@ static int ide_get_dev_handle(struct device *dev, acpi_handle *handle,
> unsigned int bus, devnum, func;
> acpi_integer addr;
> acpi_handle dev_handle;
> + struct acpi_buffer buffer = {.length = ACPI_ALLOCATE_BUFFER,
> + .pointer = NULL};
> acpi_status status;
> struct acpi_device_info *dinfo = NULL;
> int ret = -ENODEV;
> @@ -132,11 +134,12 @@ static int ide_get_dev_handle(struct device *dev, acpi_handle *handle,
> goto err;
> }
>
> - status = acpi_get_object_info(dev_handle, &dinfo);
> + status = acpi_get_object_info(dev_handle, &buffer);
> if (ACPI_FAILURE(status)) {
> DEBPRINT("get_object_info for device failed\n");
> goto err;
> }
> + dinfo = buffer.pointer;
> if (dinfo && (dinfo->valid & ACPI_VALID_ADR) &&
> dinfo->address == addr) {
> *pcidevfn = addr;
> diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
> index a9d926b..5befa7e 100644
> --- a/drivers/pci/hotplug/acpiphp_ibm.c
> +++ b/drivers/pci/hotplug/acpiphp_ibm.c
> @@ -398,21 +398,23 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
> acpi_handle *phandle = (acpi_handle *)context;
> acpi_status status;
> struct acpi_device_info *info;
> + struct acpi_buffer info_buffer = { ACPI_ALLOCATE_BUFFER, NULL };
> int retval = 0;
>
> - status = acpi_get_object_info(handle, &info);
> + status = acpi_get_object_info(handle, &info_buffer);
> if (ACPI_FAILURE(status)) {
> err("%s: Failed to get device information status=0x%x\n",
> __func__, status);
> return retval;
> }
> - info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';
> + info = info_buffer.pointer;
> + info->hardware_id.value[sizeof(info->hardware_id.value) - 1] = '\0';
>
> if (info->current_status && (info->valid & ACPI_VALID_HID) &&
> - (!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
> - !strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
> + (!strcmp(info->hardware_id.value, IBM_HARDWARE_ID1) ||
> + !strcmp(info->hardware_id.value, IBM_HARDWARE_ID2))) {
> dbg("found hardware: %s, handle: %p\n",
> - info->hardware_id.string, handle);
> + info->hardware_id.value, handle);
> *phandle = handle;
> /* returning non-zero causes the search to stop
> * and returns this value to the caller of
> diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
> index f9f68e0..dafaa4a 100644
> --- a/drivers/platform/x86/sony-laptop.c
> +++ b/drivers/platform/x86/sony-laptop.c
> @@ -976,12 +976,15 @@ static acpi_status sony_walk_callback(acpi_handle handle, u32 level,
> void *context, void **return_value)
> {
> struct acpi_device_info *info;
> + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
> +
> + if (ACPI_SUCCESS(acpi_get_object_info(handle, &buffer))) {
> + info = buffer.pointer;
>
> - if (ACPI_SUCCESS(acpi_get_object_info(handle, &info))) {
> printk(KERN_WARNING DRV_PFX "method: name: %4.4s, args %X\n",
> (char *)&info->name, info->param_count);
>
> - kfree(info);
> + kfree(buffer.pointer);
> }
>
> return AE_OK;
> diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
> index c07fdb9..9496494 100644
> --- a/drivers/pnp/pnpacpi/core.c
> +++ b/drivers/pnp/pnpacpi/core.c
> @@ -194,13 +194,13 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
> pnpacpi_parse_resource_option_data(dev);
>
> if (device->flags.compatible_ids) {
> - struct acpica_device_id_list *cid_list = device->pnp.cid_list;
> + struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
> int i;
>
> for (i = 0; i < cid_list->count; i++) {
> - if (!ispnpidacpi(cid_list->ids[i].string))
> + if (!ispnpidacpi(cid_list->id[i].value))
> continue;
> - pnp_add_id(dev, cid_list->ids[i].string);
> + pnp_add_id(dev, cid_list->id[i].value);
> }
> }
>
> diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> index 1cef139..7f2cabb 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -169,15 +169,17 @@ struct acpi_device_dir {
>
> typedef char acpi_bus_id[8];
> typedef unsigned long acpi_bus_address;
> +typedef char acpi_hardware_id[15];
> +typedef char acpi_unique_id[9];
> typedef char acpi_device_name[40];
> typedef char acpi_device_class[20];
>
> struct acpi_device_pnp {
> acpi_bus_id bus_id; /* Object name */
> acpi_bus_address bus_address; /* _ADR */
> - char *hardware_id; /* _HID */
> - struct acpica_device_id_list *cid_list; /* _CIDs */
> - char *unique_id; /* _UID */
> + acpi_hardware_id hardware_id; /* _HID */
> + struct acpi_compatible_id_list *cid_list; /* _CIDs */
> + acpi_unique_id unique_id; /* _UID */
> acpi_device_name device_name; /* Driver-determined */
> acpi_device_class device_class; /* " */
> };
> diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
> index e723b0f..a7eecb4 100644
> --- a/include/acpi/acpixf.h
> +++ b/include/acpi/acpixf.h
> @@ -200,8 +200,7 @@ acpi_evaluate_object_typed(acpi_handle object,
> acpi_object_type return_type);
>
> acpi_status
> -acpi_get_object_info(acpi_handle handle,
> - struct acpi_device_info **return_buffer);
> +acpi_get_object_info(acpi_handle handle, struct acpi_buffer *return_buffer);
>
> acpi_status acpi_install_method(u8 *buffer);
>
> diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
> index 153f12d..90df86f 100644
> --- a/include/acpi/actypes.h
> +++ b/include/acpi/actypes.h
> @@ -338,7 +338,7 @@ typedef u32 acpi_physical_address;
>
> /* PM Timer ticks per second (HZ) */
>
> -#define PM_TIMER_FREQUENCY 3579545
> +#define PM_TIMER_FREQUENCY 3579545
>
> /*******************************************************************************
> *
> @@ -970,60 +970,38 @@ acpi_status(*acpi_walk_callback) (acpi_handle obj_handle,
> #define ACPI_INTERRUPT_NOT_HANDLED 0x00
> #define ACPI_INTERRUPT_HANDLED 0x01
>
> -/* Length of 32-bit EISAID values when converted back to a string */
> -
> -#define ACPI_EISAID_STRING_SIZE 8 /* Includes null terminator */
> -
> -/* Length of UUID (string) values */
> +/* Length of _HID, _UID, _CID, and UUID values */
>
> +#define ACPI_DEVICE_ID_LENGTH 0x09
> +#define ACPI_MAX_CID_LENGTH 48
> #define ACPI_UUID_LENGTH 16
>
> -/* Structures used for device/processor HID, UID, CID */
> +/* Common string version of device HIDs and UIDs */
>
> struct acpica_device_id {
> - u32 length; /* Length of string + null */
> - char *string;
> + char value[ACPI_DEVICE_ID_LENGTH];
> };
>
> -struct acpica_device_id_list {
> - u32 count; /* Number of IDs in Ids array */
> - u32 list_size; /* Size of list, including ID strings */
> - struct acpica_device_id ids[1]; /* ID array */
> -};
> +/* Common string version of device CIDs */
>
> -/*
> - * Structure returned from acpi_get_object_info.
> - * Optimized for both 32- and 64-bit builds
> - */
> -struct acpi_device_info {
> - u32 info_size; /* Size of info, including ID strings */
> - u32 name; /* ACPI object Name */
> - acpi_object_type type; /* ACPI object Type */
> - u8 param_count; /* If a method, required parameter count */
> - u8 valid; /* Indicates which optional fields are valid */
> - u8 flags; /* Miscellaneous info */
> - u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
> - u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */
> - u32 current_status; /* _STA value */
> - acpi_integer address; /* _ADR value */
> - struct acpica_device_id hardware_id; /* _HID value */
> - struct acpica_device_id unique_id; /* _UID value */
> - struct acpica_device_id_list compatible_id_list; /* _CID list <must be last> */
> +struct acpi_compatible_id {
> + char value[ACPI_MAX_CID_LENGTH];
> };
>
> -/* Values for Flags field above (acpi_get_object_info) */
> -
> -#define ACPI_PCI_ROOT_BRIDGE 0x01
> +struct acpi_compatible_id_list {
> + u32 count;
> + u32 size;
> + struct acpi_compatible_id id[1];
> +};
>
> -/* Flags for Valid field above (acpi_get_object_info) */
> +/* Structure and flags for acpi_get_object_info */
>
> -#define ACPI_VALID_STA 0x01
> -#define ACPI_VALID_ADR 0x02
> -#define ACPI_VALID_HID 0x04
> -#define ACPI_VALID_UID 0x08
> -#define ACPI_VALID_CID 0x10
> -#define ACPI_VALID_SXDS 0x20
> -#define ACPI_VALID_SXWS 0x40
> +#define ACPI_VALID_STA 0x0001
> +#define ACPI_VALID_ADR 0x0002
> +#define ACPI_VALID_HID 0x0004
> +#define ACPI_VALID_UID 0x0008
> +#define ACPI_VALID_CID 0x0010
> +#define ACPI_VALID_SXDS 0x0020
>
> /* Flags for _STA method */
>
> @@ -1034,6 +1012,29 @@ struct acpi_device_info {
> #define ACPI_STA_DEVICE_OK 0x08 /* Synonym */
> #define ACPI_STA_BATTERY_PRESENT 0x10
>
> +#define ACPI_COMMON_OBJ_INFO \
> + acpi_object_type type; /* ACPI object type */ \
> + acpi_name name /* ACPI object Name */
> +
> +struct acpi_obj_info_header {
> + ACPI_COMMON_OBJ_INFO;
> +};
> +
> +/* Structure returned from Get Object Info */
> +
> +struct acpi_device_info {
> + ACPI_COMMON_OBJ_INFO;
> +
> + u32 param_count; /* If a method, required parameter count */
> + u32 valid; /* Indicates which fields below are valid */
> + u32 current_status; /* _STA value */
> + acpi_integer address; /* _ADR value if any */
> + struct acpica_device_id hardware_id; /* _HID value if any */
> + struct acpica_device_id unique_id; /* _UID value if any */
> + u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
> + struct acpi_compatible_id_list compatibility_id; /* List of _CIDs if any */
> +};
> +
> /* Context structs for address space handlers */
>
> struct acpi_pci_id {

2009-09-24 02:07:10

by Lin Ming

[permalink] [raw]
Subject: Re: [origin tree boot crash] NULL pointer dereference, IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5

On Thu, 2009-09-24 at 09:35 +0800, Lin Ming wrote:
> On Thu, 2009-09-24 at 05:30 +0800, Ingo Molnar wrote:
> > > commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f
> > > Date: Mon Jun 29 13:39:29 2009 +0800
> > >
> > > ACPICA: Major update for acpi_get_object_info external interface
> >
> > this one is causing boot crashes in -tip testing:
>
> Hi,
>
> Could you please try below commit at linux-acpi-2.6/release branch.

Oh, sorry, commit 718fb0d was already in -tip testing.

(add Bjorn Helgaas <[email protected]>)

Below patch should fix the crash.
http://patchwork.kernel.org/patch/49090/

Subject: [PATCH v3 01/17] ACPICA: fixup after acpi_get_object_info() change

Commit 15b8dd53f5ffa changed info->hardware_id from a static array to
a pointer. If hardware_id is non-NULL, it points to a NULL-terminated
string, so we don't need to terminate it explicitly. However, it may
be NULL; in that case, we *can't* add a NULL terminator.

This causes a NULL pointer dereference oops for devices without _HID.

Signed-off-by: Bjorn Helgaas <[email protected]>
CC: Lin Ming <[email protected]>
CC: Bob Moore <[email protected]>
CC: Gary Hade <[email protected]>
---
drivers/pci/hotplug/acpiphp_ibm.c | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
index a9d926b..e7be66d 100644
--- a/drivers/pci/hotplug/acpiphp_ibm.c
+++ b/drivers/pci/hotplug/acpiphp_ibm.c
@@ -406,7 +406,6 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
__func__, status);
return retval;
}
- info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';

if (info->current_status && (info->valid & ACPI_VALID_HID) &&
(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||


---
Lin Ming

>
> commit 718fb0de8ff88f71b3b91a8ee8e42e60c88e5128
> Author: Hugh Dickins <[email protected]>
> Date: Thu Aug 6 23:18:12 2009 +0000
>
> ACPI: fix NULL bug for HID/UID string
>
> acpi_device->pnp.hardware_id and unique_id are now allocated pointers,
> replacing the previous arrays. acpi_device_install_notify_handler()
> oopsed on the NULL hid when probing the video device, and perhaps other
> uses are vulnerable too. So initialize those pointers to empty strings
> when there is no hid or uid. Also, free hardware_id and unique_id when
> when acpi_device is going to be freed.
>
> http://bugzilla.kernel.org/show_bug.cgi?id=14096
>
> Signed-off-by: Hugh Dickins <[email protected]>
> Signed-off-by: Lin Ming <[email protected]>
> Signed-off-by: Len Brown <[email protected]>
>
> Thanks,
> Lin Ming

2009-09-24 02:22:23

by Lin Ming

[permalink] [raw]
Subject: Re: [origin tree boot crash] NULL pointer dereference, IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5

On Thu, 2009-09-24 at 09:58 +0800, Lin Ming wrote:
> On Thu, 2009-09-24 at 09:35 +0800, Lin Ming wrote:
> > On Thu, 2009-09-24 at 05:30 +0800, Ingo Molnar wrote:
> > > > commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f
> > > > Date: Mon Jun 29 13:39:29 2009 +0800
> > > >
> > > > ACPICA: Major update for acpi_get_object_info external interface
> > >
> > > this one is causing boot crashes in -tip testing:
> >
> > Hi,
> >
> > Could you please try below commit at linux-acpi-2.6/release branch.
>
> Oh, sorry, commit 718fb0d was already in -tip testing.
>
> (add Bjorn Helgaas <[email protected]>)

Bjorn,

hp-agp.c need the same fix.
Could you refresh your patch with this one?

Thanks,

diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c
index 7bead4c..d83c4a8 100644
--- a/drivers/char/agp/hp-agp.c
+++ b/drivers/char/agp/hp-agp.c
@@ -492,8 +492,10 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
status = acpi_get_object_info(handle, &info);
if (ACPI_SUCCESS(status)) {
/* TBD check _CID also */
- info->hardware_id.string[sizeof(info->hardware_id.length)-1] = '\0';
- match = (strcmp(info->hardware_id.string, "HWP0001") == 0);
+ if (info->valid & ACPI_VALID_HID)
+ match = !strcmp(info->hardware_id.string, "HWP0001");
+ else
+ match = 0;
kfree(info);
if (match) {
status = hp_acpi_csr_space(handle, &sba_hpa, &length);
diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
index a9d926b..e7be66d 100644
--- a/drivers/pci/hotplug/acpiphp_ibm.c
+++ b/drivers/pci/hotplug/acpiphp_ibm.c
@@ -406,7 +406,6 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
__func__, status);
return retval;
}
- info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';

if (info->current_status && (info->valid & ACPI_VALID_HID) &&
(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||


>
> Below patch should fix the crash.
> http://patchwork.kernel.org/patch/49090/
>
> Subject: [PATCH v3 01/17] ACPICA: fixup after acpi_get_object_info() change
>
> Commit 15b8dd53f5ffa changed info->hardware_id from a static array to
> a pointer. If hardware_id is non-NULL, it points to a NULL-terminated
> string, so we don't need to terminate it explicitly. However, it may
> be NULL; in that case, we *can't* add a NULL terminator.
>
> This causes a NULL pointer dereference oops for devices without _HID.
>
> Signed-off-by: Bjorn Helgaas <[email protected]>
> CC: Lin Ming <[email protected]>
> CC: Bob Moore <[email protected]>
> CC: Gary Hade <[email protected]>
> ---
> drivers/pci/hotplug/acpiphp_ibm.c | 1 -
> 1 files changed, 0 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
> index a9d926b..e7be66d 100644
> --- a/drivers/pci/hotplug/acpiphp_ibm.c
> +++ b/drivers/pci/hotplug/acpiphp_ibm.c
> @@ -406,7 +406,6 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
> __func__, status);
> return retval;
> }
> - info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';
>
> if (info->current_status && (info->valid & ACPI_VALID_HID) &&
> (!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
>
>
> ---
> Lin Ming
>
> >
> > commit 718fb0de8ff88f71b3b91a8ee8e42e60c88e5128
> > Author: Hugh Dickins <[email protected]>
> > Date: Thu Aug 6 23:18:12 2009 +0000
> >
> > ACPI: fix NULL bug for HID/UID string
> >
> > acpi_device->pnp.hardware_id and unique_id are now allocated pointers,
> > replacing the previous arrays. acpi_device_install_notify_handler()
> > oopsed on the NULL hid when probing the video device, and perhaps other
> > uses are vulnerable too. So initialize those pointers to empty strings
> > when there is no hid or uid. Also, free hardware_id and unique_id when
> > when acpi_device is going to be freed.
> >
> > http://bugzilla.kernel.org/show_bug.cgi?id=14096
> >
> > Signed-off-by: Hugh Dickins <[email protected]>
> > Signed-off-by: Lin Ming <[email protected]>
> > Signed-off-by: Len Brown <[email protected]>
> >
> > Thanks,
> > Lin Ming
>

2009-09-25 12:37:47

by Thomas Backlund

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Len Brown wrote:
> Hi Linus,
>
> please pull from:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git release
>
> Two new drivers, bring the ACPICA core up to date with ACPI 4.0,
> and a bunch of other stuff...
>
> This will update the files shown below.
>
> thanks!
>
> --
> Len Brown
> Intel Open Source Technology Center
>
>
> ps. individual patches are available on [email protected]
> and a consolidated plain patch is available here:
> http://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/patches/2.6.31/acpi-release-20090903-2.6.31.diff.gz
>

This gets my laptop flooding logs with:

> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)

--
Thomas

2009-09-25 21:49:48

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [origin tree boot crash] NULL pointer dereference, IP: [<ffffffff82b07130>] ibm_find_acpi_device+0x5c/0xf5

On Thu, 2009-09-24 at 10:13 +0800, Lin Ming wrote:
> On Thu, 2009-09-24 at 09:58 +0800, Lin Ming wrote:
> > On Thu, 2009-09-24 at 09:35 +0800, Lin Ming wrote:
> > > On Thu, 2009-09-24 at 05:30 +0800, Ingo Molnar wrote:
> > > > > commit 15b8dd53f5ffaf8e2d9095c423f713423f576c0f
> > > > > Date: Mon Jun 29 13:39:29 2009 +0800
> > > > >
> > > > > ACPICA: Major update for acpi_get_object_info external interface
> > > >
> > > > this one is causing boot crashes in -tip testing:

> hp-agp.c need the same fix.
> Could you refresh your patch with this one?

I think Len has already applied the series containing the acpiphp_ibm.c
fix. I tested that one and verified that it fixed an actual crash.

I think your hp-agp.c patch below is correct, and I don't object if you
want to submit it, but I don't *think* we'll have a problem even without
it.

We will only touch "info->hardware_id.string[]" if we have already found
an HP vendor-defined CSR space descriptor. Any device with that
descriptor should have a HID.

Bjorn

> diff --git a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c
> index 7bead4c..d83c4a8 100644
> --- a/drivers/char/agp/hp-agp.c
> +++ b/drivers/char/agp/hp-agp.c
> @@ -492,8 +492,10 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
> status = acpi_get_object_info(handle, &info);
> if (ACPI_SUCCESS(status)) {
> /* TBD check _CID also */
> - info->hardware_id.string[sizeof(info->hardware_id.length)-1] = '\0';
> - match = (strcmp(info->hardware_id.string, "HWP0001") == 0);
> + if (info->valid & ACPI_VALID_HID)
> + match = !strcmp(info->hardware_id.string, "HWP0001");
> + else
> + match = 0;
> kfree(info);
> if (match) {
> status = hp_acpi_csr_space(handle, &sba_hpa, &length);
> diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
> index a9d926b..e7be66d 100644
> --- a/drivers/pci/hotplug/acpiphp_ibm.c
> +++ b/drivers/pci/hotplug/acpiphp_ibm.c
> @@ -406,7 +406,6 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
> __func__, status);
> return retval;
> }
> - info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';
>
> if (info->current_status && (info->valid & ACPI_VALID_HID) &&
> (!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
>
>
> >
> > Below patch should fix the crash.
> > http://patchwork.kernel.org/patch/49090/
> >
> > Subject: [PATCH v3 01/17] ACPICA: fixup after acpi_get_object_info() change
> >
> > Commit 15b8dd53f5ffa changed info->hardware_id from a static array to
> > a pointer. If hardware_id is non-NULL, it points to a NULL-terminated
> > string, so we don't need to terminate it explicitly. However, it may
> > be NULL; in that case, we *can't* add a NULL terminator.
> >
> > This causes a NULL pointer dereference oops for devices without _HID.
> >
> > Signed-off-by: Bjorn Helgaas <[email protected]>
> > CC: Lin Ming <[email protected]>
> > CC: Bob Moore <[email protected]>
> > CC: Gary Hade <[email protected]>
> > ---
> > drivers/pci/hotplug/acpiphp_ibm.c | 1 -
> > 1 files changed, 0 insertions(+), 1 deletions(-)
> >
> > diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
> > index a9d926b..e7be66d 100644
> > --- a/drivers/pci/hotplug/acpiphp_ibm.c
> > +++ b/drivers/pci/hotplug/acpiphp_ibm.c
> > @@ -406,7 +406,6 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
> > __func__, status);
> > return retval;
> > }
> > - info->hardware_id.string[sizeof(info->hardware_id.length) - 1] = '\0';
> >
> > if (info->current_status && (info->valid & ACPI_VALID_HID) &&
> > (!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
> >
> >
> > ---
> > Lin Ming
> >
> > >
> > > commit 718fb0de8ff88f71b3b91a8ee8e42e60c88e5128
> > > Author: Hugh Dickins <[email protected]>
> > > Date: Thu Aug 6 23:18:12 2009 +0000
> > >
> > > ACPI: fix NULL bug for HID/UID string
> > >
> > > acpi_device->pnp.hardware_id and unique_id are now allocated pointers,
> > > replacing the previous arrays. acpi_device_install_notify_handler()
> > > oopsed on the NULL hid when probing the video device, and perhaps other
> > > uses are vulnerable too. So initialize those pointers to empty strings
> > > when there is no hid or uid. Also, free hardware_id and unique_id when
> > > when acpi_device is going to be freed.
> > >
> > > http://bugzilla.kernel.org/show_bug.cgi?id=14096
> > >
> > > Signed-off-by: Hugh Dickins <[email protected]>
> > > Signed-off-by: Lin Ming <[email protected]>
> > > Signed-off-by: Len Brown <[email protected]>
> > >
> > > Thanks,
> > > Lin Ming
> >
>

2009-09-27 02:04:39

by Lin Ming

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0


>
> This gets my laptop flooding logs with:

Hi,

Could you do a bisect?

Thanks
Lin Ming

>
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
> > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
>
> --
> Thomas
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2009-09-27 07:50:51

by Len Brown

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0


> > This gets my laptop flooding logs with:

> >
> > > ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
> > > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
> > > ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
> > > ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)

> Could you do a bisect?

In particular, please try the 2.6.31 versio of drivers/acpi/ec.c

thanks,
-Len Brown, Intel Open Source Technology Center

2009-09-28 20:18:25

by Thomas Backlund

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

BIOS-e820: 00000000bfed0000 - 00000000bfedf000 (ACPI NVS)
ACPI: RSDP 00000000000f7bf0 00024 (v02 PTLTD )
ACPI: XSDT 00000000bfed160e 0008C (v01 ACRSYS ACRPRDCT 06040000 INNA 00000000)
ACPI: FACP 00000000bfedbbd7 000F4 (v03 INTEL CRESTLNE 06040000 ALAN 00000001)
ACPI: DSDT 00000000bfed2bba 08FA9 (v02 INTEL CRESTLNE 06040000 MSFT 03000000)
ACPI: FACS 00000000bfedefc0 00040
ACPI: HPET 00000000bfedbccb 00038 (v01 INTEL CRESTLNE 06040000 LOHR 0000005A)
ACPI: MCFG 00000000bfedbd03 0003C (v01 INTEL CRESTLNE 06040000 LOHR 0000005A)
ACPI: TCPA 00000000bfedbd3f 00032 (v01 Intel CRESTLN 06040000 00005A52)
ACPI: TMOR 00000000bfedbd71 00026 (v01 PTLTD 06040000 PTL 00000003)
ACPI: SLIC 00000000bfedbd97 00176 (v01 ACRSYS ACRPRDCT 06040000 ANNI 00000001)
ACPI: ASF! 00000000bfedbf0d 00063 (v32 OEMID OEMTBL 06040000 PTL 00000001)
ACPI: APIC 00000000bfedbf70 00068 (v01 PTLTD ? APIC 06040000 LTP 00000000)
ACPI: BOOT 00000000bfedbfd8 00028 (v01 PTLTD $SBFTBL$ 06040000 LTP 00000001)
ACPI: SSDT 00000000bfed28dd 002DD (v01 SataRe SataAhci 00001000 INTL 20050624)
ACPI: SSDT 00000000bfed1c56 0025F (v01 PmRef Cpu0Tst 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed1bb0 000A6 (v01 PmRef Cpu1Tst 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed169a 00516 (v01 PmRef CpuPm 00003000 INTL 20050624)
ACPI: Local APIC address 0xfee00000
ACPI: PM-Timer IO Port: 0x1008
ACPI: Local APIC address 0xfee00000
ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])
ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
ACPI: IRQ0 used by override.
ACPI: IRQ2 used by override.
ACPI: IRQ9 used by override.
Using ACPI (MADT) for SMP configuration information
ACPI: HPET id: 0x8086a201 base: 0xfed00000
ACPI: Core revision 20090903
ACPI: bus type pci registered
ACPI: EC: Look up EC in DSDT
ACPI: BIOS _OSI(Linux) query ignored
ACPI: EC: non-query interrupt received, switching to interrupt mode
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
ACPI: Enumerating devices from [\]
ACPI: EC: GPE = 0x17, I/O: command/status = 0x66, data = 0x62
ACPI: EC: driver started in interrupt mode
ACPI: No dock devices found.
ACPI: PCI Root Bridge [PCI0] (0000:00)
pci 0000:00:1f.0: quirk: region 1000-107f claimed by ICH6 ACPI/GPIO/TCO
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEGP._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.RP01._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.RP02._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.RP03._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PCIB._PRT]
ACPI: PCI Interrupt Link [LNKA] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKE] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKF] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKG] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKH] (IRQs 10 *11)
PCI: Using ACPI for IRQ routing
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp: PnP ACPI: found 11 devices
ACPI: ACPI bus type pnp unregistered
ACPI Warning for \_SB_.PCI0.SATA.PRT0._GTF: Return type mismatch - found Integer, expected Buffer (20090903/nspredef-1006)
ACPI: AC Adapter [ADP1] (on-line)
ACPI: Extensa 5220 detected - disabling mwait for CPU C-states
ACPI: SSDT 00000000bfed2559 002BC (v01 PmRef Cpu0Ist 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed1eb5 0061F (v01 PmRef Cpu0Cst 00003001 INTL 20050624)
ACPI: Processor [CPU0] (supports 8 throttling states)
ACPI: SSDT 00000000bfed2815 000C8 (v01 PmRef Cpu1Ist 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed24d4 00085 (v01 PmRef Cpu1Cst 00003000 INTL 20050624)
ACPI: Processor [CPU1] (supports 8 throttling states)
ACPI: Lid Switch [LID0]
ACPI: Sleep Button [SLPB]
ACPI: Power Button [PWRF]
ACPI: WMI: Mapper loaded
tg3 0000:02:00.0: wake-up capability disabled by ACPI
ACPI: Thermal Zone [TZS0] (44 C)
ACPI: Thermal Zone [TZS1] (58 C)
acer-wmi: Acer Laptop ACPI-WMI Extras
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 9 (20090903/nsrepair-132)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 10 (20090903/nsrepair-132)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 11 (20090903/nsrepair-132)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 12 (20090903/nsrepair-132)
ACPI: Battery Slot [BAT0] (battery present)
ACPI: Video Device [VGA] (multi-head: yes rom: no post: no)
ACPI: I/O resource 0000:00:1f.3 [0x1c00-0x1c1f] conflicts with ACPI region SMBI [0x1c00-0x1c0f]
ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver


Attachments:
dmesg-acpi-20090903 (5.08 kB)
dmesg-acpi-20090903-ec-2.6.31 (4.98 kB)
Download all attachments

2009-09-28 20:44:05

by Alexey Starikovskiy

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Thomas Backlund пишет:
> Len Brown wrote:
>>>> This gets my laptop flooding logs with:
>>
>>>>> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl]
>>>>> (20090903/evregion-424)
>>>>> ACPI Error (psparse-0537): Method parse/execution failed
>>>>> [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
>>>>> ACPI Error (psparse-0537): Method parse/execution failed
>>>>> [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
>>>>> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
>>
>>> Could you do a bisect?
>>
>> In particular, please try the 2.6.31 versio of drivers/acpi/ec.c
>>
>
> Hi,
>
> in order to get the 2.6.31 version of ec.c to build I had to apply a
> small patch:
>
>> --- linux-acpi/drivers/acpi/ec.c.orig 2009-09-10 01:13:59.000000000
>> +0300
>> +++ linux-acpi/drivers/acpi/ec.c 2009-09-28 21:09:15.359406828 +0300
>> @@ -42,6 +42,7 @@
>> #include <asm/io.h>
>> #include <acpi/acpi_bus.h>
>> #include <acpi/acpi_drivers.h>
>> +#include <linux/dmi.h>
>>
>> #define ACPI_EC_CLASS "embedded_controller"
>> #define ACPI_EC_DEVICE_NAME "Embedded Controller"
>> @@ -1078,7 +1079,6 @@ static struct acpi_driver acpi_ec_driver
>> .add = acpi_ec_add,
>> .remove = acpi_ec_remove,
>> .start = acpi_ec_start,
>> - .stop = acpi_ec_stop,
>> .suspend = acpi_ec_suspend,
>> .resume = acpi_ec_resume,
>> },
>
> After that it built and the errors are gone.
>
> Now this is a Acer TravelMate 5720G laptop with the latest 1.35 bios.
> Distro is Mandriva Linux Cooker, and arch is x86_64
>
> Attached is output of "grep ACPI /var/log/dmesg"
> dmesg-acpi-20090903
> - all acpi patches as of 2.6.32-rc1
This one does not have errors you've mentioned earlier, could you find dmesg with them?
>
> dmesg-acpi-20090903-ec-2.6.31
> - all acpi patches as of 2.6.32-rc1
> - ec.c from 2.6.31.1
>
>
> Should I start bisecting, or do you have any other suggestion?
There is only one patch which touch ec.c, 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc. You may try to revert it, and see.


Regards,
Alex.

2009-09-28 21:31:57

by Thomas Backlund

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Alexey Starikovskiy wrote:
> Thomas Backlund пишет:
>>
>> Now this is a Acer TravelMate 5720G laptop with the latest 1.35 bios.
>> Distro is Mandriva Linux Cooker, and arch is x86_64
>>
>> Attached is output of "grep ACPI /var/log/dmesg"
>> dmesg-acpi-20090903
>> - all acpi patches as of 2.6.32-rc1
> This one does not have errors you've mentioned earlier, could you find dmesg with them?

Ah, sorry about that...
I should have done dmesg|grep ACPI to get the errors... it would have
shown this too:
tg3 0000:02:00.0: wake-up capability disabled by ACPI
ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl]
(20090903/evregion-424)
ACPI Error (psparse-0537): Method parse/execution failed
[\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
ACPI Error (psparse-0537): Method parse/execution failed
[\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)



>> dmesg-acpi-20090903-ec-2.6.31
>> - all acpi patches as of 2.6.32-rc1
>> - ec.c from 2.6.31.1
>>
>>
>> Should I start bisecting, or do you have any other suggestion?
> There is only one patch which touch ec.c, 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc. You may try to revert it, and see.
>

Isn't that what pretty much what I did when I built a kernel with the
2.6.31.1 ec.c ?

Anyway, after I applied your patch you just posted on acpi-devel:
ACPI: EC: Rewrite DMI checks

to the 2.6.32-rc1 tree the:

> -ACPI Error (psargs-0359): [\_PR_.CPU0.CSTX] Namespace lookup failure, AE_NOT_FOUND
> -ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.PCI0.LPCB.EC0_._Q2F] (Node ffff88013f81c1a0), AE_NOT_FOUND

does not show up at boot anymore, and so far I haven't seen the other
errors either...

I'll post a follow-up if they show up again...

--
Thomas

2009-09-28 21:44:48

by Thomas Backlund

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

BIOS-e820: 00000000bfed0000 - 00000000bfedf000 (ACPI NVS)
ACPI: RSDP 00000000000f7bf0 00024 (v02 PTLTD )
ACPI: XSDT 00000000bfed160e 0008C (v01 ACRSYS ACRPRDCT 06040000 INNA 00000000)
ACPI: FACP 00000000bfedbbd7 000F4 (v03 INTEL CRESTLNE 06040000 ALAN 00000001)
ACPI: DSDT 00000000bfed2bba 08FA9 (v02 INTEL CRESTLNE 06040000 MSFT 03000000)
ACPI: FACS 00000000bfedefc0 00040
ACPI: HPET 00000000bfedbccb 00038 (v01 INTEL CRESTLNE 06040000 LOHR 0000005A)
ACPI: MCFG 00000000bfedbd03 0003C (v01 INTEL CRESTLNE 06040000 LOHR 0000005A)
ACPI: TCPA 00000000bfedbd3f 00032 (v01 Intel CRESTLN 06040000 00005A52)
ACPI: TMOR 00000000bfedbd71 00026 (v01 PTLTD 06040000 PTL 00000003)
ACPI: SLIC 00000000bfedbd97 00176 (v01 ACRSYS ACRPRDCT 06040000 ANNI 00000001)
ACPI: ASF! 00000000bfedbf0d 00063 (v32 OEMID OEMTBL 06040000 PTL 00000001)
ACPI: APIC 00000000bfedbf70 00068 (v01 PTLTD ? APIC 06040000 LTP 00000000)
ACPI: BOOT 00000000bfedbfd8 00028 (v01 PTLTD $SBFTBL$ 06040000 LTP 00000001)
ACPI: SSDT 00000000bfed28dd 002DD (v01 SataRe SataAhci 00001000 INTL 20050624)
ACPI: SSDT 00000000bfed1c56 0025F (v01 PmRef Cpu0Tst 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed1bb0 000A6 (v01 PmRef Cpu1Tst 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed169a 00516 (v01 PmRef CpuPm 00003000 INTL 20050624)
ACPI: Local APIC address 0xfee00000
ACPI: PM-Timer IO Port: 0x1008
ACPI: Local APIC address 0xfee00000
ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])
ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
ACPI: IRQ0 used by override.
ACPI: IRQ2 used by override.
ACPI: IRQ9 used by override.
Using ACPI (MADT) for SMP configuration information
ACPI: HPET id: 0x8086a201 base: 0xfed00000
ACPI: Core revision 20090903
ACPI: bus type pci registered
ACPI: EC: Look up EC in DSDT
ACPI: BIOS _OSI(Linux) query ignored
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
ACPI: Enumerating devices from [\]
ACPI: EC: GPE = 0x17, I/O: command/status = 0x66, data = 0x62
ACPI: No dock devices found.
ACPI: PCI Root Bridge [PCI0] (0000:00)
pci 0000:00:1f.0: quirk: region 1000-107f claimed by ICH6 ACPI/GPIO/TCO
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEGP._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.RP01._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.RP02._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.RP03._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PCIB._PRT]
ACPI: PCI Interrupt Link [LNKA] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKE] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKF] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKG] (IRQs 10 *11)
ACPI: PCI Interrupt Link [LNKH] (IRQs 10 *11)
PCI: Using ACPI for IRQ routing
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp: PnP ACPI: found 11 devices
ACPI: ACPI bus type pnp unregistered
ACPI Warning for \_SB_.PCI0.SATA.PRT0._GTF: Return type mismatch - found Integer, expected Buffer (20090903/nspredef-1006)
ACPI: WMI: Mapper loaded
ACPI: Lid Switch [LID0]
ACPI: Sleep Button [SLPB]
ACPI: Power Button [PWRF]
ACPI: AC Adapter [ADP1] (on-line)
ACPI: Extensa 5220 detected - disabling mwait for CPU C-states
ACPI: SSDT 00000000bfed2559 002BC (v01 PmRef Cpu0Ist 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed1eb5 0061F (v01 PmRef Cpu0Cst 00003001 INTL 20050624)
ACPI: Processor [CPU0] (supports 8 throttling states)
ACPI: SSDT 00000000bfed2815 000C8 (v01 PmRef Cpu1Ist 00003000 INTL 20050624)
ACPI: SSDT 00000000bfed24d4 00085 (v01 PmRef Cpu1Cst 00003000 INTL 20050624)
ACPI: Processor [CPU1] (supports 8 throttling states)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 9 (20090903/nsrepair-132)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 10 (20090903/nsrepair-132)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 11 (20090903/nsrepair-132)
ACPI Warning for \_SB_.PCI0.LPCB.EC0_.BAT0._BIF: Converted Buffer to expected String at index 12 (20090903/nsrepair-132)
ACPI: Battery Slot [BAT0] (battery present)
acer-wmi: Acer Laptop ACPI-WMI Extras
ACPI: Thermal Zone [TZS0] (46 C)
ACPI: Thermal Zone [TZS1] (56 C)
ACPI: Video Device [VGA] (multi-head: yes rom: no post: no)
ACPI: I/O resource 0000:00:1f.3 [0x1c00-0x1c1f] conflicts with ACPI region SMBI [0x1c00-0x1c0f]
ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver
tg3 0000:02:00.0: wake-up capability disabled by ACPI
tg3 0000:02:00.0: wake-up capability disabled by ACPI
tg3 0000:02:00.0: wake-up capability enabled by ACPI
ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl] (20090903/evregion-424)
ACPI Error (psparse-0537): Method parse/execution failed [\_SB_.AMW0.WMCA] (Node ffff88013f813da0), AE_TIME
tg3 0000:02:00.0: wake-up capability disabled by ACPI


Attachments:
acpi-errors (5.23 kB)

2009-09-28 22:12:59

by Alexey Starikovskiy

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Thomas Backlund пишет:
> Thomas Backlund wrote:
>> Alexey Starikovskiy wrote:
>>> Thomas Backlund пишет:
>>>>
>>>> Now this is a Acer TravelMate 5720G laptop with the latest 1.35 bios.
>>>> Distro is Mandriva Linux Cooker, and arch is x86_64
>>>>
>>>> Attached is output of "grep ACPI /var/log/dmesg"
>>>> dmesg-acpi-20090903
>>>> - all acpi patches as of 2.6.32-rc1
>>> This one does not have errors you've mentioned earlier, could you
>>> find dmesg with them?
>>
>> Ah, sorry about that...
>> I should have done dmesg|grep ACPI to get the errors... it would have
>> shown this too:
>> tg3 0000:02:00.0: wake-up capability disabled by ACPI
>> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl]
>> (20090903/evregion-424)
>> ACPI Error (psparse-0537): Method parse/execution failed
>> [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
>> ACPI Error (psparse-0537): Method parse/execution failed
>> [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
>> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
>>
>>
>>
>>>> dmesg-acpi-20090903-ec-2.6.31
>>>> - all acpi patches as of 2.6.32-rc1
>>>> - ec.c from 2.6.31.1
>>>>
>>>>
>>>> Should I start bisecting, or do you have any other suggestion?
>>> There is only one patch which touch ec.c,
>>> 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc. You may try to revert it,
>>> and see.
>>>
>>
>> Isn't that what pretty much what I did when I built a kernel with the
>> 2.6.31.1 ec.c ?
>>
>> Anyway, after I applied your patch you just posted on acpi-devel:
>> ACPI: EC: Rewrite DMI checks
>>
>> to the 2.6.32-rc1 tree the:
>>
>>> -ACPI Error (psargs-0359): [\_PR_.CPU0.CSTX] Namespace lookup
>>> failure, AE_NOT_FOUND
>>> -ACPI Error (psparse-0537): Method parse/execution failed
>>> [\_SB_.PCI0.LPCB.EC0_._Q2F] (Node ffff88013f81c1a0), AE_NOT_FOUND
>>
>> does not show up at boot anymore, and so far I haven't seen the other
>> errors either...
>>
>> I'll post a follow-up if they show up again...
>>
>
> Bah...
> I spoke too soon:
>
Could you please turn on timing information in printk ?
Please also uncomment "#define DEBUG" in ec.c

2009-09-29 00:32:02

by Thomas Backlund

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Alexey Starikovskiy wrote:
> Thomas Backlund пишет:
>> Thomas Backlund wrote:
>>> Alexey Starikovskiy wrote:
>>>> Thomas Backlund пишет:
>>>>> Now this is a Acer TravelMate 5720G laptop with the latest 1.35 bios.
>>>>> Distro is Mandriva Linux Cooker, and arch is x86_64
>>>>>
>>>>> Attached is output of "grep ACPI /var/log/dmesg"
>>>>> dmesg-acpi-20090903
>>>>> - all acpi patches as of 2.6.32-rc1
>>>> This one does not have errors you've mentioned earlier, could you
>>>> find dmesg with them?
>>> Ah, sorry about that...
>>> I should have done dmesg|grep ACPI to get the errors... it would have
>>> shown this too:
>>> tg3 0000:02:00.0: wake-up capability disabled by ACPI
>>> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl]
>>> (20090903/evregion-424)
>>> ACPI Error (psparse-0537): Method parse/execution failed
>>> [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
>>> ACPI Error (psparse-0537): Method parse/execution failed
>>> [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
>>> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
>>>
>>>
>>>
>>>>> dmesg-acpi-20090903-ec-2.6.31
>>>>> - all acpi patches as of 2.6.32-rc1
>>>>> - ec.c from 2.6.31.1
>>>>>
>>>>>
>>>>> Should I start bisecting, or do you have any other suggestion?
>>>> There is only one patch which touch ec.c,
>>>> 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc. You may try to revert it,
>>>> and see.
>>>>
>>> Isn't that what pretty much what I did when I built a kernel with the
>>> 2.6.31.1 ec.c ?
>>>
>>> Anyway, after I applied your patch you just posted on acpi-devel:
>>> ACPI: EC: Rewrite DMI checks
>>>
>>> to the 2.6.32-rc1 tree the:
>>>
>>>> -ACPI Error (psargs-0359): [\_PR_.CPU0.CSTX] Namespace lookup
>>>> failure, AE_NOT_FOUND
>>>> -ACPI Error (psparse-0537): Method parse/execution failed
>>>> [\_SB_.PCI0.LPCB.EC0_._Q2F] (Node ffff88013f81c1a0), AE_NOT_FOUND
>>> does not show up at boot anymore, and so far I haven't seen the other
>>> errors either...
>>>
>>> I'll post a follow-up if they show up again...
>>>
>> Bah...
>> I spoke too soon:
>>
> Could you please turn on timing information in printk ?
> Please also uncomment "#define DEBUG" in ec.c
>

That generated a big log......

This is now grep ACPI /var/log/syslog from the 2.6.32-rc1 + the above
"ACPI: EC: Rewrite DMI checks"

As it's big, I posted it here:
http://tmb.mine.nu/acpi-ec-bug/acpi-ec-debug.bz2

--
Thomas

2009-09-29 08:25:40

by Alexey Starikovskiy

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Thomas Backlund пишет:
> Alexey Starikovskiy wrote:
>> Thomas Backlund пишет:
>>> Thomas Backlund wrote:
>>>> Alexey Starikovskiy wrote:
>>>>> Thomas Backlund пишет:
>>>>>> Now this is a Acer TravelMate 5720G laptop with the latest 1.35 bios.
>>>>>> Distro is Mandriva Linux Cooker, and arch is x86_64
>>>>>>
>>>>>> Attached is output of "grep ACPI /var/log/dmesg"
>>>>>> dmesg-acpi-20090903
>>>>>> - all acpi patches as of 2.6.32-rc1
>>>>> This one does not have errors you've mentioned earlier, could you
>>>>> find dmesg with them?
>>>> Ah, sorry about that...
>>>> I should have done dmesg|grep ACPI to get the errors... it would
>>>> have shown this too:
>>>> tg3 0000:02:00.0: wake-up capability disabled by ACPI
>>>> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl]
>>>> (20090903/evregion-424)
>>>> ACPI Error (psparse-0537): Method parse/execution failed
>>>> [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
>>>> ACPI Error (psparse-0537): Method parse/execution failed
>>>> [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
>>>> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
>>>>
>>>>
>>>>
>>>>>> dmesg-acpi-20090903-ec-2.6.31
>>>>>> - all acpi patches as of 2.6.32-rc1
>>>>>> - ec.c from 2.6.31.1
>>>>>>
>>>>>>
>>>>>> Should I start bisecting, or do you have any other suggestion?
>>>>> There is only one patch which touch ec.c,
>>>>> 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc. You may try to revert it,
>>>>> and see.
>>>>>
>>>> Isn't that what pretty much what I did when I built a kernel with
>>>> the 2.6.31.1 ec.c ?
>>>>
>>>> Anyway, after I applied your patch you just posted on acpi-devel:
>>>> ACPI: EC: Rewrite DMI checks
>>>>
>>>> to the 2.6.32-rc1 tree the:
>>>>
>>>>> -ACPI Error (psargs-0359): [\_PR_.CPU0.CSTX] Namespace lookup
>>>>> failure, AE_NOT_FOUND
>>>>> -ACPI Error (psparse-0537): Method parse/execution failed
>>>>> [\_SB_.PCI0.LPCB.EC0_._Q2F] (Node ffff88013f81c1a0), AE_NOT_FOUND
>>>> does not show up at boot anymore, and so far I haven't seen the
>>>> other errors either...
>>>>
>>>> I'll post a follow-up if they show up again...
>>>>
>>> Bah...
>>> I spoke too soon:
>>>
>> Could you please turn on timing information in printk ? Please also
>> uncomment "#define DEBUG" in ec.c
>>
>
> That generated a big log......
>
> This is now grep ACPI /var/log/syslog from the 2.6.32-rc1 + the above
> "ACPI: EC: Rewrite DMI checks"
>
> As it's big, I posted it here:
> http://tmb.mine.nu/acpi-ec-bug/acpi-ec-debug.bz2
Thanks,
please check if attached patch helps:
>
> --
> Thomas


Attachments:
reset-controller.patch (886.00 B)

2009-09-29 17:42:51

by Thomas Backlund

[permalink] [raw]
Subject: Re: [git pull request] ACPI & driver patches for Linux-2.6.32-rc0

Alexey Starikovskiy wrote:
> Thomas Backlund пишет:
>> Alexey Starikovskiy wrote:
>>> Thomas Backlund пишет:
>>>> Thomas Backlund wrote:
>>>>> Alexey Starikovskiy wrote:
>>>>>> Thomas Backlund пишет:
>>>>>>> Now this is a Acer TravelMate 5720G laptop with the latest 1.35
>>>>>>> bios.
>>>>>>> Distro is Mandriva Linux Cooker, and arch is x86_64
>>>>>>>
>>>>>>> Attached is output of "grep ACPI /var/log/dmesg"
>>>>>>> dmesg-acpi-20090903
>>>>>>> - all acpi patches as of 2.6.32-rc1
>>>>>> This one does not have errors you've mentioned earlier, could you
>>>>>> find dmesg with them?
>>>>> Ah, sorry about that...
>>>>> I should have done dmesg|grep ACPI to get the errors... it would
>>>>> have shown this too:
>>>>> tg3 0000:02:00.0: wake-up capability disabled by ACPI
>>>>> ACPI Exception: AE_TIME, Returned by Handler for [EmbeddedControl]
>>>>> (20090903/evregion-424)
>>>>> ACPI Error (psparse-0537): Method parse/execution failed
>>>>> [\_SB_.PCI0.LPCB.EC0_.GBST] (Node ffff88013f81c5e0), AE_TIME
>>>>> ACPI Error (psparse-0537): Method parse/execution failed
>>>>> [\_SB_.PCI0.LPCB.EC0_.BAT0._BST] (Node ffff88013f81c720), AE_TIME
>>>>> ACPI Exception: AE_TIME, Evaluating _BST (20090903/battery-393)
>>>>>
>>>>>
>>>>>
>>>>>>> dmesg-acpi-20090903-ec-2.6.31
>>>>>>> - all acpi patches as of 2.6.32-rc1
>>>>>>> - ec.c from 2.6.31.1
>>>>>>>
>>>>>>>
>>>>>>> Should I start bisecting, or do you have any other suggestion?
>>>>>> There is only one patch which touch ec.c,
>>>>>> 2a84cb9852f52c0cd1c48bca41a8792d44ad06cc. You may try to revert
>>>>>> it, and see.
>>>>>>
>>>>> Isn't that what pretty much what I did when I built a kernel with
>>>>> the 2.6.31.1 ec.c ?
>>>>>
>>>>> Anyway, after I applied your patch you just posted on acpi-devel:
>>>>> ACPI: EC: Rewrite DMI checks
>>>>>
>>>>> to the 2.6.32-rc1 tree the:
>>>>>
>>>>>> -ACPI Error (psargs-0359): [\_PR_.CPU0.CSTX] Namespace lookup
>>>>>> failure, AE_NOT_FOUND
>>>>>> -ACPI Error (psparse-0537): Method parse/execution failed
>>>>>> [\_SB_.PCI0.LPCB.EC0_._Q2F] (Node ffff88013f81c1a0), AE_NOT_FOUND
>>>>> does not show up at boot anymore, and so far I haven't seen the
>>>>> other errors either...
>>>>>
>>>>> I'll post a follow-up if they show up again...
>>>>>
>>>> Bah...
>>>> I spoke too soon:
>>>>
>>> Could you please turn on timing information in printk ? Please also
>>> uncomment "#define DEBUG" in ec.c
>>>
>>
>> That generated a big log......
>>
>> This is now grep ACPI /var/log/syslog from the 2.6.32-rc1 + the above
>> "ACPI: EC: Rewrite DMI checks"
>>
>> As it's big, I posted it here:
>> http://tmb.mine.nu/acpi-ec-bug/acpi-ec-debug.bz2
> Thanks,
> please check if attached patch helps:
>>

Been running that patch for ~6 hours now, and the errors are gone...

Thanks!

--
Thomas