1 /****************************************************************************** 2 * 3 * Module Name: hwxface - Public ACPICA hardware interfaces 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2018, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #define EXPORT_ACPI_INTERFACES 45 46 #include <acpi/acpi.h> 47 #include "accommon.h" 48 #include "acnamesp.h" 49 50 #define _COMPONENT ACPI_HARDWARE 51 ACPI_MODULE_NAME("hwxface") 52 53 /****************************************************************************** 54 * 55 * FUNCTION: acpi_reset 56 * 57 * PARAMETERS: None 58 * 59 * RETURN: Status 60 * 61 * DESCRIPTION: Set reset register in memory or IO space. Note: Does not 62 * support reset register in PCI config space, this must be 63 * handled separately. 64 * 65 ******************************************************************************/ 66 acpi_status acpi_reset(void) 67 { 68 struct acpi_generic_address *reset_reg; 69 acpi_status status; 70 71 ACPI_FUNCTION_TRACE(acpi_reset); 72 73 reset_reg = &acpi_gbl_FADT.reset_register; 74 75 /* Check if the reset register is supported */ 76 77 if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) || 78 !reset_reg->address) { 79 return_ACPI_STATUS(AE_NOT_EXIST); 80 } 81 82 if (reset_reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { 83 /* 84 * For I/O space, write directly to the OSL. This bypasses the port 85 * validation mechanism, which may block a valid write to the reset 86 * register. 87 * 88 * NOTE: 89 * The ACPI spec requires the reset register width to be 8, so we 90 * hardcode it here and ignore the FADT value. This maintains 91 * compatibility with other ACPI implementations that have allowed 92 * BIOS code with bad register width values to go unnoticed. 93 */ 94 status = acpi_os_write_port((acpi_io_address)reset_reg->address, 95 acpi_gbl_FADT.reset_value, 96 ACPI_RESET_REGISTER_WIDTH); 97 } else { 98 /* Write the reset value to the reset register */ 99 100 status = acpi_hw_write(acpi_gbl_FADT.reset_value, reset_reg); 101 } 102 103 return_ACPI_STATUS(status); 104 } 105 106 ACPI_EXPORT_SYMBOL(acpi_reset) 107 108 /****************************************************************************** 109 * 110 * FUNCTION: acpi_read 111 * 112 * PARAMETERS: value - Where the value is returned 113 * reg - GAS register structure 114 * 115 * RETURN: Status 116 * 117 * DESCRIPTION: Read from either memory or IO space. 118 * 119 * LIMITATIONS: <These limitations also apply to acpi_write> 120 * bit_width must be exactly 8, 16, 32, or 64. 121 * space_ID must be system_memory or system_IO. 122 * bit_offset and access_width are currently ignored, as there has 123 * not been a need to implement these. 124 * 125 ******************************************************************************/ 126 acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg) 127 { 128 acpi_status status; 129 130 ACPI_FUNCTION_NAME(acpi_read); 131 132 status = acpi_hw_read(return_value, reg); 133 return (status); 134 } 135 136 ACPI_EXPORT_SYMBOL(acpi_read) 137 138 /****************************************************************************** 139 * 140 * FUNCTION: acpi_write 141 * 142 * PARAMETERS: value - Value to be written 143 * reg - GAS register structure 144 * 145 * RETURN: Status 146 * 147 * DESCRIPTION: Write to either memory or IO space. 148 * 149 ******************************************************************************/ 150 acpi_status acpi_write(u64 value, struct acpi_generic_address *reg) 151 { 152 acpi_status status; 153 154 ACPI_FUNCTION_NAME(acpi_write); 155 156 status = acpi_hw_write(value, reg); 157 return (status); 158 } 159 160 ACPI_EXPORT_SYMBOL(acpi_write) 161 162 #if (!ACPI_REDUCED_HARDWARE) 163 /******************************************************************************* 164 * 165 * FUNCTION: acpi_read_bit_register 166 * 167 * PARAMETERS: register_id - ID of ACPI Bit Register to access 168 * return_value - Value that was read from the register, 169 * normalized to bit position zero. 170 * 171 * RETURN: Status and the value read from the specified Register. Value 172 * returned is normalized to bit0 (is shifted all the way right) 173 * 174 * DESCRIPTION: ACPI bit_register read function. Does not acquire the HW lock. 175 * 176 * SUPPORTS: Bit fields in PM1 Status, PM1 Enable, PM1 Control, and 177 * PM2 Control. 178 * 179 * Note: The hardware lock is not required when reading the ACPI bit registers 180 * since almost all of them are single bit and it does not matter that 181 * the parent hardware register can be split across two physical 182 * registers. The only multi-bit field is SLP_TYP in the PM1 control 183 * register, but this field does not cross an 8-bit boundary (nor does 184 * it make much sense to actually read this field.) 185 * 186 ******************************************************************************/ 187 acpi_status acpi_read_bit_register(u32 register_id, u32 *return_value) 188 { 189 struct acpi_bit_register_info *bit_reg_info; 190 u32 register_value; 191 u32 value; 192 acpi_status status; 193 194 ACPI_FUNCTION_TRACE_U32(acpi_read_bit_register, register_id); 195 196 /* Get the info structure corresponding to the requested ACPI Register */ 197 198 bit_reg_info = acpi_hw_get_bit_register_info(register_id); 199 if (!bit_reg_info) { 200 return_ACPI_STATUS(AE_BAD_PARAMETER); 201 } 202 203 /* Read the entire parent register */ 204 205 status = acpi_hw_register_read(bit_reg_info->parent_register, 206 ®ister_value); 207 if (ACPI_FAILURE(status)) { 208 return_ACPI_STATUS(status); 209 } 210 211 /* Normalize the value that was read, mask off other bits */ 212 213 value = ((register_value & bit_reg_info->access_bit_mask) 214 >> bit_reg_info->bit_position); 215 216 ACPI_DEBUG_PRINT((ACPI_DB_IO, 217 "BitReg %X, ParentReg %X, Actual %8.8X, ReturnValue %8.8X\n", 218 register_id, bit_reg_info->parent_register, 219 register_value, value)); 220 221 *return_value = value; 222 return_ACPI_STATUS(AE_OK); 223 } 224 225 ACPI_EXPORT_SYMBOL(acpi_read_bit_register) 226 227 /******************************************************************************* 228 * 229 * FUNCTION: acpi_write_bit_register 230 * 231 * PARAMETERS: register_id - ID of ACPI Bit Register to access 232 * value - Value to write to the register, in bit 233 * position zero. The bit is automatically 234 * shifted to the correct position. 235 * 236 * RETURN: Status 237 * 238 * DESCRIPTION: ACPI Bit Register write function. Acquires the hardware lock 239 * since most operations require a read/modify/write sequence. 240 * 241 * SUPPORTS: Bit fields in PM1 Status, PM1 Enable, PM1 Control, and 242 * PM2 Control. 243 * 244 * Note that at this level, the fact that there may be actually two 245 * hardware registers (A and B - and B may not exist) is abstracted. 246 * 247 ******************************************************************************/ 248 acpi_status acpi_write_bit_register(u32 register_id, u32 value) 249 { 250 struct acpi_bit_register_info *bit_reg_info; 251 acpi_cpu_flags lock_flags; 252 u32 register_value; 253 acpi_status status = AE_OK; 254 255 ACPI_FUNCTION_TRACE_U32(acpi_write_bit_register, register_id); 256 257 /* Get the info structure corresponding to the requested ACPI Register */ 258 259 bit_reg_info = acpi_hw_get_bit_register_info(register_id); 260 if (!bit_reg_info) { 261 return_ACPI_STATUS(AE_BAD_PARAMETER); 262 } 263 264 lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); 265 266 /* 267 * At this point, we know that the parent register is one of the 268 * following: PM1 Status, PM1 Enable, PM1 Control, or PM2 Control 269 */ 270 if (bit_reg_info->parent_register != ACPI_REGISTER_PM1_STATUS) { 271 /* 272 * 1) Case for PM1 Enable, PM1 Control, and PM2 Control 273 * 274 * Perform a register read to preserve the bits that we are not 275 * interested in 276 */ 277 status = acpi_hw_register_read(bit_reg_info->parent_register, 278 ®ister_value); 279 if (ACPI_FAILURE(status)) { 280 goto unlock_and_exit; 281 } 282 283 /* 284 * Insert the input bit into the value that was just read 285 * and write the register 286 */ 287 ACPI_REGISTER_INSERT_VALUE(register_value, 288 bit_reg_info->bit_position, 289 bit_reg_info->access_bit_mask, 290 value); 291 292 status = acpi_hw_register_write(bit_reg_info->parent_register, 293 register_value); 294 } else { 295 /* 296 * 2) Case for PM1 Status 297 * 298 * The Status register is different from the rest. Clear an event 299 * by writing 1, writing 0 has no effect. So, the only relevant 300 * information is the single bit we're interested in, all others 301 * should be written as 0 so they will be left unchanged. 302 */ 303 register_value = ACPI_REGISTER_PREPARE_BITS(value, 304 bit_reg_info-> 305 bit_position, 306 bit_reg_info-> 307 access_bit_mask); 308 309 /* No need to write the register if value is all zeros */ 310 311 if (register_value) { 312 status = 313 acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS, 314 register_value); 315 } 316 } 317 318 ACPI_DEBUG_PRINT((ACPI_DB_IO, 319 "BitReg %X, ParentReg %X, Value %8.8X, Actual %8.8X\n", 320 register_id, bit_reg_info->parent_register, value, 321 register_value)); 322 323 unlock_and_exit: 324 325 acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); 326 return_ACPI_STATUS(status); 327 } 328 329 ACPI_EXPORT_SYMBOL(acpi_write_bit_register) 330 #endif /* !ACPI_REDUCED_HARDWARE */ 331 /******************************************************************************* 332 * 333 * FUNCTION: acpi_get_sleep_type_data 334 * 335 * PARAMETERS: sleep_state - Numeric sleep state 336 * *sleep_type_a - Where SLP_TYPa is returned 337 * *sleep_type_b - Where SLP_TYPb is returned 338 * 339 * RETURN: Status 340 * 341 * DESCRIPTION: Obtain the SLP_TYPa and SLP_TYPb values for the requested 342 * sleep state via the appropriate \_Sx object. 343 * 344 * The sleep state package returned from the corresponding \_Sx_ object 345 * must contain at least one integer. 346 * 347 * March 2005: 348 * Added support for a package that contains two integers. This 349 * goes against the ACPI specification which defines this object as a 350 * package with one encoded DWORD integer. However, existing practice 351 * by many BIOS vendors is to return a package with 2 or more integer 352 * elements, at least one per sleep type (A/B). 353 * 354 * January 2013: 355 * Therefore, we must be prepared to accept a package with either a 356 * single integer or multiple integers. 357 * 358 * The single integer DWORD format is as follows: 359 * BYTE 0 - Value for the PM1A SLP_TYP register 360 * BYTE 1 - Value for the PM1B SLP_TYP register 361 * BYTE 2-3 - Reserved 362 * 363 * The dual integer format is as follows: 364 * Integer 0 - Value for the PM1A SLP_TYP register 365 * Integer 1 - Value for the PM1A SLP_TYP register 366 * 367 ******************************************************************************/ 368 acpi_status 369 acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b) 370 { 371 acpi_status status; 372 struct acpi_evaluate_info *info; 373 union acpi_operand_object **elements; 374 375 ACPI_FUNCTION_TRACE(acpi_get_sleep_type_data); 376 377 /* Validate parameters */ 378 379 if ((sleep_state > ACPI_S_STATES_MAX) || !sleep_type_a || !sleep_type_b) { 380 return_ACPI_STATUS(AE_BAD_PARAMETER); 381 } 382 383 /* Allocate the evaluation information block */ 384 385 info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info)); 386 if (!info) { 387 return_ACPI_STATUS(AE_NO_MEMORY); 388 } 389 390 /* 391 * Evaluate the \_Sx namespace object containing the register values 392 * for this state 393 */ 394 info->relative_pathname = acpi_gbl_sleep_state_names[sleep_state]; 395 396 status = acpi_ns_evaluate(info); 397 if (ACPI_FAILURE(status)) { 398 if (status == AE_NOT_FOUND) { 399 400 /* The _Sx states are optional, ignore NOT_FOUND */ 401 402 goto final_cleanup; 403 } 404 405 goto warning_cleanup; 406 } 407 408 /* Must have a return object */ 409 410 if (!info->return_object) { 411 ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]", 412 info->relative_pathname)); 413 status = AE_AML_NO_RETURN_VALUE; 414 goto warning_cleanup; 415 } 416 417 /* Return object must be of type Package */ 418 419 if (info->return_object->common.type != ACPI_TYPE_PACKAGE) { 420 ACPI_ERROR((AE_INFO, 421 "Sleep State return object is not a Package")); 422 status = AE_AML_OPERAND_TYPE; 423 goto return_value_cleanup; 424 } 425 426 /* 427 * Any warnings about the package length or the object types have 428 * already been issued by the predefined name module -- there is no 429 * need to repeat them here. 430 */ 431 elements = info->return_object->package.elements; 432 switch (info->return_object->package.count) { 433 case 0: 434 435 status = AE_AML_PACKAGE_LIMIT; 436 break; 437 438 case 1: 439 440 if (elements[0]->common.type != ACPI_TYPE_INTEGER) { 441 status = AE_AML_OPERAND_TYPE; 442 break; 443 } 444 445 /* A valid _Sx_ package with one integer */ 446 447 *sleep_type_a = (u8)elements[0]->integer.value; 448 *sleep_type_b = (u8)(elements[0]->integer.value >> 8); 449 break; 450 451 case 2: 452 default: 453 454 if ((elements[0]->common.type != ACPI_TYPE_INTEGER) || 455 (elements[1]->common.type != ACPI_TYPE_INTEGER)) { 456 status = AE_AML_OPERAND_TYPE; 457 break; 458 } 459 460 /* A valid _Sx_ package with two integers */ 461 462 *sleep_type_a = (u8)elements[0]->integer.value; 463 *sleep_type_b = (u8)elements[1]->integer.value; 464 break; 465 } 466 467 return_value_cleanup: 468 acpi_ut_remove_reference(info->return_object); 469 470 warning_cleanup: 471 if (ACPI_FAILURE(status)) { 472 ACPI_EXCEPTION((AE_INFO, status, 473 "While evaluating Sleep State [%s]", 474 info->relative_pathname)); 475 } 476 477 final_cleanup: 478 ACPI_FREE(info); 479 return_ACPI_STATUS(status); 480 } 481 482 ACPI_EXPORT_SYMBOL(acpi_get_sleep_type_data) 483