[ACPI] ACPICA 20051021

Implemented support for the EM64T and other x86_64
processors. This essentially entails recognizing
that these processors support non-aligned memory
transfers. Previously, all 64-bit processors were assumed
to lack hardware support for non-aligned transfers.

Completed conversion of the Resource Manager to nearly
full table-driven operation. Specifically, the resource
conversion code (convert AML to internal format and the
reverse) and the debug code to dump internal resource
descriptors are fully table-driven, reducing code and data
size and improving maintainability.

The OSL interfaces for Acquire and Release Lock now use a
64-bit flag word on 64-bit processors instead of a fixed
32-bit word. (Alexey Starikovskiy)

Implemented support within the resource conversion code
for the Type-Specific byte within the various ACPI 3.0
*WordSpace macros.

Fixed some issues within the resource conversion code for
the type-specific flags for both Memory and I/O address
resource descriptors. For Memory, implemented support
for the MTP and TTP flags. For I/O, split the TRS and TTP
flags into two separate fields.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Bob Moore
2005-10-21 00:00:00 -04:00
committed by Len Brown
parent 50eca3eb89
commit 0897831bb5
32 changed files with 2541 additions and 3248 deletions

View File

@@ -47,171 +47,295 @@
#define _COMPONENT ACPI_RESOURCES
ACPI_MODULE_NAME("rsaddr")
/* Local prototypes */
static void
acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags);
/*******************************************************************************
*
* 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 u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource);
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
sizeof(struct aml_resource_address16),
0},
static void
acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags);
/* Resource Type, General Flags, and Type-Specific Flags */
static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource);
{ACPI_RSC_ADDRESS, 0, 0, 0},
static void
acpi_rs_set_address_common(union aml_resource *aml,
struct acpi_resource *resource);
/*
* These fields are contiguous in both the source and destination:
* Address Granularity
* Address Range Minimum
* Address Range Maximum
* Address Translation Offset
* Address Length
*/
{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.address16.granularity),
AML_OFFSET(address16.granularity),
5},
static u8
/* Optional resource_source (Index and String) */
{ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address16.resource_source),
0,
sizeof(struct aml_resource_address16)}
};
/*******************************************************************************
*
* acpi_rs_convert_address32 - All DWORD (32-bit) address resources
*
******************************************************************************/
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_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
sizeof(struct aml_resource_address32),
0},
/* Resource Type, General Flags, and Type-Specific Flags */
{ACPI_RSC_ADDRESS, 0, 0, 0},
/*
* These fields are contiguous in both the source and destination:
* Address Granularity
* Address Range Minimum
* Address Range Maximum
* Address Translation Offset
* Address Length
*/
{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.address32.granularity),
AML_OFFSET(address32.granularity),
5},
/* Optional resource_source (Index and String) */
{ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address32.resource_source),
0,
sizeof(struct aml_resource_address32)}
};
/*******************************************************************************
*
* acpi_rs_convert_address64 - All QWORD (64-bit) address resources
*
******************************************************************************/
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_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
sizeof(struct aml_resource_address64),
0},
/* Resource Type, General Flags, and Type-Specific Flags */
{ACPI_RSC_ADDRESS, 0, 0, 0},
/*
* These fields are contiguous in both the source and destination:
* Address Granularity
* Address Range Minimum
* Address Range Maximum
* Address Translation Offset
* Address Length
*/
{ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.address64.granularity),
AML_OFFSET(address64.granularity),
5},
/* Optional resource_source (Index and String) */
{ACPI_RSC_SOURCE, ACPI_RS_OFFSET(data.address64.resource_source),
0,
sizeof(struct aml_resource_address64)}
};
/*******************************************************************************
*
* acpi_rs_convert_ext_address64 - All Extended (64-bit) address resources
*
******************************************************************************/
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},
/* Resource Type, General Flags, and Type-Specific Flags */
{ACPI_RSC_ADDRESS, 0, 0, 0},
/* Revision ID */
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.ext_address64.revision_iD),
AML_OFFSET(ext_address64.revision_iD),
1},
/*
* 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_RSC_MOVE64, ACPI_RS_OFFSET(data.ext_address64.granularity),
AML_OFFSET(ext_address64.granularity),
6}
};
/*******************************************************************************
*
* acpi_rs_convert_general_flags - Flags common to all address descriptors
*
******************************************************************************/
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)},
/* Resource Type (Memory, Io, bus_number, etc.) */
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.address.resource_type),
AML_OFFSET(address.resource_type),
1},
/* General Flags - Consume, Decode, min_fixed, max_fixed */
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.producer_consumer),
AML_OFFSET(address.flags),
0},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.decode),
AML_OFFSET(address.flags),
1},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.min_address_fixed),
AML_OFFSET(address.flags),
2},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.max_address_fixed),
AML_OFFSET(address.flags),
3}
};
/*******************************************************************************
*
* acpi_rs_convert_mem_flags - Flags common to Memory address descriptors
*
******************************************************************************/
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)},
/* Memory-specific flags */
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.write_protect),
AML_OFFSET(address.specific_flags),
0},
{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.mem.caching),
AML_OFFSET(address.specific_flags),
1},
{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
*
******************************************************************************/
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)},
/* I/O-specific flags */
{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.address.info.io.range_type),
AML_OFFSET(address.specific_flags),
0},
{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_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
*
******************************************************************************/
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)
union aml_resource *aml)
{
ACPI_FUNCTION_ENTRY();
/* Producer / Consumer - flag bit[0] */
/* Validate the Resource Type */
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.
*
******************************************************************************/
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);
/* Memory Attributes (_MEM) - flag bits[2:1] */
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)));
if ((aml->address.resource_type > 2)
&& (aml->address.resource_type < 0xC0)) {
return (FALSE);
}
return (0);
/* Get the Resource Type and General Flags */
(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) */
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->data.address.info.type_specific =
aml->address.specific_flags;
}
return (TRUE);
}
/*******************************************************************************
@@ -228,502 +352,29 @@ static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource)
*
******************************************************************************/
static void
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.) */
/* Set the Resource Type and General Flags */
aml->address.resource_type = (u8) resource->data.address.resource_type;
(void)acpi_rs_convert_resource_to_aml(resource, aml,
acpi_rs_convert_general_flags);
/* Set the general flags */
/* Set the Type-Specific Flags (Memory and I/O descriptors only) */
aml->address.flags = acpi_rs_encode_general_flags(&resource->data);
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 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);
aml->address.specific_flags =
resource->data.address.info.type_specific;
}
/* 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);
}
/*
* 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.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);
/* Complete the resource header */
resource->type = ACPI_RESOURCE_TYPE_ADDRESS16;
return_ACPI_STATUS(AE_OK);
}
/*******************************************************************************
*
* 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_status
acpi_rs_set_address16(struct acpi_resource *resource, union aml_resource *aml)
{
acpi_size descriptor_length;
ACPI_FUNCTION_TRACE("rs_set_address16");
/* Set the Resource Type, General Flags, and Type-Specific Flags */
acpi_rs_set_address_common(aml, resource);
/*
* 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->address16.granularity,
&resource->data.address16.granularity, 5,
ACPI_MOVE_TYPE_32_TO_16);
/* Resource Source Index and Resource Source are optional */
descriptor_length = acpi_rs_set_resource_source(aml,
sizeof(struct
aml_resource_address16),
&resource->data.
address16.
resource_source);
/* Complete the AML descriptor header */
acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS16,
descriptor_length, aml);
return_ACPI_STATUS(AE_OK);
}
/*******************************************************************************
*
* 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_status
acpi_rs_get_address32(union aml_resource *aml,
u16 aml_resource_length, struct acpi_resource *resource)
{
ACPI_FUNCTION_TRACE("rs_get_address32");
/* Get the 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);
}
/*
* 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.address32.granularity,
&aml->address32.granularity, 5,
ACPI_MOVE_TYPE_32_TO_32);
/* Get the 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);
}
/*******************************************************************************
*
* 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_status
acpi_rs_set_address32(struct acpi_resource *resource, union aml_resource *aml)
{
acpi_size descriptor_length;
ACPI_FUNCTION_TRACE("rs_set_address32");
/* Set the Resource Type, General Flags, and Type-Specific Flags */
acpi_rs_set_address_common(aml, resource);
/*
* 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->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);
}
/*******************************************************************************
*
* 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_status
acpi_rs_get_address64(union aml_resource *aml,
u16 aml_resource_length, struct acpi_resource *resource)
{
ACPI_FUNCTION_TRACE("rs_get_address64");
/* 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);
}
/*
* 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);
/* Get the optional resource_source (index and string) */
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);
/* Complete the resource header */
resource->type = ACPI_RESOURCE_TYPE_ADDRESS64;
return_ACPI_STATUS(AE_OK);
}
/*******************************************************************************
*
* 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_status
acpi_rs_set_address64(struct acpi_resource *resource, union aml_resource *aml)
{
acpi_size descriptor_length;
ACPI_FUNCTION_TRACE("rs_set_address64");
/* Set the Resource Type, General Flags, and Type-Specific Flags */
acpi_rs_set_address_common(aml, resource);
/*
* 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);
/* Resource Source Index and Resource Source are optional */
descriptor_length = acpi_rs_set_resource_source(aml,
sizeof(struct
aml_resource_address64),
&resource->data.
address64.
resource_source);
/* Complete the AML descriptor header */
acpi_rs_set_resource_header(ACPI_RESOURCE_NAME_ADDRESS64,
descriptor_length, aml);
return_ACPI_STATUS(AE_OK);
}
/*******************************************************************************
*
* FUNCTION: acpi_rs_get_ext_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_status
acpi_rs_get_ext_address64(union aml_resource *aml,
u16 aml_resource_length,
struct acpi_resource *resource)
{
ACPI_FUNCTION_TRACE("rs_get_ext_address64");
/* 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);
}
/*
* 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 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);
/* Complete the resource header */
resource->type = ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64;
resource->length =
ACPI_SIZEOF_RESOURCE(struct acpi_resource_extended_address64);
return_ACPI_STATUS(AE_OK);
}
/*******************************************************************************
*
* FUNCTION: acpi_rs_set_ext_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_status
acpi_rs_set_ext_address64(struct acpi_resource *resource,
union aml_resource *aml)
{
ACPI_FUNCTION_TRACE("rs_set_ext_address64");
/* Set the Resource Type, General Flags, and Type-Specific Flags */
acpi_rs_set_address_common(aml, resource);
/* Only one Revision ID is currently supported */
aml->ext_address64.revision_iD = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
aml->ext_address64.reserved = 0;
/*
* 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);
}