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

📄 hwregs.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
    ACPI_FUNCTION_ENTRY ();    if (RegisterId > ACPI_BITREG_MAX)    {        ACPI_ERROR ((AE_INFO, "Invalid BitRegister ID: %X", RegisterId));        return (NULL);    }    return (&AcpiGbl_BitRegisterInfo[RegisterId]);}/******************************************************************************* * * FUNCTION:    AcpiGetRegister * * PARAMETERS:  RegisterId      - ID of ACPI BitRegister to access *              ReturnValue     - Value that was read from the register * * RETURN:      Status and the value read from specified Register. Value *              returned is normalized to bit0 (is shifted all the way right) * * DESCRIPTION: ACPI BitRegister read function. * ******************************************************************************/ACPI_STATUSAcpiGetRegister (    UINT32                  RegisterId,    UINT32                  *ReturnValue){    UINT32                  RegisterValue = 0;    ACPI_BIT_REGISTER_INFO  *BitRegInfo;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE (AcpiGetRegister);    /* Get the info structure corresponding to the requested ACPI Register */    BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);    if (!BitRegInfo)    {        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    /* Read from the register */    Status = AcpiHwRegisterRead (ACPI_MTX_LOCK,                BitRegInfo->ParentRegister, &RegisterValue);    if (ACPI_SUCCESS (Status))    {        /* Normalize the value that was read */        RegisterValue = ((RegisterValue & BitRegInfo->AccessBitMask)                            >> BitRegInfo->BitPosition);        *ReturnValue = RegisterValue;        ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read value %8.8X register %X\n",            RegisterValue, BitRegInfo->ParentRegister));    }    return_ACPI_STATUS (Status);}ACPI_EXPORT_SYMBOL (AcpiGetRegister)/******************************************************************************* * * FUNCTION:    AcpiSetRegister * * PARAMETERS:  RegisterId      - ID of ACPI BitRegister to access *              Value           - (only used on write) value to write to the *                                Register, NOT pre-normalized to the bit pos * * RETURN:      Status * * DESCRIPTION: ACPI Bit Register write function. * ******************************************************************************/ACPI_STATUSAcpiSetRegister (    UINT32                  RegisterId,    UINT32                  Value){    UINT32                  RegisterValue = 0;    ACPI_BIT_REGISTER_INFO  *BitRegInfo;    ACPI_STATUS             Status;    ACPI_CPU_FLAGS          LockFlags;    ACPI_FUNCTION_TRACE_U32 (AcpiSetRegister, RegisterId);    /* Get the info structure corresponding to the requested ACPI Register */    BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);    if (!BitRegInfo)    {        ACPI_ERROR ((AE_INFO, "Bad ACPI HW RegisterId: %X", RegisterId));        return_ACPI_STATUS (AE_BAD_PARAMETER);    }    LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);    /* Always do a register read first so we can insert the new bits  */    Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,                BitRegInfo->ParentRegister, &RegisterValue);    if (ACPI_FAILURE (Status))    {        goto UnlockAndExit;    }    /*     * Decode the Register ID     * Register ID = [Register block ID] | [bit ID]     *     * Check bit ID to fine locate Register offset.     * Check Mask to determine Register offset, and then read-write.     */    switch (BitRegInfo->ParentRegister)    {    case ACPI_REGISTER_PM1_STATUS:        /*         * Status Registers are different from the rest. Clear by         * writing 1, and writing 0 has no effect. So, the only relevant         * information is the single bit we're interested in, all others should         * be written as 0 so they will be left unchanged.         */        Value = ACPI_REGISTER_PREPARE_BITS (Value,                    BitRegInfo->BitPosition, BitRegInfo->AccessBitMask);        if (Value)        {            Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,                        ACPI_REGISTER_PM1_STATUS, (UINT16) Value);            RegisterValue = 0;        }        break;    case ACPI_REGISTER_PM1_ENABLE:        ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,            BitRegInfo->AccessBitMask, Value);        Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,                    ACPI_REGISTER_PM1_ENABLE, (UINT16) RegisterValue);        break;    case ACPI_REGISTER_PM1_CONTROL:        /*         * Write the PM1 Control register.         * Note that at this level, the fact that there are actually TWO         * registers (A and B - and B may not exist) is abstracted.         */        ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM1 control: Read %X\n",            RegisterValue));        ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,            BitRegInfo->AccessBitMask, Value);        Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,                    ACPI_REGISTER_PM1_CONTROL, (UINT16) RegisterValue);        break;    case ACPI_REGISTER_PM2_CONTROL:        Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,                    ACPI_REGISTER_PM2_CONTROL, &RegisterValue);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n",            RegisterValue,            ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XPm2ControlBlock.Address)));        ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,                BitRegInfo->AccessBitMask, Value);        ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %4.4X to %8.8X%8.8X\n",            RegisterValue,            ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XPm2ControlBlock.Address)));        Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,                    ACPI_REGISTER_PM2_CONTROL, (UINT8) (RegisterValue));        break;    default:        break;    }UnlockAndExit:    AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);    /* Normalize the value that was read */    ACPI_DEBUG_EXEC (RegisterValue =        ((RegisterValue & BitRegInfo->AccessBitMask) >>            BitRegInfo->BitPosition));    ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Set bits: %8.8X actual %8.8X register %X\n",        Value, RegisterValue, BitRegInfo->ParentRegister));    return_ACPI_STATUS (Status);}ACPI_EXPORT_SYMBOL (AcpiSetRegister)/****************************************************************************** * * FUNCTION:    AcpiHwRegisterRead * * PARAMETERS:  UseLock             - Lock hardware? True/False *              RegisterId          - ACPI Register ID *              ReturnValue         - Where the register value is returned * * RETURN:      Status and the value read. * * DESCRIPTION: Read from the specified ACPI register * ******************************************************************************/ACPI_STATUSAcpiHwRegisterRead (    BOOLEAN                 UseLock,    UINT32                  RegisterId,    UINT32                  *ReturnValue){    UINT32                  Value1 = 0;    UINT32                  Value2 = 0;    ACPI_STATUS             Status;    ACPI_CPU_FLAGS          LockFlags = 0;    ACPI_FUNCTION_TRACE (HwRegisterRead);    if (ACPI_MTX_LOCK == UseLock)    {        LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);    }    switch (RegisterId)    {    case ACPI_REGISTER_PM1_STATUS:           /* 16-bit access */        Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aEventBlock);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        /* PM1B is optional */        Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bEventBlock);        Value1 |= Value2;        break;    case ACPI_REGISTER_PM1_ENABLE:           /* 16-bit access */        Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_XPm1aEnable);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        /* PM1B is optional */        Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_XPm1bEnable);        Value1 |= Value2;        break;    case ACPI_REGISTER_PM1_CONTROL:          /* 16-bit access */        Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aControlBlock);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bControlBlock);        Value1 |= Value2;        break;    case ACPI_REGISTER_PM2_CONTROL:          /* 8-bit access */        Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT.XPm2ControlBlock);        break;    case ACPI_REGISTER_PM_TIMER:             /* 32-bit access */        Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT.XPmTimerBlock);        break;    case ACPI_REGISTER_SMI_COMMAND_BLOCK:    /* 8-bit access */        Status = AcpiOsReadPort (AcpiGbl_FADT.SmiCommand, &Value1, 8);        break;    default:        ACPI_ERROR ((AE_INFO, "Unknown Register ID: %X",            RegisterId));        Status = AE_BAD_PARAMETER;        break;    }UnlockAndExit:    if (ACPI_MTX_LOCK == UseLock)    {        AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);    }    if (ACPI_SUCCESS (Status))    {

⌨️ 快捷键说明

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