brintos

brintos / linux-shallow public Read only

0
0
Text · 3.8 KiB · 790f342 Raw
148 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/******************************************************************************3 *4 * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface5 *6 * Copyright (C) 2000 - 2023, Intel Corp.7 *8 *****************************************************************************/9 10#include <acpi/acpi.h>11#include "accommon.h"12 13#define _COMPONENT          ACPI_HARDWARE14ACPI_MODULE_NAME("hwacpi")15 16#if (!ACPI_REDUCED_HARDWARE)	/* Entire module */17/******************************************************************************18 *19 * FUNCTION:    acpi_hw_set_mode20 *21 * PARAMETERS:  mode            - SYS_MODE_ACPI or SYS_MODE_LEGACY22 *23 * RETURN:      Status24 *25 * DESCRIPTION: Transitions the system into the requested mode.26 *27 ******************************************************************************/28acpi_status acpi_hw_set_mode(u32 mode)29{30 31	acpi_status status;32 33	ACPI_FUNCTION_TRACE(hw_set_mode);34 35	/* If the Hardware Reduced flag is set, machine is always in acpi mode */36 37	if (acpi_gbl_reduced_hardware) {38		return_ACPI_STATUS(AE_OK);39	}40 41	/*42	 * ACPI 2.0 clarified that if SMI_CMD in FADT is zero,43	 * system does not support mode transition.44	 */45	if (!acpi_gbl_FADT.smi_command) {46		ACPI_ERROR((AE_INFO,47			    "No SMI_CMD in FADT, mode transition failed"));48		return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);49	}50 51	/*52	 * ACPI 2.0 clarified the meaning of ACPI_ENABLE and ACPI_DISABLE53	 * in FADT: If it is zero, enabling or disabling is not supported.54	 * As old systems may have used zero for mode transition,55	 * we make sure both the numbers are zero to determine these56	 * transitions are not supported.57	 */58	if (!acpi_gbl_FADT.acpi_enable && !acpi_gbl_FADT.acpi_disable) {59		ACPI_ERROR((AE_INFO,60			    "No ACPI mode transition supported in this system "61			    "(enable/disable both zero)"));62		return_ACPI_STATUS(AE_OK);63	}64 65	switch (mode) {66	case ACPI_SYS_MODE_ACPI:67 68		/* BIOS should have disabled ALL fixed and GP events */69 70		status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,71					    (u32) acpi_gbl_FADT.acpi_enable, 8);72		ACPI_DEBUG_PRINT((ACPI_DB_INFO,73				  "Attempting to enable ACPI mode\n"));74		break;75 76	case ACPI_SYS_MODE_LEGACY:77		/*78		 * BIOS should clear all fixed status bits and restore fixed event79		 * enable bits to default80		 */81		status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,82					    (u32)acpi_gbl_FADT.acpi_disable, 8);83		ACPI_DEBUG_PRINT((ACPI_DB_INFO,84				  "Attempting to enable Legacy (non-ACPI) mode\n"));85		break;86 87	default:88 89		return_ACPI_STATUS(AE_BAD_PARAMETER);90	}91 92	if (ACPI_FAILURE(status)) {93		ACPI_EXCEPTION((AE_INFO, status,94				"Could not write ACPI mode change"));95		return_ACPI_STATUS(status);96	}97 98	return_ACPI_STATUS(AE_OK);99}100 101/*******************************************************************************102 *103 * FUNCTION:    acpi_hw_get_mode104 *105 * PARAMETERS:  none106 *107 * RETURN:      SYS_MODE_ACPI or SYS_MODE_LEGACY108 *109 * DESCRIPTION: Return current operating state of system. Determined by110 *              querying the SCI_EN bit.111 *112 ******************************************************************************/113 114u32 acpi_hw_get_mode(void)115{116	acpi_status status;117	u32 value;118 119	ACPI_FUNCTION_TRACE(hw_get_mode);120 121	/* If the Hardware Reduced flag is set, machine is always in acpi mode */122 123	if (acpi_gbl_reduced_hardware) {124		return_UINT32(ACPI_SYS_MODE_ACPI);125	}126 127	/*128	 * ACPI 2.0 clarified that if SMI_CMD in FADT is zero,129	 * system does not support mode transition.130	 */131	if (!acpi_gbl_FADT.smi_command) {132		return_UINT32(ACPI_SYS_MODE_ACPI);133	}134 135	status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value);136	if (ACPI_FAILURE(status)) {137		return_UINT32(ACPI_SYS_MODE_LEGACY);138	}139 140	if (value) {141		return_UINT32(ACPI_SYS_MODE_ACPI);142	} else {143		return_UINT32(ACPI_SYS_MODE_LEGACY);144	}145}146 147#endif				/* !ACPI_REDUCED_HARDWARE */148