patch-2.4.6 linux/drivers/acpi/resources/rscalc.c

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

diff -u --recursive --new-file v2.4.5/linux/drivers/acpi/resources/rscalc.c linux/drivers/acpi/resources/rscalc.c
@@ -1,8 +1,7 @@
 /*******************************************************************************
  *
- * Module Name: rscalc - Acpi_rs_calculate_byte_stream_length
- *                       Acpi_rs_calculate_list_length
- *              $Revision: 21 $
+ * Module Name: rscalc - Calculate stream and list lengths
+ *              $Revision: 30 $
  *
  ******************************************************************************/
 
@@ -30,7 +29,7 @@
 #include "amlcode.h"
 #include "acnamesp.h"
 
-#define _COMPONENT          RESOURCE_MANAGER
+#define _COMPONENT          ACPI_RESOURCES
 	 MODULE_NAME         ("rscalc")
 
 
@@ -40,9 +39,9 @@
  *
  * PARAMETERS:  Linked_list         - Pointer to the resource linked list
  *              Size_needed         - u32 pointer of the size buffer needed
- *                                      to properly return the parsed data
+ *                                    to properly return the parsed data
  *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
+ * RETURN:      Status
  *
  * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
  *              the size buffer needed to hold the linked list that conveys
@@ -52,214 +51,195 @@
 
 ACPI_STATUS
 acpi_rs_calculate_byte_stream_length (
-	RESOURCE                *linked_list,
+	ACPI_RESOURCE           *linked_list,
 	u32                     *size_needed)
 {
 	u32                     byte_stream_size_needed = 0;
 	u32                     segment_size;
-	EXTENDED_IRQ_RESOURCE   *ex_irq = NULL;
+	ACPI_RESOURCE_EXT_IRQ   *ex_irq = NULL;
 	u8                      done = FALSE;
 
 
 	while (!done) {
-
 		/*
-		 * Init the variable that will hold the size to add to the
-		 *  total.
+		 * Init the variable that will hold the size to add to the total.
 		 */
 		segment_size = 0;
 
-		switch (linked_list->id)
-		{
-		case irq:
+		switch (linked_list->id) {
+		case ACPI_RSTYPE_IRQ:
 			/*
 			 * IRQ Resource
-			 */
-			/*
 			 * For an IRQ Resource, Byte 3, although optional, will
-			 *  always be created - it holds IRQ information.
+			 * always be created - it holds IRQ information.
 			 */
 			segment_size = 4;
 			break;
 
-		case dma:
+		case ACPI_RSTYPE_DMA:
 			/*
 			 * DMA Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 3;
 			break;
 
-		case start_dependent_functions:
+		case ACPI_RSTYPE_START_DPF:
 			/*
 			 * Start Dependent Functions Resource
-			 */
-			/*
 			 * For a Start_dependent_functions Resource, Byte 1,
 			 * although optional, will always be created.
 			 */
 			segment_size = 2;
 			break;
 
-		case end_dependent_functions:
+		case ACPI_RSTYPE_END_DPF:
 			/*
 			 * End Dependent Functions Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 1;
 			break;
 
-		case io:
+		case ACPI_RSTYPE_IO:
 			/*
 			 * IO Port Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 8;
 			break;
 
-		case fixed_io:
+		case ACPI_RSTYPE_FIXED_IO:
 			/*
 			 * Fixed IO Port Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 4;
 			break;
 
-		case vendor_specific:
+		case ACPI_RSTYPE_VENDOR:
 			/*
 			 * Vendor Defined Resource
-			 */
-			/*
 			 * For a Vendor Specific resource, if the Length is
-			 *  between 1 and 7 it will be created as a Small
-			 *  Resource data type, otherwise it is a Large
-			 *  Resource data type.
+			 * between 1 and 7 it will be created as a Small
+			 * Resource data type, otherwise it is a Large
+			 * Resource data type.
 			 */
-			if(linked_list->data.vendor_specific.length > 7) {
+			if (linked_list->data.vendor_specific.length > 7) {
 				segment_size = 3;
 			}
 			else {
 				segment_size = 1;
 			}
-			segment_size +=
-				linked_list->data.vendor_specific.length;
+			segment_size += linked_list->data.vendor_specific.length;
 			break;
 
-		case end_tag:
+		case ACPI_RSTYPE_END_TAG:
 			/*
 			 * End Tag
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 2;
 			done = TRUE;
 			break;
 
-		case memory24:
+		case ACPI_RSTYPE_MEM24:
 			/*
 			 * 24-Bit Memory Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 12;
 			break;
 
-		case memory32:
+		case ACPI_RSTYPE_MEM32:
 			/*
 			 * 32-Bit Memory Range Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 20;
 			break;
 
-		case fixed_memory32:
+		case ACPI_RSTYPE_FIXED_MEM32:
 			/*
 			 * 32-Bit Fixed Memory Resource
-			 */
-			/*
 			 * For this resource the size is static
 			 */
 			segment_size = 12;
 			break;
 
-		case address16:
+		case ACPI_RSTYPE_ADDRESS16:
 			/*
 			 * 16-Bit Address Resource
-			 */
-			/*
 			 * The base size of this byte stream is 16. If a
-			 *  Resource Source string is not NULL, add 1 for
-			 *  the Index + the length of the null terminated
-			 *  string Resource Source + 1 for the null.
+			 * Resource Source string is not NULL, add 1 for
+			 * the Index + the length of the null terminated
+			 * string Resource Source + 1 for the null.
 			 */
 			segment_size = 16;
 
-			if(NULL != linked_list->data.address16.resource_source) {
+			if (NULL != linked_list->data.address16.resource_source.string_ptr) {
 				segment_size += (1 +
-					linked_list->data.address16.resource_source_string_length);
+					linked_list->data.address16.resource_source.string_length);
 			}
 			break;
 
-		case address32:
+		case ACPI_RSTYPE_ADDRESS32:
 			/*
 			 * 32-Bit Address Resource
-			 */
-			/*
 			 * The base size of this byte stream is 26. If a Resource
-			 *  Source string is not NULL, add 1 for the Index + the
-			 *  length of the null terminated string Resource Source +
-			 *  1 for the null.
+			 * Source string is not NULL, add 1 for the Index + the
+			 * length of the null terminated string Resource Source +
+			 * 1 for the null.
 			 */
 			segment_size = 26;
 
-			if(NULL != linked_list->data.address16.resource_source) {
+			if (NULL != linked_list->data.address32.resource_source.string_ptr) {
 				segment_size += (1 +
-					linked_list->data.address16.resource_source_string_length);
+					linked_list->data.address32.resource_source.string_length);
 			}
 			break;
 
-		case extended_irq:
+		case ACPI_RSTYPE_ADDRESS64:
 			/*
-			 * Extended IRQ Resource
+			 * 64-Bit Address Resource
+			 * The base size of this byte stream is 46. If a Resource
+			 * Source string is not NULL, add 1 for the Index + the
+			 * length of the null terminated string Resource Source +
+			 * 1 for the null.
 			 */
+			segment_size = 46;
+
+			if (NULL != linked_list->data.address64.resource_source.string_ptr) {
+				segment_size += (1 +
+					linked_list->data.address64.resource_source.string_length);
+			}
+			break;
+
+		case ACPI_RSTYPE_EXT_IRQ:
 			/*
+			 * Extended IRQ Resource
 			 * The base size of this byte stream is 9. This is for an
-			 *  Interrupt table length of 1.  For each additional
-			 *  interrupt, add 4.
+			 * Interrupt table length of 1.  For each additional
+			 * interrupt, add 4.
 			 * If a Resource Source string is not NULL, add 1 for the
-			 *  Index + the length of the null terminated string
-			 *  Resource Source + 1 for the null.
+			 * Index + the length of the null terminated string
+			 * Resource Source + 1 for the null.
 			 */
-			segment_size = 9;
+			segment_size = 9 +
+				((linked_list->data.extended_irq.number_of_interrupts - 1) * 4);
 
-			segment_size +=
-				(linked_list->data.extended_irq.number_of_interrupts -
-				 1) * 4;
-
-			if(NULL != ex_irq->resource_source) {
+			if (NULL != ex_irq->resource_source.string_ptr) {
 				segment_size += (1 +
-					linked_list->data.extended_irq.resource_source_string_length);
+					linked_list->data.extended_irq.resource_source.string_length);
 			}
 			break;
 
 		default:
 			/*
 			 * If we get here, everything is out of sync,
-			 *  so exit with an error
+			 * so exit with an error
 			 */
-			return (AE_AML_ERROR);
+			return (AE_AML_INVALID_RESOURCE_TYPE);
 			break;
 
 		} /* switch (Linked_list->Id) */
@@ -272,15 +252,14 @@
 		/*
 		 * Point to the next object
 		 */
-		linked_list = (RESOURCE *) ((NATIVE_UINT) linked_list +
-				  (NATIVE_UINT) linked_list->length);
+		linked_list = POINTER_ADD (ACPI_RESOURCE,
+				  linked_list, linked_list->length);
 	}
 
 	/*
 	 * This is the data the caller needs
 	 */
 	*size_needed = byte_stream_size_needed;
-
 	return (AE_OK);
 }
 
@@ -292,10 +271,10 @@
  * PARAMETERS:  Byte_stream_buffer      - Pointer to the resource byte stream
  *              Byte_stream_buffer_length - Size of Byte_stream_buffer
  *              Size_needed             - u32 pointer of the size buffer
- *                                          needed to properly return the
- *                                          parsed data
+ *                                        needed to properly return the
+ *                                        parsed data
  *
- * RETURN:      Status  AE_OK if okay, else a valid ACPI_STATUS code
+ * RETURN:      Status
  *
  * DESCRIPTION: Takes the resource byte stream and parses it once, calculating
  *              the size buffer needed to hold the linked list that conveys
@@ -325,402 +304,383 @@
 
 	while (bytes_parsed < byte_stream_buffer_length) {
 		/*
-		 * Look at the next byte in the stream
+		 * The next byte in the stream is the resource type
 		 */
-		resource_type = *byte_stream_buffer;
+		resource_type = acpi_rs_get_resource_type (*byte_stream_buffer);
 
-		/*
-		 * See if this is a small or large resource
-		 */
-		if(resource_type & 0x80) {
+		switch (resource_type) {
+		case RESOURCE_DESC_MEMORY_24:
 			/*
-			 * Large Resource Type
+			 * 24-Bit Memory Resource
 			 */
-			switch (resource_type)
-			{
-			case MEMORY_RANGE_24:
-				/*
-				 * 24-Bit Memory Resource
-				 */
-				bytes_consumed = 12;
+			bytes_consumed = 12;
 
-				structure_size = sizeof (MEMORY24_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA;
-				break;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_MEM24);
+			break;
 
-			case LARGE_VENDOR_DEFINED:
-				/*
-				 * Vendor Defined Resource
-				 */
-				buffer = byte_stream_buffer;
-				++buffer;
 
-				MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
-				bytes_consumed = temp16 + 3;
+		case RESOURCE_DESC_LARGE_VENDOR:
+			/*
+			 * Vendor Defined Resource
+			 */
+			buffer = byte_stream_buffer;
+			++buffer;
 
-				/*
-				 * Ensure a 32-bit boundary for the structure
-				 */
-				temp16 = (u16) ROUND_UP_TO_32_bITS (temp16);
+			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
+			bytes_consumed = temp16 + 3;
 
-				structure_size = sizeof (VENDOR_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (temp16 * sizeof (u8));
-				break;
+			/*
+			 * Ensure a 32-bit boundary for the structure
+			 */
+			temp16 = (u16) ROUND_UP_TO_32_bITS (temp16);
 
-			case MEMORY_RANGE_32:
-				/*
-				 * 32-Bit Memory Range Resource
-				 */
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_VENDOR) +
+					   (temp16 * sizeof (u8));
+			break;
 
-				bytes_consumed = 20;
 
-				structure_size = sizeof (MEMORY32_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA;
-				break;
+		case RESOURCE_DESC_MEMORY_32:
+			/*
+			 * 32-Bit Memory Range Resource
+			 */
 
-			case FIXED_MEMORY_RANGE_32:
-				/*
-				 * 32-Bit Fixed Memory Resource
-				 */
-				bytes_consumed = 12;
+			bytes_consumed = 20;
 
-				structure_size = sizeof(FIXED_MEMORY32_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA;
-				break;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_MEM32);
+			break;
 
-			case DWORD_ADDRESS_SPACE:
-				/*
-				 * 32-Bit Address Resource
-				 */
-				buffer = byte_stream_buffer;
 
-				++buffer;
-				MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
+		case RESOURCE_DESC_FIXED_MEMORY_32:
+			/*
+			 * 32-Bit Fixed Memory Resource
+			 */
+			bytes_consumed = 12;
 
-				bytes_consumed = temp16 + 3;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_FIXED_MEM32);
+			break;
 
-				/*
-				 * Resource Source Index and Resource Source are
-				 *  optional elements.  Check the length of the
-				 *  Bytestream.  If it is greater than 23, that
-				 *  means that an Index exists and is followed by
-				 *  a null termininated string.  Therefore, set
-				 *  the temp variable to the length minus the minimum
-				 *  byte stream length plus the byte for the Index to
-				 *  determine the size of the NULL terminiated string.
-				 */
-				if (23 < temp16) {
-					temp8 = (u8) (temp16 - 24);
-				}
-				else {
-					temp8 = 0;
-				}
 
-				/*
-				 * Ensure a 32-bit boundary for the structure
-				 */
-				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
+		case RESOURCE_DESC_QWORD_ADDRESS_SPACE:
+			/*
+			 * 64-Bit Address Resource
+			 */
+			buffer = byte_stream_buffer;
 
-				structure_size = sizeof (ADDRESS32_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (temp8 * sizeof (u8));
-				break;
+			++buffer;
+			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
 
-			case WORD_ADDRESS_SPACE:
-				/*
-				 * 16-Bit Address Resource
-				 */
-				buffer = byte_stream_buffer;
+			bytes_consumed = temp16 + 3;
 
-				++buffer;
-				MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
+			/*
+			 * Resource Source Index and Resource Source are
+			 * optional elements.  Check the length of the
+			 * Bytestream.  If it is greater than 43, that
+			 * means that an Index exists and is followed by
+			 * a null termininated string.  Therefore, set
+			 * the temp variable to the length minus the minimum
+			 * byte stream length plus the byte for the Index to
+			 * determine the size of the NULL terminiated string.
+			 */
+			if (43 < temp16) {
+				temp8 = (u8) (temp16 - 44);
+			}
+			else {
+				temp8 = 0;
+			}
 
-				bytes_consumed = temp16 + 3;
+			/*
+			 * Ensure a 64-bit boundary for the structure
+			 */
+			temp8 = (u8) ROUND_UP_TO_64_bITS (temp8);
 
-				/*
-				 * Resource Source Index and Resource Source are
-				 *  optional elements.  Check the length of the
-				 *  Bytestream.  If it is greater than 13, that
-				 *  means that an Index exists and is followed by
-				 *  a null termininated string.  Therefore, set
-				 *  the temp variable to the length minus the minimum
-				 *  byte stream length plus the byte for the Index to
-				 *  determine the size of the NULL terminiated string.
-				 */
-				if (13 < temp16) {
-					temp8 = (u8) (temp16 - 14);
-				}
-				else {
-					temp8 = 0;
-				}
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_ADDRESS64) +
+					   (temp8 * sizeof (u8));
+			break;
 
-				/*
-				 * Ensure a 32-bit boundry for the structure
-				 */
-				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
 
-				structure_size = sizeof (ADDRESS16_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (temp8 * sizeof (u8));
-				break;
+		case RESOURCE_DESC_DWORD_ADDRESS_SPACE:
+			/*
+			 * 32-Bit Address Resource
+			 */
+			buffer = byte_stream_buffer;
 
-			case EXTENDED_IRQ:
-				/*
-				 * Extended IRQ
-				 */
-				buffer = byte_stream_buffer;
+			++buffer;
+			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
 
-				++buffer;
-				MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
+			bytes_consumed = temp16 + 3;
 
-				bytes_consumed = temp16 + 3;
+			/*
+			 * Resource Source Index and Resource Source are
+			 * optional elements.  Check the length of the
+			 * Bytestream.  If it is greater than 23, that
+			 * means that an Index exists and is followed by
+			 * a null termininated string.  Therefore, set
+			 * the temp variable to the length minus the minimum
+			 * byte stream length plus the byte for the Index to
+			 * determine the size of the NULL terminiated string.
+			 */
+			if (23 < temp16) {
+				temp8 = (u8) (temp16 - 24);
+			}
+			else {
+				temp8 = 0;
+			}
 
-				/*
-				 * Point past the length field and the
-				 *  Interrupt vector flags to save off the
-				 *  Interrupt table length to the Temp8 variable.
-				 */
-				buffer += 3;
-				temp8 = *buffer;
+			/*
+			 * Ensure a 32-bit boundary for the structure
+			 */
+			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
 
-				/*
-				 * To compensate for multiple interrupt numbers,
-				 *  Add 4 bytes for each additional interrupts
-				 *  greater than 1
-				 */
-				additional_bytes = (u8) ((temp8 - 1) * 4);
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_ADDRESS32) +
+					   (temp8 * sizeof (u8));
+			break;
 
-				/*
-				 * Resource Source Index and Resource Source are
-				 *  optional elements.  Check the length of the
-				 *  Bytestream.  If it is greater than 9, that
-				 *  means that an Index exists and is followed by
-				 *  a null termininated string.  Therefore, set
-				 *  the temp variable to the length minus the minimum
-				 *  byte stream length plus the byte for the Index to
-				 *  determine the size of the NULL terminiated string.
-				 */
-				if (9 + additional_bytes < temp16) {
-					temp8 = (u8) (temp16 - (9 + additional_bytes));
-				}
 
-				else {
-					temp8 = 0;
-				}
+		case RESOURCE_DESC_WORD_ADDRESS_SPACE:
+			/*
+			 * 16-Bit Address Resource
+			 */
+			buffer = byte_stream_buffer;
 
-				/*
-				 * Ensure a 32-bit boundry for the structure
-				 */
-				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
+			++buffer;
+			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
 
-				structure_size = sizeof (EXTENDED_IRQ_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (additional_bytes * sizeof (u8)) +
-						  (temp8 * sizeof (u8));
+			bytes_consumed = temp16 + 3;
 
-				break;
+			/*
+			 * Resource Source Index and Resource Source are
+			 * optional elements.  Check the length of the
+			 * Bytestream.  If it is greater than 13, that
+			 * means that an Index exists and is followed by
+			 * a null termininated string.  Therefore, set
+			 * the temp variable to the length minus the minimum
+			 * byte stream length plus the byte for the Index to
+			 * determine the size of the NULL terminiated string.
+			 */
+			if (13 < temp16) {
+				temp8 = (u8) (temp16 - 14);
+			}
+			else {
+				temp8 = 0;
+			}
 
-/* TBD: [Future] 64-bit not currently supported */
-/*
-			case 0x8A:
-				break;
-*/
+			/*
+			 * Ensure a 32-bit boundary for the structure
+			 */
+			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
 
-			default:
-				/*
-				 * If we get here, everything is out of sync,
-				 *  so exit with an error
-				 */
-				return (AE_AML_ERROR);
-				break;
-			}
-		}
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_ADDRESS16) +
+					   (temp8 * sizeof (u8));
+			break;
 
-		else {
+
+		case RESOURCE_DESC_EXTENDED_XRUPT:
 			/*
-			 * Small Resource Type
-			 *  Only bits 7:3 are valid
+			 * Extended IRQ
 			 */
-			resource_type >>= 3;
+			buffer = byte_stream_buffer;
 
-			switch (resource_type)
-			{
-			case IRQ_FORMAT:
-				/*
-				 * IRQ Resource
-				 */
-				/*
-				 * Determine if it there are two or three
-				 *  trailing bytes
-				 */
-				buffer = byte_stream_buffer;
-				temp8 = *buffer;
+			++buffer;
+			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
 
-				if(temp8 & 0x01) {
-					bytes_consumed = 4;
-				}
+			bytes_consumed = temp16 + 3;
 
-				else {
-					bytes_consumed = 3;
-				}
+			/*
+			 * Point past the length field and the
+			 * Interrupt vector flags to save off the
+			 * Interrupt table length to the Temp8 variable.
+			 */
+			buffer += 3;
+			temp8 = *buffer;
 
-				/*
-				 * Point past the descriptor
-				 */
-				++buffer;
+			/*
+			 * To compensate for multiple interrupt numbers, add 4 bytes for
+			 * each additional interrupts greater than 1
+			 */
+			additional_bytes = (u8) ((temp8 - 1) * 4);
 
-				/*
-				 * Look at the number of bits set
-				 */
-				MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
+			/*
+			 * Resource Source Index and Resource Source are
+			 * optional elements.  Check the length of the
+			 * Bytestream.  If it is greater than 9, that
+			 * means that an Index exists and is followed by
+			 * a null termininated string.  Therefore, set
+			 * the temp variable to the length minus the minimum
+			 * byte stream length plus the byte for the Index to
+			 * determine the size of the NULL terminiated string.
+			 */
+			if (9 + additional_bytes < temp16) {
+				temp8 = (u8) (temp16 - (9 + additional_bytes));
+			}
 
-				for (index = 0; index < 16; index++) {
-					if (temp16 & 0x1) {
-						++number_of_interrupts;
-					}
+			else {
+				temp8 = 0;
+			}
 
-					temp16 >>= 1;
-				}
+			/*
+			 * Ensure a 32-bit boundary for the structure
+			 */
+			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
 
-				structure_size = sizeof (IO_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (number_of_interrupts * sizeof (u32));
-				break;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_EXT_IRQ) +
+					   (additional_bytes * sizeof (u8)) +
+					   (temp8 * sizeof (u8));
+			break;
 
 
-			case DMA_FORMAT:
+		case RESOURCE_DESC_IRQ_FORMAT:
+			/*
+			 * IRQ Resource.
+			 * Determine if it there are two or three trailing bytes
+			 */
+			buffer = byte_stream_buffer;
+			temp8 = *buffer;
 
-				/*
-				 * DMA Resource
-				 */
-				buffer = byte_stream_buffer;
+			if(temp8 & 0x01) {
+				bytes_consumed = 4;
+			}
 
+			else {
 				bytes_consumed = 3;
+			}
 
-				/*
-				 * Point past the descriptor
-				 */
-				++buffer;
-
-				/*
-				 * Look at the number of bits set
-				 */
-				temp8 = *buffer;
+			/*
+			 * Point past the descriptor
+			 */
+			++buffer;
 
-				for(index = 0; index < 8; index++) {
-					if(temp8 & 0x1) {
-						++number_of_channels;
-					}
+			/*
+			 * Look at the number of bits set
+			 */
+			MOVE_UNALIGNED16_TO_16 (&temp16, buffer);
 
-					temp8 >>= 1;
+			for (index = 0; index < 16; index++) {
+				if (temp16 & 0x1) {
+					++number_of_interrupts;
 				}
 
-				structure_size = sizeof (DMA_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (number_of_channels * sizeof (u32));
-				break;
+				temp16 >>= 1;
+			}
 
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_IO) +
+					   (number_of_interrupts * sizeof (u32));
+			break;
 
-			case START_DEPENDENT_TAG:
 
-				/*
-				 * Start Dependent Functions Resource
-				 */
-				/*
-				 * Determine if it there are two or three trailing bytes
-				 */
-				buffer = byte_stream_buffer;
-				temp8 = *buffer;
+		case RESOURCE_DESC_DMA_FORMAT:
+			/*
+			 * DMA Resource
+			 */
+			buffer = byte_stream_buffer;
+			bytes_consumed = 3;
 
-				if(temp8 & 0x01) {
-					bytes_consumed = 2;
-				}
-				else {
-					bytes_consumed = 1;
+			/*
+			 * Point past the descriptor
+			 */
+			++buffer;
+
+			/*
+			 * Look at the number of bits set
+			 */
+			temp8 = *buffer;
+
+			for(index = 0; index < 8; index++) {
+				if(temp8 & 0x1) {
+					++number_of_channels;
 				}
 
+				temp8 >>= 1;
+			}
 
-				structure_size =
-						sizeof (START_DEPENDENT_FUNCTIONS_RESOURCE) +
-						RESOURCE_LENGTH_NO_DATA;
-				break;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_DMA) +
+					   (number_of_channels * sizeof (u32));
+			break;
 
 
-			case END_DEPENDENT_TAG:
+		case RESOURCE_DESC_START_DEPENDENT:
+			/*
+			 * Start Dependent Functions Resource
+			 * Determine if it there are two or three trailing bytes
+			 */
+			buffer = byte_stream_buffer;
+			temp8 = *buffer;
 
-				/*
-				 * End Dependent Functions Resource
-				 */
+			if(temp8 & 0x01) {
+				bytes_consumed = 2;
+			}
+			else {
 				bytes_consumed = 1;
-				structure_size = RESOURCE_LENGTH;
-				break;
-
+			}
 
-			case IO_PORT_DESCRIPTOR:
-				/*
-				 * IO Port Resource
-				 */
-				bytes_consumed = 8;
-				structure_size = sizeof (IO_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA;
-				break;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_START_DPF);
+			break;
 
 
-			case FIXED_LOCATION_IO_DESCRIPTOR:
+		case RESOURCE_DESC_END_DEPENDENT:
+			/*
+			 * End Dependent Functions Resource
+			 */
+			bytes_consumed = 1;
+			structure_size = ACPI_RESOURCE_LENGTH;
+			break;
 
-				/*
-				 * Fixed IO Port Resource
-				 */
-				bytes_consumed = 4;
-				structure_size = sizeof (FIXED_IO_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA;
-				break;
 
+		case RESOURCE_DESC_IO_PORT:
+			/*
+			 * IO Port Resource
+			 */
+			bytes_consumed = 8;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_IO);
+			break;
 
-			case SMALL_VENDOR_DEFINED:
 
-				/*
-				 * Vendor Specific Resource
-				 */
-				buffer = byte_stream_buffer;
+		case RESOURCE_DESC_FIXED_IO_PORT:
+			/*
+			 * Fixed IO Port Resource
+			 */
+			bytes_consumed = 4;
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_FIXED_IO);
+			break;
 
-				temp8 = *buffer;
-				temp8 = (u8) (temp8 & 0x7);
-				bytes_consumed = temp8 + 1;
 
-				/*
-				 * Ensure a 32-bit boundry for the structure
-				 */
-				temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
-				structure_size = sizeof (VENDOR_RESOURCE) +
-						  RESOURCE_LENGTH_NO_DATA +
-						  (temp8 * sizeof (u8));
-				break;
+		case RESOURCE_DESC_SMALL_VENDOR:
+			/*
+			 * Vendor Specific Resource
+			 */
+			buffer = byte_stream_buffer;
 
+			temp8 = *buffer;
+			temp8 = (u8) (temp8 & 0x7);
+			bytes_consumed = temp8 + 1;
 
-			case END_TAG:
+			/*
+			 * Ensure a 32-bit boundary for the structure
+			 */
+			temp8 = (u8) ROUND_UP_TO_32_bITS (temp8);
+			structure_size = SIZEOF_RESOURCE (ACPI_RESOURCE_VENDOR) +
+					   (temp8 * sizeof (u8));
+			break;
 
-				/*
-				 * End Tag
-				 */
-				bytes_consumed = 2;
-				structure_size = RESOURCE_LENGTH;
-				byte_stream_buffer_length = bytes_parsed;
-				break;
 
+		case RESOURCE_DESC_END_TAG:
+			/*
+			 * End Tag
+			 */
+			bytes_consumed = 2;
+			structure_size = ACPI_RESOURCE_LENGTH;
+			byte_stream_buffer_length = bytes_parsed;
+			break;
 
-			default:
-				/*
-				 * If we get here, everything is out of sync,
-				 *  so exit with an error
-				 */
-				return (AE_AML_ERROR);
-				break;
 
-			} /* switch */
+		default:
+			/*
+			 * If we get here, everything is out of sync,
+			 *  so exit with an error
+			 */
+			return (AE_AML_INVALID_RESOURCE_TYPE);
+			break;
+		}
 
-		}  /* if(Resource_type & 0x80) */
 
 		/*
 		 * Update the return value and counter
@@ -732,14 +692,13 @@
 		 * Set the byte stream to point to the next resource
 		 */
 		byte_stream_buffer += bytes_consumed;
-
 	}
 
+
 	/*
 	 * This is the data the caller needs
 	 */
 	*size_needed = buffer_size;
-
 	return (AE_OK);
 }
 
@@ -750,14 +709,14 @@
  *
  * PARAMETERS:  Package_object          - Pointer to the package object
  *              Buffer_size_needed      - u32 pointer of the size buffer
- *                                          needed to properly return the
- *                                          parsed data
+ *                                        needed to properly return the
+ *                                        parsed data
  *
- * RETURN:      Status  AE_OK
+ * RETURN:      Status
  *
  * DESCRIPTION: Given a package representing a PCI routing table, this
- *                calculates the size of the corresponding linked list of
- *                descriptions.
+ *              calculates the size of the corresponding linked list of
+ *              descriptions.
  *
  ******************************************************************************/
 
@@ -785,11 +744,6 @@
 	 * The minus one is to subtract the size of the u8 Source[1]
 	 * member because it is added below.
 	 *
-	 * NOTE: The Number_of_elements is incremented by one to add an end
-	 * table structure that is essentially a structure of zeros.
-	 */
-
-	/*
 	 * But each PRT_ENTRY structure has a pointer to a string and
 	 * the size of that string must be found.
 	 */
@@ -815,8 +769,7 @@
 		for (table_index = 0; table_index < 4 && !name_found; table_index++) {
 			if ((ACPI_TYPE_STRING == (*sub_object_list)->common.type) ||
 				((INTERNAL_TYPE_REFERENCE == (*sub_object_list)->common.type) &&
-					((*sub_object_list)->reference.op_code == AML_NAMEPATH_OP)))
-			{
+					((*sub_object_list)->reference.opcode == AML_INT_NAMEPATH_OP))) {
 				name_found = TRUE;
 			}
 
@@ -841,20 +794,21 @@
 				 */
 				temp_size_needed += (*sub_object_list)->string.length;
 			}
+
 			else {
-				temp_size_needed += acpi_ns_get_pathname_length ((*sub_object_list)->reference.node);
+				temp_size_needed += acpi_ns_get_pathname_length (
+						   (*sub_object_list)->reference.node);
 			}
 		}
 
 		else {
 			/*
 			 * If no name was found, then this is a NULL, which is
-			 *  translated as a u32 zero.
+			 * translated as a u32 zero.
 			 */
-			temp_size_needed += sizeof(u32);
+			temp_size_needed += sizeof (u32);
 		}
 
-
 		/* Round up the size since each element must be aligned */
 
 		temp_size_needed = ROUND_UP_TO_64_bITS (temp_size_needed);
@@ -866,7 +820,9 @@
 	}
 
 
-	*buffer_size_needed = temp_size_needed;
-
+	/*
+	 * Adding an extra element to the end of the list, essentially a NULL terminator
+	 */
+	*buffer_size_needed = temp_size_needed + sizeof (PCI_ROUTING_TABLE);
 	return (AE_OK);
 }

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