11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
977848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met:
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    notice, this list of conditions, and the following disclaimer,
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    without modification.
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    substantially similar to the "NO WARRANTY" disclaimer below
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    ("Disclaimer") and any redistribution must be conditioned upon
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    including a substantially similar Disclaimer requirement for further
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    binary redistribution.
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    of any contributors may be used to endorse or promote products derived
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    from this software without specific prior written permission.
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation.
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES.
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h>
46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h"
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT          ACPI_HARDWARE
494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("hwacpi")
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_hw_set_mode
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  Mode            - SYS_MODE_ACPI or SYS_MODE_LEGACY
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Transitions the system into the requested mode.
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_status acpi_hw_set_mode(u32 mode)
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(hw_set_mode);
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * ACPI 2.0 clarified that if SMI_CMD in FADT is zero,
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * system does not support mode transition.
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
73f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore	if (!acpi_gbl_FADT.smi_command) {
74b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR((AE_INFO,
75b8e4d89357fc434618a59c1047cac72641191805Bob Moore			    "No SMI_CMD in FADT, mode transition failed"));
764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE);
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * ACPI 2.0 clarified the meaning of ACPI_ENABLE and ACPI_DISABLE
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * in FADT: If it is zero, enabling or disabling is not supported.
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * As old systems may have used zero for mode transition,
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * we make sure both the numbers are zero to determine these
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * transitions are not supported.
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
86f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore	if (!acpi_gbl_FADT.acpi_enable && !acpi_gbl_FADT.acpi_disable) {
87b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR((AE_INFO,
88d4913dc6d0c680aa106d1d80b5ad2a9325367afdBob Moore			    "No ACPI mode transition supported in this system "
89d4913dc6d0c680aa106d1d80b5ad2a9325367afdBob Moore			    "(enable/disable both zero)"));
904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_OK);
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (mode) {
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_SYS_MODE_ACPI:
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* BIOS should have disabled ALL fixed and GP events */
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
987f0719039085cc40114abce84cf29fe57da226f4Bob Moore		status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
99f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore					    (u32) acpi_gbl_FADT.acpi_enable, 8);
1004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  "Attempting to enable ACPI mode\n"));
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_SYS_MODE_LEGACY:
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * BIOS should clear all fixed status bits and restore fixed event
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * enable bits to default
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1107f0719039085cc40114abce84cf29fe57da226f4Bob Moore		status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
111f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore					    (u32) acpi_gbl_FADT.acpi_disable,
1124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					    8);
1134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
1144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  "Attempting to enable Legacy (non-ACPI) mode\n"));
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_BAD_PARAMETER);
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
122b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_EXCEPTION((AE_INFO, status,
123b8e4d89357fc434618a59c1047cac72641191805Bob Moore				"Could not write ACPI mode change"));
1244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
127b430acbd7c4b919886fa7fd92eeb7a695f1940d3Len Brown	return_ACPI_STATUS(AE_OK);
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_hw_get_mode
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  none
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      SYS_MODE_ACPI or SYS_MODE_LEGACY
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Return current operating state of system.  Determined by
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              querying the SCI_EN bit.
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownu32 acpi_hw_get_mode(void)
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
1464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 value;
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
148b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(hw_get_mode);
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * ACPI 2.0 clarified that if SMI_CMD in FADT is zero,
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * system does not support mode transition.
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
154f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore	if (!acpi_gbl_FADT.smi_command) {
15550eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore		return_UINT32(ACPI_SYS_MODE_ACPI);
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15850ffba1bd3120b069617455545bc27bcf3cf7579Bob Moore	status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value);
1594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
16050eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore		return_UINT32(ACPI_SYS_MODE_LEGACY);
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (value) {
16450eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore		return_UINT32(ACPI_SYS_MODE_ACPI);
1654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	} else {
16650eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore		return_UINT32(ACPI_SYS_MODE_LEGACY);
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
169