exsystem.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: exsystem - Interface to OS services
  4.  *              $Revision: 67 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acinterp.h"
  26. #include "acnamesp.h"
  27. #include "achware.h"
  28. #include "acevents.h"
  29. #define _COMPONENT          ACPI_EXECUTER
  30.  MODULE_NAME         ("exsystem")
  31. /*******************************************************************************
  32.  *
  33.  * FUNCTION:    Acpi_ex_system_wait_semaphore
  34.  *
  35.  * PARAMETERS:  Semaphore           - OSD semaphore to wait on
  36.  *              Timeout             - Max time to wait
  37.  *
  38.  * RETURN:      Status
  39.  *
  40.  * DESCRIPTION: Implements a semaphore wait with a check to see if the
  41.  *              semaphore is available immediately.  If it is not, the
  42.  *              interpreter is released.
  43.  *
  44.  ******************************************************************************/
  45. acpi_status
  46. acpi_ex_system_wait_semaphore (
  47. acpi_handle             semaphore,
  48. u32                     timeout)
  49. {
  50. acpi_status             status;
  51. FUNCTION_TRACE ("Ex_system_wait_semaphore");
  52. status = acpi_os_wait_semaphore (semaphore, 1, 0);
  53. if (ACPI_SUCCESS (status)) {
  54. return_ACPI_STATUS (status);
  55. }
  56. if (status == AE_TIME) {
  57. /* We must wait, so unlock the interpreter */
  58. acpi_ex_exit_interpreter ();
  59. status = acpi_os_wait_semaphore (semaphore, 1, timeout);
  60. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*** Thread awake after blocking, %sn",
  61. acpi_format_exception (status)));
  62. /* Reacquire the interpreter */
  63. status = acpi_ex_enter_interpreter ();
  64. if (ACPI_SUCCESS (status)) {
  65. /* Restore the timeout exception */
  66. status = AE_TIME;
  67. }
  68. }
  69. return_ACPI_STATUS (status);
  70. }
  71. /*******************************************************************************
  72.  *
  73.  * FUNCTION:    Acpi_ex_system_do_stall
  74.  *
  75.  * PARAMETERS:  How_long            - The amount of time to stall
  76.  *
  77.  * RETURN:      None
  78.  *
  79.  * DESCRIPTION: Suspend running thread for specified amount of time.
  80.  *
  81.  ******************************************************************************/
  82. void
  83. acpi_ex_system_do_stall (
  84. u32                     how_long)
  85. {
  86. FUNCTION_ENTRY ();
  87. if (how_long > 1000) /* 1 millisecond */ {
  88. /* Since this thread will sleep, we must release the interpreter */
  89. acpi_ex_exit_interpreter ();
  90. acpi_os_stall (how_long);
  91. /* And now we must get the interpreter again */
  92. acpi_ex_enter_interpreter ();
  93. }
  94. else {
  95. acpi_os_sleep (0, (how_long / 1000) + 1);
  96. }
  97. }
  98. /*******************************************************************************
  99.  *
  100.  * FUNCTION:    Acpi_ex_system_do_suspend
  101.  *
  102.  * PARAMETERS:  How_long            - The amount of time to suspend
  103.  *
  104.  * RETURN:      None
  105.  *
  106.  * DESCRIPTION: Suspend running thread for specified amount of time.
  107.  *
  108.  ******************************************************************************/
  109. void
  110. acpi_ex_system_do_suspend (
  111. u32                     how_long)
  112. {
  113. FUNCTION_ENTRY ();
  114. /* Since this thread will sleep, we must release the interpreter */
  115. acpi_ex_exit_interpreter ();
  116. acpi_os_sleep ((u16) (how_long / (u32) 1000),
  117.   (u16) (how_long % (u32) 1000));
  118. /* And now we must get the interpreter again */
  119. acpi_ex_enter_interpreter ();
  120. }
  121. /*******************************************************************************
  122.  *
  123.  * FUNCTION:    Acpi_ex_system_acquire_mutex
  124.  *
  125.  * PARAMETERS:  *Time_desc          - The 'time to delay' object descriptor
  126.  *              *Obj_desc           - The object descriptor for this op
  127.  *
  128.  * RETURN:      Status
  129.  *
  130.  * DESCRIPTION: Provides an access point to perform synchronization operations
  131.  *              within the AML.  This function will cause a lock to be generated
  132.  *              for the Mutex pointed to by Obj_desc.
  133.  *
  134.  ******************************************************************************/
  135. acpi_status
  136. acpi_ex_system_acquire_mutex (
  137. acpi_operand_object     *time_desc,
  138. acpi_operand_object     *obj_desc)
  139. {
  140. acpi_status             status = AE_OK;
  141. FUNCTION_TRACE_PTR ("Ex_system_acquire_mutex", obj_desc);
  142. if (!obj_desc) {
  143. return_ACPI_STATUS (AE_BAD_PARAMETER);
  144. }
  145. /*
  146.  * Support for the _GL_ Mutex object -- go get the global lock
  147.  */
  148. if (obj_desc->mutex.semaphore == acpi_gbl_global_lock_semaphore) {
  149. status = acpi_ev_acquire_global_lock ();
  150. return_ACPI_STATUS (status);
  151. }
  152. status = acpi_ex_system_wait_semaphore (obj_desc->mutex.semaphore,
  153.   (u32) time_desc->integer.value);
  154. return_ACPI_STATUS (status);
  155. }
  156. /*******************************************************************************
  157.  *
  158.  * FUNCTION:    Acpi_ex_system_release_mutex
  159.  *
  160.  * PARAMETERS:  *Obj_desc           - The object descriptor for this op
  161.  *
  162.  * RETURN:      Status
  163.  *
  164.  * DESCRIPTION: Provides an access point to perform synchronization operations
  165.  *              within the AML.  This operation is a request to release a
  166.  *              previously acquired Mutex.  If the Mutex variable is set then
  167.  *              it will be decremented.
  168.  *
  169.  ******************************************************************************/
  170. acpi_status
  171. acpi_ex_system_release_mutex (
  172. acpi_operand_object     *obj_desc)
  173. {
  174. acpi_status             status = AE_OK;
  175. FUNCTION_TRACE ("Ex_system_release_mutex");
  176. if (!obj_desc) {
  177. return_ACPI_STATUS (AE_BAD_PARAMETER);
  178. }
  179. /*
  180.  * Support for the _GL_ Mutex object -- release the global lock
  181.  */
  182. if (obj_desc->mutex.semaphore == acpi_gbl_global_lock_semaphore) {
  183. acpi_ev_release_global_lock ();
  184. return_ACPI_STATUS (AE_OK);
  185. }
  186. status = acpi_os_signal_semaphore (obj_desc->mutex.semaphore, 1);
  187. return_ACPI_STATUS (status);
  188. }
  189. /*******************************************************************************
  190.  *
  191.  * FUNCTION:    Acpi_ex_system_signal_event
  192.  *
  193.  * PARAMETERS:  *Obj_desc           - The object descriptor for this op
  194.  *
  195.  * RETURN:      AE_OK
  196.  *
  197.  * DESCRIPTION: Provides an access point to perform synchronization operations
  198.  *              within the AML.
  199.  *
  200.  ******************************************************************************/
  201. acpi_status
  202. acpi_ex_system_signal_event (
  203. acpi_operand_object     *obj_desc)
  204. {
  205. acpi_status             status = AE_OK;
  206. FUNCTION_TRACE ("Ex_system_signal_event");
  207. if (obj_desc) {
  208. status = acpi_os_signal_semaphore (obj_desc->event.semaphore, 1);
  209. }
  210. return_ACPI_STATUS (status);
  211. }
  212. /*******************************************************************************
  213.  *
  214.  * FUNCTION:    Acpi_ex_system_wait_event
  215.  *
  216.  * PARAMETERS:  *Time_desc          - The 'time to delay' object descriptor
  217.  *              *Obj_desc           - The object descriptor for this op
  218.  *
  219.  * RETURN:      Status
  220.  *
  221.  * DESCRIPTION: Provides an access point to perform synchronization operations
  222.  *              within the AML.  This operation is a request to wait for an
  223.  *              event.
  224.  *
  225.  ******************************************************************************/
  226. acpi_status
  227. acpi_ex_system_wait_event (
  228. acpi_operand_object     *time_desc,
  229. acpi_operand_object     *obj_desc)
  230. {
  231. acpi_status             status = AE_OK;
  232. FUNCTION_TRACE ("Ex_system_wait_event");
  233. if (obj_desc) {
  234. status = acpi_ex_system_wait_semaphore (obj_desc->event.semaphore,
  235.   (u32) time_desc->integer.value);
  236. }
  237. return_ACPI_STATUS (status);
  238. }
  239. /*******************************************************************************
  240.  *
  241.  * FUNCTION:    Acpi_ex_system_reset_event
  242.  *
  243.  * PARAMETERS:  *Obj_desc           - The object descriptor for this op
  244.  *
  245.  * RETURN:      Status
  246.  *
  247.  * DESCRIPTION: Reset an event to a known state.
  248.  *
  249.  ******************************************************************************/
  250. acpi_status
  251. acpi_ex_system_reset_event (
  252. acpi_operand_object     *obj_desc)
  253. {
  254. acpi_status             status = AE_OK;
  255. void                    *temp_semaphore;
  256. FUNCTION_ENTRY ();
  257. /*
  258.  * We are going to simply delete the existing semaphore and
  259.  * create a new one!
  260.  */
  261. status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 0, &temp_semaphore);
  262. if (ACPI_SUCCESS (status)) {
  263. acpi_os_delete_semaphore (obj_desc->event.semaphore);
  264. obj_desc->event.semaphore = temp_semaphore;
  265. }
  266. return (status);
  267. }