Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / acpi / resources / rsmemory.c
index 7c935ae..a513193 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGES.
  */
 
-
 #include <acpi/acpi.h>
 #include <acpi/acresrc.h>
 
 #define _COMPONENT          ACPI_RESOURCES
-        ACPI_MODULE_NAME    ("rsmemory")
-
+ACPI_MODULE_NAME("rsmemory")
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory24_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_memory24
  *
  ******************************************************************************/
+struct acpi_rsconvert_info acpi_rs_convert_memory24[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY24,
+        ACPI_RS_SIZE(struct acpi_resource_memory24),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory24)},
 
-acpi_status
-acpi_rs_memory24_resource (
-       u8                              *byte_stream_buffer,
-       acpi_size                       *bytes_consumed,
-       u8                              **output_buffer,
-       acpi_size                       *structure_size)
-{
-       u8                              *buffer = byte_stream_buffer;
-       struct acpi_resource            *output_struct = (void *) *output_buffer;
-       u16                             temp16 = 0;
-       u8                              temp8 = 0;
-       acpi_size                       struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_mem24);
-
-
-       ACPI_FUNCTION_TRACE ("rs_memory24_resource");
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       *bytes_consumed = (acpi_size) temp16 + 3;
-       output_struct->id = ACPI_RSTYPE_MEM24;
-
-       /*
-        * Check Byte 3 the Read/Write bit
-        */
-       temp8 = *buffer;
-       buffer += 1;
-       output_struct->data.memory24.read_write_attribute = temp8 & 0x01;
-
-       /*
-        * Get min_base_address (Bytes 4-5)
-        */
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.min_base_address = temp16;
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY24,
+        sizeof(struct aml_resource_memory24),
+        0},
 
-       /*
-        * Get max_base_address (Bytes 6-7)
-        */
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.max_base_address = temp16;
+       /* Read/Write bit */
 
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory24.write_protect),
+        AML_OFFSET(memory24.flags),
+        0},
        /*
-        * Get Alignment (Bytes 8-9)
+        * These fields are contiguous in both the source and destination:
+        * Minimum Base Address
+        * Maximum Base Address
+        * Address Base Alignment
+        * Range Length
         */
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       output_struct->data.memory24.alignment = temp16;
-
-       /*
-        * Get range_length (Bytes 10-11)
-        */
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-       output_struct->data.memory24.range_length = temp16;
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = (u32) struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-       return_ACPI_STATUS (AE_OK);
-}
-
+       {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.memory24.minimum),
+        AML_OFFSET(memory24.minimum),
+        4}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory24_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_convert_memory32
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_memory24_stream (
-       struct acpi_resource            *linked_list,
-       u8                              **output_buffer,
-       acpi_size                       *bytes_consumed)
-{
-       u8                              *buffer = *output_buffer;
-       u16                             temp16 = 0;
-       u8                              temp8 = 0;
+struct acpi_rsconvert_info acpi_rs_convert_memory32[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY32,
+        ACPI_RS_SIZE(struct acpi_resource_memory32),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory32)},
 
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY32,
+        sizeof(struct aml_resource_memory32),
+        0},
 
-       ACPI_FUNCTION_TRACE ("rs_memory24_stream");
-
+       /* Read/Write bit */
 
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory32.write_protect),
+        AML_OFFSET(memory32.flags),
+        0},
        /*
-        * The descriptor field is static
+        * These fields are contiguous in both the source and destination:
+        * Minimum Base Address
+        * Maximum Base Address
+        * Address Base Alignment
+        * Range Length
         */
