]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/acpi/resources/rsaddr.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
[linux-2.6-omap-h63xx.git] / drivers / acpi / resources / rsaddr.c
index 6f48ebf3304e12caa68694b80ae64d755c4fa410..8fa3213ce000709af7c33a74c44efb397bfdc5c8 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
 #define _COMPONENT          ACPI_RESOURCES
 ACPI_MODULE_NAME("rsaddr")
 
-/* Local prototypes */
-static void
-acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags);
-
-static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource);
-
-static void
-acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags);
-
-static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource);
-
-static void
-acpi_rs_set_address_common(union aml_resource *aml,
-                          struct acpi_resource *resource);
-
-static u8
-acpi_rs_get_address_common(struct acpi_resource *resource,
-                          union aml_resource *aml);
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_decode_general_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *              Flags               - Raw AML flag byte
- *
- * RETURN:      Decoded flag bits in resource struct
- *
- * DESCRIPTION: Decode a general flag byte to an address resource struct
- *
- ******************************************************************************/
-
-static void
-acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       /* Producer / Consumer - flag bit[0] */
-
-       resource->address.producer_consumer = (u32) (flags & 0x01);
-
-       /* Decode (_DEC) - flag bit[1] */
-
-       resource->address.decode = (u32) ((flags >> 1) & 0x01);
-
-       /* Min Address Fixed (_MIF) - flag bit[2] */
-
-       resource->address.min_address_fixed = (u32) ((flags >> 2) & 0x01);
-
-       /* Max Address Fixed (_MAF) - flag bit[3] */
-
-       resource->address.max_address_fixed = (u32) ((flags >> 3) & 0x01);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_encode_general_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *
- * RETURN:      Encoded general flag byte
- *
- * DESCRIPTION: Construct a general flag byte from an address resource struct
- *
- ******************************************************************************/
-
-static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       return ((u8)
-
-               /* Producer / Consumer - flag bit[0] */
-               ((resource->address.producer_consumer & 0x01) |
-                /* Decode (_DEC) - flag bit[1] */
-                ((resource->address.decode & 0x01) << 1) |
-                /* Min Address Fixed (_MIF) - flag bit[2] */
-                ((resource->address.min_address_fixed & 0x01) << 2) |
-                /* Max Address Fixed (_MAF) - flag bit[3] */
-                ((resource->address.max_address_fixed & 0x01) << 3))
-           );
-}
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_decode_specific_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *              Flags               - Raw AML flag byte
- *
- * RETURN:      Decoded flag bits in attribute struct
- *
- * DESCRIPTION: Decode a type-specific flag byte to an attribute struct.
- *              Type-specific flags are only defined for the Memory and IO
- *              resource types.
+ * acpi_rs_convert_address16 - All WORD (16-bit) address resources
  *
  ******************************************************************************/
+struct acpi_rsconvert_info acpi_rs_convert_address16[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16,
+        ACPI_RS_SIZE(struct acpi_resource_address16),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address16)},
 
-static void
-acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
-               /* Write Status (_RW) - flag bit[0] */
-
-               resource->address.attribute.memory.read_write_attribute =
-                   (u16) (flags & 0x01);
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
+        sizeof(struct aml_resource_address16),
+        0},
 
-               /* Memory Attributes (_MEM) - flag bits[2:1] */
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-               resource->address.attribute.memory.cache_attribute =
-                   (u16) ((flags >> 1) & 0x03);
-       } else if (resource->address.resource_type == ACPI_IO_RANGE) {
-               /* Ranges (_RNG) - flag bits[1:0] */
-
-               resource->address.attribute.io.range_attribute =
-                   (u16) (flags & 0x03);
-
-               /* Translations (_TTP and _TRS) - flag bits[5:4] */
-
-               resource->address.attribute.io.translation_attribute =
-                   (u16) ((flags >> 4) & 0x03);
-       }
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_encode_specific_flags
- *
- * PARAMETERS:  Resource            - Address resource data struct
- *
- * RETURN:      Encoded type-specific flag byte
- *
- * DESCRIPTION: Construct a type-specific flag byte from an attribute struct.
- *              Type-specific flags are only defined for the Memory and IO
- *              resource types.
- *
- ******************************************************************************/
-
-static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
-               return ((u8)
-
-                       /* Write Status (_RW) - flag bit[0] */
-                       ((resource->address.attribute.memory.
-                         read_write_attribute & 0x01) |
-                        /* Memory Attributes (_MEM) - flag bits[2:1] */
-                        ((resource->address.attribute.memory.
-                          cache_attribute & 0x03) << 1)));
-       } else if (resource->address.resource_type == ACPI_IO_RANGE) {
-               return ((u8)
-
-                       /* Ranges (_RNG) - flag bits[1:0] */
-                       ((resource->address.attribute.io.
-                         range_attribute & 0x03) |
-                        /* Translations (_TTP and _TRS) - flag bits[5:4] */
-                        ((resource->address.attribute.io.
-                          translation_attribute & 0x03) << 4)));
-       }
-
-       return (0);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_set_address_common
- *
- * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
- *              Resource            - Pointer to the internal resource struct
- *
- * RETURN:      None
- *
- * DESCRIPTION: Convert common flag fields from a resource descriptor to an
- *              AML descriptor
- *
- ******************************************************************************/
-
-static void
-acpi_rs_set_address_common(union aml_resource *aml,
-                          struct acpi_resource *resource)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       /* Set the Resource Type (Memory, Io, bus_number, etc.) */
-
-       aml->address.resource_type = (u8) resource->data.address.resource_type;
-
-       /* Set the general flags */
-
-       aml->address.flags = acpi_rs_encode_general_flags(&resource->data);
-
-       /* Set the type-specific flags */
-
-       aml->address.specific_flags =
-           acpi_rs_encode_specific_flags(&resource->data);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_get_address_common
- *
- * PARAMETERS:  Resource            - Pointer to the internal resource struct
- *              Aml                 - Pointer to the AML resource descriptor
- *
- * RETURN:      TRUE if the resource_type field is OK, FALSE otherwise
- *
- * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
- *              to an internal resource descriptor
- *
- ******************************************************************************/
-
-static u8
-acpi_rs_get_address_common(struct acpi_resource *resource,
-                          union aml_resource *aml)
-{
-       ACPI_FUNCTION_ENTRY();
-
-       /* Validate resource type */
-
-       if ((aml->address.resource_type > 2)
-           && (aml->address.resource_type < 0xC0)) {
-               return (FALSE);
-       }
-
-       /* Get the Resource Type (Memory, Io, bus_number, etc.) */
-
-       resource->data.address.resource_type = aml->address.resource_type;
-
-       /* Get the General Flags */
-
-       acpi_rs_decode_general_flags(&resource->data, aml->address.flags);
-
-       /* Get the Type-Specific Flags */
-
-       acpi_rs_decode_specific_flags(&resource->data,
-                                     aml->address.specific_flags);
-       return (TRUE);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_rs_get_address16
- *
- * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
- *              aml_resource_length - Length of the resource from the AML header
- *              Resource            - Where the internal resource is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding
- *              internal resource descriptor, simplifying bitflags and handling
- *              alignment and endian issues if necessary.
- *
- ******************************************************************************/
-
-acpi_status
-acpi_rs_get_address16(union aml_resource * aml,
-                     u16 aml_resource_length, struct acpi_resource * resource)
-{
-       ACPI_FUNCTION_TRACE("rs_get_address16");
-
-       /* Get the Resource Type, general flags, and type-specific flags */
-
-       if (!acpi_rs_get_address_common(resource, aml)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
-       }
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
        /*
-        * Get the following contiguous fields from the AML descriptor:
+        * These fields are contiguous in both the source and destination:
         * Address Granularity
         * Address Range Minimum
         * Address Range Maximum
         * Address Translation Offset
         * Address Length
         */
-       acpi_rs_move_data(&resource->data.address16.granularity,
-                         &aml->address16.granularity, 5,
-                         ACPI_MOVE_TYPE_16_TO_32);
-
-       /* Get the optional resource_source (index and string) */
-
-       resource->length =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address16) +
-           acpi_rs_get_resource_source(aml_resource_length,
-                                       sizeof(struct aml_resource_address16),
-                                       &resource->data.address16.
-                                       resource_source, aml, NULL);
+       {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.granularity),
+        AML_OFFSET(address16.granularity),
+        5},
 
-       /* Complete the resource header */
+       /* Optional resource_source (Index and String) */
 
-       resource->type = ACPI_RESOURCE_TYPE_ADDRESS16;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source),
+        0,
+        sizeof(struct aml_resource_address16)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_set_address16
- *
- * PARAMETERS:  Resource            - Pointer to the resource descriptor
- *              Aml                 - Where the AML descriptor is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an internal resource descriptor to the corresponding
- *              external AML resource descriptor.
+ * acpi_rs_convert_address32 - All DWORD (32-bit) address resources
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_set_address16(struct acpi_resource *resource, union aml_resource *aml)
-{
-       acpi_size descriptor_length;
+struct acpi_rsconvert_info acpi_rs_convert_address32[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32,
+        ACPI_RS_SIZE(struct acpi_resource_address32),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address32)},
 
-       ACPI_FUNCTION_TRACE("rs_set_address16");
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
+        sizeof(struct aml_resource_address32),
+        0},
 
-       /* Set the Resource Type, General Flags, and Type-Specific Flags */
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-       acpi_rs_set_address_common(aml, resource);
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
        /*
-        * Set the following contiguous fields in the AML descriptor:
+        * These fields are contiguous in both the source and destination:
         * Address Granularity
         * Address Range Minimum
         * Address Range Maximum
         * Address Translation Offset
         * Address Length
         */
-       acpi_rs_move_data(&aml->address16.granularity,
-                         &resource->data.address16.granularity, 5,
-                         ACPI_MOVE_TYPE_32_TO_16);
-
-       /* Resource Source Index and Resource Source are optional */
+       {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.granularity),
+        AML_OFFSET(address32.granularity),
+        5},
 
-       descriptor_length = acpi_rs_set_resource_source(aml,
-                                                       sizeof(struct
-                                                              aml_resource_address16),
-                                                       &resource->data.
-                                                       address16.
-                                                       resource_source);
+       /* Optional resource_source (Index and String) */
 
-       /* Complete the AML descriptor header */
-
-       acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS16,
-                                   descriptor_length, aml);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source),
+        0,
+        sizeof(struct aml_resource_address32)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_get_address32
- *
- * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
- *              aml_resource_length - Length of the resource from the AML header
- *              Resource            - Where the internal resource is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding
- *              internal resource descriptor, simplifying bitflags and handling
- *              alignment and endian issues if necessary.
+ * acpi_rs_convert_address64 - All QWORD (64-bit) address resources
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_get_address32(union aml_resource *aml,
-                     u16 aml_resource_length, struct acpi_resource *resource)
-{
+struct acpi_rsconvert_info acpi_rs_convert_address64[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64,
+        ACPI_RS_SIZE(struct acpi_resource_address64),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_address64)},
 
-       ACPI_FUNCTION_TRACE("rs_get_address32");
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
+        sizeof(struct aml_resource_address64),
+        0},
 
-       /* Get the Resource Type, general flags, and type-specific flags */
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-       if (!acpi_rs_get_address_common(resource, (void *)aml)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
-       }
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
        /*
-        * Get the following contiguous fields from the AML descriptor:
+        * These fields are contiguous in both the source and destination:
         * Address Granularity
         * Address Range Minimum
         * Address Range Maximum
         * Address Translation Offset
         * Address Length
         */
-       acpi_rs_move_data(&resource->data.address32.granularity,
-                         &aml->address32.granularity, 5,
-                         ACPI_MOVE_TYPE_32_TO_32);
+       {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.granularity),
+        AML_OFFSET(address64.granularity),
+        5},
 
-       /* Get the optional resource_source (index and string) */
+       /* Optional resource_source (Index and String) */
 
-       resource->length =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32) +
-           acpi_rs_get_resource_source(aml_resource_length,
-                                       sizeof(struct aml_resource_address32),
-                                       &resource->data.address32.
-                                       resource_source, aml, NULL);
-
-       /* Complete the resource header */
-
-       resource->type = ACPI_RESOURCE_TYPE_ADDRESS32;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source),
+        0,
+        sizeof(struct aml_resource_address64)}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_set_address32
- *
- * PARAMETERS:  Resource            - Pointer to the resource descriptor
- *              Aml                 - Where the AML descriptor is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an internal resource descriptor to the corresponding
- *              external AML resource descriptor.
+ * acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_set_address32(struct acpi_resource *resource, union aml_resource *aml)
-{
-       acpi_size descriptor_length;
+struct acpi_rsconvert_info acpi_rs_convert_ext_address64[5] = {
+       {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
+        ACPI_RS_SIZE(struct acpi_resource_extended_address64),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_address64)},
+
+       {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
+        sizeof(struct aml_resource_extended_address64),
+        0},
 
-       ACPI_FUNCTION_TRACE("rs_set_address32");
+       /* Resource Type, General Flags, and Type-Specific Flags */
 
-       /* Set the Resource Type, General Flags, and Type-Specific Flags */
+       {ACPI_RSC_ADDRESS, 0, 0, 0},
 
-       acpi_rs_set_address_common(aml, resource);
+       /* Revision ID */
 
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_iD),
+        AML_OFFSET(ext_address64.revision_iD),
+        1},
        /*
-        * Set the following contiguous fields in the AML descriptor:
+        * These fields are contiguous in both the source and destination:
         * Address Granularity
         * Address Range Minimum
         * Address Range Maximum
         * Address Translation Offset
         * Address Length
+        * Type-Specific Attribute
         */
-       acpi_rs_move_data(&aml->address32.granularity,
-                         &resource->data.address32.granularity, 5,
-                         ACPI_MOVE_TYPE_32_TO_32);
-
-       /* Resource Source Index and Resource Source are optional */
-
-       descriptor_length = acpi_rs_set_resource_source(aml,
-                                                       sizeof(struct
-                                                              aml_resource_address32),
-                                                       &resource->data.
-                                                       address32.
-                                                       resource_source);
-
-       /* Complete the AML descriptor header */
-
-       acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS32,
-                                   descriptor_length, aml);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.ext_address64.granularity),
+        AML_OFFSET(ext_address64.granularity),
+        6}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_get_address64
- *
- * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
- *              aml_resource_length - Length of the resource from the AML header
- *              Resource            - Where the internal resource is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding
- *              internal resource descriptor, simplifying bitflags and handling
- *              alignment and endian issues if necessary.
+ * acpi_rs_convert_general_flags - Flags common to all address descriptors
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_get_address64(union aml_resource *aml,
-                     u16 aml_resource_length, struct acpi_resource *resource)
-{
-       ACPI_FUNCTION_TRACE("rs_get_address64");
+static struct acpi_rsconvert_info acpi_rs_convert_general_flags[6] = {
+       {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.flags),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_general_flags)},
 
-       /* Get the Resource Type, general Flags, and type-specific Flags */
+       /* Resource Type (Memory, Io, bus_number, etc.) */
 
-       if (!acpi_rs_get_address_common(resource, aml)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
-       }
+       {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type),
+        AML_OFFSET(address.resource_type),
+        1},
 
-       /*
-        * Get the following contiguous fields from the AML descriptor:
-        * Address Granularity
-        * Address Range Minimum
-        * Address Range Maximum
-        * Address Translation Offset
-        * Address Length
-        */
-       acpi_rs_move_data(&resource->data.address64.granularity,
-                         &aml->address64.granularity, 5,
-                         ACPI_MOVE_TYPE_64_TO_64);
+       /* General Flags - Consume, Decode, min_fixed, max_fixed */
 
-       /* Get the optional resource_source (index and string) */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer),
+        AML_OFFSET(address.flags),
+        0},
 
-       resource->length =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64) +
-           acpi_rs_get_resource_source(aml_resource_length,
-                                       sizeof(struct aml_resource_address64),
-                                       &resource->data.address64.
-                                       resource_source, aml, NULL);
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode),
+        AML_OFFSET(address.flags),
+        1},
 
-       /* Complete the resource header */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed),
+        AML_OFFSET(address.flags),
+        2},
 
-       resource->type = ACPI_RESOURCE_TYPE_ADDRESS64;
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed),
+        AML_OFFSET(address.flags),
+        3}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_set_address64
- *
- * PARAMETERS:  Resource            - Pointer to the resource descriptor
- *              Aml                 - Where the AML descriptor is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Convert an internal resource descriptor to the corresponding
- *              external AML resource descriptor.
+ * acpi_rs_convert_mem_flags - Flags common to Memory address descriptors
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_set_address64(struct acpi_resource *resource, union aml_resource *aml)
-{
-       acpi_size descriptor_length;
+static struct acpi_rsconvert_info acpi_rs_convert_mem_flags[5] = {
+       {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_mem_flags)},
 
-       ACPI_FUNCTION_TRACE("rs_set_address64");
+       /* Memory-specific flags */
 
-       /* Set the Resource Type, General Flags, and Type-Specific Flags */
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect),
+        AML_OFFSET(address.specific_flags),
+        0},
 
-       acpi_rs_set_address_common(aml, resource);
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching),
+        AML_OFFSET(address.specific_flags),
+        1},
 
-       /*
-        * Set the following contiguous fields in the AML descriptor:
-        * Address Granularity
-        * Address Range Minimum
-        * Address Range Maximum
-        * Address Translation Offset
-        * Address Length
-        */
-       acpi_rs_move_data(&aml->address64.granularity,
-                         &resource->data.address64.granularity, 5,
-                         ACPI_MOVE_TYPE_64_TO_64);
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.range_type),
+        AML_OFFSET(address.specific_flags),
+        3},
+
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.translation),
+        AML_OFFSET(address.specific_flags),
+        5}
+};
+
+/*******************************************************************************
+ *
+ * acpi_rs_convert_io_flags - Flags common to I/O address descriptors
+ *
+ ******************************************************************************/
 
-       /* Resource Source Index and Resource Source are optional */
+static struct acpi_rsconvert_info acpi_rs_convert_io_flags[4] = {
+       {ACPI_RSC_FLAGINIT, 0, AML_OFFSET(address.specific_flags),
+        ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io_flags)},
 
-       descriptor_length = acpi_rs_set_resource_source(aml,
-                                                       sizeof(struct
-                                                              aml_resource_address64),
-                                                       &resource->data.
-                                                       address64.
-                                                       resource_source);
+       /* I/O-specific flags */
 
-       /* Complete the AML descriptor header */
+       {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type),
+        AML_OFFSET(address.specific_flags),
+        0},
 
-       acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS64,
-                                   descriptor_length, aml);
-       return_ACPI_STATUS(AE_OK);
-}
+       {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.io.translation),
+        AML_OFFSET(address.specific_flags),
+        4},
+
+       {ACPI_RSC_1BITFLAG,
+        ACPI_RS_OFFSET(data.address.info.io.translation_type),
+        AML_OFFSET(address.specific_flags),
+        5}
+};
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_get_ext_address64
+ * FUNCTION:    acpi_rs_get_address_common
  *
- * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
- *              aml_resource_length - Length of the resource from the AML header
- *              Resource            - Where the internal resource is returned
+ * PARAMETERS:  Resource            - Pointer to the internal resource struct
+ *              Aml                 - Pointer to the AML resource descriptor
  *
- * RETURN:      Status
+ * RETURN:      TRUE if the resource_type field is OK, FALSE otherwise
  *
