Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.12-rc2 230 lines 6.7 kB view raw
1 2/****************************************************************************** 3 * 4 * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface 5 * 6 *****************************************************************************/ 7 8/* 9 * Copyright (C) 2000 - 2005, R. Byron Moore 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions, and the following disclaimer, 17 * without modification. 18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19 * substantially similar to the "NO WARRANTY" disclaimer below 20 * ("Disclaimer") and any redistribution must be conditioned upon 21 * including a substantially similar Disclaimer requirement for further 22 * binary redistribution. 23 * 3. Neither the names of the above-listed copyright holders nor the names 24 * of any contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * Alternatively, this software may be distributed under the terms of the 28 * GNU General Public License ("GPL") version 2 as published by the Free 29 * Software Foundation. 30 * 31 * NO WARRANTY 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42 * POSSIBILITY OF SUCH DAMAGES. 43 */ 44 45 46#include <acpi/acpi.h> 47 48 49#define _COMPONENT ACPI_HARDWARE 50 ACPI_MODULE_NAME ("hwacpi") 51 52 53/****************************************************************************** 54 * 55 * FUNCTION: acpi_hw_initialize 56 * 57 * PARAMETERS: None 58 * 59 * RETURN: Status 60 * 61 * DESCRIPTION: Initialize and validate various ACPI registers 62 * 63 ******************************************************************************/ 64 65acpi_status 66acpi_hw_initialize ( 67 void) 68{ 69 acpi_status status; 70 71 72 ACPI_FUNCTION_TRACE ("hw_initialize"); 73 74 75 /* We must have the ACPI tables by the time we get here */ 76 77 if (!acpi_gbl_FADT) { 78 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "A FADT is not loaded\n")); 79 80 return_ACPI_STATUS (AE_NO_ACPI_TABLES); 81 } 82 83 /* Sanity check the FADT for valid values */ 84 85 status = acpi_ut_validate_fadt (); 86 if (ACPI_FAILURE (status)) { 87 return_ACPI_STATUS (status); 88 } 89 90 return_ACPI_STATUS (AE_OK); 91} 92 93 94/****************************************************************************** 95 * 96 * FUNCTION: acpi_hw_set_mode 97 * 98 * PARAMETERS: Mode - SYS_MODE_ACPI or SYS_MODE_LEGACY 99 * 100 * RETURN: Status 101 * 102 * DESCRIPTION: Transitions the system into the requested mode. 103 * 104 ******************************************************************************/ 105 106acpi_status 107acpi_hw_set_mode ( 108 u32 mode) 109{ 110 111 acpi_status status; 112 u32 retry; 113 114 115 ACPI_FUNCTION_TRACE ("hw_set_mode"); 116 117 /* 118 * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, 119 * system does not support mode transition. 120 */ 121 if (!acpi_gbl_FADT->smi_cmd) { 122 ACPI_REPORT_ERROR (("No SMI_CMD in FADT, mode transition failed.\n")); 123 return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); 124 } 125 126 /* 127 * ACPI 2.0 clarified the meaning of ACPI_ENABLE and ACPI_DISABLE 128 * in FADT: If it is zero, enabling or disabling is not supported. 129 * As old systems may have used zero for mode transition, 130 * we make sure both the numbers are zero to determine these 131 * transitions are not supported. 132 */ 133 if (!acpi_gbl_FADT->acpi_enable && !acpi_gbl_FADT->acpi_disable) { 134 ACPI_REPORT_ERROR (("No ACPI mode transition supported in this system (enable/disable both zero)\n")); 135 return_ACPI_STATUS (AE_OK); 136 } 137 138 switch (mode) { 139 case ACPI_SYS_MODE_ACPI: 140 141 /* BIOS should have disabled ALL fixed and GP events */ 142 143 status = acpi_os_write_port (acpi_gbl_FADT->smi_cmd, 144 (u32) acpi_gbl_FADT->acpi_enable, 8); 145 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Attempting to enable ACPI mode\n")); 146 break; 147 148 case ACPI_SYS_MODE_LEGACY: 149 150 /* 151 * BIOS should clear all fixed status bits and restore fixed event 152 * enable bits to default 153 */ 154 status = acpi_os_write_port (acpi_gbl_FADT->smi_cmd, 155 (u32) acpi_gbl_FADT->acpi_disable, 8); 156 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 157 "Attempting to enable Legacy (non-ACPI) mode\n")); 158 break; 159 160 default: 161 return_ACPI_STATUS (AE_BAD_PARAMETER); 162 } 163 164 if (ACPI_FAILURE (status)) { 165 ACPI_REPORT_ERROR (("Could not write mode change, %s\n", acpi_format_exception (status))); 166 return_ACPI_STATUS (status); 167 } 168 169 /* 170 * Some hardware takes a LONG time to switch modes. Give them 3 sec to 171 * do so, but allow faster systems to proceed more quickly. 172 */ 173 retry = 3000; 174 while (retry) { 175 if (acpi_hw_get_mode() == mode) { 176 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", mode)); 177 return_ACPI_STATUS (AE_OK); 178 } 179 acpi_os_stall(1000); 180 retry--; 181 } 182 183 ACPI_REPORT_ERROR (("Hardware never changed modes\n")); 184 return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); 185} 186 187 188/****************************************************************************** 189 * 190 * FUNCTION: acpi_hw_get_mode 191 * 192 * PARAMETERS: none 193 * 194 * RETURN: SYS_MODE_ACPI or SYS_MODE_LEGACY 195 * 196 * DESCRIPTION: Return current operating state of system. Determined by 197 * querying the SCI_EN bit. 198 * 199 ******************************************************************************/ 200 201u32 202acpi_hw_get_mode (void) 203{ 204 acpi_status status; 205 u32 value; 206 207 208 ACPI_FUNCTION_TRACE ("hw_get_mode"); 209 210 211 /* 212 * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, 213 * system does not support mode transition. 214 */ 215 if (!acpi_gbl_FADT->smi_cmd) { 216 return_VALUE (ACPI_SYS_MODE_ACPI); 217 } 218 219 status = acpi_get_register (ACPI_BITREG_SCI_ENABLE, &value, ACPI_MTX_LOCK); 220 if (ACPI_FAILURE (status)) { 221 return_VALUE (ACPI_SYS_MODE_LEGACY); 222 } 223 224 if (value) { 225 return_VALUE (ACPI_SYS_MODE_ACPI); 226 } 227 else { 228 return_VALUE (ACPI_SYS_MODE_LEGACY); 229 } 230}