-       *buffer = 0x81;
-       buffer += 1;
-
-       /*
-        * The length field is static
-        */
-       temp16 = 0x09;
-       ACPI_MOVE_16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the Information Byte
-        */
-       temp8 = (u8) (linked_list->data.memory24.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Range minimum base address
-        */
-       ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.min_base_address);
-       buffer += 2;
-
-       /*
-        * Set the Range maximum base address
-        */
-       ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.max_base_address);
-       buffer += 2;
-
-       /*
-        * Set the base alignment
-        */
-       ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.alignment);
-       buffer += 2;
-
-       /*
-        * Set the range length
-        */
-       ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.range_length);
-       buffer += 2;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer);
-       return_ACPI_STATUS (AE_OK);
-}
-
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.memory32.minimum),
+        AML_OFFSET(memory32.minimum),
+        4}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory32_range_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_convert_fixed_memory32
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_memory32_range_resource (
-       u8                              *byte_stream_buffer,
-       acpi_size                       *bytes_consumed,
-       u8                              **output_buffer,
-       acpi_size                       *structure_size)
-{
-       u8                              *buffer = byte_stream_buffer;
-       struct acpi_resource            *output_struct = (void *) *output_buffer;
-       u16                             temp16 = 0;
-       u8                              temp8 = 0;
-       acpi_size                       struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_mem32);
-
-
-       ACPI_FUNCTION_TRACE ("rs_memory32_range_resource");
-
-
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-       buffer += 2;
-       *bytes_consumed = (acpi_size) temp16 + 3;
-
-       output_struct->id = ACPI_RSTYPE_MEM32;
-
-       /*
-        *  Point to the place in the output buffer where the data portion will
-        *  begin.
-        *  1. Set the RESOURCE_DATA * Data to point to its own address, then
-        *  2. Set the pointer to the next address.
-        *
-        *  NOTE: output_struct->Data is cast to u8, otherwise, this addition adds
-        *  4 * sizeof(RESOURCE_DATA) instead of 4 * sizeof(u8)
-        */
-
-       /*
-        * Check Byte 3 the Read/Write bit
-        */
-       temp8 = *buffer;
-       buffer += 1;
-
-       output_struct->data.memory32.read_write_attribute = temp8 & 0x01;
-
-       /*
-        * Get min_base_address (Bytes 4-7)
-        */
-       ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.min_base_address, buffer);
-       buffer += 4;
-
-       /*
-        * Get max_base_address (Bytes 8-11)
-        */
-       ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.max_base_address, buffer);
-       buffer += 4;
-
-       /*
-        * Get Alignment (Bytes 12-15)
-        */
-       ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.alignment, buffer);
-       buffer += 4;
+struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[4] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_MEMORY32,
+        ACPI_RS_SIZE(struct acpi_resource_fixed_memory32),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_memory32)},
 
-       /*
-        * Get range_length (Bytes 16-19)
-        */
-       ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.range_length, buffer);
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_MEMORY32,
+        sizeof(struct aml_resource_fixed_memory32),
+        0},
 
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = (u32) struct_size;
+       /* Read/Write bit */
 
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.fixed_memory32.write_protect),
+        AML_OFFSET(fixed_memory32.flags),
+        0},
        /*
-        * Return the final size of the structure
+        * These fields are contiguous in both the source and destination:
+        * Base Address
+        * Range Length
         */
-       *structure_size = struct_size;
-       return_ACPI_STATUS (AE_OK);
-}
-
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.fixed_memory32.address),
+        AML_OFFSET(fixed_memory32.address),
+        2}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_fixed_memory32_resource
- *
- * PARAMETERS:  byte_stream_buffer      - Pointer to the resource input byte
- *                                        stream
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        consumed the byte_stream_buffer is
- *                                        returned
- *              output_buffer           - Pointer to the return data buffer
- *              structure_size          - Pointer to where the number of bytes
- *                                        in the return data struct is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the resource byte stream and fill out the appropriate
- *              structure pointed to by the output_buffer. Return the
- *              number of bytes consumed from the byte stream.
+ * acpi_rs_get_vendor_small
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_fixed_memory32_resource (
-       u8                              *byte_stream_buffer,
-       acpi_size                       *bytes_consumed,
-       u8                              **output_buffer,
-       acpi_size                       *structure_size)
-{
-       u8                              *buffer = byte_stream_buffer;
-       struct acpi_resource            *output_struct = (void *) *output_buffer;
-       u16                             temp16 = 0;
-       u8                              temp8 = 0;
-       acpi_size                       struct_size = ACPI_SIZEOF_RESOURCE (struct acpi_resource_fixed_mem32);
-
+struct acpi_rsconvert_info acpi_rs_get_vendor_small[3] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
+        ACPI_RS_SIZE(struct acpi_resource_vendor),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_small)},
 
-       ACPI_FUNCTION_TRACE ("rs_fixed_memory32_resource");
+       /* Length of the vendor data (byte count) */
 
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        sizeof(u8)}
+       ,
 
