summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/dsopcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/dsopcode.c')
-rw-r--r--sys/contrib/dev/acpica/dsopcode.c300
1 files changed, 85 insertions, 215 deletions
diff --git a/sys/contrib/dev/acpica/dsopcode.c b/sys/contrib/dev/acpica/dsopcode.c
index 52dec60..1787efd 100644
--- a/sys/contrib/dev/acpica/dsopcode.c
+++ b/sys/contrib/dev/acpica/dsopcode.c
@@ -2,7 +2,7 @@
*
* Module Name: dsopcode - Dispatcher Op Region support and handling of
* "control" opcodes
- * $Revision: 56 $
+ * $Revision: 66 $
*
*****************************************************************************/
@@ -132,90 +132,61 @@
/*****************************************************************************
*
- * FUNCTION: AcpiDsGetBufferFieldArguments
+ * FUNCTION: AcpiDsExecuteArguments
*
- * PARAMETERS: ObjDesc - A valid BufferField object
+ * PARAMETERS: Node - Parent NS node
+ * ExtraDesc - Has AML pointer and length
*
* RETURN: Status.
*
- * DESCRIPTION: Get BufferField Buffer and Index. This implements the late
- * evaluation of these field attributes.
+ * DESCRIPTION: Late execution of region or field arguments
*
****************************************************************************/
ACPI_STATUS
-AcpiDsGetBufferFieldArguments (
- ACPI_OPERAND_OBJECT *ObjDesc)
+AcpiDsExecuteArguments (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OPERAND_OBJECT *ExtraDesc)
{
- ACPI_OPERAND_OBJECT *ExtraDesc;
- ACPI_NAMESPACE_NODE *Node;
- ACPI_PARSE_OBJECT *Op;
- ACPI_PARSE_OBJECT *FieldOp;
ACPI_STATUS Status;
- ACPI_TABLE_DESC *TableDesc;
+ ACPI_PARSE_OBJECT *Op;
ACPI_WALK_STATE *WalkState;
+ ACPI_PARSE_OBJECT *Arg;
- FUNCTION_TRACE_PTR ("DsGetBufferFieldArguments", ObjDesc);
-
-
- if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
- {
- return_ACPI_STATUS (AE_OK);
- }
-
-
- /* Get the AML pointer (method object) and BufferField node */
-
- ExtraDesc = ObjDesc->BufferField.Extra;
- Node = ObjDesc->BufferField.Node;
-
- DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Field]"));
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField JIT Init\n",
- (char*)&Node->Name));
+ FUNCTION_TRACE ("AcpiDsExecuteArguments");
/*
* Allocate a new parser op to be the root of the parsed
- * OpRegion tree
+ * BufferField tree
*/
Op = AcpiPsAllocOp (AML_SCOPE_OP);
if (!Op)
{
- return (AE_NO_MEMORY);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Save the Node for use in AcpiPsParseAml */
Op->Node = AcpiNsGetParentObject (Node);
- /* Get a handle to the parent ACPI table */
-
- Status = AcpiTbHandleToObject (Node->OwnerId, &TableDesc);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
-
/* Create and initialize a new parser state */
- WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT,
- NULL, NULL, NULL);
+ WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, NULL);
if (!WalkState)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
- Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart,
+ Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart,
ExtraDesc->Extra.AmlLength, NULL, NULL, 1);
if (ACPI_FAILURE (Status))
{
- /* TBD: delete walk state */
+ AcpiDsDeleteWalkState (WalkState);
return_ACPI_STATUS (Status);
}
- /* TBD: No Walk flags?? */
-
WalkState->ParseFlags = 0;
/* Pass1: Parse the entire BufferField declaration */
@@ -229,28 +200,24 @@ AcpiDsGetBufferFieldArguments (
/* Get and init the actual FieldUnit Op created above */
- FieldOp = Op->Value.Arg;
+ Arg = Op->Value.Arg;
Op->Node = Node;
-
-
- FieldOp = Op->Value.Arg;
- FieldOp->Node = Node;
+ Arg->Node = Node;
AcpiPsDeleteParseTree (Op);
- /* Evaluate the address and length arguments for the OpRegion */
+ /* Evaluate the address and length arguments for the Buffer Field */
Op = AcpiPsAllocOp (AML_SCOPE_OP);
if (!Op)
{
- return (AE_NO_MEMORY);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
Op->Node = AcpiNsGetParentObject (Node);
/* Create and initialize a new parser state */
- WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT,
- NULL, NULL, NULL);
+ WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT, NULL, NULL, NULL);
if (!WalkState)
{
return_ACPI_STATUS (AE_NO_MEMORY);
@@ -260,160 +227,110 @@ AcpiDsGetBufferFieldArguments (
ExtraDesc->Extra.AmlLength, NULL, NULL, 3);
if (ACPI_FAILURE (Status))
{
- /* TBD: delete walk state */
+ AcpiDsDeleteWalkState (WalkState);
return_ACPI_STATUS (Status);
}
Status = AcpiPsParseAml (WalkState);
AcpiPsDeleteParseTree (Op);
- /*
- * The pseudo-method object is no longer needed since the region is
- * now initialized
- */
- AcpiUtRemoveReference (ObjDesc->BufferField.Extra);
- ObjDesc->BufferField.Extra = NULL;
-
return_ACPI_STATUS (Status);
}
/*****************************************************************************
*
- * FUNCTION: AcpiDsGetRegionArguments
+ * FUNCTION: AcpiDsGetBufferFieldArguments
*
- * PARAMETERS: ObjDesc - A valid region object
+ * PARAMETERS: ObjDesc - A valid BufferField object
*
* RETURN: Status.
*
- * DESCRIPTION: Get region address and length. This implements the late
- * evaluation of these region attributes.
+ * DESCRIPTION: Get BufferField Buffer and Index. This implements the late
+ * evaluation of these field attributes.
*
****************************************************************************/
ACPI_STATUS
-AcpiDsGetRegionArguments (
+AcpiDsGetBufferFieldArguments (
ACPI_OPERAND_OBJECT *ObjDesc)
{
- ACPI_OPERAND_OBJECT *ExtraDesc = NULL;
+ ACPI_OPERAND_OBJECT *ExtraDesc;
ACPI_NAMESPACE_NODE *Node;
- ACPI_PARSE_OBJECT *Op;
- ACPI_PARSE_OBJECT *RegionOp;
ACPI_STATUS Status;
- ACPI_TABLE_DESC *TableDesc;
- ACPI_WALK_STATE *WalkState;
- FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc);
+ FUNCTION_TRACE_PTR ("DsGetBufferFieldArguments", ObjDesc);
- if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
{
return_ACPI_STATUS (AE_OK);
}
+ /* Get the AML pointer (method object) and BufferField node */
- /* Get the AML pointer (method object) and region node */
-
- ExtraDesc = ObjDesc->Region.Extra;
- Node = ObjDesc->Region.Node;
+ ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
+ Node = ObjDesc->BufferField.Node;
- DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Operation Region]"));
+ DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Field]"));
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField JIT Init\n",
+ (char *) &Node->Name));
- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Init at AML %p\n",
- (char*)&Node->Name, ExtraDesc->Extra.AmlStart));
+ /* Execute the AML code for the TermArg arguments */
- /*
- * Allocate a new parser op to be the root of the parsed
- * OpRegion tree
- */
- Op = AcpiPsAllocOp (AML_SCOPE_OP);
- if (!Op)
- {
- return (AE_NO_MEMORY);
- }
+ Status = AcpiDsExecuteArguments (Node, ExtraDesc);
+ return_ACPI_STATUS (Status);
+}
- /* Save the Node for use in AcpiPsParseAml */
- Op->Node = AcpiNsGetParentObject (Node);
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiDsGetRegionArguments
+ *
+ * PARAMETERS: ObjDesc - A valid region object
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Get region address and length. This implements the late
+ * evaluation of these region attributes.
+ *
+ ****************************************************************************/
- /* Get a handle to the parent ACPI table */
+ACPI_STATUS
+AcpiDsGetRegionArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *RegionObj2;
- Status = AcpiTbHandleToObject (Node->OwnerId, &TableDesc);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
- /* Create and initialize a new parser state */
+ FUNCTION_TRACE_PTR ("DsGetRegionArguments", ObjDesc);
- WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT,
- Op, NULL, NULL);
- if (!WalkState)
- {
- return_ACPI_STATUS (AE_NO_MEMORY);
- }
- Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart,
- ExtraDesc->Extra.AmlLength, NULL, NULL, 1);
- if (ACPI_FAILURE (Status))
+ if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
{
- /* TBD: delete walk state */
- return_ACPI_STATUS (Status);
+ return_ACPI_STATUS (AE_OK);
}
- /* TBD: No Walk flags?? */
-
- WalkState->ParseFlags = 0;
-
- /* Parse the entire OpRegion declaration, creating a parse tree */
-
- Status = AcpiPsParseAml (WalkState);
- if (ACPI_FAILURE (Status))
+ RegionObj2 = AcpiNsGetSecondaryObject (ObjDesc);
+ if (!RegionObj2)
{
- AcpiPsDeleteParseTree (Op);
- return_ACPI_STATUS (Status);
+ return_ACPI_STATUS (AE_NOT_EXIST);
}
- /* Get and init the actual RegionOp created above */
-
- RegionOp = Op->Value.Arg;
- Op->Node = Node;
-
-
- RegionOp = Op->Value.Arg;
- RegionOp->Node = Node;
- AcpiPsDeleteParseTree (Op);
-
- /* Evaluate the address and length arguments for the OpRegion */
-
- Op = AcpiPsAllocOp (AML_SCOPE_OP);
- if (!Op)
- {
- return (AE_NO_MEMORY);
- }
+ /* Get the AML pointer (method object) and region node */
- Op->Node = AcpiNsGetParentObject (Node);
+ Node = ObjDesc->Region.Node;
- /* Create and initialize a new parser state */
+ DEBUG_EXEC(AcpiUtDisplayInitPathname (Node, " [Operation Region]"));
- WalkState = AcpiDsCreateWalkState (TABLE_ID_DSDT,
- Op, NULL, NULL);
- if (!WalkState)
- {
- return_ACPI_STATUS (AE_NO_MEMORY);
- }
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Init at AML %p\n",
+ (char *) &Node->Name, RegionObj2->Extra.AmlStart));
- Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, ExtraDesc->Extra.AmlStart,
- ExtraDesc->Extra.AmlLength, NULL, NULL, 3);
- if (ACPI_FAILURE (Status))
- {
- /* TBD: delete walk state */
- return_ACPI_STATUS (Status);
- }
- Status = AcpiPsParseAml (WalkState);
- AcpiPsDeleteParseTree (Op);
+ Status = AcpiDsExecuteArguments (Node, RegionObj2);
return_ACPI_STATUS (Status);
}
@@ -460,21 +377,6 @@ AcpiDsInitializeRegion (
* DESCRIPTION: Get BufferField Buffer and Index
* Called from AcpiDsExecEndOp during BufferField parse tree walk
*
- * ACPI SPECIFICATION REFERENCES:
- * Each of the Buffer Field opcodes is defined as specified in in-line
- * comments below. For each one, use the following definitions.
- *
- * DefBitField := BitFieldOp SrcBuf BitIdx Destination
- * DefByteField := ByteFieldOp SrcBuf ByteIdx Destination
- * DefCreateField := CreateFieldOp SrcBuf BitIdx NumBits NameString
- * DefDWordField := DWordFieldOp SrcBuf ByteIdx Destination
- * DefWordField := WordFieldOp SrcBuf ByteIdx Destination
- * BitIndex := TermArg=>Integer
- * ByteIndex := TermArg=>Integer
- * Destination := NameString
- * NumBits := TermArg=>Integer
- * SourceBuf := TermArg=>Buffer
- *
****************************************************************************/
ACPI_STATUS
@@ -523,7 +425,6 @@ AcpiDsEvalBufferFieldOperands (
return_ACPI_STATUS (AE_NOT_EXIST);
}
-
/* Resolve the operands */
Status = AcpiExResolveOperands (Op->Opcode, WALK_OPERANDS, WalkState);
@@ -552,10 +453,7 @@ AcpiDsEvalBufferFieldOperands (
OffDesc = WalkState->Operands[1];
SrcDesc = WalkState->Operands[0];
-
-
-
- Offset = (UINT32) OffDesc->Integer.Value;
+ Offset = (UINT32) OffDesc->Integer.Value;
/*
* If ResDesc is a Name, it will be a direct name pointer after
@@ -576,78 +474,60 @@ AcpiDsEvalBufferFieldOperands (
switch (Op->Opcode)
{
- /* DefCreateField */
-
case AML_CREATE_FIELD_OP:
/* Offset is in bits, count is in bits */
BitOffset = Offset;
BitCount = (UINT32) CntDesc->Integer.Value;
- FieldFlags = ACCESS_BYTE_ACC;
+ FieldFlags = AML_FIELD_ACCESS_BYTE;
break;
-
- /* DefCreateBitField */
-
case AML_CREATE_BIT_FIELD_OP:
/* Offset is in bits, Field is one bit */
BitOffset = Offset;
BitCount = 1;
- FieldFlags = ACCESS_BYTE_ACC;
+ FieldFlags = AML_FIELD_ACCESS_BYTE;
break;
-
- /* DefCreateByteField */
-
case AML_CREATE_BYTE_FIELD_OP:
/* Offset is in bytes, field is one byte */
BitOffset = 8 * Offset;
BitCount = 8;
- FieldFlags = ACCESS_BYTE_ACC;
+ FieldFlags = AML_FIELD_ACCESS_BYTE;
break;
-
- /* DefCreateWordField */
-
case AML_CREATE_WORD_FIELD_OP:
/* Offset is in bytes, field is one word */
BitOffset = 8 * Offset;
BitCount = 16;
- FieldFlags = ACCESS_WORD_ACC;
+ FieldFlags = AML_FIELD_ACCESS_WORD;
break;
-
- /* DefCreateDWordField */
-
case AML_CREATE_DWORD_FIELD_OP:
/* Offset is in bytes, field is one dword */
BitOffset = 8 * Offset;
BitCount = 32;
- FieldFlags = ACCESS_DWORD_ACC;
+ FieldFlags = AML_FIELD_ACCESS_DWORD;
break;
-
- /* DefCreateQWordField */
-
case AML_CREATE_QWORD_FIELD_OP:
/* Offset is in bytes, field is one qword */
BitOffset = 8 * Offset;
BitCount = 64;
- FieldFlags = ACCESS_QWORD_ACC;
+ FieldFlags = AML_FIELD_ACCESS_QWORD;
break;
-
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
@@ -657,7 +537,6 @@ AcpiDsEvalBufferFieldOperands (
goto Cleanup;
}
-
/*
* Setup field according to the object type
*/
@@ -678,12 +557,11 @@ AcpiDsEvalBufferFieldOperands (
goto Cleanup;
}
-
/*
* Initialize areas of the field object that are common to all fields
* For FieldFlags, use LOCK_RULE = 0 (NO_LOCK), UPDATE_RULE = 0 (UPDATE_PRESERVE)
*/
- Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags,
+ Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0,
BitOffset, BitCount);
if (ACPI_FAILURE (Status))
{
@@ -696,7 +574,6 @@ AcpiDsEvalBufferFieldOperands (
SrcDesc->Common.ReferenceCount = (UINT16) (SrcDesc->Common.ReferenceCount +
ObjDesc->Common.ReferenceCount);
-
break;
@@ -704,7 +581,7 @@ AcpiDsEvalBufferFieldOperands (
default:
- if ((SrcDesc->Common.Type > (UINT8) INTERNAL_TYPE_REFERENCE) || !AcpiUtValidObjectType (SrcDesc->Common.Type)) /* TBD: This line MUST be a single line until AcpiSrc can handle it (block deletion) */
+ if ((SrcDesc->Common.Type > (UINT8) INTERNAL_TYPE_REFERENCE) || !AcpiUtValidObjectType (SrcDesc->Common.Type)) /* This line MUST be a single line until AcpiSrc can handle it (block deletion) */
{
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Tried to create field in invalid object type %X\n",
@@ -915,11 +792,8 @@ AcpiDsExecBeginControlOp (
*/
WalkState->ControlState->Control.AmlPredicateStart =
WalkState->ParserState.Aml - 1;
- /* TBD: can this be removed? */
- /*AcpiPsPkgLengthEncodingSize (GET8 (WalkState->ParserState->Aml));*/
break;
-
case AML_ELSE_OP:
/* Predicate is in the state object */
@@ -932,12 +806,10 @@ AcpiDsExecBeginControlOp (
break;
-
case AML_RETURN_OP:
break;
-
default:
break;
}
@@ -958,7 +830,6 @@ AcpiDsExecBeginControlOp (
* DESCRIPTION: Handles all control ops encountered during control method
* execution.
*
- *
******************************************************************************/
ACPI_STATUS
@@ -1077,11 +948,11 @@ AcpiDsExecEndControlOp (
((WalkState->Results->Results.ObjDesc [0])->Common.Type == INTERNAL_TYPE_REFERENCE) &&
((WalkState->Results->Results.ObjDesc [0])->Reference.Opcode != AML_INDEX_OP))
{
- Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
+ Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
}
WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0];
@@ -1166,7 +1037,6 @@ AcpiDsExecEndControlOp (
break;
}
-
return (Status);
}
OpenPOWER on IntegriCloud