diff options
Diffstat (limited to 'drivers/acpi/acpica/rslist.c')
-rw-r--r-- | drivers/acpi/acpica/rslist.c | 77 |
1 files changed, 62 insertions, 15 deletions
diff --git a/drivers/acpi/acpica/rslist.c b/drivers/acpi/acpica/rslist.c index 1bfcef736c5..9be129f5d6f 100644 --- a/drivers/acpi/acpica/rslist.c +++ b/drivers/acpi/acpica/rslist.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2011, Intel Corp. | 8 | * Copyright (C) 2000 - 2012, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -70,6 +70,8 @@ acpi_rs_convert_aml_to_resources(u8 * aml, | |||
70 | struct acpi_resource **resource_ptr = | 70 | struct acpi_resource **resource_ptr = |
71 | ACPI_CAST_INDIRECT_PTR(struct acpi_resource, context); | 71 | ACPI_CAST_INDIRECT_PTR(struct acpi_resource, context); |
72 | struct acpi_resource *resource; | 72 | struct acpi_resource *resource; |
73 | union aml_resource *aml_resource; | ||
74 | struct acpi_rsconvert_info *conversion_table; | ||
73 | acpi_status status; | 75 | acpi_status status; |
74 | 76 | ||
75 | ACPI_FUNCTION_TRACE(rs_convert_aml_to_resources); | 77 | ACPI_FUNCTION_TRACE(rs_convert_aml_to_resources); |
@@ -84,14 +86,37 @@ acpi_rs_convert_aml_to_resources(u8 * aml, | |||
84 | "Misaligned resource pointer %p", resource)); | 86 | "Misaligned resource pointer %p", resource)); |
85 | } | 87 | } |
86 | 88 | ||
89 | /* Get the appropriate conversion info table */ | ||
90 | |||
91 | aml_resource = ACPI_CAST_PTR(union aml_resource, aml); | ||
92 | if (acpi_ut_get_resource_type(aml) == ACPI_RESOURCE_NAME_SERIAL_BUS) { | ||
93 | if (aml_resource->common_serial_bus.type > | ||
94 | AML_RESOURCE_MAX_SERIALBUSTYPE) { | ||
95 | conversion_table = NULL; | ||
96 | } else { | ||
97 | /* This is an I2C, SPI, or UART serial_bus descriptor */ | ||
98 | |||
99 | conversion_table = | ||
100 | acpi_gbl_convert_resource_serial_bus_dispatch | ||
101 | [aml_resource->common_serial_bus.type]; | ||
102 | } | ||
103 | } else { | ||
104 | conversion_table = | ||
105 | acpi_gbl_get_resource_dispatch[resource_index]; | ||
106 | } | ||
107 | |||
108 | if (!conversion_table) { | ||
109 | ACPI_ERROR((AE_INFO, | ||
110 | "Invalid/unsupported resource descriptor: Type 0x%2.2X", | ||
111 | resource_index)); | ||
112 | return (AE_AML_INVALID_RESOURCE_TYPE); | ||
113 | } | ||
114 | |||
87 | /* Convert the AML byte stream resource to a local resource struct */ | 115 | /* Convert the AML byte stream resource to a local resource struct */ |
88 | 116 | ||
89 | status = | 117 | status = |
90 | acpi_rs_convert_aml_to_resource(resource, | 118 | acpi_rs_convert_aml_to_resource(resource, aml_resource, |
91 | ACPI_CAST_PTR(union aml_resource, | 119 | conversion_table); |
92 | aml), | ||
93 | acpi_gbl_get_resource_dispatch | ||
94 | [resource_index]); | ||
95 | if (ACPI_FAILURE(status)) { | 120 | if (ACPI_FAILURE(status)) { |
96 | ACPI_EXCEPTION((AE_INFO, status, | 121 | ACPI_EXCEPTION((AE_INFO, status, |
97 | "Could not convert AML resource (Type 0x%X)", | 122 | "Could not convert AML resource (Type 0x%X)", |
@@ -106,7 +131,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml, | |||
106 | 131 | ||
107 | /* Point to the next structure in the output buffer */ | 132 | /* Point to the next structure in the output buffer */ |
108 | 133 | ||
109 | *resource_ptr = ACPI_ADD_PTR(void, resource, resource->length); | 134 | *resource_ptr = ACPI_NEXT_RESOURCE(resource); |
110 | return_ACPI_STATUS(AE_OK); | 135 | return_ACPI_STATUS(AE_OK); |
111 | } | 136 | } |
112 | 137 | ||
@@ -135,6 +160,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
135 | { | 160 | { |
136 | u8 *aml = output_buffer; | 161 | u8 *aml = output_buffer; |
137 | u8 *end_aml = output_buffer + aml_size_needed; | 162 | u8 *end_aml = output_buffer + aml_size_needed; |
163 | struct acpi_rsconvert_info *conversion_table; | ||
138 | acpi_status status; | 164 | acpi_status status; |
139 | 165 | ||
140 | ACPI_FUNCTION_TRACE(rs_convert_resources_to_aml); | 166 | ACPI_FUNCTION_TRACE(rs_convert_resources_to_aml); |
@@ -154,11 +180,34 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
154 | 180 | ||
155 | /* Perform the conversion */ | 181 | /* Perform the conversion */ |
156 | 182 | ||
157 | status = acpi_rs_convert_resource_to_aml(resource, ACPI_CAST_PTR(union | 183 | if (resource->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) { |
158 | aml_resource, | 184 | if (resource->data.common_serial_bus.type > |
159 | aml), | 185 | AML_RESOURCE_MAX_SERIALBUSTYPE) { |
160 | acpi_gbl_set_resource_dispatch | 186 | conversion_table = NULL; |
161 | [resource->type]); | 187 | } else { |
188 | /* This is an I2C, SPI, or UART serial_bus descriptor */ | ||
189 | |||
190 | conversion_table = | ||
191 | acpi_gbl_convert_resource_serial_bus_dispatch | ||
192 | [resource->data.common_serial_bus.type]; | ||
193 | } | ||
194 | } else { | ||
195 | conversion_table = | ||
196 | acpi_gbl_set_resource_dispatch[resource->type]; | ||
197 | } | ||
198 | |||
199 | if (!conversion_table) { | ||
200 | ACPI_ERROR((AE_INFO, | ||
201 | "Invalid/unsupported resource descriptor: Type 0x%2.2X", | ||
202 | resource->type)); | ||
203 | return (AE_AML_INVALID_RESOURCE_TYPE); | ||
204 | } | ||
205 | |||
206 | status = acpi_rs_convert_resource_to_aml(resource, | ||
207 | ACPI_CAST_PTR(union | ||
208 | aml_resource, | ||
209 | aml), | ||
210 | conversion_table); | ||
162 | if (ACPI_FAILURE(status)) { | 211 | if (ACPI_FAILURE(status)) { |
163 | ACPI_EXCEPTION((AE_INFO, status, | 212 | ACPI_EXCEPTION((AE_INFO, status, |
164 | "Could not convert resource (type 0x%X) to AML", | 213 | "Could not convert resource (type 0x%X) to AML", |
@@ -192,9 +241,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
192 | 241 | ||
193 | /* Point to the next input resource descriptor */ | 242 | /* Point to the next input resource descriptor */ |
194 | 243 | ||
195 | resource = | 244 | resource = ACPI_NEXT_RESOURCE(resource); |
196 | ACPI_ADD_PTR(struct acpi_resource, resource, | ||
197 | resource->length); | ||
198 | } | 245 | } |
199 | 246 | ||
200 | /* Completed buffer, but did not find an end_tag resource descriptor */ | 247 | /* Completed buffer, but did not find an end_tag resource descriptor */ |