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