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