1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#include <acpi/acpi.h>
45#include "accommon.h"
46#include "acresrc.h"
47
48#define _COMPONENT ACPI_RESOURCES
49ACPI_MODULE_NAME("rslist")
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65acpi_status
66acpi_rs_convert_aml_to_resources(u8 * aml,
67 u32 length,
68 u32 offset, u8 resource_index, void **context)
69{
70 struct acpi_resource **resource_ptr =
71 ACPI_CAST_INDIRECT_PTR(struct acpi_resource, context);
72 struct acpi_resource *resource;
73 union aml_resource *aml_resource;
74 struct acpi_rsconvert_info *conversion_table;
75 acpi_status status;
76
77 ACPI_FUNCTION_TRACE(rs_convert_aml_to_resources);
78
79
80
81
82
83 resource = *resource_ptr;
84 if (ACPI_IS_MISALIGNED(resource)) {
85 ACPI_WARNING((AE_INFO,
86 "Misaligned resource pointer %p", resource));
87 }
88
89
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
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_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
113 }
114
115
116
117 status =
118 acpi_rs_convert_aml_to_resource(resource, aml_resource,
119 conversion_table);
120 if (ACPI_FAILURE(status)) {
121 ACPI_EXCEPTION((AE_INFO, status,
122 "Could not convert AML resource (Type 0x%X)",
123 *aml));
124 return_ACPI_STATUS(status);
125 }
126
127 ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
128 "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
129 acpi_ut_get_resource_type(aml), length,
130 resource->length));
131
132
133
134 *resource_ptr = ACPI_NEXT_RESOURCE(resource);
135 return_ACPI_STATUS(AE_OK);
136}
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157acpi_status
158acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
159 acpi_size aml_size_needed, u8 * output_buffer)
160{
161 u8 *aml = output_buffer;
162 u8 *end_aml = output_buffer + aml_size_needed;
163 struct acpi_rsconvert_info *conversion_table;
164 acpi_status status;
165
166 ACPI_FUNCTION_TRACE(rs_convert_resources_to_aml);
167
168
169
170 while (aml < end_aml) {
171
172
173
174 if (resource->type > ACPI_RESOURCE_TYPE_MAX) {
175 ACPI_ERROR((AE_INFO,
176 "Invalid descriptor type (0x%X) in resource list",
177 resource->type));
178 return_ACPI_STATUS(AE_BAD_DATA);
179 }
180
181
182
183 if (!resource->length) {
184 ACPI_ERROR((AE_INFO,
185 "Invalid zero length descriptor in resource list\n"));
186 return_ACPI_STATUS(AE_AML_BAD_RESOURCE_LENGTH);
187 }
188
189
190
191 if (resource->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
192 if (resource->data.common_serial_bus.type >
193 AML_RESOURCE_MAX_SERIALBUSTYPE) {
194 conversion_table = NULL;
195 } else {
196
197
198 conversion_table =
199 acpi_gbl_convert_resource_serial_bus_dispatch
200 [resource->data.common_serial_bus.type];
201 }
202 } else {
203 conversion_table =
204 acpi_gbl_set_resource_dispatch[resource->type];
205 }
206
207 if (!conversion_table) {
208 ACPI_ERROR((AE_INFO,
209 "Invalid/unsupported resource descriptor: Type 0x%2.2X",
210 resource->type));
211 return_ACPI_STATUS(AE_AML_INVALID_RESOURCE_TYPE);
212 }
213
214 status = acpi_rs_convert_resource_to_aml(resource,
215 ACPI_CAST_PTR(union
216 aml_resource,
217 aml),
218 conversion_table);
219 if (ACPI_FAILURE(status)) {
220 ACPI_EXCEPTION((AE_INFO, status,
221 "Could not convert resource (type 0x%X) to AML",
222 resource->type));
223 return_ACPI_STATUS(status);
224 }
225
226
227
228 status = acpi_ut_validate_resource(NULL,
229 ACPI_CAST_PTR(union
230 aml_resource,
231 aml), NULL);
232 if (ACPI_FAILURE(status)) {
233 return_ACPI_STATUS(status);
234 }
235
236
237
238 if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) {
239
240
241
242 return_ACPI_STATUS(AE_OK);
243 }
244
245
246
247
248
249 aml += acpi_ut_get_descriptor_length(aml);
250
251
252
253 resource = ACPI_NEXT_RESOURCE(resource);
254 }
255
256
257
258 return_ACPI_STATUS(AE_AML_NO_RESOURCE_END_TAG);
259}
260