提交 37224470 编写于 作者: L 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: (65 commits)
  ACPI: suppress power button event on S3 resume
  ACPI: resolve merge conflict between sem2mutex and processor_perflib.c
  ACPI: use for_each_possible_cpu() instead of for_each_cpu()
  ACPI: delete newly added debugging macros in processor_perflib.c
  ACPI: UP build fix for bugzilla-5737
  Enable P-state software coordination via _PDC
  P-state software coordination for speedstep-centrino
  P-state software coordination for acpi-cpufreq
  P-state software coordination for ACPI core
  ACPI: create acpi_thermal_resume()
  ACPI: create acpi_fan_suspend()/acpi_fan_resume()
  ACPI: pass pm_message_t from acpi_device_suspend() to root_suspend()
  ACPI: create acpi_device_suspend()/acpi_device_resume()
  ACPI: replace spin_lock_irq with mutex for ec poll mode
  ACPI: Allow a WAN module enable/disable on a Thinkpad X60.
  sem2mutex: acpi, acpi_link_lock
  ACPI: delete unused acpi_bus_drivers_lock
  sem2mutex: drivers/acpi/processor_perflib.c
  ACPI add ia64 exports to build acpi_memhotplug as a module
  ACPI: asus_acpi_init(): propagate correct return value
  ...

Manual resolve of conflicts in:

	arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
	arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
	include/acpi/processor.h
