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

📄 hwregs.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 2 页
字号:
	case ACPI_REGISTER_PM1_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_read(16, &value1,					   &acpi_gbl_FADT.xpm1a_control_block);		if (ACPI_FAILURE(status)) {			goto exit;		}		status =		    acpi_hw_low_level_read(16, &value2,					   &acpi_gbl_FADT.xpm1b_control_block);		value1 |= value2;		break;	case ACPI_REGISTER_PM2_CONTROL:	/* 8-bit access */		status =		    acpi_hw_low_level_read(8, &value1,					   &acpi_gbl_FADT.xpm2_control_block);		break;	case ACPI_REGISTER_PM_TIMER:	/* 32-bit access */		status =		    acpi_hw_low_level_read(32, &value1,					   &acpi_gbl_FADT.xpm_timer_block);		break;	case ACPI_REGISTER_SMI_COMMAND_BLOCK:	/* 8-bit access */		status =		    acpi_os_read_port(acpi_gbl_FADT.smi_command, &value1, 8);		break;	default:		ACPI_DEBUG_PRINT((AE_INFO, "Unknown Register ID: %X", register_id));		status = AE_BAD_PARAMETER;		break;	}      exit:	if (ACPI_SUCCESS(status)) {		*return_value = value1;	}	return_ACPI_STATUS(status);}/****************************************************************************** * * FUNCTION:    acpi_hw_register_write * * PARAMETERS:  register_id         - 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_status acpi_hw_register_write(u32 register_id, u32 value){	acpi_status status;	u32 read_value;	ACPI_FUNCTION_TRACE(hw_register_write);	switch (register_id) {	case ACPI_REGISTER_PM1_STATUS:	/* 16-bit access */		/* Perform a read first to preserve certain bits (per ACPI spec) */		status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS,					       &read_value);		if (ACPI_FAILURE(status)) {			goto exit;		}		/* Insert the bits to be preserved */		ACPI_INSERT_BITS(value, ACPI_PM1_STATUS_PRESERVED_BITS,				 read_value);		/* Now we can write the data */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT.xpm1a_event_block);		if (ACPI_FAILURE(status)) {			goto exit;		}		/* PM1B is optional */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT.xpm1b_event_block);		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 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 */		/*		 * Perform a read first to preserve certain bits (per ACPI spec)		 */		status = acpi_hw_register_read(ACPI_REGISTER_PM1_CONTROL,					       &read_value);		if (ACPI_FAILURE(status)) {			goto exit;		}		/* Insert the bits to be preserved */		ACPI_INSERT_BITS(value, ACPI_PM1_CONTROL_PRESERVED_BITS,				 read_value);		/* Now we can write the data */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT.xpm1a_control_block);		if (ACPI_FAILURE(status)) {			goto exit;		}		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT.xpm1b_control_block);		break;	case ACPI_REGISTER_PM1A_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT.xpm1a_control_block);		break;	case ACPI_REGISTER_PM1B_CONTROL:	/* 16-bit access */		status =		    acpi_hw_low_level_write(16, value,					    &acpi_gbl_FADT.xpm1b_control_block);		break;	case ACPI_REGISTER_PM2_CONTROL:	/* 8-bit access */		status =		    acpi_hw_low_level_write(8, value,					    &acpi_gbl_FADT.xpm2_control_block);		break;	case ACPI_REGISTER_PM_TIMER:	/* 32-bit access */		status =		    acpi_hw_low_level_write(32, value,					    &acpi_gbl_FADT.xpm_timer_block);		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_command, value, 8);		break;	default:		status = AE_BAD_PARAMETER;		break;	}      exit:	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->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:		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->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:		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 + -