aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/resources
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/resources')
-rw-r--r--drivers/acpi/resources/rsaddr.c542
-rw-r--r--drivers/acpi/resources/rsirq.c21
2 files changed, 266 insertions, 297 deletions
diff --git a/drivers/acpi/resources/rsaddr.c b/drivers/acpi/resources/rsaddr.c
index 4cf46e1ee01b..23b54baa0cb2 100644
--- a/drivers/acpi/resources/rsaddr.c
+++ b/drivers/acpi/resources/rsaddr.c
@@ -47,6 +47,180 @@
47#define _COMPONENT ACPI_RESOURCES 47#define _COMPONENT ACPI_RESOURCES
48ACPI_MODULE_NAME("rsaddr") 48ACPI_MODULE_NAME("rsaddr")
49 49
50/* Local prototypes */
51static void
52acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags);
53
54static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource);
55
56static void
57acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags);
58
59static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource);
60
61/*******************************************************************************
62 *
63 * FUNCTION: acpi_rs_decode_general_flags
64 *
65 * PARAMETERS: Resource - Address resource data struct
66 * Flags - Actual flag byte
67 *
68 * RETURN: Decoded flag bits in resource struct
69 *
70 * DESCRIPTION: Decode a general flag byte to an address resource struct
71 *
72 ******************************************************************************/
73
74static void
75acpi_rs_decode_general_flags(union acpi_resource_data *resource, u8 flags)
76{
77 ACPI_FUNCTION_ENTRY();
78
79 /* Producer / Consumer - flag bit[0] */
80
81 resource->address.producer_consumer = (u32) (flags & 0x01);
82
83 /* Decode (_DEC) - flag bit[1] */
84
85 resource->address.decode = (u32) ((flags >> 1) & 0x01);
86
87 /* Min Address Fixed (_MIF) - flag bit[2] */
88
89 resource->address.min_address_fixed = (u32) ((flags >> 2) & 0x01);
90
91 /* Max Address Fixed (_MAF) - flag bit[3] */
92
93 resource->address.max_address_fixed = (u32) ((flags >> 3) & 0x01);
94}
95
96/*******************************************************************************
97 *
98 * FUNCTION: acpi_rs_encode_general_flags
99 *
100 * PARAMETERS: Resource - Address resource data struct
101 *
102 * RETURN: Encoded general flag byte
103 *
104 * DESCRIPTION: Construct a general flag byte from an address resource struct
105 *
106 ******************************************************************************/
107
108static u8 acpi_rs_encode_general_flags(union acpi_resource_data *resource)
109{
110 u8 flags;
111
112 ACPI_FUNCTION_ENTRY();
113
114 /* Producer / Consumer - flag bit[0] */
115
116 flags = (u8) (resource->address.producer_consumer & 0x01);
117
118 /* Decode (_DEC) - flag bit[1] */
119
120 flags |= (u8) ((resource->address.decode & 0x01) << 1);
121
122 /* Min Address Fixed (_MIF) - flag bit[2] */
123
124 flags |= (u8) ((resource->address.min_address_fixed & 0x01) << 2);
125
126 /* Max Address Fixed (_MAF) - flag bit[3] */
127
128 flags |= (u8) ((resource->address.max_address_fixed & 0x01) << 3);
129
130 return (flags);
131}
132
133/*******************************************************************************
134 *
135 * FUNCTION: acpi_rs_decode_specific_flags
136 *
137 * PARAMETERS: Resource - Address resource data struct
138 * Flags - Actual flag byte
139 *
140 * RETURN: Decoded flag bits in attribute struct
141 *
142 * DESCRIPTION: Decode a type-specific flag byte to an attribute struct.
143 * Type-specific flags are only defined for the Memory and IO
144 * resource types.
145 *
146 ******************************************************************************/
147
148static void
149acpi_rs_decode_specific_flags(union acpi_resource_data *resource, u8 flags)
150{
151 ACPI_FUNCTION_ENTRY();
152
153 if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
154 /* Write Status (_RW) - flag bit[0] */
155
156 resource->address.attribute.memory.read_write_attribute =
157 (u16) (flags & 0x01);
158
159 /* Memory Attributes (_MEM) - flag bits[2:1] */
160
161 resource->address.attribute.memory.cache_attribute =
162 (u16) ((flags >> 1) & 0x03);
163 } else if (resource->address.resource_type == ACPI_IO_RANGE) {
164 /* Ranges (_RNG) - flag bits[1:0] */
165
166 resource->address.attribute.io.range_attribute =
167 (u16) (flags & 0x03);
168
169 /* Translations (_TTP and _TRS) - flag bits[5:4] */
170
171 resource->address.attribute.io.translation_attribute =
172 (u16) ((flags >> 4) & 0x03);
173 }
174}
175
176/*******************************************************************************
177 *
178 * FUNCTION: acpi_rs_encode_specific_flags
179 *
180 * PARAMETERS: Resource - Address resource data struct
181 *
182 * RETURN: Encoded type-specific flag byte
183 *
184 * DESCRIPTION: Construct a type-specific flag byte from an attribute struct.
185 * Type-specific flags are only defined for the Memory and IO
186 * resource types.
187 *
188 ******************************************************************************/
189
190static u8 acpi_rs_encode_specific_flags(union acpi_resource_data *resource)
191{
192 u8 flags = 0;
193
194 ACPI_FUNCTION_ENTRY();
195
196 if (resource->address.resource_type == ACPI_MEMORY_RANGE) {
197 /* Write Status (_RW) - flag bit[0] */
198
199 flags = (u8)
200 (resource->address.attribute.memory.
201 read_write_attribute & 0x01);
202
203 /* Memory Attributes (_MEM) - flag bits[2:1] */
204
205 flags |= (u8)
206 ((resource->address.attribute.memory.
207 cache_attribute & 0x03) << 1);
208 } else if (resource->address.resource_type == ACPI_IO_RANGE) {
209 /* Ranges (_RNG) - flag bits[1:0] */
210
211 flags = (u8)
212 (resource->address.attribute.io.range_attribute & 0x03);
213
214 /* Translations (_TTP and _TRS) - flag bits[5:4] */
215
216 flags |= (u8)
217 ((resource->address.attribute.io.
218 translation_attribute & 0x03) << 4);
219 }
220
221 return (flags);
222}
223
50/******************************************************************************* 224/*******************************************************************************
51 * 225 *
52 * FUNCTION: acpi_rs_address16_resource 226 * FUNCTION: acpi_rs_address16_resource
@@ -67,6 +241,7 @@ ACPI_MODULE_NAME("rsaddr")
67 * number of bytes consumed from the byte stream. 241 * number of bytes consumed from the byte stream.
68 * 242 *
69 ******************************************************************************/ 243 ******************************************************************************/
244
70acpi_status 245acpi_status
71acpi_rs_address16_resource(u8 * byte_stream_buffer, 246acpi_rs_address16_resource(u8 * byte_stream_buffer,
72 acpi_size * bytes_consumed, 247 acpi_size * bytes_consumed,
@@ -83,7 +258,7 @@ acpi_rs_address16_resource(u8 * byte_stream_buffer,
83 258
84 ACPI_FUNCTION_TRACE("rs_address16_resource"); 259 ACPI_FUNCTION_TRACE("rs_address16_resource");
85 260
86 /* Point past the Descriptor to get the number of bytes consumed */ 261 /* Get the Descriptor Length field */
87 262
88 buffer += 1; 263 buffer += 1;
89 ACPI_MOVE_16_TO_16(&temp16, buffer); 264 ACPI_MOVE_16_TO_16(&temp16, buffer);
@@ -113,46 +288,12 @@ acpi_rs_address16_resource(u8 * byte_stream_buffer,
113 /* Get the General Flags (Byte4) */ 288 /* Get the General Flags (Byte4) */
114 289
115 buffer += 1; 290 buffer += 1;
116 temp8 = *buffer; 291 acpi_rs_decode_general_flags(&output_struct->data, *buffer);
117
118 /* Producer / Consumer */
119
120 output_struct->data.address16.producer_consumer = temp8 & 0x01;
121
122 /* Decode */
123
124 output_struct->data.address16.decode = (temp8 >> 1) & 0x01;
125
126 /* Min Address Fixed */
127
128 output_struct->data.address16.min_address_fixed = (temp8 >> 2) & 0x01;
129
130 /* Max Address Fixed */
131
132 output_struct->data.address16.max_address_fixed = (temp8 >> 3) & 0x01;
133 292
134 /* Get the Type Specific Flags (Byte5) */ 293 /* Get the Type Specific Flags (Byte5) */
135 294
136 buffer += 1; 295 buffer += 1;
137 temp8 = *buffer; 296 acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
138
139 if (ACPI_MEMORY_RANGE == output_struct->data.address16.resource_type) {
140 output_struct->data.address16.attribute.memory.
141 read_write_attribute = (u16) (temp8 & 0x01);
142 output_struct->data.address16.attribute.memory.cache_attribute =
143 (u16) ((temp8 >> 1) & 0x03);
144 } else {
145 if (ACPI_IO_RANGE ==
146 output_struct->data.address16.resource_type) {
147 output_struct->data.address16.attribute.io.
148 range_attribute = (u16) (temp8 & 0x03);
149 output_struct->data.address16.attribute.io.
150 translation_attribute = (u16) ((temp8 >> 4) & 0x03);
151 } else {
152 /* BUS_NUMBER_RANGE == Address16.Data->resource_type */
153 /* Nothing needs to be filled in */
154 }
155 }
156 297
157 /* Get Granularity (Bytes 6-7) */ 298 /* Get Granularity (Bytes 6-7) */
158 299
@@ -200,9 +341,8 @@ acpi_rs_address16_resource(u8 * byte_stream_buffer,
200 if (*bytes_consumed > (16 + 1)) { 341 if (*bytes_consumed > (16 + 1)) {
201 /* Dereference the Index */ 342 /* Dereference the Index */
202 343
203 temp8 = *buffer;
204 output_struct->data.address16.resource_source.index = 344 output_struct->data.address16.resource_source.index =
205 (u32) temp8; 345 (u32) * buffer;
206 346
207 /* Point to the String */ 347 /* Point to the String */
208 348
@@ -216,22 +356,20 @@ acpi_rs_address16_resource(u8 * byte_stream_buffer,
216 temp_ptr = (u8 *) 356 temp_ptr = (u8 *)
217 output_struct->data.address16.resource_source.string_ptr; 357 output_struct->data.address16.resource_source.string_ptr;
218 358
219 /* Copy the string into the buffer */ 359 /* Copy the resource_source string into the buffer */
220 360
221 index = 0; 361 index = 0;
222 362 while (*buffer) {
223 while (0x00 != *buffer) {
224 *temp_ptr = *buffer; 363 *temp_ptr = *buffer;
225 364
226 temp_ptr += 1; 365 temp_ptr++;
227 buffer += 1; 366 buffer++;
228 index += 1; 367 index++;
229 } 368 }
230 369
231 /* Add the terminating null */ 370 /* Add the terminating null and set the string length */
232
233 *temp_ptr = 0x00;
234 371
372 *temp_ptr = 0;
235 output_struct->data.address16.resource_source.string_length = 373 output_struct->data.address16.resource_source.string_length =
236 index + 1; 374 index + 1;
237 375
@@ -243,7 +381,7 @@ acpi_rs_address16_resource(u8 * byte_stream_buffer,
243 temp8 = (u8) (index + 1); 381 temp8 = (u8) (index + 1);
244 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8); 382 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
245 } else { 383 } else {
246 output_struct->data.address16.resource_source.index = 0x00; 384 output_struct->data.address16.resource_source.index = 0;
247 output_struct->data.address16.resource_source.string_length = 0; 385 output_struct->data.address16.resource_source.string_length = 0;
248 output_struct->data.address16.resource_source.string_ptr = NULL; 386 output_struct->data.address16.resource_source.string_ptr = NULL;
249 } 387 }
@@ -280,15 +418,13 @@ acpi_rs_address16_stream(struct acpi_resource *linked_list,
280{ 418{
281 u8 *buffer = *output_buffer; 419 u8 *buffer = *output_buffer;
282 u8 *length_field; 420 u8 *length_field;
283 u8 temp8;
284 char *temp_pointer = NULL;
285 acpi_size actual_bytes; 421 acpi_size actual_bytes;
286 422
287 ACPI_FUNCTION_TRACE("rs_address16_stream"); 423 ACPI_FUNCTION_TRACE("rs_address16_stream");
288 424
289 /* The descriptor field is static */ 425 /* Set the Descriptor Type field */
290 426
291 *buffer = 0x88; 427 *buffer = ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE;
292 buffer += 1; 428 buffer += 1;
293 429
294 /* Save a pointer to the Length field - to be filled in later */ 430 /* Save a pointer to the Length field - to be filled in later */
@@ -298,43 +434,17 @@ acpi_rs_address16_stream(struct acpi_resource *linked_list,
298 434
299 /* Set the Resource Type (Memory, Io, bus_number) */ 435 /* Set the Resource Type (Memory, Io, bus_number) */
300 436
301 temp8 = (u8) (linked_list->data.address16.resource_type & 0x03); 437 *buffer = (u8) (linked_list->data.address16.resource_type & 0x03);
302 *buffer = temp8;
303 buffer += 1; 438 buffer += 1;
304 439
305 /* Set the general flags */ 440 /* Set the general flags */
306 441
307 temp8 = (u8) (linked_list->data.address16.producer_consumer & 0x01); 442 *buffer = acpi_rs_encode_general_flags(&linked_list->data);
308
309 temp8 |= (linked_list->data.address16.decode & 0x01) << 1;
310 temp8 |= (linked_list->data.address16.min_address_fixed & 0x01) << 2;
311 temp8 |= (linked_list->data.address16.max_address_fixed & 0x01) << 3;
312
313 *buffer = temp8;
314 buffer += 1; 443 buffer += 1;
315 444
316 /* Set the type specific flags */ 445 /* Set the type specific flags */
317 446
318 temp8 = 0; 447 *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
319
320 if (ACPI_MEMORY_RANGE == linked_list->data.address16.resource_type) {
321 temp8 = (u8)
322 (linked_list->data.address16.attribute.memory.
323 read_write_attribute & 0x01);
324
325 temp8 |=
326 (linked_list->data.address16.attribute.memory.
327 cache_attribute & 0x03) << 1;
328 } else if (ACPI_IO_RANGE == linked_list->data.address16.resource_type) {
329 temp8 = (u8)
330 (linked_list->data.address16.attribute.io.range_attribute &
331 0x03);
332 temp8 |=
333 (linked_list->data.address16.attribute.io.
334 translation_attribute & 0x03) << 4;
335 }
336
337 *buffer = temp8;
338 buffer += 1; 448 buffer += 1;
339 449
340 /* Set the address space granularity */ 450 /* Set the address space granularity */
@@ -368,22 +478,19 @@ acpi_rs_address16_stream(struct acpi_resource *linked_list,
368 478
369 /* Resource Source Index and Resource Source are optional */ 479 /* Resource Source Index and Resource Source are optional */
370 480
371 if (0 != linked_list->data.address16.resource_source.string_length) { 481 if (linked_list->data.address16.resource_source.string_length) {
372 temp8 = (u8) linked_list->data.address16.resource_source.index; 482 *buffer =
373 483 (u8) linked_list->data.address16.resource_source.index;
374 *buffer = temp8;
375 buffer += 1; 484 buffer += 1;
376 485
377 temp_pointer = (char *)buffer; 486 /* Copy the resource_source string */
378
379 /* Copy the string */
380 487
381 ACPI_STRCPY(temp_pointer, 488 ACPI_STRCPY((char *)buffer,
382 linked_list->data.address16.resource_source. 489 linked_list->data.address16.resource_source.
383 string_ptr); 490 string_ptr);
384 491
385 /* 492 /*
386 * Buffer needs to be set to the length of the sting + one for the 493 * Buffer needs to be set to the length of the string + one for the
387 * terminating null 494 * terminating null
388 */ 495 */
389 buffer += 496 buffer +=
@@ -432,20 +539,18 @@ acpi_rs_address32_resource(u8 * byte_stream_buffer,
432 acpi_size * bytes_consumed, 539 acpi_size * bytes_consumed,
433 u8 ** output_buffer, acpi_size * structure_size) 540 u8 ** output_buffer, acpi_size * structure_size)
434{ 541{
435 u8 *buffer;
436 struct acpi_resource *output_struct = (void *)*output_buffer;
437 u16 temp16; 542 u16 temp16;
438 u8 temp8; 543 u8 temp8;
439 u8 *temp_ptr; 544 u8 *temp_ptr;
440 acpi_size struct_size;
441 u32 index; 545 u32 index;
546 u8 *buffer = byte_stream_buffer;
547 struct acpi_resource *output_struct = (void *)*output_buffer;
548 acpi_size struct_size =
549 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32);
442 550
443 ACPI_FUNCTION_TRACE("rs_address32_resource"); 551 ACPI_FUNCTION_TRACE("rs_address32_resource");
444 552
445 buffer = byte_stream_buffer; 553 /* Get the Descriptor Length field */
446 struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_address32);
447
448 /* Point past the Descriptor to get the number of bytes consumed */
449 554
450 buffer += 1; 555 buffer += 1;
451 ACPI_MOVE_16_TO_16(&temp16, buffer); 556 ACPI_MOVE_16_TO_16(&temp16, buffer);
@@ -475,47 +580,12 @@ acpi_rs_address32_resource(u8 * byte_stream_buffer,
475 /* Get the General Flags (Byte4) */ 580 /* Get the General Flags (Byte4) */
476 581
477 buffer += 1; 582 buffer += 1;
478 temp8 = *buffer; 583 acpi_rs_decode_general_flags(&output_struct->data, *buffer);
479
480 /* Producer / Consumer */
481
482 output_struct->data.address32.producer_consumer = temp8 & 0x01;
483
484 /* Decode */
485
486 output_struct->data.address32.decode = (temp8 >> 1) & 0x01;
487
488 /* Min Address Fixed */
489
490 output_struct->data.address32.min_address_fixed = (temp8 >> 2) & 0x01;
491
492 /* Max Address Fixed */
493
494 output_struct->data.address32.max_address_fixed = (temp8 >> 3) & 0x01;
495 584
496 /* Get the Type Specific Flags (Byte5) */ 585 /* Get the Type Specific Flags (Byte5) */
497 586
498 buffer += 1; 587 buffer += 1;
499 temp8 = *buffer; 588 acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
500
501 if (ACPI_MEMORY_RANGE == output_struct->data.address32.resource_type) {
502 output_struct->data.address32.attribute.memory.
503 read_write_attribute = (u16) (temp8 & 0x01);
504
505 output_struct->data.address32.attribute.memory.cache_attribute =
506 (u16) ((temp8 >> 1) & 0x03);
507 } else {
508 if (ACPI_IO_RANGE ==
509 output_struct->data.address32.resource_type) {
510 output_struct->data.address32.attribute.io.
511 range_attribute = (u16) (temp8 & 0x03);
512 output_struct->data.address32.attribute.io.
513 translation_attribute = (u16) ((temp8 >> 4) & 0x03);
514 } else {
515 /* BUS_NUMBER_RANGE == output_struct->Data.Address32.resource_type */
516 /* Nothing needs to be filled in */
517 }
518 }
519 589
520 /* Get Granularity (Bytes 6-9) */ 590 /* Get Granularity (Bytes 6-9) */
521 591
@@ -561,9 +631,8 @@ acpi_rs_address32_resource(u8 * byte_stream_buffer,
561 if (*bytes_consumed > (26 + 1)) { 631 if (*bytes_consumed > (26 + 1)) {
562 /* Dereference the Index */ 632 /* Dereference the Index */
563 633
564 temp8 = *buffer;
565 output_struct->data.address32.resource_source.index = 634 output_struct->data.address32.resource_source.index =
566 (u32) temp8; 635 (u32) * buffer;
567 636
568 /* Point to the String */ 637 /* Point to the String */
569 638
@@ -577,20 +646,20 @@ acpi_rs_address32_resource(u8 * byte_stream_buffer,
577 temp_ptr = (u8 *) 646 temp_ptr = (u8 *)
578 output_struct->data.address32.resource_source.string_ptr; 647 output_struct->data.address32.resource_source.string_ptr;
579 648
580 /* Copy the string into the buffer */ 649 /* Copy the resource_source string into the buffer */
581 650
582 index = 0; 651 index = 0;
583 while (0x00 != *buffer) { 652 while (*buffer) {
584 *temp_ptr = *buffer; 653 *temp_ptr = *buffer;
585 654
586 temp_ptr += 1; 655 temp_ptr++;
587 buffer += 1; 656 buffer++;
588 index += 1; 657 index++;
589 } 658 }
590 659
591 /* Add the terminating null */ 660 /* Add the terminating null and set the string length */
592 661
593 *temp_ptr = 0x00; 662 *temp_ptr = 0;
594 output_struct->data.address32.resource_source.string_length = 663 output_struct->data.address32.resource_source.string_length =
595 index + 1; 664 index + 1;
596 665
@@ -602,7 +671,7 @@ acpi_rs_address32_resource(u8 * byte_stream_buffer,
602 temp8 = (u8) (index + 1); 671 temp8 = (u8) (index + 1);
603 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8); 672 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
604 } else { 673 } else {
605 output_struct->data.address32.resource_source.index = 0x00; 674 output_struct->data.address32.resource_source.index = 0;
606 output_struct->data.address32.resource_source.string_length = 0; 675 output_struct->data.address32.resource_source.string_length = 0;
607 output_struct->data.address32.resource_source.string_ptr = NULL; 676 output_struct->data.address32.resource_source.string_ptr = NULL;
608 } 677 }
@@ -639,62 +708,34 @@ acpi_rs_address32_stream(struct acpi_resource *linked_list,
639{ 708{
640 u8 *buffer; 709 u8 *buffer;
641 u16 *length_field; 710 u16 *length_field;
642 u8 temp8;
643 char *temp_pointer;
644 711
645 ACPI_FUNCTION_TRACE("rs_address32_stream"); 712 ACPI_FUNCTION_TRACE("rs_address32_stream");
646 713
647 buffer = *output_buffer; 714 buffer = *output_buffer;
648 715
649 /* The descriptor field is static */ 716 /* Set the Descriptor Type field */
650 717
651 *buffer = 0x87; 718 *buffer = ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE;
652 buffer += 1; 719 buffer += 1;
653 720
654 /* Set a pointer to the Length field - to be filled in later */ 721 /* Save a pointer to the Length field - to be filled in later */
655 722
656 length_field = ACPI_CAST_PTR(u16, buffer); 723 length_field = ACPI_CAST_PTR(u16, buffer);
657 buffer += 2; 724 buffer += 2;
658 725
659 /* Set the Resource Type (Memory, Io, bus_number) */ 726 /* Set the Resource Type (Memory, Io, bus_number) */
660 727
661 temp8 = (u8) (linked_list->data.address32.resource_type & 0x03); 728 *buffer = (u8) (linked_list->data.address32.resource_type & 0x03);
662
663 *buffer = temp8;
664 buffer += 1; 729 buffer += 1;
665 730
666 /* Set the general flags */ 731 /* Set the general flags */
667 732
668 temp8 = (u8) (linked_list->data.address32.producer_consumer & 0x01); 733 *buffer = acpi_rs_encode_general_flags(&linked_list->data);
669 temp8 |= (linked_list->data.address32.decode & 0x01) << 1;
670 temp8 |= (linked_list->data.address32.min_address_fixed & 0x01) << 2;
671 temp8 |= (linked_list->data.address32.max_address_fixed & 0x01) << 3;
672
673 *buffer = temp8;
674 buffer += 1; 734 buffer += 1;
675 735
676 /* Set the type specific flags */ 736 /* Set the type specific flags */
677 737
678 temp8 = 0; 738 *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
679
680 if (ACPI_MEMORY_RANGE == linked_list->data.address32.resource_type) {
681 temp8 = (u8)
682 (linked_list->data.address32.attribute.memory.
683 read_write_attribute & 0x01);
684
685 temp8 |=
686 (linked_list->data.address32.attribute.memory.
687 cache_attribute & 0x03) << 1;
688 } else if (ACPI_IO_RANGE == linked_list->data.address32.resource_type) {
689 temp8 = (u8)
690 (linked_list->data.address32.attribute.io.range_attribute &
691 0x03);
692 temp8 |=
693 (linked_list->data.address32.attribute.io.
694 translation_attribute & 0x03) << 4;
695 }
696
697 *buffer = temp8;
698 buffer += 1; 739 buffer += 1;
699 740
700 /* Set the address space granularity */ 741 /* Set the address space granularity */
@@ -728,22 +769,19 @@ acpi_rs_address32_stream(struct acpi_resource *linked_list,
728 769
729 /* Resource Source Index and Resource Source are optional */ 770 /* Resource Source Index and Resource Source are optional */
730 771
731 if (0 != linked_list->data.address32.resource_source.string_length) { 772 if (linked_list->data.address32.resource_source.string_length) {
732 temp8 = (u8) linked_list->data.address32.resource_source.index; 773 *buffer =
733 774 (u8) linked_list->data.address32.resource_source.index;
734 *buffer = temp8;
735 buffer += 1; 775 buffer += 1;
736 776
737 temp_pointer = (char *)buffer; 777 /* Copy the resource_source string */
738
739 /* Copy the string */
740 778
741 ACPI_STRCPY(temp_pointer, 779 ACPI_STRCPY((char *)buffer,
742 linked_list->data.address32.resource_source. 780 linked_list->data.address32.resource_source.
743 string_ptr); 781 string_ptr);
744 782
745 /* 783 /*
746 * Buffer needs to be set to the length of the sting + one for the 784 * Buffer needs to be set to the length of the string + one for the
747 * terminating null 785 * terminating null
748 */ 786 */
749 buffer += 787 buffer +=
@@ -758,7 +796,7 @@ acpi_rs_address32_stream(struct acpi_resource *linked_list,
758 796
759 /* 797 /*
760 * Set the length field to the number of bytes consumed 798 * Set the length field to the number of bytes consumed
761 * minus the header size (3 bytes) 799 * minus the header size (3 bytes)
762 */ 800 */
763 *length_field = (u16) (*bytes_consumed - 3); 801 *length_field = (u16) (*bytes_consumed - 3);
764 return_ACPI_STATUS(AE_OK); 802 return_ACPI_STATUS(AE_OK);
@@ -790,22 +828,23 @@ acpi_rs_address64_resource(u8 * byte_stream_buffer,
790 acpi_size * bytes_consumed, 828 acpi_size * bytes_consumed,
791 u8 ** output_buffer, acpi_size * structure_size) 829 u8 ** output_buffer, acpi_size * structure_size)
792{ 830{
793 u8 *buffer;
794 struct acpi_resource *output_struct = (void *)*output_buffer;
795 u16 temp16; 831 u16 temp16;
796 u8 temp8; 832 u8 temp8;
797 u8 resource_type; 833 u8 resource_type;
798 u8 *temp_ptr; 834 u8 *temp_ptr;
799 acpi_size struct_size;
800 u32 index; 835 u32 index;
836 u8 *buffer = byte_stream_buffer;
837 struct acpi_resource *output_struct = (void *)*output_buffer;
838 acpi_size struct_size =
839 ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64);
801 840
802 ACPI_FUNCTION_TRACE("rs_address64_resource"); 841 ACPI_FUNCTION_TRACE("rs_address64_resource");
803 842
804 buffer = byte_stream_buffer; 843 /* Get the Descriptor Type */
805 struct_size = ACPI_SIZEOF_RESOURCE(struct acpi_resource_address64); 844
806 resource_type = *buffer; 845 resource_type = *buffer;
807 846
808 /* Point past the Descriptor to get the number of bytes consumed */ 847 /* Get the Descriptor Length field */
809 848
810 buffer += 1; 849 buffer += 1;
811 ACPI_MOVE_16_TO_16(&temp16, buffer); 850 ACPI_MOVE_16_TO_16(&temp16, buffer);
@@ -835,47 +874,12 @@ acpi_rs_address64_resource(u8 * byte_stream_buffer,
835 /* Get the General Flags (Byte4) */ 874 /* Get the General Flags (Byte4) */
836 875
837 buffer += 1; 876 buffer += 1;
838 temp8 = *buffer; 877 acpi_rs_decode_general_flags(&output_struct->data, *buffer);
839
840 /* Producer / Consumer */
841
842 output_struct->data.address64.producer_consumer = temp8 & 0x01;
843
844 /* Decode */
845
846 output_struct->data.address64.decode = (temp8 >> 1) & 0x01;
847
848 /* Min Address Fixed */
849
850 output_struct->data.address64.min_address_fixed = (temp8 >> 2) & 0x01;
851
852 /* Max Address Fixed */
853
854 output_struct->data.address64.max_address_fixed = (temp8 >> 3) & 0x01;
855 878
856 /* Get the Type Specific Flags (Byte5) */ 879 /* Get the Type Specific Flags (Byte5) */
857 880
858 buffer += 1; 881 buffer += 1;
859 temp8 = *buffer; 882 acpi_rs_decode_specific_flags(&output_struct->data, *buffer);
860
861 if (ACPI_MEMORY_RANGE == output_struct->data.address64.resource_type) {
862 output_struct->data.address64.attribute.memory.
863 read_write_attribute = (u16) (temp8 & 0x01);
864
865 output_struct->data.address64.attribute.memory.cache_attribute =
866 (u16) ((temp8 >> 1) & 0x03);
867 } else {
868 if (ACPI_IO_RANGE ==
869 output_struct->data.address64.resource_type) {
870 output_struct->data.address64.attribute.io.
871 range_attribute = (u16) (temp8 & 0x03);
872 output_struct->data.address64.attribute.io.
873 translation_attribute = (u16) ((temp8 >> 4) & 0x03);
874 } else {
875 /* BUS_NUMBER_RANGE == output_struct->Data.Address64.resource_type */
876 /* Nothing needs to be filled in */
877 }
878 }
879 883
880 if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) { 884 if (resource_type == ACPI_RDESC_TYPE_EXTENDED_ADDRESS_SPACE) {
881 /* Move past revision_id and Reserved byte */ 885 /* Move past revision_id and Reserved byte */
@@ -912,7 +916,7 @@ acpi_rs_address64_resource(u8 * byte_stream_buffer,
912 ACPI_MOVE_64_TO_64(&output_struct->data.address64.address_length, 916 ACPI_MOVE_64_TO_64(&output_struct->data.address64.address_length,
913 buffer); 917 buffer);
914 918
915 output_struct->data.address64.resource_source.index = 0x00; 919 output_struct->data.address64.resource_source.index = 0;
916 output_struct->data.address64.resource_source.string_length = 0; 920 output_struct->data.address64.resource_source.string_length = 0;
917 output_struct->data.address64.resource_source.string_ptr = NULL; 921 output_struct->data.address64.resource_source.string_ptr = NULL;
918 922
@@ -942,9 +946,8 @@ acpi_rs_address64_resource(u8 * byte_stream_buffer,
942 if (*bytes_consumed > (46 + 1)) { 946 if (*bytes_consumed > (46 + 1)) {
943 /* Dereference the Index */ 947 /* Dereference the Index */
944 948
945 temp8 = *buffer;
946 output_struct->data.address64.resource_source.index = 949 output_struct->data.address64.resource_source.index =
947 (u32) temp8; 950 (u32) * buffer;
948 951
949 /* Point to the String */ 952 /* Point to the String */
950 953
@@ -960,21 +963,21 @@ acpi_rs_address64_resource(u8 * byte_stream_buffer,
960 output_struct->data.address64.resource_source. 963 output_struct->data.address64.resource_source.
961 string_ptr; 964 string_ptr;
962 965
963 /* Copy the string into the buffer */ 966 /* Copy the resource_source string into the buffer */
964 967
965 index = 0; 968 index = 0;
966 while (0x00 != *buffer) { 969 while (*buffer) {
967 *temp_ptr = *buffer; 970 *temp_ptr = *buffer;
968 971
969 temp_ptr += 1; 972 temp_ptr++;
970 buffer += 1; 973 buffer++;
971 index += 1; 974 index++;
972 } 975 }
973 976
974 /* 977 /*
975 * Add the terminating null 978 * Add the terminating null and set the string length
976 */ 979 */
977 *temp_ptr = 0x00; 980 *temp_ptr = 0;
978 output_struct->data.address64.resource_source. 981 output_struct->data.address64.resource_source.
979 string_length = index + 1; 982 string_length = index + 1;
980 983
@@ -1020,62 +1023,34 @@ acpi_rs_address64_stream(struct acpi_resource *linked_list,
1020{ 1023{
1021 u8 *buffer; 1024 u8 *buffer;
1022 u16 *length_field; 1025 u16 *length_field;
1023 u8 temp8;
1024 char *temp_pointer;
1025 1026
1026 ACPI_FUNCTION_TRACE("rs_address64_stream"); 1027 ACPI_FUNCTION_TRACE("rs_address64_stream");
1027 1028
1028 buffer = *output_buffer; 1029 buffer = *output_buffer;
1029 1030
1030 /* The descriptor field is static */ 1031 /* Set the Descriptor Type field */
1031 1032
1032 *buffer = 0x8A; 1033 *buffer = ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE;
1033 buffer += 1; 1034 buffer += 1;
1034 1035
1035 /* Set a pointer to the Length field - to be filled in later */ 1036 /* Save a pointer to the Length field - to be filled in later */
1036 1037
1037 length_field = ACPI_CAST_PTR(u16, buffer); 1038 length_field = ACPI_CAST_PTR(u16, buffer);
1038 buffer += 2; 1039 buffer += 2;
1039 1040
1040 /* Set the Resource Type (Memory, Io, bus_number) */ 1041 /* Set the Resource Type (Memory, Io, bus_number) */
1041 1042
1042 temp8 = (u8) (linked_list->data.address64.resource_type & 0x03); 1043 *buffer = (u8) (linked_list->data.address64.resource_type & 0x03);
1043
1044 *buffer = temp8;
1045 buffer += 1; 1044 buffer += 1;
1046 1045
1047 /* Set the general flags */ 1046 /* Set the general flags */
1048 1047
1049 temp8 = (u8) (linked_list->data.address64.producer_consumer & 0x01); 1048 *buffer = acpi_rs_encode_general_flags(&linked_list->data);
1050 temp8 |= (linked_list->data.address64.decode & 0x01) << 1;
1051 temp8 |= (linked_list->data.address64.min_address_fixed & 0x01) << 2;
1052 temp8 |= (linked_list->data.address64.max_address_fixed & 0x01) << 3;
1053
1054 *buffer = temp8;
1055 buffer += 1; 1049 buffer += 1;
1056 1050
1057 /* Set the type specific flags */ 1051 /* Set the type specific flags */
1058 1052
1059 temp8 = 0; 1053 *buffer = acpi_rs_encode_specific_flags(&linked_list->data);
1060
1061 if (ACPI_MEMORY_RANGE == linked_list->data.address64.resource_type) {
1062 temp8 = (u8)
1063 (linked_list->data.address64.attribute.memory.
1064 read_write_attribute & 0x01);
1065
1066 temp8 |=
1067 (linked_list->data.address64.attribute.memory.
1068 cache_attribute & 0x03) << 1;
1069 } else if (ACPI_IO_RANGE == linked_list->data.address64.resource_type) {
1070 temp8 = (u8)
1071 (linked_list->data.address64.attribute.io.range_attribute &
1072 0x03);
1073 temp8 |=
1074 (linked_list->data.address64.attribute.io.range_attribute &
1075 0x03) << 4;
1076 }
1077
1078 *buffer = temp8;
1079 buffer += 1; 1054 buffer += 1;
1080 1055
1081 /* Set the address space granularity */ 1056 /* Set the address space granularity */
@@ -1109,22 +1084,19 @@ acpi_rs_address64_stream(struct acpi_resource *linked_list,
1109 1084
1110 /* Resource Source Index and Resource Source are optional */ 1085 /* Resource Source Index and Resource Source are optional */
1111 1086
1112 if (0 != linked_list->data.address64.resource_source.string_length) { 1087 if (linked_list->data.address64.resource_source.string_length) {
1113 temp8 = (u8) linked_list->data.address64.resource_source.index; 1088 *buffer =
1114 1089 (u8) linked_list->data.address64.resource_source.index;
1115 *buffer = temp8;
1116 buffer += 1; 1090 buffer += 1;
1117 1091
1118 temp_pointer = (char *)buffer; 1092 /* Copy the resource_source string */
1119
1120 /* Copy the string */
1121 1093
1122 ACPI_STRCPY(temp_pointer, 1094 ACPI_STRCPY((char *)buffer,
1123 linked_list->data.address64.resource_source. 1095 linked_list->data.address64.resource_source.
1124 string_ptr); 1096 string_ptr);
1125 1097
1126 /* 1098 /*
1127 * Buffer needs to be set to the length of the sting + one for the 1099 * Buffer needs to be set to the length of the string + one for the
1128 * terminating null 1100 * terminating null
1129 */ 1101 */
1130 buffer += 1102 buffer +=
diff --git a/drivers/acpi/resources/rsirq.c b/drivers/acpi/resources/rsirq.c
index 7179b6243f5b..56043fee96cb 100644
--- a/drivers/acpi/resources/rsirq.c
+++ b/drivers/acpi/resources/rsirq.c
@@ -290,7 +290,7 @@ acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
290 290
291 ACPI_FUNCTION_TRACE("rs_extended_irq_resource"); 291 ACPI_FUNCTION_TRACE("rs_extended_irq_resource");
292 292
293 /* Point past the Descriptor to get the number of bytes consumed */ 293 /* Get the Descriptor Length field */
294 294
295 buffer += 1; 295 buffer += 1;
296 ACPI_MOVE_16_TO_16(&temp16, buffer); 296 ACPI_MOVE_16_TO_16(&temp16, buffer);
@@ -398,7 +398,7 @@ acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
398 /* Copy the string into the buffer */ 398 /* Copy the string into the buffer */
399 399
400 index = 0; 400 index = 0;
401 while (0x00 != *buffer) { 401 while (*buffer) {
402 *temp_ptr = *buffer; 402 *temp_ptr = *buffer;
403 403
404 temp_ptr += 1; 404 temp_ptr += 1;
@@ -408,7 +408,7 @@ acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
408 408
409 /* Add the terminating null */ 409 /* Add the terminating null */
410 410
411 *temp_ptr = 0x00; 411 *temp_ptr = 0;
412 output_struct->data.extended_irq.resource_source.string_length = 412 output_struct->data.extended_irq.resource_source.string_length =
413 index + 1; 413 index + 1;
414 414
@@ -420,7 +420,7 @@ acpi_rs_extended_irq_resource(u8 * byte_stream_buffer,
420 temp8 = (u8) (index + 1); 420 temp8 = (u8) (index + 1);
421 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8); 421 struct_size += ACPI_ROUND_UP_to_32_bITS(temp8);
422 } else { 422 } else {
423 output_struct->data.extended_irq.resource_source.index = 0x00; 423 output_struct->data.extended_irq.resource_source.index = 0;
424 output_struct->data.extended_irq.resource_source.string_length = 424 output_struct->data.extended_irq.resource_source.string_length =
425 0; 425 0;
426 output_struct->data.extended_irq.resource_source.string_ptr = 426 output_struct->data.extended_irq.resource_source.string_ptr =
@@ -461,16 +461,15 @@ acpi_rs_extended_irq_stream(struct acpi_resource *linked_list,
461 u16 *length_field; 461 u16 *length_field;
462 u8 temp8 = 0; 462 u8 temp8 = 0;
463 u8 index; 463 u8 index;
464 char *temp_pointer = NULL;
465 464
466 ACPI_FUNCTION_TRACE("rs_extended_irq_stream"); 465 ACPI_FUNCTION_TRACE("rs_extended_irq_stream");
467 466
468 /* The descriptor field is static */ 467 /* Set the Descriptor Type field */
469 468
470 *buffer = 0x89; 469 *buffer = ACPI_RDESC_TYPE_EXTENDED_XRUPT;
471 buffer += 1; 470 buffer += 1;
472 471
473 /* Set a pointer to the Length field - to be filled in later */ 472 /* Save a pointer to the Length field - to be filled in later */
474 473
475 length_field = ACPI_CAST_PTR(u16, buffer); 474 length_field = ACPI_CAST_PTR(u16, buffer);
476 buffer += 2; 475 buffer += 2;
@@ -524,16 +523,14 @@ acpi_rs_extended_irq_stream(struct acpi_resource *linked_list,
524 (u8) linked_list->data.extended_irq.resource_source.index; 523 (u8) linked_list->data.extended_irq.resource_source.index;
525 buffer += 1; 524 buffer += 1;
526 525
527 temp_pointer = (char *)buffer;
528
529 /* Copy the string */ 526 /* Copy the string */
530 527
531 ACPI_STRCPY(temp_pointer, 528 ACPI_STRCPY((char *)buffer,
532 linked_list->data.extended_irq.resource_source. 529 linked_list->data.extended_irq.resource_source.
533 string_ptr); 530 string_ptr);
534 531
535 /* 532 /*
536 * Buffer needs to be set to the length of the sting + one for the 533 * Buffer needs to be set to the length of the string + one for the
537 * terminating null 534 * terminating null
538 */ 535 */
539 buffer += 536 buffer +=