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

📄 hwregs.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
        *ReturnValue = Value1;    }    return_ACPI_STATUS (Status);}/****************************************************************************** * * FUNCTION:    AcpiHwRegisterWrite * * PARAMETERS:  UseLock             - Lock hardware? True/False *              RegisterId          - ACPI Register ID *              Value               - The value to write * * RETURN:      Status * * DESCRIPTION: Write to the specified ACPI register * * NOTE: In accordance with the ACPI specification, this function automatically * preserves the value of the following bits, meaning that these bits cannot be * changed via this interface: * * PM1_CONTROL[0] = SCI_EN * PM1_CONTROL[9] * PM1_STATUS[11] * * ACPI References: * 1) Hardware Ignored Bits: When software writes to a register with ignored *      bit fields, it preserves the ignored bit fields * 2) SCI_EN: OSPM always preserves this bit position * ******************************************************************************/ACPI_STATUSAcpiHwRegisterWrite (    BOOLEAN                 UseLock,    UINT32                  RegisterId,    UINT32                  Value){    ACPI_STATUS             Status;    ACPI_CPU_FLAGS          LockFlags = 0;    UINT32                  ReadValue;    ACPI_FUNCTION_TRACE (HwRegisterWrite);    if (ACPI_MTX_LOCK == UseLock)    {        LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);    }    switch (RegisterId)    {    case ACPI_REGISTER_PM1_STATUS:           /* 16-bit access */        /* Perform a read first to preserve certain bits (per ACPI spec) */        Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,                    ACPI_REGISTER_PM1_STATUS, &ReadValue);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        /* Insert the bits to be preserved */        ACPI_INSERT_BITS (Value, ACPI_PM1_STATUS_PRESERVED_BITS, ReadValue);        /* Now we can write the data */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aEventBlock);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        /* PM1B is optional */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bEventBlock);        break;    case ACPI_REGISTER_PM1_ENABLE:           /* 16-bit access */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1aEnable);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        /* PM1B is optional */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1bEnable);        break;    case ACPI_REGISTER_PM1_CONTROL:          /* 16-bit access */        /*         * Perform a read first to preserve certain bits (per ACPI spec)         *         * Note: This includes SCI_EN, we never want to change this bit         */        Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,                    ACPI_REGISTER_PM1_CONTROL, &ReadValue);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        /* Insert the bits to be preserved */        ACPI_INSERT_BITS (Value, ACPI_PM1_CONTROL_PRESERVED_BITS, ReadValue);        /* Now we can write the data */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock);        if (ACPI_FAILURE (Status))        {            goto UnlockAndExit;        }        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock);        break;    case ACPI_REGISTER_PM1A_CONTROL:         /* 16-bit access */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock);        break;    case ACPI_REGISTER_PM1B_CONTROL:         /* 16-bit access */        Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock);        break;    case ACPI_REGISTER_PM2_CONTROL:          /* 8-bit access */        Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT.XPm2ControlBlock);        break;    case ACPI_REGISTER_PM_TIMER:             /* 32-bit access */        Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT.XPmTimerBlock);        break;    case ACPI_REGISTER_SMI_COMMAND_BLOCK:    /* 8-bit access */        /* SMI_CMD is currently always in IO space */        Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand, Value, 8);        break;    default:        Status = AE_BAD_PARAMETER;        break;    }UnlockAndExit:    if (ACPI_MTX_LOCK == UseLock)    {        AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);    }    return_ACPI_STATUS (Status);}/****************************************************************************** * * FUNCTION:    AcpiHwLowLevelRead * * PARAMETERS:  Width               - 8, 16, or 32 *              Value               - Where the value is returned *              Reg                 - GAS register structure * * RETURN:      Status * * DESCRIPTION: Read from either memory or IO space. * ******************************************************************************/ACPI_STATUSAcpiHwLowLevelRead (    UINT32                  Width,    UINT32                  *Value,    ACPI_GENERIC_ADDRESS    *Reg){    UINT64                  Address;    ACPI_STATUS             Status;    ACPI_FUNCTION_NAME (HwLowLevelRead);    /*     * Must have a valid pointer to a GAS structure, and     * a non-zero address within. However, don't return an error     * because the PM1A/B code must not fail if B isn't present.     */    if (!Reg)    {        return (AE_OK);    }    /* Get a local copy of the address. Handles possible alignment issues */    ACPI_MOVE_64_TO_64 (&Address, &Reg->Address);    if (!Address)    {        return (AE_OK);    }    *Value = 0;    /*     * Two address spaces supported: Memory or IO.     * PCI_Config is not supported here because the GAS struct is insufficient     */    switch (Reg->SpaceId)    {    case ACPI_ADR_SPACE_SYSTEM_MEMORY:        Status = AcpiOsReadMemory (                    (ACPI_PHYSICAL_ADDRESS) Address, Value, Width);        break;    case ACPI_ADR_SPACE_SYSTEM_IO:        Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) Address, Value, Width);        break;    default:        ACPI_ERROR ((AE_INFO,            "Unsupported address space: %X", Reg->SpaceId));        return (AE_BAD_PARAMETER);    }    ACPI_DEBUG_PRINT ((ACPI_DB_IO,        "Read:  %8.8X width %2d from %8.8X%8.8X (%s)\n",        *Value, Width, ACPI_FORMAT_UINT64 (Address),        AcpiUtGetRegionName (Reg->SpaceId)));    return (Status);}/****************************************************************************** * * FUNCTION:    AcpiHwLowLevelWrite * * PARAMETERS:  Width               - 8, 16, or 32 *              Value               - To be written *              Reg                 - GAS register structure * * RETURN:      Status * * DESCRIPTION: Write to either memory or IO space. * ******************************************************************************/ACPI_STATUSAcpiHwLowLevelWrite (    UINT32                  Width,    UINT32                  Value,    ACPI_GENERIC_ADDRESS    *Reg){    UINT64                  Address;    ACPI_STATUS             Status;    ACPI_FUNCTION_NAME (HwLowLevelWrite);    /*     * Must have a valid pointer to a GAS structure, and     * a non-zero address within. However, don't return an error     * because the PM1A/B code must not fail if B isn't present.     */    if (!Reg)    {        return (AE_OK);    }    /* Get a local copy of the address. Handles possible alignment issues */    ACPI_MOVE_64_TO_64 (&Address, &Reg->Address);    if (!Address)    {        return (AE_OK);    }    /*     * Two address spaces supported: Memory or IO.     * PCI_Config is not supported here because the GAS struct is insufficient     */    switch (Reg->SpaceId)    {    case ACPI_ADR_SPACE_SYSTEM_MEMORY:        Status = AcpiOsWriteMemory (                    (ACPI_PHYSICAL_ADDRESS) Address, Value, Width);        break;    case ACPI_ADR_SPACE_SYSTEM_IO:        Status = AcpiOsWritePort (                    (ACPI_IO_ADDRESS) Address, Value, Width);        break;    default:        ACPI_ERROR ((AE_INFO,            "Unsupported address space: %X", Reg->SpaceId));        return (AE_BAD_PARAMETER);    }    ACPI_DEBUG_PRINT ((ACPI_DB_IO,        "Wrote: %8.8X width %2d   to %8.8X%8.8X (%s)\n",        Value, Width, ACPI_FORMAT_UINT64 (Address),        AcpiUtGetRegionName (Reg->SpaceId)));    return (Status);}

⌨️ 快捷键说明

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