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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: rsutils - Utilities for the resource manager
  4.  *              $Revision: 23 $
  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 "acnamesp.h"
  26. #include "acresrc.h"
  27. #define _COMPONENT          ACPI_RESOURCES
  28.  MODULE_NAME         ("rsutils")
  29. /*******************************************************************************
  30.  *
  31.  * FUNCTION:    Acpi_rs_get_prt_method_data
  32.  *
  33.  * PARAMETERS:  Handle          - a handle to the containing object
  34.  *              Ret_buffer      - a pointer to a buffer structure for the
  35.  *                                  results
  36.  *
  37.  * RETURN:      Status
  38.  *
  39.  * DESCRIPTION: This function is called to get the _PRT value of an object
  40.  *              contained in an object specified by the handle passed in
  41.  *
  42.  *              If the function fails an appropriate status will be returned
  43.  *              and the contents of the callers buffer is undefined.
  44.  *
  45.  ******************************************************************************/
  46. acpi_status
  47. acpi_rs_get_prt_method_data (
  48. acpi_handle             handle,
  49. acpi_buffer             *ret_buffer)
  50. {
  51. acpi_operand_object     *ret_obj;
  52. acpi_status             status;
  53. u32                     buffer_space_needed;
  54. FUNCTION_TRACE ("Rs_get_prt_method_data");
  55. /* already validated params, so we won't repeat here */
  56. buffer_space_needed = ret_buffer->length;
  57. /*
  58.  *  Execute the method, no parameters
  59.  */
  60. status = acpi_ns_evaluate_relative (handle, "_PRT", NULL, &ret_obj);
  61. if (ACPI_FAILURE (status)) {
  62. return_ACPI_STATUS (status);
  63. }
  64. if (!ret_obj) {
  65. /* Return object is required */
  66. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _PRTn"));
  67. return_ACPI_STATUS (AE_TYPE);
  68. }
  69. /*
  70.  * The return object will be a package, so check the
  71.  *  parameters.  If the return object is not a package,
  72.  *  then the underlying AML code is corrupt or improperly
  73.  *  written.
  74.  */
  75. if (ACPI_TYPE_PACKAGE != ret_obj->common.type) {
  76. status = AE_AML_OPERAND_TYPE;
  77. goto cleanup;
  78. }
  79. /*
  80.  * Make the call to create a resource linked list from the
  81.  *  byte stream buffer that comes back from the _CRS method
  82.  *  execution.
  83.  */
  84. status = acpi_rs_create_pci_routing_table (ret_obj, ret_buffer->pointer,
  85.   &buffer_space_needed);
  86. /*
  87.  * Tell the user how much of the buffer we have used or is needed
  88.  *  and return the final status.
  89.  */
  90. ret_buffer->length = buffer_space_needed;
  91. /* On exit, we must delete the object returned by evaluate_object */
  92. cleanup:
  93. acpi_ut_remove_reference (ret_obj);
  94. return_ACPI_STATUS (status);
  95. }
  96. /*******************************************************************************
  97.  *
  98.  * FUNCTION:    Acpi_rs_get_crs_method_data
  99.  *
  100.  * PARAMETERS:  Handle          - a handle to the containing object
  101.  *              Ret_buffer      - a pointer to a buffer structure for the
  102.  *                                  results
  103.  *
  104.  * RETURN:      Status
  105.  *
  106.  * DESCRIPTION: This function is called to get the _CRS value of an object
  107.  *              contained in an object specified by the handle passed in
  108.  *
  109.  *              If the function fails an appropriate status will be returned
  110.  *              and the contents of the callers buffer is undefined.
  111.  *
  112.  ******************************************************************************/
  113. acpi_status
  114. acpi_rs_get_crs_method_data (
  115. acpi_handle             handle,
  116. acpi_buffer             *ret_buffer)
  117. {
  118. acpi_operand_object     *ret_obj;
  119. acpi_status             status;
  120. u32                     buffer_space_needed = ret_buffer->length;
  121. FUNCTION_TRACE ("Rs_get_crs_method_data");
  122. /* already validated params, so we won't repeat here */
  123. /*
  124.  *  Execute the method, no parameters
  125.  */
  126. status = acpi_ns_evaluate_relative (handle, "_CRS", NULL, &ret_obj);
  127. if (ACPI_FAILURE (status)) {
  128. return_ACPI_STATUS (status);
  129. }
  130. if (!ret_obj) {
  131. /* Return object is required */
  132. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _CRSn"));
  133. return_ACPI_STATUS (AE_TYPE);
  134. }
  135. /*
  136.  * The return object will be a buffer, but check the
  137.  *  parameters.  If the return object is not a buffer,
  138.  *  then the underlying AML code is corrupt or improperly
  139.  *  written.
  140.  */
  141. if (ACPI_TYPE_BUFFER != ret_obj->common.type) {
  142. status = AE_AML_OPERAND_TYPE;
  143. goto cleanup;
  144. }
  145. /*
  146.  * Make the call to create a resource linked list from the
  147.  *  byte stream buffer that comes back from the _CRS method
  148.  *  execution.
  149.  */
  150. status = acpi_rs_create_resource_list (ret_obj, ret_buffer->pointer,
  151.  &buffer_space_needed);
  152. /*
  153.  * Tell the user how much of the buffer we have used or is needed
  154.  *  and return the final status.
  155.  */
  156. ret_buffer->length = buffer_space_needed;
  157. /* On exit, we must delete the object returned by evaluate_object */
  158. cleanup:
  159. acpi_ut_remove_reference (ret_obj);
  160. return_ACPI_STATUS (status);
  161. }
  162. /*******************************************************************************
  163.  *
  164.  * FUNCTION:    Acpi_rs_get_prs_method_data
  165.  *
  166.  * PARAMETERS:  Handle          - a handle to the containing object
  167.  *              Ret_buffer      - a pointer to a buffer structure for the
  168.  *                                  results
  169.  *
  170.  * RETURN:      Status
  171.  *
  172.  * DESCRIPTION: This function is called to get the _PRS value of an object
  173.  *              contained in an object specified by the handle passed in
  174.  *
  175.  *              If the function fails an appropriate status will be returned
  176.  *              and the contents of the callers buffer is undefined.
  177.  *
  178.  ******************************************************************************/
  179. acpi_status
  180. acpi_rs_get_prs_method_data (
  181. acpi_handle             handle,
  182. acpi_buffer             *ret_buffer)
  183. {
  184. acpi_operand_object     *ret_obj;
  185. acpi_status             status;
  186. u32                     buffer_space_needed = ret_buffer->length;
  187. FUNCTION_TRACE ("Rs_get_prs_method_data");
  188. /* already validated params, so we won't repeat here */
  189. /*
  190.  *  Execute the method, no parameters
  191.  */
  192. status = acpi_ns_evaluate_relative (handle, "_PRS", NULL, &ret_obj);
  193. if (ACPI_FAILURE (status)) {
  194. return_ACPI_STATUS (status);
  195. }
  196. if (!ret_obj) {
  197. /* Return object is required */
  198. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _PRSn"));
  199. return_ACPI_STATUS (AE_TYPE);
  200. }
  201. /*
  202.  * The return object will be a buffer, but check the
  203.  *  parameters.  If the return object is not a buffer,
  204.  *  then the underlying AML code is corrupt or improperly
  205.  *  written..
  206.  */
  207. if (ACPI_TYPE_BUFFER != ret_obj->common.type) {
  208. status = AE_AML_OPERAND_TYPE;
  209. goto cleanup;
  210. }
  211. /*
  212.  * Make the call to create a resource linked list from the
  213.  *  byte stream buffer that comes back from the _CRS method
  214.  *  execution.
  215.  */
  216. status = acpi_rs_create_resource_list (ret_obj, ret_buffer->pointer,
  217.  &buffer_space_needed);
  218. /*
  219.  * Tell the user how much of the buffer we have used or is needed
  220.  *  and return the final status.
  221.  */
  222. ret_buffer->length = buffer_space_needed;
  223. /* On exit, we must delete the object returned by evaluate_object */
  224. cleanup:
  225. acpi_ut_remove_reference (ret_obj);
  226. return_ACPI_STATUS (status);
  227. }
  228. /*******************************************************************************
  229.  *
  230.  * FUNCTION:    Acpi_rs_set_srs_method_data
  231.  *
  232.  * PARAMETERS:  Handle          - a handle to the containing object
  233.  *              In_buffer       - a pointer to a buffer structure of the
  234.  *                                  parameter
  235.  *
  236.  * RETURN:      Status
  237.  *
  238.  * DESCRIPTION: This function is called to set the _SRS of an object contained
  239.  *              in an object specified by the handle passed in
  240.  *
  241.  *              If the function fails an appropriate status will be returned
  242.  *              and the contents of the callers buffer is undefined.
  243.  *
  244.  ******************************************************************************/
  245. acpi_status
  246. acpi_rs_set_srs_method_data (
  247. acpi_handle             handle,
  248. acpi_buffer             *in_buffer)
  249. {
  250. acpi_operand_object     *params[2];
  251. acpi_status             status;
  252. u8                      *byte_stream = NULL;
  253. u32                     buffer_size_needed = 0;
  254. FUNCTION_TRACE ("Rs_set_srs_method_data");
  255. /* already validated params, so we won't repeat here */
  256. /*
  257.  * The In_buffer parameter will point to a linked list of
  258.  * resource parameters.  It needs to be formatted into a
  259.  * byte stream to be sent in as an input parameter.
  260.  */
  261. buffer_size_needed = 0;
  262. /*
  263.  * First call is to get the buffer size needed
  264.  */
  265. status = acpi_rs_create_byte_stream (in_buffer->pointer, byte_stream,
  266.  &buffer_size_needed);
  267. /*
  268.  * We expect a return of AE_BUFFER_OVERFLOW
  269.  * if not, exit with the error
  270.  */
  271. if (AE_BUFFER_OVERFLOW != status) {
  272. return_ACPI_STATUS (status);
  273. }
  274. /*
  275.  * Allocate the buffer needed
  276.  */
  277. byte_stream = ACPI_MEM_CALLOCATE (buffer_size_needed);
  278. if (NULL == byte_stream) {
  279. return_ACPI_STATUS (AE_NO_MEMORY);
  280. }
  281. /*
  282.  * Now call to convert the linked list into a byte stream
  283.  */
  284. status = acpi_rs_create_byte_stream (in_buffer->pointer, byte_stream,
  285.  &buffer_size_needed);
  286. if (ACPI_FAILURE (status)) {
  287. goto cleanup;
  288. }
  289. /*
  290.  * Init the param object
  291.  */
  292. params[0] = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
  293. if (!params[0]) {
  294. status = AE_NO_MEMORY;
  295. goto cleanup;
  296. }
  297. params [1] = NULL;
  298. /*
  299.  *  Set up the parameter object
  300.  */
  301. params[0]->buffer.length  = buffer_size_needed;
  302. params[0]->buffer.pointer = byte_stream;
  303. /*
  304.  * Execute the method, no return value
  305.  */
  306. status = acpi_ns_evaluate_relative (handle, "_SRS", params, NULL);
  307. acpi_ut_remove_reference (params[0]);
  308. /*
  309.  * Clean up and return the status from Acpi_ns_evaluate_relative
  310.  */
  311. cleanup:
  312. return_ACPI_STATUS (status);
  313. }