patch-2.4.22 linux-2.4.22/drivers/acpi/resources/rsutils.c
Next file: linux-2.4.22/drivers/acpi/resources/rsxface.c
Previous file: linux-2.4.22/drivers/acpi/resources/rsmisc.c
Back to the patch index
Back to the overall index
- Lines: 517
- Date:
2003-08-25 04:44:41.000000000 -0700
- Orig file:
linux-2.4.21/drivers/acpi/resources/rsutils.c
- Orig date:
2001-10-24 14:06:22.000000000 -0700
diff -urN linux-2.4.21/drivers/acpi/resources/rsutils.c linux-2.4.22/drivers/acpi/resources/rsutils.c
@@ -1,44 +1,62 @@
/*******************************************************************************
*
* Module Name: rsutils - Utilities for the resource manager
- * $Revision: 23 $
*
******************************************************************************/
/*
- * Copyright (C) 2000, 2001 R. Byron Moore
+ * Copyright (C) 2000 - 2003, R. Byron Moore
+ * All rights reserved.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
*/
-#include "acpi.h"
-#include "acnamesp.h"
-#include "acresrc.h"
+#include <acpi/acpi.h>
+#include <acpi/acnamesp.h>
+#include <acpi/acresrc.h>
#define _COMPONENT ACPI_RESOURCES
- MODULE_NAME ("rsutils")
+ ACPI_MODULE_NAME ("rsutils")
/*******************************************************************************
*
- * FUNCTION: Acpi_rs_get_prt_method_data
+ * FUNCTION: acpi_rs_get_prt_method_data
*
* PARAMETERS: Handle - a handle to the containing object
- * Ret_buffer - a pointer to a buffer structure for the
+ * ret_buffer - a pointer to a buffer structure for the
* results
*
* RETURN: Status
@@ -53,78 +71,45 @@
acpi_status
acpi_rs_get_prt_method_data (
- acpi_handle handle,
- acpi_buffer *ret_buffer)
+ acpi_handle handle,
+ struct acpi_buffer *ret_buffer)
{
- acpi_operand_object *ret_obj;
- acpi_status status;
- u32 buffer_space_needed;
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
- FUNCTION_TRACE ("Rs_get_prt_method_data");
+ ACPI_FUNCTION_TRACE ("rs_get_prt_method_data");
- /* already validated params, so we won't repeat here */
-
- buffer_space_needed = ret_buffer->length;
+ /* Parameters guaranteed valid by caller */
/*
- * Execute the method, no parameters
+ * Execute the method, no parameters
*/
- status = acpi_ns_evaluate_relative (handle, "_PRT", NULL, &ret_obj);
+ status = acpi_ut_evaluate_object (handle, "_PRT", ACPI_BTYPE_PACKAGE, &obj_desc);
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
- if (!ret_obj) {
- /* Return object is required */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _PRT\n"));
- return_ACPI_STATUS (AE_TYPE);
- }
-
-
- /*
- * The return object will be a package, so check the
- * parameters. If the return object is not a package,
- * then the underlying AML code is corrupt or improperly
- * written.
- */
- if (ACPI_TYPE_PACKAGE != ret_obj->common.type) {
- status = AE_AML_OPERAND_TYPE;
- goto cleanup;
- }
-
- /*
- * Make the call to create a resource linked list from the
- * byte stream buffer that comes back from the _CRS method
- * execution.
- */
- status = acpi_rs_create_pci_routing_table (ret_obj, ret_buffer->pointer,
- &buffer_space_needed);
-
/*
- * Tell the user how much of the buffer we have used or is needed
- * and return the final status.
+ * Create a resource linked list from the byte stream buffer that comes
+ * back from the _CRS method execution.
*/
- ret_buffer->length = buffer_space_needed;
-
+ status = acpi_rs_create_pci_routing_table (obj_desc, ret_buffer);
/* On exit, we must delete the object returned by evaluate_object */
-cleanup:
-
- acpi_ut_remove_reference (ret_obj);
+ acpi_ut_remove_reference (obj_desc);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_rs_get_crs_method_data
+ * FUNCTION: acpi_rs_get_crs_method_data
*
* PARAMETERS: Handle - a handle to the containing object
- * Ret_buffer - a pointer to a buffer structure for the
+ * ret_buffer - a pointer to a buffer structure for the
* results
*
* RETURN: Status
@@ -139,76 +124,46 @@
acpi_status
acpi_rs_get_crs_method_data (
- acpi_handle handle,
- acpi_buffer *ret_buffer)
+ acpi_handle handle,
+ struct acpi_buffer *ret_buffer)
{
- acpi_operand_object *ret_obj;
- acpi_status status;
- u32 buffer_space_needed = ret_buffer->length;
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
- FUNCTION_TRACE ("Rs_get_crs_method_data");
+ ACPI_FUNCTION_TRACE ("rs_get_crs_method_data");
- /* already validated params, so we won't repeat here */
+ /* Parameters guaranteed valid by caller */
/*
- * Execute the method, no parameters
+ * Execute the method, no parameters
*/
- status = acpi_ns_evaluate_relative (handle, "_CRS", NULL, &ret_obj);
+ status = acpi_ut_evaluate_object (handle, "_CRS", ACPI_BTYPE_BUFFER, &obj_desc);
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
- if (!ret_obj) {
- /* Return object is required */
-
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _CRS\n"));
- return_ACPI_STATUS (AE_TYPE);
- }
-
- /*
- * The return object will be a buffer, but check the
- * parameters. If the return object is not a buffer,
- * then the underlying AML code is corrupt or improperly
- * written.
- */
- if (ACPI_TYPE_BUFFER != ret_obj->common.type) {
- status = AE_AML_OPERAND_TYPE;
- goto cleanup;
- }
-
/*
* Make the call to create a resource linked list from the
- * byte stream buffer that comes back from the _CRS method
- * execution.
+ * byte stream buffer that comes back from the _CRS method
+ * execution.
*/
- status = acpi_rs_create_resource_list (ret_obj, ret_buffer->pointer,
- &buffer_space_needed);
+ status = acpi_rs_create_resource_list (obj_desc, ret_buffer);
+ /* on exit, we must delete the object returned by evaluate_object */
- /*
- * Tell the user how much of the buffer we have used or is needed
- * and return the final status.
- */
- ret_buffer->length = buffer_space_needed;
-
-
- /* On exit, we must delete the object returned by evaluate_object */
-
-cleanup:
-
- acpi_ut_remove_reference (ret_obj);
+ acpi_ut_remove_reference (obj_desc);
return_ACPI_STATUS (status);
}
/*******************************************************************************
*
- * FUNCTION: Acpi_rs_get_prs_method_data
+ * FUNCTION: acpi_rs_get_prs_method_data
*
* PARAMETERS: Handle - a handle to the containing object
- * Ret_buffer - a pointer to a buffer structure for the
+ * ret_buffer - a pointer to a buffer structure for the
* results
*
* RETURN: Status
@@ -223,75 +178,100 @@
acpi_status
acpi_rs_get_prs_method_data (
- acpi_handle handle,
- acpi_buffer *ret_buffer)
+ acpi_handle handle,
+ struct acpi_buffer *ret_buffer)
{
- acpi_operand_object *ret_obj;
- acpi_status status;
- u32 buffer_space_needed = ret_buffer->length;
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
- FUNCTION_TRACE ("Rs_get_prs_method_data");
+ ACPI_FUNCTION_TRACE ("rs_get_prs_method_data");
- /* already validated params, so we won't repeat here */
+ /* Parameters guaranteed valid by caller */
/*
- * Execute the method, no parameters
+ * Execute the method, no parameters
*/
- status = acpi_ns_evaluate_relative (handle, "_PRS", NULL, &ret_obj);
+ status = acpi_ut_evaluate_object (handle, "_PRS", ACPI_BTYPE_BUFFER, &obj_desc);
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
- if (!ret_obj) {
- /* Return object is required */
+ /*
+ * Make the call to create a resource linked list from the
+ * byte stream buffer that comes back from the _CRS method
+ * execution.
+ */
+ status = acpi_rs_create_resource_list (obj_desc, ret_buffer);
- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object was returned from _PRS\n"));
- return_ACPI_STATUS (AE_TYPE);
- }
+ /* on exit, we must delete the object returned by evaluate_object */
+
+ acpi_ut_remove_reference (obj_desc);
+ return_ACPI_STATUS (status);
+}
- /*
- * The return object will be a buffer, but check the
- * parameters. If the return object is not a buffer,
- * then the underlying AML code is corrupt or improperly
- * written..
- */
- if (ACPI_TYPE_BUFFER != ret_obj->common.type) {
- status = AE_AML_OPERAND_TYPE;
- goto cleanup;
- }
+
+/*******************************************************************************
+ *
+ * FUNCTION: acpi_rs_get_method_data
+ *
+ * PARAMETERS: Handle - a handle to the containing object
+ * ret_buffer - a pointer to a buffer structure for the
+ * results
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the _CRS or _PRS value of an
+ * object contained in an object specified by the handle passed in
+ *
+ * If the function fails an appropriate status will be returned
+ * and the contents of the callers buffer is undefined.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_rs_get_method_data (
+ acpi_handle handle,
+ char *path,
+ struct acpi_buffer *ret_buffer)
+{
+ union acpi_operand_object *obj_desc;
+ acpi_status status;
+
+
+ ACPI_FUNCTION_TRACE ("rs_get_method_data");
+
+
+ /* Parameters guaranteed valid by caller */
/*
- * Make the call to create a resource linked list from the
- * byte stream buffer that comes back from the _CRS method
- * execution.
+ * Execute the method, no parameters
*/
- status = acpi_rs_create_resource_list (ret_obj, ret_buffer->pointer,
- &buffer_space_needed);
+ status = acpi_ut_evaluate_object (handle, path, ACPI_BTYPE_BUFFER, &obj_desc);
+ if (ACPI_FAILURE (status)) {
+ return_ACPI_STATUS (status);
+ }
/*
- * Tell the user how much of the buffer we have used or is needed
- * and return the final status.
+ * Make the call to create a resource linked list from the
+ * byte stream buffer that comes back from the method
+ * execution.
*/
- ret_buffer->length = buffer_space_needed;
-
+ status = acpi_rs_create_resource_list (obj_desc, ret_buffer);
/* On exit, we must delete the object returned by evaluate_object */
-cleanup:
-
- acpi_ut_remove_reference (ret_obj);
+ acpi_ut_remove_reference (obj_desc);
return_ACPI_STATUS (status);
}
-
/*******************************************************************************
*
- * FUNCTION: Acpi_rs_set_srs_method_data
+ * FUNCTION: acpi_rs_set_srs_method_data
*
* PARAMETERS: Handle - a handle to the containing object
- * In_buffer - a pointer to a buffer structure of the
+ * in_buffer - a pointer to a buffer structure of the
* parameter
*
* RETURN: Status
@@ -306,55 +286,30 @@
acpi_status
acpi_rs_set_srs_method_data (
- acpi_handle handle,
- acpi_buffer *in_buffer)
+ acpi_handle handle,
+ struct acpi_buffer *in_buffer)
{
- acpi_operand_object *params[2];
- acpi_status status;
- u8 *byte_stream = NULL;
- u32 buffer_size_needed = 0;
+ union acpi_operand_object *params[2];
+ acpi_status status;
+ struct acpi_buffer buffer;
- FUNCTION_TRACE ("Rs_set_srs_method_data");
+ ACPI_FUNCTION_TRACE ("rs_set_srs_method_data");
- /* already validated params, so we won't repeat here */
+ /* Parameters guaranteed valid by caller */
/*
- * The In_buffer parameter will point to a linked list of
+ * The in_buffer parameter will point to a linked list of
* resource parameters. It needs to be formatted into a
- * byte stream to be sent in as an input parameter.
- */
- buffer_size_needed = 0;
-
- /*
- * First call is to get the buffer size needed
- */
- status = acpi_rs_create_byte_stream (in_buffer->pointer, byte_stream,
- &buffer_size_needed);
- /*
- * We expect a return of AE_BUFFER_OVERFLOW
- * if not, exit with the error
- */
- if (AE_BUFFER_OVERFLOW != status) {
- return_ACPI_STATUS (status);
- }
-
- /*
- * Allocate the buffer needed
+ * byte stream to be sent in as an input parameter to _SRS
+ *
+ * Convert the linked list into a byte stream
*/
- byte_stream = ACPI_MEM_CALLOCATE (buffer_size_needed);
- if (NULL == byte_stream) {
- return_ACPI_STATUS (AE_NO_MEMORY);
- }
-
- /*
- * Now call to convert the linked list into a byte stream
- */
- status = acpi_rs_create_byte_stream (in_buffer->pointer, byte_stream,
- &buffer_size_needed);
+ buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ status = acpi_rs_create_byte_stream (in_buffer->pointer, &buffer);
if (ACPI_FAILURE (status)) {
- goto cleanup;
+ return_ACPI_STATUS (status);
}
/*
@@ -362,28 +317,27 @@
*/
params[0] = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER);
if (!params[0]) {
- status = AE_NO_MEMORY;
- goto cleanup;
+ acpi_os_free (buffer.pointer);
+ return_ACPI_STATUS (AE_NO_MEMORY);
}
- params [1] = NULL;
/*
- * Set up the parameter object
+ * Set up the parameter object
*/
- params[0]->buffer.length = buffer_size_needed;
- params[0]->buffer.pointer = byte_stream;
+ params[0]->buffer.length = (u32) buffer.length;
+ params[0]->buffer.pointer = buffer.pointer;
+ params[0]->common.flags = AOPOBJ_DATA_VALID;
+ params[1] = NULL;
/*
* Execute the method, no return value
*/
status = acpi_ns_evaluate_relative (handle, "_SRS", params, NULL);
- acpi_ut_remove_reference (params[0]);
/*
- * Clean up and return the status from Acpi_ns_evaluate_relative
+ * Clean up and return the status from acpi_ns_evaluate_relative
*/
-cleanup:
-
+ acpi_ut_remove_reference (params[0]);
return_ACPI_STATUS (status);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)