ACPI 5.0: Support for all new resource descriptors

FixedDMA, GPIO descriptors, SerialBus descriptors

Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Lin Ming
2011-11-16 14:38:13 +08:00
zatwierdzone przez Len Brown
rodzic 2da120b684
commit e0fe0a8d4e
16 zmienionych plików z 1776 dodań i 119 usunięć

Wyświetl plik

@@ -313,6 +313,38 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed)
resource_source));
break;
case ACPI_RESOURCE_TYPE_GPIO:
total_size =
(acpi_rs_length) (total_size +
(resource->data.gpio.
pin_table_length * 2) +
resource->data.gpio.
resource_source.string_length +
resource->data.gpio.
vendor_length);
break;
case ACPI_RESOURCE_TYPE_SERIAL_BUS:
total_size =
acpi_gbl_aml_resource_serial_bus_sizes[resource->
data.
common_serial_bus.
type];
total_size = (acpi_rs_length) (total_size +
resource->data.
i2c_serial_bus.
resource_source.
string_length +
resource->data.
i2c_serial_bus.
vendor_length);
break;
default:
break;
}
@@ -362,10 +394,11 @@ acpi_rs_get_list_length(u8 * aml_buffer,
u32 extra_struct_bytes;
u8 resource_index;
u8 minimum_aml_resource_length;
union aml_resource *aml_resource;
ACPI_FUNCTION_TRACE(rs_get_list_length);
*size_needed = 0;
*size_needed = ACPI_RS_SIZE_MIN; /* Minimum size is one end_tag */
end_aml = aml_buffer + aml_buffer_length;
/* Walk the list of AML resource descriptors */
@@ -376,9 +409,15 @@ acpi_rs_get_list_length(u8 * aml_buffer,
status = acpi_ut_validate_resource(aml_buffer, &resource_index);
if (ACPI_FAILURE(status)) {
/*
* Exit on failure. Cannot continue because the descriptor length
* may be bogus also.
*/
return_ACPI_STATUS(status);
}
aml_resource = (void *)aml_buffer;
/* Get the resource length and base (minimum) AML size */
resource_length = acpi_ut_get_resource_length(aml_buffer);
@@ -422,10 +461,8 @@ acpi_rs_get_list_length(u8 * aml_buffer,
case ACPI_RESOURCE_NAME_END_TAG:
/*
* End Tag:
* This is the normal exit, add size of end_tag
* End Tag: This is the normal exit
*/
*size_needed += ACPI_RS_SIZE_MIN;
return_ACPI_STATUS(AE_OK);
case ACPI_RESOURCE_NAME_ADDRESS32:
@@ -457,6 +494,33 @@ acpi_rs_get_list_length(u8 * aml_buffer,
minimum_aml_resource_length);
break;
case ACPI_RESOURCE_NAME_GPIO:
/* Vendor data is optional */
if (aml_resource->gpio.vendor_length) {
extra_struct_bytes +=
aml_resource->gpio.vendor_offset -
aml_resource->gpio.pin_table_offset +
aml_resource->gpio.vendor_length;
} else {
extra_struct_bytes +=
aml_resource->large_header.resource_length +
sizeof(struct aml_resource_large_header) -
aml_resource->gpio.pin_table_offset;
}
break;
case ACPI_RESOURCE_NAME_SERIAL_BUS:
minimum_aml_resource_length =
acpi_gbl_resource_aml_serial_bus_sizes
[aml_resource->common_serial_bus.type];
extra_struct_bytes +=
aml_resource->common_serial_bus.resource_length -
minimum_aml_resource_length;
break;
default:
break;
}
@@ -467,9 +531,18 @@ acpi_rs_get_list_length(u8 * aml_buffer,
* Important: Round the size up for the appropriate alignment. This
* is a requirement on IA64.
*/
buffer_size = acpi_gbl_resource_struct_sizes[resource_index] +
extra_struct_bytes;
buffer_size = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
if (acpi_ut_get_resource_type(aml_buffer) ==
ACPI_RESOURCE_NAME_SERIAL_BUS) {
buffer_size =
acpi_gbl_resource_struct_serial_bus_sizes
[aml_resource->common_serial_bus.type] +
extra_struct_bytes;
} else {
buffer_size =
acpi_gbl_resource_struct_sizes[resource_index] +
extra_struct_bytes;
}
buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
*size_needed += buffer_size;