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