⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exprep.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    case AML_FIELD_ACCESS_WORD:        ByteAlignment = 2;        BitLength     = 16;        break;    case AML_FIELD_ACCESS_DWORD:        ByteAlignment = 4;        BitLength     = 32;        break;    case AML_FIELD_ACCESS_QWORD:    /* ACPI 2.0 */        ByteAlignment = 8;        BitLength     = 64;        break;    default:        /* Invalid field access type */        ACPI_ERROR ((AE_INFO,            "Unknown field access type %X",            Access));        return_UINT32 (0);    }    if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_BUFFER_FIELD)    {        /*         * BufferField access can be on any byte boundary, so the         * ByteAlignment is always 1 byte -- regardless of any ByteAlignment         * implied by the field access type.         */        ByteAlignment = 1;    }    *ReturnByteAlignment = ByteAlignment;    return_UINT32 (BitLength);}/******************************************************************************* * * FUNCTION:    AcpiExPrepCommonFieldObject * * PARAMETERS:  ObjDesc             - The field object *              FieldFlags          - Access, LockRule, and UpdateRule. *                                    The format of a FieldFlag is described *                                    in the ACPI specification *              FieldAttribute      - Special attributes (not used) *              FieldBitPosition    - Field start position *              FieldBitLength      - Field length in number of bits * * RETURN:      Status * * DESCRIPTION: Initialize the areas of the field object that are common *              to the various types of fields.  Note: This is very "sensitive" *              code because we are solving the general case for field *              alignment. * ******************************************************************************/ACPI_STATUSAcpiExPrepCommonFieldObject (    ACPI_OPERAND_OBJECT     *ObjDesc,    UINT8                   FieldFlags,    UINT8                   FieldAttribute,    UINT32                  FieldBitPosition,    UINT32                  FieldBitLength){    UINT32                  AccessBitWidth;    UINT32                  ByteAlignment;    UINT32                  NearestByteAddress;    ACPI_FUNCTION_TRACE (ExPrepCommonFieldObject);    /*     * Note: the structure being initialized is the     * ACPI_COMMON_FIELD_INFO;  No structure fields outside of the common     * area are initialized by this procedure.     */    ObjDesc->CommonField.FieldFlags = FieldFlags;    ObjDesc->CommonField.Attribute  = FieldAttribute;    ObjDesc->CommonField.BitLength  = FieldBitLength;    /*     * Decode the access type so we can compute offsets.  The access type gives     * two pieces of information - the width of each field access and the     * necessary ByteAlignment (address granularity) of the access.     *     * For AnyAcc, the AccessBitWidth is the largest width that is both     * necessary and possible in an attempt to access the whole field in one     * I/O operation.  However, for AnyAcc, the ByteAlignment is always one     * byte.     *     * For all Buffer Fields, the ByteAlignment is always one byte.     *     * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is     * the same (equivalent) as the ByteAlignment.     */    AccessBitWidth = AcpiExDecodeFieldAccess (ObjDesc, FieldFlags,                                &ByteAlignment);    if (!AccessBitWidth)    {        return_ACPI_STATUS (AE_AML_OPERAND_VALUE);    }    /* Setup width (access granularity) fields */    ObjDesc->CommonField.AccessByteWidth = (UINT8)            ACPI_DIV_8 (AccessBitWidth);            /* 1,  2,  4,  8 */    ObjDesc->CommonField.AccessBitWidth = (UINT8) AccessBitWidth;    /*     * BaseByteOffset is the address of the start of the field within the     * region.  It is the byte address of the first *datum* (field-width data     * unit) of the field. (i.e., the first datum that contains at least the     * first *bit* of the field.)     *     * Note: ByteAlignment is always either equal to the AccessBitWidth or 8     * (Byte access), and it defines the addressing granularity of the parent     * region or buffer.     */    NearestByteAddress =            ACPI_ROUND_BITS_DOWN_TO_BYTES (FieldBitPosition);    ObjDesc->CommonField.BaseByteOffset = (UINT32)            ACPI_ROUND_DOWN (NearestByteAddress, ByteAlignment);    /*     * StartFieldBitOffset is the offset of the first bit of the field within     * a field datum.     */    ObjDesc->CommonField.StartFieldBitOffset = (UINT8)        (FieldBitPosition - ACPI_MUL_8 (ObjDesc->CommonField.BaseByteOffset));    /*     * Does the entire field fit within a single field access element? (datum)     * (i.e., without crossing a datum boundary)     */    if ((ObjDesc->CommonField.StartFieldBitOffset + FieldBitLength) <=            (UINT16) AccessBitWidth)    {        ObjDesc->Common.Flags |= AOPOBJ_SINGLE_DATUM;    }    return_ACPI_STATUS (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiExPrepFieldValue * * PARAMETERS:  Info    - Contains all field creation info * * RETURN:      Status * * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and *              connect it to the parent Node. * ******************************************************************************/ACPI_STATUSAcpiExPrepFieldValue (    ACPI_CREATE_FIELD_INFO  *Info){    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_OPERAND_OBJECT     *SecondDesc = NULL;    UINT32                  Type;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (ExPrepFieldValue);    /* Parameter validation */    if (Info->FieldType != ACPI_TYPE_LOCAL_INDEX_FIELD)    {        if (!Info->RegionNode)        {            ACPI_ERROR ((AE_INFO, "Null RegionNode"));            return_ACPI_STATUS (AE_AML_NO_OPERAND);        }        Type = AcpiNsGetType (Info->RegionNode);        if (Type != ACPI_TYPE_REGION)        {            ACPI_ERROR ((AE_INFO,                "Needed Region, found type %X (%s)",                Type, AcpiUtGetTypeName (Type)));            return_ACPI_STATUS (AE_AML_OPERAND_TYPE);        }    }    /* Allocate a new field object */    ObjDesc = AcpiUtCreateInternalObject (Info->FieldType);    if (!ObjDesc)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    /* Initialize areas of the object that are common to all fields */    ObjDesc->CommonField.Node = Info->FieldNode;    Status = AcpiExPrepCommonFieldObject (ObjDesc, Info->FieldFlags,                Info->Attribute, Info->FieldBitPosition, Info->FieldBitLength);    if (ACPI_FAILURE (Status))    {        AcpiUtDeleteObjectDesc (ObjDesc);        return_ACPI_STATUS (Status);    }    /* Initialize areas of the object that are specific to the field type */    switch (Info->FieldType)    {    case ACPI_TYPE_LOCAL_REGION_FIELD:        ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode);        /* An additional reference for the container */        AcpiUtAddReference (ObjDesc->Field.RegionObj);        ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,            "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n",            ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset,            ObjDesc->Field.AccessByteWidth, ObjDesc->Field.RegionObj));        break;    case ACPI_TYPE_LOCAL_BANK_FIELD:        ObjDesc->BankField.Value     = Info->BankValue;        ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject (                                            Info->RegionNode);        ObjDesc->BankField.BankObj   = AcpiNsGetAttachedObject (                                            Info->RegisterNode);        /* An additional reference for the attached objects */        AcpiUtAddReference (ObjDesc->BankField.RegionObj);        AcpiUtAddReference (ObjDesc->BankField.BankObj);        ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,            "Bank Field: BitOff %X, Off %X, Gran %X, Region %p, BankReg %p\n",            ObjDesc->BankField.StartFieldBitOffset,            ObjDesc->BankField.BaseByteOffset,            ObjDesc->Field.AccessByteWidth,            ObjDesc->BankField.RegionObj,            ObjDesc->BankField.BankObj));        /*         * Remember location in AML stream of the field unit         * opcode and operands -- since the BankValue         * operands must be evaluated.         */        SecondDesc                  = ObjDesc->Common.NextObject;        SecondDesc->Extra.AmlStart  = ((ACPI_PARSE_OBJECT*) (Info->DataRegisterNode))->Named.Data;        SecondDesc->Extra.AmlLength = ((ACPI_PARSE_OBJECT*) (Info->DataRegisterNode))->Named.Length;        break;    case ACPI_TYPE_LOCAL_INDEX_FIELD:        /* Get the Index and Data registers */        ObjDesc->IndexField.IndexObj = AcpiNsGetAttachedObject (                                            Info->RegisterNode);        ObjDesc->IndexField.DataObj  = AcpiNsGetAttachedObject (                                            Info->DataRegisterNode);        if (!ObjDesc->IndexField.DataObj || !ObjDesc->IndexField.IndexObj)        {            ACPI_ERROR ((AE_INFO, "Null Index Object during field prep"));            AcpiUtDeleteObjectDesc (ObjDesc);            return_ACPI_STATUS (AE_AML_INTERNAL);        }        /* An additional reference for the attached objects */        AcpiUtAddReference (ObjDesc->IndexField.DataObj);        AcpiUtAddReference (ObjDesc->IndexField.IndexObj);        /*         * April 2006: Changed to match MS behavior         *         * The value written to the Index register is the byte offset of the         * target field in units of the granularity of the IndexField         *         * Previously, the value was calculated as an index in terms of the         * width of the Data register, as below:         *         *      ObjDesc->IndexField.Value = (UINT32)         *          (Info->FieldBitPosition / ACPI_MUL_8 (         *              ObjDesc->Field.AccessByteWidth));         *         * February 2006: Tried value as a byte offset:         *      ObjDesc->IndexField.Value = (UINT32)         *          ACPI_DIV_8 (Info->FieldBitPosition);         */        ObjDesc->IndexField.Value = (UINT32) ACPI_ROUND_DOWN (            ACPI_DIV_8 (Info->FieldBitPosition),            ObjDesc->IndexField.AccessByteWidth);        ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,            "IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",            ObjDesc->IndexField.StartFieldBitOffset,            ObjDesc->IndexField.BaseByteOffset,            ObjDesc->IndexField.Value,            ObjDesc->Field.AccessByteWidth,            ObjDesc->IndexField.IndexObj,            ObjDesc->IndexField.DataObj));        break;    default:        /* No other types should get here */        break;    }    /*     * Store the constructed descriptor (ObjDesc) into the parent Node,     * preserving the current type of that NamedObj.     */    Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc,                    AcpiNsGetType (Info->FieldNode));    ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set NamedObj %p [%4.4s], ObjDesc %p\n",            Info->FieldNode, AcpiUtGetNodeName (Info->FieldNode), ObjDesc));    /* Remove local reference to the object */    AcpiUtRemoveReference (ObjDesc);    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -