Branch data Line data Source code
1 : : // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2 : : /****************************************************************************** 3 : : * 4 : : * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface 5 : : * 6 : : * Copyright (C) 2000 - 2020, Intel Corp. 7 : : * 8 : : *****************************************************************************/ 9 : : 10 : : #include <acpi/acpi.h> 11 : : #include "accommon.h" 12 : : 13 : : #define _COMPONENT ACPI_HARDWARE 14 : : ACPI_MODULE_NAME("hwacpi") 15 : : 16 : : #if (!ACPI_REDUCED_HARDWARE) /* Entire module */ 17 : : /****************************************************************************** 18 : : * 19 : : * FUNCTION: acpi_hw_set_mode 20 : : * 21 : : * PARAMETERS: mode - SYS_MODE_ACPI or SYS_MODE_LEGACY 22 : : * 23 : : * RETURN: Status 24 : : * 25 : : * DESCRIPTION: Transitions the system into the requested mode. 26 : : * 27 : : ******************************************************************************/ 28 : 78 : acpi_status acpi_hw_set_mode(u32 mode) 29 : : { 30 : : 31 : 78 : acpi_status status; 32 : : 33 : 78 : ACPI_FUNCTION_TRACE(hw_set_mode); 34 : : 35 : : /* If the Hardware Reduced flag is set, machine is always in acpi mode */ 36 : : 37 [ + - ]: 78 : if (acpi_gbl_reduced_hardware) { 38 : : return_ACPI_STATUS(AE_OK); 39 : : } 40 : : 41 : : /* 42 : : * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, 43 : : * system does not support mode transition. 44 : : */ 45 [ - + ]: 78 : if (!acpi_gbl_FADT.smi_command) { 46 : 0 : ACPI_ERROR((AE_INFO, 47 : : "No SMI_CMD in FADT, mode transition failed")); 48 : 0 : return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); 49 : : } 50 : : 51 : : /* 52 : : * ACPI 2.0 clarified the meaning of ACPI_ENABLE and ACPI_DISABLE 53 : : * in FADT: If it is zero, enabling or disabling is not supported. 54 : : * As old systems may have used zero for mode transition, 55 : : * we make sure both the numbers are zero to determine these 56 : : * transitions are not supported. 57 : : */ 58 [ - + - - ]: 78 : if (!acpi_gbl_FADT.acpi_enable && !acpi_gbl_FADT.acpi_disable) { 59 : 0 : ACPI_ERROR((AE_INFO, 60 : : "No ACPI mode transition supported in this system " 61 : : "(enable/disable both zero)")); 62 : 0 : return_ACPI_STATUS(AE_OK); 63 : : } 64 : : 65 [ + - - ]: 78 : switch (mode) { 66 : 78 : case ACPI_SYS_MODE_ACPI: 67 : : 68 : : /* BIOS should have disabled ALL fixed and GP events */ 69 : : 70 : 78 : status = acpi_hw_write_port(acpi_gbl_FADT.smi_command, 71 : : (u32) acpi_gbl_FADT.acpi_enable, 8); 72 : : ACPI_DEBUG_PRINT((ACPI_DB_INFO, 73 : 78 : "Attempting to enable ACPI mode\n")); 74 : 78 : break; 75 : : 76 : 0 : case ACPI_SYS_MODE_LEGACY: 77 : : /* 78 : : * BIOS should clear all fixed status bits and restore fixed event 79 : : * enable bits to default 80 : : */ 81 : 0 : status = acpi_hw_write_port(acpi_gbl_FADT.smi_command, 82 : 0 : (u32)acpi_gbl_FADT.acpi_disable, 8); 83 : : ACPI_DEBUG_PRINT((ACPI_DB_INFO, 84 : 0 : "Attempting to enable Legacy (non-ACPI) mode\n")); 85 : 0 : break; 86 : : 87 : : default: 88 : : 89 : : return_ACPI_STATUS(AE_BAD_PARAMETER); 90 : : } 91 : : 92 [ - + ]: 78 : if (ACPI_FAILURE(status)) { 93 : 0 : ACPI_EXCEPTION((AE_INFO, status, 94 : : "Could not write ACPI mode change")); 95 : 0 : return_ACPI_STATUS(status); 96 : : } 97 : : 98 : : return_ACPI_STATUS(AE_OK); 99 : : } 100 : : 101 : : /******************************************************************************* 102 : : * 103 : : * FUNCTION: acpi_hw_get_mode 104 : : * 105 : : * PARAMETERS: none 106 : : * 107 : : * RETURN: SYS_MODE_ACPI or SYS_MODE_LEGACY 108 : : * 109 : : * DESCRIPTION: Return current operating state of system. Determined by 110 : : * querying the SCI_EN bit. 111 : : * 112 : : ******************************************************************************/ 113 : : 114 : 234 : u32 acpi_hw_get_mode(void) 115 : : { 116 : 234 : acpi_status status; 117 : 234 : u32 value; 118 : : 119 : 234 : ACPI_FUNCTION_TRACE(hw_get_mode); 120 : : 121 : : /* If the Hardware Reduced flag is set, machine is always in acpi mode */ 122 : : 123 [ + - ]: 234 : if (acpi_gbl_reduced_hardware) { 124 : : return_UINT32(ACPI_SYS_MODE_ACPI); 125 : : } 126 : : 127 : : /* 128 : : * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, 129 : : * system does not support mode transition. 130 : : */ 131 [ + - ]: 234 : if (!acpi_gbl_FADT.smi_command) { 132 : : return_UINT32(ACPI_SYS_MODE_ACPI); 133 : : } 134 : : 135 : 234 : status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value); 136 [ + - ]: 234 : if (ACPI_FAILURE(status)) { 137 : : return_UINT32(ACPI_SYS_MODE_LEGACY); 138 : : } 139 : : 140 [ + + ]: 234 : if (value) { 141 : : return_UINT32(ACPI_SYS_MODE_ACPI); 142 : : } else { 143 : 156 : return_UINT32(ACPI_SYS_MODE_LEGACY); 144 : : } 145 : : } 146 : : 147 : : #endif /* !ACPI_REDUCED_HARDWARE */