| From 8df3fc981dc12d9fdcaef4100a2193b605024d7a Mon Sep 17 00:00:00 2001 |
| From: Bob Moore <robert.moore@intel.com> |
| Date: Sat, 23 Oct 2010 01:36:40 -0400 |
| Subject: ACPICA: Fix Scope() op in module level code |
| |
| From: Bob Moore <robert.moore@intel.com> |
| |
| commit 8df3fc981dc12d9fdcaef4100a2193b605024d7a upstream. |
| |
| Some Panasonic Toughbooks create nodes in module level code. |
| Module level code is the executable AML code outside of control method, |
| for example, below AML code creates a node \_SB.PCI0.GFX0.DD02.CUBL |
| |
| If (\_OSI ("Windows 2006")) |
| { |
| Scope (\_SB.PCI0.GFX0.DD02) |
| { |
| Name (CUBL, Ones) |
| ... |
| } |
| } |
| |
| Scope() op does not actually create a new object, it refers to an |
| existing object(\_SB.PCI0.GFX0.DD02 in above example). However, for |
| Scope(), we want to indeed open a new scope, so the child nodes(CUBL in |
| above example) can be created correctly under it. |
| |
| https://bugzilla.kernel.org/show_bug.cgi?id=19462 |
| |
| Signed-off-by: Bob Moore <robert.moore@intel.com> |
| Signed-off-by: Lin Ming <ming.m.lin@intel.com> |
| Signed-off-by: Len Brown <len.brown@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/acpi/acpica/dswexec.c | 19 +++++++++++++++++-- |
| 1 file changed, 17 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/acpi/acpica/dswexec.c |
| +++ b/drivers/acpi/acpica/dswexec.c |
| @@ -300,10 +300,25 @@ acpi_ds_exec_begin_op(struct acpi_walk_s |
| * we must enter this object into the namespace. The created |
| * object is temporary and will be deleted upon completion of |
| * the execution of this method. |
| + * |
| + * Note 10/2010: Except for the Scope() op. This opcode does |
| + * not actually create a new object, it refers to an existing |
| + * object. However, for Scope(), we want to indeed open a |
| + * new scope. |
| */ |
| - status = acpi_ds_load2_begin_op(walk_state, NULL); |
| + if (op->common.aml_opcode != AML_SCOPE_OP) { |
| + status = |
| + acpi_ds_load2_begin_op(walk_state, NULL); |
| + } else { |
| + status = |
| + acpi_ds_scope_stack_push(op->named.node, |
| + op->named.node-> |
| + type, walk_state); |
| + if (ACPI_FAILURE(status)) { |
| + return_ACPI_STATUS(status); |
| + } |
| + } |
| } |
| - |
| break; |
| |
| case AML_CLASS_EXECUTE: |