rsutils.c

来自「acpi tools for linux include acpiexec a」· C语言 代码 · 共 876 行 · 第 1/2 页

C
876
字号
    ACPI_FUNCTION_ENTRY ();    TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER);    AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength);    /*     * ResourceSource is present if the length of the descriptor is longer than     * the minimum length.     *     * Note: Some resource descriptors will have an additional null, so     * we add 1 to the minimum length.     */    if (TotalLength > (ACPI_RSDESC_SIZE) (MinimumLength + 1))    {        /* Get the ResourceSourceIndex */        ResourceSource->Index = AmlResourceSource[0];        ResourceSource->StringPtr = StringPtr;        if (!StringPtr)        {            /*             * String destination pointer is not specified; Set the String             * pointer to the end of the current ResourceSource structure.             */            ResourceSource->StringPtr = ACPI_ADD_PTR (char, ResourceSource,                sizeof (ACPI_RESOURCE_SOURCE));        }        /*         * In order for the Resource length to be a multiple of the native         * word, calculate the length of the string (+1 for NULL terminator)         * and expand to the next word multiple.         *         * Zero the entire area of the buffer.         */        TotalLength = (UINT32) ACPI_STRLEN (            ACPI_CAST_PTR (char, &AmlResourceSource[1])) + 1;        TotalLength = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (TotalLength);        ACPI_MEMSET (ResourceSource->StringPtr, 0, TotalLength);        /* Copy the ResourceSource string to the destination */        ResourceSource->StringLength = AcpiRsStrcpy (ResourceSource->StringPtr,            ACPI_CAST_PTR (char, &AmlResourceSource[1]));        return ((ACPI_RS_LENGTH) TotalLength);    }    /* ResourceSource is not present */    ResourceSource->Index = 0;    ResourceSource->StringLength = 0;    ResourceSource->StringPtr = NULL;    return (0);}/******************************************************************************* * * FUNCTION:    AcpiRsSetResourceSource * * PARAMETERS:  Aml                 - Pointer to the raw AML descriptor *              MinimumLength       - Minimum length of the descriptor (minus *                                    any optional fields) *              ResourceSource      - Internal ResourceSource * * RETURN:      Total length of the AML descriptor * * DESCRIPTION: Convert an optional ResourceSource from internal format to a *              raw AML resource descriptor * ******************************************************************************/ACPI_RSDESC_SIZEAcpiRsSetResourceSource (    AML_RESOURCE            *Aml,    ACPI_RS_LENGTH          MinimumLength,    ACPI_RESOURCE_SOURCE    *ResourceSource){    UINT8                   *AmlResourceSource;    ACPI_RSDESC_SIZE        DescriptorLength;    ACPI_FUNCTION_ENTRY ();    DescriptorLength = MinimumLength;    /* Non-zero string length indicates presence of a ResourceSource */    if (ResourceSource->StringLength)    {        /* Point to the end of the AML descriptor */        AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength);        /* Copy the ResourceSourceIndex */        AmlResourceSource[0] = (UINT8) ResourceSource->Index;        /* Copy the ResourceSource string */        ACPI_STRCPY (ACPI_CAST_PTR (char, &AmlResourceSource[1]),            ResourceSource->StringPtr);        /*         * Add the length of the string (+ 1 for null terminator) to the         * final descriptor length         */        DescriptorLength += ((ACPI_RSDESC_SIZE) ResourceSource->StringLength + 1);    }    /* Return the new total length of the AML descriptor */    return (DescriptorLength);}/******************************************************************************* * * FUNCTION:    AcpiRsGetPrtMethodData * * PARAMETERS:  Node            - Device node *              RetBuffer       - Pointer to a buffer structure for the *                                results * * RETURN:      Status * * DESCRIPTION: This function is called to get the _PRT value of an object *              contained in an object specified by the handle passed in * *              If the function fails an appropriate status will be returned *              and the contents of the callers buffer is undefined. * ******************************************************************************/ACPI_STATUSAcpiRsGetPrtMethodData (    ACPI_NAMESPACE_NODE     *Node,    ACPI_BUFFER             *RetBuffer){    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (RsGetPrtMethodData);    /* Parameters guaranteed valid by caller */    /* Execute the method, no parameters */    Status = AcpiUtEvaluateObject (Node, METHOD_NAME__PRT,                ACPI_BTYPE_PACKAGE, &ObjDesc);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Create a resource linked list from the byte stream buffer that comes     * back from the _CRS method execution.     */    Status = AcpiRsCreatePciRoutingTable (ObjDesc, RetBuffer);    /* On exit, we must delete the object returned by EvaluateObject */    AcpiUtRemoveReference (ObjDesc);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiRsGetCrsMethodData * * PARAMETERS:  Node            - Device node *              RetBuffer       - Pointer to a buffer structure for the *                                results * * RETURN:      Status * * DESCRIPTION: This function is called to get the _CRS value of an object *              contained in an object specified by the handle passed in * *              If the function fails an appropriate status will be returned *              and the contents of the callers buffer is undefined. * ******************************************************************************/ACPI_STATUSAcpiRsGetCrsMethodData (    ACPI_NAMESPACE_NODE     *Node,    ACPI_BUFFER             *RetBuffer){    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (RsGetCrsMethodData);    /* Parameters guaranteed valid by caller */    /* Execute the method, no parameters */    Status = AcpiUtEvaluateObject (Node, METHOD_NAME__CRS,                ACPI_BTYPE_BUFFER, &ObjDesc);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Make the call to create a resource linked list from the     * byte stream buffer that comes back from the _CRS method     * execution.     */    Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer);    /* On exit, we must delete the object returned by evaluateObject */    AcpiUtRemoveReference (ObjDesc);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiRsGetPrsMethodData * * PARAMETERS:  Node            - Device node *              RetBuffer       - Pointer to a buffer structure for the *                                results * * RETURN:      Status * * DESCRIPTION: This function is called to get the _PRS value of an object *              contained in an object specified by the handle passed in * *              If the function fails an appropriate status will be returned *              and the contents of the callers buffer is undefined. * ******************************************************************************/ACPI_STATUSAcpiRsGetPrsMethodData (    ACPI_NAMESPACE_NODE     *Node,    ACPI_BUFFER             *RetBuffer){    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (RsGetPrsMethodData);    /* Parameters guaranteed valid by caller */    /* Execute the method, no parameters */    Status = AcpiUtEvaluateObject (Node, METHOD_NAME__PRS,                ACPI_BTYPE_BUFFER, &ObjDesc);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Make the call to create a resource linked list from the     * byte stream buffer that comes back from the _CRS method     * execution.     */    Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer);    /* On exit, we must delete the object returned by evaluateObject */    AcpiUtRemoveReference (ObjDesc);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiRsGetMethodData * * PARAMETERS:  Handle          - Handle to the containing object *              Path            - Path to method, relative to Handle *              RetBuffer       - Pointer to a buffer structure for the *                                results * * RETURN:      Status * * DESCRIPTION: This function is called to get the _CRS or _PRS value of an *              object contained in an object specified by the handle passed in * *              If the function fails an appropriate status will be returned *              and the contents of the callers buffer is undefined. * ******************************************************************************/ACPI_STATUSAcpiRsGetMethodData (    ACPI_HANDLE             Handle,    char                    *Path,    ACPI_BUFFER             *RetBuffer){    ACPI_OPERAND_OBJECT     *ObjDesc;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (RsGetMethodData);    /* Parameters guaranteed valid by caller */    /* Execute the method, no parameters */    Status = AcpiUtEvaluateObject (Handle, Path, ACPI_BTYPE_BUFFER, &ObjDesc);    if (ACPI_FAILURE (Status))    {        return_ACPI_STATUS (Status);    }    /*     * Make the call to create a resource linked list from the     * byte stream buffer that comes back from the method     * execution.     */    Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer);    /* On exit, we must delete the object returned by EvaluateObject */    AcpiUtRemoveReference (ObjDesc);    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiRsSetSrsMethodData * * PARAMETERS:  Node            - Device node *              InBuffer        - Pointer to a buffer structure of the *                                parameter * * RETURN:      Status * * DESCRIPTION: This function is called to set the _SRS of an object contained *              in an object specified by the handle passed in * *              If the function fails an appropriate status will be returned *              and the contents of the callers buffer is undefined. * * Note: Parameters guaranteed valid by caller * ******************************************************************************/ACPI_STATUSAcpiRsSetSrsMethodData (    ACPI_NAMESPACE_NODE     *Node,    ACPI_BUFFER             *InBuffer){    ACPI_EVALUATE_INFO      *Info;    ACPI_OPERAND_OBJECT     *Args[2];    ACPI_STATUS             Status;    ACPI_BUFFER             Buffer;    ACPI_FUNCTION_TRACE (RsSetSrsMethodData);    /* Allocate and initialize the evaluation information block */    Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));    if (!Info)    {        return_ACPI_STATUS (AE_NO_MEMORY);    }    Info->PrefixNode = Node;    Info->Pathname = METHOD_NAME__SRS;    Info->Parameters = Args;    Info->ParameterType = ACPI_PARAM_ARGS;    Info->Flags = ACPI_IGNORE_RETURN_VALUE;    /*     * The InBuffer parameter will point to a linked list of     * resource parameters. It needs to be formatted into a     * byte stream to be sent in as an input parameter to _SRS     *     * Convert the linked list into a byte stream     */    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;    Status = AcpiRsCreateAmlResources (InBuffer->Pointer, &Buffer);    if (ACPI_FAILURE (Status))    {        goto Cleanup;    }    /* Create and initialize the method parameter object */    Args[0] = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);    if (!Args[0])    {        /*         * Must free the buffer allocated above (otherwise it is freed         * later)         */        ACPI_FREE (Buffer.Pointer);        Status = AE_NO_MEMORY;        goto Cleanup;    }    Args[0]->Buffer.Length  = (UINT32) Buffer.Length;    Args[0]->Buffer.Pointer = Buffer.Pointer;    Args[0]->Common.Flags   = AOPOBJ_DATA_VALID;    Args[1] = NULL;    /* Execute the method, no return value is expected */    Status = AcpiNsEvaluate (Info);    /* Clean up and return the status from AcpiNsEvaluate */    AcpiUtRemoveReference (Args[0]);Cleanup:    ACPI_FREE (Info);    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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