Commit f028ebf3 authored by Linus Torvalds's avatar Linus Torvalds

Merge http://linux-acpi.bkbits.net/linux-acpi-release-2.6.0

into home.osdl.org:/home/torvalds/v2.5/linux
parents ef4604f8 9d363b8d
......@@ -284,6 +284,16 @@ P: Jonathan Layes
L: linux-net@vger.kernel.org
S: Maintained
ASUS ACPI EXTRAS DRIVER
P: Karol Kozimor
M: sziwan@users.sourceforge.net
P: Julien Lerouge
M: julien.lerouge@free.fr
L: acpi4asus-user@lists.sourceforge.net
W: http://sourceforge.net/projects/acpi4asus
W: http://julien.lerouge.free.fr
S: Maintained
ATM
P: Chas Williams
M: chas@cmf.nrl.navy.mil
......
......@@ -183,8 +183,7 @@ acpi_parse_lapic_nmi (
#endif /*CONFIG_X86_LOCAL_APIC*/
#ifdef CONFIG_X86_IO_APIC
#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
static int __init
acpi_parse_ioapic (
......@@ -368,7 +367,6 @@ acpi_boot_init (void)
result = acpi_table_parse(ACPI_APIC, acpi_parse_madt);
if (!result) {
printk(KERN_WARNING PREFIX "MADT not present\n");
return 0;
}
else if (result < 0) {
......@@ -416,7 +414,7 @@ acpi_boot_init (void)
#endif /*CONFIG_X86_LOCAL_APIC*/
#ifdef CONFIG_X86_IO_APIC
#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
/*
* I/O APIC
......@@ -472,7 +470,8 @@ acpi_boot_init (void)
acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC;
acpi_ioapic = 1;
#endif /*CONFIG_X86_IO_APIC*/
#endif /* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */
#ifdef CONFIG_X86_LOCAL_APIC
if (acpi_lapic && acpi_ioapic) {
......@@ -480,6 +479,7 @@ acpi_boot_init (void)
clustered_apic_check();
}
#endif
#ifdef CONFIG_HPET_TIMER
acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
#endif
......
......@@ -231,7 +231,7 @@ acpi_processor_set_performance (
int state)
{
u16 port = 0;
u8 value = 0;
u16 value = 0;
int i = 0;
struct cpufreq_freqs cpufreq_freqs;
......@@ -282,9 +282,9 @@ acpi_processor_set_performance (
value = (u16) perf->states[state].control;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Writing 0x%02x to port 0x%04x\n", value, port));
"Writing 0x%04x to port 0x%04x\n", value, port));
outb(value, port);
outw(value, port);
/*
* Then we read the 'status_register' and compare the value with the
......@@ -296,12 +296,12 @@ acpi_processor_set_performance (
port = perf->status_register;
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Looking for 0x%02x from port 0x%04x\n",
(u8) perf->states[state].status, port));
"Looking for 0x%04x from port 0x%04x\n",
(u16) perf->states[state].status, port));
for (i=0; i<100; i++) {
value = inb(port);
if (value == (u8) perf->states[state].status)
value = inw(port);
if (value == (u16) perf->states[state].status)
break;
udelay(10);
}
......@@ -309,7 +309,7 @@ acpi_processor_set_performance (
/* notify cpufreq */
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
if (value != perf->states[state].status) {
if (value != (u16) perf->states[state].status) {
unsigned int tmp = cpufreq_freqs.new;
cpufreq_freqs.new = cpufreq_freqs.old;
cpufreq_freqs.old = tmp;
......
......@@ -939,11 +939,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
MATCH(DMI_BOARD_NAME, "CUR-DLS"),
NO_MATCH, NO_MATCH }},
{ force_acpi_ht, "ASUS A7V", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
MATCH(DMI_BOARD_NAME, "<A7V>"),
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1011"), NO_MATCH }},
{ force_acpi_ht, "ABIT i440BX-W83977", {
MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
......@@ -978,7 +973,10 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
{ disable_acpi_pci, "ASUS A7V", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
MATCH(DMI_BOARD_NAME, "<A7V>"),
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }},
/* newer BIOS, Revision 1011, does work */
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"),
NO_MATCH }},
#endif
{ NULL, }
......
......@@ -830,7 +830,7 @@ void __init mp_register_lapic (
MP_processor_info(&processor);
}
#ifdef CONFIG_X86_IO_APIC
#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
#define MP_ISA_BUS 0
#define MP_MAX_IOAPIC_PIN 127
......@@ -1019,10 +1019,6 @@ void __init mp_config_acpi_legacy_irqs (void)
}
}
#ifdef CONFIG_ACPI
/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */
extern FADT_DESCRIPTOR acpi_fadt;
void __init mp_config_ioapic_for_sci(int irq)
......@@ -1031,6 +1027,7 @@ void __init mp_config_ioapic_for_sci(int irq)
int ioapic_pin;
struct acpi_table_madt *madt;
struct acpi_table_int_src_ovr *entry = NULL;
acpi_interrupt_flags flags;
void *madt_end;
acpi_status status;
......@@ -1049,32 +1046,37 @@ void __init mp_config_ioapic_for_sci(int irq)
while ((void *) entry < madt_end) {
if (entry->header.type == ACPI_MADT_INT_SRC_OVR &&
acpi_fadt.sci_int == entry->bus_irq) {
/*
* See the note at the end of ACPI 2.0b section
* 5.2.10.8 for what this is about.
*/
if (entry->bus_irq != entry->global_irq) {
acpi_fadt.sci_int = entry->global_irq;
irq = entry->global_irq;
break;
}
else
return;
}
acpi_fadt.sci_int == entry->bus_irq)
goto found;
entry = (struct acpi_table_int_src_ovr *)
((unsigned long) entry + entry->header.length);
}
}
/*
* Although the ACPI spec says that the SCI should be level/low
* don't reprogram it unless there is an explicit MADT OVR entry
* instructing us to do so -- otherwise we break Tyan boards which
* have the SCI wired edge/high but no MADT OVR.
*/
return;
found:
/*
* See the note at the end of ACPI 2.0b section
* 5.2.10.8 for what this is about.
*/
flags = entry->flags;
acpi_fadt.sci_int = entry->global_irq;
irq = entry->global_irq;
ioapic = mp_find_ioapic(irq);
ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start;
io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, level triggered
io_apic_set_pci_routing(ioapic, ioapic_pin, irq,
(flags.trigger >> 1) , (flags.polarity >> 1));
}
#endif /* CONFIG_ACPI */
#ifdef CONFIG_ACPI_PCI
......@@ -1110,8 +1112,10 @@ void __init mp_parse_prt (void)
}
/* Don't set up the ACPI SCI because it's already set up */
if (acpi_fadt.sci_int == irq)
if (acpi_fadt.sci_int == irq) {
entry->irq = irq; /*we still need to set entry's irq*/
continue;
}
ioapic = mp_find_ioapic(irq);
if (ioapic < 0)
......@@ -1154,5 +1158,5 @@ void __init mp_parse_prt (void)
}
#endif /*CONFIG_ACPI_PCI*/
#endif /* CONFIG_X86_IO_APIC */
#endif /*CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER*/
#endif /*CONFIG_ACPI_BOOT*/
......@@ -64,10 +64,10 @@ struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
unsigned long mmu_cr4_features;
EXPORT_SYMBOL_GPL(mmu_cr4_features);
#ifdef CONFIG_ACPI
int acpi_disabled __initdata = 0;
#ifdef CONFIG_ACPI_INTERPRETER
int acpi_disabled = 0;
#else
int acpi_disabled __initdata = 1;
int acpi_disabled = 1;
#endif
EXPORT_SYMBOL(acpi_disabled);
......
......@@ -56,7 +56,7 @@ void (*pm_power_off) (void);
unsigned char acpi_kbd_controller_present = 1;
int acpi_disabled __initdata; /* XXX this shouldn't be needed---we can't boot without ACPI! */
int acpi_disabled; /* XXX this shouldn't be needed---we can't boot without ACPI! */
const char *
acpi_get_sysname (void)
......
......@@ -3,34 +3,14 @@
#
menu "ACPI (Advanced Configuration and Power Interface) Support"
config ACPI_HT
bool "ACPI Processor Enumeration for HT"
depends on X86
default y
---help---
ACPI enumerates both logical (a.k.a. Hyper-Threaded -- HT)
and physical processors. It is designed to obsolete several older
specifications, including the MultiProcessor Specification (MPS),
which supported only physical processors.
CONFIG_ACPI_HT includes the minimal ACPI boot-time code
necessary to enumerate logical processors and enable HT.
CONFIG_ACPI includes CONFIG_ACPI_HT, plus IO APIC enumeration,
and the hooks to run the ACPI AML interpreter for run-time events.
When CONFIG_ACPI is selected, the command-line option "acpi=ht"
is available to run just the ACPI boot-time code -- just as if
only CONFIG_ACPI_HT were selected.
Note that "acpi=off" can be used to disable all ACPI code in the kernel.
config ACPI
bool "Full ACPI Support"
depends on !X86_VISWS
depends on !IA64_HP_SIM
depends on IA64 || (X86 || ACPI_HT)
depends on IA64 || X86
config ACPI
bool "ACPI Support"
depends on IA64 || X86
default y
---help---
Advanced Configuration and Power Interface (ACPI) support for
......@@ -62,12 +42,19 @@ config ACPI
config ACPI_BOOT
bool
depends on ACPI || ACPI_HT
depends on ACPI || X86_HT
default y
config ACPI_INTERPRETER
bool
depends on ACPI
depends on !IA64_SGI_SN
default y
config ACPI_SLEEP
bool "Sleep States (EXPERIMENTAL)"
depends on X86 && ACPI
depends on ACPI_INTERPRETER
depends on EXPERIMENTAL && PM
default y
---help---
......@@ -93,7 +80,8 @@ config ACPI_SLEEP_PROC_FS
config ACPI_AC
tristate "AC Adapter"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
help
This driver adds support for the AC Adapter object, which indicates
......@@ -102,7 +90,8 @@ config ACPI_AC
config ACPI_BATTERY
tristate "Battery"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
help
This driver adds support for battery information through
......@@ -111,7 +100,7 @@ config ACPI_BATTERY
config ACPI_BUTTON
tristate "Button"
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default m
help
......@@ -123,7 +112,7 @@ config ACPI_BUTTON
config ACPI_FAN
tristate "Fan"
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default m
help
......@@ -132,7 +121,7 @@ config ACPI_FAN
config ACPI_PROCESSOR
tristate "Processor"
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default m
help
......@@ -152,14 +141,15 @@ config ACPI_THERMAL
config ACPI_NUMA
bool "NUMA support"
depends on ACPI
depends on ACPI_INTERPRETER
depends on NUMA
depends on !X86_64
default y if IA64_GENERIC || IA64_SGI_SN2
config ACPI_ASUS
tristate "ASUS/Medion Laptop Extras"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
---help---
This driver provides support for extra features of ACPI-compatible
......@@ -170,6 +160,9 @@ config ACPI_ASUS
display brightness and output, switching the LCD backlight on and off,
and most importantly, allows you to blink those fancy LEDs intended
for reporting mail and wireless status.
Note: display switching code is currently considered EXPERIMENTAL,
toying with these values may even lock your machine.
All settings are changed via /proc/acpi/asus directory entries. Owner
and group for these entries can be set with asus_uid and asus_gid
......@@ -185,7 +178,8 @@ config ACPI_ASUS
config ACPI_TOSHIBA
tristate "Toshiba Laptop Extras"
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default m
---help---
This driver adds support for access to certain system settings
......@@ -212,7 +206,7 @@ config ACPI_TOSHIBA
config ACPI_DEBUG
bool "Debug Statements"
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default n
help
......@@ -222,19 +216,14 @@ config ACPI_DEBUG
config ACPI_BUS
bool
depends on ACPI
depends on !IA64_SGI_SN
default y
config ACPI_INTERPRETER
bool
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default y
config ACPI_EC
bool
depends on X86 && ACPI
depends on X86
depends on ACPI_INTERPRETER
default y
help
This driver is required on some systems for the proper operation of
......@@ -243,19 +232,19 @@ config ACPI_EC
config ACPI_POWER
bool
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default y
config ACPI_PCI
bool
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default PCI
config ACPI_SYSTEM
bool
depends on ACPI
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default y
help
......@@ -264,9 +253,21 @@ config ACPI_SYSTEM
config ACPI_EFI
bool
depends on ACPI
depends on ACPI_INTERPRETER
depends on IA64
default y
config ACPI_RELAXED_AML
bool "Relaxed AML"
depends on ACPI_INTERPRETER
depends on !IA64_SGI_SN
default n
help
If you say `Y' here, the ACPI interpreter will relax its checking
for valid AML and will ignore some AML mistakes, such as off-by-one
errors in region sizes. Some laptops may require this option. In
particular, many Toshiba laptops require this for correct operation
of the AC module.
endmenu
......@@ -18,7 +18,7 @@ obj-$(CONFIG_ACPI) := acpi_ksyms.o
# ACPI Boot-Time Table Parsing
#
obj-$(CONFIG_ACPI_BOOT) += tables.o
obj-$(CONFIG_ACPI) += blacklist.o
obj-$(CONFIG_ACPI_INTERPRETER) += blacklist.o
#
# ACPI Core Subsystem (Interpreter)
......
This diff is collapsed.
......@@ -634,8 +634,7 @@ acpi_bus_init (void)
* the EC parameters out of that.
*/
status = acpi_ec_ecdt_probe();
if (ACPI_FAILURE(status))
goto error1;
/* Ignore result. Not having an ECDT is not fatal. */
#endif
status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
......
......@@ -105,27 +105,33 @@ acpi_ds_create_buffer_field (
return_ACPI_STATUS (AE_AML_NO_OPERAND);
}
/*
* During the load phase, we want to enter the name of the field into
* the namespace. During the execute phase (when we evaluate the size
* operand), we want to lookup the name
*/
if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;
if (walk_state->deferred_node) {
node = walk_state->deferred_node;
status = AE_OK;
}
else {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND;
}
/*
* During the load phase, we want to enter the name of the field into
* the namespace. During the execute phase (when we evaluate the size
* operand), we want to lookup the name
*/
if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;
}
else {
flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND;
}
/*
* Enter the name_string into the namespace
*/
status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string,
ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1,
flags, walk_state, &(node));
if (ACPI_FAILURE (status)) {
ACPI_REPORT_NSERROR (arg->common.value.string, status);
return_ACPI_STATUS (status);
/*
* Enter the name_string into the namespace
*/
status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string,
ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1,
flags, walk_state, &(node));
if (ACPI_FAILURE (status)) {
ACPI_REPORT_NSERROR (arg->common.value.string, status);
return_ACPI_STATUS (status);
}
}
/* We could put the returned object (Node) on the object stack for later, but
......
......@@ -135,7 +135,7 @@ acpi_ds_init_one_object (
}
/*
* Always parse methods to detect errors, we may delete
* Always parse methods to detect errors, we will delete
* the parse tree below
*/
status = acpi_ds_parse_method (obj_handle);
......@@ -150,7 +150,7 @@ acpi_ds_init_one_object (
}
/*
* Delete the parse tree. We simple re-parse the method
* Delete the parse tree. We simply re-parse the method
* for every execution since there isn't much overhead
*/
acpi_ns_delete_namespace_subtree (obj_handle);
......
......@@ -65,7 +65,7 @@
*
* RETURN: Status.
*
* DESCRIPTION: Late execution of region or field arguments
* DESCRIPTION: Late (deferred) execution of region or field arguments
*
****************************************************************************/
......@@ -111,7 +111,10 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS (status);
}
/* Mark this parse as a deferred opcode */
walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP;
walk_state->deferred_node = node;
/* Pass1: Parse the entire declaration */
......@@ -128,7 +131,7 @@ acpi_ds_execute_arguments (
arg->common.node = node;
acpi_ps_delete_parse_tree (op);
/* Evaluate the address and length arguments for the Buffer Field */
/* Evaluate the deferred arguments */
op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP);
if (!op) {
......@@ -144,6 +147,8 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Execute the opcode and arguments */
status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start,
aml_length, NULL, NULL, 3);
if (ACPI_FAILURE (status)) {
......@@ -151,6 +156,9 @@ acpi_ds_execute_arguments (
return_ACPI_STATUS (status);
}
/* Mark this execution as a deferred opcode */
walk_state->deferred_node = node;
status = acpi_ps_parse_aml (walk_state);
acpi_ps_delete_parse_tree (op);
return_ACPI_STATUS (status);
......@@ -192,7 +200,7 @@ acpi_ds_get_buffer_field_arguments (
node = obj_desc->buffer_field.node;
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field JIT Init\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n",
node->name.ascii));
/* Execute the AML code for the term_arg arguments */
......@@ -207,7 +215,7 @@ acpi_ds_get_buffer_field_arguments (
*
* FUNCTION: acpi_ds_get_buffer_arguments
*
* PARAMETERS: obj_desc - A valid Bufferobject
* PARAMETERS: obj_desc - A valid Buffer object
*
* RETURN: Status.
*
......@@ -240,7 +248,7 @@ acpi_ds_get_buffer_arguments (
return_ACPI_STATUS (AE_AML_INTERNAL);
}
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer JIT Init\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n"));
/* Execute the AML code for the term_arg arguments */
......@@ -254,7 +262,7 @@ acpi_ds_get_buffer_arguments (
*
* FUNCTION: acpi_ds_get_package_arguments
*
* PARAMETERS: obj_desc - A valid Packageobject
* PARAMETERS: obj_desc - A valid Package object
*
* RETURN: Status.
*
......@@ -287,7 +295,7 @@ acpi_ds_get_package_arguments (
return_ACPI_STATUS (AE_AML_INTERNAL);
}
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package JIT Init\n"));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));
/* Execute the AML code for the term_arg arguments */
......@@ -335,11 +343,12 @@ acpi_ds_get_region_arguments (
node = obj_desc->region.node;
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL));
ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL));
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Init at AML %p\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n",
node->name.ascii, extra_desc->extra.aml_start));
/* Execute the argument AML */
status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node),
extra_desc->extra.aml_length, extra_desc->extra.aml_start);
......@@ -505,14 +514,16 @@ acpi_ds_init_buffer_field (
goto cleanup;
}
/* Entire field must fit within the current length of the buffer */
if ((bit_offset + bit_count) >
(8 * (u32) buffer_desc->buffer.length)) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Field size %d exceeds Buffer size %d (bits)\n",
bit_offset + bit_count, 8 * (u32) buffer_desc->buffer.length));
"Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n",
((struct acpi_namespace_node *) result_desc)->name.ascii,
bit_offset + bit_count,
buffer_desc->buffer.node->name.ascii,
8 * (u32) buffer_desc->buffer.length));
status = AE_AML_BUFFER_LIMIT;
goto cleanup;
}
......
......@@ -53,6 +53,7 @@
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dsutils")
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
......@@ -196,7 +197,6 @@ acpi_ds_is_result_used (
acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
return_VALUE (FALSE);
}
......@@ -239,7 +239,6 @@ acpi_ds_delete_result_if_not_used (
return_VOID;
}
if (!acpi_ds_is_result_used (op, walk_state)) {
/*
* Must pop the result stack (obj_desc should be equal to result_obj)
......@@ -389,61 +388,77 @@ acpi_ds_create_operand (
* in name_string
*/
/*
* Differentiate between a namespace "create" operation
* versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
* IMODE_EXECUTE) in order to support the creation of
* namespace objects during the execution of control methods.
* Special handling for buffer_field declarations. This is a deferred
* opcode that unfortunately defines the field name as the last
* parameter instead of the first. We get here when we are performing
* the deferred execution, so the actual name of the field is already
* in the namespace. We don't want to attempt to look it up again
* because we may be executing in a different scope than where the
* actual opcode exists.
*/
parent_op = arg->common.parent;
op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode);
if ((op_info->flags & AML_NSNODE) &&
(parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) &&
(parent_op->common.aml_opcode != AML_REGION_OP) &&
(parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) {
/* Enter name into namespace if not found */
interpreter_mode = ACPI_IMODE_LOAD_PASS2;
}
else {
/* Return a failure if name not found */
interpreter_mode = ACPI_IMODE_EXECUTE;
if ((walk_state->deferred_node) &&
(walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) &&
(arg_index != 0)) {
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, walk_state->deferred_node);
status = AE_OK;
}
else /* All other opcodes */ {
/*
* Differentiate between a namespace "create" operation
* versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
* IMODE_EXECUTE) in order to support the creation of
* namespace objects during the execution of control methods.
*/
parent_op = arg->common.parent;
op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode);
if ((op_info->flags & AML_NSNODE) &&
(parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) &&
(parent_op->common.aml_opcode != AML_REGION_OP) &&
(parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) {
/* Enter name into namespace if not found */
interpreter_mode = ACPI_IMODE_LOAD_PASS2;
}
else {
/* Return a failure if name not found */
status = acpi_ns_lookup (walk_state->scope_info, name_string,
ACPI_TYPE_ANY, interpreter_mode,
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
walk_state,
ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc));
/*
* The only case where we pass through (ignore) a NOT_FOUND
* error is for the cond_ref_of opcode.
*/
if (status == AE_NOT_FOUND) {
if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) {
/*
* For the Conditional Reference op, it's OK if
* the name is not found; We just need a way to
* indicate this to the interpreter, set the
* object to the root
*/
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node);
status = AE_OK;
interpreter_mode = ACPI_IMODE_EXECUTE;
}
else {
/*
* We just plain didn't find it -- which is a
* very serious error at this point
*/
status = AE_AML_NAME_NOT_FOUND;
status = acpi_ns_lookup (walk_state->scope_info, name_string,
ACPI_TYPE_ANY, interpreter_mode,
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
walk_state,
ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc));
/*
* The only case where we pass through (ignore) a NOT_FOUND
* error is for the cond_ref_of opcode.
*/
if (status == AE_NOT_FOUND) {
if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) {
/*
* For the Conditional Reference op, it's OK if
* the name is not found; We just need a way to
* indicate this to the interpreter, set the
* object to the root
*/
obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node);
status = AE_OK;
}
else {
/*
* We just plain didn't find it -- which is a
* very serious error at this point
*/
status = AE_AML_NAME_NOT_FOUND;
}
}
}
if (ACPI_FAILURE (status)) {
ACPI_REPORT_NSERROR (name_string, status);
if (ACPI_FAILURE (status)) {
ACPI_REPORT_NSERROR (name_string, status);
}
}
/* Free the namestring created above */
......@@ -464,8 +479,6 @@ acpi_ds_create_operand (
}
ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state));
}
else {
/* Check for null name case */
......@@ -480,7 +493,6 @@ acpi_ds_create_operand (
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", arg));
}
else {
opcode = arg->common.aml_opcode;
}
......
......@@ -248,6 +248,14 @@ acpi_ds_load1_begin_op (
* buffer_field, or Package), the name of the object is already
* in the namespace.
*/
if (walk_state->deferred_node) {
/* This name is already in the namespace, get the node */
node = walk_state->deferred_node;
status = AE_OK;
break;
}
flags = ACPI_NS_NO_UPSEARCH;
if ((walk_state->opcode != AML_SCOPE_OP) &&
(!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) {
......@@ -589,7 +597,17 @@ acpi_ds_load2_begin_op (
* Enter the named type into the internal namespace. We enter the name
* as we go downward in the parse tree. Any necessary subobjects that involve
* arguments to the opcode must be created as we go back up the parse tree later.
*
* Note: Name may already exist if we are executing a deferred opcode.
*/
if (walk_state->deferred_node) {
/* This name is already in the namespace, get the node */
node = walk_state->deferred_node;
status = AE_OK;
break;
}
status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type,
ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node));
break;
......
......@@ -121,10 +121,9 @@ acpi_ds_scope_stack_push (
/* Make sure object type is valid */
if (!acpi_ut_valid_object_type (type)) {
ACPI_REPORT_WARNING (("ds_scope_stack_push: type code out of range\n"));
ACPI_REPORT_WARNING (("ds_scope_stack_push: Invalid object type: 0x%X\n", type));
}
/* Allocate a new scope object */
scope_info = acpi_ut_create_generic_state ();
......@@ -146,13 +145,13 @@ acpi_ds_scope_stack_push (
old_scope_info = walk_state->scope_info;
if (old_scope_info) {
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[%4.4s] (%10s)",
"[%4.4s] (%s)",
old_scope_info->scope.node->name.ascii,
acpi_ut_get_type_name (old_scope_info->common.value)));
}
else {
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
"[\\___] (%10s)", "ROOT"));
"[\\___] (%s)", "ROOT"));
}
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
......@@ -163,7 +162,6 @@ acpi_ds_scope_stack_push (
/* Push new scope object onto stack */
acpi_ut_push_generic_state (&walk_state->scope_info, scope_info);
return_ACPI_STATUS (AE_OK);
}
......@@ -207,7 +205,7 @@ acpi_ds_scope_stack_pop (
walk_state->scope_depth--;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"[%.2d] Popped scope [%4.4s] (%10s), New scope -> ",
"[%.2d] Popped scope [%4.4s] (%s), New scope -> ",
(u32) walk_state->scope_depth,
scope_info->scope.node->name.ascii,
acpi_ut_get_type_name (scope_info->common.value)));
......@@ -225,7 +223,6 @@ acpi_ds_scope_stack_pop (
}
acpi_ut_delete_generic_state (scope_info);
return_ACPI_STATUS (AE_OK);
}
......
......@@ -56,11 +56,12 @@
* FUNCTION: acpi_ds_result_insert
*
* PARAMETERS: Object - Object to push
* Index - Where to insert the object
* walk_state - Current Walk state
*
* RETURN: Status
*
* DESCRIPTION: Push an object onto this walk's result stack
* DESCRIPTION: Insert an object onto this walk's result stack
*
******************************************************************************/
......@@ -114,6 +115,7 @@ acpi_ds_result_insert (
* FUNCTION: acpi_ds_result_remove
*
* PARAMETERS: Object - Where to return the popped object
* Index - Where to extract the object
* walk_state - Current Walk state
*
* RETURN: Status
......@@ -233,6 +235,7 @@ acpi_ds_result_pop (
return (AE_AML_NO_RETURN_VALUE);
}
/*******************************************************************************
*
* FUNCTION: acpi_ds_result_pop_from_bottom
......@@ -295,7 +298,6 @@ acpi_ds_result_pop_from_bottom (
*object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL",
state, walk_state));
return (AE_OK);
}
......@@ -358,8 +360,7 @@ acpi_ds_result_push (
*
* FUNCTION: acpi_ds_result_stack_push
*
* PARAMETERS: Object - Object to push
* walk_state - Current Walk state
* PARAMETERS: walk_state - Current Walk state
*
* RETURN: Status
*
......@@ -420,7 +421,6 @@ acpi_ds_result_stack_pop (
return (AE_AML_NO_OPERAND);
}
state = acpi_ut_pop_generic_state (&walk_state->results);
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
......@@ -572,6 +572,7 @@ acpi_ds_obj_stack_pop_object (
}
#endif
/*******************************************************************************
*
* FUNCTION: acpi_ds_obj_stack_pop
......@@ -641,6 +642,7 @@ acpi_ds_obj_stack_pop_and_delete (
u32 i;
union acpi_operand_object *obj_desc;
ACPI_FUNCTION_NAME ("ds_obj_stack_pop_and_delete");
......@@ -883,8 +885,15 @@ acpi_ds_create_walk_state (
* FUNCTION: acpi_ds_init_aml_walk
*
* PARAMETERS: walk_state - New state to be initialized
* Op - Current parse op
* method_node - Control method NS node, if any
* aml_start - Start of AML
* aml_length - Length of AML
* Params - Method args, if any
* return_obj_desc - Where to store a return object, if any
* pass_number - 1, 2, or 3
*
* RETURN: None
* RETURN: Status
*
* DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk
*
......@@ -927,9 +936,9 @@ acpi_ds_init_aml_walk (
if (method_node) {
walk_state->parser_state.start_node = method_node;
walk_state->walk_type = ACPI_WALK_METHOD;
walk_state->method_node = method_node;
walk_state->method_desc = acpi_ns_get_attached_object (method_node);
walk_state->walk_type = ACPI_WALK_METHOD;
walk_state->method_node = method_node;
walk_state->method_desc = acpi_ns_get_attached_object (method_node);
/* Push start scope on scope stack and make it current */
......@@ -956,6 +965,7 @@ acpi_ds_init_aml_walk (
while (extra_op && !extra_op->common.node) {
extra_op = extra_op->common.parent;
}
if (!extra_op) {
parser_state->start_node = NULL;
}
......@@ -1014,7 +1024,7 @@ acpi_ds_delete_walk_state (
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state));
}
/* Always must free any linked control states */
/* Always must free any linked control states */
while (walk_state->control_state) {
state = walk_state->control_state;
......
......@@ -32,7 +32,7 @@
#include <asm/io.h>
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
#include <acpi/actypes.h>
#define _COMPONENT ACPI_EC_COMPONENT
ACPI_MODULE_NAME ("acpi_ec")
......@@ -412,7 +412,10 @@ acpi_ec_space_setup (
* The EC object is in the handler context and is needed
* when calling the acpi_ec_space_handler.
*/
*return_context = handler_context;
if(function == ACPI_REGION_DEACTIVATE)
*return_context = NULL;
else
*return_context = handler_context;
return AE_OK;
}
......
......@@ -382,7 +382,7 @@ acpi_ev_detach_region(
union acpi_operand_object *obj_desc;
union acpi_operand_object **last_obj_ptr;
acpi_adr_space_setup region_setup;
void *region_context;
void **region_context;
union acpi_operand_object *region_obj2;
acpi_status status;
......@@ -394,7 +394,7 @@ acpi_ev_detach_region(
if (!region_obj2) {
return_VOID;
}
region_context = region_obj2->extra.region_context;
region_context = &region_obj2->extra.region_context;
/* Get the address handler from the region object */
......@@ -450,7 +450,7 @@ acpi_ev_detach_region(
region_setup = handler_obj->address_space.setup;
status = region_setup (region_obj, ACPI_REGION_DEACTIVATE,
handler_obj->address_space.context, &region_context);
handler_obj->address_space.context, region_context);
/* Init routine may fail, Just ignore errors */
......
......@@ -286,7 +286,7 @@ acpi_ex_create_region (
ACPI_FUNCTION_TRACE ("ex_create_region");
/* Get the Node from the object stack */
/* Get the Namespace Node */
node = walk_state->op->common.node;
......@@ -311,7 +311,6 @@ acpi_ex_create_region (
ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n",
acpi_ut_get_region_name (region_space), region_space));
/* Create the region descriptor */
obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION);
......@@ -375,6 +374,7 @@ acpi_ex_create_table_region (
ACPI_FUNCTION_TRACE ("ex_create_table_region");
/* Get the Node from the object stack */
node = walk_state->op->common.node;
......@@ -392,7 +392,6 @@ acpi_ex_create_table_region (
status = acpi_tb_find_table (operand[1]->string.pointer,
operand[2]->string.pointer,
operand[3]->string.pointer, &table);
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
......@@ -489,7 +488,6 @@ acpi_ex_create_processor (
status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0],
obj_desc, ACPI_TYPE_PROCESSOR);
/* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc);
......@@ -540,7 +538,6 @@ acpi_ex_create_power_resource (
status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0],
obj_desc, ACPI_TYPE_POWER);
/* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc);
......@@ -609,7 +606,6 @@ acpi_ex_create_method (
obj_desc->method.concurrency = (u8)
(((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1);
}
else {
obj_desc->method.concurrency = INFINITE_CONCURRENCY;
}
......
......@@ -139,7 +139,41 @@ acpi_ex_setup_region (
field_datum_byte_offset, obj_desc->common_field.access_byte_width,
rgn_desc->region.node->name.ascii, rgn_desc->region.length));
return_ACPI_STATUS (AE_AML_REGION_LIMIT);
#ifdef CONFIG_ACPI_RELAXED_AML
{
/*
* Allow access to the field if it is within the region size
* rounded up to a multiple of the access byte width. This
* overcomes "off-by-one" programming errors in the AML often
* found in Toshiba laptops. These errors were allowed by
* the Microsoft ASL compiler.
*/
u32 rounded_length = ACPI_ROUND_UP(rgn_desc->region.length,
obj_desc->common_field.access_byte_width);
if (rounded_length < (obj_desc->common_field.base_byte_offset
+ field_datum_byte_offset
+ obj_desc->common_field.access_byte_width)) {
return_ACPI_STATUS (AE_AML_REGION_LIMIT);
} else {
static int warn_once = 1;
if (warn_once) {
// Could also associate a flag with each field, and
// warn once for each field.
ACPI_REPORT_WARNING((
"The ACPI AML in your computer contains errors, "
"please nag the manufacturer to correct it.\n"));
ACPI_REPORT_WARNING((
"Allowing relaxed access to fields; "
"turn on CONFIG_ACPI_DEBUG for details.\n"));
warn_once = 0;
}
return_ACPI_STATUS (AE_OK);
}
}
#else
return_ACPI_STATUS (AE_AML_REGION_LIMIT);
#endif
}
return_ACPI_STATUS (AE_OK);
......
......@@ -234,7 +234,7 @@ acpi_ns_dump_one_object (
case ACPI_TYPE_DEVICE:
acpi_os_printf ("Notify object: %p", obj_desc);
acpi_os_printf ("Notify Object: %p\n", obj_desc);
break;
......@@ -371,7 +371,7 @@ acpi_ns_dump_one_object (
case ACPI_TYPE_LOCAL_BANK_FIELD:
case ACPI_TYPE_LOCAL_INDEX_FIELD:
acpi_os_printf (" Off %.2X Len %.2X Acc %.2hd\n",
acpi_os_printf ("Off %.2X Len %.2X Acc %.2hd\n",
(obj_desc->common_field.base_byte_offset * 8)
+ obj_desc->common_field.start_field_bit_offset,
obj_desc->common_field.bit_length,
......
......@@ -96,7 +96,7 @@ acpi_ns_search_node (
scope_name = acpi_ns_get_external_pathname (node);
if (scope_name) {
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (%s)\n",
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s (%p) For [%4.4s] (%s)\n",
scope_name, node, (char *) &target_name, acpi_ut_get_type_name (type)));
ACPI_MEM_FREE (scope_name);
......@@ -117,9 +117,9 @@ acpi_ns_search_node (
* Found matching entry.
*/
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Name %4.4s Type [%s] found in scope [%4.4s] %p\n",
"Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
(char *) &target_name, acpi_ut_get_type_name (next_node->type),
next_node->name.ascii, next_node));
next_node, node->name.ascii, node));
*return_node = next_node;
return_ACPI_STATUS (AE_OK);
......@@ -143,7 +143,7 @@ acpi_ns_search_node (
/* Searched entire namespace level, not found */
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Name %4.4s Type [%s] not found in search in scope [%4.4s] %p first child %p\n",
"Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
(char *) &target_name, acpi_ut_get_type_name (type),
node->name.ascii, node, node->child));
......
......@@ -175,6 +175,11 @@ acpi_ns_print_node_pathname (
acpi_status status;
if (!node) {
acpi_os_printf ("[NULL NAME]");
return;
}
/* Convert handle to a full pathname and print it (with supplied message) */
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
......@@ -470,11 +475,11 @@ acpi_ns_build_internal_name (
*result = 0;
if (info->fully_qualified) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (abs) \"\\%s\"\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n",
internal_name, internal_name));
}
else {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (rel) \"%s\"\n",
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n",
internal_name, internal_name));
}
......
......@@ -437,7 +437,6 @@ acpi_ps_parse_loop (
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
parser_state = &walk_state->parser_state;
walk_state->arg_types = 0;
......@@ -705,10 +704,9 @@ acpi_ps_parse_loop (
walk_state->arg_types = 0;
break;
default:
/* Op is not a constant or string, append each argument */
/* Op is not a constant or string, append each argument to the Op */
while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) &&
!walk_state->arg_count) {
......@@ -727,23 +725,23 @@ acpi_ps_parse_loop (
INCREMENT_ARG_LIST (walk_state->arg_types);
}
/* Special processing for certain opcodes */
switch (op->common.aml_opcode) {
case AML_METHOD_OP:
/* For a method, save the length and address of the body */
/*
* Skip parsing of control method or opregion body,
* Skip parsing of control method
* because we don't have enough info in the first pass
* to parse them correctly.
* to parse it correctly.
*
* Save the length and address of the body
*/
op->named.data = parser_state->aml;
op->named.length = (u32) (parser_state->pkg_end - parser_state->aml);
/*
* Skip body of method. For op_regions, we must continue
* parsing because the opregion is not a standalone
* package (We don't know where the end is).
*/
/* Skip body of method */
parser_state->aml = parser_state->pkg_end;
walk_state->arg_count = 0;
break;
......@@ -756,15 +754,15 @@ acpi_ps_parse_loop (
(op->common.parent->common.aml_opcode == AML_NAME_OP) &&
(walk_state->descending_callback != acpi_ds_exec_begin_op)) {
/*
* Skip parsing of
* Skip parsing of Buffers and Packages
* because we don't have enough info in the first pass
* to parse them correctly.
*/
op->named.data = aml_op_start;
op->named.length = (u32) (parser_state->pkg_end - aml_op_start);
/*
* Skip body
*/
/* Skip body */
parser_state->aml = parser_state->pkg_end;
walk_state->arg_count = 0;
}
......@@ -778,6 +776,7 @@ acpi_ps_parse_loop (
break;
default:
/* No action for all other opcodes */
break;
}
......
......@@ -71,6 +71,9 @@ acpi_pci_irq_find_prt_entry (
ACPI_FUNCTION_TRACE("acpi_pci_irq_find_prt_entry");
if (!acpi_prt.count)
return_PTR(NULL);
/*
* Parse through all PRT entries looking for a match on the specified
* PCI device's segment, bus, device, and pin (don't care about func).
......
......@@ -220,7 +220,6 @@ acpi_pci_link_check_current (
return AE_CTRL_TERMINATE;
}
static int
acpi_pci_link_get_current (
struct acpi_pci_link *link)
......@@ -279,6 +278,28 @@ acpi_pci_link_get_current (
return_VALUE(result);
}
static int
acpi_pci_link_try_get_current (
struct acpi_pci_link *link,
int irq)
{
int result;
ACPI_FUNCTION_TRACE("acpi_pci_link_try_get_current");
result = acpi_pci_link_get_current(link);
if (result && link->irq.active) {
return_VALUE(result);
}
if (!link->irq.active) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No active IRQ resource found\n"));
printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for device (%s [%s]).\n", irq, acpi_device_name(link->device), acpi_device_bid(link->device));
link->irq.active = irq;
}
return 0;
}
static int
acpi_pci_link_set (
......@@ -294,6 +315,7 @@ acpi_pci_link_set (
struct acpi_buffer buffer = {sizeof(resource)+1, &resource};
int i = 0;
int valid = 0;
int resource_type = 0;
ACPI_FUNCTION_TRACE("acpi_pci_link_set");
......@@ -317,20 +339,32 @@ acpi_pci_link_set (
}
}
/* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with
* an extended one */
if (irq <= 15) {
resource_type = ACPI_RSTYPE_IRQ;
} else {
resource_type = ACPI_RSTYPE_EXT_IRQ;
}
retry_programming:
memset(&resource, 0, sizeof(resource));
/* NOTE: PCI interrupts are always level / active_low / shared. But not all
interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for
parameters */
if (irq <= 15) {
switch(resource_type) {
case ACPI_RSTYPE_IRQ:
resource.res.id = ACPI_RSTYPE_IRQ;
resource.res.length = sizeof(struct acpi_resource);
resource.res.data.irq.edge_level = link->irq.edge_level;
resource.res.data.irq.active_high_low = link->irq.active_high_low;
resource.res.data.irq.number_of_interrupts = 1;
resource.res.data.irq.interrupts[0] = irq;
}
else {
break;
case ACPI_RSTYPE_EXT_IRQ:
resource.res.id = ACPI_RSTYPE_EXT_IRQ;
resource.res.length = sizeof(struct acpi_resource);
resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER;
......@@ -339,11 +373,21 @@ acpi_pci_link_set (
resource.res.data.extended_irq.number_of_interrupts = 1;
resource.res.data.extended_irq.interrupts[0] = irq;
/* ignore resource_source, it's optional */
break;
}
resource.end.id = ACPI_RSTYPE_END_TAG;
/* Attempt to set the resource */
status = acpi_set_current_resources(link->handle, &buffer);
/* if we failed and IRQ <= 15, try again with an extended descriptor */
if (ACPI_FAILURE(status) && (resource_type == ACPI_RSTYPE_IRQ)) {
resource_type = ACPI_RSTYPE_EXT_IRQ;
printk(PREFIX "Retrying with extended IRQ descriptor\n");
goto retry_programming;
}
/* check for total failure */
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n"));
return_VALUE(-ENODEV);
......@@ -361,7 +405,7 @@ acpi_pci_link_set (
}
/* Make sure the active IRQ is the one we requested. */
result = acpi_pci_link_get_current(link);
result = acpi_pci_link_try_get_current(link, irq);
if (result) {
return_VALUE(result);
}
......@@ -456,16 +500,16 @@ static int acpi_pci_link_allocate(struct acpi_pci_link* link) {
irq = link->irq.active;
} else {
irq = link->irq.possible[0];
}
/*
* Select the best IRQ. This is done in reverse to promote
/*
* Select the best IRQ. This is done in reverse to promote
* the use of IRQs 9, 10, 11, and >15.
*/
for (i=(link->irq.possible_count-1); i>0; i--) {
if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]])
irq = link->irq.possible[i];
}
}
/* Attempt to enable the link device at this IRQ. */
if (acpi_pci_link_set(link, irq)) {
......@@ -574,10 +618,6 @@ acpi_pci_link_add (
else
printk(" %d", link->irq.possible[i]);
}
if (!link->irq.active)
printk(", disabled");
else if (!found)
printk(", enabled at IRQ %d", link->irq.active);
printk(")\n");
/* TBD: Acquire/release lock */
......
......@@ -69,7 +69,8 @@ struct acpi_table_sdt {
static unsigned long sdt_pa; /* Physical Address */
static unsigned long sdt_count; /* Table count */
static struct acpi_table_sdt *sdt_entry;
static struct acpi_table_sdt sdt_entry[ACPI_MAX_TABLES];
void
acpi_table_print (
......@@ -418,12 +419,6 @@ acpi_table_get_sdt (
sdt_count = ACPI_MAX_TABLES;
}
sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
if (!sdt_entry) {
printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
return -ENOMEM;
}
for (i = 0; i < sdt_count; i++)
sdt_entry[i].pa = (unsigned long) mapped_xsdt->entry[i];
}
......@@ -470,12 +465,6 @@ acpi_table_get_sdt (
sdt_count = ACPI_MAX_TABLES;
}
sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt));
if (!sdt_entry) {
printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n");
return -ENOMEM;
}
for (i = 0; i < sdt_count; i++)
sdt_entry[i].pa = (unsigned long) mapped_rsdt->entry[i];
}
......
......@@ -64,7 +64,7 @@
/* Version string */
#define ACPI_CA_VERSION 0x20030813
#define ACPI_CA_VERSION 0x20030918
/* Maximum objects in the various object caches */
......
......@@ -152,10 +152,6 @@ void
acpi_dm_decode_internal_object (
union acpi_operand_object *obj_desc);
void
acpi_dm_decode_node (
struct acpi_namespace_node *node);
u32
acpi_dm_block_type (
union acpi_parse_object *op);
......
......@@ -91,11 +91,12 @@ struct acpi_walk_state
struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */
union acpi_operand_object **caller_return_desc;
union acpi_generic_state *control_state; /* List of control states (nested IFs) */
struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */
struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */
struct acpi_namespace_node *method_call_node; /* Called method Node*/
union acpi_parse_object *method_call_op; /* method_call Op if running a method */
union acpi_operand_object *method_desc; /* Method descriptor if running a method */
struct acpi_namespace_node *method_node; /* Method Node if running a method */
struct acpi_namespace_node *method_node; /* Method node if running a method. */
union acpi_parse_object *op; /* Current parser op */
union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */
const struct acpi_opcode_info *op_info; /* Info on current opcode */
......
......@@ -424,17 +424,17 @@ int ec_write(u8 addr, u8 val);
#endif /*CONFIG_ACPI_EC*/
#ifdef CONFIG_ACPI
#ifdef CONFIG_ACPI_INTERPRETER
int acpi_blacklisted(void);
#else
#else /*!CONFIG_ACPI_INTERPRETER*/
static inline int acpi_blacklisted(void)
{
return 0;
}
#endif /*CONFIG_ACPI*/
#endif /*!CONFIG_ACPI_INTERPRETER*/
#endif /*_LINUX_ACPI_H*/
......@@ -104,4 +104,3 @@ void md_run_setup(void);
static inline void md_run_setup(void) {}
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment