at v2.6.13 353 lines 11 kB view raw
1/******************************************************************************* 2 * 3 * Module Name: rsutils - Utilities for the resource manager 4 * 5 ******************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2005, R. Byron Moore 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 45#include <acpi/acpi.h> 46#include <acpi/acnamesp.h> 47#include <acpi/acresrc.h> 48 49 50#define _COMPONENT ACPI_RESOURCES 51 ACPI_MODULE_NAME ("rsutils") 52 53 54/******************************************************************************* 55 * 56 * FUNCTION: acpi_rs_get_prt_method_data 57 * 58 * PARAMETERS: Handle - a handle to the containing object 59 * ret_buffer - a pointer to a buffer structure for the 60 * results 61 * 62 * RETURN: Status 63 * 64 * DESCRIPTION: This function is called to get the _PRT value of an object 65 * contained in an object specified by the handle passed in 66 * 67 * If the function fails an appropriate status will be returned 68 * and the contents of the callers buffer is undefined. 69 * 70 ******************************************************************************/ 71 72acpi_status 73acpi_rs_get_prt_method_data ( 74 acpi_handle handle, 75 struct acpi_buffer *ret_buffer) 76{ 77 union acpi_operand_object *obj_desc; 78 acpi_status status; 79 80 81 ACPI_FUNCTION_TRACE ("rs_get_prt_method_data"); 82 83 84 /* Parameters guaranteed valid by caller */ 85 86 /* Execute the method, no parameters */ 87 88 status = acpi_ut_evaluate_object (handle, METHOD_NAME__PRT, 89 ACPI_BTYPE_PACKAGE, &obj_desc); 90 if (ACPI_FAILURE (status)) { 91 return_ACPI_STATUS (status); 92 } 93 94 /* 95 * Create a resource linked list from the byte stream buffer that comes 96 * back from the _CRS method execution. 97 */ 98 status = acpi_rs_create_pci_routing_table (obj_desc, ret_buffer); 99 100 /* On exit, we must delete the object returned by evaluate_object */ 101 102 acpi_ut_remove_reference (obj_desc); 103 return_ACPI_STATUS (status); 104} 105 106 107/******************************************************************************* 108 * 109 * FUNCTION: acpi_rs_get_crs_method_data 110 * 111 * PARAMETERS: Handle - a handle to the containing object 112 * ret_buffer - a pointer to a buffer structure for the 113 * results 114 * 115 * RETURN: Status 116 * 117 * DESCRIPTION: This function is called to get the _CRS value of an object 118 * contained in an object specified by the handle passed in 119 * 120 * If the function fails an appropriate status will be returned 121 * and the contents of the callers buffer is undefined. 122 * 123 ******************************************************************************/ 124 125acpi_status 126acpi_rs_get_crs_method_data ( 127 acpi_handle handle, 128 struct acpi_buffer *ret_buffer) 129{ 130 union acpi_operand_object *obj_desc; 131 acpi_status status; 132 133 134 ACPI_FUNCTION_TRACE ("rs_get_crs_method_data"); 135 136 137 /* Parameters guaranteed valid by caller */ 138 139 /* Execute the method, no parameters */ 140 141 status = acpi_ut_evaluate_object (handle, METHOD_NAME__CRS, 142 ACPI_BTYPE_BUFFER, &obj_desc); 143 if (ACPI_FAILURE (status)) { 144 return_ACPI_STATUS (status); 145 } 146 147 /* 148 * Make the call to create a resource linked list from the 149 * byte stream buffer that comes back from the _CRS method 150 * execution. 151 */ 152 status = acpi_rs_create_resource_list (obj_desc, ret_buffer); 153 154 /* on exit, we must delete the object returned by evaluate_object */ 155 156 acpi_ut_remove_reference (obj_desc); 157 return_ACPI_STATUS (status); 158} 159 160 161/******************************************************************************* 162 * 163 * FUNCTION: acpi_rs_get_prs_method_data 164 * 165 * PARAMETERS: Handle - a handle to the containing object 166 * ret_buffer - a pointer to a buffer structure for the 167 * results 168 * 169 * RETURN: Status 170 * 171 * DESCRIPTION: This function is called to get the _PRS value of an object 172 * contained in an object specified by the handle passed in 173 * 174 * If the function fails an appropriate status will be returned 175 * and the contents of the callers buffer is undefined. 176 * 177 ******************************************************************************/ 178 179#ifdef ACPI_FUTURE_USAGE 180acpi_status 181acpi_rs_get_prs_method_data ( 182 acpi_handle handle, 183 struct acpi_buffer *ret_buffer) 184{ 185 union acpi_operand_object *obj_desc; 186 acpi_status status; 187 188 189 ACPI_FUNCTION_TRACE ("rs_get_prs_method_data"); 190 191 192 /* Parameters guaranteed valid by caller */ 193 194 /* Execute the method, no parameters */ 195 196 status = acpi_ut_evaluate_object (handle, METHOD_NAME__PRS, 197 ACPI_BTYPE_BUFFER, &obj_desc); 198 if (ACPI_FAILURE (status)) { 199 return_ACPI_STATUS (status); 200 } 201 202 /* 203 * Make the call to create a resource linked list from the 204 * byte stream buffer that comes back from the _CRS method 205 * execution. 206 */ 207 status = acpi_rs_create_resource_list (obj_desc, ret_buffer); 208 209 /* on exit, we must delete the object returned by evaluate_object */ 210 211 acpi_ut_remove_reference (obj_desc); 212 return_ACPI_STATUS (status); 213} 214#endif /* ACPI_FUTURE_USAGE */ 215 216 217/******************************************************************************* 218 * 219 * FUNCTION: acpi_rs_get_method_data 220 * 221 * PARAMETERS: Handle - a handle to the containing object 222 * Path - Path to method, relative to Handle 223 * ret_buffer - a pointer to a buffer structure for the 224 * results 225 * 226 * RETURN: Status 227 * 228 * DESCRIPTION: This function is called to get the _CRS or _PRS value of an 229 * object contained in an object specified by the handle passed in 230 * 231 * If the function fails an appropriate status will be returned 232 * and the contents of the callers buffer is undefined. 233 * 234 ******************************************************************************/ 235 236acpi_status 237acpi_rs_get_method_data ( 238 acpi_handle handle, 239 char *path, 240 struct acpi_buffer *ret_buffer) 241{ 242 union acpi_operand_object *obj_desc; 243 acpi_status status; 244 245 246 ACPI_FUNCTION_TRACE ("rs_get_method_data"); 247 248 249 /* Parameters guaranteed valid by caller */ 250 251 /* Execute the method, no parameters */ 252 253 status = acpi_ut_evaluate_object (handle, path, ACPI_BTYPE_BUFFER, &obj_desc); 254 if (ACPI_FAILURE (status)) { 255 return_ACPI_STATUS (status); 256 } 257 258 /* 259 * Make the call to create a resource linked list from the 260 * byte stream buffer that comes back from the method 261 * execution. 262 */ 263 status = acpi_rs_create_resource_list (obj_desc, ret_buffer); 264 265 /* On exit, we must delete the object returned by evaluate_object */ 266 267 acpi_ut_remove_reference (obj_desc); 268 return_ACPI_STATUS (status); 269} 270 271/******************************************************************************* 272 * 273 * FUNCTION: acpi_rs_set_srs_method_data 274 * 275 * PARAMETERS: Handle - a handle to the containing object 276 * in_buffer - a pointer to a buffer structure of the 277 * parameter 278 * 279 * RETURN: Status 280 * 281 * DESCRIPTION: This function is called to set the _SRS of an object contained 282 * in an object specified by the handle passed in 283 * 284 * If the function fails an appropriate status will be returned 285 * and the contents of the callers buffer is undefined. 286 * 287 ******************************************************************************/ 288 289acpi_status 290acpi_rs_set_srs_method_data ( 291 acpi_handle handle, 292 struct acpi_buffer *in_buffer) 293{ 294 struct acpi_parameter_info info; 295 union acpi_operand_object *params[2]; 296 acpi_status status; 297 struct acpi_buffer buffer; 298 299 300 ACPI_FUNCTION_TRACE ("rs_set_srs_method_data"); 301 302 303 /* Parameters guaranteed valid by caller */ 304 305 /* 306 * The in_buffer parameter will point to a linked list of 307 * resource parameters. It needs to be formatted into a 308 * byte stream to be sent in as an input parameter to _SRS 309 * 310 * Convert the linked list into a byte stream 311 */ 312 buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 313 status = acpi_rs_create_byte_stream (in_buffer->pointer, &buffer); 314 if (ACPI_FAILURE (status)) { 315 return_ACPI_STATUS (status); 316 } 317 318 /* Init the param object */ 319 320 params[0] = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); 321 if (!params[0]) { 322 acpi_os_free (buffer.pointer); 323 return_ACPI_STATUS (AE_NO_MEMORY); 324 } 325 326 /* Set up the parameter object */ 327 328 params[0]->buffer.length = (u32) buffer.length; 329 params[0]->buffer.pointer = buffer.pointer; 330 params[0]->common.flags = AOPOBJ_DATA_VALID; 331 params[1] = NULL; 332 333 info.node = handle; 334 info.parameters = params; 335 info.parameter_type = ACPI_PARAM_ARGS; 336 337 /* Execute the method, no return value */ 338 339 status = acpi_ns_evaluate_relative (METHOD_NAME__SRS, &info); 340 if (ACPI_SUCCESS (status)) { 341 /* Delete any return object (especially if implicit_return is enabled) */ 342 343 if (info.return_object) { 344 acpi_ut_remove_reference (info.return_object); 345 } 346 } 347 348 /* Clean up and return the status from acpi_ns_evaluate_relative */ 349 350 acpi_ut_remove_reference (params[0]); 351 return_ACPI_STATUS (status); 352} 353