Merge branch 'openssh'
[dragonfly.git] / sys / contrib / dev / acpica / source / components / disassembler / dmresrcl.c
1 /*******************************************************************************
2  *
3  * Module Name: dmresrcl.c - "Large" Resource Descriptor disassembly
4  *
5  ******************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2014, 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 #include "acpi.h"
45 #include "accommon.h"
46 #include "acdisasm.h"
47
48
49 #ifdef ACPI_DISASSEMBLER
50
51 #define _COMPONENT          ACPI_CA_DEBUGGER
52         ACPI_MODULE_NAME    ("dbresrcl")
53
54
55 /* Common names for address and memory descriptors */
56
57 static char                 *AcpiDmAddressNames[] =
58 {
59     "Granularity",
60     "Range Minimum",
61     "Range Maximum",
62     "Translation Offset",
63     "Length"
64 };
65
66 static char                 *AcpiDmMemoryNames[] =
67 {
68     "Range Minimum",
69     "Range Maximum",
70     "Alignment",
71     "Length"
72 };
73
74
75 /* Local prototypes */
76
77 static void
78 AcpiDmSpaceFlags (
79         UINT8               Flags);
80
81 static void
82 AcpiDmIoFlags (
83         UINT8               Flags);
84
85 static void
86 AcpiDmIoFlags2 (
87         UINT8               SpecificFlags);
88
89 static void
90 AcpiDmMemoryFlags (
91     UINT8                   Flags,
92     UINT8                   SpecificFlags);
93
94 static void
95 AcpiDmMemoryFlags2 (
96     UINT8                   SpecificFlags);
97
98 static void
99 AcpiDmResourceSource (
100     AML_RESOURCE            *Resource,
101     ACPI_SIZE               MinimumLength,
102     UINT32                  Length);
103
104 static void
105 AcpiDmAddressFields (
106     void                    *Source,
107     UINT8                   Type,
108     UINT32                  Level);
109
110 static void
111 AcpiDmAddressPrefix (
112     UINT8                   Type);
113
114 static void
115 AcpiDmAddressCommon (
116     AML_RESOURCE            *Resource,
117     UINT8                   Type,
118     UINT32                  Level);
119
120 static void
121 AcpiDmAddressFlags (
122     AML_RESOURCE            *Resource);
123
124
125 /*******************************************************************************
126  *
127  * FUNCTION:    AcpiDmMemoryFields
128  *
129  * PARAMETERS:  Source              - Pointer to the contiguous data fields
130  *              Type                - 16 or 32 (bit)
131  *              Level               - Current source code indentation level
132  *
133  * RETURN:      None
134  *
135  * DESCRIPTION: Decode fields common to Memory24 and Memory32 descriptors
136  *
137  ******************************************************************************/
138
139 static void
140 AcpiDmMemoryFields (
141     void                    *Source,
142     UINT8                   Type,
143     UINT32                  Level)
144 {
145     UINT32                  i;
146
147
148     for (i = 0; i < 4; i++)
149     {
150         AcpiDmIndent (Level + 1);
151
152         switch (Type)
153         {
154         case 16:
155
156             AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i],
157                 AcpiDmMemoryNames[i]);
158             break;
159
160         case 32:
161
162             AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i],
163                 AcpiDmMemoryNames[i]);
164             break;
165
166         default:
167
168             return;
169         }
170     }
171 }
172
173
174 /*******************************************************************************
175  *
176  * FUNCTION:    AcpiDmAddressFields
177  *
178  * PARAMETERS:  Source              - Pointer to the contiguous data fields
179  *              Type                - 16, 32, or 64 (bit)
180  *              Level               - Current source code indentation level
181  *
182  * RETURN:      None
183  *
184  * DESCRIPTION: Decode fields common to address descriptors
185  *
186  ******************************************************************************/
187
188 static void
189 AcpiDmAddressFields (
190     void                    *Source,
191     UINT8                   Type,
192     UINT32                  Level)
193 {
194     UINT32                  i;
195
196
197     AcpiOsPrintf ("\n");
198
199     for (i = 0; i < 5; i++)
200     {
201         AcpiDmIndent (Level + 1);
202
203         switch (Type)
204         {
205         case 16:
206
207             AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i],
208                 AcpiDmAddressNames[i]);
209             break;
210
211         case 32:
212
213             AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i],
214                 AcpiDmAddressNames[i]);
215             break;
216
217         case 64:
218
219             AcpiDmDumpInteger64 (ACPI_CAST_PTR (UINT64, Source)[i],
220                 AcpiDmAddressNames[i]);
221             break;
222
223         default:
224
225             return;
226         }
227     }
228 }
229
230
231 /*******************************************************************************
232  *
233  * FUNCTION:    AcpiDmAddressPrefix
234  *
235  * PARAMETERS:  Type                - Descriptor type
236  *
237  * RETURN:      None
238  *
239  * DESCRIPTION: Emit name prefix representing the address descriptor type
240  *
241  ******************************************************************************/
242
243 static void
244 AcpiDmAddressPrefix (
245     UINT8                   Type)
246 {
247
248     switch (Type)
249     {
250     case ACPI_RESOURCE_TYPE_ADDRESS16:
251
252         AcpiOsPrintf ("Word");
253         break;
254
255     case ACPI_RESOURCE_TYPE_ADDRESS32:
256
257         AcpiOsPrintf ("DWord");
258         break;
259
260     case ACPI_RESOURCE_TYPE_ADDRESS64:
261
262         AcpiOsPrintf ("QWord");
263         break;
264
265     case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
266
267         AcpiOsPrintf ("Extended");
268         break;
269
270     default:
271
272         return;
273     }
274 }
275
276
277 /*******************************************************************************
278  *
279  * FUNCTION:    AcpiDmAddressCommon
280  *
281  * PARAMETERS:  Resource            - Raw AML descriptor
282  *              Type                - Descriptor type
283  *              Level               - Current source code indentation level
284  *
285  * RETURN:      None
286  *
287  * DESCRIPTION: Emit common name and flag fields common to address descriptors
288  *
289  ******************************************************************************/
290
291 static void
292 AcpiDmAddressCommon (
293     AML_RESOURCE            *Resource,
294     UINT8                   Type,
295     UINT32                  Level)
296 {
297     UINT8                   ResourceType;
298     UINT8                   SpecificFlags;
299     UINT8                   Flags;
300
301
302     ResourceType = Resource->Address.ResourceType;
303     SpecificFlags = Resource->Address.SpecificFlags;
304     Flags = Resource->Address.Flags;
305
306     AcpiDmIndent (Level);
307
308     /* Validate ResourceType */
309
310     if ((ResourceType > 2) && (ResourceType < 0xC0))
311     {
312         AcpiOsPrintf ("/**** Invalid Resource Type: 0x%X ****/", ResourceType);
313         return;
314     }
315
316     /* Prefix is either Word, DWord, QWord, or Extended */
317
318     AcpiDmAddressPrefix (Type);
319
320     /* Resource Types above 0xC0 are vendor-defined */
321
322     if (ResourceType > 2)
323     {
324         AcpiOsPrintf ("Space (0x%2.2X, ", ResourceType);
325         AcpiDmSpaceFlags (Flags);
326         AcpiOsPrintf (" 0x%2.2X,", SpecificFlags);
327         return;
328     }
329
330     /* This is either a Memory, IO, or BusNumber descriptor (0,1,2) */
331
332     AcpiOsPrintf ("%s (", AcpiGbl_WordDecode [ACPI_GET_2BIT_FLAG (ResourceType)]);
333
334     /* Decode the general and type-specific flags */
335
336     if (ResourceType == ACPI_MEMORY_RANGE)
337     {
338         AcpiDmMemoryFlags (Flags, SpecificFlags);
339     }
340     else /* IO range or BusNumberRange */
341     {
342         AcpiDmIoFlags (Flags);
343         if (ResourceType == ACPI_IO_RANGE)
344         {
345             AcpiOsPrintf (" %s,", AcpiGbl_RngDecode [ACPI_GET_2BIT_FLAG (SpecificFlags)]);
346         }
347     }
348 }
349
350
351 /*******************************************************************************
352  *
353  * FUNCTION:    AcpiDmAddressFlags
354  *
355  * PARAMETERS:  Resource        - Raw AML descriptor
356  *
357  * RETURN:      None
358  *
359  * DESCRIPTION: Emit flags common to address descriptors
360  *
361  ******************************************************************************/
362
363 static void
364 AcpiDmAddressFlags (
365     AML_RESOURCE            *Resource)
366 {
367
368     if (Resource->Address.ResourceType == ACPI_IO_RANGE)
369     {
370         AcpiDmIoFlags2 (Resource->Address.SpecificFlags);
371     }
372     else if (Resource->Address.ResourceType == ACPI_MEMORY_RANGE)
373     {
374         AcpiDmMemoryFlags2 (Resource->Address.SpecificFlags);
375     }
376 }
377
378
379 /*******************************************************************************
380  *
381  * FUNCTION:    AcpiDmSpaceFlags
382  *
383  * PARAMETERS:  Flags               - Flag byte to be decoded
384  *
385  * RETURN:      None
386  *
387  * DESCRIPTION: Decode the flags specific to Space Address space descriptors
388  *
389  ******************************************************************************/
390
391 static void
392 AcpiDmSpaceFlags (
393     UINT8                   Flags)
394 {
395
396     AcpiOsPrintf ("%s, %s, %s, %s,",
397         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Flags)],
398         AcpiGbl_DecDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 1)],
399         AcpiGbl_MinDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 2)],
400         AcpiGbl_MaxDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 3)]);
401 }
402
403
404 /*******************************************************************************
405  *
406  * FUNCTION:    AcpiDmIoFlags
407  *
408  * PARAMETERS:  Flags               - Flag byte to be decoded
409  *
410  * RETURN:      None
411  *
412  * DESCRIPTION: Decode the flags specific to IO Address space descriptors
413  *
414  ******************************************************************************/
415
416 static void
417 AcpiDmIoFlags (
418         UINT8               Flags)
419 {
420     AcpiOsPrintf ("%s, %s, %s, %s,",
421         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Flags)],
422         AcpiGbl_MinDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 2)],
423         AcpiGbl_MaxDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 3)],
424         AcpiGbl_DecDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 1)]);
425 }
426
427
428 /*******************************************************************************
429  *
430  * FUNCTION:    AcpiDmIoFlags2
431  *
432  * PARAMETERS:  SpecificFlags       - "Specific" flag byte to be decoded
433  *
434  * RETURN:      None
435  *
436  * DESCRIPTION: Decode the flags specific to IO Address space descriptors
437  *
438  ******************************************************************************/
439
440 static void
441 AcpiDmIoFlags2 (
442         UINT8               SpecificFlags)
443 {
444
445     AcpiOsPrintf (", %s",
446         AcpiGbl_TtpDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 4)]);
447
448     /* TRS is only used if TTP is TypeTranslation */
449
450     if (SpecificFlags & 0x10)
451     {
452         AcpiOsPrintf (", %s",
453             AcpiGbl_TrsDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 5)]);
454     }
455 }
456
457
458 /*******************************************************************************
459  *
460  * FUNCTION:    AcpiDmMemoryFlags
461  *
462  * PARAMETERS:  Flags               - Flag byte to be decoded
463  *              SpecificFlags       - "Specific" flag byte to be decoded
464  *
465  * RETURN:      None
466  *
467  * DESCRIPTION: Decode flags specific to Memory Address Space descriptors
468  *
469  ******************************************************************************/
470
471 static void
472 AcpiDmMemoryFlags (
473     UINT8                   Flags,
474     UINT8                   SpecificFlags)
475 {
476
477     AcpiOsPrintf ("%s, %s, %s, %s, %s, %s,",
478         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Flags)],
479         AcpiGbl_DecDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 1)],
480         AcpiGbl_MinDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 2)],
481         AcpiGbl_MaxDecode [ACPI_EXTRACT_1BIT_FLAG (Flags, 3)],
482         AcpiGbl_MemDecode [ACPI_EXTRACT_2BIT_FLAG (SpecificFlags, 1)],
483         AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (SpecificFlags)]);
484 }
485
486
487 /*******************************************************************************
488  *
489  * FUNCTION:    AcpiDmMemoryFlags2
490  *
491  * PARAMETERS:  SpecificFlags       - "Specific" flag byte to be decoded
492  *
493  * RETURN:      None
494  *
495  * DESCRIPTION: Decode flags specific to Memory Address Space descriptors
496  *
497  ******************************************************************************/
498
499 static void
500 AcpiDmMemoryFlags2 (
501     UINT8                   SpecificFlags)
502 {
503
504     AcpiOsPrintf (", %s, %s",
505         AcpiGbl_MtpDecode [ACPI_EXTRACT_2BIT_FLAG (SpecificFlags, 3)],
506         AcpiGbl_TtpDecode [ACPI_EXTRACT_1BIT_FLAG (SpecificFlags, 5)]);
507 }
508
509
510 /*******************************************************************************
511  *
512  * FUNCTION:    AcpiDmResourceSource
513  *
514  * PARAMETERS:  Resource        - Raw AML descriptor
515  *              MinimumLength   - descriptor length without optional fields
516  *              ResourceLength
517  *
518  * RETURN:      None
519  *
520  * DESCRIPTION: Dump optional ResourceSource fields of an address descriptor
521  *
522  ******************************************************************************/
523
524 static void
525 AcpiDmResourceSource (
526     AML_RESOURCE            *Resource,
527     ACPI_SIZE               MinimumTotalLength,
528     UINT32                  ResourceLength)
529 {
530     UINT8                   *AmlResourceSource;
531     UINT32                  TotalLength;
532
533
534     TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER);
535
536     /* Check if the optional ResourceSource fields are present */
537
538     if (TotalLength <= MinimumTotalLength)
539     {
540         /* The two optional fields are not used */
541
542         AcpiOsPrintf (",, ");
543         return;
544     }
545
546     /* Get a pointer to the ResourceSource */
547
548     AmlResourceSource = ACPI_ADD_PTR (UINT8, Resource, MinimumTotalLength);
549
550     /*
551      * Always emit the ResourceSourceIndex (Byte)
552      *
553      * NOTE: Some ASL compilers always create a 0 byte (in the AML) for the
554      * Index even if the String does not exist. Although this is in violation
555      * of the ACPI specification, it is very important to emit ASL code that
556      * can be compiled back to the identical AML. There may be fields and/or
557      * indexes into the resource template buffer that are compiled to absolute
558      * offsets, and these will be broken if the AML length is changed.
559      */
560     AcpiOsPrintf ("0x%2.2X,", (UINT32) AmlResourceSource[0]);
561
562     /* Make sure that the ResourceSource string exists before dumping it */
563
564     if (TotalLength > (MinimumTotalLength + 1))
565     {
566         AcpiOsPrintf (" ");
567         AcpiUtPrintString ((char *) &AmlResourceSource[1], ACPI_UINT16_MAX);
568     }
569
570     AcpiOsPrintf (", ");
571 }
572
573
574 /*******************************************************************************
575  *
576  * FUNCTION:    AcpiDmWordDescriptor
577  *
578  * PARAMETERS:  Info                - Extra resource info
579  *              Resource            - Pointer to the resource descriptor
580  *              Length              - Length of the descriptor in bytes
581  *              Level               - Current source code indentation level
582  *
583  * RETURN:      None
584  *
585  * DESCRIPTION: Decode a Word Address Space descriptor
586  *
587  ******************************************************************************/
588
589 void
590 AcpiDmWordDescriptor (
591     ACPI_OP_WALK_INFO       *Info,
592     AML_RESOURCE            *Resource,
593     UINT32                  Length,
594     UINT32                  Level)
595 {
596
597     /* Dump resource name and flags */
598
599     AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS16, Level);
600
601     /* Dump the 5 contiguous WORD values */
602
603     AcpiDmAddressFields (&Resource->Address16.Granularity, 16, Level);
604
605     /* The ResourceSource fields are optional */
606
607     AcpiDmIndent (Level + 1);
608     AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS16), Length);
609
610     /* Insert a descriptor name */
611
612     AcpiDmDescriptorName ();
613
614     /* Type-specific flags */
615
616     AcpiDmAddressFlags (Resource);
617     AcpiOsPrintf (")\n");
618 }
619
620
621 /*******************************************************************************
622  *
623  * FUNCTION:    AcpiDmDwordDescriptor
624  *
625  * PARAMETERS:  Info                - Extra resource info
626  *              Resource            - Pointer to the resource descriptor
627  *              Length              - Length of the descriptor in bytes
628  *              Level               - Current source code indentation level
629  *
630  * RETURN:      None
631  *
632  * DESCRIPTION: Decode a DWord Address Space descriptor
633  *
634  ******************************************************************************/
635
636 void
637 AcpiDmDwordDescriptor (
638     ACPI_OP_WALK_INFO       *Info,
639     AML_RESOURCE            *Resource,
640     UINT32                  Length,
641     UINT32                  Level)
642 {
643
644     /* Dump resource name and flags */
645
646     AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS32, Level);
647
648     /* Dump the 5 contiguous DWORD values */
649
650     AcpiDmAddressFields (&Resource->Address32.Granularity, 32, Level);
651
652     /* The ResourceSource fields are optional */
653
654     AcpiDmIndent (Level + 1);
655     AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS32), Length);
656
657     /* Insert a descriptor name */
658
659     AcpiDmDescriptorName ();
660
661     /* Type-specific flags */
662
663     AcpiDmAddressFlags (Resource);
664     AcpiOsPrintf (")\n");
665 }
666
667
668 /*******************************************************************************
669  *
670  * FUNCTION:    AcpiDmQwordDescriptor
671  *
672  * PARAMETERS:  Info                - Extra resource info
673  *              Resource            - Pointer to the resource descriptor
674  *              Length              - Length of the descriptor in bytes
675  *              Level               - Current source code indentation level
676  *
677  * RETURN:      None
678  *
679  * DESCRIPTION: Decode a QWord Address Space descriptor
680  *
681  ******************************************************************************/
682
683 void
684 AcpiDmQwordDescriptor (
685     ACPI_OP_WALK_INFO       *Info,
686     AML_RESOURCE            *Resource,
687     UINT32                  Length,
688     UINT32                  Level)
689 {
690
691     /* Dump resource name and flags */
692
693     AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS64, Level);
694
695     /* Dump the 5 contiguous QWORD values */
696
697     AcpiDmAddressFields (&Resource->Address64.Granularity, 64, Level);
698
699     /* The ResourceSource fields are optional */
700
701     AcpiDmIndent (Level + 1);
702     AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS64), Length);
703
704     /* Insert a descriptor name */
705
706     AcpiDmDescriptorName ();
707
708     /* Type-specific flags */
709
710     AcpiDmAddressFlags (Resource);
711     AcpiOsPrintf (")\n");
712 }
713
714
715 /*******************************************************************************
716  *
717  * FUNCTION:    AcpiDmExtendedDescriptor
718  *
719  * PARAMETERS:  Info                - Extra resource info
720  *              Resource            - Pointer to the resource descriptor
721  *              Length              - Length of the descriptor in bytes
722  *              Level               - Current source code indentation level
723  *
724  * RETURN:      None
725  *
726  * DESCRIPTION: Decode a Extended Address Space descriptor
727  *
728  ******************************************************************************/
729
730 void
731 AcpiDmExtendedDescriptor (
732     ACPI_OP_WALK_INFO       *Info,
733     AML_RESOURCE            *Resource,
734     UINT32                  Length,
735     UINT32                  Level)
736 {
737
738     /* Dump resource name and flags */
739
740     AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, Level);
741
742     /* Dump the 5 contiguous QWORD values */
743
744     AcpiDmAddressFields (&Resource->ExtAddress64.Granularity, 64, Level);
745
746     /* Extra field for this descriptor only */
747
748     AcpiDmIndent (Level + 1);
749     AcpiDmDumpInteger64 (Resource->ExtAddress64.TypeSpecific,
750         "Type-Specific Attributes");
751
752     /* Insert a descriptor name */
753
754     AcpiDmIndent (Level + 1);
755     AcpiDmDescriptorName ();
756
757     /* Type-specific flags */
758
759     AcpiDmAddressFlags (Resource);
760     AcpiOsPrintf (")\n");
761 }
762
763
764 /*******************************************************************************
765  *
766  * FUNCTION:    AcpiDmMemory24Descriptor
767  *
768  * PARAMETERS:  Info                - Extra resource info
769  *              Resource            - Pointer to the resource descriptor
770  *              Length              - Length of the descriptor in bytes
771  *              Level               - Current source code indentation level
772  *
773  * RETURN:      None
774  *
775  * DESCRIPTION: Decode a Memory24 descriptor
776  *
777  ******************************************************************************/
778
779 void
780 AcpiDmMemory24Descriptor (
781     ACPI_OP_WALK_INFO       *Info,
782     AML_RESOURCE            *Resource,
783     UINT32                  Length,
784     UINT32                  Level)
785 {
786
787     /* Dump name and read/write flag */
788
789     AcpiDmIndent (Level);
790     AcpiOsPrintf ("Memory24 (%s,\n",
791         AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->Memory24.Flags)]);
792
793     /* Dump the 4 contiguous WORD values */
794
795     AcpiDmMemoryFields (&Resource->Memory24.Minimum, 16, Level);
796
797     /* Insert a descriptor name */
798
799     AcpiDmIndent (Level + 1);
800     AcpiDmDescriptorName ();
801     AcpiOsPrintf (")\n");
802 }
803
804
805 /*******************************************************************************
806  *
807  * FUNCTION:    AcpiDmMemory32Descriptor
808  *
809  * PARAMETERS:  Info                - Extra resource info
810  *              Resource            - Pointer to the resource descriptor
811  *              Length              - Length of the descriptor in bytes
812  *              Level               - Current source code indentation level
813  *
814  * RETURN:      None
815  *
816  * DESCRIPTION: Decode a Memory32 descriptor
817  *
818  ******************************************************************************/
819
820 void
821 AcpiDmMemory32Descriptor (
822     ACPI_OP_WALK_INFO       *Info,
823     AML_RESOURCE            *Resource,
824     UINT32                  Length,
825     UINT32                  Level)
826 {
827
828     /* Dump name and read/write flag */
829
830     AcpiDmIndent (Level);
831     AcpiOsPrintf ("Memory32 (%s,\n",
832         AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->Memory32.Flags)]);
833
834     /* Dump the 4 contiguous DWORD values */
835
836     AcpiDmMemoryFields (&Resource->Memory32.Minimum, 32, Level);
837
838     /* Insert a descriptor name */
839
840     AcpiDmIndent (Level + 1);
841     AcpiDmDescriptorName ();
842     AcpiOsPrintf (")\n");
843 }
844
845
846 /*******************************************************************************
847  *
848  * FUNCTION:    AcpiDmFixedMemory32Descriptor
849  *
850  * PARAMETERS:  Info                - Extra resource info
851  *              Resource            - Pointer to the resource descriptor
852  *              Length              - Length of the descriptor in bytes
853  *              Level               - Current source code indentation level
854  *
855  * RETURN:      None
856  *
857  * DESCRIPTION: Decode a Fixed Memory32 descriptor
858  *
859  ******************************************************************************/
860
861 void
862 AcpiDmFixedMemory32Descriptor (
863     ACPI_OP_WALK_INFO       *Info,
864     AML_RESOURCE            *Resource,
865     UINT32                  Length,
866     UINT32                  Level)
867 {
868
869     /* Dump name and read/write flag */
870
871     AcpiDmIndent (Level);
872     AcpiOsPrintf ("Memory32Fixed (%s,\n",
873         AcpiGbl_RwDecode [ACPI_GET_1BIT_FLAG (Resource->FixedMemory32.Flags)]);
874
875     AcpiDmIndent (Level + 1);
876     AcpiDmDumpInteger32 (Resource->FixedMemory32.Address, "Address Base");
877
878     AcpiDmIndent (Level + 1);
879     AcpiDmDumpInteger32 (Resource->FixedMemory32.AddressLength, "Address Length");
880
881     /* Insert a descriptor name */
882
883     AcpiDmIndent (Level + 1);
884     AcpiDmDescriptorName ();
885     AcpiOsPrintf (")\n");
886 }
887
888
889 /*******************************************************************************
890  *
891  * FUNCTION:    AcpiDmGenericRegisterDescriptor
892  *
893  * PARAMETERS:  Info                - Extra resource info
894  *              Resource            - Pointer to the resource descriptor
895  *              Length              - Length of the descriptor in bytes
896  *              Level               - Current source code indentation level
897  *
898  * RETURN:      None
899  *
900  * DESCRIPTION: Decode a Generic Register descriptor
901  *
902  ******************************************************************************/
903
904 void
905 AcpiDmGenericRegisterDescriptor (
906     ACPI_OP_WALK_INFO       *Info,
907     AML_RESOURCE            *Resource,
908     UINT32                  Length,
909     UINT32                  Level)
910 {
911
912     AcpiDmIndent (Level);
913     AcpiOsPrintf ("Register (");
914     AcpiDmAddressSpace (Resource->GenericReg.AddressSpaceId);
915     AcpiOsPrintf ("\n");
916
917     AcpiDmIndent (Level + 1);
918     AcpiDmDumpInteger8 (Resource->GenericReg.BitWidth, "Bit Width");
919
920     AcpiDmIndent (Level + 1);
921     AcpiDmDumpInteger8 (Resource->GenericReg.BitOffset, "Bit Offset");
922
923     AcpiDmIndent (Level + 1);
924     AcpiDmDumpInteger64 (Resource->GenericReg.Address, "Address");
925
926     /* Optional field for ACPI 3.0 */
927
928     AcpiDmIndent (Level + 1);
929     if (Resource->GenericReg.AccessSize)
930     {
931         AcpiOsPrintf ("0x%2.2X,               // %s\n",
932             Resource->GenericReg.AccessSize, "Access Size");
933         AcpiDmIndent (Level + 1);
934     }
935     else
936     {
937         AcpiOsPrintf (",");
938     }
939
940     /* DescriptorName was added for ACPI 3.0+ */
941
942     AcpiDmDescriptorName ();
943     AcpiOsPrintf (")\n");
944 }
945
946
947 /*******************************************************************************
948  *
949  * FUNCTION:    AcpiDmInterruptDescriptor
950  *
951  * PARAMETERS:  Info                - Extra resource info
952  *              Resource            - Pointer to the resource descriptor
953  *              Length              - Length of the descriptor in bytes
954  *              Level               - Current source code indentation level
955  *
956  * RETURN:      None
957  *
958  * DESCRIPTION: Decode a extended Interrupt descriptor
959  *
960  ******************************************************************************/
961
962 void
963 AcpiDmInterruptDescriptor (
964     ACPI_OP_WALK_INFO       *Info,
965     AML_RESOURCE            *Resource,
966     UINT32                  Length,
967     UINT32                  Level)
968 {
969     UINT32                  i;
970
971
972     AcpiDmIndent (Level);
973     AcpiOsPrintf ("Interrupt (%s, %s, %s, %s, ",
974         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->ExtendedIrq.Flags)],
975         AcpiGbl_HeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->ExtendedIrq.Flags, 1)],
976         AcpiGbl_LlDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->ExtendedIrq.Flags, 2)],
977         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->ExtendedIrq.Flags, 3)]);
978
979     /*
980      * The ResourceSource fields are optional and appear after the interrupt
981      * list. Must compute length based on length of the list. First xrupt
982      * is included in the struct (reason for -1 below)
983      */
984     AcpiDmResourceSource (Resource,
985         sizeof (AML_RESOURCE_EXTENDED_IRQ) +
986             ((UINT32) Resource->ExtendedIrq.InterruptCount - 1) * sizeof (UINT32),
987         Resource->ExtendedIrq.ResourceLength);
988
989     /* Insert a descriptor name */
990
991     AcpiDmDescriptorName ();
992     AcpiOsPrintf (")\n");
993
994     /* Dump the interrupt list */
995
996     AcpiDmIndent (Level);
997     AcpiOsPrintf ("{\n");
998     for (i = 0; i < Resource->ExtendedIrq.InterruptCount; i++)
999     {
1000         AcpiDmIndent (Level + 1);
1001         AcpiOsPrintf ("0x%8.8X,\n",
1002             (UINT32) Resource->ExtendedIrq.Interrupts[i]);
1003     }
1004
1005     AcpiDmIndent (Level);
1006     AcpiOsPrintf ("}\n");
1007 }
1008
1009
1010 /*******************************************************************************
1011  *
1012  * FUNCTION:    AcpiDmVendorCommon
1013  *
1014  * PARAMETERS:  Name                - Descriptor name suffix
1015  *              ByteData            - Pointer to the vendor byte data
1016  *              Length              - Length of the byte data
1017  *              Level               - Current source code indentation level
1018  *
1019  * RETURN:      None
1020  *
1021  * DESCRIPTION: Decode a Vendor descriptor, both Large and Small
1022  *
1023  ******************************************************************************/
1024
1025 void
1026 AcpiDmVendorCommon (
1027     char                    *Name,
1028     UINT8                   *ByteData,
1029     UINT32                  Length,
1030     UINT32                  Level)
1031 {
1032
1033     /* Dump macro name */
1034
1035     AcpiDmIndent (Level);
1036     AcpiOsPrintf ("Vendor%s (", Name);
1037
1038     /* Insert a descriptor name */
1039
1040     AcpiDmDescriptorName ();
1041     AcpiOsPrintf (")      // Length = 0x%.2X\n", Length);
1042
1043     /* Dump the vendor bytes */
1044
1045     AcpiDmIndent (Level);
1046     AcpiOsPrintf ("{\n");
1047
1048     AcpiDmDisasmByteList (Level + 1, ByteData, Length);
1049
1050     AcpiDmIndent (Level);
1051     AcpiOsPrintf ("}\n");
1052 }
1053
1054
1055 /*******************************************************************************
1056  *
1057  * FUNCTION:    AcpiDmVendorLargeDescriptor
1058  *
1059  * PARAMETERS:  Info                - Extra resource info
1060  *              Resource            - Pointer to the resource descriptor
1061  *              Length              - Length of the descriptor in bytes
1062  *              Level               - Current source code indentation level
1063  *
1064  * RETURN:      None
1065  *
1066  * DESCRIPTION: Decode a Vendor Large descriptor
1067  *
1068  ******************************************************************************/
1069
1070 void
1071 AcpiDmVendorLargeDescriptor (
1072     ACPI_OP_WALK_INFO       *Info,
1073     AML_RESOURCE            *Resource,
1074     UINT32                  Length,
1075     UINT32                  Level)
1076 {
1077
1078     AcpiDmVendorCommon ("Long ",
1079         ACPI_ADD_PTR (UINT8, Resource, sizeof (AML_RESOURCE_LARGE_HEADER)),
1080         Length, Level);
1081 }
1082
1083 #endif