Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /******************************************************************************* |
2 | * | |
3 | * Module Name: rsmem24 - Memory resource descriptors | |
4 | * | |
5 | ******************************************************************************/ | |
6 | ||
7 | /* | |
8 | * Copyright (C) 2000 - 2005, R. Byron Moore | |
9 | * All rights reserved. | |
10 | * | |
11 | * Redistribution and use in source and binary forms, with or without | |
12 | * modification, are permitted provided that the following conditions | |
13 | * are met: | |
14 | * 1. Redistributions of source code must retain the above copyright | |
15 | * notice, this list of conditions, and the following disclaimer, | |
16 | * without modification. | |
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | |
18 | * substantially similar to the "NO WARRANTY" disclaimer below | |
19 | * ("Disclaimer") and any redistribution must be conditioned upon | |
20 | * including a substantially similar Disclaimer requirement for further | |
21 | * binary redistribution. | |
22 | * 3. Neither the names of the above-listed copyright holders nor the names | |
23 | * of any contributors may be used to endorse or promote products derived | |
24 | * from this software without specific prior written permission. | |
25 | * | |
26 | * Alternatively, this software may be distributed under the terms of the | |
27 | * GNU General Public License ("GPL") version 2 as published by the Free | |
28 | * Software Foundation. | |
29 | * | |
30 | * NO WARRANTY | |
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | |
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | |
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
41 | * POSSIBILITY OF SUCH DAMAGES. | |
42 | */ | |
43 | ||
44 | ||
45 | #include <acpi/acpi.h> | |
46 | #include <acpi/acresrc.h> | |
47 | ||
48 | #define _COMPONENT ACPI_RESOURCES | |
49 | ACPI_MODULE_NAME ("rsmemory") | |
50 | ||
51 | ||
52 | /******************************************************************************* | |
53 | * | |
54 | * FUNCTION: acpi_rs_memory24_resource | |
55 | * | |
56 | * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte | |
57 | * stream | |
58 | * bytes_consumed - Pointer to where the number of bytes | |
59 | * consumed the byte_stream_buffer is | |
60 | * returned | |
61 | * output_buffer - Pointer to the return data buffer | |
62 | * structure_size - Pointer to where the number of bytes | |
63 | * in the return data struct is returned | |
64 | * | |
65 | * RETURN: Status | |
66 | * | |
67 | * DESCRIPTION: Take the resource byte stream and fill out the appropriate | |
68 | * structure pointed to by the output_buffer. Return the | |
69 | * number of bytes consumed from the byte stream. | |
70 | * | |
71 | ******************************************************************************/ | |
72 | ||
73 | acpi_status | |
74 | acpi_rs_memory24_resource ( | |
75 | u8 *byte_stream_buffer, | |
76 | acpi_size *bytes_consumed, | |
77 | u8 **output_buffer, | |
78 | acpi_size *structure_size) | |
79 | { | |
80 | u8 *buffer = byte_stream_buffer; | |
81 | struct acpi_resource *output_struct = (void *) *output_buffer; | |
82 | u16 temp16 = 0; | |
83 | u8 temp8 = 0; | |
44f6c012 RM |
84 | acpi_size struct_size = ACPI_SIZEOF_RESOURCE ( |
85 | struct acpi_resource_mem24); | |
1da177e4 LT |
86 | |
87 | ||
88 | ACPI_FUNCTION_TRACE ("rs_memory24_resource"); | |
89 | ||
90 | ||
44f6c012 RM |
91 | /* Point past the Descriptor to get the number of bytes consumed */ |
92 | ||
1da177e4 LT |
93 | buffer += 1; |
94 | ||
95 | ACPI_MOVE_16_TO_16 (&temp16, buffer); | |
96 | buffer += 2; | |
97 | *bytes_consumed = (acpi_size) temp16 + 3; | |
98 | output_struct->id = ACPI_RSTYPE_MEM24; | |
99 | ||
44f6c012 RM |
100 | /* Check Byte 3 the Read/Write bit */ |
101 | ||
1da177e4 LT |
102 | temp8 = *buffer; |
103 | buffer += 1; | |
104 | output_struct->data.memory24.read_write_attribute = temp8 & 0x01; | |
105 | ||
44f6c012 RM |
106 | /* Get min_base_address (Bytes 4-5) */ |
107 | ||
1da177e4 LT |
108 | ACPI_MOVE_16_TO_16 (&temp16, buffer); |
109 | buffer += 2; | |
110 | output_struct->data.memory24.min_base_address = temp16; | |
111 | ||
44f6c012 RM |
112 | /* Get max_base_address (Bytes 6-7) */ |
113 | ||
1da177e4 LT |
114 | ACPI_MOVE_16_TO_16 (&temp16, buffer); |
115 | buffer += 2; | |
116 | output_struct->data.memory24.max_base_address = temp16; | |
117 | ||
44f6c012 RM |
118 | /* Get Alignment (Bytes 8-9) */ |
119 | ||
1da177e4 LT |
120 | ACPI_MOVE_16_TO_16 (&temp16, buffer); |
121 | buffer += 2; | |
122 | output_struct->data.memory24.alignment = temp16; | |
123 | ||
44f6c012 RM |
124 | /* Get range_length (Bytes 10-11) */ |
125 | ||
1da177e4 LT |
126 | ACPI_MOVE_16_TO_16 (&temp16, buffer); |
127 | output_struct->data.memory24.range_length = temp16; | |
128 | ||
44f6c012 RM |
129 | /* Set the Length parameter */ |
130 | ||
1da177e4 LT |
131 | output_struct->length = (u32) struct_size; |
132 | ||
44f6c012 RM |
133 | /* Return the final size of the structure */ |
134 | ||
1da177e4 LT |
135 | *structure_size = struct_size; |
136 | return_ACPI_STATUS (AE_OK); | |
137 | } | |
138 | ||
139 | ||
140 | /******************************************************************************* | |
141 | * | |
142 | * FUNCTION: acpi_rs_memory24_stream | |
143 | * | |
144 | * PARAMETERS: linked_list - Pointer to the resource linked list | |
145 | * output_buffer - Pointer to the user's return buffer | |
146 | * bytes_consumed - Pointer to where the number of bytes | |
147 | * used in the output_buffer is returned | |
148 | * | |
149 | * RETURN: Status | |
150 | * | |
151 | * DESCRIPTION: Take the linked list resource structure and fills in the | |
152 | * the appropriate bytes in a byte stream | |
153 | * | |
154 | ******************************************************************************/ | |
155 | ||
156 | acpi_status | |
157 | acpi_rs_memory24_stream ( | |
158 | struct acpi_resource *linked_list, | |
159 | u8 **output_buffer, | |
160 | acpi_size *bytes_consumed) | |
161 | { | |
162 | u8 *buffer = *output_buffer; | |
163 | u16 temp16 = 0; | |
164 | u8 temp8 = 0; | |
165 | ||
166 | ||
167 | ACPI_FUNCTION_TRACE ("rs_memory24_stream"); | |
168 | ||
169 | ||
44f6c012 RM |
170 | /* The descriptor field is static */ |
171 | ||
1da177e4 LT |
172 | *buffer = 0x81; |
173 | buffer += 1; | |
174 | ||
44f6c012 RM |
175 | /* The length field is static */ |
176 | ||
1da177e4 LT |
177 | temp16 = 0x09; |
178 | ACPI_MOVE_16_TO_16 (buffer, &temp16); | |
179 | buffer += 2; | |
180 | ||
44f6c012 RM |
181 | /* Set the Information Byte */ |
182 | ||
1da177e4 LT |
183 | temp8 = (u8) (linked_list->data.memory24.read_write_attribute & 0x01); |
184 | *buffer = temp8; | |
185 | buffer += 1; | |
186 | ||
44f6c012 RM |
187 | /* Set the Range minimum base address */ |
188 | ||
1da177e4 LT |
189 | ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.min_base_address); |
190 | buffer += 2; | |
191 | ||
44f6c012 RM |
192 | /* Set the Range maximum base address */ |
193 | ||
1da177e4 LT |
194 | ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.max_base_address); |
195 | buffer += 2; | |
196 | ||
44f6c012 RM |
197 | /* Set the base alignment */ |
198 | ||
1da177e4 LT |
199 | ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.alignment); |
200 | buffer += 2; | |
201 | ||
44f6c012 RM |
202 | /* Set the range length */ |
203 | ||
1da177e4 LT |
204 | ACPI_MOVE_32_TO_16 (buffer, &linked_list->data.memory24.range_length); |
205 | buffer += 2; | |
206 | ||
44f6c012 RM |
207 | /* Return the number of bytes consumed in this operation */ |
208 | ||
1da177e4 LT |
209 | *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer); |
210 | return_ACPI_STATUS (AE_OK); | |
211 | } | |
212 | ||
213 | ||
214 | /******************************************************************************* | |
215 | * | |
216 | * FUNCTION: acpi_rs_memory32_range_resource | |
217 | * | |
218 | * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte | |
219 | * stream | |
220 | * bytes_consumed - Pointer to where the number of bytes | |
221 | * consumed the byte_stream_buffer is | |
222 | * returned | |
223 | * output_buffer - Pointer to the return data buffer | |
224 | * structure_size - Pointer to where the number of bytes | |
225 | * in the return data struct is returned | |
226 | * | |
227 | * RETURN: Status | |
228 | * | |
229 | * DESCRIPTION: Take the resource byte stream and fill out the appropriate | |
230 | * structure pointed to by the output_buffer. Return the | |
231 | * number of bytes consumed from the byte stream. | |
232 | * | |
233 | ******************************************************************************/ | |
234 | ||
235 | acpi_status | |
236 | acpi_rs_memory32_range_resource ( | |
237 | u8 *byte_stream_buffer, | |
238 | acpi_size *bytes_consumed, | |
239 | u8 **output_buffer, | |
240 | acpi_size *structure_size) | |
241 | { | |
242 | u8 *buffer = byte_stream_buffer; | |
243 | struct acpi_resource *output_struct = (void *) *output_buffer; | |
244 | u16 temp16 = 0; | |
245 | u8 temp8 = 0; | |
44f6c012 RM |
246 | acpi_size struct_size = ACPI_SIZEOF_RESOURCE ( |
247 | struct acpi_resource_mem32); | |
1da177e4 LT |
248 | |
249 | ||
250 | ACPI_FUNCTION_TRACE ("rs_memory32_range_resource"); | |
251 | ||
252 | ||
44f6c012 RM |
253 | /* Point past the Descriptor to get the number of bytes consumed */ |
254 | ||
1da177e4 LT |
255 | buffer += 1; |
256 | ||
257 | ACPI_MOVE_16_TO_16 (&temp16, buffer); | |
258 | buffer += 2; | |
259 | *bytes_consumed = (acpi_size) temp16 + 3; | |
260 | ||
261 | output_struct->id = ACPI_RSTYPE_MEM32; | |
262 | ||
263 | /* | |
264 | * Point to the place in the output buffer where the data portion will | |
265 | * begin. | |
266 | * 1. Set the RESOURCE_DATA * Data to point to its own address, then | |
267 | * 2. Set the pointer to the next address. | |
268 | * | |
269 | * NOTE: output_struct->Data is cast to u8, otherwise, this addition adds | |
270 | * 4 * sizeof(RESOURCE_DATA) instead of 4 * sizeof(u8) | |
271 | */ | |
272 | ||
44f6c012 RM |
273 | /* Check Byte 3 the Read/Write bit */ |
274 | ||
1da177e4 LT |
275 | temp8 = *buffer; |
276 | buffer += 1; | |
277 | ||
278 | output_struct->data.memory32.read_write_attribute = temp8 & 0x01; | |
279 | ||
44f6c012 RM |
280 | /* Get min_base_address (Bytes 4-7) */ |
281 | ||
1da177e4 LT |
282 | ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.min_base_address, buffer); |
283 | buffer += 4; | |
284 | ||
44f6c012 RM |
285 | /* Get max_base_address (Bytes 8-11) */ |
286 | ||
1da177e4 LT |
287 | ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.max_base_address, buffer); |
288 | buffer += 4; | |
289 | ||
44f6c012 RM |
290 | /* Get Alignment (Bytes 12-15) */ |
291 | ||
1da177e4 LT |
292 | ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.alignment, buffer); |
293 | buffer += 4; | |
294 | ||
44f6c012 RM |
295 | /* Get range_length (Bytes 16-19) */ |
296 | ||
1da177e4 LT |
297 | ACPI_MOVE_32_TO_32 (&output_struct->data.memory32.range_length, buffer); |
298 | ||
44f6c012 RM |
299 | /* Set the Length parameter */ |
300 | ||
1da177e4 LT |
301 | output_struct->length = (u32) struct_size; |
302 | ||
44f6c012 RM |
303 | /* Return the final size of the structure */ |
304 | ||
1da177e4 LT |
305 | *structure_size = struct_size; |
306 | return_ACPI_STATUS (AE_OK); | |
307 | } | |
308 | ||
309 | ||
310 | /******************************************************************************* | |
311 | * | |
312 | * FUNCTION: acpi_rs_fixed_memory32_resource | |
313 | * | |
314 | * PARAMETERS: byte_stream_buffer - Pointer to the resource input byte | |
315 | * stream | |
316 | * bytes_consumed - Pointer to where the number of bytes | |
317 | * consumed the byte_stream_buffer is | |
318 | * returned | |
319 | * output_buffer - Pointer to the return data buffer | |
320 | * structure_size - Pointer to where the number of bytes | |
321 | * in the return data struct is returned | |
322 | * | |
323 | * RETURN: Status | |
324 | * | |
325 | * DESCRIPTION: Take the resource byte stream and fill out the appropriate | |
326 | * structure pointed to by the output_buffer. Return the | |
327 | * number of bytes consumed from the byte stream. | |
328 | * | |
329 | ******************************************************************************/ | |
330 | ||
331 | acpi_status | |
332 | acpi_rs_fixed_memory32_resource ( | |
333 | u8 *byte_stream_buffer, | |
334 | acpi_size *bytes_consumed, | |
335 | u8 **output_buffer, | |
336 | acpi_size *structure_size) | |
337 | { | |
338 | u8 *buffer = byte_stream_buffer; | |
339 | struct acpi_resource *output_struct = (void *) *output_buffer; | |
340 | u16 temp16 = 0; | |
341 | u8 temp8 = 0; | |
44f6c012 RM |
342 | acpi_size struct_size = ACPI_SIZEOF_RESOURCE ( |
343 | struct acpi_resource_fixed_mem32); | |
1da177e4 LT |
344 | |
345 | ||
346 | ACPI_FUNCTION_TRACE ("rs_fixed_memory32_resource"); | |
347 | ||
348 | ||
44f6c012 RM |
349 | /* Point past the Descriptor to get the number of bytes consumed */ |
350 | ||
1da177e4 LT |
351 | buffer += 1; |
352 | ACPI_MOVE_16_TO_16 (&temp16, buffer); | |
353 | ||
354 | buffer += 2; | |
355 | *bytes_consumed = (acpi_size) temp16 + 3; | |
356 | ||
357 | output_struct->id = ACPI_RSTYPE_FIXED_MEM32; | |
358 | ||
44f6c012 RM |
359 | /* Check Byte 3 the Read/Write bit */ |
360 | ||
1da177e4 LT |
361 | temp8 = *buffer; |
362 | buffer += 1; | |
363 | output_struct->data.fixed_memory32.read_write_attribute = temp8 & 0x01; | |
364 | ||
44f6c012 RM |
365 | /* Get range_base_address (Bytes 4-7) */ |
366 | ||
367 | ACPI_MOVE_32_TO_32 (&output_struct->data.fixed_memory32.range_base_address, | |
368 | buffer); | |
1da177e4 LT |
369 | buffer += 4; |
370 | ||
44f6c012 RM |
371 | /* Get range_length (Bytes 8-11) */ |
372 | ||
1da177e4 LT |
373 | ACPI_MOVE_32_TO_32 (&output_struct->data.fixed_memory32.range_length, buffer); |
374 | ||
44f6c012 RM |
375 | /* Set the Length parameter */ |
376 | ||
1da177e4 LT |
377 | output_struct->length = (u32) struct_size; |
378 | ||
44f6c012 RM |
379 | /* Return the final size of the structure */ |
380 | ||
1da177e4 LT |
381 | *structure_size = struct_size; |
382 | return_ACPI_STATUS (AE_OK); | |
383 | } | |
384 | ||
385 | ||
386 | /******************************************************************************* | |
387 | * | |
388 | * FUNCTION: acpi_rs_memory32_range_stream | |
389 | * | |
390 | * PARAMETERS: linked_list - Pointer to the resource linked list | |
391 | * output_buffer - Pointer to the user's return buffer | |
392 | * bytes_consumed - Pointer to where the number of bytes | |
393 | * used in the output_buffer is returned | |
394 | * | |
395 | * RETURN: Status | |
396 | * | |
397 | * DESCRIPTION: Take the linked list resource structure and fills in the | |
398 | * the appropriate bytes in a byte stream | |
399 | * | |
400 | ******************************************************************************/ | |
401 | ||
402 | acpi_status | |
403 | acpi_rs_memory32_range_stream ( | |
404 | struct acpi_resource *linked_list, | |
405 | u8 **output_buffer, | |
406 | acpi_size *bytes_consumed) | |
407 | { | |
408 | u8 *buffer = *output_buffer; | |
409 | u16 temp16 = 0; | |
410 | u8 temp8 = 0; | |
411 | ||
412 | ||
413 | ACPI_FUNCTION_TRACE ("rs_memory32_range_stream"); | |
414 | ||
415 | ||
44f6c012 RM |
416 | /* The descriptor field is static */ |
417 | ||
1da177e4 LT |
418 | *buffer = 0x85; |
419 | buffer += 1; | |
420 | ||
44f6c012 RM |
421 | /* The length field is static */ |
422 | ||
1da177e4 LT |
423 | temp16 = 0x11; |
424 | ||
425 | ACPI_MOVE_16_TO_16 (buffer, &temp16); | |
426 | buffer += 2; | |
427 | ||
44f6c012 RM |
428 | /* Set the Information Byte */ |
429 | ||
1da177e4 LT |
430 | temp8 = (u8) (linked_list->data.memory32.read_write_attribute & 0x01); |
431 | *buffer = temp8; | |
432 | buffer += 1; | |
433 | ||
44f6c012 RM |
434 | /* Set the Range minimum base address */ |
435 | ||
1da177e4 LT |
436 | ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.min_base_address); |
437 | buffer += 4; | |
438 | ||
44f6c012 RM |
439 | /* Set the Range maximum base address */ |
440 | ||
1da177e4 LT |
441 | ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.max_base_address); |
442 | buffer += 4; | |
443 | ||
44f6c012 RM |
444 | /* Set the base alignment */ |
445 | ||
1da177e4 LT |
446 | ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.alignment); |
447 | buffer += 4; | |
448 | ||
44f6c012 RM |
449 | /* Set the range length */ |
450 | ||
1da177e4 LT |
451 | ACPI_MOVE_32_TO_32 (buffer, &linked_list->data.memory32.range_length); |
452 | buffer += 4; | |
453 | ||
44f6c012 RM |
454 | /* Return the number of bytes consumed in this operation */ |
455 | ||
1da177e4 LT |
456 | *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer); |
457 | return_ACPI_STATUS (AE_OK); | |
458 | } | |
459 | ||
460 | ||
461 | /******************************************************************************* | |
462 | * | |
463 | * FUNCTION: acpi_rs_fixed_memory32_stream | |
464 | * | |
465 | * PARAMETERS: linked_list - Pointer to the resource linked list | |
466 | * output_buffer - Pointer to the user's return buffer | |
467 | * bytes_consumed - Pointer to where the number of bytes | |
468 | * used in the output_buffer is returned | |
469 | * | |
470 | * RETURN: Status | |
471 | * | |
472 | * DESCRIPTION: Take the linked list resource structure and fills in the | |
473 | * the appropriate bytes in a byte stream | |
474 | * | |
475 | ******************************************************************************/ | |
476 | ||
477 | acpi_status | |
478 | acpi_rs_fixed_memory32_stream ( | |
479 | struct acpi_resource *linked_list, | |
480 | u8 **output_buffer, | |
481 | acpi_size *bytes_consumed) | |
482 | { | |
483 | u8 *buffer = *output_buffer; | |
484 | u16 temp16 = 0; | |
485 | u8 temp8 = 0; | |
486 | ||
487 | ||
488 | ACPI_FUNCTION_TRACE ("rs_fixed_memory32_stream"); | |
489 | ||
490 | ||
44f6c012 RM |
491 | /* The descriptor field is static */ |
492 | ||
1da177e4 LT |
493 | *buffer = 0x86; |
494 | buffer += 1; | |
495 | ||
44f6c012 RM |
496 | /* The length field is static */ |
497 | ||
1da177e4 LT |
498 | temp16 = 0x09; |
499 | ||
500 | ACPI_MOVE_16_TO_16 (buffer, &temp16); | |
501 | buffer += 2; | |
502 | ||
44f6c012 RM |
503 | /* Set the Information Byte */ |
504 | ||
1da177e4 LT |
505 | temp8 = (u8) (linked_list->data.fixed_memory32.read_write_attribute & 0x01); |
506 | *buffer = temp8; | |
507 | buffer += 1; | |
508 | ||
44f6c012 RM |
509 | /* Set the Range base address */ |
510 | ||
1da177e4 | 511 | ACPI_MOVE_32_TO_32 (buffer, |
44f6c012 | 512 | &linked_list->data.fixed_memory32.range_base_address); |
1da177e4 LT |
513 | buffer += 4; |
514 | ||
44f6c012 RM |
515 | /* Set the range length */ |
516 | ||
1da177e4 | 517 | ACPI_MOVE_32_TO_32 (buffer, |
44f6c012 | 518 | &linked_list->data.fixed_memory32.range_length); |
1da177e4 LT |
519 | buffer += 4; |
520 | ||
44f6c012 RM |
521 | /* Return the number of bytes consumed in this operation */ |
522 | ||
1da177e4 LT |
523 | *bytes_consumed = ACPI_PTR_DIFF (buffer, *output_buffer); |
524 | return_ACPI_STATUS (AE_OK); | |
525 | } | |
526 |