diff options
Diffstat (limited to 'drivers/acpi/executer/exutils.c')
| -rw-r--r-- | drivers/acpi/executer/exutils.c | 104 |
1 files changed, 84 insertions, 20 deletions
diff --git a/drivers/acpi/executer/exutils.c b/drivers/acpi/executer/exutils.c index aea461f3a48c..6b0aeccbb69b 100644 --- a/drivers/acpi/executer/exutils.c +++ b/drivers/acpi/executer/exutils.c | |||
| @@ -76,14 +76,15 @@ static u32 acpi_ex_digits_needed(acpi_integer value, u32 base); | |||
| 76 | * | 76 | * |
| 77 | * PARAMETERS: None | 77 | * PARAMETERS: None |
| 78 | * | 78 | * |
| 79 | * RETURN: Status | 79 | * RETURN: None |
| 80 | * | 80 | * |
| 81 | * DESCRIPTION: Enter the interpreter execution region. Failure to enter | 81 | * DESCRIPTION: Enter the interpreter execution region. Failure to enter |
| 82 | * the interpreter region is a fatal system error | 82 | * the interpreter region is a fatal system error. Used in |
| 83 | * conjunction with exit_interpreter. | ||
| 83 | * | 84 | * |
| 84 | ******************************************************************************/ | 85 | ******************************************************************************/ |
| 85 | 86 | ||
| 86 | acpi_status acpi_ex_enter_interpreter(void) | 87 | void acpi_ex_enter_interpreter(void) |
| 87 | { | 88 | { |
| 88 | acpi_status status; | 89 | acpi_status status; |
| 89 | 90 | ||
| @@ -91,31 +92,55 @@ acpi_status acpi_ex_enter_interpreter(void) | |||
| 91 | 92 | ||
| 92 | status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); | 93 | status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER); |
| 93 | if (ACPI_FAILURE(status)) { | 94 | if (ACPI_FAILURE(status)) { |
| 94 | ACPI_ERROR((AE_INFO, "Could not acquire interpreter mutex")); | 95 | ACPI_ERROR((AE_INFO, |
| 96 | "Could not acquire AML Interpreter mutex")); | ||
| 95 | } | 97 | } |
| 96 | 98 | ||
| 97 | return_ACPI_STATUS(status); | 99 | return_VOID; |
| 98 | } | 100 | } |
| 99 | 101 | ||
| 100 | /******************************************************************************* | 102 | /******************************************************************************* |
| 101 | * | 103 | * |
| 102 | * FUNCTION: acpi_ex_exit_interpreter | 104 | * FUNCTION: acpi_ex_reacquire_interpreter |
| 103 | * | 105 | * |
| 104 | * PARAMETERS: None | 106 | * PARAMETERS: None |
| 105 | * | 107 | * |
| 106 | * RETURN: None | 108 | * RETURN: None |
| 107 | * | 109 | * |
| 108 | * DESCRIPTION: Exit the interpreter execution region | 110 | * DESCRIPTION: Reacquire the interpreter execution region from within the |
| 111 | * interpreter code. Failure to enter the interpreter region is a | ||
| 112 | * fatal system error. Used in conjuction with | ||
| 113 | * relinquish_interpreter | ||
| 114 | * | ||
| 115 | ******************************************************************************/ | ||
| 116 | |||
| 117 | void acpi_ex_reacquire_interpreter(void) | ||
| 118 | { | ||
| 119 | ACPI_FUNCTION_TRACE(ex_reacquire_interpreter); | ||
| 120 | |||
| 121 | /* | ||
| 122 | * If the global serialized flag is set, do not release the interpreter, | ||
| 123 | * since it was not actually released by acpi_ex_relinquish_interpreter. | ||
| 124 | * This forces the interpreter to be single threaded. | ||
| 125 | */ | ||
| 126 | if (!acpi_gbl_all_methods_serialized) { | ||
| 127 | acpi_ex_enter_interpreter(); | ||
| 128 | } | ||
| 129 | |||
| 130 | return_VOID; | ||
| 131 | } | ||
| 132 | |||
| 133 | /******************************************************************************* | ||
| 134 | * | ||
| 135 | * FUNCTION: acpi_ex_exit_interpreter | ||
| 136 | * | ||
| 137 | * PARAMETERS: None | ||
| 138 | * | ||
| 139 | * RETURN: None | ||
| 109 | * | 140 | * |
| 110 | * Cases where the interpreter is unlocked: | 141 | * DESCRIPTION: Exit the interpreter execution region. This is the top level |
| 111 | * 1) Completion of the execution of a control method | 142 | * routine used to exit the interpreter when all processing has |
| 112 | * 2) Method blocked on a Sleep() AML opcode | 143 | * been completed. |
| 113 | * 3) Method blocked on an Acquire() AML opcode | ||
| 114 | * 4) Method blocked on a Wait() AML opcode | ||
| 115 | * 5) Method blocked to acquire the global lock | ||
| 116 | * 6) Method blocked to execute a serialized control method that is | ||
| 117 | * already executing | ||
| 118 | * 7) About to invoke a user-installed opregion handler | ||
| 119 | * | 144 | * |
| 120 | ******************************************************************************/ | 145 | ******************************************************************************/ |
| 121 | 146 | ||
| @@ -127,7 +152,46 @@ void acpi_ex_exit_interpreter(void) | |||
| 127 | 152 | ||
| 128 | status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); | 153 | status = acpi_ut_release_mutex(ACPI_MTX_INTERPRETER); |
| 129 | if (ACPI_FAILURE(status)) { | 154 | if (ACPI_FAILURE(status)) { |
| 130 | ACPI_ERROR((AE_INFO, "Could not release interpreter mutex")); | 155 | ACPI_ERROR((AE_INFO, |
| 156 | "Could not release AML Interpreter mutex")); | ||
| 157 | } | ||
| 158 | |||
| 159 | return_VOID; | ||
| 160 | } | ||
| 161 | |||
| 162 | /******************************************************************************* | ||
| 163 | * | ||
| 164 | * FUNCTION: acpi_ex_relinquish_interpreter | ||
| 165 | * | ||
| 166 | * PARAMETERS: None | ||
| 167 | * | ||
| 168 | * RETURN: None | ||
| 169 | * | ||
| 170 | * DESCRIPTION: Exit the interpreter execution region, from within the | ||
| 171 | * interpreter - before attempting an operation that will possibly | ||
| 172 | * block the running thread. | ||
| 173 | * | ||
| 174 | * Cases where the interpreter is unlocked internally | ||
| 175 | * 1) Method to be blocked on a Sleep() AML opcode | ||
| 176 | * 2) Method to be blocked on an Acquire() AML opcode | ||
| 177 | * 3) Method to be blocked on a Wait() AML opcode | ||
| 178 | * 4) Method to be blocked to acquire the global lock | ||
| 179 | * 5) Method to be blocked waiting to execute a serialized control method | ||
| 180 | * that is currently executing | ||
| 181 | * 6) About to invoke a user-installed opregion handler | ||
| 182 | * | ||
| 183 | ******************************************************************************/ | ||
| 184 | |||
| 185 | void acpi_ex_relinquish_interpreter(void) | ||
| 186 | { | ||
| 187 | ACPI_FUNCTION_TRACE(ex_relinquish_interpreter); | ||
| 188 | |||
| 189 | /* | ||
| 190 | * If the global serialized flag is set, do not release the interpreter. | ||
| 191 | * This forces the interpreter to be single threaded. | ||
| 192 | */ | ||
| 193 | if (!acpi_gbl_all_methods_serialized) { | ||
| 194 | acpi_ex_exit_interpreter(); | ||
| 131 | } | 195 | } |
| 132 | 196 | ||
| 133 | return_VOID; | 197 | return_VOID; |
| @@ -141,8 +205,8 @@ void acpi_ex_exit_interpreter(void) | |||
| 141 | * | 205 | * |
| 142 | * RETURN: none | 206 | * RETURN: none |
| 143 | * | 207 | * |
| 144 | * DESCRIPTION: Truncate a number to 32-bits if the currently executing method | 208 | * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is |
| 145 | * belongs to a 32-bit ACPI table. | 209 | * 32-bit, as determined by the revision of the DSDT. |
| 146 | * | 210 | * |
| 147 | ******************************************************************************/ | 211 | ******************************************************************************/ |
| 148 | 212 | ||
