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
- Lines: 1128
- Date:
Wed Jun 20 17:47:40 2001
- Orig file:
v2.4.5/linux/drivers/acpi/resources/rscalc.c
- Orig date:
Fri Feb 9 11:45:58 2001
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)