Skip to contentSkip to conversation

ACPICA: Fix Scope() op in module level code

PATCH Applied Lin Ming 3 participants 4 messages Oct 22, 2010 – Oct 25, 2010

Subsystems (2)
lore
Share & tools
lore

Lin Ming

author
#0 lore raw

PATCH 1/1 ACPICA: Fix Scope() op in module level code

Len,

Would you please include this patch in 2.6.37 merge?

Thanks,
Lin Ming
---

From: Bob Moore <[email protected]>

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

---
 drivers/acpi/acpica/dswexec.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)
drivers/acpi/acpica/dswexec.c +17 -2
index d555b37..6b0b5d0 100644
@@ -300,10 +300,25 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
 			 * 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:
#1 lore raw

However, the fix really affects any control method that attempts to use the Scope() operator, correct?

Quoted 82 lines

-----Original Message-----
From: Lin, Ming M
Sent: Friday, October 22, 2010 1:27 AM
To: lenb
Cc: Moore, Robert; linux-acpi; [email protected]; [email protected]
Subject: [PATCH] ACPICA: Fix Scope() op in module level code

Len,

Would you please include this patch in 2.6.37 merge?

Thanks,
Lin Ming
---

From: Bob Moore <[email protected]>

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

---
drivers/acpi/acpica/dswexec.c | 19 +++++++++++++++++--

1 files changed, 17 insertions(+), 2 deletions(-)
drivers/acpi/acpica/dswexec.c +0 -0
index d555b37..6b0b5d0 100644
@@ -300,10 +300,25 @@ acpi_ds_exec_begin_op(struct acpi_walk_state
 *walk_state,
 			 * 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.

drivers/acpi/acpica/dswexec.c +2 -0
+			 *
+			 * Note 10/2010: Except for the Scope() op. This opcode

does

drivers/acpi/acpica/dswexec.c +1 -0
+			 * not actually create a new object, it refers to an

existing

drivers/acpi/acpica/dswexec.c +2 -0
+			 * object. However, for Scope(), we want to indeed open a
+			 * new scope.
			 */
drivers/acpi/acpica/dswexec.c +12 -1
-			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:
author
#2 lore raw
Quoted 1 line · Robert

However, the fix really affects any control method that attempts to use the Scope() operator, correct?

Correct, how about below changelog?

[PATCH] ACPICA: Fix Scope() op in control method

Some Panasonic Toughbooks create nodes in module level code. Module level code is the executable AML code outside of control method, but we implemented it as 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

Quoted 84 lines
Quoted 83 lines

-----Original Message-----
From: Lin, Ming M
Sent: Friday, October 22, 2010 1:27 AM
To: lenb
Cc: Moore, Robert; linux-acpi; [email protected]; [email protected]
Subject: [PATCH] ACPICA: Fix Scope() op in module level code

Len,

Would you please include this patch in 2.6.37 merge?

Thanks,
Lin Ming
---

From: Bob Moore <[email protected]>

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

---
drivers/acpi/acpica/dswexec.c | 19 +++++++++++++++++--

1 files changed, 17 insertions(+), 2 deletions(-)
drivers/acpi/acpica/dswexec.c +0 -0
index d555b37..6b0b5d0 100644
@@ -300,10 +300,25 @@ acpi_ds_exec_begin_op(struct acpi_walk_state
 *walk_state,
 			 * 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.

drivers/acpi/acpica/dswexec.c +2 -0
+			 *
+			 * Note 10/2010: Except for the Scope() op. This opcode

does

drivers/acpi/acpica/dswexec.c +1 -0
+			 * not actually create a new object, it refers to an

existing

drivers/acpi/acpica/dswexec.c +2 -0
+			 * object. However, for Scope(), we want to indeed open a
+			 * new scope.
			 */
drivers/acpi/acpica/dswexec.c +12 -1
-			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: