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

📄 nsinit.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    case ACPI_TYPE_PACKAGE:        Info->PackageCount++;        break;    default:        /* No init required, just exit now */        return (AE_OK);    }    /*     * If the object is already initialized, nothing else to do     */    if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)    {        return (AE_OK);    }    /*     * Must lock the interpreter before executing AML code     */    AcpiExEnterInterpreter ();    /*     * Each of these types can contain executable AML code within the     * declaration.     */    switch (Type)    {    case ACPI_TYPE_REGION:        Info->OpRegionInit++;        Status = AcpiDsGetRegionArguments (ObjDesc);        break;    case ACPI_TYPE_BUFFER_FIELD:        Info->FieldInit++;        Status = AcpiDsGetBufferFieldArguments (ObjDesc);        break;    case ACPI_TYPE_LOCAL_BANK_FIELD:        Info->FieldInit++;        Status = AcpiDsGetBankFieldArguments (ObjDesc);        break;    case ACPI_TYPE_BUFFER:        Info->BufferInit++;        Status = AcpiDsGetBufferArguments (ObjDesc);        break;    case ACPI_TYPE_PACKAGE:        Info->PackageInit++;        Status = AcpiDsGetPackageArguments (ObjDesc);        break;    default:        /* No other types can get here */        break;    }    if (ACPI_FAILURE (Status))    {        ACPI_EXCEPTION ((AE_INFO, Status,            "Could not execute arguments for [%4.4s] (%s)",            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Type)));    }    /*     * Print a dot for each object unless we are going to print the entire     * pathname     */    if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))    {        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));    }    /*     * We ignore errors from above, and always return OK, since we don't want     * to abort the walk on any single error.     */    AcpiExExitInterpreter ();    return (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiNsFindIniMethods * * PARAMETERS:  ACPI_WALK_CALLBACK * * RETURN:      ACPI_STATUS * * DESCRIPTION: Called during namespace walk. Finds objects named _INI under *              device/processor/thermal objects, and marks the entire subtree *              with a SUBTREE_HAS_INI flag. This flag is used during the *              subsequent device initialization walk to avoid entire subtrees *              that do not contain an _INI. * ******************************************************************************/static ACPI_STATUSAcpiNsFindIniMethods (    ACPI_HANDLE             ObjHandle,    UINT32                  NestingLevel,    void                    *Context,    void                    **ReturnValue){    ACPI_DEVICE_WALK_INFO   *Info = ACPI_CAST_PTR (ACPI_DEVICE_WALK_INFO, Context);    ACPI_NAMESPACE_NODE     *Node;    ACPI_NAMESPACE_NODE     *ParentNode;    /* Keep count of device/processor/thermal objects */    Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);    if ((Node->Type == ACPI_TYPE_DEVICE)    ||        (Node->Type == ACPI_TYPE_PROCESSOR) ||        (Node->Type == ACPI_TYPE_THERMAL))    {        Info->DeviceCount++;        return (AE_OK);    }    /* We are only looking for methods named _INI */    if (!ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__INI))    {        return (AE_OK);    }    /*     * The only _INI methods that we care about are those that are     * present under Device, Processor, and Thermal objects.     */    ParentNode = AcpiNsGetParentNode (Node);    switch (ParentNode->Type)    {    case ACPI_TYPE_DEVICE:    case ACPI_TYPE_PROCESSOR:    case ACPI_TYPE_THERMAL:        /* Mark parent and bubble up the INI present flag to the root */        while (ParentNode)        {            ParentNode->Flags |= ANOBJ_SUBTREE_HAS_INI;            ParentNode = AcpiNsGetParentNode (ParentNode);        }        break;    default:        break;    }    return (AE_OK);}/******************************************************************************* * * FUNCTION:    AcpiNsInitOneDevice * * PARAMETERS:  ACPI_WALK_CALLBACK * * RETURN:      ACPI_STATUS * * DESCRIPTION: This is called once per device soon after ACPI is enabled *              to initialize each device. It determines if the device is *              present, and if so, calls _INI. * ******************************************************************************/static ACPI_STATUSAcpiNsInitOneDevice (    ACPI_HANDLE             ObjHandle,    UINT32                  NestingLevel,    void                    *Context,    void                    **ReturnValue){    ACPI_DEVICE_WALK_INFO   *WalkInfo = ACPI_CAST_PTR (ACPI_DEVICE_WALK_INFO, Context);    ACPI_EVALUATE_INFO      *Info = WalkInfo->EvaluateInfo;    UINT32                  Flags;    ACPI_STATUS             Status;    ACPI_NAMESPACE_NODE     *DeviceNode;    ACPI_FUNCTION_TRACE (NsInitOneDevice);    /* We are interested in Devices, Processors and ThermalZones only */    DeviceNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);    if ((DeviceNode->Type != ACPI_TYPE_DEVICE)    &&        (DeviceNode->Type != ACPI_TYPE_PROCESSOR) &&        (DeviceNode->Type != ACPI_TYPE_THERMAL))    {        return_ACPI_STATUS (AE_OK);    }    /*     * Because of an earlier namespace analysis, all subtrees that contain an     * _INI method are tagged.     *     * If this device subtree does not contain any _INI methods, we     * can exit now and stop traversing this entire subtree.     */    if (!(DeviceNode->Flags & ANOBJ_SUBTREE_HAS_INI))    {        return_ACPI_STATUS (AE_CTRL_DEPTH);    }    /*     * Run _STA to determine if this device is present and functioning. We     * must know this information for two important reasons (from ACPI spec):     *     * 1) We can only run _INI if the device is present.     * 2) We must abort the device tree walk on this subtree if the device is     *    not present and is not functional (we will not examine the children)     *     * The _STA method is not required to be present under the device, we     * assume the device is present if _STA does not exist.     */    ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (        ACPI_TYPE_METHOD, DeviceNode, METHOD_NAME__STA));    Status = AcpiUtExecute_STA (DeviceNode, &Flags);    if (ACPI_FAILURE (Status))    {        /* Ignore error and move on to next device */        return_ACPI_STATUS (AE_OK);    }    /*     * Flags == -1 means that _STA was not found. In this case, we assume that     * the device is both present and functional.     *     * From the ACPI spec, description of _STA:     *     * "If a device object (including the processor object) does not have an     * _STA object, then OSPM assumes that all of the above bits are set (in     * other words, the device is present, ..., and functioning)"     */    if (Flags != ACPI_UINT32_MAX)    {        WalkInfo->Num_STA++;    }    /*     * Examine the PRESENT and FUNCTIONING status bits     *     * Note: ACPI spec does not seem to specify behavior for the present but     * not functioning case, so we assume functioning if present.     */    if (!(Flags & ACPI_STA_DEVICE_PRESENT))    {        /* Device is not present, we must examine the Functioning bit */        if (Flags & ACPI_STA_DEVICE_FUNCTIONING)        {            /*             * Device is not present but is "functioning". In this case,             * we will not run _INI, but we continue to examine the children             * of this device.             *             * From the ACPI spec, description of _STA: (Note - no mention             * of whether to run _INI or not on the device in question)             *             * "_STA may return bit 0 clear (not present) with bit 3 set             * (device is functional). This case is used to indicate a valid             * device for which no device driver should be loaded (for example,             * a bridge device.) Children of this device may be present and             * valid. OSPM should continue enumeration below a device whose             * _STA returns this bit combination"             */            return_ACPI_STATUS (AE_OK);        }        else        {            /*             * Device is not present and is not functioning. We must abort the             * walk of this subtree immediately -- don't look at the children             * of such a device.             *             * From the ACPI spec, description of _INI:             *             * "If the _STA method indicates that the device is not present,             * OSPM will not run the _INI and will not examine the children             * of the device for _INI methods"             */            return_ACPI_STATUS (AE_CTRL_DEPTH);        }    }    /*     * The device is present or is assumed present if no _STA exists.     * Run the _INI if it exists (not required to exist)     *     * Note: We know there is an _INI within this subtree, but it may not be     * under this particular device, it may be lower in the branch.     */    ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (        ACPI_TYPE_METHOD, DeviceNode, METHOD_NAME__INI));    Info->PrefixNode = DeviceNode;    Info->Pathname = METHOD_NAME__INI;    Info->Parameters = NULL;    Info->ParameterType = ACPI_PARAM_ARGS;    Info->Flags = ACPI_IGNORE_RETURN_VALUE;    Status = AcpiNsEvaluate (Info);    if (ACPI_SUCCESS (Status))    {        WalkInfo->Num_INI++;        if ((AcpiDbgLevel <= ACPI_LV_ALL_EXCEPTIONS) &&            (!(AcpiDbgLevel & ACPI_LV_INFO)))        {            ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));        }    }#ifdef ACPI_DEBUG_OUTPUT    else if (Status != AE_NOT_FOUND)    {        /* Ignore error and move on to next device */        char *ScopeName = AcpiNsGetExternalPathname (Info->ResolvedNode);        ACPI_EXCEPTION ((AE_INFO, Status, "during %s._INI execution",            ScopeName));        ACPI_FREE (ScopeName);    }#endif    /* Ignore errors from above */    Status = AE_OK;    /*     * The _INI method has been run if present; call the Global Initialization     * Handler for this device.     */    if (AcpiGbl_InitHandler)    {        Status = AcpiGbl_InitHandler (DeviceNode, ACPI_INIT_DEVICE_INI);    }    return_ACPI_STATUS (Status);}

⌨️ 快捷键说明

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