patch-2.4.0-test3 linux/drivers/acpi/resources/rslist.c

Next file: linux/drivers/acpi/resources/rsmemory.c
Previous file: linux/drivers/acpi/resources/rsirq.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test2/linux/drivers/acpi/resources/rslist.c linux/drivers/acpi/resources/rslist.c
@@ -0,0 +1,506 @@
+/******************************************************************************
+ *
+ * Module Name: rslist - Acpi_rs_byte_stream_to_list
+ *                       Acpi_list_to_byte_stream
+ *
+ *****************************************************************************/
+
+/*
+ *  Copyright (C) 2000 R. Byron Moore
+ *
+ *  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
+ */
+
+
+#include "acpi.h"
+#include "resource.h"
+
+#define _COMPONENT          RESOURCE_MANAGER
+	 MODULE_NAME         ("rslist");
+
+
+/***************************************************************************
+ * FUNCTION:    Acpi_rs_byte_stream_to_list
+ *
+ * PARAMETERS:
+ *              Byte_stream_buffer      - Pointer to the resource byte stream
+ *              Byte_stream_buffer_length - Length of Byte_stream_buffer
+ *              Output_buffer           - Pointer to the buffer that will
+ *                                          contain the output structures
+ *
+ * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
+ *
+ * DESCRIPTION: Takes the resource byte stream and parses it, creating a
+ *              linked list of resources in the caller's output buffer
+ *
+ ***************************************************************************/
+
+ACPI_STATUS
+acpi_rs_byte_stream_to_list (
+	u8                      *byte_stream_buffer,
+	u32                     byte_stream_buffer_length,
+	u8                      **output_buffer)
+{
+	ACPI_STATUS             status = AE_UNKNOWN_STATUS;
+	u32                     bytes_parsed = 0;
+	u8                      resource_type = 0;
+	u32                     bytes_consumed = 0;
+	u8                      **buffer = output_buffer;
+	u32                     structure_size = 0;
+	u8                      end_tag_processed = FALSE;
+
+
+	while (bytes_parsed < byte_stream_buffer_length &&
+			FALSE == end_tag_processed)
+	{
+		/*
+		 * Look at the next byte in the stream
+		 */
+		resource_type = *byte_stream_buffer;
+
+		/*
+		 * See if this is a small or large resource
+		 */
+		if(resource_type & 0x80) {
+			/*
+			 * Large Resource Type
+			 */
+			switch (resource_type)
+			{
+			case MEMORY_RANGE_24:
+				/*
+				 * 24-Bit Memory Resource
+				 */
+				status = acpi_rs_memory24_resource(byte_stream_buffer,
+						   &bytes_consumed,
+						   buffer,
+						   &structure_size);
+
+				break;
+
+			case LARGE_VENDOR_DEFINED:
+				/*
+				 * Vendor Defined Resource
+				 */
+				status = acpi_rs_vendor_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case MEMORY_RANGE_32:
+				/*
+				 * 32-Bit Memory Range Resource
+				 */
+				status = acpi_rs_memory32_range_resource(byte_stream_buffer,
+						  &bytes_consumed,
+						  buffer,
+						  &structure_size);
+
+				break;
+
+			case FIXED_MEMORY_RANGE_32:
+				/*
+				 * 32-Bit Fixed Memory Resource
+				 */
+				status = acpi_rs_fixed_memory32_resource(byte_stream_buffer,
+						  &bytes_consumed,
+						  buffer,
+						  &structure_size);
+
+				break;
+
+			case DWORD_ADDRESS_SPACE:
+				/*
+				 * 32-Bit Address Resource
+				 */
+				status = acpi_rs_address32_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case WORD_ADDRESS_SPACE:
+				/*
+				 * 16-Bit Address Resource
+				 */
+				status = acpi_rs_address16_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case EXTENDED_IRQ:
+				/*
+				 * Extended IRQ
+				 */
+				status = acpi_rs_extended_irq_resource(byte_stream_buffer,
+						   &bytes_consumed,
+						   buffer,
+						   &structure_size);
+
+				break;
+
+/* 64-bit not currently supported */
+/*
+			case 0x8A:
+				break;
+*/
+
+			default:
+				/*
+				 * If we get here, everything is out of sync,
+				 *  so exit with an error
+				 */
+				return (AE_ERROR);
+				break;
+			}
+		}
+
+		else {
+			/*
+			 * Small Resource Type
+			 *  Only bits 7:3 are valid
+			 */
+			resource_type >>= 3;
+
+			switch(resource_type)
+			{
+			case IRQ_FORMAT:
+				/*
+				 * IRQ Resource
+				 */
+				status = acpi_rs_irq_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case DMA_FORMAT:
+				/*
+				 * DMA Resource
+				 */
+				status = acpi_rs_dma_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case START_DEPENDENT_TAG:
+				/*
+				 * Start Dependent Functions Resource
+				 */
+				status = acpi_rs_start_dependent_functions_resource(byte_stream_buffer,
+						   &bytes_consumed,
+						   buffer,
+						   &structure_size);
+
+				break;
+
+			case END_DEPENDENT_TAG:
+				/*
+				 * End Dependent Functions Resource
+				 */
+				status = acpi_rs_end_dependent_functions_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case IO_PORT_DESCRIPTOR:
+				/*
+				 * IO Port Resource
+				 */
+				status = acpi_rs_io_resource(byte_stream_buffer,
+						   &bytes_consumed,
+						   buffer,
+						   &structure_size);
+
+				break;
+
+			case FIXED_LOCATION_IO_DESCRIPTOR:
+				/*
+				 * Fixed IO Port Resource
+				 */
+				status = acpi_rs_fixed_io_resource(byte_stream_buffer,
+						  &bytes_consumed,
+						  buffer,
+						  &structure_size);
+
+				break;
+
+			case SMALL_VENDOR_DEFINED:
+				/*
+				 * Vendor Specific Resource
+				 */
+				status = acpi_rs_vendor_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+
+				break;
+
+			case END_TAG:
+				/*
+				 * End Tag
+				 */
+				status = acpi_rs_end_tag_resource(byte_stream_buffer,
+						 &bytes_consumed,
+						 buffer,
+						 &structure_size);
+				end_tag_processed = TRUE;
+
+				break;
+
+			default:
+				/*
+				 * If we get here, everything is out of sync,
+				 *  so exit with an error
+				 */
+				return (AE_ERROR);
+				break;
+
+			} /* switch */
+		}  /* if(Resource_type & 0x80) */
+
+		/*
+		 * Update the return value and counter
+		 */
+		bytes_parsed += bytes_consumed;
+
+		/*
+		 * Set the byte stream to point to the next resource
+		 */
+		byte_stream_buffer += bytes_consumed;
+
+		/*
+		 * Set the Buffer to the next structure
+		 */
+		*buffer += structure_size;
+
+	} /*  while (Bytes_parsed < Byte_stream_buffer_length &&
+		  FALSE == End_tag_processed) */
+
+	/*
+	 * Check the reason for exiting the while loop
+	 */
+	if (byte_stream_buffer_length != bytes_parsed || TRUE != end_tag_processed) {
+		return (AE_ERROR);
+	}
+
+	return (AE_OK);
+
+} /* Acpi_rs_byte_stream_to_list */
+
+
+/***************************************************************************
+ * FUNCTION:    Acpi_rs_list_to_byte_stream
+ *
+ * PARAMETERS:
+ *              Linked_list             - Pointer to the resource linked list
+ *              Byte_steam_size_needed  - Calculated size of the byte stream
+ *                                          needed from calling
+ *                                          Acpi_rs_calculate_byte_stream_length()
+ *                                          The size of the Output_buffer is
+ *                                          guaranteed to be >=
+ *                                          Byte_stream_size_needed
+ *              Output_buffer           - Pointer to the buffer that will
+ *                                          contain the byte stream
+ *
+ * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
+ *
+ * DESCRIPTION: Takes the resource linked list and parses it, creating a
+ *              byte stream of resources in the caller's output buffer
+ *
+ ***************************************************************************/
+
+ACPI_STATUS
+acpi_rs_list_to_byte_stream (
+	RESOURCE                *linked_list,
+	u32                     byte_stream_size_needed,
+	u8                      **output_buffer)
+{
+	ACPI_STATUS             status = AE_UNKNOWN_STATUS;
+	u8                      *buffer = *output_buffer;
+	u32                     bytes_consumed = 0;
+	u8                      done = FALSE;
+
+
+	while (!done) {
+		switch (linked_list->id)
+		{
+		case irq:
+			/*
+			 * IRQ Resource
+			 */
+			status = acpi_rs_irq_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+			break;
+
+		case dma:
+			/*
+			 * DMA Resource
+			 */
+			status = acpi_rs_dma_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+			break;
+
+		case start_dependent_functions:
+			/*
+			 * Start Dependent Functions Resource
+			 */
+			status = acpi_rs_start_dependent_functions_stream (linked_list,
+					  &buffer,
+					  &bytes_consumed);
+			break;
+
+		case end_dependent_functions:
+			/*
+			 * End Dependent Functions Resource
+			 */
+			status = acpi_rs_end_dependent_functions_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+			break;
+
+		case io:
+			/*
+			 * IO Port Resource
+			 */
+			status = acpi_rs_io_stream (linked_list,
+					  &buffer,
+					  &bytes_consumed);
+			break;
+
+		case fixed_io:
+			/*
+			 * Fixed IO Port Resource
+			 */
+			status = acpi_rs_fixed_io_stream (linked_list,
+					 &buffer,
+					 &bytes_consumed);
+			break;
+
+		case vendor_specific:
+			/*
+			 * Vendor Defined Resource
+			 */
+			status = acpi_rs_vendor_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+			break;
+
+		case end_tag:
+			/*
+			 * End Tag
+			 */
+			status = acpi_rs_end_tag_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+
+			/*
+			 * An End Tag indicates the end of the Resource Template
+			 */
+			done = TRUE;
+			break;
+
+		case memory24:
+			/*
+			 * 24-Bit Memory Resource
+			 */
+			status = acpi_rs_memory24_stream (linked_list,
+					  &buffer,
+					  &bytes_consumed);
+			break;
+
+		case memory32:
+			/*
+			 * 32-Bit Memory Range Resource
+			 */
+			status = acpi_rs_memory32_range_stream (linked_list,
+					 &buffer,
+					 &bytes_consumed);
+			break;
+
+		case fixed_memory32:
+			/*
+			 * 32-Bit Fixed Memory Resource
+			 */
+			status = acpi_rs_fixed_memory32_stream (linked_list,
+					 &buffer,
+					 &bytes_consumed);
+			break;
+
+		case address16:
+			/*
+			 * 16-Bit Address Descriptor Resource
+			 */
+			status = acpi_rs_address16_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+			break;
+
+		case address32:
+			/*
+			 * 32-Bit Address Descriptor Resource
+			 */
+			status = acpi_rs_address32_stream (linked_list,
+					   &buffer,
+					   &bytes_consumed);
+			break;
+
+		case extended_irq:
+			/*
+			 * Extended IRQ Resource
+			 */
+			status = acpi_rs_extended_irq_stream (linked_list,
+					  &buffer,
+					  &bytes_consumed);
+			break;
+
+		default:
+			/*
+			 * If we get here, everything is out of sync,
+			 *  so exit with an error
+			 */
+			return (AE_BAD_DATA);
+			break;
+
+		} /* switch (Linked_list->Id) */
+
+		/*
+		 * Set the Buffer to point to the open byte
+		 */
+		buffer += bytes_consumed;
+
+		/*
+		 * Point to the next object
+		 */
+		linked_list = (RESOURCE *) ((NATIVE_UINT) linked_list +
+				  (NATIVE_UINT) linked_list->length);
+	}
+
+	return  (AE_OK);
+
+} /* Acpi_rs_list_to_byte_stream */
+

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)