📄 hwregs.c
字号:
register_value, ACPI_HIDWORD (acpi_gbl_FADT->Xpm2_cnt_blk.address), ACPI_LODWORD (acpi_gbl_FADT->Xpm2_cnt_blk.address))); ACPI_REGISTER_INSERT_VALUE (register_value, bit_reg_info->bit_position, bit_reg_info->access_bit_mask, value); ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %8.8X%8.8X\n", register_value, ACPI_HIDWORD (acpi_gbl_FADT->Xpm2_cnt_blk.address), ACPI_LODWORD (acpi_gbl_FADT->Xpm2_cnt_blk.address))); acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM2_CONTROL, (u8) (register_value)); break; default: break; } if (flags & ACPI_MTX_LOCK) { (void) acpi_ut_release_mutex (ACPI_MTX_HARDWARE); } /* Normalize the value that was read */ register_value = ((register_value & bit_reg_info->access_bit_mask) >> bit_reg_info->bit_position); ACPI_DEBUG_PRINT ((ACPI_DB_IO, "ACPI Register_write actual %X\n", register_value)); return_VALUE (register_value);}/****************************************************************************** * * FUNCTION: Acpi_hw_register_read * * PARAMETERS: Use_lock - Mutex hw access. * Register_id - Register_iD + Offset. * * RETURN: Value read or written. * * DESCRIPTION: Acpi register read function. Registers are read at the * given offset. * ******************************************************************************/u32acpi_hw_register_read ( u8 use_lock, u32 register_id){ u32 value = 0; u32 bank_offset; ACPI_FUNCTION_TRACE ("Hw_register_read"); if (ACPI_MTX_LOCK == use_lock) { if (ACPI_FAILURE (acpi_ut_acquire_mutex (ACPI_MTX_HARDWARE))) { return_VALUE (0); } } switch (register_id) { case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */ value = acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_evt_blk, 0); value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_evt_blk, 0); break; case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access*/ bank_offset = ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len); value = acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_evt_blk, bank_offset); value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_evt_blk, bank_offset); break; case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */ value = acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); break; case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ value = acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xpm2_cnt_blk, 0); break; case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ value = acpi_hw_low_level_read (32, &acpi_gbl_FADT->Xpm_tmr_blk, 0); break; case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ acpi_os_read_port (acpi_gbl_FADT->smi_cmd, &value, 8); break; default: /* Value will be returned as 0 */ break; } if (ACPI_MTX_LOCK == use_lock) { (void) acpi_ut_release_mutex (ACPI_MTX_HARDWARE); } return_VALUE (value);}/****************************************************************************** * * FUNCTION: Acpi_hw_register_write * * PARAMETERS: Use_lock - Mutex hw access. * Register_id - Register_iD + Offset. * * RETURN: Value read or written. * * DESCRIPTION: Acpi register Write function. Registers are written at the * given offset. * ******************************************************************************/voidacpi_hw_register_write ( u8 use_lock, u32 register_id, u32 value){ u32 bank_offset; ACPI_FUNCTION_TRACE ("Hw_register_write"); if (ACPI_MTX_LOCK == use_lock) { if (ACPI_FAILURE (acpi_ut_acquire_mutex (ACPI_MTX_HARDWARE))) { return_VOID; } } switch (register_id) { case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_evt_blk, 0); acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_evt_blk, 0); break; case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access*/ bank_offset = ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len); acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_evt_blk, bank_offset); acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_evt_blk, bank_offset); break; case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); break; case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); break; case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); break; case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xpm2_cnt_blk, 0); break; case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ acpi_hw_low_level_write (32, value, &acpi_gbl_FADT->Xpm_tmr_blk, 0); break; case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ /* SMI_CMD is currently always in IO space */ acpi_os_write_port (acpi_gbl_FADT->smi_cmd, value, 8); break; default: value = 0; break; } if (ACPI_MTX_LOCK == use_lock) { (void) acpi_ut_release_mutex (ACPI_MTX_HARDWARE); } return_VOID;}/****************************************************************************** * * FUNCTION: Acpi_hw_low_level_read * * PARAMETERS: Register - GAS register structure * Offset - Offset from the base address in the GAS * Width - 8, 16, or 32 * * RETURN: Value read * * DESCRIPTION: Read from either memory, IO, or PCI config space. * ******************************************************************************/u32acpi_hw_low_level_read ( u32 width, acpi_generic_address *reg, u32 offset){ u32 value = 0; ACPI_PHYSICAL_ADDRESS mem_address; ACPI_IO_ADDRESS io_address; acpi_pci_id pci_id; u16 pci_register; ACPI_FUNCTION_ENTRY (); /* * Must have a valid pointer to a GAS structure, and * a non-zero address within */ if ((!reg) || (!ACPI_VALID_ADDRESS (reg->address))) { return 0; } /* * Three address spaces supported: * Memory, Io, or PCI config. */ switch (reg->address_space_id) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: mem_address = (ACPI_PHYSICAL_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); acpi_os_read_memory (mem_address, &value, width); break; case ACPI_ADR_SPACE_SYSTEM_IO: io_address = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); acpi_os_read_port (io_address, &value, width); break; case ACPI_ADR_SPACE_PCI_CONFIG: pci_id.segment = 0; pci_id.bus = 0; pci_id.device = ACPI_PCI_DEVICE (ACPI_GET_ADDRESS (reg->address)); pci_id.function = ACPI_PCI_FUNCTION (ACPI_GET_ADDRESS (reg->address)); pci_register = (u16) (ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (reg->address)) + offset); acpi_os_read_pci_configuration (&pci_id, pci_register, &value, width); break; } return value;}/****************************************************************************** * * FUNCTION: Acpi_hw_low_level_write * * PARAMETERS: Width - 8, 16, or 32 * Value - To be written * Register - GAS register structure * Offset - Offset from the base address in the GAS * * * RETURN: Value read * * DESCRIPTION: Read from either memory, IO, or PCI config space. * ******************************************************************************/voidacpi_hw_low_level_write ( u32 width, u32 value, acpi_generic_address *reg, u32 offset){ ACPI_PHYSICAL_ADDRESS mem_address; ACPI_IO_ADDRESS io_address; acpi_pci_id pci_id; u16 pci_register; ACPI_FUNCTION_ENTRY (); /* * Must have a valid pointer to a GAS structure, and * a non-zero address within */ if ((!reg) || (!ACPI_VALID_ADDRESS (reg->address))) { return; } /* * Three address spaces supported: * Memory, Io, or PCI config. */ switch (reg->address_space_id) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: mem_address = (ACPI_PHYSICAL_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); acpi_os_write_memory (mem_address, value, width); break; case ACPI_ADR_SPACE_SYSTEM_IO: io_address = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); acpi_os_write_port (io_address, value, width); break; case ACPI_ADR_SPACE_PCI_CONFIG: pci_id.segment = 0; pci_id.bus = 0; pci_id.device = ACPI_PCI_DEVICE (ACPI_GET_ADDRESS (reg->address)); pci_id.function = ACPI_PCI_FUNCTION (ACPI_GET_ADDRESS (reg->address)); pci_register = (u16) (ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (reg->address)) + offset); acpi_os_write_pci_configuration (&pci_id, pci_register, value, width); break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -