xref: /titanic_50/usr/src/uts/intel/io/acpica/resources/rsdump.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1 /*******************************************************************************
2  *
3  * Module Name: rsdump - AML debugger support for resource structures.
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2016, 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 "acresrc.h"
47 
48 #define _COMPONENT          ACPI_RESOURCES
49         ACPI_MODULE_NAME    ("rsdump")
50 
51 /*
52  * All functions in this module are used by the AML Debugger only
53  */
54 
55 /* Local prototypes */
56 
57 static void
58 AcpiRsOutString (
59     const char              *Title,
60     const char              *Value);
61 
62 static void
63 AcpiRsOutInteger8 (
64     const char              *Title,
65     UINT8                   Value);
66 
67 static void
68 AcpiRsOutInteger16 (
69     const char              *Title,
70     UINT16                  Value);
71 
72 static void
73 AcpiRsOutInteger32 (
74     const char              *Title,
75     UINT32                  Value);
76 
77 static void
78 AcpiRsOutInteger64 (
79     const char              *Title,
80     UINT64                  Value);
81 
82 static void
83 AcpiRsOutTitle (
84     const char              *Title);
85 
86 static void
87 AcpiRsDumpByteList (
88     UINT16                  Length,
89     UINT8                   *Data);
90 
91 static void
92 AcpiRsDumpWordList (
93     UINT16                  Length,
94     UINT16                  *Data);
95 
96 static void
97 AcpiRsDumpDwordList (
98     UINT8                   Length,
99     UINT32                  *Data);
100 
101 static void
102 AcpiRsDumpShortByteList (
103     UINT8                   Length,
104     UINT8                   *Data);
105 
106 static void
107 AcpiRsDumpResourceSource (
108     ACPI_RESOURCE_SOURCE    *ResourceSource);
109 
110 static void
111 AcpiRsDumpAddressCommon (
112     ACPI_RESOURCE_DATA      *Resource);
113 
114 static void
115 AcpiRsDumpDescriptor (
116     void                    *Resource,
117     ACPI_RSDUMP_INFO        *Table);
118 
119 
120 /*******************************************************************************
121  *
122  * FUNCTION:    AcpiRsDumpResourceList
123  *
124  * PARAMETERS:  ResourceList        - Pointer to a resource descriptor list
125  *
126  * RETURN:      None
127  *
128  * DESCRIPTION: Dispatches the structure to the correct dump routine.
129  *
130  ******************************************************************************/
131 
132 void
AcpiRsDumpResourceList(ACPI_RESOURCE * ResourceList)133 AcpiRsDumpResourceList (
134     ACPI_RESOURCE           *ResourceList)
135 {
136     UINT32                  Count = 0;
137     UINT32                  Type;
138 
139 
140     ACPI_FUNCTION_ENTRY ();
141 
142 
143     /* Check if debug output enabled */
144 
145     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
146     {
147         return;
148     }
149 
150     /* Walk list and dump all resource descriptors (END_TAG terminates) */
151 
152     do
153     {
154         AcpiOsPrintf ("\n[%02X] ", Count);
155         Count++;
156 
157         /* Validate Type before dispatch */
158 
159         Type = ResourceList->Type;
160         if (Type > ACPI_RESOURCE_TYPE_MAX)
161         {
162             AcpiOsPrintf (
163                 "Invalid descriptor type (%X) in resource list\n",
164                 ResourceList->Type);
165             return;
166         }
167 
168         /* Sanity check the length. It must not be zero, or we loop forever */
169 
170         if (!ResourceList->Length)
171         {
172             AcpiOsPrintf (
173                 "Invalid zero length descriptor in resource list\n");
174             return;
175         }
176 
177         /* Dump the resource descriptor */
178 
179         if (Type == ACPI_RESOURCE_TYPE_SERIAL_BUS)
180         {
181             AcpiRsDumpDescriptor (&ResourceList->Data,
182                 AcpiGbl_DumpSerialBusDispatch[
183                     ResourceList->Data.CommonSerialBus.Type]);
184         }
185         else
186         {
187             AcpiRsDumpDescriptor (&ResourceList->Data,
188                 AcpiGbl_DumpResourceDispatch[Type]);
189         }
190 
191         /* Point to the next resource structure */
192 
193         ResourceList = ACPI_NEXT_RESOURCE (ResourceList);
194 
195         /* Exit when END_TAG descriptor is reached */
196 
197     } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
198 }
199 
200 
201 /*******************************************************************************
202  *
203  * FUNCTION:    AcpiRsDumpIrqList
204  *
205  * PARAMETERS:  RouteTable      - Pointer to the routing table to dump.
206  *
207  * RETURN:      None
208  *
209  * DESCRIPTION: Print IRQ routing table
210  *
211  ******************************************************************************/
212 
213 void
AcpiRsDumpIrqList(UINT8 * RouteTable)214 AcpiRsDumpIrqList (
215     UINT8                   *RouteTable)
216 {
217     ACPI_PCI_ROUTING_TABLE  *PrtElement;
218     UINT8                   Count;
219 
220 
221     ACPI_FUNCTION_ENTRY ();
222 
223 
224     /* Check if debug output enabled */
225 
226     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
227     {
228         return;
229     }
230 
231     PrtElement = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, RouteTable);
232 
233     /* Dump all table elements, Exit on zero length element */
234 
235     for (Count = 0; PrtElement->Length; Count++)
236     {
237         AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
238         AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
239 
240         PrtElement = ACPI_ADD_PTR (ACPI_PCI_ROUTING_TABLE,
241             PrtElement, PrtElement->Length);
242     }
243 }
244 
245 
246 /*******************************************************************************
247  *
248  * FUNCTION:    AcpiRsDumpDescriptor
249  *
250  * PARAMETERS:  Resource            - Buffer containing the resource
251  *              Table               - Table entry to decode the resource
252  *
253  * RETURN:      None
254  *
255  * DESCRIPTION: Dump a resource descriptor based on a dump table entry.
256  *
257  ******************************************************************************/
258 
259 static void
AcpiRsDumpDescriptor(void * Resource,ACPI_RSDUMP_INFO * Table)260 AcpiRsDumpDescriptor (
261     void                    *Resource,
262     ACPI_RSDUMP_INFO        *Table)
263 {
264     UINT8                   *Target = NULL;
265     UINT8                   *PreviousTarget;
266     const char              *Name;
267     UINT8                   Count;
268 
269 
270     /* First table entry must contain the table length (# of table entries) */
271 
272     Count = Table->Offset;
273 
274     while (Count)
275     {
276         PreviousTarget = Target;
277         Target = ACPI_ADD_PTR (UINT8, Resource, Table->Offset);
278         Name = Table->Name;
279 
280         switch (Table->Opcode)
281         {
282         case ACPI_RSD_TITLE:
283             /*
284              * Optional resource title
285              */
286             if (Table->Name)
287             {
288                 AcpiOsPrintf ("%s Resource\n", Name);
289             }
290             break;
291 
292         /* Strings */
293 
294         case ACPI_RSD_LITERAL:
295 
296             AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer));
297             break;
298 
299         case ACPI_RSD_STRING:
300 
301             AcpiRsOutString (Name, ACPI_CAST_PTR (char, Target));
302             break;
303 
304         /* Data items, 8/16/32/64 bit */
305 
306         case ACPI_RSD_UINT8:
307 
308             if (Table->Pointer)
309             {
310                 AcpiRsOutString (Name, Table->Pointer [*Target]);
311             }
312             else
313             {
314                 AcpiRsOutInteger8 (Name, ACPI_GET8 (Target));
315             }
316             break;
317 
318         case ACPI_RSD_UINT16:
319 
320             AcpiRsOutInteger16 (Name, ACPI_GET16 (Target));
321             break;
322 
323         case ACPI_RSD_UINT32:
324 
325             AcpiRsOutInteger32 (Name, ACPI_GET32 (Target));
326             break;
327 
328         case ACPI_RSD_UINT64:
329 
330             AcpiRsOutInteger64 (Name, ACPI_GET64 (Target));
331             break;
332 
333         /* Flags: 1-bit and 2-bit flags supported */
334 
335         case ACPI_RSD_1BITFLAG:
336 
337             AcpiRsOutString (Name, Table->Pointer [*Target & 0x01]);
338             break;
339 
340         case ACPI_RSD_2BITFLAG:
341 
342             AcpiRsOutString (Name, Table->Pointer [*Target & 0x03]);
343             break;
344 
345         case ACPI_RSD_3BITFLAG:
346 
347             AcpiRsOutString (Name, Table->Pointer [*Target & 0x07]);
348             break;
349 
350         case ACPI_RSD_SHORTLIST:
351             /*
352              * Short byte list (single line output) for DMA and IRQ resources
353              * Note: The list length is obtained from the previous table entry
354              */
355             if (PreviousTarget)
356             {
357                 AcpiRsOutTitle (Name);
358                 AcpiRsDumpShortByteList (*PreviousTarget, Target);
359             }
360             break;
361 
362         case ACPI_RSD_SHORTLISTX:
363             /*
364              * Short byte list (single line output) for GPIO vendor data
365              * Note: The list length is obtained from the previous table entry
366              */
367             if (PreviousTarget)
368             {
369                 AcpiRsOutTitle (Name);
370                 AcpiRsDumpShortByteList (*PreviousTarget,
371                     *(ACPI_CAST_INDIRECT_PTR (UINT8, Target)));
372             }
373             break;
374 
375         case ACPI_RSD_LONGLIST:
376             /*
377              * Long byte list for Vendor resource data
378              * Note: The list length is obtained from the previous table entry
379              */
380             if (PreviousTarget)
381             {
382                 AcpiRsDumpByteList (ACPI_GET16 (PreviousTarget), Target);
383             }
384             break;
385 
386         case ACPI_RSD_DWORDLIST:
387             /*
388              * Dword list for Extended Interrupt resources
389              * Note: The list length is obtained from the previous table entry
390              */
391             if (PreviousTarget)
392             {
393                 AcpiRsDumpDwordList (*PreviousTarget,
394                     ACPI_CAST_PTR (UINT32, Target));
395             }
396             break;
397 
398         case ACPI_RSD_WORDLIST:
399             /*
400              * Word list for GPIO Pin Table
401              * Note: The list length is obtained from the previous table entry
402              */
403             if (PreviousTarget)
404             {
405                 AcpiRsDumpWordList (*PreviousTarget,
406                     *(ACPI_CAST_INDIRECT_PTR (UINT16, Target)));
407             }
408             break;
409 
410         case ACPI_RSD_ADDRESS:
411             /*
412              * Common flags for all Address resources
413              */
414             AcpiRsDumpAddressCommon (ACPI_CAST_PTR (
415                 ACPI_RESOURCE_DATA, Target));
416             break;
417 
418         case ACPI_RSD_SOURCE:
419             /*
420              * Optional ResourceSource for Address resources
421              */
422             AcpiRsDumpResourceSource (ACPI_CAST_PTR (
423                 ACPI_RESOURCE_SOURCE, Target));
424             break;
425 
426         default:
427 
428             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
429                 Table->Opcode);
430             return;
431         }
432 
433         Table++;
434         Count--;
435     }
436 }
437 
438 
439 /*******************************************************************************
440  *
441  * FUNCTION:    AcpiRsDumpResourceSource
442  *
443  * PARAMETERS:  ResourceSource      - Pointer to a Resource Source struct
444  *
445  * RETURN:      None
446  *
447  * DESCRIPTION: Common routine for dumping the optional ResourceSource and the
448  *              corresponding ResourceSourceIndex.
449  *
450  ******************************************************************************/
451 
452 static void
AcpiRsDumpResourceSource(ACPI_RESOURCE_SOURCE * ResourceSource)453 AcpiRsDumpResourceSource (
454     ACPI_RESOURCE_SOURCE    *ResourceSource)
455 {
456     ACPI_FUNCTION_ENTRY ();
457 
458 
459     if (ResourceSource->Index == 0xFF)
460     {
461         return;
462     }
463 
464     AcpiRsOutInteger8 ("Resource Source Index",
465         ResourceSource->Index);
466 
467     AcpiRsOutString ("Resource Source",
468         ResourceSource->StringPtr ?
469             ResourceSource->StringPtr : "[Not Specified]");
470 }
471 
472 
473 /*******************************************************************************
474  *
475  * FUNCTION:    AcpiRsDumpAddressCommon
476  *
477  * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
478  *
479  * RETURN:      None
480  *
481  * DESCRIPTION: Dump the fields that are common to all Address resource
482  *              descriptors
483  *
484  ******************************************************************************/
485 
486 static void
AcpiRsDumpAddressCommon(ACPI_RESOURCE_DATA * Resource)487 AcpiRsDumpAddressCommon (
488     ACPI_RESOURCE_DATA      *Resource)
489 {
490     ACPI_FUNCTION_ENTRY ();
491 
492 
493    /* Decode the type-specific flags */
494 
495     switch (Resource->Address.ResourceType)
496     {
497     case ACPI_MEMORY_RANGE:
498 
499         AcpiRsDumpDescriptor (Resource, AcpiRsDumpMemoryFlags);
500         break;
501 
502     case ACPI_IO_RANGE:
503 
504         AcpiRsDumpDescriptor (Resource, AcpiRsDumpIoFlags);
505         break;
506 
507     case ACPI_BUS_NUMBER_RANGE:
508 
509         AcpiRsOutString ("Resource Type", "Bus Number Range");
510         break;
511 
512     default:
513 
514         AcpiRsOutInteger8 ("Resource Type",
515             (UINT8) Resource->Address.ResourceType);
516         break;
517     }
518 
519     /* Decode the general flags */
520 
521     AcpiRsDumpDescriptor (Resource, AcpiRsDumpGeneralFlags);
522 }
523 
524 
525 /*******************************************************************************
526  *
527  * FUNCTION:    AcpiRsOut*
528  *
529  * PARAMETERS:  Title       - Name of the resource field
530  *              Value       - Value of the resource field
531  *
532  * RETURN:      None
533  *
534  * DESCRIPTION: Miscellaneous helper functions to consistently format the
535  *              output of the resource dump routines
536  *
537  ******************************************************************************/
538 
539 static void
AcpiRsOutString(const char * Title,const char * Value)540 AcpiRsOutString (
541     const char              *Title,
542     const char              *Value)
543 {
544 
545     AcpiOsPrintf ("%27s : %s", Title, Value);
546     if (!*Value)
547     {
548         AcpiOsPrintf ("[NULL NAMESTRING]");
549     }
550     AcpiOsPrintf ("\n");
551 }
552 
553 static void
AcpiRsOutInteger8(const char * Title,UINT8 Value)554 AcpiRsOutInteger8 (
555     const char              *Title,
556     UINT8                   Value)
557 {
558     AcpiOsPrintf ("%27s : %2.2X\n", Title, Value);
559 }
560 
561 static void
AcpiRsOutInteger16(const char * Title,UINT16 Value)562 AcpiRsOutInteger16 (
563     const char              *Title,
564     UINT16                  Value)
565 {
566 
567     AcpiOsPrintf ("%27s : %4.4X\n", Title, Value);
568 }
569 
570 static void
AcpiRsOutInteger32(const char * Title,UINT32 Value)571 AcpiRsOutInteger32 (
572     const char              *Title,
573     UINT32                  Value)
574 {
575 
576     AcpiOsPrintf ("%27s : %8.8X\n", Title, Value);
577 }
578 
579 static void
AcpiRsOutInteger64(const char * Title,UINT64 Value)580 AcpiRsOutInteger64 (
581     const char              *Title,
582     UINT64                  Value)
583 {
584 
585     AcpiOsPrintf ("%27s : %8.8X%8.8X\n", Title,
586         ACPI_FORMAT_UINT64 (Value));
587 }
588 
589 static void
AcpiRsOutTitle(const char * Title)590 AcpiRsOutTitle (
591     const char              *Title)
592 {
593 
594     AcpiOsPrintf ("%27s : ", Title);
595 }
596 
597 
598 /*******************************************************************************
599  *
600  * FUNCTION:    AcpiRsDump*List
601  *
602  * PARAMETERS:  Length      - Number of elements in the list
603  *              Data        - Start of the list
604  *
605  * RETURN:      None
606  *
607  * DESCRIPTION: Miscellaneous functions to dump lists of raw data
608  *
609  ******************************************************************************/
610 
611 static void
AcpiRsDumpByteList(UINT16 Length,UINT8 * Data)612 AcpiRsDumpByteList (
613     UINT16                  Length,
614     UINT8                   *Data)
615 {
616     UINT8                   i;
617 
618 
619     for (i = 0; i < Length; i++)
620     {
621         AcpiOsPrintf ("%25s%2.2X : %2.2X\n", "Byte", i, Data[i]);
622     }
623 }
624 
625 static void
AcpiRsDumpShortByteList(UINT8 Length,UINT8 * Data)626 AcpiRsDumpShortByteList (
627     UINT8                   Length,
628     UINT8                   *Data)
629 {
630     UINT8                   i;
631 
632 
633     for (i = 0; i < Length; i++)
634     {
635         AcpiOsPrintf ("%X ", Data[i]);
636     }
637 
638     AcpiOsPrintf ("\n");
639 }
640 
641 static void
AcpiRsDumpDwordList(UINT8 Length,UINT32 * Data)642 AcpiRsDumpDwordList (
643     UINT8                   Length,
644     UINT32                  *Data)
645 {
646     UINT8                   i;
647 
648 
649     for (i = 0; i < Length; i++)
650     {
651         AcpiOsPrintf ("%25s%2.2X : %8.8X\n", "Dword", i, Data[i]);
652     }
653 }
654 
655 static void
AcpiRsDumpWordList(UINT16 Length,UINT16 * Data)656 AcpiRsDumpWordList (
657     UINT16                  Length,
658     UINT16                  *Data)
659 {
660     UINT16                  i;
661 
662 
663     for (i = 0; i < Length; i++)
664     {
665         AcpiOsPrintf ("%25s%2.2X : %4.4X\n", "Word", i, Data[i]);
666     }
667 }
668