- * DESCRIPTION: Convert a raw AML resource descriptor to the corresponding
- *              internal resource descriptor, simplifying bitflags and handling
- *              alignment and endian issues if necessary.
+ * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
+ *              to an internal resource descriptor
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_get_ext_address64(union aml_resource *aml,
-                         u16 aml_resource_length,
-                         struct acpi_resource *resource)
+u8
+acpi_rs_get_address_common(struct acpi_resource *resource,
+                          union aml_resource *aml)
 {
+       ACPI_FUNCTION_ENTRY();
 
-       ACPI_FUNCTION_TRACE("rs_get_ext_address64");
-
-       /* Get the Resource Type, general flags, and type-specific flags */
+       /* Validate the Resource Type */
 
-       if (!acpi_rs_get_address_common(resource, aml)) {
-               return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
+       if ((aml->address.resource_type > 2)
+           && (aml->address.resource_type < 0xC0)) {
+               return (FALSE);
        }
 
-       /*
-        * Get and validate the Revision ID
-        * Note: Only one revision ID is currently supported
-        */
-       resource->data.ext_address64.revision_iD =
-           aml->ext_address64.revision_iD;
-       if (aml->ext_address64.revision_iD !=
-           AML_RESOURCE_EXTENDED_ADDRESS_REVISION) {
-               return_ACPI_STATUS(AE_SUPPORT);
-       }
+       /* Get the Resource Type and General Flags */
 
-       /*
-        * Get the following contiguous fields from the AML descriptor:
-        * Address Granularity
-        * Address Range Minimum
-        * Address Range Maximum
-        * Address Translation Offset
-        * Address Length
-        * Type-Specific Attribute
-        */
-       acpi_rs_move_data(&resource->data.ext_address64.granularity,
-                         &aml->ext_address64.granularity, 6,
-                         ACPI_MOVE_TYPE_64_TO_64);
+       (void)acpi_rs_convert_aml_to_resource(resource, aml,
+                                             acpi_rs_convert_general_flags);
+
+       /* Get the Type-Specific Flags (Memory and I/O descriptors only) */
 
-       /* Complete the resource header */
+       if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
+               (void)acpi_rs_convert_aml_to_resource(resource, aml,
+                                                     acpi_rs_convert_mem_flags);
+       } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
+               (void)acpi_rs_convert_aml_to_resource(resource, aml,
+                                                     acpi_rs_convert_io_flags);
+       } else {
+               /* Generic resource type, just grab the type_specific byte */
 
-       resource->type = ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64;
-       resource->length =
-           ACPI_SIZEOF_RESOURCE(struct acpi_resource_extended_address64);
-       return_ACPI_STATUS(AE_OK);
+               resource->data.address.info.type_specific =
+                   aml->address.specific_flags;
+       }
+
+       return (TRUE);
 }
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_rs_set_ext_address64
+ * FUNCTION:    acpi_rs_set_address_common
  *
- * PARAMETERS:  Resource            - Pointer to the resource descriptor
- *              Aml                 - Where the AML descriptor is returned
+ * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
+ *              Resource            - Pointer to the internal resource struct
  *
- * RETURN:      Status
+ * RETURN:      None
  *
- * DESCRIPTION: Convert an internal resource descriptor to the corresponding
- *              external AML resource descriptor.
+ * DESCRIPTION: Convert common flag fields from a resource descriptor to an
+ *              AML descriptor
  *
  ******************************************************************************/
 
-acpi_status
-acpi_rs_set_ext_address64(struct acpi_resource *resource,
-                         union aml_resource *aml)
+void
+acpi_rs_set_address_common(union aml_resource *aml,
+                          struct acpi_resource *resource)
 {
-       ACPI_FUNCTION_TRACE("rs_set_ext_address64");
+       ACPI_FUNCTION_ENTRY();
 
-       /* Set the Resource Type, General Flags, and Type-Specific Flags */
+       /* Set the Resource Type and General Flags */
 
-       acpi_rs_set_address_common(aml, resource);
+       (void)acpi_rs_convert_resource_to_aml(resource, aml,
+                                             acpi_rs_convert_general_flags);
 
-       /* Only one Revision ID is currently supported */
+       /* Set the Type-Specific Flags (Memory and I/O descriptors only) */
 
-       aml->ext_address64.revision_iD = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
-       aml->ext_address64.reserved = 0;
+       if (resource->data.address.resource_type == ACPI_MEMORY_RANGE) {
+               (void)acpi_rs_convert_resource_to_aml(resource, aml,
+                                                     acpi_rs_convert_mem_flags);
+       } else if (resource->data.address.resource_type == ACPI_IO_RANGE) {
+               (void)acpi_rs_convert_resource_to_aml(resource, aml,
+                                                     acpi_rs_convert_io_flags);
+       } else {
+               /* Generic resource type, just copy the type_specific byte */
 
-       /*
-        * Set the following contiguous fields in the AML descriptor:
-        * Address Granularity
-        * Address Range Minimum
-        * Address Range Maximum
-        * Address Translation Offset
-        * Address Length
-        * Type-Specific Attribute
-        */
-       acpi_rs_move_data(&aml->ext_address64.granularity,
-                         &resource->data.address64.granularity, 6,
-                         ACPI_MOVE_TYPE_64_TO_64);
-
-       /* Complete the AML descriptor header */
-
-       acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
-                                   sizeof(struct
-                                          aml_resource_extended_address64),
-                                   aml);
-       return_ACPI_STATUS(AE_OK);
+               aml->address.specific_flags =
+                   resource->data.address.info.type_specific;
+       }
 }