hwacpi.c (85756) | hwacpi.c (87031) |
---|---|
1 2/****************************************************************************** 3 * 4 * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface | 1 2/****************************************************************************** 3 * 4 * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface |
5 * $Revision: 46 $ | 5 * $Revision: 47 $ |
6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. --- 139 unchanged lines hidden (view full) --- 153 if (!AcpiGbl_FADT) 154 { 155 AcpiGbl_RestoreAcpiChipset = FALSE; 156 157 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No FADT!\n")); 158 159 return_ACPI_STATUS (AE_NO_ACPI_TABLES); 160 } | 6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. --- 139 unchanged lines hidden (view full) --- 153 if (!AcpiGbl_FADT) 154 { 155 AcpiGbl_RestoreAcpiChipset = FALSE; 156 157 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No FADT!\n")); 158 159 return_ACPI_STATUS (AE_NO_ACPI_TABLES); 160 } |
161 162 /* 163 * Save the initial state of the ACPI event enable registers, so 164 * we can restore them when we exit. We probably won't exit, though. 165 * 166 * The location of the PM1aEvtBlk enable registers is defined as the 167 * base of PM1aEvtBlk + DIV_2(PM1aEvtBlkLength). Since the spec further 168 * fully defines the PM1aEvtBlk to be a total of 4 bytes, the offset 169 * for the enable registers is always 2 from the base. It is hard 170 * coded here. If this changes in the spec, this code will need to 171 * be modified. The PM1bEvtBlk behaves as expected. 172 */ 173 AcpiGbl_Pm1EnableRegisterSave = (UINT16) AcpiHwRegisterRead ( 174 ACPI_MTX_LOCK, PM1_EN); |
|
161 | 175 |
162 /* Identify current ACPI/legacy mode */ | |
163 | 176 |
164 switch (AcpiGbl_SystemFlags & SYS_MODES_MASK) | 177 /* 178 * The GPEs behave similarly, except that the length of the register 179 * block is not fixed, so the buffer must be allocated with malloc 180 */ 181 if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe0Blk.Address) && 182 AcpiGbl_FADT->Gpe0BlkLen) |
165 { | 183 { |
166 case (SYS_MODE_ACPI): | 184 /* GPE0 specified in FADT */ |
167 | 185 |
168 AcpiGbl_OriginalMode = SYS_MODE_ACPI; 169 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "System supports ACPI mode only.\n")); 170 break; | 186 AcpiGbl_Gpe0EnableRegisterSave = ACPI_MEM_ALLOCATE ( 187 DIV_2 (AcpiGbl_FADT->Gpe0BlkLen)); 188 if (!AcpiGbl_Gpe0EnableRegisterSave) 189 { 190 return_ACPI_STATUS (AE_NO_MEMORY); 191 } |
171 | 192 |
193 /* Save state of GPE0 enable bits */ |
|
172 | 194 |
173 case (SYS_MODE_LEGACY): 174 175 AcpiGbl_OriginalMode = SYS_MODE_LEGACY; 176 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 177 "Tables loaded from buffer, hardware assumed to support LEGACY mode only.\n")); 178 break; 179 180 181 case (SYS_MODE_ACPI | SYS_MODE_LEGACY): 182 183 if (AcpiHwGetMode () == SYS_MODE_ACPI) | 195 for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe0BlkLen); Index++) |
184 { | 196 { |
185 AcpiGbl_OriginalMode = SYS_MODE_ACPI; | 197 AcpiGbl_Gpe0EnableRegisterSave[Index] = 198 (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE0_EN_BLOCK | Index); |
186 } | 199 } |
187 else 188 { 189 AcpiGbl_OriginalMode = SYS_MODE_LEGACY; 190 } | 200 } |
191 | 201 |
192 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 193 "System supports both ACPI and LEGACY modes.\n")); 194 195 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 196 "System is currently in %s mode.\n", 197 (AcpiGbl_OriginalMode == SYS_MODE_ACPI) ? "ACPI" : "LEGACY")); 198 break; | 202 else 203 { 204 AcpiGbl_Gpe0EnableRegisterSave = NULL; |
199 } 200 | 205 } 206 |
201 202 if (AcpiGbl_SystemFlags & SYS_MODE_ACPI) | 207 if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe1Blk.Address) && 208 AcpiGbl_FADT->Gpe1BlkLen) |
203 { | 209 { |
204 /* Target system supports ACPI mode */ | 210 /* GPE1 defined */ |
205 | 211 |
206 /* 207 * The purpose of this code is to save the initial state 208 * of the ACPI event enable registers. An exit function will be 209 * registered which will restore this state when the application 210 * exits. The exit function will also clear all of the ACPI event 211 * status bits prior to restoring the original mode. 212 * 213 * The location of the PM1aEvtBlk enable registers is defined as the 214 * base of PM1aEvtBlk + DIV_2(PM1aEvtBlkLength). Since the spec further 215 * fully defines the PM1aEvtBlk to be a total of 4 bytes, the offset 216 * for the enable registers is always 2 from the base. It is hard 217 * coded here. If this changes in the spec, this code will need to 218 * be modified. The PM1bEvtBlk behaves as expected. 219 */ 220 AcpiGbl_Pm1EnableRegisterSave = (UINT16) AcpiHwRegisterRead ( 221 ACPI_MTX_LOCK, PM1_EN); 222 223 224 /* 225 * The GPEs behave similarly, except that the length of the register 226 * block is not fixed, so the buffer must be allocated with malloc 227 */ 228 if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe0Blk.Address) && 229 AcpiGbl_FADT->Gpe0BlkLen) | 212 AcpiGbl_Gpe1EnableRegisterSave = ACPI_MEM_ALLOCATE ( 213 DIV_2 (AcpiGbl_FADT->Gpe1BlkLen)); 214 if (!AcpiGbl_Gpe1EnableRegisterSave) |
230 { | 215 { |
231 /* GPE0 specified in FADT */ 232 233 AcpiGbl_Gpe0EnableRegisterSave = ACPI_MEM_ALLOCATE ( 234 DIV_2 (AcpiGbl_FADT->Gpe0BlkLen)); 235 if (!AcpiGbl_Gpe0EnableRegisterSave) 236 { 237 return_ACPI_STATUS (AE_NO_MEMORY); 238 } 239 240 /* Save state of GPE0 enable bits */ 241 242 for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe0BlkLen); Index++) 243 { 244 AcpiGbl_Gpe0EnableRegisterSave[Index] = 245 (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE0_EN_BLOCK | Index); 246 } | 216 return_ACPI_STATUS (AE_NO_MEMORY); |
247 } 248 | 217 } 218 |
249 else 250 { 251 AcpiGbl_Gpe0EnableRegisterSave = NULL; 252 } | 219 /* save state of GPE1 enable bits */ |
253 | 220 |
254 if (ACPI_VALID_ADDRESS (AcpiGbl_FADT->XGpe1Blk.Address) && 255 AcpiGbl_FADT->Gpe1BlkLen) | 221 for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe1BlkLen); Index++) |
256 { | 222 { |
257 /* GPE1 defined */ 258 259 AcpiGbl_Gpe1EnableRegisterSave = ACPI_MEM_ALLOCATE ( 260 DIV_2 (AcpiGbl_FADT->Gpe1BlkLen)); 261 if (!AcpiGbl_Gpe1EnableRegisterSave) 262 { 263 return_ACPI_STATUS (AE_NO_MEMORY); 264 } 265 266 /* save state of GPE1 enable bits */ 267 268 for (Index = 0; Index < DIV_2 (AcpiGbl_FADT->Gpe1BlkLen); Index++) 269 { 270 AcpiGbl_Gpe1EnableRegisterSave[Index] = 271 (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE1_EN_BLOCK | Index); 272 } | 223 AcpiGbl_Gpe1EnableRegisterSave[Index] = 224 (UINT8) AcpiHwRegisterRead (ACPI_MTX_LOCK, GPE1_EN_BLOCK | Index); |
273 } | 225 } |
226 } |
|
274 | 227 |
275 else 276 { 277 AcpiGbl_Gpe1EnableRegisterSave = NULL; 278 } | 228 else 229 { 230 AcpiGbl_Gpe1EnableRegisterSave = NULL; |
279 } 280 281 return_ACPI_STATUS (Status); 282} 283 284 285/****************************************************************************** 286 * --- 76 unchanged lines hidden (view full) --- 363 { 364 return_VALUE (SYS_MODE_ACPI); 365 } 366 else 367 { 368 return_VALUE (SYS_MODE_LEGACY); 369 } 370} | 231 } 232 233 return_ACPI_STATUS (Status); 234} 235 236 237/****************************************************************************** 238 * --- 76 unchanged lines hidden (view full) --- 315 { 316 return_VALUE (SYS_MODE_ACPI); 317 } 318 else 319 { 320 return_VALUE (SYS_MODE_LEGACY); 321 } 322} |
371 372 373/****************************************************************************** 374 * 375 * FUNCTION: AcpiHwGetModeCapabilities 376 * 377 * PARAMETERS: none 378 * 379 * RETURN: logical OR of SYS_MODE_ACPI and SYS_MODE_LEGACY determined at initial 380 * system state. 381 * 382 * DESCRIPTION: Returns capablities of system 383 * 384 ******************************************************************************/ 385 386UINT32 387AcpiHwGetModeCapabilities (void) 388{ 389 390 FUNCTION_TRACE ("HwGetModeCapabilities"); 391 392 393 if (!(AcpiGbl_SystemFlags & SYS_MODES_MASK)) 394 { 395 if (AcpiHwGetMode () == SYS_MODE_LEGACY) 396 { 397 /* 398 * Assume that if this call is being made, AcpiInit has been called 399 * and ACPI support has been established by the presence of the 400 * tables. Therefore since we're in SYS_MODE_LEGACY, the system 401 * must support both modes 402 */ 403 AcpiGbl_SystemFlags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY); 404 } 405 406 else 407 { 408 /* TBD: [Investigate] !!! this may be unsafe... */ 409 /* 410 * system is is ACPI mode, so try to switch back to LEGACY to see if 411 * it is supported 412 */ 413 AcpiHwSetMode (SYS_MODE_LEGACY); 414 415 if (AcpiHwGetMode () == SYS_MODE_LEGACY) 416 { 417 /* Now in SYS_MODE_LEGACY, so both are supported */ 418 419 AcpiGbl_SystemFlags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY); 420 AcpiHwSetMode (SYS_MODE_ACPI); 421 } 422 423 else 424 { 425 /* Still in SYS_MODE_ACPI so this must be an ACPI only system */ 426 427 AcpiGbl_SystemFlags |= SYS_MODE_ACPI; 428 } 429 } 430 } 431 432 return_VALUE (AcpiGbl_SystemFlags & SYS_MODES_MASK); 433} 434 435 | |