-       /*
-        * Point past the Descriptor to get the number of bytes consumed
-        */
-       buffer += 1;
-       ACPI_MOVE_16_TO_16 (&temp16, buffer);
-
-       buffer += 2;
-       *bytes_consumed = (acpi_size) temp16 + 3;
-
-       output_struct->id = ACPI_RSTYPE_FIXED_MEM32;
-
-       /*
-        * Check Byte 3 the Read/Write bit
-        */
-       temp8 = *buffer;
-       buffer += 1;
-       output_struct->data.fixed_memory32.read_write_attribute = temp8 & 0x01;
-
-       /*
-        * Get range_base_address (Bytes 4-7)
-        */
-       ACPI_MOVE_32_TO_32 (&output_struct->data.fixed_memory32.range_base_address, buffer);
-       buffer += 4;
-
-       /*
-        * Get range_length (Bytes 8-11)
-        */
-       ACPI_MOVE_32_TO_32 (&output_struct->data.fixed_memory32.range_length, buffer);
-
-       /*
-        * Set the Length parameter
-        */
-       output_struct->length = (u32) struct_size;
-
-       /*
-        * Return the final size of the structure
-        */
-       *structure_size = struct_size;
-       return_ACPI_STATUS (AE_OK);
-}
+       /* Vendor data */
 
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_small_header),
+        0}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_memory32_range_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_get_vendor_large
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_memory32_range_stream (
-       struct acpi_resource            *linked_list,
-       u8                              **output_buffer,
-       acpi_size                       *bytes_consumed)
-{
-       u8                              *buffer = *output_buffer;
-       u16                             temp16 = 0;
-       u8                              temp8 = 0;
+struct acpi_rsconvert_info acpi_rs_get_vendor_large[3] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
+        ACPI_RS_SIZE(struct acpi_resource_vendor),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_large)},
 
+       /* Length of the vendor data (byte count) */
 
-       ACPI_FUNCTION_TRACE ("rs_memory32_range_stream");
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        sizeof(u8)}
+       ,
 
+       /* Vendor data */
 
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x85;
-       buffer += 1;
-
-       /*
-        * The length field is static
-        */
-       temp16 = 0x11;
-
-       ACPI_MOVE_16_TO_16 (buffer, &temp16);
-       buffer += 2;
-
-       /*
-        * Set the Information Byte
-        */
-       temp8 = (u8) (linked_list->data.memory32.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
-
-       /*
-        * Set the Range minimum base address
-        */
-       ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.min_base_address);
-       buffer += 4;
-
-       /*
-        * Set the Range maximum base address
-        */
-       ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.max_base_address);
-       buffer += 4;
-
-       /*
-        * Set the base alignment
-        */
-       ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.alignment);
-       buffer += 4;
-
-       /*
-        * Set the range length
-        */
-       ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.range_length);
-       buffer += 4;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer);
-       return_ACPI_STATUS (AE_OK);
-}
-
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_large_header),
+        0}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_fixed_memory32_stream
- *
- * PARAMETERS:  linked_list             - Pointer to the resource linked list
- *              output_buffer           - Pointer to the user's return buffer
- *              bytes_consumed          - Pointer to where the number of bytes
- *                                        used in the output_buffer is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Take the linked list resource structure and fills in the
- *              the appropriate bytes in a byte stream
+ * acpi_rs_set_vendor
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_fixed_memory32_stream (
-       struct acpi_resource            *linked_list,
-       u8                              **output_buffer,
-       acpi_size                       *bytes_consumed)
-{
-       u8                              *buffer = *output_buffer;
-       u16                             temp16 = 0;
-       u8                              temp8 = 0;
+struct acpi_rsconvert_info acpi_rs_set_vendor[7] = {
+       /* Default is a small vendor descriptor */
 
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_SMALL,
+        sizeof(struct aml_resource_small_header),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_set_vendor)},
 
-       ACPI_FUNCTION_TRACE ("rs_fixed_memory32_stream");
+       /* Get the length and copy the data */
 
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        0},
 
-       /*
-        * The descriptor field is static
-        */
-       *buffer = 0x86;
-       buffer += 1;
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_small_header),
+        0},
 
        /*
-        * The length field is static
+        * All done if the Vendor byte length is 7 or less, meaning that it will
+        * fit within a small descriptor
         */
-       temp16 = 0x09;
+       {ACPI_RSC_EXIT_LE, 0, 0, 7},
 
-       ACPI_MOVE_16_TO_16 (buffer, &temp16);
-       buffer += 2;
+       /* Must create a large vendor descriptor */
 
-       /*
-        * Set the Information Byte
-        */
-       temp8 = (u8) (linked_list->data.fixed_memory32.read_write_attribute & 0x01);
-       *buffer = temp8;
-       buffer += 1;
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_LARGE,
+        sizeof(struct aml_resource_large_header),
+        0},
 
-       /*
-        * Set the Range base address
-        */
-       ACPI_MOVE_32_TO_32 (buffer,
-                        &linked_list->data.fixed_memory32.range_base_address);
-       buffer += 4;
-
-       /*
-        * Set the range length
-        */
-       ACPI_MOVE_32_TO_32 (buffer,
-                        &linked_list->data.fixed_memory32.range_length);
-       buffer += 4;
-
-       /*
-        * Return the number of bytes consumed in this operation
-        */
-       *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer);
-       return_ACPI_STATUS (AE_OK);
-}
+       {ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
+        0,
+        0},
 
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
+        sizeof(struct aml_resource_large_header),
+        0}
+};