📄 hwregs.c
字号:
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 + -