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

📄 hwregs.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
				  "PM2 control: Read %X from %8.8X%8.8X\n",				  register_value,				  ACPI_FORMAT_UINT64(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 %4.4X to %8.8X%8.8X\n",				  register_value,				  ACPI_FORMAT_UINT64(acpi_gbl_FADT->						     xpm2_cnt_blk.address)));		status = acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,						ACPI_REGISTER_PM2_CONTROL,						(u8) (register_value));		break;	default:		break;	}      unlock_and_exit:	if (flags & ACPI_MTX_LOCK) {		(void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE);	}	/* Normalize the value that was read */	ACPI_DEBUG_EXEC(register_value =			((register_value & bit_reg_info->access_bit_mask) >>			 bit_reg_info->bit_position));	ACPI_DEBUG_PRINT((ACPI_DB_IO,			  "Set bits: %8.8X actual %8.8X register %X\n", value,			  register_value, bit_reg_info->parent_register));	return_ACPI_STATUS(status);}EXPORT_SYMBOL(acpi_set_register);/****************************************************************************** * * FUNCTION:    acpi_hw_register_read * * PARAMETERS:  use_lock            - Mutex hw access *              register_id         - register_iD + Offset *              return_value        - Where the register value is returned * * RETURN:      Status and the value read. * * DESCRIPTION: Acpi register read function.  Registers are read at the *              given offset. * ******************************************************************************/acpi_statusacpi_hw_register_read(u8 use_lock, u32 register_id, u32 * return_value){	u32 value1 = 0;	u32 value2 = 0;	acpi_status status;	ACPI_FUNCTION_TRACE("hw_register_read");	if (ACPI_MTX_LOCK == use_lock) {		status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}	}	switch (register_id) {	case ACPI_REGISTER_PM1_STATUS:	/* 16-bit access */		status =		    acpi_hw_low_level_read(16, &value1,					   &acpi_gbl_FADT->xpm1a_evt_blk);		if (ACPI_FAILURE(status)) {			goto unlock_and_exit;		}		/* PM1B is optional */		status =		    acpi_hw_low_level_read(16, &value2,					   &acpi_gbl_FADT->xpm1b_evt_blk);		value1 |= value2;		break;	case ACPI_REGISTER_PM1_ENABLE:	/* 16-bit access */		status =		    acpi_hw_low_level_read(16, &value1, &acpi_gbl_xpm1a_enable);		if (ACPI_FAILURE(status)) {			goto unlock_and_exit;		}		/* PM1B is optional */		status =		    acpi_hw_low_level_read(16, &value2, &acpi_gbl_xpm1b_enable);		value1 |= value2;		break;	case ACPI_REGISTER_PM1_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_read(16, &value1,					   &acpi_gbl_FADT->xpm1a_cnt_blk);		if (ACPI_FAILURE(status)) {			goto unlock_and_exit;		}		status =		    acpi_hw_low_level_read(16, &value2,					   &acpi_gbl_FADT->xpm1b_cnt_blk);		value1 |= value2;		break;	case ACPI_REGISTER_PM2_CONTROL:	/* 8-bit access */		status =		    acpi_hw_low_level_read(8, &value1,					   &acpi_gbl_FADT->xpm2_cnt_blk);		break;	case ACPI_REGISTER_PM_TIMER:	/* 32-bit access */		status =		    acpi_hw_low_level_read(32, &value1,					   &acpi_gbl_FADT->xpm_tmr_blk);		break;	case ACPI_REGISTER_SMI_COMMAND_BLOCK:	/* 8-bit access */		status = acpi_os_read_port(acpi_gbl_FADT->smi_cmd, &value1, 8);		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unknown Register ID: %X\n",				  register_id));		status = AE_BAD_PARAMETER;		break;	}      unlock_and_exit:	if (ACPI_MTX_LOCK == use_lock) {		(void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE);	}	if (ACPI_SUCCESS(status)) {		*return_value = value1;	}	return_ACPI_STATUS(status);}/****************************************************************************** * * FUNCTION:    acpi_hw_register_write * * PARAMETERS:  use_lock            - Mutex hw access *              register_id         - register_iD + Offset *              Value               - The value to write * * RETURN:      Status * * DESCRIPTION: Acpi register Write function.  Registers are written at the *              given offset. * ******************************************************************************/acpi_status acpi_hw_register_write(u8 use_lock, u32 register_id, u32 value){	acpi_status status;	ACPI_FUNCTION_TRACE("hw_register_write");	if (ACPI_MTX_LOCK == use_lock) {		status = acpi_ut_acquire_mutex(ACPI_MTX_HARDWARE);		if (ACPI_FAILURE(status)) {			return_ACPI_STATUS(status);		}	}	switch (register_id) {	case ACPI_REGISTER_PM1_STATUS:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT->xpm1a_evt_blk);		if (ACPI_FAILURE(status)) {			goto unlock_and_exit;		}		/* PM1B is optional */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT->xpm1b_evt_blk);		break;	case ACPI_REGISTER_PM1_ENABLE:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value, &acpi_gbl_xpm1a_enable);		if (ACPI_FAILURE(status)) {			goto unlock_and_exit;		}		/* PM1B is optional */		status =		    acpi_hw_low_level_write(16, value, &acpi_gbl_xpm1b_enable);		break;	case ACPI_REGISTER_PM1_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT->xpm1a_cnt_blk);		if (ACPI_FAILURE(status)) {			goto unlock_and_exit;		}		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT->xpm1b_cnt_blk);		break;	case ACPI_REGISTER_PM1A_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT->xpm1a_cnt_blk);		break;	case ACPI_REGISTER_PM1B_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT->xpm1b_cnt_blk);		break;	case ACPI_REGISTER_PM2_CONTROL:	/* 8-bit access */		status =		    acpi_hw_low_level_write(8, value,					    &acpi_gbl_FADT->xpm2_cnt_blk);		break;	case ACPI_REGISTER_PM_TIMER:	/* 32-bit access */		status =		    acpi_hw_low_level_write(32, value,					    &acpi_gbl_FADT->xpm_tmr_blk);		break;	case ACPI_REGISTER_SMI_COMMAND_BLOCK:	/* 8-bit access */		/* SMI_CMD is currently always in IO space */		status = acpi_os_write_port(acpi_gbl_FADT->smi_cmd, value, 8);		break;	default:		status = AE_BAD_PARAMETER;		break;	}      unlock_and_exit:	if (ACPI_MTX_LOCK == use_lock) {		(void)acpi_ut_release_mutex(ACPI_MTX_HARDWARE);	}	return_ACPI_STATUS(status);}/****************************************************************************** * * FUNCTION:    acpi_hw_low_level_read * * 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_statusacpi_hw_low_level_read(u32 width, u32 * value, struct acpi_generic_address *reg){	u64 address;	acpi_status status;	ACPI_FUNCTION_NAME("hw_low_level_read");	/*	 * 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->address_space_id) {	case ACPI_ADR_SPACE_SYSTEM_MEMORY:		status = acpi_os_read_memory((acpi_physical_address) address,					     value, width);		break;	case ACPI_ADR_SPACE_SYSTEM_IO:		status = acpi_os_read_port((acpi_io_address) address,					   value, width);		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "Unsupported address space: %X\n",				  reg->address_space_id));		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),			  acpi_ut_get_region_name(reg->address_space_id)));	return (status);}/****************************************************************************** * * FUNCTION:    acpi_hw_low_level_write * * 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_statusacpi_hw_low_level_write(u32 width, u32 value, struct acpi_generic_address * reg){	u64 address;	acpi_status status;	ACPI_FUNCTION_NAME("hw_low_level_write");	/*	 * 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->address_space_id) {	case ACPI_ADR_SPACE_SYSTEM_MEMORY:		status = acpi_os_write_memory((acpi_physical_address) address,					      value, width);		break;	case ACPI_ADR_SPACE_SYSTEM_IO:		status = acpi_os_write_port((acpi_io_address) address,					    value, width);		break;	default:		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "Unsupported address space: %X\n",				  reg->address_space_id));		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),			  acpi_ut_get_region_name(reg->address_space_id)));	return (status);}

⌨️ 快捷键说明

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