Commit 765426e8 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (123 commits)
  dock: make dock driver not a module
  ACPI: fix ia64 build warning
  ACPI: hack around sysfs warning with link order
  ACPI suspend: fix build warning when CONFIG_ACPI_SLEEP=n
  intel_menlo: fix build warning
  panasonic-laptop: fix build
  ACPICA: Update version to 20080926
  ACPICA: Add support for zero-length buffer-to-string conversions
  ACPICA: New: Validation for predefined ACPI methods/objects
  ACPICA: Fix for implicit return compatibility
  ACPICA: Fixed a couple memory leaks associated with "implicit return"
  ACPICA: Optimize buffer allocation procedure
  ACPICA: Fix possible memory leak, error exit path
  ACPICA: Fix fault after mem allocation failure in AML parser
  ACPICA: Remove unused ACPI register bit definition
  ACPICA: Update version to 20080829
  ACPICA: Fix possible memory leak in acpi_ns_get_external_pathname
  ACPICA: Cleanup for internal Reference Object
  ACPICA: Update comments - no functional changes
  ACPICA: Update for Reference ACPI_OPERAND_OBJECT
  ...
parents 36ec8918 898b054f
...@@ -218,21 +218,48 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -218,21 +218,48 @@ and is between 256 and 4096 characters. It is defined in the file
acpi.debug_level= [HW,ACPI] acpi.debug_level= [HW,ACPI]
Format: <int> Format: <int>
Each bit of the <int> indicates an ACPI debug level, Each bit of the <int> indicates an ACPI debug level,
1: enable, 0: disable. It is useful for boot time which corresponds to the level in an ACPI_DEBUG_PRINT
debugging. After system has booted up, it can be set statement. After system has booted up, this mask
via /sys/module/acpi/parameters/debug_level. can be set via /sys/module/acpi/parameters/debug_level.
CONFIG_ACPI_DEBUG must be enabled for this to produce any output.
Available bits (add the numbers together) to enable different CONFIG_ACPI_DEBUG must be enabled for this to produce
debug output levels of the ACPI subsystem: any output. The number can be in decimal or prefixed
0x01 error 0x02 warn 0x04 init 0x08 debug object with 0x in hex. Some of these options produce so much
0x10 info 0x20 init names 0x40 parse 0x80 load output that the system is unusable.
0x100 dispatch 0x200 execute 0x400 names 0x800 operation region
0x1000 bfield 0x2000 tables 0x4000 values 0x8000 objects The following global components are defined by the
0x10000 resources 0x20000 user requests 0x40000 package. ACPI CA:
0x01 error
0x02 warn
0x04 init
0x08 debug object
0x10 info
0x20 init names
0x40 parse
0x80 load
0x100 dispatch
0x200 execute
0x400 names
0x800 operation region
0x1000 bfield
0x2000 tables
0x4000 values
0x8000 objects
0x10000 resources
0x20000 user requests
0x40000 package
The number can be in decimal or prefixed with 0x in hex. The number can be in decimal or prefixed with 0x in hex.
Warning: Many of these options can produce a lot of Warning: Many of these options can produce a lot of
output and make your system unusable. Be very careful. output and make your system unusable. Be very careful.
acpi.power_nocheck= [HW,ACPI]
Format: 1/0 enable/disable the check of power state.
On some bogus BIOS the _PSC object/_STA object of
power resource can't return the correct device power
state. In such case it is unneccessary to check its
power state again in power transition.
1 : disable the power state check
acpi_pm_good [X86-32,X86-64] acpi_pm_good [X86-32,X86-64]
Override the pmtimer bug detection: force the kernel Override the pmtimer bug detection: force the kernel
to assume that this machine's pmtimer latches its value to assume that this machine's pmtimer latches its value
...@@ -1711,6 +1738,10 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1711,6 +1738,10 @@ and is between 256 and 4096 characters. It is defined in the file
Override pmtimer IOPort with a hex value. Override pmtimer IOPort with a hex value.
e.g. pmtmr=0x508 e.g. pmtmr=0x508
pnp.debug [PNP]
Enable PNP debug messages. This depends on the
CONFIG_PNP_DEBUG_MESSAGES option.
pnpacpi= [ACPI] pnpacpi= [ACPI]
{ off } { off }
...@@ -2208,7 +2239,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -2208,7 +2239,7 @@ and is between 256 and 4096 characters. It is defined in the file
thermal.crt= [HW,ACPI] thermal.crt= [HW,ACPI]
-1: disable all critical trip points in all thermal zones -1: disable all critical trip points in all thermal zones
<degrees C>: lower all critical trip points <degrees C>: override all critical trip points
thermal.nocrt= [HW,ACPI] thermal.nocrt= [HW,ACPI]
Set to disable actions on ACPI thermal zone Set to disable actions on ACPI thermal zone
......
Acer Laptop WMI Extras Driver Acer Laptop WMI Extras Driver
http://code.google.com/p/aceracpi http://code.google.com/p/aceracpi
Version 0.1 Version 0.2
9th February 2008 18th August 2008
Copyright 2007-2008 Carlos Corbacho <carlos@strangeworlds.co.uk> Copyright 2007-2008 Carlos Corbacho <carlos@strangeworlds.co.uk>
...@@ -87,17 +87,7 @@ acer-wmi come with built-in wireless. However, should you feel so inclined to ...@@ -87,17 +87,7 @@ acer-wmi come with built-in wireless. However, should you feel so inclined to
ever wish to remove the card, or swap it out at some point, please get in touch ever wish to remove the card, or swap it out at some point, please get in touch
with me, as we may well be able to gain some data on wireless card detection. with me, as we may well be able to gain some data on wireless card detection.
To read the status of the wireless radio (0=off, 1=on): The wireless radio is exposed through rfkill.
cat /sys/devices/platform/acer-wmi/wireless
To enable the wireless radio:
echo 1 > /sys/devices/platform/acer-wmi/wireless
To disable the wireless radio:
echo 0 > /sys/devices/platform/acer-wmi/wireless
To set the state of the wireless radio when loading acer-wmi, pass:
wireless=X (where X is 0 or 1)
Bluetooth Bluetooth
********* *********
...@@ -117,17 +107,7 @@ For the adventurously minded - if you want to buy an internal bluetooth ...@@ -117,17 +107,7 @@ For the adventurously minded - if you want to buy an internal bluetooth
module off the internet that is compatible with your laptop and fit it, then module off the internet that is compatible with your laptop and fit it, then
it will work just fine with acer-wmi. it will work just fine with acer-wmi.
To read the status of the bluetooth module (0=off, 1=on): Bluetooth is exposed through rfkill.
cat /sys/devices/platform/acer-wmi/wireless
To enable the bluetooth module:
echo 1 > /sys/devices/platform/acer-wmi/bluetooth
To disable the bluetooth module:
echo 0 > /sys/devices/platform/acer-wmi/bluetooth
To set the state of the bluetooth module when loading acer-wmi, pass:
bluetooth=X (where X is 0 or 1)
3G 3G
** **
......
...@@ -1433,8 +1433,8 @@ M: rdunlap@xenotime.net ...@@ -1433,8 +1433,8 @@ M: rdunlap@xenotime.net
S: Maintained S: Maintained
DOCKING STATION DRIVER DOCKING STATION DRIVER
P: Kristen Carlson Accardi P: Shaohua Li
M: kristen.c.accardi@intel.com M: shaohua.li@intel.com
L: linux-acpi@vger.kernel.org L: linux-acpi@vger.kernel.org
S: Supported S: Supported
...@@ -2109,6 +2109,12 @@ L: linux-ide@vger.kernel.org ...@@ -2109,6 +2109,12 @@ L: linux-ide@vger.kernel.org
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
S: Orphan S: Orphan
IDLE-I7300
P: Andy Henroid
M: andrew.d.henroid@intel.com
L: linux-pm@lists.linux-foundation.org
S: Supported
IEEE 1394 SUBSYSTEM (drivers/ieee1394) IEEE 1394 SUBSYSTEM (drivers/ieee1394)
P: Ben Collins P: Ben Collins
M: ben.collins@ubuntu.com M: ben.collins@ubuntu.com
...@@ -3186,6 +3192,11 @@ M: olof@lixom.net ...@@ -3186,6 +3192,11 @@ M: olof@lixom.net
L: i2c@lm-sensors.org L: i2c@lm-sensors.org
S: Maintained S: Maintained
PANASONIC LAPTOP ACPI EXTRAS DRIVER
P: Harald Welte
M: laforge@gnumonks.org
S: Maintained
PANASONIC MN10300/AM33 PORT PANASONIC MN10300/AM33 PORT
P: David Howells P: David Howells
M: dhowells@redhat.com M: dhowells@redhat.com
......
...@@ -232,7 +232,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, ...@@ -232,7 +232,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info,
static unsigned int static unsigned int
get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
{ {
unsigned long adr; unsigned long long adr;
acpi_handle child; acpi_handle child;
unsigned int devfn; unsigned int devfn;
int function; int function;
...@@ -292,8 +292,8 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) ...@@ -292,8 +292,8 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
static acpi_status static acpi_status
find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv) find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
unsigned long bbn = -1; unsigned long long bbn = -1;
unsigned long adr; unsigned long long adr;
acpi_handle parent = NULL; acpi_handle parent = NULL;
acpi_status status; acpi_status status;
unsigned int devfn; unsigned int devfn;
...@@ -348,7 +348,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info, ...@@ -348,7 +348,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
unsigned int host_devfn; unsigned int host_devfn;
struct sn_pcidev_match pcidev_match; struct sn_pcidev_match pcidev_match;
acpi_handle rootbus_handle; acpi_handle rootbus_handle;
unsigned long segment; unsigned long long segment;
acpi_status status; acpi_status status;
rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle; rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle;
...@@ -357,7 +357,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info, ...@@ -357,7 +357,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
if (segment != pci_domain_nr(dev)) { if (segment != pci_domain_nr(dev)) {
printk(KERN_ERR printk(KERN_ERR
"%s: Segment number mismatch, 0x%lx vs 0x%x for: ", "%s: Segment number mismatch, 0x%llx vs 0x%x for: ",
__func__, segment, pci_domain_nr(dev)); __func__, segment, pci_domain_nr(dev));
acpi_ns_print_node_pathname(rootbus_handle, NULL); acpi_ns_print_node_pathname(rootbus_handle, NULL);
printk("\n"); printk("\n");
......
...@@ -116,6 +116,9 @@ config GENERIC_TIME_VSYSCALL ...@@ -116,6 +116,9 @@ config GENERIC_TIME_VSYSCALL
config ARCH_HAS_CPU_RELAX config ARCH_HAS_CPU_RELAX
def_bool y def_bool y
config ARCH_HAS_DEFAULT_IDLE
def_bool y
config ARCH_HAS_CACHE_LINE_SIZE config ARCH_HAS_CACHE_LINE_SIZE
def_bool y def_bool y
...@@ -1635,6 +1638,8 @@ source "arch/x86/kernel/cpu/cpufreq/Kconfig" ...@@ -1635,6 +1638,8 @@ source "arch/x86/kernel/cpu/cpufreq/Kconfig"
source "drivers/cpuidle/Kconfig" source "drivers/cpuidle/Kconfig"
source "drivers/idle/Kconfig"
endmenu endmenu
......
...@@ -153,12 +153,13 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) ...@@ -153,12 +153,13 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
} }
#ifdef CONFIG_PCI_MMCONFIG #ifdef CONFIG_PCI_MMCONFIG
static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
/* The physical address of the MMCONFIG aperture. Set from ACPI tables. */ /* The physical address of the MMCONFIG aperture. Set from ACPI tables. */
struct acpi_mcfg_allocation *pci_mmcfg_config; struct acpi_mcfg_allocation *pci_mmcfg_config;
int pci_mmcfg_config_num; int pci_mmcfg_config_num;
static int acpi_mcfg_64bit_base_addr __initdata = FALSE;
static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg)
{ {
if (!strcmp(mcfg->header.oem_id, "SGI")) if (!strcmp(mcfg->header.oem_id, "SGI"))
......
...@@ -22,7 +22,7 @@ unsigned long acpi_realmode_flags; ...@@ -22,7 +22,7 @@ unsigned long acpi_realmode_flags;
static unsigned long acpi_realmode; static unsigned long acpi_realmode;
#if defined(CONFIG_SMP) && defined(CONFIG_64BIT) #if defined(CONFIG_SMP) && defined(CONFIG_64BIT)
static char temp_stack[10240]; static char temp_stack[4096];
#endif #endif
/** /**
...@@ -98,7 +98,7 @@ int acpi_save_state_mem(void) ...@@ -98,7 +98,7 @@ int acpi_save_state_mem(void)
#else /* CONFIG_64BIT */ #else /* CONFIG_64BIT */
header->trampoline_segment = setup_trampoline() >> 4; header->trampoline_segment = setup_trampoline() >> 4;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
stack_start.sp = temp_stack + 4096; stack_start.sp = temp_stack + sizeof(temp_stack);
early_gdt_descr.address = early_gdt_descr.address =
(unsigned long)get_cpu_gdt_table(smp_processor_id()); (unsigned long)get_cpu_gdt_table(smp_processor_id());
#endif #endif
......
...@@ -780,6 +780,9 @@ static int __init acpi_cpufreq_init(void) ...@@ -780,6 +780,9 @@ static int __init acpi_cpufreq_init(void)
{ {
int ret; int ret;
if (acpi_disabled)
return 0;
dprintk("acpi_cpufreq_init\n"); dprintk("acpi_cpufreq_init\n");
ret = acpi_cpufreq_early_init(); ret = acpi_cpufreq_early_init();
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#endif #endif
#define PFX "powernow-k8: " #define PFX "powernow-k8: "
#define BFX PFX "BIOS error: "
#define VERSION "version 2.20.00" #define VERSION "version 2.20.00"
#include "powernow-k8.h" #include "powernow-k8.h"
...@@ -536,35 +535,40 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 ...@@ -536,35 +535,40 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8
for (j = 0; j < data->numps; j++) { for (j = 0; j < data->numps; j++) {
if (pst[j].vid > LEAST_VID) { if (pst[j].vid > LEAST_VID) {
printk(KERN_ERR PFX "vid %d invalid : 0x%x\n", j, pst[j].vid); printk(KERN_ERR FW_BUG PFX "vid %d invalid : 0x%x\n",
j, pst[j].vid);
return -EINVAL; return -EINVAL;
} }
if (pst[j].vid < data->rvo) { /* vid + rvo >= 0 */ if (pst[j].vid < data->rvo) { /* vid + rvo >= 0 */
printk(KERN_ERR BFX "0 vid exceeded with pstate %d\n", j); printk(KERN_ERR FW_BUG PFX "0 vid exceeded with pstate"
" %d\n", j);
return -ENODEV; return -ENODEV;
} }
if (pst[j].vid < maxvid + data->rvo) { /* vid + rvo >= maxvid */ if (pst[j].vid < maxvid + data->rvo) { /* vid + rvo >= maxvid */
printk(KERN_ERR BFX "maxvid exceeded with pstate %d\n", j); printk(KERN_ERR FW_BUG PFX "maxvid exceeded with pstate"
" %d\n", j);
return -ENODEV; return -ENODEV;
} }
if (pst[j].fid > MAX_FID) { if (pst[j].fid > MAX_FID) {
printk(KERN_ERR BFX "maxfid exceeded with pstate %d\n", j); printk(KERN_ERR FW_BUG PFX "maxfid exceeded with pstate"
" %d\n", j);
return -ENODEV; return -ENODEV;
} }
if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) { if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
/* Only first fid is allowed to be in "low" range */ /* Only first fid is allowed to be in "low" range */
printk(KERN_ERR BFX "two low fids - %d : 0x%x\n", j, pst[j].fid); printk(KERN_ERR FW_BUG PFX "two low fids - %d : "
"0x%x\n", j, pst[j].fid);
return -EINVAL; return -EINVAL;
} }
if (pst[j].fid < lastfid) if (pst[j].fid < lastfid)
lastfid = pst[j].fid; lastfid = pst[j].fid;
} }
if (lastfid & 1) { if (lastfid & 1) {
printk(KERN_ERR BFX "lastfid invalid\n"); printk(KERN_ERR FW_BUG PFX "lastfid invalid\n");
return -EINVAL; return -EINVAL;
} }
if (lastfid > LO_FID_TABLE_TOP) if (lastfid > LO_FID_TABLE_TOP)
printk(KERN_INFO BFX "first fid not from lo freq table\n"); printk(KERN_INFO FW_BUG PFX "first fid not from lo freq table\n");
return 0; return 0;
} }
...@@ -672,13 +676,13 @@ static int find_psb_table(struct powernow_k8_data *data) ...@@ -672,13 +676,13 @@ static int find_psb_table(struct powernow_k8_data *data)
dprintk("table vers: 0x%x\n", psb->tableversion); dprintk("table vers: 0x%x\n", psb->tableversion);
if (psb->tableversion != PSB_VERSION_1_4) { if (psb->tableversion != PSB_VERSION_1_4) {
printk(KERN_ERR BFX "PSB table is not v1.4\n"); printk(KERN_ERR FW_BUG PFX "PSB table is not v1.4\n");
return -ENODEV; return -ENODEV;
} }
dprintk("flags: 0x%x\n", psb->flags1); dprintk("flags: 0x%x\n", psb->flags1);
if (psb->flags1) { if (psb->flags1) {
printk(KERN_ERR BFX "unknown flags\n"); printk(KERN_ERR FW_BUG PFX "unknown flags\n");
return -ENODEV; return -ENODEV;
} }
...@@ -705,7 +709,7 @@ static int find_psb_table(struct powernow_k8_data *data) ...@@ -705,7 +709,7 @@ static int find_psb_table(struct powernow_k8_data *data)
} }
} }
if (cpst != 1) { if (cpst != 1) {
printk(KERN_ERR BFX "numpst must be 1\n"); printk(KERN_ERR FW_BUG PFX "numpst must be 1\n");
return -ENODEV; return -ENODEV;
} }
...@@ -1130,17 +1134,19 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) ...@@ -1130,17 +1134,19 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
"ACPI Processor module before starting this " "ACPI Processor module before starting this "
"driver.\n"); "driver.\n");
#else #else
printk(KERN_ERR PFX "Your BIOS does not provide ACPI " printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide"
"_PSS objects in a way that Linux understands. " " ACPI _PSS objects in a way that Linux "
"Please report this to the Linux ACPI maintainers" "understands. Please report this to the Linux "
" and complain to your BIOS vendor.\n"); "ACPI maintainers and complain to your BIOS "
"vendor.\n");
#endif #endif
kfree(data); kfree(data);
return -ENODEV; return -ENODEV;
} }
if (pol->cpu != 0) { if (pol->cpu != 0) {
printk(KERN_ERR PFX "No ACPI _PSS objects for CPU other than " printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
"CPU0. Complain to your BIOS vendor.\n"); "CPU other than CPU0. Complain to your BIOS "
"vendor.\n");
kfree(data); kfree(data);
return -ENODEV; return -ENODEV;
} }
...@@ -1193,7 +1199,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) ...@@ -1193,7 +1199,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
/* min/max the cpu is capable of */ /* min/max the cpu is capable of */
if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) { if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) {
printk(KERN_ERR PFX "invalid powernow_table\n"); printk(KERN_ERR FW_BUG PFX "invalid powernow_table\n");
powernow_k8_cpu_exit_acpi(data); powernow_k8_cpu_exit_acpi(data);
kfree(data->powernow_table); kfree(data->powernow_table);
kfree(data); kfree(data);
......
...@@ -95,7 +95,8 @@ static void __init nvidia_bugs(int num, int slot, int func) ...@@ -95,7 +95,8 @@ static void __init nvidia_bugs(int num, int slot, int func)
} }
static u32 ati_ixp4x0_rev(int num, int slot, int func) #if defined(CONFIG_ACPI) && defined(CONFIG_X86_IO_APIC)
static u32 __init ati_ixp4x0_rev(int num, int slot, int func)
{ {
u32 d; u32 d;
u8 b; u8 b;
...@@ -115,7 +116,6 @@ static u32 ati_ixp4x0_rev(int num, int slot, int func) ...@@ -115,7 +116,6 @@ static u32 ati_ixp4x0_rev(int num, int slot, int func)
static void __init ati_bugs(int num, int slot, int func) static void __init ati_bugs(int num, int slot, int func)
{ {
#if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC)
u32 d; u32 d;
u8 b; u8 b;
...@@ -138,9 +138,56 @@ static void __init ati_bugs(int num, int slot, int func) ...@@ -138,9 +138,56 @@ static void __init ati_bugs(int num, int slot, int func)
printk(KERN_INFO "If you got timer trouble " printk(KERN_INFO "If you got timer trouble "
"try acpi_use_timer_override\n"); "try acpi_use_timer_override\n");
} }
#endif
} }
static u32 __init ati_sbx00_rev(int num, int slot, int func)
{
u32 old, d;
d = read_pci_config(num, slot, func, 0x70);
old = d;
d &= ~(1<<8);
write_pci_config(num, slot, func, 0x70, d);
d = read_pci_config(num, slot, func, 0x8);
d &= 0xff;
write_pci_config(num, slot, func, 0x70, old);
return d;
}
static void __init ati_bugs_contd(int num, int slot, int func)
{
u32 d, rev;
if (acpi_use_timer_override)
return;
rev = ati_sbx00_rev(num, slot, func);
if (rev > 0x13)
return;
/* check for IRQ0 interrupt swap */
d = read_pci_config(num, slot, func, 0x64);
if (!(d & (1<<14)))
acpi_skip_timer_override = 1;
if (acpi_skip_timer_override) {
printk(KERN_INFO "SB600 revision 0x%x\n", rev);
printk(KERN_INFO "Ignoring ACPI timer override.\n");
printk(KERN_INFO "If you got timer trouble "
"try acpi_use_timer_override\n");
}
}
#else
static void __init ati_bugs(int num, int slot, int func)
{
}
static void __init ati_bugs_contd(int num, int slot, int func)
{
}
#endif
#ifdef CONFIG_DMAR #ifdef CONFIG_DMAR
static void __init intel_g33_dmar(int num, int slot, int func) static void __init intel_g33_dmar(int num, int slot, int func)
{ {
...@@ -176,6 +223,8 @@ static struct chipset early_qrk[] __initdata = { ...@@ -176,6 +223,8 @@ static struct chipset early_qrk[] __initdata = {
PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config }, PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS, { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
#ifdef CONFIG_DMAR #ifdef CONFIG_DMAR
{ PCI_VENDOR_ID_INTEL, 0x29c0, { PCI_VENDOR_ID_INTEL, 0x29c0,
PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar }, PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, intel_g33_dmar },
......
...@@ -63,6 +63,13 @@ void idle_notifier_register(struct notifier_block *n) ...@@ -63,6 +63,13 @@ void idle_notifier_register(struct notifier_block *n)
{ {
atomic_notifier_chain_register(&idle_notifier, n); atomic_notifier_chain_register(&idle_notifier, n);
} }
EXPORT_SYMBOL_GPL(idle_notifier_register);
void idle_notifier_unregister(struct notifier_block *n)
{
atomic_notifier_chain_unregister(&idle_notifier, n);
}
EXPORT_SYMBOL_GPL(idle_notifier_unregister);
void enter_idle(void) void enter_idle(void)
{ {
......
...@@ -82,6 +82,7 @@ obj-$(CONFIG_EISA) += eisa/ ...@@ -82,6 +82,7 @@ obj-$(CONFIG_EISA) += eisa/
obj-y += lguest/ obj-y += lguest/
obj-$(CONFIG_CPU_FREQ) += cpufreq/ obj-$(CONFIG_CPU_FREQ) += cpufreq/
obj-$(CONFIG_CPU_IDLE) += cpuidle/ obj-$(CONFIG_CPU_IDLE) += cpuidle/
obj-y += idle/
obj-$(CONFIG_MMC) += mmc/ obj-$(CONFIG_MMC) += mmc/
obj-$(CONFIG_MEMSTICK) += memstick/ obj-$(CONFIG_MEMSTICK) += memstick/
obj-$(CONFIG_NEW_LEDS) += leds/ obj-$(CONFIG_NEW_LEDS) += leds/
......
...@@ -42,7 +42,7 @@ if ACPI ...@@ -42,7 +42,7 @@ if ACPI
config ACPI_SLEEP config ACPI_SLEEP
bool bool
depends on PM_SLEEP depends on SUSPEND || HIBERNATION
default y default y
config ACPI_PROCFS config ACPI_PROCFS
...@@ -157,18 +157,11 @@ config ACPI_FAN ...@@ -157,18 +157,11 @@ config ACPI_FAN
applications to perform basic fan control (on, off, status). applications to perform basic fan control (on, off, status).
config ACPI_DOCK config ACPI_DOCK
tristate "Dock" bool "Dock"
depends on EXPERIMENTAL depends on EXPERIMENTAL
help help
This driver adds support for ACPI controlled docking stations This driver adds support for ACPI controlled docking stations and removable
drive bays such as the IBM ultrabay or the Dell Module Bay.
config ACPI_BAY
tristate "Removable Drive Bay (EXPERIMENTAL)"
depends on EXPERIMENTAL
depends on ACPI_DOCK
help
This driver adds support for ACPI controlled removable drive
bays such as the IBM ultrabay or the Dell Module Bay.
config ACPI_PROCESSOR config ACPI_PROCESSOR
tristate "Processor" tristate "Processor"
......
...@@ -45,14 +45,13 @@ obj-$(CONFIG_ACPI_BATTERY) += battery.o ...@@ -45,14 +45,13 @@ obj-$(CONFIG_ACPI_BATTERY) += battery.o
obj-$(CONFIG_ACPI_BUTTON) += button.o obj-$(CONFIG_ACPI_BUTTON) += button.o
obj-$(CONFIG_ACPI_FAN) += fan.o obj-$(CONFIG_ACPI_FAN) += fan.o
obj-$(CONFIG_ACPI_DOCK) += dock.o obj-$(CONFIG_ACPI_DOCK) += dock.o
obj-$(CONFIG_ACPI_BAY) += bay.o
obj-$(CONFIG_ACPI_VIDEO) += video.o obj-$(CONFIG_ACPI_VIDEO) += video.o
obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o obj-y += pci_root.o pci_link.o pci_irq.o pci_bind.o
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
obj-$(CONFIG_ACPI_POWER) += power.o
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
obj-$(CONFIG_ACPI_CONTAINER) += container.o obj-$(CONFIG_ACPI_CONTAINER) += container.o
obj-$(CONFIG_ACPI_THERMAL) += thermal.o obj-$(CONFIG_ACPI_THERMAL) += thermal.o
obj-$(CONFIG_ACPI_POWER) += power.o
obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
obj-$(CONFIG_ACPI_DEBUG) += debug.o obj-$(CONFIG_ACPI_DEBUG) += debug.o
obj-$(CONFIG_ACPI_NUMA) += numa.o obj-$(CONFIG_ACPI_NUMA) += numa.o
......
...@@ -85,7 +85,7 @@ struct acpi_ac { ...@@ -85,7 +85,7 @@ struct acpi_ac {
struct power_supply charger; struct power_supply charger;
#endif #endif
struct acpi_device * device; struct acpi_device * device;
unsigned long state; unsigned long long state;
}; };
#define to_acpi_ac(x) container_of(x, struct acpi_ac, charger); #define to_acpi_ac(x) container_of(x, struct acpi_ac, charger);
...@@ -269,7 +269,7 @@ static int acpi_ac_add(struct acpi_device *device) ...@@ -269,7 +269,7 @@ static int acpi_ac_add(struct acpi_device *device)
ac->device = device; ac->device = device;
strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_AC_CLASS); strcpy(acpi_device_class(device), ACPI_AC_CLASS);
acpi_driver_data(device) = ac; device->driver_data = ac;
result = acpi_ac_get_state(ac); result = acpi_ac_get_state(ac);
if (result) if (result)
......
...@@ -194,8 +194,7 @@ acpi_memory_get_device(acpi_handle handle, ...@@ -194,8 +194,7 @@ acpi_memory_get_device(acpi_handle handle,
static int acpi_memory_check_device(struct acpi_memory_device *mem_device) static int acpi_memory_check_device(struct acpi_memory_device *mem_device)
{ {
unsigned long current_status; unsigned long long current_status;
/* Get device present/absent information from the _STA */ /* Get device present/absent information from the _STA */
if (ACPI_FAILURE(acpi_evaluate_integer(mem_device->device->handle, "_STA", if (ACPI_FAILURE(acpi_evaluate_integer(mem_device->device->handle, "_STA",
...@@ -264,7 +263,7 @@ static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device) ...@@ -264,7 +263,7 @@ static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device)
acpi_status status; acpi_status status;
struct acpi_object_list arg_list; struct acpi_object_list arg_list;
union acpi_object arg; union acpi_object arg;
unsigned long current_status; unsigned long long current_status;
/* Issue the _EJ0 command */ /* Issue the _EJ0 command */
...@@ -403,7 +402,7 @@ static int acpi_memory_device_add(struct acpi_device *device) ...@@ -403,7 +402,7 @@ static int acpi_memory_device_add(struct acpi_device *device)
mem_device->device = device; mem_device->device = device;
sprintf(acpi_device_name(device), "%s", ACPI_MEMORY_DEVICE_NAME); sprintf(acpi_device_name(device), "%s", ACPI_MEMORY_DEVICE_NAME);
sprintf(acpi_device_class(device), "%s", ACPI_MEMORY_DEVICE_CLASS); sprintf(acpi_device_class(device), "%s", ACPI_MEMORY_DEVICE_CLASS);
acpi_driver_data(device) = mem_device; device->driver_data = mem_device;
/* Get the range from the _CRS */ /* Get the range from the _CRS */
result = acpi_memory_get_device_resources(mem_device); result = acpi_memory_get_device_resources(mem_device);
...@@ -454,8 +453,8 @@ static int acpi_memory_device_start (struct acpi_device *device) ...@@ -454,8 +453,8 @@ static int acpi_memory_device_start (struct acpi_device *device)
/* call add_memory func */ /* call add_memory func */
result = acpi_memory_enable_device(mem_device); result = acpi_memory_enable_device(mem_device);
if (result) if (result)
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, printk(KERN_ERR PREFIX
"Error in acpi_memory_enable_device\n")); "Error in acpi_memory_enable_device\n");
} }
return result; return result;
} }
......
This diff is collapsed.
...@@ -804,7 +804,7 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -804,7 +804,7 @@ static int acpi_battery_add(struct acpi_device *device)
battery->device = device; battery->device = device;
strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
acpi_driver_data(device) = battery; device->driver_data = battery;
mutex_init(&battery->lock); mutex_init(&battery->lock);
acpi_battery_update(battery); acpi_battery_update(battery);
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
......
This diff is collapsed.
...@@ -48,6 +48,23 @@ EXPORT_SYMBOL(acpi_root_dir); ...@@ -48,6 +48,23 @@ EXPORT_SYMBOL(acpi_root_dir);
#define STRUCT_TO_INT(s) (*((int*)&s)) #define STRUCT_TO_INT(s) (*((int*)&s))
static int set_power_nocheck(const struct dmi_system_id *id)
{
printk(KERN_NOTICE PREFIX "%s detected - "
"disable power check in power transistion\n", id->ident);
acpi_power_nocheck = 1;
return 0;
}
static struct dmi_system_id __cpuinitdata power_nocheck_dmi_table[] = {
{
set_power_nocheck, "HP Pavilion 05", {
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
DMI_MATCH(DMI_SYS_VENDOR, "HP Pavilion 05"),
DMI_MATCH(DMI_PRODUCT_VERSION, "2001211RE101GLEND") }, NULL},
{},
};
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Device Management Device Management
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
...@@ -77,7 +94,7 @@ EXPORT_SYMBOL(acpi_bus_get_device); ...@@ -77,7 +94,7 @@ EXPORT_SYMBOL(acpi_bus_get_device);
int acpi_bus_get_status(struct acpi_device *device) int acpi_bus_get_status(struct acpi_device *device)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long sta = 0; unsigned long long sta = 0;
if (!device) if (!device)
...@@ -95,21 +112,21 @@ int acpi_bus_get_status(struct acpi_device *device) ...@@ -95,21 +112,21 @@ int acpi_bus_get_status(struct acpi_device *device)
} }
/* /*
* Otherwise we assume the status of our parent (unless we don't * According to ACPI spec some device can be present and functional
* have one, in which case status is implied). * even if the parent is not present but functional.
* In such conditions the child device should not inherit the status
* from the parent.
*/ */
else if (device->parent)
device->status = device->parent->status;
else else
STRUCT_TO_INT(device->status) = STRUCT_TO_INT(device->status) =
ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED |
ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING; ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING;
if (device->status.functional && !device->status.present) { if (device->status.functional && !device->status.present) {
printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: "
"functional but not present; setting present\n", "functional but not present;\n",
device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status)); device->pnp.bus_id,
device->status.present = 1; (u32) STRUCT_TO_INT(device->status)));
} }
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n",
...@@ -155,7 +172,7 @@ int acpi_bus_get_power(acpi_handle handle, int *state) ...@@ -155,7 +172,7 @@ int acpi_bus_get_power(acpi_handle handle, int *state)
int result = 0; int result = 0;
acpi_status status = 0; acpi_status status = 0;
struct acpi_device *device = NULL; struct acpi_device *device = NULL;
unsigned long psc = 0; unsigned long long psc = 0;
result = acpi_bus_get_device(handle, &device); result = acpi_bus_get_device(handle, &device);
...@@ -223,7 +240,19 @@ int acpi_bus_set_power(acpi_handle handle, int state) ...@@ -223,7 +240,19 @@ int acpi_bus_set_power(acpi_handle handle, int state)
/* /*
* Get device's current power state * Get device's current power state
*/ */
if (!acpi_power_nocheck) {
/*
* Maybe the incorrect power state is returned on the bogus
* bios, which is different with the real power state.
* For example: the bios returns D0 state and the real power
* state is D3. OS expects to set the device to D0 state. In
* such case if OS uses the power state returned by the BIOS,
* the device can't be transisted to the correct power state.
* So if the acpi_power_nocheck is set, it is unnecessary to
* get the power state by calling acpi_bus_get_power.
*/
acpi_bus_get_power(device->handle, &device->power.state); acpi_bus_get_power(device->handle, &device->power.state);
}
if ((state == device->power.state) && !device->flags.force_power_state) { if ((state == device->power.state) && !device->flags.force_power_state) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
state)); state));
...@@ -496,6 +525,19 @@ static int acpi_bus_check_scope(struct acpi_device *device) ...@@ -496,6 +525,19 @@ static int acpi_bus_check_scope(struct acpi_device *device)
return 0; return 0;
} }
static BLOCKING_NOTIFIER_HEAD(acpi_bus_notify_list);
int register_acpi_bus_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_register(&acpi_bus_notify_list, nb);
}
EXPORT_SYMBOL_GPL(register_acpi_bus_notifier);
void unregister_acpi_bus_notifier(struct notifier_block *nb)
{
blocking_notifier_chain_unregister(&acpi_bus_notify_list, nb);
}
EXPORT_SYMBOL_GPL(unregister_acpi_bus_notifier);
/** /**
* acpi_bus_notify * acpi_bus_notify
* --------------- * ---------------
...@@ -506,6 +548,8 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) ...@@ -506,6 +548,8 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
int result = 0; int result = 0;
struct acpi_device *device = NULL; struct acpi_device *device = NULL;
blocking_notifier_call_chain(&acpi_bus_notify_list,
type, (void *)handle);
if (acpi_bus_get_device(handle, &device)) if (acpi_bus_get_device(handle, &device))
return; return;
...@@ -749,6 +793,12 @@ static int __init acpi_bus_init(void) ...@@ -749,6 +793,12 @@ static int __init acpi_bus_init(void)
goto error1; goto error1;
} }
/*
* Maybe EC region is required at bus_scan/acpi_get_devices. So it
* is necessary to enable it as early as possible.
*/
acpi_boot_ec_enable();
printk(KERN_INFO PREFIX "Interpreter enabled\n"); printk(KERN_INFO PREFIX "Interpreter enabled\n");
/* Initialize sleep structures */ /* Initialize sleep structures */
...@@ -818,7 +868,11 @@ static int __init acpi_init(void) ...@@ -818,7 +868,11 @@ static int __init acpi_init(void)
} }
} else } else
disable_acpi(); disable_acpi();
/*
* If the laptop falls into the DMI check table, the power state check
* will be disabled in the course of device power transistion.
*/
dmi_check_system(power_nocheck_dmi_table);
return result; return result;
} }
......
...@@ -145,7 +145,7 @@ static int acpi_button_state_seq_show(struct seq_file *seq, void *offset) ...@@ -145,7 +145,7 @@ static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
{ {
struct acpi_button *button = seq->private; struct acpi_button *button = seq->private;
acpi_status status; acpi_status status;
unsigned long state; unsigned long long state;
if (!button || !button->device) if (!button || !button->device)
return 0; return 0;
...@@ -253,7 +253,7 @@ static int acpi_button_remove_fs(struct acpi_device *device) ...@@ -253,7 +253,7 @@ static int acpi_button_remove_fs(struct acpi_device *device)
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
static int acpi_lid_send_state(struct acpi_button *button) static int acpi_lid_send_state(struct acpi_button *button)
{ {
unsigned long state; unsigned long long state;
acpi_status status; acpi_status status;
status = acpi_evaluate_integer(button->device->handle, "_LID", NULL, status = acpi_evaluate_integer(button->device->handle, "_LID", NULL,
...@@ -384,7 +384,7 @@ static int acpi_button_add(struct acpi_device *device) ...@@ -384,7 +384,7 @@ static int acpi_button_add(struct acpi_device *device)
return -ENOMEM; return -ENOMEM;
button->device = device; button->device = device;
acpi_driver_data(device) = button; device->driver_data = button;
button->input = input = input_allocate_device(); button->input = input = input_allocate_device();
if (!input) { if (!input) {
......
...@@ -52,8 +52,8 @@ struct proc_dir_entry *acpi_lock_ac_dir(void) ...@@ -52,8 +52,8 @@ struct proc_dir_entry *acpi_lock_ac_dir(void)
if (acpi_ac_dir) { if (acpi_ac_dir) {
lock_ac_dir_cnt++; lock_ac_dir_cnt++;
} else { } else {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, printk(KERN_ERR PREFIX
"Cannot create %s\n", ACPI_AC_CLASS)); "Cannot create %s\n", ACPI_AC_CLASS);
} }
mutex_unlock(&cm_sbs_mutex); mutex_unlock(&cm_sbs_mutex);
return acpi_ac_dir; return acpi_ac_dir;
...@@ -83,8 +83,8 @@ struct proc_dir_entry *acpi_lock_battery_dir(void) ...@@ -83,8 +83,8 @@ struct proc_dir_entry *acpi_lock_battery_dir(void)
if (acpi_battery_dir) { if (acpi_battery_dir) {
lock_battery_dir_cnt++; lock_battery_dir_cnt++;
} else { } else {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, printk(KERN_ERR PREFIX
"Cannot create %s\n", ACPI_BATTERY_CLASS)); "Cannot create %s\n", ACPI_BATTERY_CLASS);
} }
mutex_unlock(&cm_sbs_mutex); mutex_unlock(&cm_sbs_mutex);
return acpi_battery_dir; return acpi_battery_dir;
......
...@@ -76,7 +76,7 @@ static int is_device_present(acpi_handle handle) ...@@ -76,7 +76,7 @@ static int is_device_present(acpi_handle handle)
{ {
acpi_handle temp; acpi_handle temp;
acpi_status status; acpi_status status;
unsigned long sta; unsigned long long sta;
status = acpi_get_handle(handle, "_STA", &temp); status = acpi_get_handle(handle, "_STA", &temp);
...@@ -108,7 +108,7 @@ static int acpi_container_add(struct acpi_device *device) ...@@ -108,7 +108,7 @@ static int acpi_container_add(struct acpi_device *device)
container->handle = device->handle; container->handle = device->handle;
strcpy(acpi_device_name(device), ACPI_CONTAINER_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_CONTAINER_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_CONTAINER_CLASS); strcpy(acpi_device_class(device), ACPI_CONTAINER_CLASS);
acpi_driver_data(device) = container; device->driver_data = container;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device <%s> bid <%s>\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device <%s> bid <%s>\n",
acpi_device_name(device), acpi_device_bid(device))); acpi_device_name(device), acpi_device_bid(device)));
......
...@@ -47,8 +47,6 @@ static const struct acpi_dlayer acpi_debug_layers[] = { ...@@ -47,8 +47,6 @@ static const struct acpi_dlayer acpi_debug_layers[] = {
}; };
static const struct acpi_dlevel acpi_debug_levels[] = { static const struct acpi_dlevel acpi_debug_levels[] = {
ACPI_DEBUG_INIT(ACPI_LV_ERROR),
ACPI_DEBUG_INIT(ACPI_LV_WARN),
ACPI_DEBUG_INIT(ACPI_LV_INIT), ACPI_DEBUG_INIT(ACPI_LV_INIT),
ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT), ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT),
ACPI_DEBUG_INIT(ACPI_LV_INFO), ACPI_DEBUG_INIT(ACPI_LV_INFO),
......
...@@ -103,6 +103,9 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state) ...@@ -103,6 +103,9 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
NULL); NULL);
acpi_ex_enter_interpreter(); acpi_ex_enter_interpreter();
} }
acpi_ds_clear_implicit_return(walk_state);
#ifdef ACPI_DISASSEMBLER #ifdef ACPI_DISASSEMBLER
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
......
This diff is collapsed.
...@@ -731,54 +731,70 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -731,54 +731,70 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
switch (op_info->type) { switch (op_info->type) {
case AML_TYPE_LOCAL_VARIABLE: case AML_TYPE_LOCAL_VARIABLE:
/* Split the opcode into a base opcode + offset */ /* Local ID (0-7) is (AML opcode - base AML_LOCAL_OP) */
obj_desc->reference.opcode = AML_LOCAL_OP; obj_desc->reference.value = opcode - AML_LOCAL_OP;
obj_desc->reference.offset = opcode - AML_LOCAL_OP; obj_desc->reference.class = ACPI_REFCLASS_LOCAL;
#ifndef ACPI_NO_METHOD_EXECUTION #ifndef ACPI_NO_METHOD_EXECUTION
status = acpi_ds_method_data_get_node(AML_LOCAL_OP, status =
obj_desc-> acpi_ds_method_data_get_node(ACPI_REFCLASS_LOCAL,
reference.offset, obj_desc->reference.
walk_state, value, walk_state,
ACPI_CAST_INDIRECT_PTR
(struct (struct
acpi_namespace_node acpi_namespace_node,
**)&obj_desc-> &obj_desc->reference.
reference.object); object));
#endif #endif
break; break;
case AML_TYPE_METHOD_ARGUMENT: case AML_TYPE_METHOD_ARGUMENT:
/* Split the opcode into a base opcode + offset */ /* Arg ID (0-6) is (AML opcode - base AML_ARG_OP) */
obj_desc->reference.opcode = AML_ARG_OP; obj_desc->reference.value = opcode - AML_ARG_OP;
obj_desc->reference.offset = opcode - AML_ARG_OP; obj_desc->reference.class = ACPI_REFCLASS_ARG;
#ifndef ACPI_NO_METHOD_EXECUTION #ifndef ACPI_NO_METHOD_EXECUTION
status = acpi_ds_method_data_get_node(AML_ARG_OP, status = acpi_ds_method_data_get_node(ACPI_REFCLASS_ARG,
obj_desc-> obj_desc->
reference.offset, reference.value,
walk_state, walk_state,
ACPI_CAST_INDIRECT_PTR
(struct (struct
acpi_namespace_node acpi_namespace_node,
**)&obj_desc-> &obj_desc->
reference.object); reference.
object));
#endif #endif
break; break;
default: /* Other literals, etc.. */ default: /* Object name or Debug object */
if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { switch (op->common.aml_opcode) {
case AML_INT_NAMEPATH_OP:
/* Node was saved in Op */ /* Node was saved in Op */
obj_desc->reference.node = op->common.node; obj_desc->reference.node = op->common.node;
obj_desc->reference.object = obj_desc->reference.object =
op->common.node->object; op->common.node->object;
} obj_desc->reference.class = ACPI_REFCLASS_NAME;
break;
obj_desc->reference.opcode = opcode; case AML_DEBUG_OP:
obj_desc->reference.class = ACPI_REFCLASS_DEBUG;
break;
default:
ACPI_ERROR((AE_INFO,
"Unimplemented reference type for AML opcode: %4.4X",
opcode));
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
}
break; break;
} }
break; break;
......
...@@ -1330,7 +1330,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -1330,7 +1330,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
(walk_state->results->results.obj_desc[0]) == (walk_state->results->results.obj_desc[0]) ==
ACPI_TYPE_LOCAL_REFERENCE) ACPI_TYPE_LOCAL_REFERENCE)
&& ((walk_state->results->results.obj_desc[0])-> && ((walk_state->results->results.obj_desc[0])->
reference.opcode != AML_INDEX_OP)) { reference.class != ACPI_REFCLASS_INDEX)) {
status = status =
acpi_ex_resolve_to_value(&walk_state-> acpi_ex_resolve_to_value(&walk_state->
results->results. results->results.
......
...@@ -166,6 +166,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -166,6 +166,10 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
status = AE_CTRL_FALSE; status = AE_CTRL_FALSE;
} }
/* Predicate can be used for an implicit return value */
(void)acpi_ds_do_implicit_return(local_obj_desc, walk_state, TRUE);
cleanup: cleanup:
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n",
...@@ -429,10 +433,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -429,10 +433,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
ACPI_TYPE_LOCAL_REFERENCE) ACPI_TYPE_LOCAL_REFERENCE)
&& (walk_state->operands[1]->common.type == && (walk_state->operands[1]->common.type ==
ACPI_TYPE_LOCAL_REFERENCE) ACPI_TYPE_LOCAL_REFERENCE)
&& (walk_state->operands[0]->reference.opcode == && (walk_state->operands[0]->reference.class ==
walk_state->operands[1]->reference.opcode) walk_state->operands[1]->reference.class)
&& (walk_state->operands[0]->reference.offset == && (walk_state->operands[0]->reference.value ==
walk_state->operands[1]->reference.offset)) { walk_state->operands[1]->reference.value)) {
status = AE_OK; status = AE_OK;
} else { } else {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
......
This diff is collapsed.
This diff is collapsed.
...@@ -43,7 +43,6 @@ ...@@ -43,7 +43,6 @@
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/amlcode.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/actables.h> #include <acpi/actables.h>
#include <acpi/acdispat.h> #include <acpi/acdispat.h>
...@@ -91,13 +90,12 @@ acpi_ex_add_table(u32 table_index, ...@@ -91,13 +90,12 @@ acpi_ex_add_table(u32 table_index,
/* Init the table handle */ /* Init the table handle */
obj_desc->reference.opcode = AML_LOAD_OP; obj_desc->reference.class = ACPI_REFCLASS_TABLE;
*ddb_handle = obj_desc; *ddb_handle = obj_desc;
/* Install the new table into the local data structures */ /* Install the new table into the local data structures */
obj_desc->reference.object = ACPI_CAST_PTR(void, obj_desc->reference.value = table_index;
(unsigned long)table_index);
/* Add the table to the namespace */ /* Add the table to the namespace */
...@@ -280,6 +278,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -280,6 +278,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state) struct acpi_walk_state *walk_state)
{ {
union acpi_operand_object *ddb_handle; union acpi_operand_object *ddb_handle;
struct acpi_table_header *table;
struct acpi_table_desc table_desc; struct acpi_table_desc table_desc;
u32 table_index; u32 table_index;
acpi_status status; acpi_status status;
...@@ -294,9 +293,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -294,9 +293,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
case ACPI_TYPE_REGION: case ACPI_TYPE_REGION:
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Load from Region %p %s\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
obj_desc, "Load table from Region %p\n", obj_desc));
acpi_ut_get_object_type_name(obj_desc)));
/* Region must be system_memory (from ACPI spec) */ /* Region must be system_memory (from ACPI spec) */
...@@ -316,61 +314,112 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -316,61 +314,112 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
} }
/* /*
* We will simply map the memory region for the table. However, the * Map the table header and get the actual table length. The region
* memory region is technically not guaranteed to remain stable and * length is not guaranteed to be the same as the table length.
* we may eventually have to copy the table to a local buffer. */
table = acpi_os_map_memory(obj_desc->region.address,
sizeof(struct acpi_table_header));
if (!table) {
return_ACPI_STATUS(AE_NO_MEMORY);
}
length = table->length;
acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
/* Must have at least an ACPI table header */
if (length < sizeof(struct acpi_table_header)) {
return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
}
/*
* The memory region is not guaranteed to remain stable and we must
* copy the table to a local buffer. For example, the memory region
* is corrupted after suspend on some machines. Dynamically loaded
* tables are usually small, so this overhead is minimal.
*/ */
/* Allocate a buffer for the table */
table_desc.pointer = ACPI_ALLOCATE(length);
if (!table_desc.pointer) {
return_ACPI_STATUS(AE_NO_MEMORY);
}
/* Map the entire table and copy it */
table = acpi_os_map_memory(obj_desc->region.address, length);
if (!table) {
ACPI_FREE(table_desc.pointer);
return_ACPI_STATUS(AE_NO_MEMORY);
}
ACPI_MEMCPY(table_desc.pointer, table, length);
acpi_os_unmap_memory(table, length);
table_desc.address = obj_desc->region.address; table_desc.address = obj_desc->region.address;
table_desc.length = obj_desc->region.length;
table_desc.flags = ACPI_TABLE_ORIGIN_MAPPED;
break; break;
case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */ case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Load from Buffer or Field %p %s\n", obj_desc, "Load table from Buffer or Field %p\n",
acpi_ut_get_object_type_name(obj_desc))); obj_desc));
length = obj_desc->buffer.length;
/* Must have at least an ACPI table header */ /* Must have at least an ACPI table header */
if (length < sizeof(struct acpi_table_header)) { if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH); return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
} }
/* Validate checksum here. It won't get validated in tb_add_table */ /* Get the actual table length from the table header */
status = table =
acpi_tb_verify_checksum(ACPI_CAST_PTR ACPI_CAST_PTR(struct acpi_table_header,
(struct acpi_table_header, obj_desc->buffer.pointer);
obj_desc->buffer.pointer), length); length = table->length;
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); /* Table cannot extend beyond the buffer */
if (length > obj_desc->buffer.length) {
return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
}
if (length < sizeof(struct acpi_table_header)) {
return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
} }
/* /*
* We need to copy the buffer since the original buffer could be * Copy the table from the buffer because the buffer could be modified
* changed or deleted in the future * or even deleted in the future
*/ */
table_desc.pointer = ACPI_ALLOCATE(length); table_desc.pointer = ACPI_ALLOCATE(length);
if (!table_desc.pointer) { if (!table_desc.pointer) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
ACPI_MEMCPY(table_desc.pointer, obj_desc->buffer.pointer, ACPI_MEMCPY(table_desc.pointer, table, length);
length); table_desc.address = ACPI_TO_INTEGER(table_desc.pointer);
table_desc.length = length;
table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
break; break;
default: default:
return_ACPI_STATUS(AE_AML_OPERAND_TYPE); return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
} }
/* /* Validate table checksum (will not get validated in tb_add_table) */
* Install the new table into the local data structures
*/ status = acpi_tb_verify_checksum(table_desc.pointer, length);
if (ACPI_FAILURE(status)) {
ACPI_FREE(table_desc.pointer);
return_ACPI_STATUS(status);
}
/* Complete the table descriptor */
table_desc.length = length;
table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
/* Install the new table into the local data structures */
status = acpi_tb_add_table(&table_desc, &table_index); status = acpi_tb_add_table(&table_desc, &table_index);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
...@@ -379,7 +428,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -379,7 +428,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
/* /*
* Add the table to the namespace. * Add the table to the namespace.
* *
* Note: We load the table objects relative to the root of the namespace. * Note: Load the table objects relative to the root of the namespace.
* This appears to go against the ACPI specification, but we do it for * This appears to go against the ACPI specification, but we do it for
* compatibility with other ACPI implementations. * compatibility with other ACPI implementations.
*/ */
...@@ -415,7 +464,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -415,7 +464,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
cleanup: cleanup:
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* Delete allocated buffer or mapping */ /* Delete allocated table buffer */
acpi_tb_delete_table(&table_desc); acpi_tb_delete_table(&table_desc);
} }
...@@ -455,9 +504,9 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle) ...@@ -455,9 +504,9 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
} }
/* Get the table index from the ddb_handle (acpi_size for 64-bit case) */ /* Get the table index from the ddb_handle */
table_index = (u32) (acpi_size) table_desc->reference.object; table_index = table_desc->reference.value;
/* Invoke table handler if present */ /* Invoke table handler if present */
......
...@@ -159,6 +159,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, ...@@ -159,6 +159,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
break; break;
default: default:
/* No other types can get here */ /* No other types can get here */
break; break;
} }
...@@ -365,7 +366,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer, ...@@ -365,7 +366,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,
} }
/* /*
* Since leading zeros are supressed, we must check for the case where * Since leading zeros are suppressed, we must check for the case where
* the integer equals 0 * the integer equals 0
* *
* Finally, null terminate the string and return the length * Finally, null terminate the string and return the length
...@@ -511,9 +512,14 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc, ...@@ -511,9 +512,14 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
/* /*
* Create a new string object and string buffer * Create a new string object and string buffer
* (-1 because of extra separator included in string_length from above) * (-1 because of extra separator included in string_length from above)
* Allow creation of zero-length strings from zero-length buffers.
*/ */
if (string_length) {
string_length--;
}
return_desc = acpi_ut_create_string_object((acpi_size) return_desc = acpi_ut_create_string_object((acpi_size)
(string_length - 1)); string_length);
if (!return_desc) { if (!return_desc) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
...@@ -536,7 +542,9 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc, ...@@ -536,7 +542,9 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
* Null terminate the string * Null terminate the string
* (overwrites final comma/space from above) * (overwrites final comma/space from above)
*/ */
if (obj_desc->buffer.length) {
new_buf--; new_buf--;
}
*new_buf = 0; *new_buf = 0;
break; break;
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/amlcode.h> #include <acpi/amlcode.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acparser.h>
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME("exdump") ACPI_MODULE_NAME("exdump")
...@@ -214,10 +213,11 @@ static struct acpi_exdump_info acpi_ex_dump_index_field[5] = { ...@@ -214,10 +213,11 @@ static struct acpi_exdump_info acpi_ex_dump_index_field[5] = {
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"} {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(index_field.data_obj), "Data Object"}
}; };
static struct acpi_exdump_info acpi_ex_dump_reference[7] = { static struct acpi_exdump_info acpi_ex_dump_reference[8] = {
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL}, {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_reference), NULL},
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.class), "Class"},
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"}, {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(reference.target_type), "Target Type"},
{ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.offset), "Offset"}, {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(reference.value), "Value"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"}, {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.object), "Object Desc"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.node), "Node"}, {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.node), "Node"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"}, {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(reference.where), "Where"},
...@@ -413,10 +413,10 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc, ...@@ -413,10 +413,10 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
case ACPI_EXD_REFERENCE: case ACPI_EXD_REFERENCE:
acpi_ex_out_string("Opcode", acpi_ex_out_string("Class Name",
(acpi_ps_get_opcode_info (char *)
(obj_desc->reference.opcode))-> acpi_ut_get_reference_name
name); (obj_desc));
acpi_ex_dump_reference_obj(obj_desc); acpi_ex_dump_reference_obj(obj_desc);
break; break;
...@@ -494,40 +494,41 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) ...@@ -494,40 +494,41 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
switch (obj_desc->reference.opcode) { acpi_os_printf("Reference: [%s] ",
case AML_DEBUG_OP: acpi_ut_get_reference_name(obj_desc));
switch (obj_desc->reference.class) {
case ACPI_REFCLASS_DEBUG:
acpi_os_printf("Reference: Debug\n"); acpi_os_printf("\n");
break; break;
case AML_INDEX_OP: case ACPI_REFCLASS_INDEX:
acpi_os_printf("Reference: Index %p\n", acpi_os_printf("%p\n", obj_desc->reference.object);
obj_desc->reference.object);
break; break;
case AML_LOAD_OP: case ACPI_REFCLASS_TABLE:
acpi_os_printf("Reference: [DdbHandle] TableIndex %p\n", acpi_os_printf("Table Index %X\n",
obj_desc->reference.object); obj_desc->reference.value);
break; break;
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
acpi_os_printf("Reference: (RefOf) %p [%s]\n", acpi_os_printf("%p [%s]\n", obj_desc->reference.object,
obj_desc->reference.object,
acpi_ut_get_type_name(((union acpi_ut_get_type_name(((union
acpi_operand_object acpi_operand_object
*)obj_desc-> *)
obj_desc->
reference. reference.
object)->common. object)->common.
type)); type));
break; break;
case AML_ARG_OP: case ACPI_REFCLASS_ARG:
acpi_os_printf("Reference: Arg%d", acpi_os_printf("%X", obj_desc->reference.value);
obj_desc->reference.offset);
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
...@@ -542,10 +543,9 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) ...@@ -542,10 +543,9 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
acpi_os_printf("\n"); acpi_os_printf("\n");
break; break;
case AML_LOCAL_OP: case ACPI_REFCLASS_LOCAL:
acpi_os_printf("Reference: Local%d", acpi_os_printf("%X", obj_desc->reference.value);
obj_desc->reference.offset);
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
...@@ -560,21 +560,16 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth) ...@@ -560,21 +560,16 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
acpi_os_printf("\n"); acpi_os_printf("\n");
break; break;
case AML_INT_NAMEPATH_OP: case ACPI_REFCLASS_NAME:
acpi_os_printf("Reference: Namepath %X [%4.4s]\n", acpi_os_printf("- [%4.4s]\n",
obj_desc->reference.node->name.integer,
obj_desc->reference.node->name.ascii); obj_desc->reference.node->name.ascii);
break; break;
default: default: /* Unknown reference class */
/* Unknown opcode */
acpi_os_printf("Unknown Reference opcode=%X\n", acpi_os_printf("%2.2X\n", obj_desc->reference.class);
obj_desc->reference.opcode);
break; break;
} }
break; break;
...@@ -865,8 +860,8 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc) ...@@ -865,8 +860,8 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER; ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER;
if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) { if (obj_desc->reference.class == ACPI_REFCLASS_NAME) {
acpi_os_printf(" Named Object %p ", obj_desc->reference.node); acpi_os_printf(" %p ", obj_desc->reference.node);
status = status =
acpi_ns_handle_to_pathname(obj_desc->reference.node, acpi_ns_handle_to_pathname(obj_desc->reference.node,
...@@ -882,14 +877,12 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc) ...@@ -882,14 +877,12 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
ACPI_DESC_TYPE_OPERAND) { ACPI_DESC_TYPE_OPERAND) {
acpi_os_printf(" Target: %p", acpi_os_printf(" Target: %p",
obj_desc->reference.object); obj_desc->reference.object);
if (obj_desc->reference.opcode == AML_LOAD_OP) { if (obj_desc->reference.class == ACPI_REFCLASS_TABLE) {
/* acpi_os_printf(" Table Index: %X\n",
* For DDBHandle reference, obj_desc->reference.value);
* obj_desc->Reference.Object is the table index
*/
acpi_os_printf(" [DDBHandle]\n");
} else { } else {
acpi_os_printf(" [%s]\n", acpi_os_printf(" Target: %p [%s]\n",
obj_desc->reference.object,
acpi_ut_get_type_name(((union acpi_ut_get_type_name(((union
acpi_operand_object acpi_operand_object
*) *)
...@@ -988,9 +981,9 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc, ...@@ -988,9 +981,9 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
acpi_os_printf("[Object Reference] %s", acpi_os_printf("[Object Reference] Type [%s] %2.2X",
(acpi_ps_get_opcode_info acpi_ut_get_reference_name(obj_desc),
(obj_desc->reference.opcode))->name); obj_desc->reference.class);
acpi_ex_dump_reference_obj(obj_desc); acpi_ex_dump_reference_obj(obj_desc);
break; break;
......
...@@ -86,10 +86,10 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, ...@@ -86,10 +86,10 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
/* /*
* Must be a reference to a Local or Arg * Must be a reference to a Local or Arg
*/ */
switch (obj_desc->reference.opcode) { switch (obj_desc->reference.class) {
case AML_LOCAL_OP: case ACPI_REFCLASS_LOCAL:
case AML_ARG_OP: case ACPI_REFCLASS_ARG:
case AML_DEBUG_OP: case ACPI_REFCLASS_DEBUG:
/* The referenced object is the pseudo-node for the local/arg */ /* The referenced object is the pseudo-node for the local/arg */
...@@ -98,8 +98,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, ...@@ -98,8 +98,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
default: default:
ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X", ACPI_ERROR((AE_INFO, "Unknown Reference Class %2.2X",
obj_desc->reference.opcode)); obj_desc->reference.class));
return_ACPI_STATUS(AE_AML_INTERNAL); return_ACPI_STATUS(AE_AML_INTERNAL);
} }
break; break;
...@@ -127,7 +127,7 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, ...@@ -127,7 +127,7 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
reference_obj->reference.opcode = AML_REF_OF_OP; reference_obj->reference.class = ACPI_REFCLASS_REFOF;
reference_obj->reference.object = referenced_obj; reference_obj->reference.object = referenced_obj;
*return_desc = reference_obj; *return_desc = reference_obj;
......
...@@ -825,16 +825,16 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -825,16 +825,16 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
* *
* Must resolve/dereference the local/arg reference first * Must resolve/dereference the local/arg reference first
*/ */
switch (operand[0]->reference.opcode) { switch (operand[0]->reference.class) {
case AML_LOCAL_OP: case ACPI_REFCLASS_LOCAL:
case AML_ARG_OP: case ACPI_REFCLASS_ARG:
/* Set Operand[0] to the value of the local/arg */ /* Set Operand[0] to the value of the local/arg */
status = status =
acpi_ds_method_data_get_value acpi_ds_method_data_get_value
(operand[0]->reference.opcode, (operand[0]->reference.class,
operand[0]->reference.offset, operand[0]->reference.value,
walk_state, &temp_desc); walk_state, &temp_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
...@@ -848,7 +848,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -848,7 +848,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
operand[0] = temp_desc; operand[0] = temp_desc;
break; break;
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
/* Get the object to which the reference refers */ /* Get the object to which the reference refers */
...@@ -928,8 +928,8 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -928,8 +928,8 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
* This must be a reference object produced by either the * This must be a reference object produced by either the
* Index() or ref_of() operator * Index() or ref_of() operator
*/ */
switch (operand[0]->reference.opcode) { switch (operand[0]->reference.class) {
case AML_INDEX_OP: case ACPI_REFCLASS_INDEX:
/* /*
* The target type for the Index operator must be * The target type for the Index operator must be
...@@ -965,7 +965,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -965,7 +965,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
return_desc->integer.value = return_desc->integer.value =
temp_desc->buffer. temp_desc->buffer.
pointer[operand[0]->reference. pointer[operand[0]->reference.
offset]; value];
break; break;
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
...@@ -985,7 +985,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -985,7 +985,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown Index TargetType %X in obj %p", "Unknown Index TargetType %X in reference object %p",
operand[0]->reference. operand[0]->reference.
target_type, operand[0])); target_type, operand[0]));
status = AE_AML_OPERAND_TYPE; status = AE_AML_OPERAND_TYPE;
...@@ -993,7 +993,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -993,7 +993,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
} }
break; break;
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
return_desc = operand[0]->reference.object; return_desc = operand[0]->reference.object;
...@@ -1013,9 +1013,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) ...@@ -1013,9 +1013,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown opcode in reference(%p) - %X", "Unknown class in reference(%p) - %2.2X",
operand[0], operand[0],
operand[0]->reference.opcode)); operand[0]->reference.class));
status = AE_TYPE; status = AE_TYPE;
goto cleanup; goto cleanup;
......
...@@ -391,8 +391,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) ...@@ -391,8 +391,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
/* Initialize the Index reference object */ /* Initialize the Index reference object */
index = operand[1]->integer.value; index = operand[1]->integer.value;
return_desc->reference.offset = (u32) index; return_desc->reference.value = (u32) index;
return_desc->reference.opcode = AML_INDEX_OP; return_desc->reference.class = ACPI_REFCLASS_INDEX;
/* /*
* At this point, the Source operand is a String, Buffer, or Package. * At this point, the Source operand is a String, Buffer, or Package.
......
...@@ -46,8 +46,6 @@ ...@@ -46,8 +46,6 @@
#include <acpi/acdispat.h> #include <acpi/acdispat.h>
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acparser.h>
#include <acpi/amlcode.h>
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME("exresnte") ACPI_MODULE_NAME("exresnte")
...@@ -238,10 +236,10 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr, ...@@ -238,10 +236,10 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
switch (source_desc->reference.opcode) { switch (source_desc->reference.class) {
case AML_LOAD_OP: /* This is a ddb_handle */ case ACPI_REFCLASS_TABLE: /* This is a ddb_handle */
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
case AML_INDEX_OP: case ACPI_REFCLASS_INDEX:
/* Return an additional reference to the object */ /* Return an additional reference to the object */
...@@ -253,10 +251,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr, ...@@ -253,10 +251,8 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
/* No named references are allowed here */ /* No named references are allowed here */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unsupported Reference opcode %X (%s)", "Unsupported Reference type %X",
source_desc->reference.opcode, source_desc->reference.class));
acpi_ps_get_opcode_name(source_desc->
reference.opcode)));
return_ACPI_STATUS(AE_AML_OPERAND_TYPE); return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
} }
......
...@@ -47,7 +47,6 @@ ...@@ -47,7 +47,6 @@
#include <acpi/acdispat.h> #include <acpi/acdispat.h>
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acparser.h>
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME("exresolv") ACPI_MODULE_NAME("exresolv")
...@@ -141,7 +140,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -141,7 +140,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
acpi_status status = AE_OK; acpi_status status = AE_OK;
union acpi_operand_object *stack_desc; union acpi_operand_object *stack_desc;
union acpi_operand_object *obj_desc = NULL; union acpi_operand_object *obj_desc = NULL;
u16 opcode; u8 ref_type;
ACPI_FUNCTION_TRACE(ex_resolve_object_to_value); ACPI_FUNCTION_TRACE(ex_resolve_object_to_value);
...@@ -152,19 +151,19 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -152,19 +151,19 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
switch (ACPI_GET_OBJECT_TYPE(stack_desc)) { switch (ACPI_GET_OBJECT_TYPE(stack_desc)) {
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
opcode = stack_desc->reference.opcode; ref_type = stack_desc->reference.class;
switch (opcode) { switch (ref_type) {
case AML_LOCAL_OP: case ACPI_REFCLASS_LOCAL:
case AML_ARG_OP: case ACPI_REFCLASS_ARG:
/* /*
* Get the local from the method's state info * Get the local from the method's state info
* Note: this increments the local's object reference count * Note: this increments the local's object reference count
*/ */
status = acpi_ds_method_data_get_value(opcode, status = acpi_ds_method_data_get_value(ref_type,
stack_desc-> stack_desc->
reference.offset, reference.value,
walk_state, walk_state,
&obj_desc); &obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -173,7 +172,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -173,7 +172,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[Arg/Local %X] ValueObj is %p\n", "[Arg/Local %X] ValueObj is %p\n",
stack_desc->reference.offset, stack_desc->reference.value,
obj_desc)); obj_desc));
/* /*
...@@ -184,7 +183,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -184,7 +183,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
*stack_ptr = obj_desc; *stack_ptr = obj_desc;
break; break;
case AML_INDEX_OP: case ACPI_REFCLASS_INDEX:
switch (stack_desc->reference.target_type) { switch (stack_desc->reference.target_type) {
case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_BUFFER_FIELD:
...@@ -239,15 +238,15 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -239,15 +238,15 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
} }
break; break;
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
case AML_DEBUG_OP: case ACPI_REFCLASS_DEBUG:
case AML_LOAD_OP: case ACPI_REFCLASS_TABLE:
/* Just leave the object as-is, do not dereference */ /* Just leave the object as-is, do not dereference */
break; break;
case AML_INT_NAMEPATH_OP: /* Reference to a named object */ case ACPI_REFCLASS_NAME: /* Reference to a named object */
/* Dereference the name */ /* Dereference the name */
...@@ -273,8 +272,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -273,8 +272,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown Reference opcode %X (%s) in %p", "Unknown Reference type %X in %p", ref_type,
opcode, acpi_ps_get_opcode_name(opcode),
stack_desc)); stack_desc));
status = AE_AML_INTERNAL; status = AE_AML_INTERNAL;
break; break;
...@@ -388,13 +386,13 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, ...@@ -388,13 +386,13 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
* traversing the list of possibly many nested references. * traversing the list of possibly many nested references.
*/ */
while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) { while (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_LOCAL_REFERENCE) {
switch (obj_desc->reference.opcode) { switch (obj_desc->reference.class) {
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
case AML_INT_NAMEPATH_OP: case ACPI_REFCLASS_NAME:
/* Dereference the reference pointer */ /* Dereference the reference pointer */
if (obj_desc->reference.opcode == AML_REF_OF_OP) { if (obj_desc->reference.class == ACPI_REFCLASS_REFOF) {
node = obj_desc->reference.object; node = obj_desc->reference.object;
} else { /* AML_INT_NAMEPATH_OP */ } else { /* AML_INT_NAMEPATH_OP */
...@@ -429,7 +427,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, ...@@ -429,7 +427,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
} }
break; break;
case AML_INDEX_OP: case ACPI_REFCLASS_INDEX:
/* Get the type of this reference (index into another object) */ /* Get the type of this reference (index into another object) */
...@@ -455,22 +453,22 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, ...@@ -455,22 +453,22 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
} }
break; break;
case AML_LOAD_OP: case ACPI_REFCLASS_TABLE:
type = ACPI_TYPE_DDB_HANDLE; type = ACPI_TYPE_DDB_HANDLE;
goto exit; goto exit;
case AML_LOCAL_OP: case ACPI_REFCLASS_LOCAL:
case AML_ARG_OP: case ACPI_REFCLASS_ARG:
if (return_desc) { if (return_desc) {
status = status =
acpi_ds_method_data_get_value(obj_desc-> acpi_ds_method_data_get_value(obj_desc->
reference. reference.
opcode, class,
obj_desc-> obj_desc->
reference. reference.
offset, value,
walk_state, walk_state,
&obj_desc); &obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -481,10 +479,10 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, ...@@ -481,10 +479,10 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
status = status =
acpi_ds_method_data_get_node(obj_desc-> acpi_ds_method_data_get_node(obj_desc->
reference. reference.
opcode, class,
obj_desc-> obj_desc->
reference. reference.
offset, value,
walk_state, walk_state,
&node); &node);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -499,7 +497,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, ...@@ -499,7 +497,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
} }
break; break;
case AML_DEBUG_OP: case ACPI_REFCLASS_DEBUG:
/* The Debug Object is of type "DebugObject" */ /* The Debug Object is of type "DebugObject" */
...@@ -509,8 +507,8 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, ...@@ -509,8 +507,8 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown Reference subtype %X", "Unknown Reference Class %2.2X",
obj_desc->reference.opcode)); obj_desc->reference.class));
return_ACPI_STATUS(AE_AML_INTERNAL); return_ACPI_STATUS(AE_AML_INTERNAL);
} }
} }
......
...@@ -225,41 +225,36 @@ acpi_ex_resolve_operands(u16 opcode, ...@@ -225,41 +225,36 @@ acpi_ex_resolve_operands(u16 opcode,
if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) { if (object_type == (u8) ACPI_TYPE_LOCAL_REFERENCE) {
/* Decode the Reference */ /* Validate the Reference */
op_info = acpi_ps_get_opcode_info(opcode); switch (obj_desc->reference.class) {
if (op_info->class == AML_CLASS_UNKNOWN) { case ACPI_REFCLASS_DEBUG:
return_ACPI_STATUS(AE_AML_BAD_OPCODE);
}
switch (obj_desc->reference.opcode) {
case AML_DEBUG_OP:
target_op = AML_DEBUG_OP; target_op = AML_DEBUG_OP;
/*lint -fallthrough */ /*lint -fallthrough */
case AML_INDEX_OP: case ACPI_REFCLASS_ARG:
case AML_REF_OF_OP: case ACPI_REFCLASS_LOCAL:
case AML_ARG_OP: case ACPI_REFCLASS_INDEX:
case AML_LOCAL_OP: case ACPI_REFCLASS_REFOF:
case AML_LOAD_OP: /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */ case ACPI_REFCLASS_TABLE: /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */
case AML_INT_NAMEPATH_OP: /* Reference to a named object */ case ACPI_REFCLASS_NAME: /* Reference to a named object */
ACPI_DEBUG_ONLY_MEMBERS(ACPI_DEBUG_PRINT ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
((ACPI_DB_EXEC, "Operand is a Reference, Class [%s] %2.2X\n",
"Operand is a Reference, RefOpcode [%s]\n", acpi_ut_get_reference_name
(acpi_ps_get_opcode_info (obj_desc),
(obj_desc-> obj_desc->reference.
reference. class));
opcode))->
name)));
break; break;
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Operand is a Reference, Unknown Reference Opcode: %X", "Unknown Reference Class %2.2X in %p",
obj_desc->reference. obj_desc->reference.class,
opcode)); obj_desc));
return_ACPI_STATUS(AE_AML_OPERAND_TYPE); return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
} }
...@@ -270,8 +265,7 @@ acpi_ex_resolve_operands(u16 opcode, ...@@ -270,8 +265,7 @@ acpi_ex_resolve_operands(u16 opcode,
/* Invalid descriptor */ /* Invalid descriptor */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO, "Invalid descriptor %p [%s]",
"Invalid descriptor %p [%s]",
obj_desc, obj_desc,
acpi_ut_get_descriptor_name(obj_desc))); acpi_ut_get_descriptor_name(obj_desc)));
...@@ -343,7 +337,7 @@ acpi_ex_resolve_operands(u16 opcode, ...@@ -343,7 +337,7 @@ acpi_ex_resolve_operands(u16 opcode,
if ((opcode == AML_STORE_OP) && if ((opcode == AML_STORE_OP) &&
(ACPI_GET_OBJECT_TYPE(*stack_ptr) == (ACPI_GET_OBJECT_TYPE(*stack_ptr) ==
ACPI_TYPE_LOCAL_REFERENCE) ACPI_TYPE_LOCAL_REFERENCE)
&& ((*stack_ptr)->reference.opcode == AML_INDEX_OP)) { && ((*stack_ptr)->reference.class == ACPI_REFCLASS_INDEX)) {
goto next_operand; goto next_operand;
} }
break; break;
......
...@@ -47,7 +47,6 @@ ...@@ -47,7 +47,6 @@
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/amlcode.h> #include <acpi/amlcode.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acparser.h>
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME("exstore") ACPI_MODULE_NAME("exstore")
...@@ -179,22 +178,26 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc, ...@@ -179,22 +178,26 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
if (source_desc->reference.opcode == AML_INDEX_OP) { ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[%s] ",
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, acpi_ut_get_reference_name(source_desc)));
"[%s, 0x%X]\n",
acpi_ps_get_opcode_name /* Decode the reference */
(source_desc->reference.opcode),
source_desc->reference.offset)); switch (source_desc->reference.class) {
} else { case ACPI_REFCLASS_INDEX:
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[%s]",
acpi_ps_get_opcode_name ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "0x%X\n",
(source_desc->reference.opcode))); source_desc->reference.value));
} break;
case ACPI_REFCLASS_TABLE:
if (source_desc->reference.opcode == AML_LOAD_OP) { /* Load and load_table */
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT,
" Table OwnerId %p\n", "Table Index 0x%X\n",
source_desc->reference.object)); source_desc->reference.value));
break;
default:
break; break;
} }
...@@ -347,15 +350,15 @@ acpi_ex_store(union acpi_operand_object *source_desc, ...@@ -347,15 +350,15 @@ acpi_ex_store(union acpi_operand_object *source_desc,
} }
/* /*
* Examine the Reference opcode. These cases are handled: * Examine the Reference class. These cases are handled:
* *
* 1) Store to Name (Change the object associated with a name) * 1) Store to Name (Change the object associated with a name)
* 2) Store to an indexed area of a Buffer or Package * 2) Store to an indexed area of a Buffer or Package
* 3) Store to a Method Local or Arg * 3) Store to a Method Local or Arg
* 4) Store to the debug object * 4) Store to the debug object
*/ */
switch (ref_desc->reference.opcode) { switch (ref_desc->reference.class) {
case AML_REF_OF_OP: case ACPI_REFCLASS_REFOF:
/* Storing an object into a Name "container" */ /* Storing an object into a Name "container" */
...@@ -365,7 +368,7 @@ acpi_ex_store(union acpi_operand_object *source_desc, ...@@ -365,7 +368,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
ACPI_IMPLICIT_CONVERSION); ACPI_IMPLICIT_CONVERSION);
break; break;
case AML_INDEX_OP: case ACPI_REFCLASS_INDEX:
/* Storing to an Index (pointer into a packager or buffer) */ /* Storing to an Index (pointer into a packager or buffer) */
...@@ -374,18 +377,18 @@ acpi_ex_store(union acpi_operand_object *source_desc, ...@@ -374,18 +377,18 @@ acpi_ex_store(union acpi_operand_object *source_desc,
walk_state); walk_state);
break; break;
case AML_LOCAL_OP: case ACPI_REFCLASS_LOCAL:
case AML_ARG_OP: case ACPI_REFCLASS_ARG:
/* Store to a method local/arg */ /* Store to a method local/arg */
status = status =
acpi_ds_store_object_to_local(ref_desc->reference.opcode, acpi_ds_store_object_to_local(ref_desc->reference.class,
ref_desc->reference.offset, ref_desc->reference.value,
source_desc, walk_state); source_desc, walk_state);
break; break;
case AML_DEBUG_OP: case ACPI_REFCLASS_DEBUG:
/* /*
* Storing to the Debug object causes the value stored to be * Storing to the Debug object causes the value stored to be
...@@ -401,9 +404,9 @@ acpi_ex_store(union acpi_operand_object *source_desc, ...@@ -401,9 +404,9 @@ acpi_ex_store(union acpi_operand_object *source_desc,
default: default:
ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X", ACPI_ERROR((AE_INFO, "Unknown Reference Class %2.2X",
ref_desc->reference.opcode)); ref_desc->reference.class));
ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_ERROR); ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_INFO);
status = AE_AML_INTERNAL; status = AE_AML_INTERNAL;
break; break;
...@@ -458,7 +461,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, ...@@ -458,7 +461,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
if (ACPI_GET_OBJECT_TYPE(source_desc) == if (ACPI_GET_OBJECT_TYPE(source_desc) ==
ACPI_TYPE_LOCAL_REFERENCE ACPI_TYPE_LOCAL_REFERENCE
&& source_desc->reference.opcode == AML_LOAD_OP) { && source_desc->reference.class == ACPI_REFCLASS_TABLE) {
/* This is a DDBHandle, just add a reference to it */ /* This is a DDBHandle, just add a reference to it */
...@@ -553,7 +556,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, ...@@ -553,7 +556,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
/* Store the source value into the target buffer byte */ /* Store the source value into the target buffer byte */
obj_desc->buffer.pointer[index_desc->reference.offset] = value; obj_desc->buffer.pointer[index_desc->reference.value] = value;
break; break;
default: default:
......
...@@ -121,7 +121,8 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr, ...@@ -121,7 +121,8 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
(ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) && (ACPI_GET_OBJECT_TYPE(source_desc) != ACPI_TYPE_STRING) &&
!((ACPI_GET_OBJECT_TYPE(source_desc) == !((ACPI_GET_OBJECT_TYPE(source_desc) ==
ACPI_TYPE_LOCAL_REFERENCE) ACPI_TYPE_LOCAL_REFERENCE)
&& (source_desc->reference.opcode == AML_LOAD_OP))) { && (source_desc->reference.class ==
ACPI_REFCLASS_TABLE))) {
/* Conversion successful but still not a valid type */ /* Conversion successful but still not a valid type */
......
...@@ -265,7 +265,7 @@ static int acpi_fan_add(struct acpi_device *device) ...@@ -265,7 +265,7 @@ static int acpi_fan_add(struct acpi_device *device)
dev_info(&device->dev, "registered as cooling_device%d\n", cdev->id); dev_info(&device->dev, "registered as cooling_device%d\n", cdev->id);
acpi_driver_data(device) = cdev; device->driver_data = cdev;
result = sysfs_create_link(&device->dev.kobj, result = sysfs_create_link(&device->dev.kobj,
&cdev->device.kobj, &cdev->device.kobj,
"thermal_cooling"); "thermal_cooling");
...@@ -327,8 +327,8 @@ static int acpi_fan_resume(struct acpi_device *device) ...@@ -327,8 +327,8 @@ static int acpi_fan_resume(struct acpi_device *device)
result = acpi_bus_get_power(device->handle, &power_state); result = acpi_bus_get_power(device->handle, &power_state);
if (result) { if (result) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, printk(KERN_ERR PREFIX
"Error reading fan power state\n")); "Error reading fan power state\n");
return result; return result;
} }
......
...@@ -78,19 +78,17 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address) ...@@ -78,19 +78,17 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/* Set the vector */
if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
/*
* ACPI 1.0 FACS or short table or optional X_ field is zero
*/
facs->firmware_waking_vector = (u32) physical_address;
} else {
/* /*
* ACPI 2.0 FACS with valid X_ field * According to the ACPI specification 2.0c and later, the 64-bit
* waking vector should be cleared and the 32-bit waking vector should
* be used, unless we want the wake-up code to be called by the BIOS in
* Protected Mode. Some systems (for example HP dv5-1004nr) are known
* to fail to resume if the 64-bit vector is used.
*/ */
facs->xfirmware_waking_vector = physical_address; if (facs->version >= 1)
} facs->xfirmware_waking_vector = 0;
facs->firmware_waking_vector = (u32)physical_address;
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -134,20 +132,7 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address) ...@@ -134,20 +132,7 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
} }
/* Get the vector */ /* Get the vector */
*physical_address = (acpi_physical_address)facs->firmware_waking_vector;
if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
/*
* ACPI 1.0 FACS or short table or optional X_ field is zero
*/
*physical_address =
(acpi_physical_address) facs->firmware_waking_vector;
} else {
/*
* ACPI 2.0 FACS with valid X_ field
*/
*physical_address =
(acpi_physical_address) facs->xfirmware_waking_vector;
}
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -627,6 +612,13 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state) ...@@ -627,6 +612,13 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
} }
/* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */ /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
/*
* Some BIOSes assume that WAK_STS will be cleared on resume and use
* it to determine whether the system is rebooting or resuming. Clear
* it for compatibility.
*/
acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
acpi_gbl_system_awake_and_running = TRUE; acpi_gbl_system_awake_and_running = TRUE;
/* Enable power button */ /* Enable power button */
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
obj-y := nsaccess.o nsload.o nssearch.o nsxfeval.o \ obj-y := nsaccess.o nsload.o nssearch.o nsxfeval.o \
nsalloc.o nseval.o nsnames.o nsutils.o nsxfname.o \ nsalloc.o nseval.o nsnames.o nsutils.o nsxfname.o \
nsdump.o nsinit.o nsobject.o nswalk.o nsxfobj.o \ nsdump.o nsinit.o nsobject.o nswalk.o nsxfobj.o \
nsparse.o nsparse.o nspredef.o
obj-$(ACPI_FUTURE_USAGE) += nsdumpdv.o obj-$(ACPI_FUTURE_USAGE) += nsdumpdv.o
......
...@@ -43,7 +43,6 @@ ...@@ -43,7 +43,6 @@
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acparser.h>
#define _COMPONENT ACPI_NAMESPACE #define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME("nsdump") ACPI_MODULE_NAME("nsdump")
...@@ -334,9 +333,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle, ...@@ -334,9 +333,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REFERENCE:
acpi_os_printf("[%s]\n", acpi_os_printf("[%s]\n",
acpi_ps_get_opcode_name(obj_desc-> acpi_ut_get_reference_name(obj_desc));
reference.
opcode));
break; break;
case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_BUFFER_FIELD:
......
...@@ -78,6 +78,7 @@ ACPI_MODULE_NAME("nseval") ...@@ -78,6 +78,7 @@ ACPI_MODULE_NAME("nseval")
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
{ {
acpi_status status; acpi_status status;
struct acpi_namespace_node *node;
ACPI_FUNCTION_TRACE(ns_evaluate); ACPI_FUNCTION_TRACE(ns_evaluate);
...@@ -117,6 +118,8 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) ...@@ -117,6 +118,8 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
info->resolved_node, info->resolved_node,
acpi_ns_get_attached_object(info->resolved_node))); acpi_ns_get_attached_object(info->resolved_node)));
node = info->resolved_node;
/* /*
* Two major cases here: * Two major cases here:
* *
...@@ -148,21 +151,22 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) ...@@ -148,21 +151,22 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
info->param_count++; info->param_count++;
} }
/* Error if too few arguments were passed in */ /*
* Warning if too few or too many arguments have been passed by the
* caller. We don't want to abort here with an error because an
* incorrect number of arguments may not cause the method to fail.
* However, the method will fail if there are too few arguments passed
* and the method attempts to use one of the missing ones.
*/
if (info->param_count < info->obj_desc->method.param_count) { if (info->param_count < info->obj_desc->method.param_count) {
ACPI_ERROR((AE_INFO, ACPI_WARNING((AE_INFO,
"Insufficient arguments - " "Insufficient arguments - "
"method [%4.4s] needs %d, found %d", "method [%4.4s] needs %d, found %d",
acpi_ut_get_node_name(info->resolved_node), acpi_ut_get_node_name(info->resolved_node),
info->obj_desc->method.param_count, info->obj_desc->method.param_count,
info->param_count)); info->param_count));
return_ACPI_STATUS(AE_MISSING_ARGUMENTS); } else if (info->param_count >
}
/* Just a warning if too many arguments */
else if (info->param_count >
info->obj_desc->method.param_count) { info->obj_desc->method.param_count) {
ACPI_WARNING((AE_INFO, ACPI_WARNING((AE_INFO,
"Excess arguments - " "Excess arguments - "
...@@ -195,7 +199,28 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) ...@@ -195,7 +199,28 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
} else { } else {
/* /*
* 2) Object is not a method, return its current value * 2) Object is not a method, return its current value
*
* Disallow certain object types. For these, "evaluation" is undefined.
*/ */
switch (info->resolved_node->type) {
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_EVENT:
case ACPI_TYPE_MUTEX:
case ACPI_TYPE_REGION:
case ACPI_TYPE_THERMAL:
case ACPI_TYPE_LOCAL_SCOPE:
ACPI_ERROR((AE_INFO,
"[%4.4s] Evaluation of object type [%s] is not supported",
info->resolved_node->name.ascii,
acpi_ut_get_type_name(info->resolved_node->
type)));
return_ACPI_STATUS(AE_TYPE);
default:
break;
}
/* /*
* Objects require additional resolution steps (e.g., the Node may be * Objects require additional resolution steps (e.g., the Node may be
...@@ -239,9 +264,35 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info) ...@@ -239,9 +264,35 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
} }
} }
/* Validation of return values for ACPI-predefined methods and objects */
if ((status == AE_OK) || (status == AE_CTRL_RETURN_VALUE)) {
/* /*
* Check if there is a return value that must be dealt with * If this is the first evaluation, check the return value. This
* ensures that any warnings will only be emitted during the very
* first evaluation of the object.
*/
if (!(node->flags & ANOBJ_EVALUATED)) {
/*
* Check for a predefined ACPI name. If found, validate the
* returned object.
*
* Note: Ignore return status for now, emit warnings if there are
* problems with the returned object. May change later to abort
* the method on invalid return object.
*/ */
(void)acpi_ns_check_predefined_names(node,
info->
return_object);
}
/* Mark the node as having been evaluated */
node->flags |= ANOBJ_EVALUATED;
}
/* Check if there is a return value that must be dealt with */
if (status == AE_CTRL_RETURN_VALUE) { if (status == AE_CTRL_RETURN_VALUE) {
/* If caller does not want the return value, delete it */ /* If caller does not want the return value, delete it */
......
...@@ -115,7 +115,6 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, ...@@ -115,7 +115,6 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
return (AE_OK); return (AE_OK);
} }
#ifdef ACPI_DEBUG_OUTPUT
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ns_get_external_pathname * FUNCTION: acpi_ns_get_external_pathname
...@@ -142,7 +141,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) ...@@ -142,7 +141,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
size = acpi_ns_get_pathname_length(node); size = acpi_ns_get_pathname_length(node);
if (!size) { if (!size) {
return (NULL); return_PTR(NULL);
} }
/* Allocate a buffer to be returned to caller */ /* Allocate a buffer to be returned to caller */
...@@ -157,12 +156,12 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) ...@@ -157,12 +156,12 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
status = acpi_ns_build_external_path(node, size, name_buffer); status = acpi_ns_build_external_path(node, size, name_buffer);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (NULL); ACPI_FREE(name_buffer);
return_PTR(NULL);
} }
return_PTR(name_buffer); return_PTR(name_buffer);
} }
#endif
/******************************************************************************* /*******************************************************************************
* *
......
This diff is collapsed.
...@@ -331,7 +331,7 @@ acpi_ns_search_and_enter(u32 target_name, ...@@ -331,7 +331,7 @@ acpi_ns_search_and_enter(u32 target_name,
"Found bad character(s) in name, repaired: [%4.4s]\n", "Found bad character(s) in name, repaired: [%4.4s]\n",
ACPI_CAST_PTR(char, &target_name))); ACPI_CAST_PTR(char, &target_name)));
} else { } else {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Found bad character(s) in name, repaired: [%4.4s]\n", "Found bad character(s) in name, repaired: [%4.4s]\n",
ACPI_CAST_PTR(char, &target_name))); ACPI_CAST_PTR(char, &target_name)));
} }
......
...@@ -48,6 +48,10 @@ ...@@ -48,6 +48,10 @@
#define _COMPONENT ACPI_NAMESPACE #define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME("nsxfeval") ACPI_MODULE_NAME("nsxfeval")
/* Local prototypes */
static void acpi_ns_resolve_references(struct acpi_evaluate_info *info);
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
/******************************************************************************* /*******************************************************************************
* *
...@@ -69,6 +73,7 @@ ACPI_MODULE_NAME("nsxfeval") ...@@ -69,6 +73,7 @@ ACPI_MODULE_NAME("nsxfeval")
* be valid (non-null) * be valid (non-null)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_evaluate_object_typed(acpi_handle handle, acpi_evaluate_object_typed(acpi_handle handle,
acpi_string pathname, acpi_string pathname,
...@@ -283,6 +288,10 @@ acpi_evaluate_object(acpi_handle handle, ...@@ -283,6 +288,10 @@ acpi_evaluate_object(acpi_handle handle,
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
/* Dereference Index and ref_of references */
acpi_ns_resolve_references(info);
/* Get the size of the returned object */ /* Get the size of the returned object */
status = status =
...@@ -350,6 +359,74 @@ acpi_evaluate_object(acpi_handle handle, ...@@ -350,6 +359,74 @@ acpi_evaluate_object(acpi_handle handle,
ACPI_EXPORT_SYMBOL(acpi_evaluate_object) ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
/*******************************************************************************
*
* FUNCTION: acpi_ns_resolve_references
*
* PARAMETERS: Info - Evaluation info block
*
* RETURN: Info->return_object is replaced with the dereferenced object
*
* DESCRIPTION: Dereference certain reference objects. Called before an
* internal return object is converted to an external union acpi_object.
*
* Performs an automatic dereference of Index and ref_of reference objects.
* These reference objects are not supported by the union acpi_object, so this is a
* last resort effort to return something useful. Also, provides compatibility
* with other ACPI implementations.
*
* NOTE: does not handle references within returned package objects or nested
* references, but this support could be added later if found to be necessary.
*
******************************************************************************/
static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
{
union acpi_operand_object *obj_desc = NULL;
struct acpi_namespace_node *node;
/* We are interested in reference objects only */
if (ACPI_GET_OBJECT_TYPE(info->return_object) !=
ACPI_TYPE_LOCAL_REFERENCE) {
return;
}
/*
* Two types of references are supported - those created by Index and
* ref_of operators. A name reference (AML_NAMEPATH_OP) can be converted
* to an union acpi_object, so it is not dereferenced here. A ddb_handle
* (AML_LOAD_OP) cannot be dereferenced, nor can it be converted to
* an union acpi_object.
*/
switch (info->return_object->reference.class) {
case ACPI_REFCLASS_INDEX:
obj_desc = *(info->return_object->reference.where);
break;
case ACPI_REFCLASS_REFOF:
node = info->return_object->reference.object;
if (node) {
obj_desc = node->object;
}
break;
default:
return;
}
/* Replace the existing reference object */
if (obj_desc) {
acpi_ut_add_reference(obj_desc);
acpi_ut_remove_reference(info->return_object);
info->return_object = obj_desc;
}
return;
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_walk_namespace * FUNCTION: acpi_walk_namespace
...@@ -379,6 +456,7 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object) ...@@ -379,6 +456,7 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
* function, etc. * function, etc.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_walk_namespace(acpi_object_type type, acpi_walk_namespace(acpi_object_type type,
acpi_handle start_object, acpi_handle start_object,
......
...@@ -253,6 +253,7 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer) ...@@ -253,6 +253,7 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
node = acpi_ns_map_handle_to_node(handle); node = acpi_ns_map_handle_to_node(handle);
if (!node) { if (!node) {
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
status = AE_BAD_PARAMETER;
goto cleanup; goto cleanup;
} }
...@@ -264,6 +265,10 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer) ...@@ -264,6 +265,10 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
info->name = node->name.integer; info->name = node->name.integer;
info->valid = 0; info->valid = 0;
if (node->type == ACPI_TYPE_METHOD) {
info->param_count = node->object->method.param_count;
}
status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
......
...@@ -258,7 +258,7 @@ int __init acpi_numa_init(void) ...@@ -258,7 +258,7 @@ int __init acpi_numa_init(void)
int acpi_get_pxm(acpi_handle h) int acpi_get_pxm(acpi_handle h)
{ {
unsigned long pxm; unsigned long long pxm;
acpi_status status; acpi_status status;
acpi_handle handle; acpi_handle handle;
acpi_handle phandle = h; acpi_handle phandle = h;
......
...@@ -608,7 +608,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */ ...@@ -608,7 +608,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
acpi_handle handle; acpi_handle handle;
struct acpi_pci_id *pci_id = *id; struct acpi_pci_id *pci_id = *id;
acpi_status status; acpi_status status;
unsigned long temp; unsigned long long temp;
acpi_object_type type; acpi_object_type type;
acpi_get_parent(chandle, &handle); acpi_get_parent(chandle, &handle);
...@@ -620,8 +620,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */ ...@@ -620,8 +620,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle, /* upper bound */
if ((ACPI_FAILURE(status)) || (type != ACPI_TYPE_DEVICE)) if ((ACPI_FAILURE(status)) || (type != ACPI_TYPE_DEVICE))
return; return;
status = status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
&temp); &temp);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
u32 val; u32 val;
...@@ -682,6 +681,22 @@ static void acpi_os_execute_deferred(struct work_struct *work) ...@@ -682,6 +681,22 @@ static void acpi_os_execute_deferred(struct work_struct *work)
return; return;
} }
static void acpi_os_execute_hp_deferred(struct work_struct *work)
{
struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
if (!dpc) {
printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
return;
}
acpi_os_wait_events_complete(NULL);
dpc->function(dpc->context);
kfree(dpc);
return;
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_os_execute * FUNCTION: acpi_os_execute
...@@ -697,12 +712,13 @@ static void acpi_os_execute_deferred(struct work_struct *work) ...@@ -697,12 +712,13 @@ static void acpi_os_execute_deferred(struct work_struct *work)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_os_execute(acpi_execute_type type, static acpi_status __acpi_os_execute(acpi_execute_type type,
acpi_osd_exec_callback function, void *context) acpi_osd_exec_callback function, void *context, int hp)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_os_dpc *dpc; struct acpi_os_dpc *dpc;
struct workqueue_struct *queue; struct workqueue_struct *queue;
int ret;
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Scheduling function [%p(%p)] for deferred execution.\n", "Scheduling function [%p(%p)] for deferred execution.\n",
function, context)); function, context));
...@@ -726,19 +742,38 @@ acpi_status acpi_os_execute(acpi_execute_type type, ...@@ -726,19 +742,38 @@ acpi_status acpi_os_execute(acpi_execute_type type,
dpc->function = function; dpc->function = function;
dpc->context = context; dpc->context = context;
if (!hp) {
INIT_WORK(&dpc->work, acpi_os_execute_deferred); INIT_WORK(&dpc->work, acpi_os_execute_deferred);
queue = (type == OSL_NOTIFY_HANDLER) ? kacpi_notify_wq : kacpid_wq; queue = (type == OSL_NOTIFY_HANDLER) ?
if (!queue_work(queue, &dpc->work)) { kacpi_notify_wq : kacpid_wq;
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, ret = queue_work(queue, &dpc->work);
"Call to queue_work() failed.\n")); } else {
INIT_WORK(&dpc->work, acpi_os_execute_hp_deferred);
ret = schedule_work(&dpc->work);
}
if (!ret) {
printk(KERN_ERR PREFIX
"Call to queue_work() failed.\n");
status = AE_ERROR; status = AE_ERROR;
kfree(dpc); kfree(dpc);
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
acpi_status acpi_os_execute(acpi_execute_type type,
acpi_osd_exec_callback function, void *context)
{
return __acpi_os_execute(type, function, context, 0);
}
EXPORT_SYMBOL(acpi_os_execute); EXPORT_SYMBOL(acpi_os_execute);
acpi_status acpi_os_hotplug_execute(acpi_osd_exec_callback function,
void *context)
{
return __acpi_os_execute(0, function, context, 1);
}
void acpi_os_wait_events_complete(void *context) void acpi_os_wait_events_complete(void *context)
{ {
flush_workqueue(kacpid_wq); flush_workqueue(kacpid_wq);
......
...@@ -719,6 +719,8 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state, ...@@ -719,6 +719,8 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
*op = NULL; *op = NULL;
} }
ACPI_PREEMPTION_POINT();
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
......
...@@ -137,6 +137,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, ...@@ -137,6 +137,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
union acpi_parse_object *next; union acpi_parse_object *next;
const struct acpi_opcode_info *parent_info; const struct acpi_opcode_info *parent_info;
union acpi_parse_object *replacement_op = NULL; union acpi_parse_object *replacement_op = NULL;
acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE_PTR(ps_complete_this_op, op); ACPI_FUNCTION_TRACE_PTR(ps_complete_this_op, op);
...@@ -186,7 +187,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, ...@@ -186,7 +187,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
replacement_op = replacement_op =
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP); acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
if (!replacement_op) { if (!replacement_op) {
goto allocate_error; status = AE_NO_MEMORY;
} }
break; break;
...@@ -211,7 +212,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, ...@@ -211,7 +212,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
replacement_op = replacement_op =
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP); acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
if (!replacement_op) { if (!replacement_op) {
goto allocate_error; status = AE_NO_MEMORY;
} }
} else } else
if ((op->common.parent->common.aml_opcode == if ((op->common.parent->common.aml_opcode ==
...@@ -226,15 +227,15 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, ...@@ -226,15 +227,15 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
acpi_ps_alloc_op(op->common. acpi_ps_alloc_op(op->common.
aml_opcode); aml_opcode);
if (!replacement_op) { if (!replacement_op) {
goto allocate_error; status = AE_NO_MEMORY;
} } else {
replacement_op->named.data = replacement_op->named.data =
op->named.data; op->named.data;
replacement_op->named.length = replacement_op->named.length =
op->named.length; op->named.length;
} }
} }
}
break; break;
default: default:
...@@ -242,7 +243,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, ...@@ -242,7 +243,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
replacement_op = replacement_op =
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP); acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
if (!replacement_op) { if (!replacement_op) {
goto allocate_error; status = AE_NO_MEMORY;
} }
} }
...@@ -302,14 +303,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state, ...@@ -302,14 +303,7 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
/* Now we can actually delete the subtree rooted at Op */ /* Now we can actually delete the subtree rooted at Op */
acpi_ps_delete_parse_tree(op); acpi_ps_delete_parse_tree(op);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(status);
allocate_error:
/* Always delete the subtree, even on error */
acpi_ps_delete_parse_tree(op);
return_ACPI_STATUS(AE_NO_MEMORY);
} }
/******************************************************************************* /*******************************************************************************
...@@ -641,10 +635,12 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state) ...@@ -641,10 +635,12 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
ACPI_WALK_METHOD_RESTART; ACPI_WALK_METHOD_RESTART;
} }
} else { } else {
/* On error, delete any return object */ /* On error, delete any return object or implicit return */
acpi_ut_remove_reference(previous_walk_state-> acpi_ut_remove_reference(previous_walk_state->
return_desc); return_desc);
acpi_ds_clear_implicit_return
(previous_walk_state);
} }
} }
......
...@@ -709,7 +709,7 @@ int acpi_pci_link_free_irq(acpi_handle handle) ...@@ -709,7 +709,7 @@ int acpi_pci_link_free_irq(acpi_handle handle)
acpi_device_bid(link->device))); acpi_device_bid(link->device)));
if (link->refcnt == 0) { if (link->refcnt == 0) {
acpi_ut_evaluate_object(link->device->handle, "_DIS", 0, NULL); acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
} }
mutex_unlock(&acpi_link_lock); mutex_unlock(&acpi_link_lock);
return (link->irq.active); return (link->irq.active);
...@@ -737,7 +737,7 @@ static int acpi_pci_link_add(struct acpi_device *device) ...@@ -737,7 +737,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
link->device = device; link->device = device;
strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS); strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS);
acpi_driver_data(device) = link; device->driver_data = link;
mutex_lock(&acpi_link_lock); mutex_lock(&acpi_link_lock);
result = acpi_pci_link_get_possible(link); result = acpi_pci_link_get_possible(link);
...@@ -773,7 +773,7 @@ static int acpi_pci_link_add(struct acpi_device *device) ...@@ -773,7 +773,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
end: end:
/* disable all links -- to be activated on use */ /* disable all links -- to be activated on use */
acpi_ut_evaluate_object(device->handle, "_DIS", 0, NULL); acpi_evaluate_object(device->handle, "_DIS", NULL, NULL);
mutex_unlock(&acpi_link_lock); mutex_unlock(&acpi_link_lock);
if (result) if (result)
......
...@@ -190,7 +190,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) ...@@ -190,7 +190,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
struct acpi_pci_root *root = NULL; struct acpi_pci_root *root = NULL;
struct acpi_pci_root *tmp; struct acpi_pci_root *tmp;
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long value = 0; unsigned long long value = 0;
acpi_handle handle = NULL; acpi_handle handle = NULL;
struct acpi_device *child; struct acpi_device *child;
...@@ -206,7 +206,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device) ...@@ -206,7 +206,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
root->device = device; root->device = device;
strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
acpi_driver_data(device) = root; device->driver_data = root;
device->ops.bind = acpi_pci_bind; device->ops.bind = acpi_pci_bind;
......
...@@ -76,10 +76,10 @@ static struct acpi_pci_driver acpi_pci_slot_driver = { ...@@ -76,10 +76,10 @@ static struct acpi_pci_driver acpi_pci_slot_driver = {
}; };
static int static int
check_slot(acpi_handle handle, unsigned long *sun) check_slot(acpi_handle handle, unsigned long long *sun)
{ {
int device = -1; int device = -1;
unsigned long adr, sta; unsigned long long adr, sta;
acpi_status status; acpi_status status;
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
...@@ -132,7 +132,7 @@ static acpi_status ...@@ -132,7 +132,7 @@ static acpi_status
register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
int device; int device;
unsigned long sun; unsigned long long sun;
char name[SLOT_NAME_SIZE]; char name[SLOT_NAME_SIZE];
struct acpi_pci_slot *slot; struct acpi_pci_slot *slot;
struct pci_slot *pci_slot; struct pci_slot *pci_slot;
...@@ -182,7 +182,7 @@ static acpi_status ...@@ -182,7 +182,7 @@ static acpi_status
walk_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv) walk_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
int device, function; int device, function;
unsigned long adr; unsigned long long adr;
acpi_status status; acpi_status status;
acpi_handle dummy_handle; acpi_handle dummy_handle;
acpi_walk_callback user_function; acpi_walk_callback user_function;
...@@ -239,7 +239,7 @@ static int ...@@ -239,7 +239,7 @@ static int
walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function) walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function)
{ {
int seg, bus; int seg, bus;
unsigned long tmp; unsigned long long tmp;
acpi_status status; acpi_status status;
acpi_handle dummy_handle; acpi_handle dummy_handle;
struct pci_bus *pci_bus; struct pci_bus *pci_bus;
......
...@@ -54,6 +54,14 @@ ACPI_MODULE_NAME("power"); ...@@ -54,6 +54,14 @@ ACPI_MODULE_NAME("power");
#define ACPI_POWER_RESOURCE_STATE_OFF 0x00 #define ACPI_POWER_RESOURCE_STATE_OFF 0x00
#define ACPI_POWER_RESOURCE_STATE_ON 0x01 #define ACPI_POWER_RESOURCE_STATE_ON 0x01
#define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF #define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
#ifdef MODULE_PARAM_PREFIX
#undef MODULE_PARAM_PREFIX
#endif
#define MODULE_PARAM_PREFIX "acpi."
int acpi_power_nocheck;
module_param_named(power_nocheck, acpi_power_nocheck, bool, 000);
static int acpi_power_add(struct acpi_device *device); static int acpi_power_add(struct acpi_device *device);
static int acpi_power_remove(struct acpi_device *device, int type); static int acpi_power_remove(struct acpi_device *device, int type);
static int acpi_power_resume(struct acpi_device *device); static int acpi_power_resume(struct acpi_device *device);
...@@ -128,16 +136,16 @@ acpi_power_get_context(acpi_handle handle, ...@@ -128,16 +136,16 @@ acpi_power_get_context(acpi_handle handle,
return 0; return 0;
} }
static int acpi_power_get_state(struct acpi_power_resource *resource, int *state) static int acpi_power_get_state(acpi_handle handle, int *state)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long sta = 0; unsigned long long sta = 0;
if (!resource || !state) if (!handle || !state)
return -EINVAL; return -EINVAL;
status = acpi_evaluate_integer(resource->device->handle, "_STA", NULL, &sta); status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
...@@ -145,7 +153,7 @@ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state ...@@ -145,7 +153,7 @@ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state
ACPI_POWER_RESOURCE_STATE_OFF; ACPI_POWER_RESOURCE_STATE_OFF;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n",
resource->name, state ? "on" : "off")); acpi_ut_get_node_name(handle), state ? "on" : "off"));
return 0; return 0;
} }
...@@ -153,7 +161,6 @@ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state ...@@ -153,7 +161,6 @@ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state
static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
{ {
int result = 0, state1; int result = 0, state1;
struct acpi_power_resource *resource = NULL;
u32 i = 0; u32 i = 0;
...@@ -161,12 +168,15 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state) ...@@ -161,12 +168,15 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
return -EINVAL; return -EINVAL;
/* The state of the list is 'on' IFF all resources are 'on'. */ /* The state of the list is 'on' IFF all resources are 'on'. */
/* */
for (i = 0; i < list->count; i++) { for (i = 0; i < list->count; i++) {
result = acpi_power_get_context(list->handles[i], &resource); /*
if (result) * The state of the power resource can be obtained by
return result; * using the ACPI handle. In such case it is unnecessary to
result = acpi_power_get_state(resource, &state1); * get the Power resource first and then get its state again.
*/
result = acpi_power_get_state(list->handles[i], &state1);
if (result) if (result)
return result; return result;
...@@ -226,12 +236,18 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev) ...@@ -226,12 +236,18 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
result = acpi_power_get_state(resource, &state); if (!acpi_power_nocheck) {
/*
* If acpi_power_nocheck is set, it is unnecessary to check
* the power state after power transition.
*/
result = acpi_power_get_state(resource->device->handle,
&state);
if (result) if (result)
return result; return result;
if (state != ACPI_POWER_RESOURCE_STATE_ON) if (state != ACPI_POWER_RESOURCE_STATE_ON)
return -ENOEXEC; return -ENOEXEC;
}
/* Update the power resource's _device_ power state */ /* Update the power resource's _device_ power state */
resource->device->power.state = ACPI_STATE_D0; resource->device->power.state = ACPI_STATE_D0;
...@@ -277,11 +293,17 @@ static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev) ...@@ -277,11 +293,17 @@ static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev)
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
result = acpi_power_get_state(resource, &state); if (!acpi_power_nocheck) {
/*
* If acpi_power_nocheck is set, it is unnecessary to check
* the power state after power transition.
*/
result = acpi_power_get_state(handle, &state);
if (result) if (result)
return result; return result;
if (state != ACPI_POWER_RESOURCE_STATE_OFF) if (state != ACPI_POWER_RESOURCE_STATE_OFF)
return -ENOEXEC; return -ENOEXEC;
}
/* Update the power resource's _device_ power state */ /* Update the power resource's _device_ power state */
resource->device->power.state = ACPI_STATE_D3; resource->device->power.state = ACPI_STATE_D3;
...@@ -555,7 +577,7 @@ static int acpi_power_seq_show(struct seq_file *seq, void *offset) ...@@ -555,7 +577,7 @@ static int acpi_power_seq_show(struct seq_file *seq, void *offset)
if (!resource) if (!resource)
goto end; goto end;
result = acpi_power_get_state(resource, &state); result = acpi_power_get_state(resource->device->handle, &state);
if (result) if (result)
goto end; goto end;
...@@ -657,7 +679,7 @@ static int acpi_power_add(struct acpi_device *device) ...@@ -657,7 +679,7 @@ static int acpi_power_add(struct acpi_device *device)
strcpy(resource->name, device->pnp.bus_id); strcpy(resource->name, device->pnp.bus_id);
strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_POWER_CLASS); strcpy(acpi_device_class(device), ACPI_POWER_CLASS);
acpi_driver_data(device) = resource; device->driver_data = resource;
/* Evalute the object to get the system level and resource order. */ /* Evalute the object to get the system level and resource order. */
status = acpi_evaluate_object(device->handle, NULL, NULL, &buffer); status = acpi_evaluate_object(device->handle, NULL, NULL, &buffer);
...@@ -668,7 +690,7 @@ static int acpi_power_add(struct acpi_device *device) ...@@ -668,7 +690,7 @@ static int acpi_power_add(struct acpi_device *device)
resource->system_level = acpi_object.power_resource.system_level; resource->system_level = acpi_object.power_resource.system_level;
resource->order = acpi_object.power_resource.resource_order; resource->order = acpi_object.power_resource.resource_order;
result = acpi_power_get_state(resource, &state); result = acpi_power_get_state(device->handle, &state);
if (result) if (result)
goto end; goto end;
...@@ -733,9 +755,9 @@ static int acpi_power_resume(struct acpi_device *device) ...@@ -733,9 +755,9 @@ static int acpi_power_resume(struct acpi_device *device)
if (!device || !acpi_driver_data(device)) if (!device || !acpi_driver_data(device))
return -EINVAL; return -EINVAL;
resource = (struct acpi_power_resource *)acpi_driver_data(device); resource = acpi_driver_data(device);
result = acpi_power_get_state(resource, &state); result = acpi_power_get_state(device->handle, &state);
if (result) if (result)
return result; return result;
......
...@@ -563,7 +563,7 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid) ...@@ -563,7 +563,7 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
/* Check if it is a Device with HID and UID */ /* Check if it is a Device with HID and UID */
if (has_uid) { if (has_uid) {
unsigned long value; unsigned long long value;
status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
NULL, &value); NULL, &value);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -818,7 +818,7 @@ static int acpi_processor_add(struct acpi_device *device) ...@@ -818,7 +818,7 @@ static int acpi_processor_add(struct acpi_device *device)
pr->handle = device->handle; pr->handle = device->handle;
strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS);
acpi_driver_data(device) = pr; device->driver_data = pr;
return 0; return 0;
} }
...@@ -875,7 +875,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type) ...@@ -875,7 +875,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type)
static int is_processor_present(acpi_handle handle) static int is_processor_present(acpi_handle handle)
{ {
acpi_status status; acpi_status status;
unsigned long sta = 0; unsigned long long sta = 0;
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
......
...@@ -1587,6 +1587,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, ...@@ -1587,6 +1587,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
if (acpi_idle_bm_check()) { if (acpi_idle_bm_check()) {
if (dev->safe_state) { if (dev->safe_state) {
dev->last_state = dev->safe_state;
return dev->safe_state->enter(dev, dev->safe_state); return dev->safe_state->enter(dev, dev->safe_state);
} else { } else {
local_irq_disable(); local_irq_disable();
......
This diff is collapsed.
...@@ -274,7 +274,7 @@ static int acpi_processor_throttling_notifier(unsigned long event, void *data) ...@@ -274,7 +274,7 @@ static int acpi_processor_throttling_notifier(unsigned long event, void *data)
static int acpi_processor_get_platform_limit(struct acpi_processor *pr) static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
{ {
acpi_status status = 0; acpi_status status = 0;
unsigned long tpc = 0; unsigned long long tpc = 0;
if (!pr) if (!pr)
return -EINVAL; return -EINVAL;
...@@ -528,13 +528,13 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr) ...@@ -528,13 +528,13 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr)
tsd = buffer.pointer; tsd = buffer.pointer;
if (!tsd || (tsd->type != ACPI_TYPE_PACKAGE)) { if (!tsd || (tsd->type != ACPI_TYPE_PACKAGE)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _TSD data\n")); printk(KERN_ERR PREFIX "Invalid _TSD data\n");
result = -EFAULT; result = -EFAULT;
goto end; goto end;
} }
if (tsd->package.count != 1) { if (tsd->package.count != 1) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _TSD data\n")); printk(KERN_ERR PREFIX "Invalid _TSD data\n");
result = -EFAULT; result = -EFAULT;
goto end; goto end;
} }
...@@ -547,19 +547,19 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr) ...@@ -547,19 +547,19 @@ static int acpi_processor_get_tsd(struct acpi_processor *pr)
status = acpi_extract_package(&(tsd->package.elements[0]), status = acpi_extract_package(&(tsd->package.elements[0]),
&format, &state); &format, &state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid _TSD data\n")); printk(KERN_ERR PREFIX "Invalid _TSD data\n");
result = -EFAULT; result = -EFAULT;
goto end; goto end;
} }
if (pdomain->num_entries != ACPI_TSD_REV0_ENTRIES) { if (pdomain->num_entries != ACPI_TSD_REV0_ENTRIES) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown _TSD:num_entries\n")); printk(KERN_ERR PREFIX "Unknown _TSD:num_entries\n");
result = -EFAULT; result = -EFAULT;
goto end; goto end;
} }
if (pdomain->revision != ACPI_TSD_REV0_REVISION) { if (pdomain->revision != ACPI_TSD_REV0_REVISION) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown _TSD:revision\n")); printk(KERN_ERR PREFIX "Unknown _TSD:revision\n");
result = -EFAULT; result = -EFAULT;
goto end; goto end;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -931,7 +931,7 @@ static int acpi_sbs_add(struct acpi_device *device) ...@@ -931,7 +931,7 @@ static int acpi_sbs_add(struct acpi_device *device)
sbs->device = device; sbs->device = device;
strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_SBS_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_SBS_CLASS); strcpy(acpi_device_class(device), ACPI_SBS_CLASS);
acpi_driver_data(device) = sbs; device->driver_data = sbs;
result = acpi_charger_add(sbs); result = acpi_charger_add(sbs);
if (result) if (result)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
obj-$(CONFIG_I7300_IDLE) += i7300_idle.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment