patch-2.4.6 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
- Lines: 697
- Date:
Wed Jun 20 17:47:40 2001
- Orig file:
v2.4.5/linux/drivers/acpi/resources/rslist.c
- Orig date:
Fri Feb 9 11:45:58 2001
diff -u --recursive --new-file v2.4.5/linux/drivers/acpi/resources/rslist.c linux/drivers/acpi/resources/rslist.c
@@ -1,8 +1,7 @@
/*******************************************************************************
*
- * Module Name: rslist - Acpi_rs_byte_stream_to_list
- * Acpi_list_to_byte_stream
- * $Revision: 11 $
+ * Module Name: rslist - Linked list utilities
+ * $Revision: 17 $
*
******************************************************************************/
@@ -28,20 +27,64 @@
#include "acpi.h"
#include "acresrc.h"
-#define _COMPONENT RESOURCE_MANAGER
+#define _COMPONENT ACPI_RESOURCES
MODULE_NAME ("rslist")
/*******************************************************************************
*
+ * FUNCTION: Acpi_rs_get_resource_type
+ *
+ * PARAMETERS: Resource_start_byte - Byte 0 of a resource descriptor
+ *
+ * RETURN: The Resource Type (Name) with no extraneous bits
+ *
+ * DESCRIPTION: Extract the Resource Type/Name from the first byte of
+ * a resource descriptor.
+ *
+ ******************************************************************************/
+
+u8
+acpi_rs_get_resource_type (
+ u8 resource_start_byte)
+{
+
+ /*
+ * Determine if this is a small or large resource
+ */
+ switch (resource_start_byte & RESOURCE_DESC_TYPE_MASK) {
+ case RESOURCE_DESC_TYPE_SMALL:
+
+ /*
+ * Small Resource Type -- Only bits 6:3 are valid
+ */
+ return ((u8) (resource_start_byte & RESOURCE_DESC_SMALL_MASK));
+ break;
+
+
+ case RESOURCE_DESC_TYPE_LARGE:
+
+ /*
+ * Large Resource Type -- All bits are valid
+ */
+ return (resource_start_byte);
+ break;
+ }
+
+ return (0xFF);
+}
+
+
+/*******************************************************************************
+ *
* 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
+ * contain the output structures
*
- * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code
+ * RETURN: Status
*
* DESCRIPTION: Takes the resource byte stream and parses it, creating a
* linked list of resources in the caller's output buffer
@@ -64,223 +107,170 @@
while (bytes_parsed < byte_stream_buffer_length &&
- FALSE == end_tag_processed)
- {
+ FALSE == end_tag_processed) {
/*
- * 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
- */
- 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);
+ status = acpi_rs_memory24_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
- break;
-/* TBD: [Future] 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_AML_ERROR);
- break;
- }
- }
+ case RESOURCE_DESC_LARGE_VENDOR:
+ /*
+ * Vendor Defined Resource
+ */
+ status = acpi_rs_vendor_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_MEMORY_32:
+ /*
+ * 32-Bit Memory Range Resource
+ */
+ status = acpi_rs_memory32_range_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_FIXED_MEMORY_32:
+ /*
+ * 32-Bit Fixed Memory Resource
+ */
+ status = acpi_rs_fixed_memory32_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_QWORD_ADDRESS_SPACE:
+ /*
+ * 64-Bit Address Resource
+ */
+ status = acpi_rs_address64_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_DWORD_ADDRESS_SPACE:
+ /*
+ * 32-Bit Address Resource
+ */
+ status = acpi_rs_address32_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_WORD_ADDRESS_SPACE:
+ /*
+ * 16-Bit Address Resource
+ */
+ status = acpi_rs_address16_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_EXTENDED_XRUPT:
+ /*
+ * Extended IRQ
+ */
+ status = acpi_rs_extended_irq_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_IRQ_FORMAT:
+ /*
+ * IRQ Resource
+ */
+ status = acpi_rs_irq_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_DMA_FORMAT:
+ /*
+ * DMA Resource
+ */
+ status = acpi_rs_dma_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_START_DEPENDENT:
+ /*
+ * Start Dependent Functions Resource
+ */
+ status = acpi_rs_start_dependent_functions_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_END_DEPENDENT:
+ /*
+ * End Dependent Functions Resource
+ */
+ status = acpi_rs_end_dependent_functions_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_IO_PORT:
+ /*
+ * IO Port Resource
+ */
+ status = acpi_rs_io_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ case RESOURCE_DESC_FIXED_IO_PORT:
+ /*
+ * Fixed IO Port Resource
+ */
+ status = acpi_rs_fixed_io_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
- else {
+ case RESOURCE_DESC_SMALL_VENDOR:
/*
- * Small Resource Type
- * Only bits 7:3 are valid
+ * Vendor Specific Resource
*/
- resource_type >>= 3;
+ status = acpi_rs_vendor_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
- 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_AML_ERROR);
- break;
- } /* switch */
- } /* end else */
+ case RESOURCE_DESC_END_TAG:
+ /*
+ * End Tag
+ */
+ end_tag_processed = TRUE;
+ status = acpi_rs_end_tag_resource (byte_stream_buffer,
+ &bytes_consumed, buffer, &structure_size);
+ break;
+
+
+ default:
+ /*
+ * Invalid/Unknowns resource type
+ */
+ status = AE_AML_ERROR;
+ break;
+ }
+
+
+ if (!ACPI_SUCCESS(status)) {
+ return (status);
+ }
/*
* Update the return value and counter
@@ -316,15 +306,15 @@
*
* 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
+ * 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
+ * contain the byte stream
*
- * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code
+ * RETURN: Status
*
* DESCRIPTION: Takes the resource linked list and parses it, creating a
* byte stream of resources in the caller's output buffer
@@ -333,7 +323,7 @@
ACPI_STATUS
acpi_rs_list_to_byte_stream (
- RESOURCE *linked_list,
+ ACPI_RESOURCE *linked_list,
u32 byte_stream_size_needed,
u8 **output_buffer)
{
@@ -344,78 +334,63 @@
while (!done) {
- switch (linked_list->id)
- {
- case irq:
+ switch (linked_list->id) {
+ case ACPI_RSTYPE_IRQ:
/*
* IRQ Resource
*/
- status = acpi_rs_irq_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_irq_stream (linked_list, &buffer, &bytes_consumed);
break;
- case dma:
+ case ACPI_RSTYPE_DMA:
/*
* DMA Resource
*/
- status = acpi_rs_dma_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_dma_stream (linked_list, &buffer, &bytes_consumed);
break;
- case start_dependent_functions:
+ case ACPI_RSTYPE_START_DPF:
/*
* Start Dependent Functions Resource
*/
status = acpi_rs_start_dependent_functions_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ &buffer, &bytes_consumed);
break;
- case end_dependent_functions:
+ case ACPI_RSTYPE_END_DPF:
/*
* End Dependent Functions Resource
*/
status = acpi_rs_end_dependent_functions_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ &buffer, &bytes_consumed);
break;
- case io:
+ case ACPI_RSTYPE_IO:
/*
* IO Port Resource
*/
- status = acpi_rs_io_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_io_stream (linked_list, &buffer, &bytes_consumed);
break;
- case fixed_io:
+ case ACPI_RSTYPE_FIXED_IO:
/*
* Fixed IO Port Resource
*/
- status = acpi_rs_fixed_io_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_fixed_io_stream (linked_list, &buffer, &bytes_consumed);
break;
- case vendor_specific:
+ case ACPI_RSTYPE_VENDOR:
/*
* Vendor Defined Resource
*/
- status = acpi_rs_vendor_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_vendor_stream (linked_list, &buffer, &bytes_consumed);
break;
- case end_tag:
+ case ACPI_RSTYPE_END_TAG:
/*
* End Tag
*/
- status = acpi_rs_end_tag_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_end_tag_stream (linked_list, &buffer, &bytes_consumed);
/*
* An End Tag indicates the end of the Resource Template
@@ -423,58 +398,59 @@
done = TRUE;
break;
- case memory24:
+ case ACPI_RSTYPE_MEM24:
/*
* 24-Bit Memory Resource
*/
- status = acpi_rs_memory24_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_memory24_stream (linked_list, &buffer, &bytes_consumed);
break;
- case memory32:
+ case ACPI_RSTYPE_MEM32:
/*
* 32-Bit Memory Range Resource
*/
- status = acpi_rs_memory32_range_stream (linked_list,
- &buffer,
+ status = acpi_rs_memory32_range_stream (linked_list, &buffer,
&bytes_consumed);
break;
- case fixed_memory32:
+ case ACPI_RSTYPE_FIXED_MEM32:
/*
* 32-Bit Fixed Memory Resource
*/
- status = acpi_rs_fixed_memory32_stream (linked_list,
- &buffer,
+ status = acpi_rs_fixed_memory32_stream (linked_list, &buffer,
&bytes_consumed);
break;
- case address16:
+ case ACPI_RSTYPE_ADDRESS16:
/*
* 16-Bit Address Descriptor Resource
*/
- status = acpi_rs_address16_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_address16_stream (linked_list, &buffer,
+ &bytes_consumed);
break;
- case address32:
+ case ACPI_RSTYPE_ADDRESS32:
/*
* 32-Bit Address Descriptor Resource
*/
- status = acpi_rs_address32_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_address32_stream (linked_list, &buffer,
+ &bytes_consumed);
+ break;
+
+ case ACPI_RSTYPE_ADDRESS64:
+ /*
+ * 64-Bit Address Descriptor Resource
+ */
+ status = acpi_rs_address64_stream (linked_list, &buffer,
+ &bytes_consumed);
break;
- case extended_irq:
+ case ACPI_RSTYPE_EXT_IRQ:
/*
* Extended IRQ Resource
*/
- status = acpi_rs_extended_irq_stream (linked_list,
- &buffer,
- &bytes_consumed);
+ status = acpi_rs_extended_irq_stream (linked_list, &buffer,
+ &bytes_consumed);
break;
default:
@@ -482,11 +458,16 @@
* If we get here, everything is out of sync,
* so exit with an error
*/
- return (AE_BAD_DATA);
+ status = AE_BAD_DATA;
break;
} /* switch (Linked_list->Id) */
+
+ if (!ACPI_SUCCESS(status)) {
+ return (status);
+ }
+
/*
* Set the Buffer to point to the open byte
*/
@@ -495,10 +476,10 @@
/*
* 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);
}
- return (AE_OK);
+ return (AE_OK);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)