...@@ -147,6 +147,9 @@ running once the system is up. ...@@ -147,6 +147,9 @@ running once the system is up.
acpi_irq_isa= [HW,ACPI] If irq_balance, mark listed IRQs used by ISA acpi_irq_isa= [HW,ACPI] If irq_balance, mark listed IRQs used by ISA
Format: <irq>,<irq>... Format: <irq>,<irq>...
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
Format: To spoof as Windows 98: ="Microsoft Windows"
acpi_osi= [HW,ACPI] empty param disables _OSI acpi_osi= [HW,ACPI] empty param disables _OSI
acpi_serialize [HW,ACPI] force serialization of AML methods acpi_serialize [HW,ACPI] force serialization of AML methods
......
...@@ -217,7 +217,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size) ...@@ -217,7 +217,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
{ {
struct acpi_table_madt *madt = NULL; struct acpi_table_madt *madt = NULL;
if (!phys_addr || !size) if (!phys_addr || !size || !cpu_has_apic)
return -EINVAL; return -EINVAL;
madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size); madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size);
...@@ -623,9 +623,9 @@ extern u32 pmtmr_ioport; ...@@ -623,9 +623,9 @@ extern u32 pmtmr_ioport;
static int __init acpi_parse_fadt(unsigned long phys, unsigned long size) static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
{ {
struct fadt_descriptor_rev2 *fadt = NULL; struct fadt_descriptor *fadt = NULL;
fadt = (struct fadt_descriptor_rev2 *)__acpi_map_table(phys, size); fadt = (struct fadt_descriptor *)__acpi_map_table(phys, size);
if (!fadt) { if (!fadt) {
printk(KERN_WARNING PREFIX "Unable to map FADT\n"); printk(KERN_WARNING PREFIX "Unable to map FADT\n");
return 0; return 0;
...@@ -756,7 +756,7 @@ static int __init acpi_parse_madt_ioapic_entries(void) ...@@ -756,7 +756,7 @@ static int __init acpi_parse_madt_ioapic_entries(void)
return -ENODEV; return -ENODEV;
} }
if (!cpu_has_apic) if (!cpu_has_apic)
return -ENODEV; return -ENODEV;
/* /*
......
...@@ -47,7 +47,7 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c) ...@@ -47,7 +47,7 @@ static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
buf[2] = ACPI_PDC_C_CAPABILITY_SMP; buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
if (cpu_has(c, X86_FEATURE_EST)) if (cpu_has(c, X86_FEATURE_EST))
buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP; buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP;
obj->type = ACPI_TYPE_BUFFER; obj->type = ACPI_TYPE_BUFFER;
obj->buffer.length = 12; obj->buffer.length = 12;
......
...@@ -48,12 +48,13 @@ MODULE_LICENSE("GPL"); ...@@ -48,12 +48,13 @@ MODULE_LICENSE("GPL");
struct cpufreq_acpi_io { struct cpufreq_acpi_io {
struct acpi_processor_performance acpi_data; struct acpi_processor_performance *acpi_data;
struct cpufreq_frequency_table *freq_table; struct cpufreq_frequency_table *freq_table;
unsigned int resume; unsigned int resume;
}; };
static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS]; static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS];
static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
static struct cpufreq_driver acpi_cpufreq_driver; static struct cpufreq_driver acpi_cpufreq_driver;
...@@ -104,64 +105,43 @@ acpi_processor_set_performance ( ...@@ -104,64 +105,43 @@ acpi_processor_set_performance (
{ {
u16 port = 0; u16 port = 0;
u8 bit_width = 0; u8 bit_width = 0;
int ret;
u32 value = 0;
int i = 0; int i = 0;
struct cpufreq_freqs cpufreq_freqs; int ret = 0;
cpumask_t saved_mask; u32 value = 0;
int retval; int retval;
struct acpi_processor_performance *perf;
dprintk("acpi_processor_set_performance\n"); dprintk("acpi_processor_set_performance\n");
/* retval = 0;
* TBD: Use something other than set_cpus_allowed. perf = data->acpi_data;
* As set_cpus_allowed is a bit racy, if (state == perf->state) {
* with any other set_cpus_allowed for this process.
*/
saved_mask = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu));
if (smp_processor_id() != cpu) {
return (-EAGAIN);
}
if (state == data->acpi_data.state) {
if (unlikely(data->resume)) { if (unlikely(data->resume)) {
dprintk("Called after resume, resetting to P%d\n", state); dprintk("Called after resume, resetting to P%d\n", state);
data->resume = 0; data->resume = 0;
} else { } else {
dprintk("Already at target state (P%d)\n", state); dprintk("Already at target state (P%d)\n", state);
retval = 0; return (retval);
goto migrate_end;
} }
} }
dprintk("Transitioning from P%d to P%d\n", dprintk("Transitioning from P%d to P%d\n", perf->state, state);
data->acpi_data.state, state);
/* cpufreq frequency struct */
cpufreq_freqs.cpu = cpu;
cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency;
cpufreq_freqs.new = data->freq_table[state].frequency;
/* notify cpufreq */
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
/* /*
* First we write the target state's 'control' value to the * First we write the target state's 'control' value to the
* control_register. * control_register.
*/ */
port = data->acpi_data.control_register.address; port = perf->control_register.address;
bit_width = data->acpi_data.control_register.bit_width; bit_width = perf->control_register.bit_width;
value = (u32) data->acpi_data.states[state].control; value = (u32) perf->states[state].control;
dprintk("Writing 0x%08x to port 0x%04x\n", value, port); dprintk("Writing 0x%08x to port 0x%04x\n", value, port);
ret = acpi_processor_write_port(port, bit_width, value); ret = acpi_processor_write_port(port, bit_width, value);
if (ret) { if (ret) {
dprintk("Invalid port width 0x%04x\n", bit_width); dprintk("Invalid port width 0x%04x\n", bit_width);
retval = ret; return (ret);
goto migrate_end;
} }
/* /*
...@@ -177,48 +157,35 @@ acpi_processor_set_performance ( ...@@ -177,48 +157,35 @@ acpi_processor_set_performance (
* before giving up. * before giving up.
*/ */
port = data->acpi_data.status_register.address; port = perf->status_register.address;
bit_width = data->acpi_data.status_register.bit_width; bit_width = perf->status_register.bit_width;
dprintk("Looking for 0x%08x from port 0x%04x\n", dprintk("Looking for 0x%08x from port 0x%04x\n",
(u32) data->acpi_data.states[state].status, port); (u32) perf->states[state].status, port);
for (i=0; i<100; i++) { for (i = 0; i < 100; i++) {
ret = acpi_processor_read_port(port, bit_width, &value); ret = acpi_processor_read_port(port, bit_width, &value);
if (ret) { if (ret) {
dprintk("Invalid port width 0x%04x\n", bit_width); dprintk("Invalid port width 0x%04x\n", bit_width);
retval = ret; return (ret);
goto migrate_end;
} }
if (value == (u32) data->acpi_data.states[state].status) if (value == (u32) perf->states[state].status)
break; break;
udelay(10); udelay(10);
} }
} else { } else {
value = (u32) data->acpi_data.states[state].status; value = (u32) perf->states[state].status;
} }
/* notify cpufreq */ if (unlikely(value != (u32) perf->states[state].status)) {
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
if (unlikely(value != (u32) data->acpi_data.states[state].status)) {
unsigned int tmp = cpufreq_freqs.new;
cpufreq_freqs.new = cpufreq_freqs.old;
cpufreq_freqs.old = tmp;
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
printk(KERN_WARNING "acpi-cpufreq: Transition failed\n"); printk(KERN_WARNING "acpi-cpufreq: Transition failed\n");
retval = -ENODEV; retval = -ENODEV;
goto migrate_end; return (retval);
} }
dprintk("Transition successful after %d microseconds\n", i * 10); dprintk("Transition successful after %d microseconds\n", i * 10);
data->acpi_data.state = state; perf->state = state;
retval = 0;
migrate_end:
set_cpus_allowed(current, saved_mask);
return (retval); return (retval);
} }
...@@ -230,8 +197,17 @@ acpi_cpufreq_target ( ...@@ -230,8 +197,17 @@ acpi_cpufreq_target (
unsigned int relation) unsigned int relation)
{ {
struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
struct acpi_processor_performance *perf;
struct cpufreq_freqs freqs;
cpumask_t online_policy_cpus;
cpumask_t saved_mask;
cpumask_t set_mask;
cpumask_t covered_cpus;
unsigned int cur_state = 0;
unsigned int next_state = 0; unsigned int next_state = 0;
unsigned int result = 0; unsigned int result = 0;
unsigned int j;
unsigned int tmp;
dprintk("acpi_cpufreq_setpolicy\n"); dprintk("acpi_cpufreq_setpolicy\n");
...@@ -240,11 +216,95 @@ acpi_cpufreq_target ( ...@@ -240,11 +216,95 @@ acpi_cpufreq_target (
target_freq, target_freq,
relation, relation,
&next_state); &next_state);
if (result) if (unlikely(result))
return (result); return (result);
result = acpi_processor_set_performance (data, policy->cpu, next_state); perf = data->acpi_data;
cur_state = perf->state;
freqs.old = data->freq_table[cur_state].frequency;
freqs.new = data->freq_table[next_state].frequency;
#ifdef CONFIG_HOTPLUG_CPU
/* cpufreq holds the hotplug lock, so we are safe from here on */
cpus_and(online_policy_cpus, cpu_online_map, policy->cpus);
#else
online_policy_cpus = policy->cpus;
#endif
for_each_cpu_mask(j, online_policy_cpus) {
freqs.cpu = j;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
}
/*
* We need to call driver->target() on all or any CPU in
* policy->cpus, depending on policy->shared_type.
*/
saved_mask = current->cpus_allowed;
cpus_clear(covered_cpus);
for_each_cpu_mask(j, online_policy_cpus) {
/*
* Support for SMP systems.
* Make sure we are running on CPU that wants to change freq
*/
cpus_clear(set_mask);
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
cpus_or(set_mask, set_mask, online_policy_cpus);
else
cpu_set(j, set_mask);
set_cpus_allowed(current, set_mask);
if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
dprintk("couldn't limit to CPUs in this domain\n");
result = -EAGAIN;
break;
}
result = acpi_processor_set_performance (data, j, next_state);
if (result) {
result = -EAGAIN;
break;
}
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
break;
cpu_set(j, covered_cpus);
}
for_each_cpu_mask(j, online_policy_cpus) {
freqs.cpu = j;
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
if (unlikely(result)) {
/*
* We have failed halfway through the frequency change.
* We have sent callbacks to online_policy_cpus and
* acpi_processor_set_performance() has been called on
* coverd_cpus. Best effort undo..
*/
if (!cpus_empty(covered_cpus)) {
for_each_cpu_mask(j, covered_cpus) {
policy->cpu = j;
acpi_processor_set_performance (data,
j,
cur_state);
}
}
tmp = freqs.new;
freqs.new = freqs.old;
freqs.old = tmp;
for_each_cpu_mask(j, online_policy_cpus) {
freqs.cpu = j;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
}
set_cpus_allowed(current, saved_mask);
return (result); return (result);
} }
...@@ -270,30 +330,65 @@ acpi_cpufreq_guess_freq ( ...@@ -270,30 +330,65 @@ acpi_cpufreq_guess_freq (
struct cpufreq_acpi_io *data, struct cpufreq_acpi_io *data,
unsigned int cpu) unsigned int cpu)
{ {
struct acpi_processor_performance *perf = data->acpi_data;
if (cpu_khz) { if (cpu_khz) {
/* search the closest match to cpu_khz */ /* search the closest match to cpu_khz */
unsigned int i; unsigned int i;
unsigned long freq; unsigned long freq;
unsigned long freqn = data->acpi_data.states[0].core_frequency * 1000; unsigned long freqn = perf->states[0].core_frequency * 1000;
for (i=0; i < (data->acpi_data.state_count - 1); i++) { for (i = 0; i < (perf->state_count - 1); i++) {
freq = freqn; freq = freqn;
freqn = data->acpi_data.states[i+1].core_frequency * 1000; freqn = perf->states[i+1].core_frequency * 1000;
if ((2 * cpu_khz) > (freqn + freq)) { if ((2 * cpu_khz) > (freqn + freq)) {
data->acpi_data.state = i; perf->state = i;
return (freq); return (freq);
} }
} }
data->acpi_data.state = data->acpi_data.state_count - 1; perf->state = perf->state_count - 1;
return (freqn); return (freqn);
} else } else {
/* assume CPU is at P0... */ /* assume CPU is at P0... */
data->acpi_data.state = 0; perf->state = 0;
return data->acpi_data.states[0].core_frequency * 1000; return perf->states[0].core_frequency * 1000;
}
} }
/*
* acpi_cpufreq_early_init - initialize ACPI P-States library
*
* Initialize the ACPI P-States library (drivers/acpi/processor_perflib.c)
* in order to determine correct frequency and voltage pairings. We can
* do _PDC and _PSD and find out the processor dependency for the
* actual init that will happen later...
*/
static int acpi_cpufreq_early_init_acpi(void)
{
struct acpi_processor_performance *data;
unsigned int i, j;
dprintk("acpi_cpufreq_early_init\n");
for_each_cpu(i) {
data = kzalloc(sizeof(struct acpi_processor_performance),
GFP_KERNEL);
if (!data) {
for_each_cpu(j) {
kfree(acpi_perf_data[j]);
acpi_perf_data[j] = NULL;
}
return (-ENOMEM);
}
acpi_perf_data[i] = data;
}
/* Do initialization in ACPI core */
acpi_processor_preregister_performance(acpi_perf_data);
return 0;
}
static int static int
acpi_cpufreq_cpu_init ( acpi_cpufreq_cpu_init (
struct cpufreq_policy *policy) struct cpufreq_policy *policy)
...@@ -303,41 +398,51 @@ acpi_cpufreq_cpu_init ( ...@@ -303,41 +398,51 @@ acpi_cpufreq_cpu_init (
struct cpufreq_acpi_io *data; struct cpufreq_acpi_io *data;
unsigned int result = 0; unsigned int result = 0;
struct cpuinfo_x86 *c = &cpu_data[policy->cpu]; struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
struct acpi_processor_performance *perf;
dprintk("acpi_cpufreq_cpu_init\n"); dprintk("acpi_cpufreq_cpu_init\n");
if (!acpi_perf_data[cpu])
return (-ENODEV);
data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
if (!data) if (!data)
return (-ENOMEM); return (-ENOMEM);
data->acpi_data = acpi_perf_data[cpu];
acpi_io_data[cpu] = data; acpi_io_data[cpu] = data;
result = acpi_processor_register_performance(&data->acpi_data, cpu); result = acpi_processor_register_performance(data->acpi_data, cpu);
if (result) if (result)
goto err_free; goto err_free;
perf = data->acpi_data;
policy->cpus = perf->shared_cpu_map;
policy->shared_type = perf->shared_type;
if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) {
acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS; acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
} }
/* capability check */ /* capability check */
if (data->acpi_data.state_count <= 1) { if (perf->state_count <= 1) {
dprintk("No P-States\n"); dprintk("No P-States\n");
result = -ENODEV; result = -ENODEV;
goto err_unreg; goto err_unreg;
} }
if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) ||
(data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) { if ((perf->control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) ||
(perf->status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
dprintk("Unsupported address space [%d, %d]\n", dprintk("Unsupported address space [%d, %d]\n",
(u32) (data->acpi_data.control_register.space_id), (u32) (perf->control_register.space_id),
(u32) (data->acpi_data.status_register.space_id)); (u32) (perf->status_register.space_id));
result = -ENODEV; result = -ENODEV;
goto err_unreg; goto err_unreg;
} }
/* alloc freq_table */ /* alloc freq_table */
data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (data->acpi_data.state_count + 1), GFP_KERNEL); data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (perf->state_count + 1), GFP_KERNEL);
if (!data->freq_table) { if (!data->freq_table) {
result = -ENOMEM; result = -ENOMEM;
goto err_unreg; goto err_unreg;
...@@ -345,9 +450,9 @@ acpi_cpufreq_cpu_init ( ...@@ -345,9 +450,9 @@ acpi_cpufreq_cpu_init (
/* detect transition latency */ /* detect transition latency */
policy->cpuinfo.transition_latency = 0; policy->cpuinfo.transition_latency = 0;
for (i=0; i<data->acpi_data.state_count; i++) { for (i=0; i<perf->state_count; i++) {
if ((data->acpi_data.states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency) if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
policy->cpuinfo.transition_latency = data->acpi_data.states[i].transition_latency * 1000; policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000;
} }
policy->governor = CPUFREQ_DEFAULT_GOVERNOR; policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
...@@ -355,11 +460,11 @@ acpi_cpufreq_cpu_init ( ...@@ -355,11 +460,11 @@ acpi_cpufreq_cpu_init (
policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu); policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
/* table init */ /* table init */
for (i=0; i<=data->acpi_data.state_count; i++) for (i=0; i<=perf->state_count; i++)
{ {
data->freq_table[i].index = i; data->freq_table[i].index = i;
if (i<data->acpi_data.state_count) if (i<perf->state_count)
data->freq_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000; data->freq_table[i].frequency = perf->states[i].core_frequency * 1000;
else else
data->freq_table[i].frequency = CPUFREQ_TABLE_END; data->freq_table[i].frequency = CPUFREQ_TABLE_END;
} }
...@@ -374,12 +479,12 @@ acpi_cpufreq_cpu_init ( ...@@ -374,12 +479,12 @@ acpi_cpufreq_cpu_init (
printk(KERN_INFO "acpi-cpufreq: CPU%u - ACPI performance management activated.\n", printk(KERN_INFO "acpi-cpufreq: CPU%u - ACPI performance management activated.\n",
cpu); cpu);
for (i = 0; i < data->acpi_data.state_count; i++) for (i = 0; i < perf->state_count; i++)
dprintk(" %cP%d: %d MHz, %d mW, %d uS\n", dprintk(" %cP%d: %d MHz, %d mW, %d uS\n",
(i == data->acpi_data.state?'*':' '), i, (i == perf->state?'*':' '), i,
(u32) data->acpi_data.states[i].core_frequency, (u32) perf->states[i].core_frequency,
(u32) data->acpi_data.states[i].power, (u32) perf->states[i].power,
(u32) data->acpi_data.states[i].transition_latency); (u32) perf->states[i].transition_latency);
cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu); cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu);
...@@ -394,7 +499,7 @@ acpi_cpufreq_cpu_init ( ...@@ -394,7 +499,7 @@ acpi_cpufreq_cpu_init (
err_freqfree: err_freqfree:
kfree(data->freq_table); kfree(data->freq_table);
err_unreg: err_unreg:
acpi_processor_unregister_performance(&data->acpi_data, cpu); acpi_processor_unregister_performance(perf, cpu);
err_free: err_free:
kfree(data); kfree(data);
acpi_io_data[cpu] = NULL; acpi_io_data[cpu] = NULL;
...@@ -415,7 +520,7 @@ acpi_cpufreq_cpu_exit ( ...@@ -415,7 +520,7 @@ acpi_cpufreq_cpu_exit (
if (data) { if (data) {
cpufreq_frequency_table_put_attr(policy->cpu); cpufreq_frequency_table_put_attr(policy->cpu);
acpi_io_data[policy->cpu] = NULL; acpi_io_data[policy->cpu] = NULL;
acpi_processor_unregister_performance(&data->acpi_data, policy->cpu); acpi_processor_unregister_performance(data->acpi_data, policy->cpu);
kfree(data); kfree(data);
} }
...@@ -462,7 +567,10 @@ acpi_cpufreq_init (void) ...@@ -462,7 +567,10 @@ acpi_cpufreq_init (void)
dprintk("acpi_cpufreq_init\n"); dprintk("acpi_cpufreq_init\n");
result = cpufreq_register_driver(&acpi_cpufreq_driver); result = acpi_cpufreq_early_init_acpi();
if (!result)
result = cpufreq_register_driver(&acpi_cpufreq_driver);
return (result); return (result);
} }
...@@ -471,10 +579,15 @@ acpi_cpufreq_init (void) ...@@ -471,10 +579,15 @@ acpi_cpufreq_init (void)
static void __exit static void __exit
acpi_cpufreq_exit (void) acpi_cpufreq_exit (void)
{ {
unsigned int i;
dprintk("acpi_cpufreq_exit\n"); dprintk("acpi_cpufreq_exit\n");
cpufreq_unregister_driver(&acpi_cpufreq_driver); cpufreq_unregister_driver(&acpi_cpufreq_driver);
for_each_cpu(i) {
kfree(acpi_perf_data[i]);
acpi_perf_data[i] = NULL;
}
return; return;
} }
......
...@@ -347,7 +347,36 @@ static unsigned int get_cur_freq(unsigned int cpu) ...@@ -347,7 +347,36 @@ static unsigned int get_cur_freq(unsigned int cpu)
#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI #ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
static struct acpi_processor_performance p; static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
/*
* centrino_cpu_early_init_acpi - Do the preregistering with ACPI P-States
* library
*
* Before doing the actual init, we need to do _PSD related setup whenever
* supported by the BIOS. These are handled by this early_init routine.
*/
static int centrino_cpu_early_init_acpi(void)
{
unsigned int i, j;
struct acpi_processor_performance *data;
for_each_cpu(i) {
data = kzalloc(sizeof(struct acpi_processor_performance),
GFP_KERNEL);
if (!data) {
for_each_cpu(j) {
kfree(acpi_perf_data[j]);
acpi_perf_data[j] = NULL;
}
return (-ENOMEM);
}
acpi_perf_data[i] = data;
}
acpi_processor_preregister_performance(acpi_perf_data);
return 0;
}
/* /*
* centrino_cpu_init_acpi - register with ACPI P-States library * centrino_cpu_init_acpi - register with ACPI P-States library
...@@ -361,46 +390,51 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) ...@@ -361,46 +390,51 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
unsigned long cur_freq; unsigned long cur_freq;
int result = 0, i; int result = 0, i;
unsigned int cpu = policy->cpu; unsigned int cpu = policy->cpu;
struct acpi_processor_performance *p;
p = acpi_perf_data[cpu];
/* register with ACPI core */ /* register with ACPI core */
if (acpi_processor_register_performance(&p, cpu)) { if (acpi_processor_register_performance(p, cpu)) {
dprintk("obtaining ACPI data failed\n"); dprintk(PFX "obtaining ACPI data failed\n");
return -EIO; return -EIO;
} }
policy->cpus = p->shared_cpu_map;
policy->shared_type = p->shared_type;
/* verify the acpi_data */ /* verify the acpi_data */
if (p.state_count <= 1) { if (p->state_count <= 1) {
dprintk("No P-States\n"); dprintk("No P-States\n");
result = -ENODEV; result = -ENODEV;
goto err_unreg; goto err_unreg;
} }
if ((p.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || if ((p->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
(p.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { (p->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
dprintk("Invalid control/status registers (%x - %x)\n", dprintk("Invalid control/status registers (%x - %x)\n",
p.control_register.space_id, p.status_register.space_id); p->control_register.space_id, p->status_register.space_id);
result = -EIO; result = -EIO;
goto err_unreg; goto err_unreg;
} }
for (i=0; i<p.state_count; i++) { for (i=0; i<p->state_count; i++) {
if (p.states[i].control != p.states[i].status) { if (p->states[i].control != p->states[i].status) {
dprintk("Different control (%llu) and status values (%llu)\n", dprintk("Different control (%llu) and status values (%llu)\n",
p.states[i].control, p.states[i].status); p->states[i].control, p->states[i].status);
result = -EINVAL; result = -EINVAL;
goto err_unreg; goto err_unreg;
} }
if (!p.states[i].core_frequency) { if (!p->states[i].core_frequency) {
dprintk("Zero core frequency for state %u\n", i); dprintk("Zero core frequency for state %u\n", i);
result = -EINVAL; result = -EINVAL;
goto err_unreg; goto err_unreg;
} }
if (p.states[i].core_frequency > p.states[0].core_frequency) { if (p->states[i].core_frequency > p->states[0].core_frequency) {
dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i, dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i,
p.states[i].core_frequency, p.states[0].core_frequency); p->states[i].core_frequency, p->states[0].core_frequency);
p.states[i].core_frequency = 0; p->states[i].core_frequency = 0;
continue; continue;
} }
} }
...@@ -412,26 +446,26 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) ...@@ -412,26 +446,26 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
} }
centrino_model[cpu]->model_name=NULL; centrino_model[cpu]->model_name=NULL;
centrino_model[cpu]->max_freq = p.states[0].core_frequency * 1000; centrino_model[cpu]->max_freq = p->states[0].core_frequency * 1000;
centrino_model[cpu]->op_points = kmalloc(sizeof(struct cpufreq_frequency_table) * centrino_model[cpu]->op_points = kmalloc(sizeof(struct cpufreq_frequency_table) *
(p.state_count + 1), GFP_KERNEL); (p->state_count + 1), GFP_KERNEL);
if (!centrino_model[cpu]->op_points) { if (!centrino_model[cpu]->op_points) {
result = -ENOMEM; result = -ENOMEM;
goto err_kfree; goto err_kfree;
} }
for (i=0; i<p.state_count; i++) { for (i=0; i<p->state_count; i++) {
centrino_model[cpu]->op_points[i].index = p.states[i].control; centrino_model[cpu]->op_points[i].index = p->states[i].control;
centrino_model[cpu]->op_points[i].frequency = p.states[i].core_frequency * 1000; centrino_model[cpu]->op_points[i].frequency = p->states[i].core_frequency * 1000;
dprintk("adding state %i with frequency %u and control value %04x\n", dprintk("adding state %i with frequency %u and control value %04x\n",
i, centrino_model[cpu]->op_points[i].frequency, centrino_model[cpu]->op_points[i].index); i, centrino_model[cpu]->op_points[i].frequency, centrino_model[cpu]->op_points[i].index);
} }
centrino_model[cpu]->op_points[p.state_count].frequency = CPUFREQ_TABLE_END; centrino_model[cpu]->op_points[p->state_count].frequency = CPUFREQ_TABLE_END;
cur_freq = get_cur_freq(cpu); cur_freq = get_cur_freq(cpu);
for (i=0; i<p.state_count; i++) { for (i=0; i<p->state_count; i++) {
if (!p.states[i].core_frequency) { if (!p->states[i].core_frequency) {
dprintk("skipping state %u\n", i); dprintk("skipping state %u\n", i);
centrino_model[cpu]->op_points[i].frequency = CPUFREQ_ENTRY_INVALID; centrino_model[cpu]->op_points[i].frequency = CPUFREQ_ENTRY_INVALID;
continue; continue;
...@@ -447,7 +481,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) ...@@ -447,7 +481,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
} }
if (cur_freq == centrino_model[cpu]->op_points[i].frequency) if (cur_freq == centrino_model[cpu]->op_points[i].frequency)
p.state = i; p->state = i;
} }
/* notify BIOS that we exist */ /* notify BIOS that we exist */
...@@ -460,12 +494,13 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) ...@@ -460,12 +494,13 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
err_kfree: err_kfree:
kfree(centrino_model[cpu]); kfree(centrino_model[cpu]);
err_unreg: err_unreg:
acpi_processor_unregister_performance(&p, cpu); acpi_processor_unregister_performance(p, cpu);
dprintk("invalid ACPI data\n"); dprintk(PFX "invalid ACPI data\n");
return (result); return (result);
} }
#else #else
static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) { return -ENODEV; } static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) { return -ENODEV; }
static inline int centrino_cpu_early_init_acpi(void) { return 0; }
#endif #endif
static int centrino_cpu_init(struct cpufreq_policy *policy) static int centrino_cpu_init(struct cpufreq_policy *policy)
...@@ -551,10 +586,15 @@ static int centrino_cpu_exit(struct cpufreq_policy *policy) ...@@ -551,10 +586,15 @@ static int centrino_cpu_exit(struct cpufreq_policy *policy)
#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI #ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
if (!centrino_model[cpu]->model_name) { if (!centrino_model[cpu]->model_name) {
dprintk("unregistering and freeing ACPI data\n"); static struct acpi_processor_performance *p;
acpi_processor_unregister_performance(&p, cpu);
kfree(centrino_model[cpu]->op_points); if (acpi_perf_data[cpu]) {
kfree(centrino_model[cpu]); p = acpi_perf_data[cpu];
dprintk("unregistering and freeing ACPI data\n");
acpi_processor_unregister_performance(p, cpu);
kfree(centrino_model[cpu]->op_points);
kfree(centrino_model[cpu]);
}
} }
#endif #endif
...@@ -588,63 +628,128 @@ static int centrino_target (struct cpufreq_policy *policy, ...@@ -588,63 +628,128 @@ static int centrino_target (struct cpufreq_policy *policy,
unsigned int relation) unsigned int relation)
{ {
unsigned int newstate = 0; unsigned int newstate = 0;
unsigned int msr, oldmsr, h, cpu = policy->cpu; unsigned int msr, oldmsr = 0, h = 0, cpu = policy->cpu;
struct cpufreq_freqs freqs; struct cpufreq_freqs freqs;
cpumask_t online_policy_cpus;
cpumask_t saved_mask; cpumask_t saved_mask;
int retval; cpumask_t set_mask;
cpumask_t covered_cpus;
int retval = 0;
unsigned int j, k, first_cpu, tmp;
if (centrino_model[cpu] == NULL) if (unlikely(centrino_model[cpu] == NULL))
return -ENODEV; return -ENODEV;
/* if (unlikely(cpufreq_frequency_table_target(policy,
* Support for SMP systems. centrino_model[cpu]->op_points,
* Make sure we are running on the CPU that wants to change frequency target_freq,
*/ relation,
saved_mask = current->cpus_allowed; &newstate))) {
set_cpus_allowed(current, policy->cpus); return -EINVAL;
if (!cpu_isset(smp_processor_id(), policy->cpus)) {
dprintk("couldn't limit to CPUs in this domain\n");
return(-EAGAIN);
} }
if (cpufreq_frequency_table_target(policy, centrino_model[cpu]->op_points, target_freq, #ifdef CONFIG_HOTPLUG_CPU
relation, &newstate)) { /* cpufreq holds the hotplug lock, so we are safe from here on */
retval = -EINVAL; cpus_and(online_policy_cpus, cpu_online_map, policy->cpus);
goto migrate_end; #else
} online_policy_cpus = policy->cpus;
#endif
msr = centrino_model[cpu]->op_points[newstate].index; saved_mask = current->cpus_allowed;
rdmsr(MSR_IA32_PERF_CTL, oldmsr, h); first_cpu = 1;
cpus_clear(covered_cpus);
for_each_cpu_mask(j, online_policy_cpus) {
/*
* Support for SMP systems.
* Make sure we are running on CPU that wants to change freq
*/
cpus_clear(set_mask);
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
cpus_or(set_mask, set_mask, online_policy_cpus);
else
cpu_set(j, set_mask);
set_cpus_allowed(current, set_mask);
if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
dprintk("couldn't limit to CPUs in this domain\n");
retval = -EAGAIN;
if (first_cpu) {
/* We haven't started the transition yet. */
goto migrate_end;
}
break;
}
if (msr == (oldmsr & 0xffff)) { msr = centrino_model[cpu]->op_points[newstate].index;
retval = 0;
dprintk("no change needed - msr was and needs to be %x\n", oldmsr); if (first_cpu) {
goto migrate_end; rdmsr(MSR_IA32_PERF_CTL, oldmsr, h);
} if (msr == (oldmsr & 0xffff)) {
dprintk("no change needed - msr was and needs "
"to be %x\n", oldmsr);
retval = 0;
goto migrate_end;
}
freqs.old = extract_clock(oldmsr, cpu, 0);
freqs.new = extract_clock(msr, cpu, 0);
dprintk("target=%dkHz old=%d new=%d msr=%04x\n",
target_freq, freqs.old, freqs.new, msr);
for_each_cpu_mask(k, online_policy_cpus) {
freqs.cpu = k;
cpufreq_notify_transition(&freqs,
CPUFREQ_PRECHANGE);
}
first_cpu = 0;
/* all but 16 LSB are reserved, treat them with care */
oldmsr &= ~0xffff;
msr &= 0xffff;
oldmsr |= msr;
}
freqs.cpu = cpu; wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
freqs.old = extract_clock(oldmsr, cpu, 0); if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
freqs.new = extract_clock(msr, cpu, 0); break;
dprintk("target=%dkHz old=%d new=%d msr=%04x\n", cpu_set(j, covered_cpus);
target_freq, freqs.old, freqs.new, msr); }
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); for_each_cpu_mask(k, online_policy_cpus) {
freqs.cpu = k;
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
/* all but 16 LSB are "reserved", so treat them with if (unlikely(retval)) {
care */ /*
oldmsr &= ~0xffff; * We have failed halfway through the frequency change.
msr &= 0xffff; * We have sent callbacks to policy->cpus and
oldmsr |= msr; * MSRs have already been written on coverd_cpus.
* Best effort undo..
*/
wrmsr(MSR_IA32_PERF_CTL, oldmsr, h); if (!cpus_empty(covered_cpus)) {
for_each_cpu_mask(j, covered_cpus) {
set_cpus_allowed(current, cpumask_of_cpu(j));
wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
}
}
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); tmp = freqs.new;
freqs.new = freqs.old;
freqs.old = tmp;
for_each_cpu_mask(j, online_policy_cpus) {
freqs.cpu = j;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
}
retval = 0;
migrate_end: migrate_end:
set_cpus_allowed(current, saved_mask); set_cpus_allowed(current, saved_mask);
return (retval); return 0;
} }
static struct freq_attr* centrino_attr[] = { static struct freq_attr* centrino_attr[] = {
...@@ -686,12 +791,25 @@ static int __init centrino_init(void) ...@@ -686,12 +791,25 @@ static int __init centrino_init(void)
if (!cpu_has(cpu, X86_FEATURE_EST)) if (!cpu_has(cpu, X86_FEATURE_EST))
return -ENODEV; return -ENODEV;
centrino_cpu_early_init_acpi();
return cpufreq_register_driver(&centrino_driver); return cpufreq_register_driver(&centrino_driver);
} }
static void __exit centrino_exit(void) static void __exit centrino_exit(void)
{ {
#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
unsigned int j;
#endif
cpufreq_unregister_driver(&centrino_driver); cpufreq_unregister_driver(&centrino_driver);
#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
for_each_cpu(j) {
kfree(acpi_perf_data[j]);
acpi_perf_data[j] = NULL;
}
#endif
} }
MODULE_AUTHOR ("Jeremy Fitzhardinge <jeremy@goop.org>"); MODULE_AUTHOR ("Jeremy Fitzhardinge <jeremy@goop.org>");
......
...@@ -77,6 +77,7 @@ choice ...@@ -77,6 +77,7 @@ choice
config IA64_GENERIC config IA64_GENERIC
bool "generic" bool "generic"
select ACPI select ACPI
select PCI
select NUMA select NUMA
select ACPI_NUMA select ACPI_NUMA
help help
......
...@@ -1999,7 +1999,7 @@ acpi_sba_ioc_add(struct acpi_device *device) ...@@ -1999,7 +1999,7 @@ acpi_sba_ioc_add(struct acpi_device *device)
if (!iovp_shift) if (!iovp_shift)
iovp_shift = min(PAGE_SHIFT, 16); iovp_shift = min(PAGE_SHIFT, 16);
} }
ACPI_MEM_FREE(dev_info); kfree(dev_info);
/* /*
* default anything not caught above or specified on cmdline to 4k * default anything not caught above or specified on cmdline to 4k
......
...@@ -68,8 +68,6 @@ EXPORT_SYMBOL(pm_power_off); ...@@ -68,8 +68,6 @@ EXPORT_SYMBOL(pm_power_off);
unsigned char acpi_kbd_controller_present = 1; unsigned char acpi_kbd_controller_present = 1;
unsigned char acpi_legacy_devices; unsigned char acpi_legacy_devices;
static unsigned int __initdata acpi_madt_rev;
unsigned int acpi_cpei_override; unsigned int acpi_cpei_override;
unsigned int acpi_cpei_phys_cpuid; unsigned int acpi_cpei_phys_cpuid;
...@@ -243,6 +241,8 @@ acpi_parse_iosapic(acpi_table_entry_header * header, const unsigned long end) ...@@ -243,6 +241,8 @@ acpi_parse_iosapic(acpi_table_entry_header * header, const unsigned long end)
return iosapic_init(iosapic->address, iosapic->global_irq_base); return iosapic_init(iosapic->address, iosapic->global_irq_base);
} }
static unsigned int __initdata acpi_madt_rev;
static int __init static int __init
acpi_parse_plat_int_src(acpi_table_entry_header * header, acpi_parse_plat_int_src(acpi_table_entry_header * header,
const unsigned long end) const unsigned long end)
......
...@@ -671,9 +671,11 @@ int add_memory(u64 start, u64 size) ...@@ -671,9 +671,11 @@ int add_memory(u64 start, u64 size)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(add_memory);
int remove_memory(u64 start, u64 size) int remove_memory(u64 start, u64 size)
{ {
return -EINVAL; return -EINVAL;
} }
EXPORT_SYMBOL_GPL(remove_memory);
#endif #endif
...@@ -299,6 +299,7 @@ config X86_64_ACPI_NUMA ...@@ -299,6 +299,7 @@ config X86_64_ACPI_NUMA
bool "ACPI NUMA detection" bool "ACPI NUMA detection"
depends on NUMA depends on NUMA
select ACPI select ACPI
select PCI
select ACPI_NUMA select ACPI_NUMA
default y default y
help help
......
...@@ -4,5 +4,6 @@ obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o ...@@ -4,5 +4,6 @@ obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
ifneq ($(CONFIG_ACPI_PROCESSOR),) ifneq ($(CONFIG_ACPI_PROCESSOR),)
obj-y += processor.o obj-y += processor.o
processor-y := ../../../i386/kernel/acpi/processor.o ../../../i386/kernel/acpi/cstate.o
endif endif
/*
* arch/x86_64/kernel/acpi/processor.c
*
* Copyright (C) 2005 Intel Corporation
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
* - Added _PDC for platforms with Intel CPUs
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/acpi.h>
#include <acpi/processor.h>
#include <asm/acpi.h>
static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
{
struct acpi_object_list *obj_list;
union acpi_object *obj;
u32 *buf;
/* allocate and initialize pdc. It will be used later. */
obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
if (!obj_list) {
printk(KERN_ERR "Memory allocation error\n");
return;
}
obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
if (!obj) {
printk(KERN_ERR "Memory allocation error\n");
kfree(obj_list);
return;
}
buf = kmalloc(12, GFP_KERNEL);
if (!buf) {
printk(KERN_ERR "Memory allocation error\n");
kfree(obj);
kfree(obj_list);
return;
}
buf[0] = ACPI_PDC_REVISION_ID;
buf[1] = 1;
buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
obj->type = ACPI_TYPE_BUFFER;
obj->buffer.length = 12;
obj->buffer.pointer = (u8 *) buf;
obj_list->count = 1;
obj_list->pointer = obj;
pr->pdc = obj_list;
return;
}
/* Initialize _PDC data based on the CPU vendor */
void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
{
unsigned int cpu = pr->id;
struct cpuinfo_x86 *c = cpu_data + cpu;
pr->pdc = NULL;
if (c->x86_vendor == X86_VENDOR_INTEL && cpu_has(c, X86_FEATURE_EST))
init_intel_pdc(pr, c);
return;
}
EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
...@@ -10,9 +10,8 @@ menu "ACPI (Advanced Configuration and Power Interface) Support" ...@@ -10,9 +10,8 @@ menu "ACPI (Advanced Configuration and Power Interface) Support"
config ACPI config ACPI
bool "ACPI Support" bool "ACPI Support"
depends on IA64 || X86 depends on IA64 || X86
depends on PCI
select PM select PM
select PCI
default y default y
---help--- ---help---
Advanced Configuration and Power Interface (ACPI) support for Advanced Configuration and Power Interface (ACPI) support for
......
...@@ -74,7 +74,7 @@ struct acpi_memory_device { ...@@ -74,7 +74,7 @@ struct acpi_memory_device {
unsigned short caching; /* memory cache attribute */ unsigned short caching; /* memory cache attribute */
unsigned short write_protect; /* memory read/write attribute */ unsigned short write_protect; /* memory read/write attribute */
u64 start_addr; /* Memory Range start physical addr */ u64 start_addr; /* Memory Range start physical addr */
u64 end_addr; /* Memory Range end physical addr */ u64 length; /* Memory Range length */
}; };
static int static int
...@@ -97,12 +97,11 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device) ...@@ -97,12 +97,11 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
if (address64.resource_type == ACPI_MEMORY_RANGE) { if (address64.resource_type == ACPI_MEMORY_RANGE) {
/* Populate the structure */ /* Populate the structure */
mem_device->caching = mem_device->caching = address64.info.mem.caching;
address64.info.mem.caching;
mem_device->write_protect = mem_device->write_protect =
address64.info.mem.write_protect; address64.info.mem.write_protect;
mem_device->start_addr = address64.minimum; mem_device->start_addr = address64.minimum;
mem_device->end_addr = address64.maximum; mem_device->length = address64.address_length;
} }
} }
...@@ -199,8 +198,7 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device) ...@@ -199,8 +198,7 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
* Tell the VM there is more memory here... * Tell the VM there is more memory here...
* Note: Assume that this function returns zero on success * Note: Assume that this function returns zero on success
*/ */
result = add_memory(mem_device->start_addr, result = add_memory(mem_device->start_addr, mem_device->length);
(mem_device->end_addr - mem_device->start_addr) + 1);
if (result) { if (result) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "\nadd_memory failed\n")); ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "\nadd_memory failed\n"));
mem_device->state = MEMORY_INVALID_STATE; mem_device->state = MEMORY_INVALID_STATE;
...@@ -249,7 +247,7 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device) ...@@ -249,7 +247,7 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
{ {
int result; int result;
u64 start = mem_device->start_addr; u64 start = mem_device->start_addr;
u64 len = mem_device->end_addr - start + 1; u64 len = mem_device->length;
ACPI_FUNCTION_TRACE("acpi_memory_disable_device"); ACPI_FUNCTION_TRACE("acpi_memory_disable_device");
......
...@@ -817,7 +817,7 @@ typedef int (proc_writefunc) (struct file * file, const char __user * buffer, ...@@ -817,7 +817,7 @@ typedef int (proc_writefunc) (struct file * file, const char __user * buffer,
unsigned long count, void *data); unsigned long count, void *data);
static int static int
__init asus_proc_add(char *name, proc_writefunc * writefunc, asus_proc_add(char *name, proc_writefunc * writefunc,
proc_readfunc * readfunc, mode_t mode, proc_readfunc * readfunc, mode_t mode,
struct acpi_device *device) struct acpi_device *device)
{ {
...@@ -836,7 +836,7 @@ __init asus_proc_add(char *name, proc_writefunc * writefunc, ...@@ -836,7 +836,7 @@ __init asus_proc_add(char *name, proc_writefunc * writefunc,
return 0; return 0;
} }
static int __init asus_hotk_add_fs(struct acpi_device *device) static int asus_hotk_add_fs(struct acpi_device *device)
{ {
struct proc_dir_entry *proc; struct proc_dir_entry *proc;
mode_t mode; mode_t mode;
...@@ -954,7 +954,7 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data) ...@@ -954,7 +954,7 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
* This function is used to initialize the hotk with right values. In this * This function is used to initialize the hotk with right values. In this
* method, we can make all the detection we want, and modify the hotk struct * method, we can make all the detection we want, and modify the hotk struct
*/ */
static int __init asus_hotk_get_info(void) static int asus_hotk_get_info(void)
{ {
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL };
...@@ -970,7 +970,7 @@ static int __init asus_hotk_get_info(void) ...@@ -970,7 +970,7 @@ static int __init asus_hotk_get_info(void)
* HID), this bit will be moved. A global variable asus_info contains * HID), this bit will be moved. A global variable asus_info contains
* the DSDT header. * the DSDT header.
*/ */
status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt); status = acpi_get_table(ACPI_TABLE_ID_DSDT, 1, &dsdt);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
printk(KERN_WARNING " Couldn't get the DSDT table header\n"); printk(KERN_WARNING " Couldn't get the DSDT table header\n");
else else
...@@ -1101,7 +1101,7 @@ static int __init asus_hotk_get_info(void) ...@@ -1101,7 +1101,7 @@ static int __init asus_hotk_get_info(void)
return AE_OK; return AE_OK;
} }
static int __init asus_hotk_check(void) static int asus_hotk_check(void)
{ {
int result = 0; int result = 0;
...@@ -1119,7 +1119,9 @@ static int __init asus_hotk_check(void) ...@@ -1119,7 +1119,9 @@ static int __init asus_hotk_check(void)
return result; return result;
} }
static int __init asus_hotk_add(struct acpi_device *device) static int asus_hotk_found;
static int asus_hotk_add(struct acpi_device *device)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
int result; int result;
...@@ -1180,6 +1182,8 @@ static int __init asus_hotk_add(struct acpi_device *device) ...@@ -1180,6 +1182,8 @@ static int __init asus_hotk_add(struct acpi_device *device)
} }
} }
asus_hotk_found = 1;
end: end:
if (result) { if (result) {
kfree(hotk); kfree(hotk);
...@@ -1226,12 +1230,24 @@ static int __init asus_acpi_init(void) ...@@ -1226,12 +1230,24 @@ static int __init asus_acpi_init(void)
asus_proc_dir->owner = THIS_MODULE; asus_proc_dir->owner = THIS_MODULE;
result = acpi_bus_register_driver(&asus_hotk_driver); result = acpi_bus_register_driver(&asus_hotk_driver);
if (result < 1) { if (result < 0) {
acpi_bus_unregister_driver(&asus_hotk_driver);
remove_proc_entry(PROC_ASUS, acpi_root_dir); remove_proc_entry(PROC_ASUS, acpi_root_dir);
return -ENODEV; return -ENODEV;
} }
/*
* This is a bit of a kludge. We only want this module loaded
* for ASUS systems, but there's currently no way to probe the
* ACPI namespace for ASUS HIDs. So we just return failure if
* we didn't find one, which will cause the module to be
* unloaded.
*/
if (!asus_hotk_found) {
acpi_bus_unregister_driver(&asus_hotk_driver);
remove_proc_entry(PROC_ASUS, acpi_root_dir);
return result;
}
return 0; return 0;
} }
......
...@@ -43,7 +43,7 @@ ACPI_MODULE_NAME("acpi_bus") ...@@ -43,7 +43,7 @@ ACPI_MODULE_NAME("acpi_bus")
extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger); extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger);
#endif #endif
FADT_DESCRIPTOR acpi_fadt; struct fadt_descriptor acpi_fadt;
EXPORT_SYMBOL(acpi_fadt); EXPORT_SYMBOL(acpi_fadt);
struct acpi_device *acpi_root; struct acpi_device *acpi_root;
...@@ -205,12 +205,14 @@ int acpi_bus_set_power(acpi_handle handle, int state) ...@@ -205,12 +205,14 @@ int acpi_bus_set_power(acpi_handle handle, int state)
* Get device's current power state if it's unknown * Get device's current power state if it's unknown
* This means device power state isn't initialized or previous setting failed * This means device power state isn't initialized or previous setting failed
*/ */
if (device->power.state == ACPI_STATE_UNKNOWN) if (!device->flags.force_power_state) {
acpi_bus_get_power(device->handle, &device->power.state); if (device->power.state == ACPI_STATE_UNKNOWN)
if (state == device->power.state) { acpi_bus_get_power(device->handle, &device->power.state);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", if (state == device->power.state) {
state)); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
return_VALUE(0); state));
return_VALUE(0);
}
} }
if (!device->power.states[state].flags.valid) { if (!device->power.states[state].flags.valid) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n", ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n",
...@@ -596,6 +598,8 @@ void __init acpi_early_init(void) ...@@ -596,6 +598,8 @@ void __init acpi_early_init(void)
if (acpi_disabled) if (acpi_disabled)
return_VOID; return_VOID;
printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION);
/* enable workarounds, unless strict ACPI spec. compliance */ /* enable workarounds, unless strict ACPI spec. compliance */
if (!acpi_strict) if (!acpi_strict)
acpi_gbl_enable_interpreter_slack = TRUE; acpi_gbl_enable_interpreter_slack = TRUE;
...@@ -617,7 +621,7 @@ void __init acpi_early_init(void) ...@@ -617,7 +621,7 @@ void __init acpi_early_init(void)
/* /*
* Get a separate copy of the FADT for use by other drivers. * Get a separate copy of the FADT for use by other drivers.
*/ */
status = acpi_get_table(ACPI_TABLE_FADT, 1, &buffer); status = acpi_get_table(ACPI_TABLE_ID_FADT, 1, &buffer);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
printk(KERN_ERR PREFIX "Unable to get the FADT\n"); printk(KERN_ERR PREFIX "Unable to get the FADT\n");
goto error0; goto error0;
...@@ -743,8 +747,6 @@ static int __init acpi_init(void) ...@@ -743,8 +747,6 @@ static int __init acpi_init(void)
ACPI_FUNCTION_TRACE("acpi_init"); ACPI_FUNCTION_TRACE("acpi_init");
printk(KERN_INFO PREFIX "Subsystem revision %08x\n", ACPI_CA_VERSION);
if (acpi_disabled) { if (acpi_disabled) {
printk(KERN_INFO PREFIX "Interpreter disabled.\n"); printk(KERN_INFO PREFIX "Interpreter disabled.\n");
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
......
...@@ -87,7 +87,7 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op, ...@@ -87,7 +87,7 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
union acpi_operand_object *second_desc = NULL; union acpi_operand_object *second_desc = NULL;
u32 flags; u32 flags;
ACPI_FUNCTION_TRACE("ds_create_buffer_field"); ACPI_FUNCTION_TRACE(ds_create_buffer_field);
/* Get the name_string argument */ /* Get the name_string argument */
...@@ -210,7 +210,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, ...@@ -210,7 +210,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
acpi_status status; acpi_status status;
acpi_integer position; acpi_integer position;
ACPI_FUNCTION_TRACE_PTR("ds_get_field_names", info); ACPI_FUNCTION_TRACE_PTR(ds_get_field_names, info);
/* First field starts at bit zero */ /* First field starts at bit zero */
...@@ -342,7 +342,7 @@ acpi_ds_create_field(union acpi_parse_object *op, ...@@ -342,7 +342,7 @@ acpi_ds_create_field(union acpi_parse_object *op,
union acpi_parse_object *arg; union acpi_parse_object *arg;
struct acpi_create_field_info info; struct acpi_create_field_info info;
ACPI_FUNCTION_TRACE_PTR("ds_create_field", op); ACPI_FUNCTION_TRACE_PTR(ds_create_field, op);
/* First arg is the name of the parent op_region (must already exist) */ /* First arg is the name of the parent op_region (must already exist) */
...@@ -399,7 +399,7 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, ...@@ -399,7 +399,7 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
u8 type = 0; u8 type = 0;
ACPI_FUNCTION_TRACE_PTR("ds_init_field_objects", op); ACPI_FUNCTION_TRACE_PTR(ds_init_field_objects, op);
switch (walk_state->opcode) { switch (walk_state->opcode) {
case AML_FIELD_OP: case AML_FIELD_OP:
...@@ -425,6 +425,7 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, ...@@ -425,6 +425,7 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
* Walk the list of entries in the field_list * Walk the list of entries in the field_list
*/ */
while (arg) { while (arg) {
/* Ignore OFFSET and ACCESSAS terms here */ /* Ignore OFFSET and ACCESSAS terms here */
if (arg->common.aml_opcode == AML_INT_NAMEDFIELD_OP) { if (arg->common.aml_opcode == AML_INT_NAMEDFIELD_OP) {
...@@ -481,7 +482,7 @@ acpi_ds_create_bank_field(union acpi_parse_object *op, ...@@ -481,7 +482,7 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
union acpi_parse_object *arg; union acpi_parse_object *arg;
struct acpi_create_field_info info; struct acpi_create_field_info info;
ACPI_FUNCTION_TRACE_PTR("ds_create_bank_field", op); ACPI_FUNCTION_TRACE_PTR(ds_create_bank_field, op);
/* First arg is the name of the parent op_region (must already exist) */ /* First arg is the name of the parent op_region (must already exist) */
...@@ -554,7 +555,7 @@ acpi_ds_create_index_field(union acpi_parse_object *op, ...@@ -554,7 +555,7 @@ acpi_ds_create_index_field(union acpi_parse_object *op,
union acpi_parse_object *arg; union acpi_parse_object *arg;
struct acpi_create_field_info info; struct acpi_create_field_info info;
ACPI_FUNCTION_TRACE_PTR("ds_create_index_field", op); ACPI_FUNCTION_TRACE_PTR(ds_create_index_field, op);
/* First arg is the name of the Index register (must already exist) */ /* First arg is the name of the Index register (must already exist) */
......
...@@ -184,7 +184,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle, ...@@ -184,7 +184,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Walk the namespace starting at "start_node" and perform any * DESCRIPTION: Walk the namespace starting at "StartNode" and perform any
* necessary initialization on the objects found therein * necessary initialization on the objects found therein
* *
******************************************************************************/ ******************************************************************************/
...@@ -196,7 +196,7 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc, ...@@ -196,7 +196,7 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc,
acpi_status status; acpi_status status;
struct acpi_init_walk_info info; struct acpi_init_walk_info info;
ACPI_FUNCTION_TRACE("ds_initialize_objects"); ACPI_FUNCTION_TRACE(ds_initialize_objects);
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n")); "**** Starting initialization of namespace objects ****\n"));
...@@ -213,7 +213,7 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc, ...@@ -213,7 +213,7 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc,
status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX, status = acpi_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
acpi_ds_init_one_object, &info, NULL); acpi_ds_init_one_object, &info, NULL);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace")); ACPI_EXCEPTION((AE_INFO, status, "During WalkNamespace"));
} }
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
......
...@@ -81,6 +81,7 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state) ...@@ -81,6 +81,7 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
/* Invoke the global exception handler */ /* Invoke the global exception handler */
if (acpi_gbl_exception_handler) { if (acpi_gbl_exception_handler) {
/* Exit the interpreter, allow handler to execute methods */ /* Exit the interpreter, allow handler to execute methods */
acpi_ex_exit_interpreter(); acpi_ex_exit_interpreter();
...@@ -100,6 +101,7 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state) ...@@ -100,6 +101,7 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
} }
#ifdef ACPI_DISASSEMBLER #ifdef ACPI_DISASSEMBLER
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* Display method locals/args if disassembler is present */ /* Display method locals/args if disassembler is present */
acpi_dm_dump_method_info(status, walk_state, walk_state->op); acpi_dm_dump_method_info(status, walk_state, walk_state->op);
...@@ -132,7 +134,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node, ...@@ -132,7 +134,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE_PTR("ds_begin_method_execution", method_node); ACPI_FUNCTION_TRACE_PTR(ds_begin_method_execution, method_node);
if (!method_node) { if (!method_node) {
return_ACPI_STATUS(AE_NULL_ENTRY); return_ACPI_STATUS(AE_NULL_ENTRY);
...@@ -168,11 +170,14 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node, ...@@ -168,11 +170,14 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
/* /*
* Get a unit from the method semaphore. This releases the * Get a unit from the method semaphore. This releases the
* interpreter if we block * interpreter if we block (then reacquires it)
*/ */
status = status =
acpi_ex_system_wait_semaphore(obj_desc->method.semaphore, acpi_ex_system_wait_semaphore(obj_desc->method.semaphore,
ACPI_WAIT_FOREVER); ACPI_WAIT_FOREVER);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
} }
/* /*
...@@ -183,7 +188,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node, ...@@ -183,7 +188,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
if (!obj_desc->method.owner_id) { if (!obj_desc->method.owner_id) {
status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id); status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); goto cleanup;
} }
} }
...@@ -193,6 +198,14 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node, ...@@ -193,6 +198,14 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node * method_node,
*/ */
obj_desc->method.thread_count++; obj_desc->method.thread_count++;
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
cleanup:
/* On error, must signal the method semaphore if present */
if (obj_desc->method.semaphore) {
(void)acpi_os_signal_semaphore(obj_desc->method.semaphore, 1);
}
return_ACPI_STATUS(status);
} }
/******************************************************************************* /*******************************************************************************
...@@ -218,10 +231,10 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -218,10 +231,10 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
struct acpi_namespace_node *method_node; struct acpi_namespace_node *method_node;
struct acpi_walk_state *next_walk_state = NULL; struct acpi_walk_state *next_walk_state = NULL;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
struct acpi_parameter_info info; struct acpi_evaluate_info *info;
u32 i; u32 i;
ACPI_FUNCTION_TRACE_PTR("ds_call_control_method", this_walk_state); ACPI_FUNCTION_TRACE_PTR(ds_call_control_method, this_walk_state);
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"Execute method %p, currentstate=%p\n", "Execute method %p, currentstate=%p\n",
...@@ -240,25 +253,31 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -240,25 +253,31 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
return_ACPI_STATUS(AE_NULL_OBJECT); return_ACPI_STATUS(AE_NULL_OBJECT);
} }
/* Init for new method, wait on concurrency semaphore */ /* Init for new method, possibly wait on concurrency semaphore */
status = acpi_ds_begin_method_execution(method_node, obj_desc, status = acpi_ds_begin_method_execution(method_node, obj_desc,
this_walk_state->method_node); this_walk_state->method_node);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; return_ACPI_STATUS(status);
} }
/*
* 1) Parse the method. All "normal" methods are parsed for each execution.
* Internal methods (_OSI, etc.) do not require parsing.
*/
if (!(obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY)) { if (!(obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY)) {
/* 1) Parse: Create a new walk state for the preempting walk */
/* Create a new walk state for the parse */
next_walk_state = next_walk_state =
acpi_ds_create_walk_state(obj_desc->method.owner_id, op, acpi_ds_create_walk_state(obj_desc->method.owner_id, op,
obj_desc, NULL); obj_desc, NULL);
if (!next_walk_state) { if (!next_walk_state) {
return_ACPI_STATUS(AE_NO_MEMORY); status = AE_NO_MEMORY;
goto cleanup;
} }
/* Create and init a Root Node */ /* Create and init a parse tree root */
op = acpi_ps_create_scope_op(); op = acpi_ps_create_scope_op();
if (!op) { if (!op) {
...@@ -271,17 +290,20 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -271,17 +290,20 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
obj_desc->method.aml_length, obj_desc->method.aml_length,
NULL, 1); NULL, 1);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_ds_delete_walk_state(next_walk_state); acpi_ps_delete_parse_tree(op);
goto cleanup; goto cleanup;
} }
/* Begin AML parse */ /* Begin AML parse (deletes next_walk_state) */
status = acpi_ps_parse_aml(next_walk_state); status = acpi_ps_parse_aml(next_walk_state);
acpi_ps_delete_parse_tree(op); acpi_ps_delete_parse_tree(op);
if (ACPI_FAILURE(status)) {
goto cleanup;
}
} }
/* 2) Execute: Create a new state for the preempting walk */ /* 2) Begin method execution. Create a new walk state */
next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id, next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id,
NULL, obj_desc, thread); NULL, obj_desc, thread);
...@@ -289,6 +311,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -289,6 +311,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
status = AE_NO_MEMORY; status = AE_NO_MEMORY;
goto cleanup; goto cleanup;
} }
/* /*
* The resolved arguments were put on the previous walk state's operand * The resolved arguments were put on the previous walk state's operand
* stack. Operands on the previous walk state stack always * stack. Operands on the previous walk state stack always
...@@ -296,12 +319,24 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -296,12 +319,24 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
*/ */
this_walk_state->operands[this_walk_state->num_operands] = NULL; this_walk_state->operands[this_walk_state->num_operands] = NULL;
info.parameters = &this_walk_state->operands[0]; /*
info.parameter_type = ACPI_PARAM_ARGS; * Allocate and initialize the evaluation information block
* TBD: this is somewhat inefficient, should change interface to
* ds_init_aml_walk. For now, keeps this struct off the CPU stack
*/
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
if (!info) {
return_ACPI_STATUS(AE_NO_MEMORY);
}
info->parameters = &this_walk_state->operands[0];
info->parameter_type = ACPI_PARAM_ARGS;
status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node, status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node,
obj_desc->method.aml_start, obj_desc->method.aml_start,
obj_desc->method.aml_length, &info, 3); obj_desc->method.aml_length, info, 3);
ACPI_FREE(info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
} }
...@@ -323,6 +358,8 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -323,6 +358,8 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
"Starting nested execution, newstate=%p\n", "Starting nested execution, newstate=%p\n",
next_walk_state)); next_walk_state));
/* Invoke an internal method if necessary */
if (obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY) { if (obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY) {
status = obj_desc->method.implementation(next_walk_state); status = obj_desc->method.implementation(next_walk_state);
} }
...@@ -330,16 +367,14 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, ...@@ -330,16 +367,14 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
cleanup: cleanup:
/* Decrement the thread count on the method parse tree */
if (next_walk_state && (next_walk_state->method_desc)) { /* On error, we must terminate the method properly */
next_walk_state->method_desc->method.thread_count--;
}
/* On error, we must delete the new walk state */ acpi_ds_terminate_control_method(obj_desc, next_walk_state);
if (next_walk_state) {
acpi_ds_delete_walk_state(next_walk_state);
}
acpi_ds_terminate_control_method(next_walk_state);
acpi_ds_delete_walk_state(next_walk_state);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -362,25 +397,33 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, ...@@ -362,25 +397,33 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state,
union acpi_operand_object *return_desc) union acpi_operand_object *return_desc)
{ {
acpi_status status; acpi_status status;
int same_as_implicit_return;
ACPI_FUNCTION_TRACE_PTR("ds_restart_control_method", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_restart_control_method, walk_state);
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"****Restart [%4.4s] Op %p return_value_from_callee %p\n", "****Restart [%4.4s] Op %p ReturnValueFromCallee %p\n",
(char *)&walk_state->method_node->name, (char *)&walk_state->method_node->name,
walk_state->method_call_op, return_desc)); walk_state->method_call_op, return_desc));
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
" return_from_this_method_used?=%X res_stack %p Walk %p\n", " ReturnFromThisMethodUsed?=%X ResStack %p Walk %p\n",
walk_state->return_used, walk_state->return_used,
walk_state->results, walk_state)); walk_state->results, walk_state));
/* Did the called method return a value? */ /* Did the called method return a value? */
if (return_desc) { if (return_desc) {
/* Is the implicit return object the same as the return desc? */
same_as_implicit_return =
(walk_state->implicit_return_obj == return_desc);
/* Are we actually going to use the return value? */ /* Are we actually going to use the return value? */
if (walk_state->return_used) { if (walk_state->return_used) {
/* Save the return value from the previous method */ /* Save the return value from the previous method */
status = acpi_ds_result_push(return_desc, walk_state); status = acpi_ds_result_push(return_desc, walk_state);
...@@ -397,18 +440,23 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, ...@@ -397,18 +440,23 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state,
} }
/* /*
* The following code is the * The following code is the optional support for the so-called
* optional support for a so-called "implicit return". Some AML code * "implicit return". Some AML code assumes that the last value of the
* assumes that the last value of the method is "implicitly" returned * method is "implicitly" returned to the caller, in the absence of an
* to the caller. Just save the last result as the return value. * explicit return value.
*
* Just save the last result of the method as the return value.
*
* NOTE: this is optional because the ASL language does not actually * NOTE: this is optional because the ASL language does not actually
* support this behavior. * support this behavior.
*/ */
else if (!acpi_ds_do_implicit_return else if (!acpi_ds_do_implicit_return
(return_desc, walk_state, FALSE)) { (return_desc, walk_state, FALSE)
|| same_as_implicit_return) {
/* /*
* Delete the return value if it will not be used by the * Delete the return value if it will not be used by the
* calling method * calling method or remove one reference if the explicit return
* is the same as the implicit return value.
*/ */
acpi_ut_remove_reference(return_desc); acpi_ut_remove_reference(return_desc);
} }
...@@ -421,7 +469,8 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, ...@@ -421,7 +469,8 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state,
* *
* FUNCTION: acpi_ds_terminate_control_method * FUNCTION: acpi_ds_terminate_control_method
* *
* PARAMETERS: walk_state - State of the method * PARAMETERS: method_desc - Method object
* walk_state - State associated with the method
* *
* RETURN: None * RETURN: None
* *
...@@ -431,95 +480,100 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state, ...@@ -431,95 +480,100 @@ acpi_ds_restart_control_method(struct acpi_walk_state *walk_state,
* *
******************************************************************************/ ******************************************************************************/
void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state) void
acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
struct acpi_walk_state *walk_state)
{ {
union acpi_operand_object *obj_desc;
struct acpi_namespace_node *method_node; struct acpi_namespace_node *method_node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ds_terminate_control_method", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_terminate_control_method, walk_state);
if (!walk_state) { /* method_desc is required, walk_state is optional */
return_VOID;
}
/* The current method object was saved in the walk state */ if (!method_desc) {
obj_desc = walk_state->method_desc;
if (!obj_desc) {
return_VOID; return_VOID;
} }
/* Delete all arguments and locals */ if (walk_state) {
acpi_ds_method_data_delete_all(walk_state); /* Delete all arguments and locals */
acpi_ds_method_data_delete_all(walk_state);
}
/* /*
* Lock the parser while we terminate this method. * Lock the parser while we terminate this method.
* If this is the last thread executing the method, * If this is the last thread executing the method,
* we have additional cleanup to perform * we have additional cleanup to perform
*/ */
status = acpi_ut_acquire_mutex(ACPI_MTX_PARSER); status = acpi_ut_acquire_mutex(ACPI_MTX_CONTROL_METHOD);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_VOID; return_VOID;
} }
/* Signal completion of the execution of this method if necessary */ /* Signal completion of the execution of this method if necessary */
if (walk_state->method_desc->method.semaphore) { if (method_desc->method.semaphore) {
status = status =
acpi_os_signal_semaphore(walk_state->method_desc->method. acpi_os_signal_semaphore(method_desc->method.semaphore, 1);
semaphore, 1);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR((AE_INFO,
"Could not signal method semaphore"));
/* Ignore error and continue cleanup */ /* Ignore error and continue */
ACPI_EXCEPTION((AE_INFO, status,
"Could not signal method semaphore"));
} }
} }
/* if (walk_state) {
* There are no more threads executing this method. Perform /*
* additional cleanup. * Delete any objects created by this method during execution.
* * The method Node is stored in the walk state
* The method Node is stored in the walk state */
*/ method_node = walk_state->method_node;
method_node = walk_state->method_node;
/* Lock namespace for possible update */ /* Lock namespace for possible update */
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto exit; goto exit;
} }
/* /*
* Delete any namespace entries created immediately underneath * Delete any namespace entries created immediately underneath
* the method * the method
*/ */
if (method_node->child) { if (method_node && method_node->child) {
acpi_ns_delete_namespace_subtree(method_node); acpi_ns_delete_namespace_subtree(method_node);
}
/*
* Delete any namespace entries created anywhere else within
* the namespace by the execution of this method
*/
acpi_ns_delete_namespace_by_owner(method_desc->method.owner_id);
status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
} }
/* /* Decrement the thread count on the method */
* Delete any namespace entries created anywhere else within
* the namespace by the execution of this method if (method_desc->method.thread_count) {
*/ method_desc->method.thread_count--;
acpi_ns_delete_namespace_by_owner(walk_state->method_desc->method. } else {
owner_id); ACPI_ERROR((AE_INFO, "Invalid zero thread count in method"));
status = acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); }
/* Are there any other threads currently executing this method? */ /* Are there any other threads currently executing this method? */
if (walk_state->method_desc->method.thread_count) { if (method_desc->method.thread_count) {
/* /*
* Additional threads. Do not release the owner_id in this case, * Additional threads. Do not release the owner_id in this case,
* we immediately reuse it for the next thread executing this method * we immediately reuse it for the next thread executing this method
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"*** Completed execution of one thread, %d threads remaining\n", "*** Completed execution of one thread, %d threads remaining\n",
walk_state->method_desc->method. method_desc->method.thread_count));
thread_count));
} else { } else {
/* This is the only executing thread for this method */ /* This is the only executing thread for this method */
...@@ -533,22 +587,20 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state) ...@@ -533,22 +587,20 @@ void acpi_ds_terminate_control_method(struct acpi_walk_state *walk_state)
* This code is here because we must wait until the last thread exits * This code is here because we must wait until the last thread exits
* before creating the synchronization semaphore. * before creating the synchronization semaphore.
*/ */
if ((walk_state->method_desc->method.concurrency == 1) && if ((method_desc->method.concurrency == 1) &&
(!walk_state->method_desc->method.semaphore)) { (!method_desc->method.semaphore)) {
status = acpi_os_create_semaphore(1, 1, status = acpi_os_create_semaphore(1, 1,
&walk_state-> &method_desc->method.
method_desc->method.
semaphore); semaphore);
} }
/* No more threads, we can free the owner_id */ /* No more threads, we can free the owner_id */
acpi_ut_release_owner_id(&walk_state->method_desc->method. acpi_ut_release_owner_id(&method_desc->method.owner_id);
owner_id);
} }
exit: exit:
(void)acpi_ut_release_mutex(ACPI_MTX_PARSER); (void)acpi_ut_release_mutex(ACPI_MTX_CONTROL_METHOD);
return_VOID; return_VOID;
} }
...@@ -581,7 +633,7 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node) ...@@ -581,7 +633,7 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
union acpi_parse_object *op; union acpi_parse_object *op;
struct acpi_walk_state *walk_state; struct acpi_walk_state *walk_state;
ACPI_FUNCTION_TRACE_PTR("ds_parse_method", node); ACPI_FUNCTION_TRACE_PTR(ds_parse_method, node);
/* Parameter Validation */ /* Parameter Validation */
...@@ -590,7 +642,7 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node) ...@@ -590,7 +642,7 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
} }
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
"**** Parsing [%4.4s] **** named_obj=%p\n", "**** Parsing [%4.4s] **** NamedObj=%p\n",
acpi_ut_get_node_name(node), node)); acpi_ut_get_node_name(node), node));
/* Extract the method object from the method Node */ /* Extract the method object from the method Node */
...@@ -669,7 +721,7 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node) ...@@ -669,7 +721,7 @@ acpi_status acpi_ds_parse_method(struct acpi_namespace_node *node)
} }
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
"**** [%4.4s] Parsed **** named_obj=%p Op=%p\n", "**** [%4.4s] Parsed **** NamedObj=%p Op=%p\n",
acpi_ut_get_node_name(node), node, op)); acpi_ut_get_node_name(node), node, op));
/* /*
......
...@@ -81,7 +81,7 @@ acpi_ds_method_data_get_type(u16 opcode, ...@@ -81,7 +81,7 @@ acpi_ds_method_data_get_type(u16 opcode,
* special data types. * special data types.
* *
* NOTES: walk_state fields are initialized to zero by the * NOTES: walk_state fields are initialized to zero by the
* ACPI_MEM_CALLOCATE(). * ACPI_ALLOCATE_ZEROED().
* *
* A pseudo-Namespace Node is assigned to each argument and local * A pseudo-Namespace Node is assigned to each argument and local
* so that ref_of() can return a pointer to the Node. * so that ref_of() can return a pointer to the Node.
...@@ -92,7 +92,7 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state) ...@@ -92,7 +92,7 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
{ {
u32 i; u32 i;
ACPI_FUNCTION_TRACE("ds_method_data_init"); ACPI_FUNCTION_TRACE(ds_method_data_init);
/* Init the method arguments */ /* Init the method arguments */
...@@ -100,10 +100,10 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state) ...@@ -100,10 +100,10 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
ACPI_MOVE_32_TO_32(&walk_state->arguments[i].name, ACPI_MOVE_32_TO_32(&walk_state->arguments[i].name,
NAMEOF_ARG_NTE); NAMEOF_ARG_NTE);
walk_state->arguments[i].name.integer |= (i << 24); walk_state->arguments[i].name.integer |= (i << 24);
walk_state->arguments[i].descriptor = ACPI_DESC_TYPE_NAMED; walk_state->arguments[i].descriptor_type = ACPI_DESC_TYPE_NAMED;
walk_state->arguments[i].type = ACPI_TYPE_ANY; walk_state->arguments[i].type = ACPI_TYPE_ANY;
walk_state->arguments[i].flags = ANOBJ_END_OF_PEER_LIST | walk_state->arguments[i].flags =
ANOBJ_METHOD_ARG; ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
} }
/* Init the method locals */ /* Init the method locals */
...@@ -113,11 +113,11 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state) ...@@ -113,11 +113,11 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
NAMEOF_LOCAL_NTE); NAMEOF_LOCAL_NTE);
walk_state->local_variables[i].name.integer |= (i << 24); walk_state->local_variables[i].name.integer |= (i << 24);
walk_state->local_variables[i].descriptor = walk_state->local_variables[i].descriptor_type =
ACPI_DESC_TYPE_NAMED; ACPI_DESC_TYPE_NAMED;
walk_state->local_variables[i].type = ACPI_TYPE_ANY; walk_state->local_variables[i].type = ACPI_TYPE_ANY;
walk_state->local_variables[i].flags = ANOBJ_END_OF_PEER_LIST | walk_state->local_variables[i].flags =
ANOBJ_METHOD_LOCAL; ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
} }
return_VOID; return_VOID;
...@@ -140,7 +140,7 @@ void acpi_ds_method_data_delete_all(struct acpi_walk_state *walk_state) ...@@ -140,7 +140,7 @@ void acpi_ds_method_data_delete_all(struct acpi_walk_state *walk_state)
{ {
u32 index; u32 index;
ACPI_FUNCTION_TRACE("ds_method_data_delete_all"); ACPI_FUNCTION_TRACE(ds_method_data_delete_all);
/* Detach the locals */ /* Detach the locals */
...@@ -199,7 +199,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params, ...@@ -199,7 +199,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
acpi_status status; acpi_status status;
u32 index = 0; u32 index = 0;
ACPI_FUNCTION_TRACE_PTR("ds_method_data_init_args", params); ACPI_FUNCTION_TRACE_PTR(ds_method_data_init_args, params);
if (!params) { if (!params) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
...@@ -251,7 +251,7 @@ acpi_ds_method_data_get_node(u16 opcode, ...@@ -251,7 +251,7 @@ acpi_ds_method_data_get_node(u16 opcode,
struct acpi_walk_state *walk_state, struct acpi_walk_state *walk_state,
struct acpi_namespace_node **node) struct acpi_namespace_node **node)
{ {
ACPI_FUNCTION_TRACE("ds_method_data_get_node"); ACPI_FUNCTION_TRACE(ds_method_data_get_node);
/* /*
* Method Locals and Arguments are supported * Method Locals and Arguments are supported
...@@ -318,10 +318,10 @@ acpi_ds_method_data_set_value(u16 opcode, ...@@ -318,10 +318,10 @@ acpi_ds_method_data_set_value(u16 opcode,
acpi_status status; acpi_status status;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
ACPI_FUNCTION_TRACE("ds_method_data_set_value"); ACPI_FUNCTION_TRACE(ds_method_data_set_value);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"new_obj %p Opcode %X, Refs=%d [%s]\n", object, "NewObj %p Opcode %X, Refs=%d [%s]\n", object,
opcode, object->common.reference_count, opcode, object->common.reference_count,
acpi_ut_get_type_name(object->common.type))); acpi_ut_get_type_name(object->common.type)));
...@@ -336,7 +336,7 @@ acpi_ds_method_data_set_value(u16 opcode, ...@@ -336,7 +336,7 @@ acpi_ds_method_data_set_value(u16 opcode,
* Increment ref count so object can't be deleted while installed. * Increment ref count so object can't be deleted while installed.
* NOTE: We do not copy the object in order to preserve the call by * NOTE: We do not copy the object in order to preserve the call by
* reference semantics of ACPI Control Method invocation. * reference semantics of ACPI Control Method invocation.
* (See ACPI specification 2.0_c) * (See ACPI Specification 2.0_c)
*/ */
acpi_ut_add_reference(object); acpi_ut_add_reference(object);
...@@ -351,7 +351,7 @@ acpi_ds_method_data_set_value(u16 opcode, ...@@ -351,7 +351,7 @@ acpi_ds_method_data_set_value(u16 opcode,
* FUNCTION: acpi_ds_method_data_get_value * FUNCTION: acpi_ds_method_data_get_value
* *
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
* Index - which local_var or argument to get * Index - Which local_var or argument to get
* walk_state - Current walk state object * walk_state - Current walk state object
* dest_desc - Where Arg or Local value is returned * dest_desc - Where Arg or Local value is returned
* *
...@@ -372,7 +372,7 @@ acpi_ds_method_data_get_value(u16 opcode, ...@@ -372,7 +372,7 @@ acpi_ds_method_data_get_value(u16 opcode,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
union acpi_operand_object *object; union acpi_operand_object *object;
ACPI_FUNCTION_TRACE("ds_method_data_get_value"); ACPI_FUNCTION_TRACE(ds_method_data_get_value);
/* Validate the object descriptor */ /* Validate the object descriptor */
...@@ -459,7 +459,7 @@ acpi_ds_method_data_get_value(u16 opcode, ...@@ -459,7 +459,7 @@ acpi_ds_method_data_get_value(u16 opcode,
* FUNCTION: acpi_ds_method_data_delete_value * FUNCTION: acpi_ds_method_data_delete_value
* *
* PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
* Index - which local_var or argument to delete * Index - Which local_var or argument to delete
* walk_state - Current walk state object * walk_state - Current walk state object
* *
* RETURN: None * RETURN: None
...@@ -477,7 +477,7 @@ acpi_ds_method_data_delete_value(u16 opcode, ...@@ -477,7 +477,7 @@ acpi_ds_method_data_delete_value(u16 opcode,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
union acpi_operand_object *object; union acpi_operand_object *object;
ACPI_FUNCTION_TRACE("ds_method_data_delete_value"); ACPI_FUNCTION_TRACE(ds_method_data_delete_value);
/* Get the namespace node for the arg/local */ /* Get the namespace node for the arg/local */
...@@ -538,7 +538,7 @@ acpi_ds_store_object_to_local(u16 opcode, ...@@ -538,7 +538,7 @@ acpi_ds_store_object_to_local(u16 opcode,
union acpi_operand_object *current_obj_desc; union acpi_operand_object *current_obj_desc;
union acpi_operand_object *new_obj_desc; union acpi_operand_object *new_obj_desc;
ACPI_FUNCTION_TRACE("ds_store_object_to_local"); ACPI_FUNCTION_TRACE(ds_store_object_to_local);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Opcode=%X Index=%d Obj=%p\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Opcode=%X Index=%d Obj=%p\n",
opcode, index, obj_desc)); opcode, index, obj_desc));
...@@ -614,7 +614,7 @@ acpi_ds_store_object_to_local(u16 opcode, ...@@ -614,7 +614,7 @@ acpi_ds_store_object_to_local(u16 opcode,
&& (current_obj_desc->reference.opcode == && (current_obj_desc->reference.opcode ==
AML_REF_OF_OP)) { AML_REF_OF_OP)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Arg (%p) is an obj_ref(Node), storing in node %p\n", "Arg (%p) is an ObjRef(Node), storing in node %p\n",
new_obj_desc, new_obj_desc,
current_obj_desc)); current_obj_desc));
...@@ -688,7 +688,7 @@ acpi_ds_method_data_get_type(u16 opcode, ...@@ -688,7 +688,7 @@ acpi_ds_method_data_get_type(u16 opcode,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
union acpi_operand_object *object; union acpi_operand_object *object;
ACPI_FUNCTION_TRACE("ds_method_data_get_type"); ACPI_FUNCTION_TRACE(ds_method_data_get_type);
/* Get the namespace node for the arg/local */ /* Get the namespace node for the arg/local */
...@@ -701,6 +701,7 @@ acpi_ds_method_data_get_type(u16 opcode, ...@@ -701,6 +701,7 @@ acpi_ds_method_data_get_type(u16 opcode,
object = acpi_ns_get_attached_object(node); object = acpi_ns_get_attached_object(node);
if (!object) { if (!object) {
/* Uninitialized local/arg, return TYPE_ANY */ /* Uninitialized local/arg, return TYPE_ANY */
return_VALUE(ACPI_TYPE_ANY); return_VALUE(ACPI_TYPE_ANY);
......
...@@ -81,7 +81,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, ...@@ -81,7 +81,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ds_build_internal_object"); ACPI_FUNCTION_TRACE(ds_build_internal_object);
*obj_desc_ptr = NULL; *obj_desc_ptr = NULL;
if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
...@@ -103,6 +103,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state, ...@@ -103,6 +103,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
common. common.
node))); node)));
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* Check if we are resolving a named reference within a package */ /* Check if we are resolving a named reference within a package */
if ((status == AE_NOT_FOUND) if ((status == AE_NOT_FOUND)
...@@ -186,7 +187,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, ...@@ -186,7 +187,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
union acpi_parse_object *byte_list; union acpi_parse_object *byte_list;
u32 byte_list_length = 0; u32 byte_list_length = 0;
ACPI_FUNCTION_TRACE("ds_build_internal_buffer_obj"); ACPI_FUNCTION_TRACE(ds_build_internal_buffer_obj);
/* /*
* If we are evaluating a Named buffer object "Name (xxxx, Buffer)". * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
...@@ -195,6 +196,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, ...@@ -195,6 +196,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
*/ */
obj_desc = *obj_desc_ptr; obj_desc = *obj_desc_ptr;
if (!obj_desc) { if (!obj_desc) {
/* Create a new buffer object */ /* Create a new buffer object */
obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER);
...@@ -243,7 +245,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, ...@@ -243,7 +245,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
"Buffer defined with zero length in AML, creating\n")); "Buffer defined with zero length in AML, creating\n"));
} else { } else {
obj_desc->buffer.pointer = obj_desc->buffer.pointer =
ACPI_MEM_CALLOCATE(obj_desc->buffer.length); ACPI_ALLOCATE_ZEROED(obj_desc->buffer.length);
if (!obj_desc->buffer.pointer) { if (!obj_desc->buffer.pointer) {
acpi_ut_delete_object_desc(obj_desc); acpi_ut_delete_object_desc(obj_desc);
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
...@@ -291,7 +293,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, ...@@ -291,7 +293,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
acpi_status status = AE_OK; acpi_status status = AE_OK;
acpi_native_uint i; acpi_native_uint i;
ACPI_FUNCTION_TRACE("ds_build_internal_package_obj"); ACPI_FUNCTION_TRACE(ds_build_internal_package_obj);
/* Find the parent of a possibly nested package */ /* Find the parent of a possibly nested package */
...@@ -339,9 +341,10 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, ...@@ -339,9 +341,10 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
* individual objects). Add an extra pointer slot so * individual objects). Add an extra pointer slot so
* that the list is always null terminated. * that the list is always null terminated.
*/ */
obj_desc->package.elements = ACPI_MEM_CALLOCATE(((acpi_size) obj_desc-> obj_desc->package.elements = ACPI_ALLOCATE_ZEROED(((acpi_size)
package.count + obj_desc->package.
1) * sizeof(void *)); count +
1) * sizeof(void *));
if (!obj_desc->package.elements) { if (!obj_desc->package.elements) {
acpi_ut_delete_object_desc(obj_desc); acpi_ut_delete_object_desc(obj_desc);
...@@ -355,6 +358,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, ...@@ -355,6 +358,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
arg = arg->common.next; arg = arg->common.next;
for (i = 0; arg; i++) { for (i = 0; arg; i++) {
if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
/* Object (package or buffer) is already built */ /* Object (package or buffer) is already built */
obj_desc->package.elements[i] = obj_desc->package.elements[i] =
...@@ -396,7 +400,7 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state, ...@@ -396,7 +400,7 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state,
acpi_status status; acpi_status status;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
ACPI_FUNCTION_TRACE_PTR("ds_create_node", op); ACPI_FUNCTION_TRACE_PTR(ds_create_node, op);
/* /*
* Because of the execution pass through the non-control-method * Because of the execution pass through the non-control-method
...@@ -408,6 +412,7 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state, ...@@ -408,6 +412,7 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state,
} }
if (!op->common.value.arg) { if (!op->common.value.arg) {
/* No arguments, there is nothing to do */ /* No arguments, there is nothing to do */
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -464,11 +469,12 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -464,11 +469,12 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("ds_init_object_from_op"); ACPI_FUNCTION_TRACE(ds_init_object_from_op);
obj_desc = *ret_obj_desc; obj_desc = *ret_obj_desc;
op_info = acpi_ps_get_opcode_info(opcode); op_info = acpi_ps_get_opcode_info(opcode);
if (op_info->class == AML_CLASS_UNKNOWN) { if (op_info->class == AML_CLASS_UNKNOWN) {
/* Unknown opcode */ /* Unknown opcode */
return_ACPI_STATUS(AE_TYPE); return_ACPI_STATUS(AE_TYPE);
...@@ -626,6 +632,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, ...@@ -626,6 +632,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
default: /* Other literals, etc.. */ default: /* Other literals, etc.. */
if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) { if (op->common.aml_opcode == 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;
......
...@@ -91,7 +91,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node, ...@@ -91,7 +91,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node,
union acpi_parse_object *op; union acpi_parse_object *op;
struct acpi_walk_state *walk_state; struct acpi_walk_state *walk_state;
ACPI_FUNCTION_TRACE("ds_execute_arguments"); ACPI_FUNCTION_TRACE(ds_execute_arguments);
/* /*
* Allocate a new parser op to be the root of the parsed tree * Allocate a new parser op to be the root of the parsed tree
...@@ -193,7 +193,7 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc) ...@@ -193,7 +193,7 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ds_get_buffer_field_arguments", obj_desc); ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_field_arguments, obj_desc);
if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -206,7 +206,7 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc) ...@@ -206,7 +206,7 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
(ACPI_TYPE_BUFFER_FIELD, node, NULL)); (ACPI_TYPE_BUFFER_FIELD, node, NULL));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
acpi_ut_get_node_name(node))); acpi_ut_get_node_name(node)));
/* Execute the AML code for the term_arg arguments */ /* Execute the AML code for the term_arg arguments */
...@@ -235,7 +235,7 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc) ...@@ -235,7 +235,7 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc)
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ds_get_buffer_arguments", obj_desc); ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_arguments, obj_desc);
if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -279,7 +279,7 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc) ...@@ -279,7 +279,7 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ds_get_package_arguments", obj_desc); ACPI_FUNCTION_TRACE_PTR(ds_get_package_arguments, obj_desc);
if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -324,7 +324,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) ...@@ -324,7 +324,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
acpi_status status; acpi_status status;
union acpi_operand_object *extra_desc; union acpi_operand_object *extra_desc;
ACPI_FUNCTION_TRACE_PTR("ds_get_region_arguments", obj_desc); ACPI_FUNCTION_TRACE_PTR(ds_get_region_arguments, obj_desc);
if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -342,8 +342,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) ...@@ -342,8 +342,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
(ACPI_TYPE_REGION, node, NULL)); (ACPI_TYPE_REGION, node, NULL));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n",
"[%4.4s] op_region Arg Init at AML %p\n",
acpi_ut_get_node_name(node), acpi_ut_get_node_name(node),
extra_desc->extra.aml_start)); extra_desc->extra.aml_start));
...@@ -352,6 +351,28 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) ...@@ -352,6 +351,28 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node),
extra_desc->extra.aml_length, extra_desc->extra.aml_length,
extra_desc->extra.aml_start); extra_desc->extra.aml_start);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Validate the region address/length via the host OS */
status = acpi_os_validate_address(obj_desc->region.space_id,
obj_desc->region.address,
(acpi_size) obj_desc->region.length);
if (ACPI_FAILURE(status)) {
/*
* Invalid address/length. We will emit an error message and mark
* the region as invalid, so that it will cause an additional error if
* it is ever used. Then return AE_OK.
*/
ACPI_EXCEPTION((AE_INFO, status,
"During address validation of OpRegion [%4.4s]",
node->name.ascii));
obj_desc->common.flags |= AOPOBJ_INVALID;
status = AE_OK;
}
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -411,7 +432,7 @@ acpi_ds_init_buffer_field(u16 aml_opcode, ...@@ -411,7 +432,7 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
u8 field_flags; u8 field_flags;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ds_init_buffer_field", obj_desc); ACPI_FUNCTION_TRACE_PTR(ds_init_buffer_field, obj_desc);
/* Host object must be a Buffer */ /* Host object must be a Buffer */
...@@ -457,7 +478,7 @@ acpi_ds_init_buffer_field(u16 aml_opcode, ...@@ -457,7 +478,7 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
if (bit_count == 0) { if (bit_count == 0) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Attempt to create_field of length zero")); "Attempt to CreateField of length zero"));
status = AE_AML_OPERAND_VALUE; status = AE_AML_OPERAND_VALUE;
goto cleanup; goto cleanup;
} }
...@@ -595,7 +616,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, ...@@ -595,7 +616,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
union acpi_parse_object *next_op; union acpi_parse_object *next_op;
ACPI_FUNCTION_TRACE_PTR("ds_eval_buffer_field_operands", op); ACPI_FUNCTION_TRACE_PTR(ds_eval_buffer_field_operands, op);
/* /*
* This is where we evaluate the address and length fields of the * This is where we evaluate the address and length fields of the
...@@ -627,7 +648,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, ...@@ -627,7 +648,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,
acpi_ps_get_opcode_name(op->common.aml_opcode), acpi_ps_get_opcode_name(op->common.aml_opcode),
walk_state->num_operands, walk_state->num_operands,
"after acpi_ex_resolve_operands"); "after AcpiExResolveOperands");
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)", ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)",
...@@ -640,6 +661,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, ...@@ -640,6 +661,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
/* Initialize the Buffer Field */ /* Initialize the Buffer Field */
if (op->common.aml_opcode == AML_CREATE_FIELD_OP) { if (op->common.aml_opcode == AML_CREATE_FIELD_OP) {
/* NOTE: Slightly different operands for this opcode */ /* NOTE: Slightly different operands for this opcode */
status = status =
...@@ -685,7 +707,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, ...@@ -685,7 +707,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
union acpi_parse_object *next_op; union acpi_parse_object *next_op;
ACPI_FUNCTION_TRACE_PTR("ds_eval_region_operands", op); ACPI_FUNCTION_TRACE_PTR(ds_eval_region_operands, op);
/* /*
* This is where we evaluate the address and length fields of the * This is where we evaluate the address and length fields of the
...@@ -718,7 +740,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, ...@@ -718,7 +740,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,
acpi_ps_get_opcode_name(op->common.aml_opcode), acpi_ps_get_opcode_name(op->common.aml_opcode),
1, "after acpi_ex_resolve_operands"); 1, "after AcpiExResolveOperands");
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (!obj_desc) { if (!obj_desc) {
...@@ -744,7 +766,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, ...@@ -744,7 +766,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
operand_desc->integer.value; operand_desc->integer.value;
acpi_ut_remove_reference(operand_desc); acpi_ut_remove_reference(operand_desc);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
obj_desc, obj_desc,
ACPI_FORMAT_UINT64(obj_desc->region.address), ACPI_FORMAT_UINT64(obj_desc->region.address),
obj_desc->region.length)); obj_desc->region.length));
...@@ -780,7 +802,7 @@ acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state, ...@@ -780,7 +802,7 @@ acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state,
union acpi_operand_object *arg_desc; union acpi_operand_object *arg_desc;
u32 length; u32 length;
ACPI_FUNCTION_TRACE("ds_eval_data_object_operands"); ACPI_FUNCTION_TRACE(ds_eval_data_object_operands);
/* The first operand (for all of these data objects) is the length */ /* The first operand (for all of these data objects) is the length */
...@@ -874,7 +896,7 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, ...@@ -874,7 +896,7 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
acpi_status status = AE_OK; acpi_status status = AE_OK;
union acpi_generic_state *control_state; union acpi_generic_state *control_state;
ACPI_FUNCTION_NAME("ds_exec_begin_control_op"); ACPI_FUNCTION_NAME(ds_exec_begin_control_op);
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", op, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", op,
op->common.aml_opcode, walk_state)); op->common.aml_opcode, walk_state));
...@@ -952,7 +974,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -952,7 +974,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
acpi_status status = AE_OK; acpi_status status = AE_OK;
union acpi_generic_state *control_state; union acpi_generic_state *control_state;
ACPI_FUNCTION_NAME("ds_exec_end_control_op"); ACPI_FUNCTION_NAME(ds_exec_end_control_op);
switch (op->common.aml_opcode) { switch (op->common.aml_opcode) {
case AML_IF_OP: case AML_IF_OP:
...@@ -984,6 +1006,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -984,6 +1006,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op)); ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op));
if (walk_state->control_state->common.value) { if (walk_state->control_state->common.value) {
/* Predicate was true, go back and evaluate it again! */ /* Predicate was true, go back and evaluate it again! */
status = AE_CTRL_PENDING; status = AE_CTRL_PENDING;
...@@ -1014,6 +1037,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -1014,6 +1037,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
* has been bubbled up the tree * has been bubbled up the tree
*/ */
if (op->common.value.arg) { if (op->common.value.arg) {
/* Since we have a real Return(), delete any implicit return */ /* Since we have a real Return(), delete any implicit return */
acpi_ds_clear_implicit_return(walk_state); acpi_ds_clear_implicit_return(walk_state);
...@@ -1047,6 +1071,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -1047,6 +1071,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
walk_state->return_desc = walk_state->operands[0]; walk_state->return_desc = walk_state->operands[0];
} else if ((walk_state->results) && } else if ((walk_state->results) &&
(walk_state->results->results.num_results > 0)) { (walk_state->results->results.num_results > 0)) {
/* Since we have a real Return(), delete any implicit return */ /* Since we have a real Return(), delete any implicit return */
acpi_ds_clear_implicit_return(walk_state); acpi_ds_clear_implicit_return(walk_state);
...@@ -1095,7 +1120,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, ...@@ -1095,7 +1120,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
} }
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"Completed RETURN_OP State=%p, ret_val=%p\n", "Completed RETURN_OP State=%p, RetVal=%p\n",
walk_state, walk_state->return_desc)); walk_state, walk_state->return_desc));
/* End the control method execution right now */ /* End the control method execution right now */
......
...@@ -68,7 +68,7 @@ ACPI_MODULE_NAME("dsutils") ...@@ -68,7 +68,7 @@ ACPI_MODULE_NAME("dsutils")
******************************************************************************/ ******************************************************************************/
void acpi_ds_clear_implicit_return(struct acpi_walk_state *walk_state) void acpi_ds_clear_implicit_return(struct acpi_walk_state *walk_state)
{ {
ACPI_FUNCTION_NAME("ds_clear_implicit_return"); ACPI_FUNCTION_NAME(ds_clear_implicit_return);
/* /*
* Slack must be enabled for this feature * Slack must be enabled for this feature
...@@ -115,7 +115,7 @@ u8 ...@@ -115,7 +115,7 @@ u8
acpi_ds_do_implicit_return(union acpi_operand_object *return_desc, acpi_ds_do_implicit_return(union acpi_operand_object *return_desc,
struct acpi_walk_state *walk_state, u8 add_reference) struct acpi_walk_state *walk_state, u8 add_reference)
{ {
ACPI_FUNCTION_NAME("ds_do_implicit_return"); ACPI_FUNCTION_NAME(ds_do_implicit_return);
/* /*
* Slack must be enabled for this feature, and we must * Slack must be enabled for this feature, and we must
...@@ -171,7 +171,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op, ...@@ -171,7 +171,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
{ {
const struct acpi_opcode_info *parent_info; const struct acpi_opcode_info *parent_info;
ACPI_FUNCTION_TRACE_PTR("ds_is_result_used", op); ACPI_FUNCTION_TRACE_PTR(ds_is_result_used, op);
/* Must have both an Op and a Result Object */ /* Must have both an Op and a Result Object */
...@@ -202,6 +202,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op, ...@@ -202,6 +202,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
*/ */
if ((!op->common.parent) || if ((!op->common.parent) ||
(op->common.parent->common.aml_opcode == AML_SCOPE_OP)) { (op->common.parent->common.aml_opcode == AML_SCOPE_OP)) {
/* No parent, the return value cannot possibly be used */ /* No parent, the return value cannot possibly be used */
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
...@@ -340,7 +341,7 @@ acpi_ds_delete_result_if_not_used(union acpi_parse_object *op, ...@@ -340,7 +341,7 @@ acpi_ds_delete_result_if_not_used(union acpi_parse_object *op,
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ds_delete_result_if_not_used", result_obj); ACPI_FUNCTION_TRACE_PTR(ds_delete_result_if_not_used, result_obj);
if (!op) { if (!op) {
ACPI_ERROR((AE_INFO, "Null Op")); ACPI_ERROR((AE_INFO, "Null Op"));
...@@ -352,6 +353,7 @@ acpi_ds_delete_result_if_not_used(union acpi_parse_object *op, ...@@ -352,6 +353,7 @@ acpi_ds_delete_result_if_not_used(union acpi_parse_object *op,
} }
if (!acpi_ds_is_result_used(op, walk_state)) { if (!acpi_ds_is_result_used(op, walk_state)) {
/* Must pop the result stack (obj_desc should be equal to result_obj) */ /* Must pop the result stack (obj_desc should be equal to result_obj) */
status = acpi_ds_result_pop(&obj_desc, walk_state); status = acpi_ds_result_pop(&obj_desc, walk_state);
...@@ -382,7 +384,7 @@ acpi_status acpi_ds_resolve_operands(struct acpi_walk_state *walk_state) ...@@ -382,7 +384,7 @@ acpi_status acpi_ds_resolve_operands(struct acpi_walk_state *walk_state)
u32 i; u32 i;
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE_PTR("ds_resolve_operands", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_resolve_operands, walk_state);
/* /*
* Attempt to resolve each of the valid operands * Attempt to resolve each of the valid operands
...@@ -417,7 +419,7 @@ void acpi_ds_clear_operands(struct acpi_walk_state *walk_state) ...@@ -417,7 +419,7 @@ void acpi_ds_clear_operands(struct acpi_walk_state *walk_state)
{ {
u32 i; u32 i;
ACPI_FUNCTION_TRACE_PTR("ds_clear_operands", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_clear_operands, walk_state);
/* Remove a reference on each operand on the stack */ /* Remove a reference on each operand on the stack */
...@@ -465,7 +467,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -465,7 +467,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
acpi_interpreter_mode interpreter_mode; acpi_interpreter_mode interpreter_mode;
const struct acpi_opcode_info *op_info; const struct acpi_opcode_info *op_info;
ACPI_FUNCTION_TRACE_PTR("ds_create_operand", arg); ACPI_FUNCTION_TRACE_PTR(ds_create_operand, arg);
/* A valid name must be looked up in the namespace */ /* A valid name must be looked up in the namespace */
...@@ -498,7 +500,9 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -498,7 +500,9 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
*/ */
if ((walk_state->deferred_node) && if ((walk_state->deferred_node) &&
(walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD)
&& (arg_index != 0)) { && (arg_index ==
(u32) ((walk_state->opcode ==
AML_CREATE_FIELD_OP) ? 3 : 2))) {
obj_desc = obj_desc =
ACPI_CAST_PTR(union acpi_operand_object, ACPI_CAST_PTR(union acpi_operand_object,
walk_state->deferred_node); walk_state->deferred_node);
...@@ -521,6 +525,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -521,6 +525,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
&& (parent_op->common.aml_opcode != AML_REGION_OP) && (parent_op->common.aml_opcode != AML_REGION_OP)
&& (parent_op->common.aml_opcode != && (parent_op->common.aml_opcode !=
AML_INT_NAMEPATH_OP)) { AML_INT_NAMEPATH_OP)) {
/* Enter name into namespace if not found */ /* Enter name into namespace if not found */
interpreter_mode = ACPI_IMODE_LOAD_PASS2; interpreter_mode = ACPI_IMODE_LOAD_PASS2;
...@@ -572,7 +577,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state, ...@@ -572,7 +577,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
/* Free the namestring created above */ /* Free the namestring created above */
ACPI_MEM_FREE(name_string); ACPI_FREE(name_string);
/* Check status from the lookup */ /* Check status from the lookup */
...@@ -696,7 +701,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state, ...@@ -696,7 +701,7 @@ acpi_ds_create_operands(struct acpi_walk_state *walk_state,
union acpi_parse_object *arg; union acpi_parse_object *arg;
u32 arg_count = 0; u32 arg_count = 0;
ACPI_FUNCTION_TRACE_PTR("ds_create_operands", first_arg); ACPI_FUNCTION_TRACE_PTR(ds_create_operands, first_arg);
/* For all arguments in the list... */ /* For all arguments in the list... */
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acdebug.h> #include <acpi/acdebug.h>
#include <acpi/acdisasm.h>
#define _COMPONENT ACPI_DISPATCHER #define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME("dswexec") ACPI_MODULE_NAME("dswexec")
...@@ -93,7 +92,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -93,7 +92,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
union acpi_operand_object *local_obj_desc = NULL; union acpi_operand_object *local_obj_desc = NULL;
ACPI_FUNCTION_TRACE_PTR("ds_get_predicate_value", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_get_predicate_value, walk_state);
walk_state->control_state->common.state = 0; walk_state->control_state->common.state = 0;
...@@ -123,7 +122,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -123,7 +122,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
if (!obj_desc) { if (!obj_desc) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"No predicate obj_desc=%p State=%p", "No predicate ObjDesc=%p State=%p",
obj_desc, walk_state)); obj_desc, walk_state));
return_ACPI_STATUS(AE_AML_NO_OPERAND); return_ACPI_STATUS(AE_AML_NO_OPERAND);
...@@ -140,7 +139,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -140,7 +139,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) { if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Bad predicate (not an integer) obj_desc=%p State=%p Type=%X", "Bad predicate (not an integer) ObjDesc=%p State=%p Type=%X",
obj_desc, walk_state, obj_desc, walk_state,
ACPI_GET_OBJECT_TYPE(obj_desc))); ACPI_GET_OBJECT_TYPE(obj_desc)));
...@@ -214,7 +213,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, ...@@ -214,7 +213,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
acpi_status status = AE_OK; acpi_status status = AE_OK;
u32 opcode_class; u32 opcode_class;
ACPI_FUNCTION_TRACE_PTR("ds_exec_begin_op", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_exec_begin_op, walk_state);
op = walk_state->op; op = walk_state->op;
if (!op) { if (!op) {
...@@ -296,7 +295,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, ...@@ -296,7 +295,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
case AML_CLASS_NAMED_OBJECT: case AML_CLASS_NAMED_OBJECT:
if (walk_state->walk_type == ACPI_WALK_METHOD) { if (walk_state->walk_type & ACPI_WALK_METHOD) {
/* /*
* Found a named object declaration during method execution; * Found a named object declaration during method execution;
* we must enter this object into the namespace. The created * we must enter this object into the namespace. The created
...@@ -354,7 +353,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -354,7 +353,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
union acpi_parse_object *next_op; union acpi_parse_object *next_op;
union acpi_parse_object *first_arg; union acpi_parse_object *first_arg;
ACPI_FUNCTION_TRACE_PTR("ds_exec_end_op", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_exec_end_op, walk_state);
op = walk_state->op; op = walk_state->op;
op_type = walk_state->op_info->type; op_type = walk_state->op_info->type;
...@@ -409,6 +408,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -409,6 +408,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
* being the object_type and size_of operators. * being the object_type and size_of operators.
*/ */
if (!(walk_state->op_info->flags & AML_NO_OPERAND_RESOLVE)) { if (!(walk_state->op_info->flags & AML_NO_OPERAND_RESOLVE)) {
/* Resolve all operands */ /* Resolve all operands */
status = acpi_ex_resolve_operands(walk_state->opcode, status = acpi_ex_resolve_operands(walk_state->opcode,
...@@ -423,7 +423,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -423,7 +423,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
acpi_ps_get_opcode_name acpi_ps_get_opcode_name
(walk_state->opcode), (walk_state->opcode),
walk_state->num_operands, walk_state->num_operands,
"after ex_resolve_operands"); "after ExResolveOperands");
} }
} }
...@@ -437,7 +437,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -437,7 +437,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
acpi_gbl_op_type_dispatch[op_type] (walk_state); acpi_gbl_op_type_dispatch[op_type] (walk_state);
} else { } else {
/* /*
* Treat constructs of the form "Store(local_x,local_x)" as noops when the * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the
* Local is uninitialized. * Local is uninitialized.
*/ */
if ((status == AE_AML_UNINITIALIZED_LOCAL) && if ((status == AE_AML_UNINITIALIZED_LOCAL) &&
...@@ -548,6 +548,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -548,6 +548,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
*/ */
status = acpi_ds_resolve_operands(walk_state); status = acpi_ds_resolve_operands(walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* On error, clear all resolved operands */ /* On error, clear all resolved operands */
acpi_ds_clear_operands(walk_state); acpi_ds_clear_operands(walk_state);
...@@ -569,7 +570,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -569,7 +570,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
case AML_TYPE_CREATE_FIELD: case AML_TYPE_CREATE_FIELD:
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Executing create_field Buffer/Index Op=%p\n", "Executing CreateField Buffer/Index Op=%p\n",
op)); op));
status = acpi_ds_load2_end_op(walk_state); status = acpi_ds_load2_end_op(walk_state);
...@@ -584,7 +585,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -584,7 +585,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
case AML_TYPE_CREATE_OBJECT: case AML_TYPE_CREATE_OBJECT:
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Executing create_object (Buffer/Package) Op=%p\n", "Executing CreateObject (Buffer/Package) Op=%p\n",
op)); op));
switch (op->common.parent->common.aml_opcode) { switch (op->common.parent->common.aml_opcode) {
...@@ -657,7 +658,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -657,7 +658,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
if (op->common.aml_opcode == AML_REGION_OP) { if (op->common.aml_opcode == AML_REGION_OP) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Executing op_region Address/Length Op=%p\n", "Executing OpRegion Address/Length Op=%p\n",
op)); op));
status = status =
...@@ -722,6 +723,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) ...@@ -722,6 +723,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
cleanup: cleanup:
if (walk_state->result_obj) { if (walk_state->result_obj) {
/* Break to debugger to display result */ /* Break to debugger to display result */
ACPI_DEBUGGER_EXEC(acpi_db_display_result_object ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
......
...@@ -127,7 +127,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -127,7 +127,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
char *path; char *path;
u32 flags; u32 flags;
ACPI_FUNCTION_TRACE("ds_load1_begin_op"); ACPI_FUNCTION_TRACE(ds_load1_begin_op);
op = walk_state->op; op = walk_state->op;
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
...@@ -178,12 +178,12 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -178,12 +178,12 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
* Target of Scope() not found. Generate an External for it, and * Target of Scope() not found. Generate an External for it, and
* insert the name into the namespace. * insert the name into the namespace.
*/ */
acpi_dm_add_to_external_list(path); acpi_dm_add_to_external_list(path, ACPI_TYPE_DEVICE, 0);
status = status =
acpi_ns_lookup(walk_state->scope_info, path, acpi_ns_lookup(walk_state->scope_info, path,
object_type, ACPI_IMODE_LOAD_PASS1, object_type, ACPI_IMODE_LOAD_PASS1,
ACPI_NS_SEARCH_PARENT, walk_state, ACPI_NS_SEARCH_PARENT, walk_state,
&(node)); &node);
} }
#endif #endif
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -261,6 +261,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -261,6 +261,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
*/ */
if (walk_state->deferred_node) { if (walk_state->deferred_node) {
/* This name is already in the namespace, get the node */ /* This name is already in the namespace, get the node */
node = walk_state->deferred_node; node = walk_state->deferred_node;
...@@ -300,10 +301,41 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -300,10 +301,41 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
status = status =
acpi_ns_lookup(walk_state->scope_info, path, object_type, acpi_ns_lookup(walk_state->scope_info, path, object_type,
ACPI_IMODE_LOAD_PASS1, flags, walk_state, ACPI_IMODE_LOAD_PASS1, flags, walk_state,
&(node)); &node);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR_NAMESPACE(path, status); if (status == AE_ALREADY_EXISTS) {
return_ACPI_STATUS(status);
/* The name already exists in this scope */
if (node->flags & ANOBJ_IS_EXTERNAL) {
/*
* Allow one create on an object or segment that was
* previously declared External
*/
node->flags &= ~ANOBJ_IS_EXTERNAL;
node->type = (u8) object_type;
/* Just retyped a node, probably will need to open a scope */
if (acpi_ns_opens_scope(object_type)) {
status =
acpi_ds_scope_stack_push
(node, object_type,
walk_state);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS
(status);
}
}
status = AE_OK;
}
}
if (ACPI_FAILURE(status)) {
ACPI_ERROR_NAMESPACE(path, status);
return_ACPI_STATUS(status);
}
} }
break; break;
} }
...@@ -311,6 +343,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, ...@@ -311,6 +343,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
/* Common exit */ /* Common exit */
if (!op) { if (!op) {
/* Create a new op */ /* Create a new op */
op = acpi_ps_alloc_op(walk_state->opcode); op = acpi_ps_alloc_op(walk_state->opcode);
...@@ -359,7 +392,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state) ...@@ -359,7 +392,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
acpi_object_type object_type; acpi_object_type object_type;
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("ds_load1_end_op"); ACPI_FUNCTION_TRACE(ds_load1_end_op);
op = walk_state->op; op = walk_state->op;
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
...@@ -413,6 +446,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state) ...@@ -413,6 +446,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
#endif #endif
if (op->common.aml_opcode == AML_NAME_OP) { if (op->common.aml_opcode == AML_NAME_OP) {
/* For Name opcode, get the object type from the argument */ /* For Name opcode, get the object type from the argument */
if (op->common.value.arg) { if (op->common.value.arg) {
...@@ -445,7 +479,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state) ...@@ -445,7 +479,7 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
* arguments.) * arguments.)
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"LOADING-Method: State=%p Op=%p named_obj=%p\n", "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
walk_state, op, op->named.node)); walk_state, op, op->named.node));
if (!acpi_ns_get_attached_object(op->named.node)) { if (!acpi_ns_get_attached_object(op->named.node)) {
...@@ -511,7 +545,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, ...@@ -511,7 +545,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
acpi_object_type object_type; acpi_object_type object_type;
char *buffer_ptr; char *buffer_ptr;
ACPI_FUNCTION_TRACE("ds_load2_begin_op"); ACPI_FUNCTION_TRACE(ds_load2_begin_op);
op = walk_state->op; op = walk_state->op;
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
...@@ -521,6 +555,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, ...@@ -521,6 +555,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
if ((walk_state->control_state) && if ((walk_state->control_state) &&
(walk_state->control_state->common.state == (walk_state->control_state->common.state ==
ACPI_CONTROL_CONDITIONAL_EXECUTING)) { ACPI_CONTROL_CONDITIONAL_EXECUTING)) {
/* We are executing a while loop outside of a method */ /* We are executing a while loop outside of a method */
status = acpi_ds_exec_begin_op(walk_state, out_op); status = acpi_ds_exec_begin_op(walk_state, out_op);
...@@ -554,10 +589,12 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, ...@@ -554,10 +589,12 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
/* Get the name we are going to enter or lookup in the namespace */ /* Get the name we are going to enter or lookup in the namespace */
if (walk_state->opcode == AML_INT_NAMEPATH_OP) { if (walk_state->opcode == AML_INT_NAMEPATH_OP) {
/* For Namepath op, get the path string */ /* For Namepath op, get the path string */
buffer_ptr = op->common.value.string; buffer_ptr = op->common.value.string;
if (!buffer_ptr) { if (!buffer_ptr) {
/* No name, just exit */ /* No name, just exit */
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -680,6 +717,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, ...@@ -680,6 +717,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
/* All other opcodes */ /* All other opcodes */
if (op && op->common.node) { if (op && op->common.node) {
/* This op/node was previously entered into the namespace */ /* This op/node was previously entered into the namespace */
node = op->common.node; node = op->common.node;
...@@ -705,6 +743,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, ...@@ -705,6 +743,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
* Note: Name may already exist if we are executing a deferred opcode. * Note: Name may already exist if we are executing a deferred opcode.
*/ */
if (walk_state->deferred_node) { if (walk_state->deferred_node) {
/* This name is already in the namespace, get the node */ /* This name is already in the namespace, get the node */
node = walk_state->deferred_node; node = walk_state->deferred_node;
...@@ -727,6 +766,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, ...@@ -727,6 +766,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
} }
if (!op) { if (!op) {
/* Create a new op */ /* Create a new op */
op = acpi_ps_alloc_op(walk_state->opcode); op = acpi_ps_alloc_op(walk_state->opcode);
...@@ -776,7 +816,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) ...@@ -776,7 +816,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
u32 i; u32 i;
#endif #endif
ACPI_FUNCTION_TRACE("ds_load2_end_op"); ACPI_FUNCTION_TRACE(ds_load2_end_op);
op = walk_state->op; op = walk_state->op;
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n", ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",
...@@ -870,7 +910,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) ...@@ -870,7 +910,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"Create-Load [%s] State=%p Op=%p named_obj=%p\n", "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",
acpi_ps_get_opcode_name(op->common.aml_opcode), acpi_ps_get_opcode_name(op->common.aml_opcode),
walk_state, op, node)); walk_state, op, node));
...@@ -1045,7 +1085,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) ...@@ -1045,7 +1085,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
* arguments.) * arguments.)
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"LOADING-Method: State=%p Op=%p named_obj=%p\n", "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
walk_state, op, op->named.node)); walk_state, op, op->named.node));
if (!acpi_ns_get_attached_object(op->named.node)) { if (!acpi_ns_get_attached_object(op->named.node)) {
...@@ -1090,7 +1130,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) ...@@ -1090,7 +1130,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
case AML_CLASS_METHOD_CALL: case AML_CLASS_METHOD_CALL:
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"RESOLVING-method_call: State=%p Op=%p named_obj=%p\n", "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",
walk_state, op, node)); walk_state, op, node));
/* /*
...@@ -1104,7 +1144,6 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) ...@@ -1104,7 +1144,6 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
ACPI_NS_DONT_OPEN_SCOPE, walk_state, ACPI_NS_DONT_OPEN_SCOPE, walk_state,
&(new_node)); &(new_node));
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
/* /*
* Make sure that what we found is indeed a method * Make sure that what we found is indeed a method
* We didn't search for a method on purpose, to see if the name * We didn't search for a method on purpose, to see if the name
......
...@@ -63,9 +63,10 @@ void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state) ...@@ -63,9 +63,10 @@ void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state)
{ {
union acpi_generic_state *scope_info; union acpi_generic_state *scope_info;
ACPI_FUNCTION_NAME("ds_scope_stack_clear"); ACPI_FUNCTION_NAME(ds_scope_stack_clear);
while (walk_state->scope_info) { while (walk_state->scope_info) {
/* Pop a scope off the stack */ /* Pop a scope off the stack */
scope_info = walk_state->scope_info; scope_info = walk_state->scope_info;
...@@ -102,9 +103,10 @@ acpi_ds_scope_stack_push(struct acpi_namespace_node *node, ...@@ -102,9 +103,10 @@ acpi_ds_scope_stack_push(struct acpi_namespace_node *node,
union acpi_generic_state *scope_info; union acpi_generic_state *scope_info;
union acpi_generic_state *old_scope_info; union acpi_generic_state *old_scope_info;
ACPI_FUNCTION_TRACE("ds_scope_stack_push"); ACPI_FUNCTION_TRACE(ds_scope_stack_push);
if (!node) { if (!node) {
/* Invalid scope */ /* Invalid scope */
ACPI_ERROR((AE_INFO, "Null scope parameter")); ACPI_ERROR((AE_INFO, "Null scope parameter"));
...@@ -126,7 +128,7 @@ acpi_ds_scope_stack_push(struct acpi_namespace_node *node, ...@@ -126,7 +128,7 @@ acpi_ds_scope_stack_push(struct acpi_namespace_node *node,
/* Init new scope object */ /* Init new scope object */
scope_info->common.data_type = ACPI_DESC_TYPE_STATE_WSCOPE; scope_info->common.descriptor_type = ACPI_DESC_TYPE_STATE_WSCOPE;
scope_info->scope.node = node; scope_info->scope.node = node;
scope_info->common.value = (u16) type; scope_info->common.value = (u16) type;
...@@ -176,7 +178,7 @@ acpi_status acpi_ds_scope_stack_pop(struct acpi_walk_state *walk_state) ...@@ -176,7 +178,7 @@ acpi_status acpi_ds_scope_stack_pop(struct acpi_walk_state *walk_state)
union acpi_generic_state *scope_info; union acpi_generic_state *scope_info;
union acpi_generic_state *new_scope_info; union acpi_generic_state *new_scope_info;
ACPI_FUNCTION_TRACE("ds_scope_stack_pop"); ACPI_FUNCTION_TRACE(ds_scope_stack_pop);
/* /*
* Pop scope info object off the stack. * Pop scope info object off the stack.
......
...@@ -66,7 +66,6 @@ void *acpi_ds_obj_stack_get_value(u32 index, ...@@ -66,7 +66,6 @@ void *acpi_ds_obj_stack_get_value(u32 index,
#endif #endif
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ds_result_remove * FUNCTION: acpi_ds_result_remove
...@@ -88,7 +87,7 @@ acpi_ds_result_remove(union acpi_operand_object **object, ...@@ -88,7 +87,7 @@ acpi_ds_result_remove(union acpi_operand_object **object,
{ {
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_remove"); ACPI_FUNCTION_NAME(ds_result_remove);
state = walk_state->results; state = walk_state->results;
if (!state) { if (!state) {
...@@ -128,7 +127,6 @@ acpi_ds_result_remove(union acpi_operand_object **object, ...@@ -128,7 +127,6 @@ acpi_ds_result_remove(union acpi_operand_object **object,
return (AE_OK); return (AE_OK);
} }
#endif /* ACPI_FUTURE_USAGE */ #endif /* ACPI_FUTURE_USAGE */
/******************************************************************************* /*******************************************************************************
...@@ -152,7 +150,7 @@ acpi_ds_result_pop(union acpi_operand_object ** object, ...@@ -152,7 +150,7 @@ acpi_ds_result_pop(union acpi_operand_object ** object,
acpi_native_uint index; acpi_native_uint index;
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_pop"); ACPI_FUNCTION_NAME(ds_result_pop);
state = walk_state->results; state = walk_state->results;
if (!state) { if (!state) {
...@@ -170,6 +168,7 @@ acpi_ds_result_pop(union acpi_operand_object ** object, ...@@ -170,6 +168,7 @@ acpi_ds_result_pop(union acpi_operand_object ** object,
state->results.num_results--; state->results.num_results--;
for (index = ACPI_OBJ_NUM_OPERANDS; index; index--) { for (index = ACPI_OBJ_NUM_OPERANDS; index; index--) {
/* Check for a valid result object */ /* Check for a valid result object */
if (state->results.obj_desc[index - 1]) { if (state->results.obj_desc[index - 1]) {
...@@ -213,7 +212,7 @@ acpi_ds_result_pop_from_bottom(union acpi_operand_object ** object, ...@@ -213,7 +212,7 @@ acpi_ds_result_pop_from_bottom(union acpi_operand_object ** object,
acpi_native_uint index; acpi_native_uint index;
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_pop_from_bottom"); ACPI_FUNCTION_NAME(ds_result_pop_from_bottom);
state = walk_state->results; state = walk_state->results;
if (!state) { if (!state) {
...@@ -278,7 +277,7 @@ acpi_ds_result_push(union acpi_operand_object * object, ...@@ -278,7 +277,7 @@ acpi_ds_result_push(union acpi_operand_object * object,
{ {
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_push"); ACPI_FUNCTION_NAME(ds_result_push);
state = walk_state->results; state = walk_state->results;
if (!state) { if (!state) {
...@@ -331,14 +330,14 @@ acpi_status acpi_ds_result_stack_push(struct acpi_walk_state * walk_state) ...@@ -331,14 +330,14 @@ acpi_status acpi_ds_result_stack_push(struct acpi_walk_state * walk_state)
{ {
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_stack_push"); ACPI_FUNCTION_NAME(ds_result_stack_push);
state = acpi_ut_create_generic_state(); state = acpi_ut_create_generic_state();
if (!state) { if (!state) {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
state->common.data_type = ACPI_DESC_TYPE_STATE_RESULT; state->common.descriptor_type = ACPI_DESC_TYPE_STATE_RESULT;
acpi_ut_push_generic_state(&walk_state->results, state); acpi_ut_push_generic_state(&walk_state->results, state);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Results=%p State=%p\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Results=%p State=%p\n",
...@@ -363,7 +362,7 @@ acpi_status acpi_ds_result_stack_pop(struct acpi_walk_state * walk_state) ...@@ -363,7 +362,7 @@ acpi_status acpi_ds_result_stack_pop(struct acpi_walk_state * walk_state)
{ {
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_stack_pop"); ACPI_FUNCTION_NAME(ds_result_stack_pop);
/* Check for stack underflow */ /* Check for stack underflow */
...@@ -376,7 +375,7 @@ acpi_status acpi_ds_result_stack_pop(struct acpi_walk_state * walk_state) ...@@ -376,7 +375,7 @@ acpi_status acpi_ds_result_stack_pop(struct acpi_walk_state * walk_state)
state = acpi_ut_pop_generic_state(&walk_state->results); state = acpi_ut_pop_generic_state(&walk_state->results);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Result=%p remaining_results=%X State=%p\n", "Result=%p RemainingResults=%X State=%p\n",
state, state->results.num_results, walk_state)); state, state->results.num_results, walk_state));
acpi_ut_delete_generic_state(state); acpi_ut_delete_generic_state(state);
...@@ -400,7 +399,7 @@ acpi_status acpi_ds_result_stack_pop(struct acpi_walk_state * walk_state) ...@@ -400,7 +399,7 @@ acpi_status acpi_ds_result_stack_pop(struct acpi_walk_state * walk_state)
acpi_status acpi_status
acpi_ds_obj_stack_push(void *object, struct acpi_walk_state * walk_state) acpi_ds_obj_stack_push(void *object, struct acpi_walk_state * walk_state)
{ {
ACPI_FUNCTION_NAME("ds_obj_stack_push"); ACPI_FUNCTION_NAME(ds_obj_stack_push);
/* Check for stack overflow */ /* Check for stack overflow */
...@@ -445,9 +444,10 @@ acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state * walk_state) ...@@ -445,9 +444,10 @@ acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state * walk_state)
{ {
u32 i; u32 i;
ACPI_FUNCTION_NAME("ds_obj_stack_pop"); ACPI_FUNCTION_NAME(ds_obj_stack_pop);
for (i = 0; i < pop_count; i++) { for (i = 0; i < pop_count; i++) {
/* Check for stack underflow */ /* Check for stack underflow */
if (walk_state->num_operands == 0) { if (walk_state->num_operands == 0) {
...@@ -491,9 +491,10 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count, ...@@ -491,9 +491,10 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count,
u32 i; u32 i;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
ACPI_FUNCTION_NAME("ds_obj_stack_pop_and_delete"); ACPI_FUNCTION_NAME(ds_obj_stack_pop_and_delete);
for (i = 0; i < pop_count; i++) { for (i = 0; i < pop_count; i++) {
/* Check for stack underflow */ /* Check for stack underflow */
if (walk_state->num_operands == 0) { if (walk_state->num_operands == 0) {
...@@ -538,13 +539,13 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count, ...@@ -538,13 +539,13 @@ acpi_ds_obj_stack_pop_and_delete(u32 pop_count,
struct acpi_walk_state *acpi_ds_get_current_walk_state(struct acpi_thread_state struct acpi_walk_state *acpi_ds_get_current_walk_state(struct acpi_thread_state
*thread) *thread)
{ {
ACPI_FUNCTION_NAME("ds_get_current_walk_state"); ACPI_FUNCTION_NAME(ds_get_current_walk_state);
if (!thread) { if (!thread) {
return (NULL); return (NULL);
} }
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "Current walk_state %p\n", ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "Current WalkState %p\n",
thread->walk_state_list)); thread->walk_state_list));
return (thread->walk_state_list); return (thread->walk_state_list);
...@@ -567,7 +568,7 @@ void ...@@ -567,7 +568,7 @@ void
acpi_ds_push_walk_state(struct acpi_walk_state *walk_state, acpi_ds_push_walk_state(struct acpi_walk_state *walk_state,
struct acpi_thread_state *thread) struct acpi_thread_state *thread)
{ {
ACPI_FUNCTION_TRACE("ds_push_walk_state"); ACPI_FUNCTION_TRACE(ds_push_walk_state);
walk_state->next = thread->walk_state_list; walk_state->next = thread->walk_state_list;
thread->walk_state_list = walk_state; thread->walk_state_list = walk_state;
...@@ -593,11 +594,12 @@ struct acpi_walk_state *acpi_ds_pop_walk_state(struct acpi_thread_state *thread) ...@@ -593,11 +594,12 @@ struct acpi_walk_state *acpi_ds_pop_walk_state(struct acpi_thread_state *thread)
{ {
struct acpi_walk_state *walk_state; struct acpi_walk_state *walk_state;
ACPI_FUNCTION_TRACE("ds_pop_walk_state"); ACPI_FUNCTION_TRACE(ds_pop_walk_state);
walk_state = thread->walk_state_list; walk_state = thread->walk_state_list;
if (walk_state) { if (walk_state) {
/* Next walk state becomes the current walk state */ /* Next walk state becomes the current walk state */
thread->walk_state_list = walk_state->next; thread->walk_state_list = walk_state->next;
...@@ -618,7 +620,7 @@ struct acpi_walk_state *acpi_ds_pop_walk_state(struct acpi_thread_state *thread) ...@@ -618,7 +620,7 @@ struct acpi_walk_state *acpi_ds_pop_walk_state(struct acpi_thread_state *thread)
* *
* PARAMETERS: owner_id - ID for object creation * PARAMETERS: owner_id - ID for object creation
* Origin - Starting point for this walk * Origin - Starting point for this walk
* mth_desc - Method object * method_desc - Method object
* Thread - Current thread state * Thread - Current thread state
* *
* RETURN: Pointer to the new walk state. * RETURN: Pointer to the new walk state.
...@@ -632,24 +634,24 @@ struct acpi_walk_state *acpi_ds_create_walk_state(acpi_owner_id owner_id, ...@@ -632,24 +634,24 @@ struct acpi_walk_state *acpi_ds_create_walk_state(acpi_owner_id owner_id,
union acpi_parse_object union acpi_parse_object
*origin, *origin,
union acpi_operand_object union acpi_operand_object
*mth_desc, *method_desc,
struct acpi_thread_state struct acpi_thread_state
*thread) *thread)
{ {
struct acpi_walk_state *walk_state; struct acpi_walk_state *walk_state;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ds_create_walk_state"); ACPI_FUNCTION_TRACE(ds_create_walk_state);
walk_state = ACPI_MEM_CALLOCATE(sizeof(struct acpi_walk_state)); walk_state = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_walk_state));
if (!walk_state) { if (!walk_state) {
return_PTR(NULL); return_PTR(NULL);
} }
walk_state->data_type = ACPI_DESC_TYPE_WALK; walk_state->descriptor_type = ACPI_DESC_TYPE_WALK;
walk_state->method_desc = method_desc;
walk_state->owner_id = owner_id; walk_state->owner_id = owner_id;
walk_state->origin = origin; walk_state->origin = origin;
walk_state->method_desc = mth_desc;
walk_state->thread = thread; walk_state->thread = thread;
walk_state->parser_state.start_op = origin; walk_state->parser_state.start_op = origin;
...@@ -664,7 +666,7 @@ struct acpi_walk_state *acpi_ds_create_walk_state(acpi_owner_id owner_id, ...@@ -664,7 +666,7 @@ struct acpi_walk_state *acpi_ds_create_walk_state(acpi_owner_id owner_id,
status = acpi_ds_result_stack_push(walk_state); status = acpi_ds_result_stack_push(walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_MEM_FREE(walk_state); ACPI_FREE(walk_state);
return_PTR(NULL); return_PTR(NULL);
} }
...@@ -701,13 +703,13 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, ...@@ -701,13 +703,13 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state,
struct acpi_namespace_node *method_node, struct acpi_namespace_node *method_node,
u8 * aml_start, u8 * aml_start,
u32 aml_length, u32 aml_length,
struct acpi_parameter_info *info, u8 pass_number) struct acpi_evaluate_info *info, u8 pass_number)
{ {
acpi_status status; acpi_status status;
struct acpi_parse_state *parser_state = &walk_state->parser_state; struct acpi_parse_state *parser_state = &walk_state->parser_state;
union acpi_parse_object *extra_op; union acpi_parse_object *extra_op;
ACPI_FUNCTION_TRACE("ds_init_aml_walk"); ACPI_FUNCTION_TRACE(ds_init_aml_walk);
walk_state->parser_state.aml = walk_state->parser_state.aml =
walk_state->parser_state.aml_start = aml_start; walk_state->parser_state.aml_start = aml_start;
...@@ -778,6 +780,7 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state, ...@@ -778,6 +780,7 @@ acpi_ds_init_aml_walk(struct acpi_walk_state *walk_state,
} }
if (parser_state->start_node) { if (parser_state->start_node) {
/* Push start scope on scope stack and make it current */ /* Push start scope on scope stack and make it current */
status = status =
...@@ -810,21 +813,24 @@ void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state) ...@@ -810,21 +813,24 @@ void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state)
{ {
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_TRACE_PTR("ds_delete_walk_state", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_delete_walk_state, walk_state);
if (!walk_state) { if (!walk_state) {
return; return;
} }
if (walk_state->data_type != ACPI_DESC_TYPE_WALK) { if (walk_state->descriptor_type != ACPI_DESC_TYPE_WALK) {
ACPI_ERROR((AE_INFO, "%p is not a valid walk state", ACPI_ERROR((AE_INFO, "%p is not a valid walk state",
walk_state)); walk_state));
return; return;
} }
/* There should not be any open scopes */
if (walk_state->parser_state.scope) { if (walk_state->parser_state.scope) {
ACPI_ERROR((AE_INFO, "%p walk still has a scope list", ACPI_ERROR((AE_INFO, "%p walk still has a scope list",
walk_state)); walk_state));
acpi_ps_cleanup_scope(&walk_state->parser_state);
} }
/* Always must free any linked control states */ /* Always must free any linked control states */
...@@ -854,7 +860,7 @@ void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state) ...@@ -854,7 +860,7 @@ void acpi_ds_delete_walk_state(struct acpi_walk_state *walk_state)
acpi_ut_delete_generic_state(state); acpi_ut_delete_generic_state(state);
} }
ACPI_MEM_FREE(walk_state); ACPI_FREE(walk_state);
return_VOID; return_VOID;
} }
...@@ -879,7 +885,7 @@ acpi_ds_result_insert(void *object, ...@@ -879,7 +885,7 @@ acpi_ds_result_insert(void *object,
{ {
union acpi_generic_state *state; union acpi_generic_state *state;
ACPI_FUNCTION_NAME("ds_result_insert"); ACPI_FUNCTION_NAME(ds_result_insert);
state = walk_state->results; state = walk_state->results;
if (!state) { if (!state) {
...@@ -937,7 +943,7 @@ acpi_status acpi_ds_obj_stack_delete_all(struct acpi_walk_state * walk_state) ...@@ -937,7 +943,7 @@ acpi_status acpi_ds_obj_stack_delete_all(struct acpi_walk_state * walk_state)
{ {
u32 i; u32 i;
ACPI_FUNCTION_TRACE_PTR("ds_obj_stack_delete_all", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_obj_stack_delete_all, walk_state);
/* The stack size is configurable, but fixed */ /* The stack size is configurable, but fixed */
...@@ -969,7 +975,7 @@ acpi_status ...@@ -969,7 +975,7 @@ acpi_status
acpi_ds_obj_stack_pop_object(union acpi_operand_object **object, acpi_ds_obj_stack_pop_object(union acpi_operand_object **object,
struct acpi_walk_state *walk_state) struct acpi_walk_state *walk_state)
{ {
ACPI_FUNCTION_NAME("ds_obj_stack_pop_object"); ACPI_FUNCTION_NAME(ds_obj_stack_pop_object);
/* Check for stack underflow */ /* Check for stack underflow */
...@@ -1025,7 +1031,7 @@ acpi_ds_obj_stack_pop_object(union acpi_operand_object **object, ...@@ -1025,7 +1031,7 @@ acpi_ds_obj_stack_pop_object(union acpi_operand_object **object,
void *acpi_ds_obj_stack_get_value(u32 index, struct acpi_walk_state *walk_state) void *acpi_ds_obj_stack_get_value(u32 index, struct acpi_walk_state *walk_state)
{ {
ACPI_FUNCTION_TRACE_PTR("ds_obj_stack_get_value", walk_state); ACPI_FUNCTION_TRACE_PTR(ds_obj_stack_get_value, walk_state);
/* Can't do it if the stack is empty */ /* Can't do it if the stack is empty */
......
...@@ -116,7 +116,7 @@ union acpi_ec { ...@@ -116,7 +116,7 @@ union acpi_ec {
struct acpi_generic_address command_addr; struct acpi_generic_address command_addr;
struct acpi_generic_address data_addr; struct acpi_generic_address data_addr;
unsigned long global_lock; unsigned long global_lock;
spinlock_t lock; struct semaphore sem;
} poll; } poll;
}; };
...@@ -323,7 +323,6 @@ static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data) ...@@ -323,7 +323,6 @@ static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
int result = 0; int result = 0;
unsigned long flags = 0;
u32 glk = 0; u32 glk = 0;
ACPI_FUNCTION_TRACE("acpi_ec_read"); ACPI_FUNCTION_TRACE("acpi_ec_read");
...@@ -339,8 +338,11 @@ static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data) ...@@ -339,8 +338,11 @@ static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
} }
spin_lock_irqsave(&ec->poll.lock, flags); if (down_interruptible(&ec->poll.sem)) {
result = -ERESTARTSYS;
goto end_nosem;
}
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
&ec->common.command_addr); &ec->common.command_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
...@@ -358,8 +360,8 @@ static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data) ...@@ -358,8 +360,8 @@ static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data)
*data, address)); *data, address));
end: end:
spin_unlock_irqrestore(&ec->poll.lock, flags); up(&ec->poll.sem);
end_nosem:
if (ec->common.global_lock) if (ec->common.global_lock)
acpi_release_global_lock(glk); acpi_release_global_lock(glk);
...@@ -370,7 +372,6 @@ static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data) ...@@ -370,7 +372,6 @@ static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data)
{ {
int result = 0; int result = 0;
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long flags = 0;
u32 glk = 0; u32 glk = 0;
ACPI_FUNCTION_TRACE("acpi_ec_write"); ACPI_FUNCTION_TRACE("acpi_ec_write");
...@@ -384,8 +385,11 @@ static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data) ...@@ -384,8 +385,11 @@ static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data)
return_VALUE(-ENODEV); return_VALUE(-ENODEV);
} }
spin_lock_irqsave(&ec->poll.lock, flags); if (down_interruptible(&ec->poll.sem)) {
result = -ERESTARTSYS;
goto end_nosem;
}
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
&ec->common.command_addr); &ec->common.command_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
...@@ -406,8 +410,8 @@ static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data) ...@@ -406,8 +410,8 @@ static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data)
data, address)); data, address));
end: end:
spin_unlock_irqrestore(&ec->poll.lock, flags); up(&ec->poll.sem);
end_nosem:
if (ec->common.global_lock) if (ec->common.global_lock)
acpi_release_global_lock(glk); acpi_release_global_lock(glk);
...@@ -568,7 +572,6 @@ static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data) ...@@ -568,7 +572,6 @@ static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data)
{ {
int result = 0; int result = 0;
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long flags = 0;
u32 glk = 0; u32 glk = 0;
ACPI_FUNCTION_TRACE("acpi_ec_query"); ACPI_FUNCTION_TRACE("acpi_ec_query");
...@@ -589,8 +592,11 @@ static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data) ...@@ -589,8 +592,11 @@ static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data)
* Note that successful completion of the query causes the ACPI_EC_SCI * Note that successful completion of the query causes the ACPI_EC_SCI
* bit to be cleared (and thus clearing the interrupt source). * bit to be cleared (and thus clearing the interrupt source).
*/ */
spin_lock_irqsave(&ec->poll.lock, flags); if (down_interruptible(&ec->poll.sem)) {
result = -ERESTARTSYS;
goto end_nosem;
}
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY, acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY,
&ec->common.command_addr); &ec->common.command_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF); result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
...@@ -602,8 +608,8 @@ static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data) ...@@ -602,8 +608,8 @@ static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data)
result = -ENODATA; result = -ENODATA;
end: end:
spin_unlock_irqrestore(&ec->poll.lock, flags); up(&ec->poll.sem);
end_nosem:
if (ec->common.global_lock) if (ec->common.global_lock)
acpi_release_global_lock(glk); acpi_release_global_lock(glk);
...@@ -680,7 +686,6 @@ static void acpi_ec_gpe_poll_query(void *ec_cxt) ...@@ -680,7 +686,6 @@ static void acpi_ec_gpe_poll_query(void *ec_cxt)
{ {
union acpi_ec *ec = (union acpi_ec *)ec_cxt; union acpi_ec *ec = (union acpi_ec *)ec_cxt;
u32 value = 0; u32 value = 0;
unsigned long flags = 0;
static char object_name[5] = { '_', 'Q', '0', '0', '\0' }; static char object_name[5] = { '_', 'Q', '0', '0', '\0' };
const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
...@@ -691,9 +696,11 @@ static void acpi_ec_gpe_poll_query(void *ec_cxt) ...@@ -691,9 +696,11 @@ static void acpi_ec_gpe_poll_query(void *ec_cxt)
if (!ec_cxt) if (!ec_cxt)
goto end; goto end;
spin_lock_irqsave(&ec->poll.lock, flags); if (down_interruptible (&ec->poll.sem)) {
return_VOID;
}
acpi_hw_low_level_read(8, &value, &ec->common.command_addr); acpi_hw_low_level_read(8, &value, &ec->common.command_addr);
spin_unlock_irqrestore(&ec->poll.lock, flags); up(&ec->poll.sem);
/* TBD: Implement asynch events! /* TBD: Implement asynch events!
* NOTE: All we care about are EC-SCI's. Other EC events are * NOTE: All we care about are EC-SCI's. Other EC events are
...@@ -763,8 +770,7 @@ static u32 acpi_ec_gpe_poll_handler(void *data) ...@@ -763,8 +770,7 @@ static u32 acpi_ec_gpe_poll_handler(void *data)
acpi_disable_gpe(NULL, ec->common.gpe_bit, ACPI_ISR); acpi_disable_gpe(NULL, ec->common.gpe_bit, ACPI_ISR);
status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, status = acpi_os_execute(OSL_EC_POLL_HANDLER, acpi_ec_gpe_query, ec);
acpi_ec_gpe_query, ec);
if (status == AE_OK) if (status == AE_OK)
return ACPI_INTERRUPT_HANDLED; return ACPI_INTERRUPT_HANDLED;
...@@ -799,7 +805,7 @@ static u32 acpi_ec_gpe_intr_handler(void *data) ...@@ -799,7 +805,7 @@ static u32 acpi_ec_gpe_intr_handler(void *data)
if (value & ACPI_EC_FLAG_SCI) { if (value & ACPI_EC_FLAG_SCI) {
atomic_add(1, &ec->intr.pending_gpe); atomic_add(1, &ec->intr.pending_gpe);
status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, status = acpi_os_execute(OSL_EC_BURST_HANDLER,
acpi_ec_gpe_query, ec); acpi_ec_gpe_query, ec);
return status == AE_OK ? return status == AE_OK ?
ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED; ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
...@@ -991,7 +997,6 @@ static int acpi_ec_poll_add(struct acpi_device *device) ...@@ -991,7 +997,6 @@ static int acpi_ec_poll_add(struct acpi_device *device)
int result = 0; int result = 0;
acpi_status status = AE_OK; acpi_status status = AE_OK;
union acpi_ec *ec = NULL; union acpi_ec *ec = NULL;
unsigned long uid;
ACPI_FUNCTION_TRACE("acpi_ec_add"); ACPI_FUNCTION_TRACE("acpi_ec_add");
...@@ -1005,7 +1010,7 @@ static int acpi_ec_poll_add(struct acpi_device *device) ...@@ -1005,7 +1010,7 @@ static int acpi_ec_poll_add(struct acpi_device *device)
ec->common.handle = device->handle; ec->common.handle = device->handle;
ec->common.uid = -1; ec->common.uid = -1;
spin_lock_init(&ec->poll.lock); init_MUTEX(&ec->poll.sem);
strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME); strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_EC_CLASS); strcpy(acpi_device_class(device), ACPI_EC_CLASS);
acpi_driver_data(device) = ec; acpi_driver_data(device) = ec;
...@@ -1014,10 +1019,9 @@ static int acpi_ec_poll_add(struct acpi_device *device) ...@@ -1014,10 +1019,9 @@ static int acpi_ec_poll_add(struct acpi_device *device)
acpi_evaluate_integer(ec->common.handle, "_GLK", NULL, acpi_evaluate_integer(ec->common.handle, "_GLK", NULL,
&ec->common.global_lock); &ec->common.global_lock);
/* If our UID matches the UID for the ECDT-enumerated EC, /* XXX we don't test uids, because on some boxes ecdt uid = 0, see:
we now have the *real* EC info, so kill the makeshift one. */ http://bugzilla.kernel.org/show_bug.cgi?id=6111 */
acpi_evaluate_integer(ec->common.handle, "_UID", NULL, &uid); if (ec_ecdt) {
if (ec_ecdt && ec_ecdt->common.uid == uid) {
acpi_remove_address_space_handler(ACPI_ROOT_OBJECT, acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
ACPI_ADR_SPACE_EC, ACPI_ADR_SPACE_EC,
&acpi_ec_space_handler); &acpi_ec_space_handler);
...@@ -1062,7 +1066,6 @@ static int acpi_ec_intr_add(struct acpi_device *device) ...@@ -1062,7 +1066,6 @@ static int acpi_ec_intr_add(struct acpi_device *device)
int result = 0; int result = 0;
acpi_status status = AE_OK; acpi_status status = AE_OK;
union acpi_ec *ec = NULL; union acpi_ec *ec = NULL;
unsigned long uid;
ACPI_FUNCTION_TRACE("acpi_ec_add"); ACPI_FUNCTION_TRACE("acpi_ec_add");
...@@ -1088,10 +1091,9 @@ static int acpi_ec_intr_add(struct acpi_device *device) ...@@ -1088,10 +1091,9 @@ static int acpi_ec_intr_add(struct acpi_device *device)
acpi_evaluate_integer(ec->common.handle, "_GLK", NULL, acpi_evaluate_integer(ec->common.handle, "_GLK", NULL,
&ec->common.global_lock); &ec->common.global_lock);
/* If our UID matches the UID for the ECDT-enumerated EC, /* XXX we don't test uids, because on some boxes ecdt uid = 0, see:
we now have the *real* EC info, so kill the makeshift one. */ http://bugzilla.kernel.org/show_bug.cgi?id=6111 */
acpi_evaluate_integer(ec->common.handle, "_UID", NULL, &uid); if (ec_ecdt) {
if (ec_ecdt && ec_ecdt->common.uid == uid) {
acpi_remove_address_space_handler(ACPI_ROOT_OBJECT, acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
ACPI_ADR_SPACE_EC, ACPI_ADR_SPACE_EC,
&acpi_ec_space_handler); &acpi_ec_space_handler);
...@@ -1300,7 +1302,7 @@ acpi_fake_ecdt_poll_callback(acpi_handle handle, ...@@ -1300,7 +1302,7 @@ acpi_fake_ecdt_poll_callback(acpi_handle handle,
&ec_ecdt->common.gpe_bit); &ec_ecdt->common.gpe_bit);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return status; return status;
spin_lock_init(&ec_ecdt->poll.lock); init_MUTEX(&ec_ecdt->poll.sem);
ec_ecdt->common.global_lock = TRUE; ec_ecdt->common.global_lock = TRUE;
ec_ecdt->common.handle = handle; ec_ecdt->common.handle = handle;
...@@ -1416,7 +1418,7 @@ static int __init acpi_ec_poll_get_real_ecdt(void) ...@@ -1416,7 +1418,7 @@ static int __init acpi_ec_poll_get_real_ecdt(void)
ec_ecdt->common.status_addr = ecdt_ptr->ec_control; ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
ec_ecdt->common.data_addr = ecdt_ptr->ec_data; ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit; ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit;
spin_lock_init(&ec_ecdt->poll.lock); init_MUTEX(&ec_ecdt->poll.sem);
/* use the GL just to be safe */ /* use the GL just to be safe */
ec_ecdt->common.global_lock = TRUE; ec_ecdt->common.global_lock = TRUE;
ec_ecdt->common.uid = ecdt_ptr->uid; ec_ecdt->common.uid = ecdt_ptr->uid;
......
...@@ -68,7 +68,7 @@ acpi_status acpi_ev_initialize_events(void) ...@@ -68,7 +68,7 @@ acpi_status acpi_ev_initialize_events(void)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_initialize_events"); ACPI_FUNCTION_TRACE(ev_initialize_events);
/* Make sure we have ACPI tables */ /* Make sure we have ACPI tables */
...@@ -118,7 +118,7 @@ acpi_status acpi_ev_install_fadt_gpes(void) ...@@ -118,7 +118,7 @@ acpi_status acpi_ev_install_fadt_gpes(void)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_install_fadt_gpes"); ACPI_FUNCTION_TRACE(ev_install_fadt_gpes);
/* Namespace must be locked */ /* Namespace must be locked */
...@@ -157,7 +157,7 @@ acpi_status acpi_ev_install_xrupt_handlers(void) ...@@ -157,7 +157,7 @@ acpi_status acpi_ev_install_xrupt_handlers(void)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_install_xrupt_handlers"); ACPI_FUNCTION_TRACE(ev_install_xrupt_handlers);
/* Install the SCI handler */ /* Install the SCI handler */
...@@ -241,7 +241,7 @@ u32 acpi_ev_fixed_event_detect(void) ...@@ -241,7 +241,7 @@ u32 acpi_ev_fixed_event_detect(void)
u32 fixed_enable; u32 fixed_enable;
acpi_native_uint i; acpi_native_uint i;
ACPI_FUNCTION_NAME("ev_fixed_event_detect"); ACPI_FUNCTION_NAME(ev_fixed_event_detect);
/* /*
* Read the fixed feature status and enable registers, as all the cases * Read the fixed feature status and enable registers, as all the cases
...@@ -260,12 +260,14 @@ u32 acpi_ev_fixed_event_detect(void) ...@@ -260,12 +260,14 @@ u32 acpi_ev_fixed_event_detect(void)
* Check for all possible Fixed Events and dispatch those that are active * Check for all possible Fixed Events and dispatch those that are active
*/ */
for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) { for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
/* Both the status and enable bits must be on for this event */ /* Both the status and enable bits must be on for this event */
if ((fixed_status & acpi_gbl_fixed_event_info[i]. if ((fixed_status & acpi_gbl_fixed_event_info[i].
status_bit_mask) status_bit_mask)
&& (fixed_enable & acpi_gbl_fixed_event_info[i]. && (fixed_enable & acpi_gbl_fixed_event_info[i].
enable_bit_mask)) { enable_bit_mask)) {
/* Found an active (signalled) event */ /* Found an active (signalled) event */
int_status |= acpi_ev_fixed_event_dispatch((u32) i); int_status |= acpi_ev_fixed_event_dispatch((u32) i);
......
...@@ -69,7 +69,7 @@ acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type) ...@@ -69,7 +69,7 @@ acpi_ev_set_gpe_type(struct acpi_gpe_event_info *gpe_event_info, u8 type)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_set_gpe_type"); ACPI_FUNCTION_TRACE(ev_set_gpe_type);
/* Validate type and update register enable masks */ /* Validate type and update register enable masks */
...@@ -115,7 +115,7 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info, ...@@ -115,7 +115,7 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info,
struct acpi_gpe_register_info *gpe_register_info; struct acpi_gpe_register_info *gpe_register_info;
u8 register_bit; u8 register_bit;
ACPI_FUNCTION_TRACE("ev_update_gpe_enable_masks"); ACPI_FUNCTION_TRACE(ev_update_gpe_enable_masks);
gpe_register_info = gpe_event_info->register_info; gpe_register_info = gpe_event_info->register_info;
if (!gpe_register_info) { if (!gpe_register_info) {
...@@ -178,7 +178,7 @@ acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info, ...@@ -178,7 +178,7 @@ acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info,
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_enable_gpe"); ACPI_FUNCTION_TRACE(ev_enable_gpe);
/* Make sure HW enable masks are updated */ /* Make sure HW enable masks are updated */
...@@ -207,6 +207,7 @@ acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info, ...@@ -207,6 +207,7 @@ acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info,
ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_RUN_ENABLED); ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_RUN_ENABLED);
if (write_to_hardware) { if (write_to_hardware) {
/* Clear the GPE (of stale events), then enable it */ /* Clear the GPE (of stale events), then enable it */
status = acpi_hw_clear_gpe(gpe_event_info); status = acpi_hw_clear_gpe(gpe_event_info);
...@@ -243,7 +244,7 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) ...@@ -243,7 +244,7 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_disable_gpe"); ACPI_FUNCTION_TRACE(ev_disable_gpe);
if (!(gpe_event_info->flags & ACPI_GPE_ENABLE_MASK)) { if (!(gpe_event_info->flags & ACPI_GPE_ENABLE_MASK)) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -313,6 +314,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, ...@@ -313,6 +314,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
/* A NULL gpe_block means use the FADT-defined GPE block(s) */ /* A NULL gpe_block means use the FADT-defined GPE block(s) */
if (!gpe_device) { if (!gpe_device) {
/* Examine GPE Block 0 and 1 (These blocks are permanent) */ /* Examine GPE Block 0 and 1 (These blocks are permanent) */
for (i = 0; i < ACPI_MAX_GPE_BLOCKS; i++) { for (i = 0; i < ACPI_MAX_GPE_BLOCKS; i++) {
...@@ -380,10 +382,11 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -380,10 +382,11 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
u32 status_reg; u32 status_reg;
u32 enable_reg; u32 enable_reg;
acpi_cpu_flags flags; acpi_cpu_flags flags;
acpi_cpu_flags hw_flags;
acpi_native_uint i; acpi_native_uint i;
acpi_native_uint j; acpi_native_uint j;
ACPI_FUNCTION_NAME("ev_gpe_detect"); ACPI_FUNCTION_NAME(ev_gpe_detect);
/* Check for the case where there are no GPEs */ /* Check for the case where there are no GPEs */
...@@ -391,9 +394,12 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -391,9 +394,12 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
return (int_status); return (int_status);
} }
/* Examine all GPE blocks attached to this interrupt level */ /* We need to hold the GPE lock now, hardware lock in the loop */
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
/* Examine all GPE blocks attached to this interrupt level */
gpe_block = gpe_xrupt_list->gpe_block_list_head; gpe_block = gpe_xrupt_list->gpe_block_list_head;
while (gpe_block) { while (gpe_block) {
/* /*
...@@ -402,10 +408,13 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -402,10 +408,13 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
* Find all currently active GP events. * Find all currently active GP events.
*/ */
for (i = 0; i < gpe_block->register_count; i++) { for (i = 0; i < gpe_block->register_count; i++) {
/* Get the next status/enable pair */ /* Get the next status/enable pair */
gpe_register_info = &gpe_block->register_info[i]; gpe_register_info = &gpe_block->register_info[i];
hw_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
/* Read the Status Register */ /* Read the Status Register */
status = status =
...@@ -414,6 +423,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -414,6 +423,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
&gpe_register_info-> &gpe_register_info->
status_address); status_address);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_os_release_lock(acpi_gbl_hardware_lock,
hw_flags);
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -424,6 +435,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -424,6 +435,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
&enable_reg, &enable_reg,
&gpe_register_info-> &gpe_register_info->
enable_address); enable_address);
acpi_os_release_lock(acpi_gbl_hardware_lock, hw_flags);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -437,6 +450,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -437,6 +450,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
enabled_status_byte = (u8) (status_reg & enable_reg); enabled_status_byte = (u8) (status_reg & enable_reg);
if (!enabled_status_byte) { if (!enabled_status_byte) {
/* No active GPEs in this register, move on */ /* No active GPEs in this register, move on */
continue; continue;
...@@ -445,6 +459,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -445,6 +459,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
/* Now look at the individual GPEs in this byte register */ /* Now look at the individual GPEs in this byte register */
for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
/* Examine one GPE bit */ /* Examine one GPE bit */
if (enabled_status_byte & if (enabled_status_byte &
...@@ -483,9 +498,9 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -483,9 +498,9 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
* *
* RETURN: None * RETURN: None
* *
* DESCRIPTION: Perform the actual execution of a GPE control method. This * DESCRIPTION: Perform the actual execution of a GPE control method. This
* function is called from an invocation of acpi_os_queue_for_execution * function is called from an invocation of acpi_os_execute and
* (and therefore does NOT execute at interrupt level) so that * therefore does NOT execute at interrupt level - so that
* the control method itself is not executed in the context of * the control method itself is not executed in the context of
* an interrupt handler. * an interrupt handler.
* *
...@@ -494,12 +509,11 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list) ...@@ -494,12 +509,11 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
{ {
struct acpi_gpe_event_info *gpe_event_info = (void *)context; struct acpi_gpe_event_info *gpe_event_info = (void *)context;
u32 gpe_number = 0;
acpi_status status; acpi_status status;
struct acpi_gpe_event_info local_gpe_event_info; struct acpi_gpe_event_info local_gpe_event_info;
struct acpi_parameter_info info; struct acpi_evaluate_info *info;
ACPI_FUNCTION_TRACE("ev_asynch_execute_gpe_method"); ACPI_FUNCTION_TRACE(ev_asynch_execute_gpe_method);
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -535,22 +549,35 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) ...@@ -535,22 +549,35 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
*/ */
if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) == if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) ==
ACPI_GPE_DISPATCH_METHOD) { ACPI_GPE_DISPATCH_METHOD) {
/*
* Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the _Lxx/_Exx
* control method that corresponds to this GPE
*/
info.node = local_gpe_event_info.dispatch.method_node;
info.parameters =
ACPI_CAST_PTR(union acpi_operand_object *, gpe_event_info);
info.parameter_type = ACPI_PARAM_GPE;
status = acpi_ns_evaluate_by_handle(&info); /* Allocate the evaluation information block */
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
if (!info) {
status = AE_NO_MEMORY;
} else {
/*
* Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the _Lxx/_Exx
* control method that corresponds to this GPE
*/
info->prefix_node =
local_gpe_event_info.dispatch.method_node;
info->parameters =
ACPI_CAST_PTR(union acpi_operand_object *,
gpe_event_info);
info->parameter_type = ACPI_PARAM_GPE;
info->flags = ACPI_IGNORE_RETURN_VALUE;
status = acpi_ns_evaluate(info);
ACPI_FREE(info);
}
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"While evaluating method [%4.4s] for GPE[%2X]", "While evaluating GPE method [%4.4s]",
acpi_ut_get_node_name acpi_ut_get_node_name
(local_gpe_event_info.dispatch. (local_gpe_event_info.dispatch.
method_node), gpe_number)); method_node)));
} }
} }
...@@ -593,7 +620,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) ...@@ -593,7 +620,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_gpe_dispatch"); ACPI_FUNCTION_TRACE(ev_gpe_dispatch);
/* /*
* If edge-triggered, clear the GPE status bit now. Note that * If edge-triggered, clear the GPE status bit now. Note that
...@@ -669,9 +696,9 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) ...@@ -669,9 +696,9 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
* Execute the method associated with the GPE * Execute the method associated with the GPE
* NOTE: Level-triggered GPEs are cleared after the method completes. * NOTE: Level-triggered GPEs are cleared after the method completes.
*/ */
status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, status = acpi_os_execute(OSL_GPE_HANDLER,
acpi_ev_asynch_execute_gpe_method, acpi_ev_asynch_execute_gpe_method,
gpe_event_info); gpe_event_info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"Unable to queue handler for GPE[%2X] - event disabled", "Unable to queue handler for GPE[%2X] - event disabled",
...@@ -716,7 +743,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) ...@@ -716,7 +743,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
* *
* DESCRIPTION: Determine if a a GPE is "wake-only". * DESCRIPTION: Determine if a a GPE is "wake-only".
* *
* Called from Notify() code in interpreter when a "device_wake" * Called from Notify() code in interpreter when a "DeviceWake"
* Notify comes in. * Notify comes in.
* *
******************************************************************************/ ******************************************************************************/
...@@ -726,7 +753,7 @@ acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info) ...@@ -726,7 +753,7 @@ acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_check_for_wake_only_gpe"); ACPI_FUNCTION_TRACE(ev_check_for_wake_only_gpe);
if ((gpe_event_info) && /* Only >0 for _Lxx/_Exx */ if ((gpe_event_info) && /* Only >0 for _Lxx/_Exx */
((gpe_event_info->flags & ACPI_GPE_SYSTEM_MASK) == ACPI_GPE_SYSTEM_RUNNING)) { /* System state at GPE time */ ((gpe_event_info->flags & ACPI_GPE_SYSTEM_MASK) == ACPI_GPE_SYSTEM_RUNNING)) { /* System state at GPE time */
......
...@@ -131,14 +131,14 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info) ...@@ -131,14 +131,14 @@ u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_ev_walk_gpe_list(ACPI_GPE_CALLBACK gpe_walk_callback) acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback)
{ {
struct acpi_gpe_block_info *gpe_block; struct acpi_gpe_block_info *gpe_block;
struct acpi_gpe_xrupt_info *gpe_xrupt_info; struct acpi_gpe_xrupt_info *gpe_xrupt_info;
acpi_status status = AE_OK; acpi_status status = AE_OK;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("ev_walk_gpe_list"); ACPI_FUNCTION_TRACE(ev_walk_gpe_list);
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
...@@ -146,10 +146,12 @@ acpi_status acpi_ev_walk_gpe_list(ACPI_GPE_CALLBACK gpe_walk_callback) ...@@ -146,10 +146,12 @@ acpi_status acpi_ev_walk_gpe_list(ACPI_GPE_CALLBACK gpe_walk_callback)
gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head; gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
while (gpe_xrupt_info) { while (gpe_xrupt_info) {
/* Walk all Gpe Blocks attached to this interrupt level */ /* Walk all Gpe Blocks attached to this interrupt level */
gpe_block = gpe_xrupt_info->gpe_block_list_head; gpe_block = gpe_xrupt_info->gpe_block_list_head;
while (gpe_block) { while (gpe_block) {
/* One callback per GPE block */ /* One callback per GPE block */
status = gpe_walk_callback(gpe_xrupt_info, gpe_block); status = gpe_walk_callback(gpe_xrupt_info, gpe_block);
...@@ -190,11 +192,12 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, ...@@ -190,11 +192,12 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
acpi_native_uint i; acpi_native_uint i;
acpi_native_uint j; acpi_native_uint j;
ACPI_FUNCTION_TRACE("ev_delete_gpe_handlers"); ACPI_FUNCTION_TRACE(ev_delete_gpe_handlers);
/* Examine each GPE Register within the block */ /* Examine each GPE Register within the block */
for (i = 0; i < gpe_block->register_count; i++) { for (i = 0; i < gpe_block->register_count; i++) {
/* Now look at the individual GPEs in this byte register */ /* Now look at the individual GPEs in this byte register */
for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
...@@ -204,7 +207,7 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, ...@@ -204,7 +207,7 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
ACPI_GPE_DISPATCH_HANDLER) { ACPI_GPE_DISPATCH_HANDLER) {
ACPI_MEM_FREE(gpe_event_info->dispatch.handler); ACPI_FREE(gpe_event_info->dispatch.handler);
gpe_event_info->dispatch.handler = NULL; gpe_event_info->dispatch.handler = NULL;
gpe_event_info->flags &= gpe_event_info->flags &=
~ACPI_GPE_DISPATCH_MASK; ~ACPI_GPE_DISPATCH_MASK;
...@@ -248,7 +251,7 @@ acpi_ev_save_method_info(acpi_handle obj_handle, ...@@ -248,7 +251,7 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
u8 type; u8 type;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_save_method_info"); ACPI_FUNCTION_TRACE(ev_save_method_info);
/* /*
* _Lxx and _Exx GPE method support * _Lxx and _Exx GPE method support
...@@ -279,9 +282,9 @@ acpi_ev_save_method_info(acpi_handle obj_handle, ...@@ -279,9 +282,9 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
default: default:
/* Unknown method type, just ignore it! */ /* Unknown method type, just ignore it! */
ACPI_ERROR((AE_INFO, ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
"Unknown GPE method type: %s (name not of form _Lxx or _Exx)", "Ignoring unknown GPE method type: %s (name not of form _Lxx or _Exx)",
name)); name));
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -289,11 +292,12 @@ acpi_ev_save_method_info(acpi_handle obj_handle, ...@@ -289,11 +292,12 @@ acpi_ev_save_method_info(acpi_handle obj_handle,
gpe_number = ACPI_STRTOUL(&name[2], NULL, 16); gpe_number = ACPI_STRTOUL(&name[2], NULL, 16);
if (gpe_number == ACPI_UINT32_MAX) { if (gpe_number == ACPI_UINT32_MAX) {
/* Conversion failed; invalid method, just ignore it */ /* Conversion failed; invalid method, just ignore it */
ACPI_ERROR((AE_INFO, ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
"Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)", "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)",
name)); name));
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -364,13 +368,14 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, ...@@ -364,13 +368,14 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
u32 gpe_number; u32 gpe_number;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_match_prw_and_gpe"); ACPI_FUNCTION_TRACE(ev_match_prw_and_gpe);
/* Check for a _PRW method under this device */ /* Check for a _PRW method under this device */
status = acpi_ut_evaluate_object(obj_handle, METHOD_NAME__PRW, status = acpi_ut_evaluate_object(obj_handle, METHOD_NAME__PRW,
ACPI_BTYPE_PACKAGE, &pkg_desc); ACPI_BTYPE_PACKAGE, &pkg_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* Ignore all errors from _PRW, we don't want to abort the subsystem */ /* Ignore all errors from _PRW, we don't want to abort the subsystem */
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -394,6 +399,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, ...@@ -394,6 +399,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
obj_desc = pkg_desc->package.elements[0]; obj_desc = pkg_desc->package.elements[0];
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) {
/* Use FADT-defined GPE device (from definition of _PRW) */ /* Use FADT-defined GPE device (from definition of _PRW) */
target_gpe_device = acpi_gbl_fadt_gpe_device; target_gpe_device = acpi_gbl_fadt_gpe_device;
...@@ -402,6 +408,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, ...@@ -402,6 +408,7 @@ acpi_ev_match_prw_and_gpe(acpi_handle obj_handle,
gpe_number = (u32) obj_desc->integer.value; gpe_number = (u32) obj_desc->integer.value;
} else if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) { } else if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) {
/* Package contains a GPE reference and GPE number within a GPE block */ /* Package contains a GPE reference and GPE number within a GPE block */
if ((obj_desc->package.count < 2) || if ((obj_desc->package.count < 2) ||
...@@ -482,7 +489,7 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 ...@@ -482,7 +489,7 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
acpi_status status; acpi_status status;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("ev_get_gpe_xrupt_block"); ACPI_FUNCTION_TRACE(ev_get_gpe_xrupt_block);
/* No need for lock since we are not changing any list elements here */ /* No need for lock since we are not changing any list elements here */
...@@ -497,7 +504,7 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 ...@@ -497,7 +504,7 @@ static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32
/* Not found, must allocate a new xrupt descriptor */ /* Not found, must allocate a new xrupt descriptor */
gpe_xrupt = ACPI_MEM_CALLOCATE(sizeof(struct acpi_gpe_xrupt_info)); gpe_xrupt = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_xrupt_info));
if (!gpe_xrupt) { if (!gpe_xrupt) {
return_PTR(NULL); return_PTR(NULL);
} }
...@@ -556,7 +563,7 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt) ...@@ -556,7 +563,7 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
acpi_status status; acpi_status status;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("ev_delete_gpe_xrupt"); ACPI_FUNCTION_TRACE(ev_delete_gpe_xrupt);
/* We never want to remove the SCI interrupt handler */ /* We never want to remove the SCI interrupt handler */
...@@ -588,7 +595,7 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt) ...@@ -588,7 +595,7 @@ acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt)
/* Free the block */ /* Free the block */
ACPI_MEM_FREE(gpe_xrupt); ACPI_FREE(gpe_xrupt);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -614,7 +621,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block, ...@@ -614,7 +621,7 @@ acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block,
acpi_status status; acpi_status status;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("ev_install_gpe_block"); ACPI_FUNCTION_TRACE(ev_install_gpe_block);
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -667,7 +674,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block) ...@@ -667,7 +674,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
acpi_status status; acpi_status status;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("ev_install_gpe_block"); ACPI_FUNCTION_TRACE(ev_install_gpe_block);
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -679,6 +686,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block) ...@@ -679,6 +686,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
status = acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block); status = acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block);
if (!gpe_block->previous && !gpe_block->next) { if (!gpe_block->previous && !gpe_block->next) {
/* This is the last gpe_block on this interrupt */ /* This is the last gpe_block on this interrupt */
status = acpi_ev_delete_gpe_xrupt(gpe_block->xrupt_block); status = acpi_ev_delete_gpe_xrupt(gpe_block->xrupt_block);
...@@ -704,9 +712,9 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block) ...@@ -704,9 +712,9 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
/* Free the gpe_block */ /* Free the gpe_block */
ACPI_MEM_FREE(gpe_block->register_info); ACPI_FREE(gpe_block->register_info);
ACPI_MEM_FREE(gpe_block->event_info); ACPI_FREE(gpe_block->event_info);
ACPI_MEM_FREE(gpe_block); ACPI_FREE(gpe_block);
unlock_and_exit: unlock_and_exit:
status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); status = acpi_ut_release_mutex(ACPI_MTX_EVENTS);
...@@ -736,17 +744,17 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block) ...@@ -736,17 +744,17 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
acpi_native_uint j; acpi_native_uint j;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_create_gpe_info_blocks"); ACPI_FUNCTION_TRACE(ev_create_gpe_info_blocks);
/* Allocate the GPE register information block */ /* Allocate the GPE register information block */
gpe_register_info = ACPI_MEM_CALLOCATE((acpi_size) gpe_block-> gpe_register_info = ACPI_ALLOCATE_ZEROED((acpi_size) gpe_block->
register_count * register_count *
sizeof(struct sizeof(struct
acpi_gpe_register_info)); acpi_gpe_register_info));
if (!gpe_register_info) { if (!gpe_register_info) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Could not allocate the gpe_register_info table")); "Could not allocate the GpeRegisterInfo table"));
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
...@@ -754,13 +762,14 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block) ...@@ -754,13 +762,14 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
* Allocate the GPE event_info block. There are eight distinct GPEs * Allocate the GPE event_info block. There are eight distinct GPEs
* per register. Initialization to zeros is sufficient. * per register. Initialization to zeros is sufficient.
*/ */
gpe_event_info = ACPI_MEM_CALLOCATE(((acpi_size) gpe_block-> gpe_event_info = ACPI_ALLOCATE_ZEROED(((acpi_size) gpe_block->
register_count * register_count *
ACPI_GPE_REGISTER_WIDTH) * ACPI_GPE_REGISTER_WIDTH) *
sizeof(struct acpi_gpe_event_info)); sizeof(struct
acpi_gpe_event_info));
if (!gpe_event_info) { if (!gpe_event_info) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Could not allocate the gpe_event_info table")); "Could not allocate the GpeEventInfo table"));
status = AE_NO_MEMORY; status = AE_NO_MEMORY;
goto error_exit; goto error_exit;
} }
...@@ -780,6 +789,7 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block) ...@@ -780,6 +789,7 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
this_event = gpe_event_info; this_event = gpe_event_info;
for (i = 0; i < gpe_block->register_count; i++) { for (i = 0; i < gpe_block->register_count; i++) {
/* Init the register_info for this GPE register (8 GPEs) */ /* Init the register_info for this GPE register (8 GPEs) */
this_register->base_gpe_number = this_register->base_gpe_number =
...@@ -839,10 +849,10 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block) ...@@ -839,10 +849,10 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block)
error_exit: error_exit:
if (gpe_register_info) { if (gpe_register_info) {
ACPI_MEM_FREE(gpe_register_info); ACPI_FREE(gpe_register_info);
} }
if (gpe_event_info) { if (gpe_event_info) {
ACPI_MEM_FREE(gpe_event_info); ACPI_FREE(gpe_event_info);
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
...@@ -878,7 +888,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -878,7 +888,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
acpi_status status; acpi_status status;
struct acpi_gpe_block_info *gpe_block; struct acpi_gpe_block_info *gpe_block;
ACPI_FUNCTION_TRACE("ev_create_gpe_block"); ACPI_FUNCTION_TRACE(ev_create_gpe_block);
if (!register_count) { if (!register_count) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -886,7 +896,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -886,7 +896,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
/* Allocate a new GPE block */ /* Allocate a new GPE block */
gpe_block = ACPI_MEM_CALLOCATE(sizeof(struct acpi_gpe_block_info)); gpe_block = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_block_info));
if (!gpe_block) { if (!gpe_block) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
...@@ -906,7 +916,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -906,7 +916,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
*/ */
status = acpi_ev_create_gpe_info_blocks(gpe_block); status = acpi_ev_create_gpe_info_blocks(gpe_block);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_MEM_FREE(gpe_block); ACPI_FREE(gpe_block);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -914,7 +924,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -914,7 +924,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
status = acpi_ev_install_gpe_block(gpe_block, interrupt_number); status = acpi_ev_install_gpe_block(gpe_block, interrupt_number);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_MEM_FREE(gpe_block); ACPI_FREE(gpe_block);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -971,7 +981,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -971,7 +981,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
acpi_native_uint i; acpi_native_uint i;
acpi_native_uint j; acpi_native_uint j;
ACPI_FUNCTION_TRACE("ev_initialize_gpe_block"); ACPI_FUNCTION_TRACE(ev_initialize_gpe_block);
/* Ignore a null GPE block (e.g., if no GPE block 1 exists) */ /* Ignore a null GPE block (e.g., if no GPE block 1 exists) */
...@@ -1013,6 +1023,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -1013,6 +1023,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
for (i = 0; i < gpe_block->register_count; i++) { for (i = 0; i < gpe_block->register_count; i++) {
for (j = 0; j < 8; j++) { for (j = 0; j < 8; j++) {
/* Get the info block for this particular GPE */ /* Get the info block for this particular GPE */
gpe_event_info = gpe_event_info =
...@@ -1040,7 +1051,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -1040,7 +1051,7 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block); status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR((AE_INFO, "Could not enable GPEs in gpe_block %p", ACPI_ERROR((AE_INFO, "Could not enable GPEs in GpeBlock %p",
gpe_block)); gpe_block));
} }
...@@ -1066,7 +1077,7 @@ acpi_status acpi_ev_gpe_initialize(void) ...@@ -1066,7 +1077,7 @@ acpi_status acpi_ev_gpe_initialize(void)
u32 gpe_number_max = 0; u32 gpe_number_max = 0;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_gpe_initialize"); ACPI_FUNCTION_TRACE(ev_gpe_initialize);
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -1099,6 +1110,7 @@ acpi_status acpi_ev_gpe_initialize(void) ...@@ -1099,6 +1110,7 @@ acpi_status acpi_ev_gpe_initialize(void)
* particular block is not supported. * particular block is not supported.
*/ */
if (acpi_gbl_FADT->gpe0_blk_len && acpi_gbl_FADT->xgpe0_blk.address) { if (acpi_gbl_FADT->gpe0_blk_len && acpi_gbl_FADT->xgpe0_blk.address) {
/* GPE block 0 exists (has both length and address > 0) */ /* GPE block 0 exists (has both length and address > 0) */
register_count0 = (u16) (acpi_gbl_FADT->gpe0_blk_len / 2); register_count0 = (u16) (acpi_gbl_FADT->gpe0_blk_len / 2);
...@@ -1121,6 +1133,7 @@ acpi_status acpi_ev_gpe_initialize(void) ...@@ -1121,6 +1133,7 @@ acpi_status acpi_ev_gpe_initialize(void)
} }
if (acpi_gbl_FADT->gpe1_blk_len && acpi_gbl_FADT->xgpe1_blk.address) { if (acpi_gbl_FADT->gpe1_blk_len && acpi_gbl_FADT->xgpe1_blk.address) {
/* GPE block 1 exists (has both length and address > 0) */ /* GPE block 1 exists (has both length and address > 0) */
register_count1 = (u16) (acpi_gbl_FADT->gpe1_blk_len / 2); register_count1 = (u16) (acpi_gbl_FADT->gpe1_blk_len / 2);
...@@ -1168,6 +1181,7 @@ acpi_status acpi_ev_gpe_initialize(void) ...@@ -1168,6 +1181,7 @@ acpi_status acpi_ev_gpe_initialize(void)
/* Exit if there are no GPE registers */ /* Exit if there are no GPE registers */
if ((register_count0 + register_count1) == 0) { if ((register_count0 + register_count1) == 0) {
/* GPEs are not required by ACPI, this is OK */ /* GPEs are not required by ACPI, this is OK */
ACPI_DEBUG_PRINT((ACPI_DB_INIT, ACPI_DEBUG_PRINT((ACPI_DB_INIT,
......
...@@ -49,12 +49,13 @@ ...@@ -49,12 +49,13 @@
#define _COMPONENT ACPI_EVENTS #define _COMPONENT ACPI_EVENTS
ACPI_MODULE_NAME("evmisc") ACPI_MODULE_NAME("evmisc")
/* Names for Notify() values, used for debug output */
#ifdef ACPI_DEBUG_OUTPUT #ifdef ACPI_DEBUG_OUTPUT
static const char *acpi_notify_value_names[] = { static const char *acpi_notify_value_names[] = {
"Bus Check", "Bus Check",
"Device Check", "Device Check",
"Device Wake", "Device Wake",
"Eject request", "Eject Request",
"Device Check Light", "Device Check Light",
"Frequency Mismatch", "Frequency Mismatch",
"Bus Mode Mismatch", "Bus Mode Mismatch",
...@@ -124,7 +125,7 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node, ...@@ -124,7 +125,7 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
union acpi_generic_state *notify_info; union acpi_generic_state *notify_info;
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_NAME("ev_queue_notify_request"); ACPI_FUNCTION_NAME(ev_queue_notify_request);
/* /*
* For value 3 (Ejection Request), some device method may need to be run. * For value 3 (Ejection Request), some device method may need to be run.
...@@ -150,6 +151,7 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node, ...@@ -150,6 +151,7 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (obj_desc) { if (obj_desc) {
/* We have the notify object, Get the right handler */ /* We have the notify object, Get the right handler */
switch (node->type) { switch (node->type) {
...@@ -184,14 +186,15 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node, ...@@ -184,14 +186,15 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
notify_info->common.data_type = ACPI_DESC_TYPE_STATE_NOTIFY; notify_info->common.descriptor_type =
ACPI_DESC_TYPE_STATE_NOTIFY;
notify_info->notify.node = node; notify_info->notify.node = node;
notify_info->notify.value = (u16) notify_value; notify_info->notify.value = (u16) notify_value;
notify_info->notify.handler_obj = handler_obj; notify_info->notify.handler_obj = handler_obj;
status = acpi_os_queue_for_execution(OSD_PRIORITY_HIGH, status =
acpi_ev_notify_dispatch, acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_ev_notify_dispatch,
notify_info); notify_info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_ut_delete_generic_state(notify_info); acpi_ut_delete_generic_state(notify_info);
} }
...@@ -240,6 +243,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context) ...@@ -240,6 +243,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context)
* to the device. * to the device.
*/ */
if (notify_info->notify.value <= ACPI_MAX_SYS_NOTIFY) { if (notify_info->notify.value <= ACPI_MAX_SYS_NOTIFY) {
/* Global system notification handler */ /* Global system notification handler */
if (acpi_gbl_system_notify.handler) { if (acpi_gbl_system_notify.handler) {
...@@ -297,6 +301,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_global_lock_thread(void *context) ...@@ -297,6 +301,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_global_lock_thread(void *context)
/* Signal threads that are waiting for the lock */ /* Signal threads that are waiting for the lock */
if (acpi_gbl_global_lock_thread_count) { if (acpi_gbl_global_lock_thread_count) {
/* Send sufficient units to the semaphore */ /* Send sufficient units to the semaphore */
status = status =
...@@ -335,15 +340,16 @@ static u32 acpi_ev_global_lock_handler(void *context) ...@@ -335,15 +340,16 @@ static u32 acpi_ev_global_lock_handler(void *context)
*/ */
ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_common_fACS.global_lock, acquired); ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_common_fACS.global_lock, acquired);
if (acquired) { if (acquired) {
/* Got the lock, now wake all threads waiting for it */ /* Got the lock, now wake all threads waiting for it */
acpi_gbl_global_lock_acquired = TRUE; acpi_gbl_global_lock_acquired = TRUE;
/* Run the Global Lock thread which will signal all waiting threads */ /* Run the Global Lock thread which will signal all waiting threads */
status = acpi_os_queue_for_execution(OSD_PRIORITY_HIGH, status =
acpi_ev_global_lock_thread, acpi_os_execute(OSL_GLOBAL_LOCK_HANDLER,
context); acpi_ev_global_lock_thread, context);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"Could not queue Global Lock thread")); "Could not queue Global Lock thread"));
...@@ -371,7 +377,7 @@ acpi_status acpi_ev_init_global_lock_handler(void) ...@@ -371,7 +377,7 @@ acpi_status acpi_ev_init_global_lock_handler(void)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_init_global_lock_handler"); ACPI_FUNCTION_TRACE(ev_init_global_lock_handler);
acpi_gbl_global_lock_present = TRUE; acpi_gbl_global_lock_present = TRUE;
status = acpi_install_fixed_event_handler(ACPI_EVENT_GLOBAL, status = acpi_install_fixed_event_handler(ACPI_EVENT_GLOBAL,
...@@ -413,7 +419,7 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout) ...@@ -413,7 +419,7 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)
acpi_status status = AE_OK; acpi_status status = AE_OK;
u8 acquired = FALSE; u8 acquired = FALSE;
ACPI_FUNCTION_TRACE("ev_acquire_global_lock"); ACPI_FUNCTION_TRACE(ev_acquire_global_lock);
#ifndef ACPI_APPLICATION #ifndef ACPI_APPLICATION
/* Make sure that we actually have a global lock */ /* Make sure that we actually have a global lock */
...@@ -439,6 +445,7 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout) ...@@ -439,6 +445,7 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)
ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_common_fACS.global_lock, acquired); ACPI_ACQUIRE_GLOBAL_LOCK(acpi_gbl_common_fACS.global_lock, acquired);
if (acquired) { if (acquired) {
/* We got the lock */ /* We got the lock */
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
...@@ -458,8 +465,9 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout) ...@@ -458,8 +465,9 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)
* Acquire the global lock semaphore first. * Acquire the global lock semaphore first.
* Since this wait will block, we must release the interpreter * Since this wait will block, we must release the interpreter
*/ */
status = acpi_ex_system_wait_semaphore(acpi_gbl_global_lock_semaphore, status =
timeout); acpi_ex_system_wait_semaphore(acpi_gbl_global_lock_semaphore,
timeout);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -480,7 +488,7 @@ acpi_status acpi_ev_release_global_lock(void) ...@@ -480,7 +488,7 @@ acpi_status acpi_ev_release_global_lock(void)
u8 pending = FALSE; u8 pending = FALSE;
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("ev_release_global_lock"); ACPI_FUNCTION_TRACE(ev_release_global_lock);
if (!acpi_gbl_global_lock_thread_count) { if (!acpi_gbl_global_lock_thread_count) {
ACPI_WARNING((AE_INFO, ACPI_WARNING((AE_INFO,
...@@ -492,6 +500,7 @@ acpi_status acpi_ev_release_global_lock(void) ...@@ -492,6 +500,7 @@ acpi_status acpi_ev_release_global_lock(void)
acpi_gbl_global_lock_thread_count--; acpi_gbl_global_lock_thread_count--;
if (acpi_gbl_global_lock_thread_count) { if (acpi_gbl_global_lock_thread_count) {
/* There are still some threads holding the lock, cannot release */ /* There are still some threads holding the lock, cannot release */
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -533,7 +542,7 @@ void acpi_ev_terminate(void) ...@@ -533,7 +542,7 @@ void acpi_ev_terminate(void)
acpi_native_uint i; acpi_native_uint i;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_terminate"); ACPI_FUNCTION_TRACE(ev_terminate);
if (acpi_gbl_events_initialized) { if (acpi_gbl_events_initialized) {
/* /*
...@@ -573,7 +582,7 @@ void acpi_ev_terminate(void) ...@@ -573,7 +582,7 @@ void acpi_ev_terminate(void)
if (acpi_gbl_original_mode == ACPI_SYS_MODE_LEGACY) { if (acpi_gbl_original_mode == ACPI_SYS_MODE_LEGACY) {
status = acpi_disable(); status = acpi_disable();
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_WARNING((AE_INFO, "acpi_disable failed")); ACPI_WARNING((AE_INFO, "AcpiDisable failed"));
} }
} }
return_VOID; return_VOID;
......
...@@ -83,7 +83,7 @@ acpi_status acpi_ev_install_region_handlers(void) ...@@ -83,7 +83,7 @@ acpi_status acpi_ev_install_region_handlers(void)
acpi_status status; acpi_status status;
acpi_native_uint i; acpi_native_uint i;
ACPI_FUNCTION_TRACE("ev_install_region_handlers"); ACPI_FUNCTION_TRACE(ev_install_region_handlers);
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -153,7 +153,7 @@ acpi_status acpi_ev_initialize_op_regions(void) ...@@ -153,7 +153,7 @@ acpi_status acpi_ev_initialize_op_regions(void)
acpi_status status; acpi_status status;
acpi_native_uint i; acpi_native_uint i;
ACPI_FUNCTION_TRACE("ev_initialize_op_regions"); ACPI_FUNCTION_TRACE(ev_initialize_op_regions);
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -164,6 +164,7 @@ acpi_status acpi_ev_initialize_op_regions(void) ...@@ -164,6 +164,7 @@ acpi_status acpi_ev_initialize_op_regions(void)
* Run the _REG methods for op_regions in each default address space * Run the _REG methods for op_regions in each default address space
*/ */
for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) { for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
/* TBD: Make sure handler is the DEFAULT handler, otherwise /* TBD: Make sure handler is the DEFAULT handler, otherwise
* _REG will have already been run. * _REG will have already been run.
*/ */
...@@ -192,12 +193,12 @@ acpi_status acpi_ev_initialize_op_regions(void) ...@@ -192,12 +193,12 @@ acpi_status acpi_ev_initialize_op_regions(void)
acpi_status acpi_status
acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
{ {
struct acpi_parameter_info info; struct acpi_evaluate_info *info;
union acpi_operand_object *params[3]; union acpi_operand_object *args[3];
union acpi_operand_object *region_obj2; union acpi_operand_object *region_obj2;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_execute_reg_method"); ACPI_FUNCTION_TRACE(ev_execute_reg_method);
region_obj2 = acpi_ns_get_secondary_object(region_obj); region_obj2 = acpi_ns_get_secondary_object(region_obj);
if (!region_obj2) { if (!region_obj2) {
...@@ -208,48 +209,60 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) ...@@ -208,48 +209,60 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
/* Allocate and initialize the evaluation information block */
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
if (!info) {
return_ACPI_STATUS(AE_NO_MEMORY);
}
info->prefix_node = region_obj2->extra.method_REG;
info->pathname = NULL;
info->parameters = args;
info->parameter_type = ACPI_PARAM_ARGS;
info->flags = ACPI_IGNORE_RETURN_VALUE;
/* /*
* The _REG method has two arguments: * The _REG method has two arguments:
* *
* Arg0, Integer: Operation region space ID * Arg0 - Integer:
* Same value as region_obj->Region.space_id * Operation region space ID Same value as region_obj->Region.space_id
* Arg1, Integer: connection status *
* 1 for connecting the handler, * Arg1 - Integer:
* 0 for disconnecting the handler * connection status 1 for connecting the handler, 0 for disconnecting
* Passed as a parameter * the handler (Passed as a parameter)
*/ */
params[0] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER); args[0] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
if (!params[0]) { if (!args[0]) {
return_ACPI_STATUS(AE_NO_MEMORY); status = AE_NO_MEMORY;
goto cleanup1;
} }
params[1] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER); args[1] = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER);
if (!params[1]) { if (!args[1]) {
status = AE_NO_MEMORY; status = AE_NO_MEMORY;
goto cleanup; goto cleanup2;
} }
/* Setup the parameter objects */ /* Setup the parameter objects */
params[0]->integer.value = region_obj->region.space_id; args[0]->integer.value = region_obj->region.space_id;
params[1]->integer.value = function; args[1]->integer.value = function;
params[2] = NULL; args[2] = NULL;
info.node = region_obj2->extra.method_REG;
info.parameters = params;
info.parameter_type = ACPI_PARAM_ARGS;
/* Execute the method, no return value */ /* Execute the method, no return value */
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
(ACPI_TYPE_METHOD, info.node, NULL)); (ACPI_TYPE_METHOD, info->prefix_node, NULL));
status = acpi_ns_evaluate_by_handle(&info);
acpi_ut_remove_reference(params[1]); status = acpi_ns_evaluate(info);
acpi_ut_remove_reference(args[1]);
cleanup: cleanup2:
acpi_ut_remove_reference(params[0]); acpi_ut_remove_reference(args[0]);
cleanup1:
ACPI_FREE(info);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -261,7 +274,8 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) ...@@ -261,7 +274,8 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
* Function - Read or Write operation * Function - Read or Write operation
* Address - Where in the space to read or write * Address - Where in the space to read or write
* bit_width - Field width in bits (8, 16, 32, or 64) * bit_width - Field width in bits (8, 16, 32, or 64)
* Value - Pointer to in or out value * Value - Pointer to in or out value, must be
* full 64-bit acpi_integer
* *
* RETURN: Status * RETURN: Status
* *
...@@ -274,7 +288,7 @@ acpi_status ...@@ -274,7 +288,7 @@ acpi_status
acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
u32 function, u32 function,
acpi_physical_address address, acpi_physical_address address,
u32 bit_width, void *value) u32 bit_width, acpi_integer * value)
{ {
acpi_status status; acpi_status status;
acpi_status status2; acpi_status status2;
...@@ -284,7 +298,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, ...@@ -284,7 +298,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
union acpi_operand_object *region_obj2; union acpi_operand_object *region_obj2;
void *region_context = NULL; void *region_context = NULL;
ACPI_FUNCTION_TRACE("ev_address_space_dispatch"); ACPI_FUNCTION_TRACE(ev_address_space_dispatch);
region_obj2 = acpi_ns_get_secondary_object(region_obj); region_obj2 = acpi_ns_get_secondary_object(region_obj);
if (!region_obj2) { if (!region_obj2) {
...@@ -315,6 +329,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, ...@@ -315,6 +329,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
*/ */
region_setup = handler_desc->address_space.setup; region_setup = handler_desc->address_space.setup;
if (!region_setup) { if (!region_setup) {
/* No initialization routine, exit with error */ /* No initialization routine, exit with error */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
...@@ -361,9 +376,10 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, ...@@ -361,9 +376,10 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE; region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE;
if (region_obj2->extra.region_context) { if (region_obj2->extra.region_context) {
/* The handler for this region was already installed */ /* The handler for this region was already installed */
ACPI_MEM_FREE(region_context); ACPI_FREE(region_context);
} else { } else {
/* /*
* Save the returned context for use in all accesses to * Save the returned context for use in all accesses to
...@@ -386,9 +402,8 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, ...@@ -386,9 +402,8 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
acpi_ut_get_region_name(region_obj->region. acpi_ut_get_region_name(region_obj->region.
space_id))); space_id)));
if (! if (!(handler_desc->address_space.handler_flags &
(handler_desc->address_space. ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
/* /*
* For handlers other than the default (supplied) handlers, we must * For handlers other than the default (supplied) handlers, we must
* exit the interpreter because the handler *might* block -- we don't * exit the interpreter because the handler *might* block -- we don't
...@@ -409,9 +424,8 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, ...@@ -409,9 +424,8 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
space_id))); space_id)));
} }
if (! if (!(handler_desc->address_space.handler_flags &
(handler_desc->address_space. ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) {
/* /*
* We just returned from a non-default handler, we must re-enter the * We just returned from a non-default handler, we must re-enter the
* interpreter * interpreter
...@@ -451,7 +465,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj, ...@@ -451,7 +465,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
union acpi_operand_object *region_obj2; union acpi_operand_object *region_obj2;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_detach_region"); ACPI_FUNCTION_TRACE(ev_detach_region);
region_obj2 = acpi_ns_get_secondary_object(region_obj); region_obj2 = acpi_ns_get_secondary_object(region_obj);
if (!region_obj2) { if (!region_obj2) {
...@@ -463,6 +477,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj, ...@@ -463,6 +477,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
handler_obj = region_obj->region.handler; handler_obj = region_obj->region.handler;
if (!handler_obj) { if (!handler_obj) {
/* This region has no handler, all done */ /* This region has no handler, all done */
return_VOID; return_VOID;
...@@ -474,6 +489,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj, ...@@ -474,6 +489,7 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
last_obj_ptr = &handler_obj->address_space.region_list; last_obj_ptr = &handler_obj->address_space.region_list;
while (obj_desc) { while (obj_desc) {
/* Is this the correct Region? */ /* Is this the correct Region? */
if (obj_desc == region_obj) { if (obj_desc == region_obj) {
...@@ -583,7 +599,7 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj, ...@@ -583,7 +599,7 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
u8 acpi_ns_is_locked) u8 acpi_ns_is_locked)
{ {
ACPI_FUNCTION_TRACE("ev_attach_region"); ACPI_FUNCTION_TRACE(ev_attach_region);
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Adding Region [%4.4s] %p to address handler %p [%s]\n", "Adding Region [%4.4s] %p to address handler %p [%s]\n",
...@@ -636,7 +652,7 @@ acpi_ev_install_handler(acpi_handle obj_handle, ...@@ -636,7 +652,7 @@ acpi_ev_install_handler(acpi_handle obj_handle,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_NAME("ev_install_handler"); ACPI_FUNCTION_NAME(ev_install_handler);
handler_obj = (union acpi_operand_object *)context; handler_obj = (union acpi_operand_object *)context;
...@@ -666,6 +682,7 @@ acpi_ev_install_handler(acpi_handle obj_handle, ...@@ -666,6 +682,7 @@ acpi_ev_install_handler(acpi_handle obj_handle,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (!obj_desc) { if (!obj_desc) {
/* No object, just exit */ /* No object, just exit */
return (AE_OK); return (AE_OK);
...@@ -674,10 +691,12 @@ acpi_ev_install_handler(acpi_handle obj_handle, ...@@ -674,10 +691,12 @@ acpi_ev_install_handler(acpi_handle obj_handle,
/* Devices are handled different than regions */ /* Devices are handled different than regions */
if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_DEVICE) { if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_DEVICE) {
/* Check if this Device already has a handler for this address space */ /* Check if this Device already has a handler for this address space */
next_handler_obj = obj_desc->device.handler; next_handler_obj = obj_desc->device.handler;
while (next_handler_obj) { while (next_handler_obj) {
/* Found a handler, is it for the same address space? */ /* Found a handler, is it for the same address space? */
if (next_handler_obj->address_space.space_id == if (next_handler_obj->address_space.space_id ==
...@@ -764,9 +783,9 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node, ...@@ -764,9 +783,9 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
union acpi_operand_object *handler_obj; union acpi_operand_object *handler_obj;
acpi_status status; acpi_status status;
acpi_object_type type; acpi_object_type type;
u16 flags = 0; u8 flags = 0;
ACPI_FUNCTION_TRACE("ev_install_space_handler"); ACPI_FUNCTION_TRACE(ev_install_space_handler);
/* /*
* This registration is valid for only the types below * This registration is valid for only the types below
...@@ -839,6 +858,7 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node, ...@@ -839,6 +858,7 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
/* Walk the handler list for this device */ /* Walk the handler list for this device */
while (handler_obj) { while (handler_obj) {
/* Same space_id indicates a handler already installed */ /* Same space_id indicates a handler already installed */
if (handler_obj->address_space.space_id == space_id) { if (handler_obj->address_space.space_id == space_id) {
...@@ -921,7 +941,7 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node, ...@@ -921,7 +941,7 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
/* Init handler obj */ /* Init handler obj */
handler_obj->address_space.space_id = (u8) space_id; handler_obj->address_space.space_id = (u8) space_id;
handler_obj->address_space.hflags = flags; handler_obj->address_space.handler_flags = flags;
handler_obj->address_space.region_list = NULL; handler_obj->address_space.region_list = NULL;
handler_obj->address_space.node = node; handler_obj->address_space.node = node;
handler_obj->address_space.handler = handler; handler_obj->address_space.handler = handler;
...@@ -979,7 +999,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, ...@@ -979,7 +999,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_execute_reg_methods"); ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
/* /*
* Run all _REG methods for all Operation Regions for this * Run all _REG methods for all Operation Regions for this
...@@ -1001,7 +1021,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, ...@@ -1001,7 +1021,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
* *
* PARAMETERS: walk_namespace callback * PARAMETERS: walk_namespace callback
* *
* DESCRIPTION: Run _REg method for region objects of the requested space_iD * DESCRIPTION: Run _REG method for region objects of the requested space_iD
* *
******************************************************************************/ ******************************************************************************/
...@@ -1035,6 +1055,7 @@ acpi_ev_reg_run(acpi_handle obj_handle, ...@@ -1035,6 +1055,7 @@ acpi_ev_reg_run(acpi_handle obj_handle,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (!obj_desc) { if (!obj_desc) {
/* No object, just exit */ /* No object, just exit */
return (AE_OK); return (AE_OK);
......
...@@ -71,11 +71,22 @@ acpi_ev_system_memory_region_setup(acpi_handle handle, ...@@ -71,11 +71,22 @@ acpi_ev_system_memory_region_setup(acpi_handle handle,
(union acpi_operand_object *)handle; (union acpi_operand_object *)handle;
struct acpi_mem_space_context *local_region_context; struct acpi_mem_space_context *local_region_context;
ACPI_FUNCTION_TRACE("ev_system_memory_region_setup"); ACPI_FUNCTION_TRACE(ev_system_memory_region_setup);
if (function == ACPI_REGION_DEACTIVATE) { if (function == ACPI_REGION_DEACTIVATE) {
if (*region_context) { if (*region_context) {
ACPI_MEM_FREE(*region_context); local_region_context =
(struct acpi_mem_space_context *)*region_context;
/* Delete a cached mapping if present */
if (local_region_context->mapped_length) {
acpi_os_unmap_memory(local_region_context->
mapped_logical_address,
local_region_context->
mapped_length);
}
ACPI_FREE(local_region_context);
*region_context = NULL; *region_context = NULL;
} }
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
...@@ -84,7 +95,7 @@ acpi_ev_system_memory_region_setup(acpi_handle handle, ...@@ -84,7 +95,7 @@ acpi_ev_system_memory_region_setup(acpi_handle handle,
/* Create a new context */ /* Create a new context */
local_region_context = local_region_context =
ACPI_MEM_CALLOCATE(sizeof(struct acpi_mem_space_context)); ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_mem_space_context));
if (!(local_region_context)) { if (!(local_region_context)) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
...@@ -118,7 +129,7 @@ acpi_ev_io_space_region_setup(acpi_handle handle, ...@@ -118,7 +129,7 @@ acpi_ev_io_space_region_setup(acpi_handle handle,
u32 function, u32 function,
void *handler_context, void **region_context) void *handler_context, void **region_context)
{ {
ACPI_FUNCTION_TRACE("ev_io_space_region_setup"); ACPI_FUNCTION_TRACE(ev_io_space_region_setup);
if (function == ACPI_REGION_DEACTIVATE) { if (function == ACPI_REGION_DEACTIVATE) {
*region_context = NULL; *region_context = NULL;
...@@ -161,7 +172,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle, ...@@ -161,7 +172,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
(union acpi_operand_object *)handle; (union acpi_operand_object *)handle;
struct acpi_device_id object_hID; struct acpi_device_id object_hID;
ACPI_FUNCTION_TRACE("ev_pci_config_region_setup"); ACPI_FUNCTION_TRACE(ev_pci_config_region_setup);
handler_obj = region_obj->region.handler; handler_obj = region_obj->region.handler;
if (!handler_obj) { if (!handler_obj) {
...@@ -178,7 +189,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle, ...@@ -178,7 +189,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
*region_context = NULL; *region_context = NULL;
if (function == ACPI_REGION_DEACTIVATE) { if (function == ACPI_REGION_DEACTIVATE) {
if (pci_id) { if (pci_id) {
ACPI_MEM_FREE(pci_id); ACPI_FREE(pci_id);
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -199,6 +210,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle, ...@@ -199,6 +210,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
* handlers with that device. * handlers with that device.
*/ */
if (handler_obj->address_space.node == acpi_gbl_root_node) { if (handler_obj->address_space.node == acpi_gbl_root_node) {
/* Start search from the parent object */ /* Start search from the parent object */
pci_root_node = parent_node; pci_root_node = parent_node;
...@@ -220,6 +232,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle, ...@@ -220,6 +232,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
PCI_EXPRESS_ROOT_HID_STRING, PCI_EXPRESS_ROOT_HID_STRING,
sizeof(PCI_EXPRESS_ROOT_HID_STRING))))) sizeof(PCI_EXPRESS_ROOT_HID_STRING)))))
{ {
/* Install a handler for this PCI root bridge */ /* Install a handler for this PCI root bridge */
status = status =
...@@ -235,7 +248,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle, ...@@ -235,7 +248,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
} else { } else {
ACPI_EXCEPTION((AE_INFO, ACPI_EXCEPTION((AE_INFO,
status, status,
"Could not install pci_config handler for Root Bridge %4.4s", "Could not install PciConfig handler for Root Bridge %4.4s",
acpi_ut_get_node_name acpi_ut_get_node_name
(pci_root_node))); (pci_root_node)));
} }
...@@ -262,7 +275,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle, ...@@ -262,7 +275,7 @@ acpi_ev_pci_config_region_setup(acpi_handle handle,
/* Region is still not initialized. Create a new context */ /* Region is still not initialized. Create a new context */
pci_id = ACPI_MEM_CALLOCATE(sizeof(struct acpi_pci_id)); pci_id = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_pci_id));
if (!pci_id) { if (!pci_id) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
...@@ -337,7 +350,7 @@ acpi_ev_pci_bar_region_setup(acpi_handle handle, ...@@ -337,7 +350,7 @@ acpi_ev_pci_bar_region_setup(acpi_handle handle,
u32 function, u32 function,
void *handler_context, void **region_context) void *handler_context, void **region_context)
{ {
ACPI_FUNCTION_TRACE("ev_pci_bar_region_setup"); ACPI_FUNCTION_TRACE(ev_pci_bar_region_setup);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -364,7 +377,7 @@ acpi_ev_cmos_region_setup(acpi_handle handle, ...@@ -364,7 +377,7 @@ acpi_ev_cmos_region_setup(acpi_handle handle,
u32 function, u32 function,
void *handler_context, void **region_context) void *handler_context, void **region_context)
{ {
ACPI_FUNCTION_TRACE("ev_cmos_region_setup"); ACPI_FUNCTION_TRACE(ev_cmos_region_setup);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
...@@ -389,7 +402,7 @@ acpi_ev_default_region_setup(acpi_handle handle, ...@@ -389,7 +402,7 @@ acpi_ev_default_region_setup(acpi_handle handle,
u32 function, u32 function,
void *handler_context, void **region_context) void *handler_context, void **region_context)
{ {
ACPI_FUNCTION_TRACE("ev_default_region_setup"); ACPI_FUNCTION_TRACE(ev_default_region_setup);
if (function == ACPI_REGION_DEACTIVATE) { if (function == ACPI_REGION_DEACTIVATE) {
*region_context = NULL; *region_context = NULL;
...@@ -435,7 +448,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -435,7 +448,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG; acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;
union acpi_operand_object *region_obj2; union acpi_operand_object *region_obj2;
ACPI_FUNCTION_TRACE_U32("ev_initialize_region", acpi_ns_locked); ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked);
if (!region_obj) { if (!region_obj) {
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
...@@ -462,8 +475,9 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -462,8 +475,9 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
/* Find any "_REG" method associated with this region definition */ /* Find any "_REG" method associated with this region definition */
status = acpi_ns_search_node(*reg_name_ptr, node, status =
ACPI_TYPE_METHOD, &method_node); acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
&method_node);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
/* /*
* The _REG method is optional and there can be only one per region * The _REG method is optional and there can be only one per region
...@@ -478,11 +492,13 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -478,11 +492,13 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
* ie: acpi_gbl_root_node->parent_entry being set to NULL * ie: acpi_gbl_root_node->parent_entry being set to NULL
*/ */
while (node) { while (node) {
/* Check to see if a handler exists */ /* Check to see if a handler exists */
handler_obj = NULL; handler_obj = NULL;
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (obj_desc) { if (obj_desc) {
/* Can only be a handler if the object exists */ /* Can only be a handler if the object exists */
switch (node->type) { switch (node->type) {
...@@ -507,10 +523,12 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -507,10 +523,12 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
} }
while (handler_obj) { while (handler_obj) {
/* Is this handler of the correct type? */ /* Is this handler of the correct type? */
if (handler_obj->address_space.space_id == if (handler_obj->address_space.space_id ==
space_id) { space_id) {
/* Found correct handler */ /* Found correct handler */
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
...@@ -571,7 +589,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -571,7 +589,7 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
/* If we get here, there is no handler for this region */ /* If we get here, there is no handler for this region */
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"No handler for region_type %s(%X) (region_obj %p)\n", "No handler for RegionType %s(%X) (RegionObj %p)\n",
acpi_ut_get_region_name(space_id), space_id, acpi_ut_get_region_name(space_id), space_id,
region_obj)); region_obj));
......
...@@ -69,7 +69,7 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context) ...@@ -69,7 +69,7 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
struct acpi_gpe_xrupt_info *gpe_xrupt_list = context; struct acpi_gpe_xrupt_info *gpe_xrupt_list = context;
u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED; u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED;
ACPI_FUNCTION_TRACE("ev_sci_xrupt_handler"); ACPI_FUNCTION_TRACE(ev_sci_xrupt_handler);
/* /*
* We are guaranteed by the ACPI CA initialization/shutdown code that * We are guaranteed by the ACPI CA initialization/shutdown code that
...@@ -108,7 +108,7 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context) ...@@ -108,7 +108,7 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
struct acpi_gpe_xrupt_info *gpe_xrupt_list = context; struct acpi_gpe_xrupt_info *gpe_xrupt_list = context;
u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED; u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED;
ACPI_FUNCTION_TRACE("ev_gpe_xrupt_handler"); ACPI_FUNCTION_TRACE(ev_gpe_xrupt_handler);
/* /*
* We are guaranteed by the ACPI CA initialization/shutdown code that * We are guaranteed by the ACPI CA initialization/shutdown code that
...@@ -140,7 +140,7 @@ u32 acpi_ev_install_sci_handler(void) ...@@ -140,7 +140,7 @@ u32 acpi_ev_install_sci_handler(void)
{ {
u32 status = AE_OK; u32 status = AE_OK;
ACPI_FUNCTION_TRACE("ev_install_sci_handler"); ACPI_FUNCTION_TRACE(ev_install_sci_handler);
status = acpi_os_install_interrupt_handler((u32) acpi_gbl_FADT->sci_int, status = acpi_os_install_interrupt_handler((u32) acpi_gbl_FADT->sci_int,
acpi_ev_sci_xrupt_handler, acpi_ev_sci_xrupt_handler,
...@@ -171,7 +171,7 @@ acpi_status acpi_ev_remove_sci_handler(void) ...@@ -171,7 +171,7 @@ acpi_status acpi_ev_remove_sci_handler(void)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("ev_remove_sci_handler"); ACPI_FUNCTION_TRACE(ev_remove_sci_handler);
/* Just let the OS remove the handler and disable the level */ /* Just let the OS remove the handler and disable the level */
......
...@@ -41,8 +41,6 @@ ...@@ -41,8 +41,6 @@
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
*/ */
#include <linux/module.h>
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acevents.h> #include <acpi/acevents.h>
...@@ -68,7 +66,7 @@ acpi_status acpi_install_exception_handler(acpi_exception_handler handler) ...@@ -68,7 +66,7 @@ acpi_status acpi_install_exception_handler(acpi_exception_handler handler)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("acpi_install_exception_handler"); ACPI_FUNCTION_TRACE(acpi_install_exception_handler);
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
...@@ -90,6 +88,8 @@ acpi_status acpi_install_exception_handler(acpi_exception_handler handler) ...@@ -90,6 +88,8 @@ acpi_status acpi_install_exception_handler(acpi_exception_handler handler)
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_install_exception_handler)
#endif /* ACPI_FUTURE_USAGE */ #endif /* ACPI_FUTURE_USAGE */
/******************************************************************************* /*******************************************************************************
...@@ -107,14 +107,13 @@ acpi_status acpi_install_exception_handler(acpi_exception_handler handler) ...@@ -107,14 +107,13 @@ acpi_status acpi_install_exception_handler(acpi_exception_handler handler)
* event. * event.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_install_fixed_event_handler(u32 event, acpi_install_fixed_event_handler(u32 event,
acpi_event_handler handler, void *context) acpi_event_handler handler, void *context)
{ {
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("acpi_install_fixed_event_handler"); ACPI_FUNCTION_TRACE(acpi_install_fixed_event_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -161,7 +160,7 @@ acpi_install_fixed_event_handler(u32 event, ...@@ -161,7 +160,7 @@ acpi_install_fixed_event_handler(u32 event,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_install_fixed_event_handler); ACPI_EXPORT_SYMBOL(acpi_install_fixed_event_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -175,13 +174,12 @@ EXPORT_SYMBOL(acpi_install_fixed_event_handler); ...@@ -175,13 +174,12 @@ EXPORT_SYMBOL(acpi_install_fixed_event_handler);
* DESCRIPTION: Disables the event and unregisters the event handler. * DESCRIPTION: Disables the event and unregisters the event handler.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler) acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("acpi_remove_fixed_event_handler"); ACPI_FUNCTION_TRACE(acpi_remove_fixed_event_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -216,7 +214,7 @@ acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler) ...@@ -216,7 +214,7 @@ acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_remove_fixed_event_handler); ACPI_EXPORT_SYMBOL(acpi_remove_fixed_event_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -235,7 +233,6 @@ EXPORT_SYMBOL(acpi_remove_fixed_event_handler); ...@@ -235,7 +233,6 @@ EXPORT_SYMBOL(acpi_remove_fixed_event_handler);
* DESCRIPTION: Install a handler for notifies on an ACPI device * DESCRIPTION: Install a handler for notifies on an ACPI device
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_install_notify_handler(acpi_handle device, acpi_install_notify_handler(acpi_handle device,
u32 handler_type, u32 handler_type,
...@@ -246,7 +243,7 @@ acpi_install_notify_handler(acpi_handle device, ...@@ -246,7 +243,7 @@ acpi_install_notify_handler(acpi_handle device,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("acpi_install_notify_handler"); ACPI_FUNCTION_TRACE(acpi_install_notify_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -275,6 +272,7 @@ acpi_install_notify_handler(acpi_handle device, ...@@ -275,6 +272,7 @@ acpi_install_notify_handler(acpi_handle device,
* only one <external> global handler can be regsitered (per notify type). * only one <external> global handler can be regsitered (per notify type).
*/ */
if (device == ACPI_ROOT_OBJECT) { if (device == ACPI_ROOT_OBJECT) {
/* Make sure the handler is not already installed */ /* Make sure the handler is not already installed */
if (((handler_type & ACPI_SYSTEM_NOTIFY) && if (((handler_type & ACPI_SYSTEM_NOTIFY) &&
...@@ -317,6 +315,7 @@ acpi_install_notify_handler(acpi_handle device, ...@@ -317,6 +315,7 @@ acpi_install_notify_handler(acpi_handle device,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (obj_desc) { if (obj_desc) {
/* Object exists - make sure there's no handler */ /* Object exists - make sure there's no handler */
if (((handler_type & ACPI_SYSTEM_NOTIFY) && if (((handler_type & ACPI_SYSTEM_NOTIFY) &&
...@@ -370,6 +369,7 @@ acpi_install_notify_handler(acpi_handle device, ...@@ -370,6 +369,7 @@ acpi_install_notify_handler(acpi_handle device,
} }
if (handler_type == ACPI_ALL_NOTIFY) { if (handler_type == ACPI_ALL_NOTIFY) {
/* Extra ref if installed in both */ /* Extra ref if installed in both */
acpi_ut_add_reference(notify_obj); acpi_ut_add_reference(notify_obj);
...@@ -381,7 +381,7 @@ acpi_install_notify_handler(acpi_handle device, ...@@ -381,7 +381,7 @@ acpi_install_notify_handler(acpi_handle device,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_install_notify_handler); ACPI_EXPORT_SYMBOL(acpi_install_notify_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -399,7 +399,6 @@ EXPORT_SYMBOL(acpi_install_notify_handler); ...@@ -399,7 +399,6 @@ EXPORT_SYMBOL(acpi_install_notify_handler);
* DESCRIPTION: Remove a handler for notifies on an ACPI device * DESCRIPTION: Remove a handler for notifies on an ACPI device
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_remove_notify_handler(acpi_handle device, acpi_remove_notify_handler(acpi_handle device,
u32 handler_type, acpi_notify_handler handler) u32 handler_type, acpi_notify_handler handler)
...@@ -409,7 +408,7 @@ acpi_remove_notify_handler(acpi_handle device, ...@@ -409,7 +408,7 @@ acpi_remove_notify_handler(acpi_handle device,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("acpi_remove_notify_handler"); ACPI_FUNCTION_TRACE(acpi_remove_notify_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -535,7 +534,7 @@ acpi_remove_notify_handler(acpi_handle device, ...@@ -535,7 +534,7 @@ acpi_remove_notify_handler(acpi_handle device,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_remove_notify_handler); ACPI_EXPORT_SYMBOL(acpi_remove_notify_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -554,7 +553,6 @@ EXPORT_SYMBOL(acpi_remove_notify_handler); ...@@ -554,7 +553,6 @@ EXPORT_SYMBOL(acpi_remove_notify_handler);
* DESCRIPTION: Install a handler for a General Purpose Event. * DESCRIPTION: Install a handler for a General Purpose Event.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_install_gpe_handler(acpi_handle gpe_device, acpi_install_gpe_handler(acpi_handle gpe_device,
u32 gpe_number, u32 gpe_number,
...@@ -565,7 +563,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device, ...@@ -565,7 +563,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
acpi_status status; acpi_status status;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("acpi_install_gpe_handler"); ACPI_FUNCTION_TRACE(acpi_install_gpe_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -596,7 +594,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device, ...@@ -596,7 +594,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
/* Allocate and init handler object */ /* Allocate and init handler object */
handler = ACPI_MEM_CALLOCATE(sizeof(struct acpi_handler_info)); handler = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_handler_info));
if (!handler) { if (!handler) {
status = AE_NO_MEMORY; status = AE_NO_MEMORY;
goto unlock_and_exit; goto unlock_and_exit;
...@@ -630,7 +628,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device, ...@@ -630,7 +628,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_install_gpe_handler); ACPI_EXPORT_SYMBOL(acpi_install_gpe_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -646,7 +644,6 @@ EXPORT_SYMBOL(acpi_install_gpe_handler); ...@@ -646,7 +644,6 @@ EXPORT_SYMBOL(acpi_install_gpe_handler);
* DESCRIPTION: Remove a handler for a General Purpose acpi_event. * DESCRIPTION: Remove a handler for a General Purpose acpi_event.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_remove_gpe_handler(acpi_handle gpe_device, acpi_remove_gpe_handler(acpi_handle gpe_device,
u32 gpe_number, acpi_event_handler address) u32 gpe_number, acpi_event_handler address)
...@@ -656,7 +653,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, ...@@ -656,7 +653,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
acpi_status status; acpi_status status;
acpi_cpu_flags flags; acpi_cpu_flags flags;
ACPI_FUNCTION_TRACE("acpi_remove_gpe_handler"); ACPI_FUNCTION_TRACE(acpi_remove_gpe_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -724,14 +721,14 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, ...@@ -724,14 +721,14 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
/* Now we can free the handler object */ /* Now we can free the handler object */
ACPI_MEM_FREE(handler); ACPI_FREE(handler);
unlock_and_exit: unlock_and_exit:
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_remove_gpe_handler); ACPI_EXPORT_SYMBOL(acpi_remove_gpe_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -746,7 +743,6 @@ EXPORT_SYMBOL(acpi_remove_gpe_handler); ...@@ -746,7 +743,6 @@ EXPORT_SYMBOL(acpi_remove_gpe_handler);
* DESCRIPTION: Acquire the ACPI Global Lock * DESCRIPTION: Acquire the ACPI Global Lock
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle) acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle)
{ {
acpi_status status; acpi_status status;
...@@ -771,7 +767,7 @@ acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle) ...@@ -771,7 +767,7 @@ acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle)
return (status); return (status);
} }
EXPORT_SYMBOL(acpi_acquire_global_lock); ACPI_EXPORT_SYMBOL(acpi_acquire_global_lock)
/******************************************************************************* /*******************************************************************************
* *
...@@ -784,7 +780,6 @@ EXPORT_SYMBOL(acpi_acquire_global_lock); ...@@ -784,7 +780,6 @@ EXPORT_SYMBOL(acpi_acquire_global_lock);
* DESCRIPTION: Release the ACPI Global Lock. The handle must be valid. * DESCRIPTION: Release the ACPI Global Lock. The handle must be valid.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_release_global_lock(u32 handle) acpi_status acpi_release_global_lock(u32 handle)
{ {
acpi_status status; acpi_status status;
...@@ -797,4 +792,4 @@ acpi_status acpi_release_global_lock(u32 handle) ...@@ -797,4 +792,4 @@ acpi_status acpi_release_global_lock(u32 handle)
return (status); return (status);
} }
EXPORT_SYMBOL(acpi_release_global_lock); ACPI_EXPORT_SYMBOL(acpi_release_global_lock)
...@@ -41,8 +41,6 @@ ...@@ -41,8 +41,6 @@
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
*/ */
#include <linux/module.h>
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <acpi/acevents.h> #include <acpi/acevents.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
...@@ -65,7 +63,7 @@ acpi_status acpi_enable(void) ...@@ -65,7 +63,7 @@ acpi_status acpi_enable(void)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("acpi_enable"); ACPI_FUNCTION_TRACE(acpi_enable);
/* Make sure we have the FADT */ /* Make sure we have the FADT */
...@@ -94,6 +92,8 @@ acpi_status acpi_enable(void) ...@@ -94,6 +92,8 @@ acpi_status acpi_enable(void)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_enable)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_disable * FUNCTION: acpi_disable
...@@ -105,12 +105,11 @@ acpi_status acpi_enable(void) ...@@ -105,12 +105,11 @@ acpi_status acpi_enable(void)
* DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode. * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_disable(void) acpi_status acpi_disable(void)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("acpi_disable"); ACPI_FUNCTION_TRACE(acpi_disable);
if (!acpi_gbl_FADT) { if (!acpi_gbl_FADT) {
ACPI_WARNING((AE_INFO, "No FADT information present!")); ACPI_WARNING((AE_INFO, "No FADT information present!"));
...@@ -137,6 +136,8 @@ acpi_status acpi_disable(void) ...@@ -137,6 +136,8 @@ acpi_status acpi_disable(void)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_disable)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_enable_event * FUNCTION: acpi_enable_event
...@@ -149,13 +150,12 @@ acpi_status acpi_disable(void) ...@@ -149,13 +150,12 @@ acpi_status acpi_disable(void)
* DESCRIPTION: Enable an ACPI event (fixed) * DESCRIPTION: Enable an ACPI event (fixed)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_enable_event(u32 event, u32 flags) acpi_status acpi_enable_event(u32 event, u32 flags)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
u32 value; u32 value;
ACPI_FUNCTION_TRACE("acpi_enable_event"); ACPI_FUNCTION_TRACE(acpi_enable_event);
/* Decode the Fixed Event */ /* Decode the Fixed Event */
...@@ -193,7 +193,7 @@ acpi_status acpi_enable_event(u32 event, u32 flags) ...@@ -193,7 +193,7 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_enable_event); ACPI_EXPORT_SYMBOL(acpi_enable_event)
/******************************************************************************* /*******************************************************************************
* *
...@@ -208,13 +208,12 @@ EXPORT_SYMBOL(acpi_enable_event); ...@@ -208,13 +208,12 @@ EXPORT_SYMBOL(acpi_enable_event);
* DESCRIPTION: Set the type of an individual GPE * DESCRIPTION: Set the type of an individual GPE
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type) acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_gpe_event_info *gpe_event_info; struct acpi_gpe_event_info *gpe_event_info;
ACPI_FUNCTION_TRACE("acpi_set_gpe_type"); ACPI_FUNCTION_TRACE(acpi_set_gpe_type);
/* Ensure that we have a valid GPE number */ /* Ensure that we have a valid GPE number */
...@@ -236,7 +235,7 @@ acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type) ...@@ -236,7 +235,7 @@ acpi_status acpi_set_gpe_type(acpi_handle gpe_device, u32 gpe_number, u8 type)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_set_gpe_type); ACPI_EXPORT_SYMBOL(acpi_set_gpe_type)
/******************************************************************************* /*******************************************************************************
* *
...@@ -252,13 +251,12 @@ EXPORT_SYMBOL(acpi_set_gpe_type); ...@@ -252,13 +251,12 @@ EXPORT_SYMBOL(acpi_set_gpe_type);
* DESCRIPTION: Enable an ACPI event (general purpose) * DESCRIPTION: Enable an ACPI event (general purpose)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_gpe_event_info *gpe_event_info; struct acpi_gpe_event_info *gpe_event_info;
ACPI_FUNCTION_TRACE("acpi_enable_gpe"); ACPI_FUNCTION_TRACE(acpi_enable_gpe);
/* Use semaphore lock if not executing at interrupt level */ /* Use semaphore lock if not executing at interrupt level */
...@@ -288,7 +286,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) ...@@ -288,7 +286,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_enable_gpe); ACPI_EXPORT_SYMBOL(acpi_enable_gpe)
/******************************************************************************* /*******************************************************************************
* *
...@@ -304,13 +302,12 @@ EXPORT_SYMBOL(acpi_enable_gpe); ...@@ -304,13 +302,12 @@ EXPORT_SYMBOL(acpi_enable_gpe);
* DESCRIPTION: Disable an ACPI event (general purpose) * DESCRIPTION: Disable an ACPI event (general purpose)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_gpe_event_info *gpe_event_info; struct acpi_gpe_event_info *gpe_event_info;
ACPI_FUNCTION_TRACE("acpi_disable_gpe"); ACPI_FUNCTION_TRACE(acpi_disable_gpe);
/* Use semaphore lock if not executing at interrupt level */ /* Use semaphore lock if not executing at interrupt level */
...@@ -338,6 +335,8 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) ...@@ -338,6 +335,8 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_disable_gpe)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_disable_event * FUNCTION: acpi_disable_event
...@@ -350,13 +349,12 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) ...@@ -350,13 +349,12 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
* DESCRIPTION: Disable an ACPI event (fixed) * DESCRIPTION: Disable an ACPI event (fixed)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_disable_event(u32 event, u32 flags) acpi_status acpi_disable_event(u32 event, u32 flags)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
u32 value; u32 value;
ACPI_FUNCTION_TRACE("acpi_disable_event"); ACPI_FUNCTION_TRACE(acpi_disable_event);
/* Decode the Fixed Event */ /* Decode the Fixed Event */
...@@ -392,7 +390,7 @@ acpi_status acpi_disable_event(u32 event, u32 flags) ...@@ -392,7 +390,7 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_disable_event); ACPI_EXPORT_SYMBOL(acpi_disable_event)
/******************************************************************************* /*******************************************************************************
* *
...@@ -405,12 +403,11 @@ EXPORT_SYMBOL(acpi_disable_event); ...@@ -405,12 +403,11 @@ EXPORT_SYMBOL(acpi_disable_event);
* DESCRIPTION: Clear an ACPI event (fixed) * DESCRIPTION: Clear an ACPI event (fixed)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_clear_event(u32 event) acpi_status acpi_clear_event(u32 event)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("acpi_clear_event"); ACPI_FUNCTION_TRACE(acpi_clear_event);
/* Decode the Fixed Event */ /* Decode the Fixed Event */
...@@ -429,7 +426,7 @@ acpi_status acpi_clear_event(u32 event) ...@@ -429,7 +426,7 @@ acpi_status acpi_clear_event(u32 event)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_clear_event); ACPI_EXPORT_SYMBOL(acpi_clear_event)
/******************************************************************************* /*******************************************************************************
* *
...@@ -444,13 +441,12 @@ EXPORT_SYMBOL(acpi_clear_event); ...@@ -444,13 +441,12 @@ EXPORT_SYMBOL(acpi_clear_event);
* DESCRIPTION: Clear an ACPI event (general purpose) * DESCRIPTION: Clear an ACPI event (general purpose)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_gpe_event_info *gpe_event_info; struct acpi_gpe_event_info *gpe_event_info;
ACPI_FUNCTION_TRACE("acpi_clear_gpe"); ACPI_FUNCTION_TRACE(acpi_clear_gpe);
/* Use semaphore lock if not executing at interrupt level */ /* Use semaphore lock if not executing at interrupt level */
...@@ -478,6 +474,8 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) ...@@ -478,6 +474,8 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_clear_gpe)
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
/******************************************************************************* /*******************************************************************************
* *
...@@ -492,12 +490,11 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) ...@@ -492,12 +490,11 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags)
* DESCRIPTION: Obtains and returns the current status of the event * DESCRIPTION: Obtains and returns the current status of the event
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status) acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("acpi_get_event_status"); ACPI_FUNCTION_TRACE(acpi_get_event_status);
if (!event_status) { if (!event_status) {
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
...@@ -518,6 +515,8 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status) ...@@ -518,6 +515,8 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_get_event_status)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_get_gpe_status * FUNCTION: acpi_get_gpe_status
...@@ -533,7 +532,6 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status) ...@@ -533,7 +532,6 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status)
* DESCRIPTION: Get status of an event (general purpose) * DESCRIPTION: Get status of an event (general purpose)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_get_gpe_status(acpi_handle gpe_device, acpi_get_gpe_status(acpi_handle gpe_device,
u32 gpe_number, u32 flags, acpi_event_status * event_status) u32 gpe_number, u32 flags, acpi_event_status * event_status)
...@@ -541,7 +539,7 @@ acpi_get_gpe_status(acpi_handle gpe_device, ...@@ -541,7 +539,7 @@ acpi_get_gpe_status(acpi_handle gpe_device,
acpi_status status = AE_OK; acpi_status status = AE_OK;
struct acpi_gpe_event_info *gpe_event_info; struct acpi_gpe_event_info *gpe_event_info;
ACPI_FUNCTION_TRACE("acpi_get_gpe_status"); ACPI_FUNCTION_TRACE(acpi_get_gpe_status);
/* Use semaphore lock if not executing at interrupt level */ /* Use semaphore lock if not executing at interrupt level */
...@@ -570,6 +568,8 @@ acpi_get_gpe_status(acpi_handle gpe_device, ...@@ -570,6 +568,8 @@ acpi_get_gpe_status(acpi_handle gpe_device,
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_EXPORT_SYMBOL(acpi_get_gpe_status)
#endif /* ACPI_FUTURE_USAGE */ #endif /* ACPI_FUTURE_USAGE */
/******************************************************************************* /*******************************************************************************
...@@ -586,7 +586,6 @@ acpi_get_gpe_status(acpi_handle gpe_device, ...@@ -586,7 +586,6 @@ acpi_get_gpe_status(acpi_handle gpe_device,
* DESCRIPTION: Create and Install a block of GPE registers * DESCRIPTION: Create and Install a block of GPE registers
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_install_gpe_block(acpi_handle gpe_device, acpi_install_gpe_block(acpi_handle gpe_device,
struct acpi_generic_address *gpe_block_address, struct acpi_generic_address *gpe_block_address,
...@@ -597,7 +596,7 @@ acpi_install_gpe_block(acpi_handle gpe_device, ...@@ -597,7 +596,7 @@ acpi_install_gpe_block(acpi_handle gpe_device,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
struct acpi_gpe_block_info *gpe_block; struct acpi_gpe_block_info *gpe_block;
ACPI_FUNCTION_TRACE("acpi_install_gpe_block"); ACPI_FUNCTION_TRACE(acpi_install_gpe_block);
if ((!gpe_device) || (!gpe_block_address) || (!register_count)) { if ((!gpe_device) || (!gpe_block_address) || (!register_count)) {
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
...@@ -636,6 +635,7 @@ acpi_install_gpe_block(acpi_handle gpe_device, ...@@ -636,6 +635,7 @@ acpi_install_gpe_block(acpi_handle gpe_device,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (!obj_desc) { if (!obj_desc) {
/* No object, create a new one */ /* No object, create a new one */
obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_DEVICE); obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_DEVICE);
...@@ -665,7 +665,7 @@ acpi_install_gpe_block(acpi_handle gpe_device, ...@@ -665,7 +665,7 @@ acpi_install_gpe_block(acpi_handle gpe_device,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_install_gpe_block); ACPI_EXPORT_SYMBOL(acpi_install_gpe_block)
/******************************************************************************* /*******************************************************************************
* *
...@@ -678,14 +678,13 @@ EXPORT_SYMBOL(acpi_install_gpe_block); ...@@ -678,14 +678,13 @@ EXPORT_SYMBOL(acpi_install_gpe_block);
* DESCRIPTION: Remove a previously installed block of GPE registers * DESCRIPTION: Remove a previously installed block of GPE registers
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_remove_gpe_block(acpi_handle gpe_device) acpi_status acpi_remove_gpe_block(acpi_handle gpe_device)
{ {
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_status status; acpi_status status;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
ACPI_FUNCTION_TRACE("acpi_remove_gpe_block"); ACPI_FUNCTION_TRACE(acpi_remove_gpe_block);
if (!gpe_device) { if (!gpe_device) {
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
...@@ -721,4 +720,4 @@ acpi_status acpi_remove_gpe_block(acpi_handle gpe_device) ...@@ -721,4 +720,4 @@ acpi_status acpi_remove_gpe_block(acpi_handle gpe_device)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_remove_gpe_block); ACPI_EXPORT_SYMBOL(acpi_remove_gpe_block)
...@@ -42,8 +42,6 @@ ...@@ -42,8 +42,6 @@
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
*/ */
#include <linux/module.h>
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acevents.h> #include <acpi/acevents.h>
...@@ -75,7 +73,7 @@ acpi_install_address_space_handler(acpi_handle device, ...@@ -75,7 +73,7 @@ acpi_install_address_space_handler(acpi_handle device,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("acpi_install_address_space_handler"); ACPI_FUNCTION_TRACE(acpi_install_address_space_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -114,7 +112,7 @@ acpi_install_address_space_handler(acpi_handle device, ...@@ -114,7 +112,7 @@ acpi_install_address_space_handler(acpi_handle device,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_install_address_space_handler); ACPI_EXPORT_SYMBOL(acpi_install_address_space_handler)
/******************************************************************************* /*******************************************************************************
* *
...@@ -129,7 +127,6 @@ EXPORT_SYMBOL(acpi_install_address_space_handler); ...@@ -129,7 +127,6 @@ EXPORT_SYMBOL(acpi_install_address_space_handler);
* DESCRIPTION: Remove a previously installed handler. * DESCRIPTION: Remove a previously installed handler.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_remove_address_space_handler(acpi_handle device, acpi_remove_address_space_handler(acpi_handle device,
acpi_adr_space_type space_id, acpi_adr_space_type space_id,
...@@ -142,7 +139,7 @@ acpi_remove_address_space_handler(acpi_handle device, ...@@ -142,7 +139,7 @@ acpi_remove_address_space_handler(acpi_handle device,
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE("acpi_remove_address_space_handler"); ACPI_FUNCTION_TRACE(acpi_remove_address_space_handler);
/* Parameter validation */ /* Parameter validation */
...@@ -176,9 +173,11 @@ acpi_remove_address_space_handler(acpi_handle device, ...@@ -176,9 +173,11 @@ acpi_remove_address_space_handler(acpi_handle device,
handler_obj = obj_desc->device.handler; handler_obj = obj_desc->device.handler;
last_obj_ptr = &obj_desc->device.handler; last_obj_ptr = &obj_desc->device.handler;
while (handler_obj) { while (handler_obj) {
/* We have a handler, see if user requested this one */ /* We have a handler, see if user requested this one */
if (handler_obj->address_space.space_id == space_id) { if (handler_obj->address_space.space_id == space_id) {
/* Matched space_id, first dereference this in the Regions */ /* Matched space_id, first dereference this in the Regions */
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
...@@ -229,7 +228,7 @@ acpi_remove_address_space_handler(acpi_handle device, ...@@ -229,7 +228,7 @@ acpi_remove_address_space_handler(acpi_handle device,
/* The handler does not exist */ /* The handler does not exist */
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Unable to remove address handler %p for %s(%X), dev_node %p, obj %p\n", "Unable to remove address handler %p for %s(%X), DevNode %p, obj %p\n",
handler, acpi_ut_get_region_name(space_id), space_id, handler, acpi_ut_get_region_name(space_id), space_id,
node, obj_desc)); node, obj_desc));
...@@ -240,4 +239,4 @@ acpi_remove_address_space_handler(acpi_handle device, ...@@ -240,4 +239,4 @@ acpi_remove_address_space_handler(acpi_handle device,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
EXPORT_SYMBOL(acpi_remove_address_space_handler); ACPI_EXPORT_SYMBOL(acpi_remove_address_space_handler)
此差异已折叠。
...@@ -79,7 +79,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, ...@@ -79,7 +79,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
u32 count; u32 count;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE_PTR("ex_convert_to_integer", obj_desc); ACPI_FUNCTION_TRACE_PTR(ex_convert_to_integer, obj_desc);
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
case ACPI_TYPE_INTEGER: case ACPI_TYPE_INTEGER:
...@@ -199,7 +199,7 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, ...@@ -199,7 +199,7 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
union acpi_operand_object *return_desc; union acpi_operand_object *return_desc;
u8 *new_buf; u8 *new_buf;
ACPI_FUNCTION_TRACE_PTR("ex_convert_to_buffer", obj_desc); ACPI_FUNCTION_TRACE_PTR(ex_convert_to_buffer, obj_desc);
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
...@@ -319,6 +319,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer, ...@@ -319,6 +319,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,
remainder = 0; remainder = 0;
for (i = decimal_length; i > 0; i--) { for (i = decimal_length; i > 0; i--) {
/* Divide by nth factor of 10 */ /* Divide by nth factor of 10 */
digit = integer; digit = integer;
...@@ -346,6 +347,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer, ...@@ -346,6 +347,7 @@ acpi_ex_convert_to_ascii(acpi_integer integer,
hex_length = (acpi_native_uint) ACPI_MUL_2(data_width); hex_length = (acpi_native_uint) ACPI_MUL_2(data_width);
for (i = 0, j = (hex_length - 1); i < hex_length; i++, j--) { for (i = 0, j = (hex_length - 1); i < hex_length; i++, j--) {
/* Get one hex digit, most significant digits first */ /* Get one hex digit, most significant digits first */
string[k] = string[k] =
...@@ -400,7 +402,7 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc, ...@@ -400,7 +402,7 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
u16 base = 16; u16 base = 16;
u8 separator = ','; u8 separator = ',';
ACPI_FUNCTION_TRACE_PTR("ex_convert_to_string", obj_desc); ACPI_FUNCTION_TRACE_PTR(ex_convert_to_string, obj_desc);
switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
...@@ -567,7 +569,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, ...@@ -567,7 +569,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE("ex_convert_to_target_type"); ACPI_FUNCTION_TRACE(ex_convert_to_target_type);
/* Default behavior */ /* Default behavior */
...@@ -657,7 +659,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, ...@@ -657,7 +659,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown Target type ID 0x%X aml_opcode %X dest_type %s", "Unknown Target type ID 0x%X AmlOpcode %X DestType %s",
GET_CURRENT_ARG_TYPE(walk_state->op_info-> GET_CURRENT_ARG_TYPE(walk_state->op_info->
runtime_args), runtime_args),
walk_state->opcode, walk_state->opcode,
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -723,6 +723,8 @@ get_parms(char *config_record, ...@@ -723,6 +723,8 @@ get_parms(char *config_record,
goto do_fail; goto do_fail;
count = tmp1 - tmp; count = tmp1 - tmp;
*action_handle = (char *)kmalloc(count + 1, GFP_KERNEL); *action_handle = (char *)kmalloc(count + 1, GFP_KERNEL);
if (!*action_handle)
goto do_fail;
strncpy(*action_handle, tmp, count); strncpy(*action_handle, tmp, count);
*(*action_handle + count) = 0; *(*action_handle + count) = 0;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册