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
78ACPI_STATUS
79AcpiRsConvertAmlToResource (
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
442Exit:
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
468ACPI_STATUS
469AcpiRsConvertResourceToAml (
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
768Exit:
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
815