xref: /netbsd-src/sys/external/bsd/acpica/dist/resources/rsmisc.c (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
1 /*******************************************************************************
2  *
3  * Module Name: rsmisc - Miscellaneous resource descriptors
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2023, 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             ACPI_MOVE_16_TO_16(&Temp16, Source);
245             ItemCount = Temp16 - Info->Value;
246 
247             Resource->Length = Resource->Length + ItemCount;
248             ACPI_SET16 (Destination, ItemCount);
249             break;
250 
251         case ACPI_RSC_COUNT_SERIAL_RES:
252 
253             ACPI_MOVE_16_TO_16(&Temp16, Source);
254             ItemCount = (AmlResourceLength +
255                 sizeof (AML_RESOURCE_LARGE_HEADER)) -
256                 Temp16 - Info->Value;
257 
258             Resource->Length = Resource->Length + ItemCount;
259             ACPI_SET16 (Destination, ItemCount);
260             break;
261 
262         case ACPI_RSC_LENGTH:
263 
264             Resource->Length = Resource->Length + Info->Value;
265             break;
266 
267         case ACPI_RSC_MOVE8:
268         case ACPI_RSC_MOVE16:
269         case ACPI_RSC_MOVE32:
270         case ACPI_RSC_MOVE64:
271             /*
272              * Raw data move. Use the Info value field unless ItemCount has
273              * been previously initialized via a COUNT opcode
274              */
275             if (Info->Value)
276             {
277                 ItemCount = Info->Value;
278             }
279             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
280             break;
281 
282         case ACPI_RSC_MOVE_GPIO_PIN:
283 
284             /* Generate and set the PIN data pointer */
285 
286             Target = (char *) ACPI_ADD_PTR (void, Resource,
287                 (Resource->Length - ItemCount * 2));
288             *(UINT16 **) Destination = ACPI_CAST_PTR (UINT16, Target);
289 
290             /* Copy the PIN data */
291 
292             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
293             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
294             break;
295 
296         case ACPI_RSC_MOVE_GPIO_RES:
297 
298             /* Generate and set the ResourceSource string pointer */
299 
300             Target = (char *) ACPI_ADD_PTR (void, Resource,
301                 (Resource->Length - ItemCount));
302             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
303 
304             /* Copy the ResourceSource string */
305 
306             Source = ACPI_ADD_PTR (void, Aml, ACPI_GET16 (Source));
307             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
308             break;
309 
310         case ACPI_RSC_MOVE_SERIAL_VEN:
311 
312             /* Generate and set the Vendor Data pointer */
313 
314             Target = (char *) ACPI_ADD_PTR (void, Resource,
315                 (Resource->Length - ItemCount));
316             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
317 
318             /* Copy the Vendor Data */
319 
320             Source = ACPI_ADD_PTR (void, Aml, Info->Value);
321             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
322             break;
323 
324         case ACPI_RSC_MOVE_SERIAL_RES:
325 
326             /* Generate and set the ResourceSource string pointer */
327 
328             Target = (char *) ACPI_ADD_PTR (void, Resource,
329                 (Resource->Length - ItemCount));
330             *(UINT8 **) Destination = ACPI_CAST_PTR (UINT8, Target);
331 
332             /* Copy the ResourceSource string */
333 
334             ACPI_MOVE_16_TO_16 (&Temp16, Source);
335             Source = ACPI_ADD_PTR (
336                 void, Aml, (Temp16 + Info->Value));
337             AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode);
338             break;
339 
340         case ACPI_RSC_SET8:
341 
342             memset (Destination, Info->AmlOffset, Info->Value);
343             break;
344 
345         case ACPI_RSC_DATA8:
346 
347             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
348             memcpy (Destination, Source,  ACPI_GET16 (Target));
349             break;
350 
351         case ACPI_RSC_ADDRESS:
352             /*
353              * Common handler for address descriptor flags
354              */
355             if (!AcpiRsGetAddressCommon (Resource, Aml))
356             {
357                 return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
358             }
359             break;
360 
361         case ACPI_RSC_SOURCE:
362             /*
363              * Optional ResourceSource (Index and String)
364              */
365             Resource->Length +=
366                 AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
367                     Destination, Aml, NULL);
368             break;
369 
370         case ACPI_RSC_SOURCEX:
371             /*
372              * Optional ResourceSource (Index and String). This is the more
373              * complicated case used by the Interrupt() macro
374              */
375             Target = ACPI_ADD_PTR (char, Resource,
376                 Info->AmlOffset + (ItemCount * 4));
377 
378             Resource->Length +=
379                 AcpiRsGetResourceSource (AmlResourceLength, (ACPI_RS_LENGTH)
380                     (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
381                     Destination, Aml, Target);
382             break;
383 
384         case ACPI_RSC_BITMASK:
385             /*
386              * 8-bit encoded bitmask (DMA macro)
387              */
388             ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
389             if (ItemCount)
390             {
391                 Resource->Length += (ItemCount - 1);
392             }
393 
394             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
395             ACPI_SET8 (Target, ItemCount);
396             break;
397 
398         case ACPI_RSC_BITMASK16:
399             /*
400              * 16-bit encoded bitmask (IRQ macro)
401              */
402             ACPI_MOVE_16_TO_16 (&Temp16, Source);
403 
404             ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
405             if (ItemCount)
406             {
407                 Resource->Length += (ItemCount - 1);
408             }
409 
410             Target = ACPI_ADD_PTR (char, Resource, Info->Value);
411             ACPI_SET8 (Target, ItemCount);
412             break;
413 
414         case ACPI_RSC_EXIT_NE:
415             /*
416              * Control - Exit conversion if not equal
417              */
418             switch (Info->ResourceOffset)
419             {
420             case ACPI_RSC_COMPARE_AML_LENGTH:
421 
422                 if (AmlResourceLength != Info->Value)
423                 {
424                     goto Exit;
425                 }
426                 break;
427 
428             case ACPI_RSC_COMPARE_VALUE:
429 
430                 if (ACPI_GET8 (Source) != Info->Value)
431                 {
432                     goto Exit;
433                 }
434                 break;
435 
436             default:
437 
438                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
439                 return_ACPI_STATUS (AE_BAD_PARAMETER);
440             }
441             break;
442 
443         default:
444 
445             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
446             return_ACPI_STATUS (AE_BAD_PARAMETER);
447         }
448 
449         Count--;
450         Info++;
451     }
452 
453 Exit:
454     if (!FlagsMode)
455     {
456         /* Round the resource struct length up to the next boundary (32 or 64) */
457 
458         Resource->Length = (UINT32)
459             ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
460     }
461     return_ACPI_STATUS (AE_OK);
462 }
463 
464 
465 /*******************************************************************************
466  *
467  * FUNCTION:    AcpiRsConvertResourceToAml
468  *
469  * PARAMETERS:  Resource            - Pointer to the resource descriptor
470  *              Aml                 - Where the AML descriptor is returned
471  *              Info                - Pointer to appropriate conversion table
472  *
473  * RETURN:      Status
474  *
475  * DESCRIPTION: Convert an internal resource descriptor to the corresponding
476  *              external AML resource descriptor.
477  *
478  ******************************************************************************/
479 
480 ACPI_STATUS
AcpiRsConvertResourceToAml(ACPI_RESOURCE * Resource,AML_RESOURCE * Aml,ACPI_RSCONVERT_INFO * Info)481 AcpiRsConvertResourceToAml (
482     ACPI_RESOURCE           *Resource,
483     AML_RESOURCE            *Aml,
484     ACPI_RSCONVERT_INFO     *Info)
485 {
486     void                    *Source = NULL;
487     void                    *Destination;
488     char                    *Target;
489     ACPI_RSDESC_SIZE        AmlLength = 0;
490     UINT8                   Count;
491     UINT16                  Temp16 = 0;
492     UINT16                  ItemCount = 0;
493 
494 
495     ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
496 
497 
498     if (!Info)
499     {
500         return_ACPI_STATUS (AE_BAD_PARAMETER);
501     }
502 
503     /*
504      * First table entry must be ACPI_RSC_INITxxx and must contain the
505      * table length (# of table entries)
506      */
507     Count = INIT_TABLE_LENGTH (Info);
508 
509     while (Count)
510     {
511         /*
512          * Source is the internal resource descriptor,
513          * destination is the external AML byte stream buffer
514          */
515         Source = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
516         Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
517 
518         switch (Info->Opcode)
519         {
520         case ACPI_RSC_INITSET:
521 
522             memset (Aml, 0, INIT_RESOURCE_LENGTH (Info));
523             AmlLength = INIT_RESOURCE_LENGTH (Info);
524             AcpiRsSetResourceHeader (
525                 INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
526             break;
527 
528         case ACPI_RSC_INITGET:
529             break;
530 
531         case ACPI_RSC_FLAGINIT:
532             /*
533              * Clear the flag byte
534              */
535             ACPI_SET8 (Destination, 0);
536             break;
537 
538         case ACPI_RSC_1BITFLAG:
539             /*
540              * Mask and shift the flag bit
541              */
542             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
543                 ((ACPI_GET8 (Source) & 0x01) << Info->Value));
544             break;
545 
546         case ACPI_RSC_2BITFLAG:
547             /*
548              * Mask and shift the flag bits
549              */
550             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
551                 ((ACPI_GET8 (Source) & 0x03) << Info->Value));
552             break;
553 
554         case ACPI_RSC_3BITFLAG:
555             /*
556              * Mask and shift the flag bits
557              */
558             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
559                 ((ACPI_GET8 (Source) & 0x07) << Info->Value));
560             break;
561 
562         case ACPI_RSC_6BITFLAG:
563             /*
564              * Mask and shift the flag bits
565              */
566             ACPI_SET_BIT (*ACPI_CAST8 (Destination), (UINT8)
567                 ((ACPI_GET8 (Source) & 0x3F) << Info->Value));
568             break;
569 
570         case ACPI_RSC_COUNT:
571 
572             ItemCount = ACPI_GET8 (Source);
573             ACPI_SET8 (Destination, ItemCount);
574 
575             AmlLength = (UINT16)
576                 (AmlLength + (Info->Value * (ItemCount - 1)));
577             break;
578 
579         case ACPI_RSC_COUNT16:
580 
581             ItemCount = ACPI_GET16 (Source);
582             AmlLength = (UINT16) (AmlLength + ItemCount);
583             AcpiRsSetResourceLength (AmlLength, Aml);
584             break;
585 
586         case ACPI_RSC_COUNT_GPIO_PIN:
587 
588             ItemCount = ACPI_GET16 (Source);
589             ACPI_SET16 (Destination, AmlLength);
590 
591             AmlLength = (UINT16) (AmlLength + ItemCount * 2);
592             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
593             ACPI_SET16 (Target, AmlLength);
594             AcpiRsSetResourceLength (AmlLength, Aml);
595             break;
596 
597         case ACPI_RSC_COUNT_GPIO_VEN:
598 
599             ItemCount = ACPI_GET16 (Source);
600             ACPI_SET16 (Destination, ItemCount);
601 
602             AmlLength = (UINT16) (
603                 AmlLength + (Info->Value * ItemCount));
604             AcpiRsSetResourceLength (AmlLength, Aml);
605             break;
606 
607         case ACPI_RSC_COUNT_GPIO_RES:
608 
609             /* Set resource source string length */
610 
611             ItemCount = ACPI_GET16 (Source);
612             ACPI_SET16 (Destination, AmlLength);
613 
614             /* Compute offset for the Vendor Data */
615 
616             AmlLength = (UINT16) (AmlLength + ItemCount);
617             Target = ACPI_ADD_PTR (void, Aml, Info->Value);
618 
619             /* Set vendor offset only if there is vendor data */
620 
621             ACPI_SET16 (Target, AmlLength);
622 
623             AcpiRsSetResourceLength (AmlLength, Aml);
624             break;
625 
626         case ACPI_RSC_COUNT_SERIAL_VEN:
627 
628             ItemCount = ACPI_GET16 (Source);
629             ACPI_SET16 (Destination, ItemCount + Info->Value);
630             AmlLength = (UINT16) (AmlLength + ItemCount);
631             AcpiRsSetResourceLength (AmlLength, Aml);
632             break;
633 
634         case ACPI_RSC_COUNT_SERIAL_RES:
635 
636             ItemCount = ACPI_GET16 (Source);
637             AmlLength = (UINT16) (AmlLength + ItemCount);
638             AcpiRsSetResourceLength (AmlLength, Aml);
639             break;
640 
641         case ACPI_RSC_LENGTH:
642 
643             AcpiRsSetResourceLength (Info->Value, Aml);
644             break;
645 
646         case ACPI_RSC_MOVE8:
647         case ACPI_RSC_MOVE16:
648         case ACPI_RSC_MOVE32:
649         case ACPI_RSC_MOVE64:
650 
651             if (Info->Value)
652             {
653                 ItemCount = Info->Value;
654             }
655             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
656             break;
657 
658         case ACPI_RSC_MOVE_GPIO_PIN:
659 
660             Destination = (char *) ACPI_ADD_PTR (void, Aml,
661                 ACPI_GET16 (Destination));
662             Source = * (UINT16 **) Source;
663             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
664             break;
665 
666         case ACPI_RSC_MOVE_GPIO_RES:
667 
668             /* Used for both ResourceSource string and VendorData */
669 
670             Destination = (char *) ACPI_ADD_PTR (void, Aml,
671                 ACPI_GET16 (Destination));
672             Source = * (UINT8 **) Source;
673             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
674             break;
675 
676         case ACPI_RSC_MOVE_SERIAL_VEN:
677 
678             Destination = (char *) ACPI_ADD_PTR (void, Aml,
679                 (AmlLength - ItemCount));
680             Source = * (UINT8 **) Source;
681             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
682             break;
683 
684         case ACPI_RSC_MOVE_SERIAL_RES:
685 
686             Destination = (char *) ACPI_ADD_PTR (void, Aml,
687                 (AmlLength - ItemCount));
688             Source = * (UINT8 **) Source;
689             AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
690             break;
691 
692         case ACPI_RSC_ADDRESS:
693 
694             /* Set the Resource Type, General Flags, and Type-Specific Flags */
695 
696             AcpiRsSetAddressCommon (Aml, Resource);
697             break;
698 
699         case ACPI_RSC_SOURCEX:
700             /*
701              * Optional ResourceSource (Index and String)
702              */
703             AmlLength = AcpiRsSetResourceSource (
704                 Aml, (ACPI_RS_LENGTH) AmlLength, Source);
705             AcpiRsSetResourceLength (AmlLength, Aml);
706             break;
707 
708         case ACPI_RSC_SOURCE:
709             /*
710              * Optional ResourceSource (Index and String). This is the more
711              * complicated case used by the Interrupt() macro
712              */
713             AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
714             AcpiRsSetResourceLength (AmlLength, Aml);
715             break;
716 
717         case ACPI_RSC_BITMASK:
718             /*
719              * 8-bit encoded bitmask (DMA macro)
720              */
721             ACPI_SET8 (Destination,
722                 AcpiRsEncodeBitmask (Source,
723                     *ACPI_ADD_PTR (UINT8, Resource, Info->Value)));
724             break;
725 
726         case ACPI_RSC_BITMASK16:
727             /*
728              * 16-bit encoded bitmask (IRQ macro)
729              */
730             Temp16 = AcpiRsEncodeBitmask (
731                 Source, *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
732             ACPI_MOVE_16_TO_16 (Destination, &Temp16);
733             break;
734 
735         case ACPI_RSC_EXIT_LE:
736             /*
737              * Control - Exit conversion if less than or equal
738              */
739             if (ItemCount <= Info->Value)
740             {
741                 goto Exit;
742             }
743             break;
744 
745         case ACPI_RSC_EXIT_NE:
746             /*
747              * Control - Exit conversion if not equal
748              */
749             switch (COMPARE_OPCODE (Info))
750             {
751             case ACPI_RSC_COMPARE_VALUE:
752 
753                 if (*ACPI_ADD_PTR (UINT8, Resource,
754                     COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
755                 {
756                     goto Exit;
757                 }
758                 break;
759 
760             default:
761 
762                 ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
763                 return_ACPI_STATUS (AE_BAD_PARAMETER);
764             }
765             break;
766 
767         case ACPI_RSC_EXIT_EQ:
768             /*
769              * Control - Exit conversion if equal
770              */
771             if (*ACPI_ADD_PTR (UINT8, Resource,
772                 COMPARE_TARGET (Info)) == COMPARE_VALUE (Info))
773             {
774                 goto Exit;
775             }
776             break;
777 
778         default:
779 
780             ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
781             return_ACPI_STATUS (AE_BAD_PARAMETER);
782         }
783 
784         Count--;
785         Info++;
786     }
787 
788 Exit:
789     return_ACPI_STATUS (AE_OK);
790 }
791 
792 
793 #if 0
794 /* Previous resource validations */
795 
796     if (Aml->ExtAddress64.RevisionID !=
797         AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
798     {
799         return_ACPI_STATUS (AE_SUPPORT);
800     }
801 
802     if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
803     {
804         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
805     }
806 
807     if (((Aml->Irq.Flags & 0x09) == 0x00) ||
808         ((Aml->Irq.Flags & 0x09) == 0x09))
809     {
810         /*
811          * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
812          * polarity/trigger interrupts are allowed (ACPI spec, section
813          * "IRQ Format"), so 0x00 and 0x09 are illegal.
814          */
815         ACPI_ERROR ((AE_INFO,
816             "Invalid interrupt polarity/trigger in resource list, 0x%X",
817             Aml->Irq.Flags));
818         return_ACPI_STATUS (AE_BAD_DATA);
819     }
820 
821     Resource->Data.ExtendedIrq.InterruptCount = Temp8;
822     if (Temp8 < 1)
823     {
824         /* Must have at least one IRQ */
825 
826         return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
827     }
828 
829     if (Resource->Data.Dma.Transfer == 0x03)
830     {
831         ACPI_ERROR ((AE_INFO,
832             "Invalid DMA.Transfer preference (3)"));
833         return_ACPI_STATUS (AE_BAD_DATA);
834     }
835 #endif
836