diff options
Diffstat (limited to 'sys/contrib/dev/acpica/exprep.c')
-rw-r--r-- | sys/contrib/dev/acpica/exprep.c | 298 |
1 files changed, 71 insertions, 227 deletions
diff --git a/sys/contrib/dev/acpica/exprep.c b/sys/contrib/dev/acpica/exprep.c index 8dfe99c..1089492 100644 --- a/sys/contrib/dev/acpica/exprep.c +++ b/sys/contrib/dev/acpica/exprep.c @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities - * $Revision: 95 $ + * $Revision: 99 $ * *****************************************************************************/ @@ -343,7 +343,7 @@ AcpiExPrepCommonFieldObject ( /******************************************************************************* * - * FUNCTION: AcpiExPrepRegionFieldValue + * FUNCTION: AcpiExPrepFieldValue * * PARAMETERS: Node - Owning Node * RegionNode - Region in which field is being defined @@ -353,291 +353,135 @@ AcpiExPrepCommonFieldObject ( * * RETURN: Status * - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and + * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and * connect it to the parent Node. * ******************************************************************************/ ACPI_STATUS -AcpiExPrepRegionFieldValue ( - ACPI_NAMESPACE_NODE *Node, - ACPI_HANDLE RegionNode, - UINT8 FieldFlags, - UINT32 FieldBitPosition, - UINT32 FieldBitLength) +AcpiExPrepFieldValue ( + ACPI_CREATE_FIELD_INFO *Info) { ACPI_OPERAND_OBJECT *ObjDesc; UINT32 Type; ACPI_STATUS Status; - FUNCTION_TRACE ("ExPrepRegionFieldValue"); + FUNCTION_TRACE ("ExPrepFieldValue"); /* Parameter validation */ - if (!RegionNode) + if (Info->FieldType != INTERNAL_TYPE_INDEX_FIELD) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null RegionNode\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + if (!Info->RegionNode) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null RegionNode\n")); + return_ACPI_STATUS (AE_AML_NO_OPERAND); + } - Type = AcpiNsGetType (RegionNode); - if (Type != ACPI_TYPE_REGION) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", - Type, AcpiUtGetTypeName (Type))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + Type = AcpiNsGetType (Info->RegionNode); + if (Type != ACPI_TYPE_REGION) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", + Type, AcpiUtGetTypeName (Type))); + + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } } - /* Allocate a new object */ + /* Allocate a new region object */ - ObjDesc = AcpiUtCreateInternalObject (INTERNAL_TYPE_REGION_FIELD); + ObjDesc = AcpiUtCreateInternalObject (Info->FieldType); if (!ObjDesc) { return_ACPI_STATUS (AE_NO_MEMORY); } - - /* ObjDesc and Region valid */ - - DUMP_OPERANDS ((ACPI_OPERAND_OBJECT **) &Node, IMODE_EXECUTE, - "ExPrepRegionFieldValue", 1, "case RegionField"); - DUMP_OPERANDS ((ACPI_OPERAND_OBJECT **) &RegionNode, IMODE_EXECUTE, - "ExPrepRegionFieldValue", 1, "case RegionField"); - /* Initialize areas of the object that are common to all fields */ - Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, - FieldBitPosition, FieldBitLength); + Status = AcpiExPrepCommonFieldObject (ObjDesc, Info->FieldFlags, + Info->FieldBitPosition, Info->FieldBitLength); if (ACPI_FAILURE (Status)) { + AcpiUtDeleteObjectDesc (ObjDesc); return_ACPI_STATUS (Status); } - /* Initialize areas of the object that are specific to this field type */ - - ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (RegionNode); - - /* An additional reference for the container */ - - AcpiUtAddReference (ObjDesc->Field.RegionObj); + /* Initialize areas of the object that are specific to the field type */ + switch (Info->FieldType) + { + case INTERNAL_TYPE_REGION_FIELD: - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bitoff=%X Off=%X Gran=%X Region %p\n", - ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset, - ObjDesc->Field.AccessBitWidth, ObjDesc->Field.RegionObj)); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set NamedObj %p (%4.4s) val = %p\n", - Node, &(Node->Name), ObjDesc)); - + ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); - /* - * Store the constructed descriptor (ObjDesc) into the parent Node, - * preserving the current type of that NamedObj. - */ - Status = AcpiNsAttachObject (Node, ObjDesc, (UINT8) AcpiNsGetType (Node)); - return_ACPI_STATUS (Status); -} + /* An additional reference for the container */ + AcpiUtAddReference (ObjDesc->Field.RegionObj); -/******************************************************************************* - * - * FUNCTION: AcpiExPrepBankFieldValue - * - * PARAMETERS: Node - Owning Node - * RegionNode - Region in which field is being defined - * BankRegisterNode - Bank selection register node - * BankVal - Value to store in selection register - * FieldFlags - Access, LockRule, and UpdateRule - * FieldBitPosition - Field start position - * FieldBitLength - Field length in number of bits - * - * RETURN: Status - * - * DESCRIPTION: Construct an object of type BankField and attach it to the - * parent Node. - * - ******************************************************************************/ + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RegionField: Bitoff=%X Off=%X Gran=%X Region %p\n", + ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset, + ObjDesc->Field.AccessBitWidth, ObjDesc->Field.RegionObj)); + break; -ACPI_STATUS -AcpiExPrepBankFieldValue ( - ACPI_NAMESPACE_NODE *Node, - ACPI_NAMESPACE_NODE *RegionNode, - ACPI_NAMESPACE_NODE *BankRegisterNode, - UINT32 BankVal, - UINT8 FieldFlags, - UINT32 FieldBitPosition, - UINT32 FieldBitLength) -{ - ACPI_OPERAND_OBJECT *ObjDesc; - UINT32 Type; - ACPI_STATUS Status; + case INTERNAL_TYPE_BANK_FIELD: - FUNCTION_TRACE ("ExPrepBankFieldValue"); + ObjDesc->BankField.Value = Info->BankValue; + ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); + ObjDesc->BankField.BankRegisterObj = AcpiNsGetAttachedObject (Info->RegisterNode); + /* An additional reference for the attached objects */ - /* Parameter validation */ + AcpiUtAddReference (ObjDesc->BankField.RegionObj); + AcpiUtAddReference (ObjDesc->BankField.BankRegisterObj); - if (!RegionNode) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null RegionNode\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bank Field: BitOff=%X Off=%X Gran=%X Region %p BankReg %p\n", + ObjDesc->BankField.StartFieldBitOffset, ObjDesc->BankField.BaseByteOffset, + ObjDesc->Field.AccessBitWidth, ObjDesc->BankField.RegionObj, + ObjDesc->BankField.BankRegisterObj)); + break; - Type = AcpiNsGetType (RegionNode); - if (Type != ACPI_TYPE_REGION) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", - Type, AcpiUtGetTypeName (Type))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); - } - /* Allocate a new object */ + case INTERNAL_TYPE_INDEX_FIELD: - ObjDesc = AcpiUtCreateInternalObject (INTERNAL_TYPE_BANK_FIELD); - if (!ObjDesc) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } + ObjDesc->IndexField.IndexObj = AcpiNsGetAttachedObject (Info->RegisterNode); + ObjDesc->IndexField.DataObj = AcpiNsGetAttachedObject (Info->DataRegisterNode); + ObjDesc->IndexField.Value = (UINT32) (Info->FieldBitPosition / + ObjDesc->Field.AccessBitWidth); - /* ObjDesc and Region valid */ + if (!ObjDesc->IndexField.DataObj || !ObjDesc->IndexField.IndexObj) + { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Index Object\n")); + return_ACPI_STATUS (AE_AML_INTERNAL); + } - DUMP_OPERANDS ((ACPI_OPERAND_OBJECT **) &Node, IMODE_EXECUTE, - "ExPrepBankFieldValue", 1, "case BankField"); - DUMP_OPERANDS ((ACPI_OPERAND_OBJECT **) &RegionNode, IMODE_EXECUTE, - "ExPrepBankFieldValue", 1, "case BankField"); + /* An additional reference for the attached objects */ - /* Initialize areas of the object that are common to all fields */ + AcpiUtAddReference (ObjDesc->IndexField.DataObj); + AcpiUtAddReference (ObjDesc->IndexField.IndexObj); - Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, - FieldBitPosition, FieldBitLength); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "IndexField: bitoff=%X off=%X gran=%X Index %p Data %p\n", + ObjDesc->IndexField.StartFieldBitOffset, ObjDesc->IndexField.BaseByteOffset, + ObjDesc->Field.AccessBitWidth, ObjDesc->IndexField.IndexObj, + ObjDesc->IndexField.DataObj)); + break; } - /* Initialize areas of the object that are specific to this field type */ - - ObjDesc->BankField.Value = BankVal; - ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject (RegionNode); - ObjDesc->BankField.BankRegisterObj = AcpiNsGetAttachedObject (BankRegisterNode); - - /* An additional reference for the attached objects */ - - AcpiUtAddReference (ObjDesc->BankField.RegionObj); - AcpiUtAddReference (ObjDesc->BankField.BankRegisterObj); - - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "BitOff=%X Off=%X Gran=%X Region %p BankReg %p\n", - ObjDesc->BankField.StartFieldBitOffset, ObjDesc->BankField.BaseByteOffset, - ObjDesc->Field.AccessBitWidth, ObjDesc->BankField.RegionObj, - ObjDesc->BankField.BankRegisterObj)); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Set NamedObj %p (%4.4s) val=%p\n", - Node, &(Node->Name), ObjDesc)); - - /* * Store the constructed descriptor (ObjDesc) into the parent Node, * preserving the current type of that NamedObj. */ - Status = AcpiNsAttachObject (Node, ObjDesc, (UINT8) AcpiNsGetType (Node)); - return_ACPI_STATUS (Status); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiExPrepIndexFieldValue - * - * PARAMETERS: Node - Owning Node - * IndexReg - Index register - * DataReg - Data register - * FieldFlags - Access, LockRule, and UpdateRule - * FieldBitPosition - Field start position - * FieldBitLength - Field length in number of bits - * - * RETURN: Status - * - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type IndexField and - * connect it to the parent Node. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiExPrepIndexFieldValue ( - ACPI_NAMESPACE_NODE *Node, - ACPI_NAMESPACE_NODE *IndexReg, - ACPI_NAMESPACE_NODE *DataReg, - UINT8 FieldFlags, - UINT32 FieldBitPosition, - UINT32 FieldBitLength) -{ - ACPI_OPERAND_OBJECT *ObjDesc; - ACPI_STATUS Status; - - - FUNCTION_TRACE ("ExPrepIndexFieldValue"); - - - /* Parameter validation */ - - if (!IndexReg || !DataReg) - { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null handle\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* Allocate a new object descriptor */ - - ObjDesc = AcpiUtCreateInternalObject (INTERNAL_TYPE_INDEX_FIELD); - if (!ObjDesc) - { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - /* Initialize areas of the object that are common to all fields */ - - Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, - FieldBitPosition, FieldBitLength); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - - /* Initialize areas of the object that are specific to this field type */ - - ObjDesc->IndexField.DataObj = AcpiNsGetAttachedObject (DataReg); - ObjDesc->IndexField.IndexObj = AcpiNsGetAttachedObject (IndexReg); - ObjDesc->IndexField.Value = (UINT32) (FieldBitPosition / - ObjDesc->Field.AccessBitWidth); - - /* An additional reference for the attached objects */ - - AcpiUtAddReference (ObjDesc->IndexField.DataObj); - AcpiUtAddReference (ObjDesc->IndexField.IndexObj); - - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "bitoff=%X off=%X gran=%X Index %p Data %p\n", - ObjDesc->IndexField.StartFieldBitOffset, ObjDesc->IndexField.BaseByteOffset, - ObjDesc->Field.AccessBitWidth, ObjDesc->IndexField.IndexObj, - ObjDesc->IndexField.DataObj)); + Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc, + (UINT8) AcpiNsGetType (Info->FieldNode)); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set NamedObj %p (%4.4s) val = %p\n", - Node, &(Node->Name), ObjDesc)); + Info->FieldNode, (char*)&(Info->FieldNode->Name), ObjDesc)); + /* Remove local reference to the object */ - /* - * Store the constructed descriptor (ObjDesc) into the parent Node, - * preserving the current type of that NamedObj. - */ - Status = AcpiNsAttachObject (Node, ObjDesc, (UINT8) AcpiNsGetType (Node)); + AcpiUtRemoveReference (ObjDesc); return_ACPI_STATUS (Status); } |