1 /*******************************************************************************
2  *
3  * Module Name: rsmisc - Miscellaneous resource descriptors
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2022, Intel Corp.
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 MERCHANTABILITY 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 #include "acpi.h"
45 #include "accommon.h"
46 #include "acresrc.h"
47 
48 #define _COMPONENT          ACPI_RESOURCES
49         ACPI_MODULE_NAME    ("rsmisc")
50 
51 
52 #define INIT_RESOURCE_TYPE(i)       i->ResourceOffset
53 #define INIT_RESOURCE_LENGTH(i)     i->AmlOffset
54 #define INIT_TABLE_LENGTH(i)        i->Value
55 
56 #define COMPARE_OPCODE(i)           i->ResourceOffset
57 #define COMPARE_TARGET(i)           i->AmlOffset
58 #define COMPARE_VALUE(i)            i->Value
59 
60 
61 /*******************************************************************************
62  *
63  * FUNCTION:    AcpiRsConvertAmlToResource
64  *
65  * PARAMETERS:  Resource            - Pointer to the resource descriptor
66  *              Aml                 - Where the AML descriptor is returned
67  *              Info                - Pointer to appropriate conversion table
68  *
69  * RETURN:      Status
70  *
71  * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
72  *              internal resource descriptor
73  *
74  ******************************************************************************/
75 
76 ACPI_STATUS
AcpiRsConvertAmlToResource(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)77 AcpiRsConvertAmlToResource (
78     ACPI_RESOURCE           *Resource,
79     AML_RESOURCE            *Aml,
80     ACPI_RSCONVERT_INFO     *Info)
81 {
82     ACPI_RS_LENGTH          AmlResourceLength;
83     void                    *Source;
84     void                    *Destination;
85     char                    *Target;
86     UINT8                   Count;
87     UINT8                   FlagsMode = FALSE;
88     UINT16                  ItemCount = 0;
89     UINT16                  Temp16 = 0;
90 
91 
92     ACPI_FUNCTION_TRACE (RsConvertAmlToResource);
93 
94 
95     if (!Info)
96     {
97         return_ACPI_STATUS (AE_BAD_PARAMETER);
98     }
99 
100     if (((ACPI_SIZE) Resource) & 0x3)
101     {
102         /* Each internal resource struct is expected to be 32-bit aligned */
103 
104         ACPI_WARNING ((AE_INFO,
105             "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u",
106             Resource, Resource->Type, Resource->Length));
107     }
108 
109     /* Extract the resource Length field (does not include header length) */
110 
111     AmlResourceLength = AcpiUtGetResourceLength (Aml);
112 
113     /*
114      * First table entry must be ACPI_RSC_INITxxx and must contain the
115      * table length (# of table entries)
116      */
117     Count = INIT_TABLE_LENGTH (Info);
118     while (Count)
119     {
120         Target = NULL;
121 
122         /*
123          * Source is the external AML byte stream buffer,
124          * destination is the internal resource descriptor
125          */
126         Source = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
127         Destination = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
128 
129         switch (Info->Opcode)
130         {
131         case ACPI_RSC_INITGET:
132             /*
133              * Get the resource type and the initial (minimum) length
134              */
135             memset (Resource, 0, INIT_RESOURCE_LENGTH (Info));
136             Resource->Type = INIT_RESOURCE_TYPE (Info);
137             Resource->Length = INIT_RESOURCE_LENGTH (Info);
138             break;
139 
140         case ACPI_RSC_INITSET:
141             break;
142 
143         case ACPI_RSC_FLAGINIT:
144 
145             FlagsMode = TRUE;
146             break;
147 
148         case ACPI_RSC_1BITFLAG:
149             /*
150              * Mask and shift the flag bit
151              */
152             ACPI_SET8 (Destination,
153                 ((ACPI_GET8 (Source) >> Info->Value) & 0x01));
154             break;
155 
156         case ACPI_RSC_2BITFLAG:
157             /*
158              * Mask and shift the flag bits
159              */
160             ACPI_SET8 (Destination,
161                 ((ACPI_GET8 (Source) >> Info->Value) & 0x03));
162             break;
163 
164         case ACPI_RSC_3BITFLAG:
165             /*
166              * Mask and shift the flag bits
167              */
168             ACPI_SET8 (Destination,
169                 ((ACPI_GET8 (Source) >> Info->Value) & 0x07));
170             break;
171 
172         case ACPI_RSC_6BITFLAG:
173             /*
174              * Mask and shift the flag bits
175              */
176             ACPI_SET8 (Destination,
177                 ((ACPI_GET8 (Source) >> Info->Value) & 0x3F));
178             break;
179 
180         case ACPI_RSC_COUNT:
181 
182             ItemCount = ACPI_GET8 (Source);
183             ACPI_SET8 (Destination, ItemCount);
184 
185             Resource->Length = Resource->Length +
186                 (Info->Value * (ItemCount - 1));
187             break;
188 
189         case ACPI_RSC_COUNT16:
190 
191             ItemCount = AmlResourceLength;
192             ACPI_SET16 (Destination, ItemCount);
193 
194             Resource->Length = Resource->Length +
195                 (Info->Value * (ItemCount - 1));
196             break;
197 
198         case ACPI_RSC_COUNT_GPIO_PIN:
199 
200             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
201             ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
202 
203             Resource->Length = Resource->Length + ItemCount;
204             ItemCount = ItemCount / 2;
205             ACPI_SET16 (Destination, ItemCount);
206             break;
207 
208         case ACPI_RSC_COUNT_GPIO_VEN:
209 
210             ItemCount = ACPI_GET8 (Source);
211             ACPI_SET8 (Destination, ItemCount);
212 
213             Resource->Length = Resource->Length + (Info->Value * ItemCount);
214             break;
215 
216         case ACPI_RSC_COUNT_GPIO_RES:
217             /*
218              * Vendor data is optional (length/offset may both be zero)
219              * Examine vendor data length field first
220              */
221             Target = ACPI_ADD_PTR (void, Aml, (Info->Value + 2));
222             if (ACPI_GET16 (Target))
223             {
224                 /* Use vendor offset to get resource source length */
225 
226                 Target = ACPI_ADD_PTR (void, Aml, Info->Value);
227                 ItemCount = ACPI_GET16 (Target) - ACPI_GET16 (Source);
228             }
229             else
230             {
231                 /* No vendor data to worry about */
232 
233                 ItemCount = Aml->LargeHeader.ResourceLength +
234                     sizeof (AML_RESOURCE_LARGE_HEADER) -
235                     ACPI_GET16 (Source);
236             }
237 
238             Resource->Length = Resource->Length + ItemCount;
239             ACPI_SET16 (Destination, ItemCount);
240             break;
241 
242         case ACPI_RSC_COUNT_SERIAL_VEN:
243 
244             ItemCount = ACPI_GET16 (Source) - Info->Value;
245 
246             Resource->Length = Resource->Length + ItemCount;
247             ACPI_SET16 (Destination, ItemCount);
248             break;
249 
250         case ACPI_RSC_COUNT_SERIAL_RES:
251 
252             ItemCount = (AmlResourceLength +
253                 sizeof (AML_RESOURCE_LARGE_HEADER)) -
254                 ACPI_GET16 (Source) - Info->Value;
255 
256             Resource->Length = Resource->Length + ItemCount;
257             ACPI_SET16 (Destination, ItemCount);
258             break;
259 
260         case ACPI_RSC_LENGTH:
261 
262             Resource->Length = Resource->Length + Info->Value;
263             break;
264 
265         case ACPI_RSC_MOVE8:
266         case ACPI_RSC_MOVE16:
267         case ACPI_RSC_MOVE32:
268         case ACPI_RSC_MOVE64:
269             /*
270              * Raw data move. Use the Info value field unless ItemCount has
271              * been previously initialized via a COUNT opcode
272              */
273             if (Info->Value)
274             {
275                 ItemCount = Info->Value;
276             }
277             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
278             break;
279 
280         case ACPI_RSC_MOVE_GPIO_PIN:
281 
282             /* Generate and set the PIN data pointer */
283 
284             Target = (char *) ACPI_ADD_PTR (void, Resource,
285                 (Resource->Length - ItemCount * 2));
286             *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
287 
288             /* Copy the PIN data */
289 
290             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
291             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
292             break;
293 
294         case ACPI_RSC_MOVE_GPIO_RES:
295 
296             /* Generate and set the ResourceSource string pointer */
297 
298             Target = (char *) ACPI_ADD_PTR (void, Resource,
299                 (Resource->Length - ItemCount));
300             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
301 
302             /* Copy the ResourceSource string */
303 
304             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
305             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
306             break;
307 
308         case ACPI_RSC_MOVE_SERIAL_VEN:
309 
310             /* Generate and set the Vendor Data pointer */
311 
312             Target = (char *) ACPI_ADD_PTR (void, Resource,
313                 (Resource->Length - ItemCount));
314             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
315 
316             /* Copy the Vendor Data */
317 
318             Source = ACPI_ADD_PTR (void, Aml, Info->Value);
319             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
320             break;
321 
322         case ACPI_RSC_MOVE_SERIAL_RES:
323 
324             /* Generate and set the ResourceSource string pointer */
325 
326             Target = (char *) ACPI_ADD_PTR (void, Resource,
327                 (Resource->Length - ItemCount));
328             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
329 
330             /* Copy the ResourceSource string */
331 
332             Source = ACPI_ADD_PTR (
333                 void, Aml, (ACPI_GET16 (Source) + Info->Value));
334             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
335             break;
336 
337         case ACPI_RSC_SET8:
338 
339             memset (Destination, Info->AmlOffset, Info->Value);
340             break;
341 
342         case ACPI_RSC_DATA8:
343 
344             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
345             memcpy (Destination, Source,  ACPI_GET16 (Target));
346             break;
347 
348         case ACPI_RSC_ADDRESS:
349             /*
350              * Common handler for address descriptor flags
351              */
352             if (!AcpiRsGetAddressCommon (Resource, Aml))
353             {
354                 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
355             }
356             break;
357 
358         case ACPI_RSC_SOURCE:
359             /*
360              * Optional ResourceSource (Index and String)
361              */
362             Resource->Length +=
363                 AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
364                     Destination, Aml, NULL);
365             break;
366 
367         case ACPI_RSC_SOURCEX:
368             /*
369              * Optional ResourceSource (Index and String). This is the more
370              * complicated case used by the Interrupt() macro
371              */
372             Target = ACPI_ADD_PTR (char, Resource,
373                 Info->AmlOffset + (ItemCount * 4));
374 
375             Resource->Length +=
376                 AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
377                     (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
378                     Destination, Aml, Target);
379             break;
380 
381         case ACPI_RSC_BITMASK:
382             /*
383              * 8-bit encoded bitmask (DMA macro)
384              */
385             ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
386             if (ItemCount)
387             {
388                 Resource->Length += (ItemCount - 1);
389             }
390 
391             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
392             ACPI_SET8 (Target, ItemCount);
393             break;
394 
395         case ACPI_RSC_BITMASK16:
396             /*
397              * 16-bit encoded bitmask (IRQ macro)
398              */
399             ACPI_MOVE_16_TO_16 (&Temp16, Source);
400 
401             ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
402             if (ItemCount)
403             {
404                 Resource->Length += (ItemCount - 1);
405             }
406 
407             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
408             ACPI_SET8 (Target, ItemCount);
409             break;
410 
411         case ACPI_RSC_EXIT_NE:
412             /*
413              * Control - Exit conversion if not equal
414              */
415             switch (Info->ResourceOffset)
416             {
417             case ACPI_RSC_COMPARE_AML_LENGTH:
418 
419                 if (AmlResourceLength != Info->Value)
420                 {
421                     goto Exit;
422                 }
423                 break;
424 
425             case ACPI_RSC_COMPARE_VALUE:
426 
427                 if (ACPI_GET8 (Source) != Info->Value)
428                 {
429                     goto Exit;
430                 }
431                 break;
432 
433             default:
434 
435                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
436                 return_ACPI_STATUS (AE_BAD_PARAMETER);
437             }
438             break;
439 
440         default:
441 
442             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
443             return_ACPI_STATUS (AE_BAD_PARAMETER);
444         }
445 
446         Count--;
447         Info++;
448     }
449 
450 Exit:
451     if (!FlagsMode)
452     {
453         /* Round the resource struct length up to the next boundary (32 or 64) */
454 
455         Resource->Length = (UINT32)
456             ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
457     }
458     return_ACPI_STATUS (AE_OK);
459 }
460 
461 
462 /*******************************************************************************
463  *
464  * FUNCTION:    AcpiRsConvertResourceToAml
465  *
466  * PARAMETERS:  Resource            - Pointer to the resource descriptor
467  *              Aml                 - Where the AML descriptor is returned
468  *              Info                - Pointer to appropriate conversion table
469  *
470  * RETURN:      Status
471  *
472  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
473  *              external AML resource descriptor.
474  *
475  ******************************************************************************/
476 
477 ACPI_STATUS
AcpiRsConvertResourceToAml(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)478 AcpiRsConvertResourceToAml (
479     ACPI_RESOURCE           *Resource,
480     AML_RESOURCE            *Aml,
481     ACPI_RSCONVERT_INFO     *Info)
482 {
483     void                    *Source = NULL;
484     void                    *Destination;
485     char                    *Target;
486     ACPI_RSDESC_SIZE        AmlLength = 0;
487     UINT8                   Count;
488     UINT16                  Temp16 = 0;
489     UINT16                  ItemCount = 0;
490 
491 
492     ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
493 
494 
495     if (!Info)
496     {
497         return_ACPI_STATUS (AE_BAD_PARAMETER);
498     }
499 
500     /*
501      * First table entry must be ACPI_RSC_INITxxx and must contain the
502      * table length (# of table entries)
503      */
504     Count = INIT_TABLE_LENGTH (Info);
505 
506     while (Count)
507     {
508         /*
509          * Source is the internal resource descriptor,
510          * destination is the external AML byte stream buffer
511          */
512         Source = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
513         Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
514 
515         switch (Info->Opcode)
516         {
517         case ACPI_RSC_INITSET:
518 
519             memset (Aml, 0, INIT_RESOURCE_LENGTH (Info));
520             AmlLength = INIT_RESOURCE_LENGTH (Info);
521             AcpiRsSetResourceHeader (
522                 INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
523             break;
524 
525         case ACPI_RSC_INITGET:
526             break;
527 
528         case ACPI_RSC_FLAGINIT:
529             /*
530              * Clear the flag byte
531              */
532             ACPI_SET8 (Destination, 0);
533             break;
534 
535         case ACPI_RSC_1BITFLAG:
536             /*
537              * Mask and shift the flag bit
538              */
539             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
540                 ((ACPI_GET8 (Source) & 0x01) << Info->Value));
541             break;
542 
543         case ACPI_RSC_2BITFLAG:
544             /*
545              * Mask and shift the flag bits
546              */
547             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
548                 ((ACPI_GET8 (Source) & 0x03) << Info->Value));
549             break;
550 
551         case ACPI_RSC_3BITFLAG:
552             /*
553              * Mask and shift the flag bits
554              */
555             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
556                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
557             break;
558 
559         case ACPI_RSC_6BITFLAG:
560             /*
561              * Mask and shift the flag bits
562              */
563             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
564                 ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
565             break;
566 
567         case ACPI_RSC_COUNT:
568 
569             ItemCount = ACPI_GET8 (Source);
570             ACPI_SET8 (Destination, ItemCount);
571 
572             AmlLength = (UINT16)
573                 (AmlLength + (Info->Value * (ItemCount - 1)));
574             break;
575 
576         case ACPI_RSC_COUNT16:
577 
578             ItemCount = ACPI_GET16 (Source);
579             AmlLength = (UINT16) (AmlLength + ItemCount);
580             AcpiRsSetResourceLength (AmlLength, Aml);
581             break;
582 
583         case ACPI_RSC_COUNT_GPIO_PIN:
584 
585             ItemCount = ACPI_GET16 (Source);
586             ACPI_SET16 (Destination, AmlLength);
587 
588             AmlLength = (UINT16) (AmlLength + ItemCount * 2);
589             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
590             ACPI_SET16 (Target, AmlLength);
591             AcpiRsSetResourceLength (AmlLength, Aml);
592             break;
593 
594         case ACPI_RSC_COUNT_GPIO_VEN:
595 
596             ItemCount = ACPI_GET16 (Source);
597             ACPI_SET16 (Destination, ItemCount);
598 
599             AmlLength = (UINT16) (
600                 AmlLength + (Info->Value * ItemCount));
601             AcpiRsSetResourceLength (AmlLength, Aml);
602             break;
603 
604         case ACPI_RSC_COUNT_GPIO_RES:
605 
606             /* Set resource source string length */
607 
608             ItemCount = ACPI_GET16 (Source);
609             ACPI_SET16 (Destination, AmlLength);
610 
611             /* Compute offset for the Vendor Data */
612 
613             AmlLength = (UINT16) (AmlLength + ItemCount);
614             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
615 
616             /* Set vendor offset only if there is vendor data */
617 
618             ACPI_SET16 (Target, AmlLength);
619 
620             AcpiRsSetResourceLength (AmlLength, Aml);
621             break;
622 
623         case ACPI_RSC_COUNT_SERIAL_VEN:
624 
625             ItemCount = ACPI_GET16 (Source);
626             ACPI_SET16 (Destination, ItemCount + Info->Value);
627             AmlLength = (UINT16) (AmlLength + ItemCount);
628             AcpiRsSetResourceLength (AmlLength, Aml);
629             break;
630 
631         case ACPI_RSC_COUNT_SERIAL_RES:
632 
633             ItemCount = ACPI_GET16 (Source);
634             AmlLength = (UINT16) (AmlLength + ItemCount);
635             AcpiRsSetResourceLength (AmlLength, Aml);
636             break;
637 
638         case ACPI_RSC_LENGTH:
639 
640             AcpiRsSetResourceLength (Info->Value, Aml);
641             break;
642 
643         case ACPI_RSC_MOVE8:
644         case ACPI_RSC_MOVE16:
645         case ACPI_RSC_MOVE32:
646         case ACPI_RSC_MOVE64:
647 
648             if (Info->Value)
649             {
650                 ItemCount = Info->Value;
651             }
652             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
653             break;
654 
655         case ACPI_RSC_MOVE_GPIO_PIN:
656 
657             Destination = (char *) ACPI_ADD_PTR (void, Aml,
658                 ACPI_GET16 (Destination));
659             Source = * (UINT16 **) Source;
660             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
661             break;
662 
663         case ACPI_RSC_MOVE_GPIO_RES:
664 
665             /* Used for both ResourceSource string and VendorData */
666 
667             Destination = (char *) ACPI_ADD_PTR (void, Aml,
668                 ACPI_GET16 (Destination));
669             Source = * (UINT8 **) Source;
670             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
671             break;
672 
673         case ACPI_RSC_MOVE_SERIAL_VEN:
674 
675             Destination = (char *) ACPI_ADD_PTR (void, Aml,
676                 (AmlLength - ItemCount));
677             Source = * (UINT8 **) Source;
678             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
679             break;
680 
681         case ACPI_RSC_MOVE_SERIAL_RES:
682 
683             Destination = (char *) ACPI_ADD_PTR (void, Aml,
684                 (AmlLength - ItemCount));
685             Source = * (UINT8 **) Source;
686             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
687             break;
688 
689         case ACPI_RSC_ADDRESS:
690 
691             /* Set the Resource Type, General Flags, and Type-Specific Flags */
692 
693             AcpiRsSetAddressCommon (Aml, Resource);
694             break;
695 
696         case ACPI_RSC_SOURCEX:
697             /*
698              * Optional ResourceSource (Index and String)
699              */
700             AmlLength = AcpiRsSetResourceSource (
701                 Aml, (ACPI_RS_LENGTH) AmlLength, Source);
702             AcpiRsSetResourceLength (AmlLength, Aml);
703             break;
704 
705         case ACPI_RSC_SOURCE:
706             /*
707              * Optional ResourceSource (Index and String). This is the more
708              * complicated case used by the Interrupt() macro
709              */
710             AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
711             AcpiRsSetResourceLength (AmlLength, Aml);
712             break;
713 
714         case ACPI_RSC_BITMASK:
715             /*
716              * 8-bit encoded bitmask (DMA macro)
717              */
718             ACPI_SET8 (Destination,
719                 AcpiRsEncodeBitmask (Source,
720                     *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
721             break;
722 
723         case ACPI_RSC_BITMASK16:
724             /*
725              * 16-bit encoded bitmask (IRQ macro)
726              */
727             Temp16 = AcpiRsEncodeBitmask (
728                 Source, *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
729             ACPI_MOVE_16_TO_16 (Destination, &Temp16);
730             break;
731 
732         case ACPI_RSC_EXIT_LE:
733             /*
734              * Control - Exit conversion if less than or equal
735              */
736             if (ItemCount <= Info->Value)
737             {
738                 goto Exit;
739             }
740             break;
741 
742         case ACPI_RSC_EXIT_NE:
743             /*
744              * Control - Exit conversion if not equal
745              */
746             switch (COMPARE_OPCODE (Info))
747             {
748             case ACPI_RSC_COMPARE_VALUE:
749 
750                 if (*ACPI_ADD_PTR (UINT8, Resource,
751                     COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
752                 {
753                     goto Exit;
754                 }
755                 break;
756 
757             default:
758 
759                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
760                 return_ACPI_STATUS (AE_BAD_PARAMETER);
761             }
762             break;
763 
764         case ACPI_RSC_EXIT_EQ:
765             /*
766              * Control - Exit conversion if equal
767              */
768             if (*ACPI_ADD_PTR (UINT8, Resource,
769                 COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
770             {
771                 goto Exit;
772             }
773             break;
774 
775         default:
776 
777             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
778             return_ACPI_STATUS (AE_BAD_PARAMETER);
779         }
780 
781         Count--;
782         Info++;
783     }
784 
785 Exit:
786     return_ACPI_STATUS (AE_OK);
787 }
788 
789 
790 #if 0
791 /* Previous resource validations */
792 
793     if (Aml->ExtAddress64.RevisionID !=
794         AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
795     {
796         return_ACPI_STATUS (AE_SUPPORT);
797     }
798 
799     if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
800     {
801         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
802     }
803 
804     if (((Aml->Irq.Flags & 0x09) == 0x00) ||
805         ((Aml->Irq.Flags & 0x09) == 0x09))
806     {
807         /*
808          * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
809          * polarity/trigger interrupts are allowed (ACPI spec, section
810          * "IRQ Format"), so 0x00 and 0x09 are illegal.
811          */
812         ACPI_ERROR ((AE_INFO,
813             "Invalid interrupt polarity/trigger in resource list, 0x%X",
814             Aml->Irq.Flags));
815         return_ACPI_STATUS (AE_BAD_DATA);
816     }
817 
818     Resource->Data.ExtendedIrq.InterruptCount = Temp8;
819     if (Temp8 < 1)
820     {
821         /* Must have at least one IRQ */
822 
823         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
824     }
825 
826     if (Resource->Data.Dma.Transfer == 0x03)
827     {
828         ACPI_ERROR ((AE_INFO,
829             "Invalid DMA.Transfer preference (3)"));
830         return_ACPI_STATUS (AE_BAD_DATA);
831     }
832 #endif
833