1 /*******************************************************************************
2  *
3  * Module Name: dmresrcl2.c - "Large" Resource Descriptor disassembly (#2)
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2022, 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 MERCHANTABILITY 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 #ifdef _KERNEL
49 #define MpSaveGpioInfo(a, b, c, d, e)
50 #define MpSaveSerialInfo(a, b, c)
51 #endif
52 
53 #define _COMPONENT          ACPI_CA_DEBUGGER
54         ACPI_MODULE_NAME    ("dbresrcl2")
55 
56 /* Local prototypes */
57 
58 static void
59 AcpiDmCsi2SerialBusDescriptor (
60     ACPI_OP_WALK_INFO       *Info,
61     AML_RESOURCE            *Resource,
62     UINT32                  Length,
63     UINT32                  Level);
64 
65 static void
66 AcpiDmI2cSerialBusDescriptor (
67     ACPI_OP_WALK_INFO       *Info,
68     AML_RESOURCE            *Resource,
69     UINT32                  Length,
70     UINT32                  Level);
71 
72 static void
73 AcpiDmSpiSerialBusDescriptor (
74     ACPI_OP_WALK_INFO       *Info,
75     AML_RESOURCE            *Resource,
76     UINT32                  Length,
77     UINT32                  Level);
78 
79 static void
80 AcpiDmUartSerialBusDescriptor (
81     ACPI_OP_WALK_INFO       *Info,
82     AML_RESOURCE            *Resource,
83     UINT32                  Length,
84     UINT32                  Level);
85 
86 static void
87 AcpiDmGpioCommon (
88     ACPI_OP_WALK_INFO       *Info,
89     AML_RESOURCE            *Resource,
90     UINT32                  Level);
91 
92 static void
93 AcpiDmDumpRawDataBuffer (
94     UINT8                   *Buffer,
95     UINT32                  Length,
96     UINT32                  Level);
97 
98 
99 /* Dispatch table for the serial bus descriptors */
100 
101 static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
102 {
103     NULL,
104     AcpiDmI2cSerialBusDescriptor,
105     AcpiDmSpiSerialBusDescriptor,
106     AcpiDmUartSerialBusDescriptor,
107     AcpiDmCsi2SerialBusDescriptor
108 };
109 
110 
111 /*******************************************************************************
112  *
113  * FUNCTION:    AcpiDmDumpRawDataBuffer
114  *
115  * PARAMETERS:  Buffer              - Pointer to the data bytes
116  *              Length              - Length of the descriptor in bytes
117  *              Level               - Current source code indentation level
118  *
119  * RETURN:      None
120  *
121  * DESCRIPTION: Dump a data buffer as a RawDataBuffer() object. Used for
122  *              vendor data bytes.
123  *
124  ******************************************************************************/
125 
126 static void
AcpiDmDumpRawDataBuffer(UINT8 * Buffer,UINT32 Length,UINT32 Level)127 AcpiDmDumpRawDataBuffer (
128     UINT8                   *Buffer,
129     UINT32                  Length,
130     UINT32                  Level)
131 {
132     UINT32                  Index;
133     UINT32                  i;
134     UINT32                  j;
135 
136 
137     if (!Length)
138     {
139         return;
140     }
141 
142     AcpiOsPrintf ("RawDataBuffer (0x%.2X)  // Vendor Data", Length);
143 
144     AcpiOsPrintf ("\n");
145     AcpiDmIndent (Level + 1);
146     AcpiOsPrintf ("{\n");
147     AcpiDmIndent (Level + 2);
148 
149     for (i = 0; i < Length;)
150     {
151         for (j = 0; j < 8; j++)
152         {
153             Index = i + j;
154             if (Index >= Length)
155             {
156                 goto Finish;
157             }
158 
159             AcpiOsPrintf ("0x%2.2X", Buffer[Index]);
160             if ((Index + 1) >= Length)
161             {
162                 goto Finish;
163             }
164 
165             AcpiOsPrintf (", ");
166         }
167 
168         AcpiOsPrintf ("\n");
169         AcpiDmIndent (Level + 2);
170 
171         i += 8;
172     }
173 
174 Finish:
175     AcpiOsPrintf ("\n");
176     AcpiDmIndent (Level + 1);
177     AcpiOsPrintf ("}");
178 }
179 
180 
181 /*******************************************************************************
182  *
183  * FUNCTION:    AcpiDmGpioCommon
184  *
185  * PARAMETERS:  Info                - Extra resource info
186  *              Resource            - Pointer to the resource descriptor
187  *              Level               - Current source code indentation level
188  *
189  * RETURN:      None
190  *
191  * DESCRIPTION: Decode common parts of a GPIO Interrupt descriptor
192  *
193  ******************************************************************************/
194 
195 static void
AcpiDmGpioCommon(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Level)196 AcpiDmGpioCommon (
197     ACPI_OP_WALK_INFO       *Info,
198     AML_RESOURCE            *Resource,
199     UINT32                  Level)
200 {
201     UINT16                  *PinList;
202     UINT8                   *VendorData;
203     char                    *DeviceName = NULL;
204     UINT32                  PinCount;
205     UINT32                  i;
206 
207 
208     /* ResourceSource, ResourceSourceIndex, ResourceType */
209 
210     AcpiDmIndent (Level + 1);
211     if (Resource->Gpio.ResSourceOffset)
212     {
213         DeviceName = ACPI_ADD_PTR (char,
214             Resource, Resource->Gpio.ResSourceOffset);
215         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
216     }
217 
218     AcpiOsPrintf (", ");
219     AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex);
220     AcpiOsPrintf ("%s, ",
221         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.Flags)]);
222 
223     /* Insert a descriptor name */
224 
225     AcpiDmDescriptorName ();
226     AcpiOsPrintf (",");
227 
228     /* Dump the vendor data */
229 
230     if (Resource->Gpio.VendorOffset)
231     {
232         AcpiOsPrintf ("\n");
233         AcpiDmIndent (Level + 1);
234         VendorData = ACPI_ADD_PTR (UINT8, Resource,
235             Resource->Gpio.VendorOffset);
236 
237         AcpiDmDumpRawDataBuffer (VendorData,
238             Resource->Gpio.VendorLength, Level);
239     }
240 
241     AcpiOsPrintf (")\n");
242 
243     /* Dump the interrupt list */
244 
245     AcpiDmIndent (Level + 1);
246     AcpiOsPrintf ("{   // Pin list\n");
247 
248     PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset -
249         Resource->Gpio.PinTableOffset)) /
250         sizeof (UINT16);
251 
252     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
253         Resource->Gpio.PinTableOffset);
254 
255     for (i = 0; i < PinCount; i++)
256     {
257         AcpiDmIndent (Level + 2);
258         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
259             ((i + 1) < PinCount) ? "," : "");
260     }
261 
262     AcpiDmIndent (Level + 1);
263     AcpiOsPrintf ("}\n");
264 
265     MpSaveGpioInfo (Info->MappingOp, Resource,
266         PinCount, PinList, DeviceName);
267 }
268 
269 
270 /*******************************************************************************
271  *
272  * FUNCTION:    AcpiDmGpioIntDescriptor
273  *
274  * PARAMETERS:  Info                - Extra resource info
275  *              Resource            - Pointer to the resource descriptor
276  *              Length              - Length of the descriptor in bytes
277  *              Level               - Current source code indentation level
278  *
279  * RETURN:      None
280  *
281  * DESCRIPTION: Decode a GPIO Interrupt descriptor
282  *
283  ******************************************************************************/
284 
285 static void
AcpiDmGpioIntDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)286 AcpiDmGpioIntDescriptor (
287     ACPI_OP_WALK_INFO       *Info,
288     AML_RESOURCE            *Resource,
289     UINT32                  Length,
290     UINT32                  Level)
291 {
292 
293     /* Dump the GpioInt-specific portion of the descriptor */
294 
295     /* EdgeLevel, ActiveLevel, Shared */
296 
297     AcpiDmIndent (Level);
298     AcpiOsPrintf ("GpioInt (%s, %s, %s, ",
299         AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.IntFlags)],
300         AcpiGbl_LlDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 1)],
301         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
302 
303     /* PinConfig, DebounceTimeout */
304 
305     if (Resource->Gpio.PinConfig <= 3)
306     {
307         AcpiOsPrintf ("%s, ",
308             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
309     }
310     else
311     {
312         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
313     }
314     AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout);
315 
316     /* Dump the GpioInt/GpioIo common portion of the descriptor */
317 
318     AcpiDmGpioCommon (Info, Resource, Level);
319 }
320 
321 
322 /*******************************************************************************
323  *
324  * FUNCTION:    AcpiDmGpioIoDescriptor
325  *
326  * PARAMETERS:  Info                - Extra resource info
327  *              Resource            - Pointer to the resource descriptor
328  *              Length              - Length of the descriptor in bytes
329  *              Level               - Current source code indentation level
330  *
331  * RETURN:      None
332  *
333  * DESCRIPTION: Decode a GPIO I/O descriptor
334  *
335  ******************************************************************************/
336 
337 static void
AcpiDmGpioIoDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)338 AcpiDmGpioIoDescriptor (
339     ACPI_OP_WALK_INFO       *Info,
340     AML_RESOURCE            *Resource,
341     UINT32                  Length,
342     UINT32                  Level)
343 {
344 
345     /* Dump the GpioIo-specific portion of the descriptor */
346 
347     /* Shared, PinConfig */
348 
349     AcpiDmIndent (Level);
350     AcpiOsPrintf ("GpioIo (%s, ",
351         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
352 
353     if (Resource->Gpio.PinConfig <= 3)
354     {
355         AcpiOsPrintf ("%s, ",
356             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
357     }
358     else
359     {
360         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
361     }
362 
363     /* DebounceTimeout, DriveStrength, IoRestriction */
364 
365     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout);
366     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength);
367     AcpiOsPrintf ("%s,\n",
368         AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Resource->Gpio.IntFlags)]);
369 
370     /* Dump the GpioInt/GpioIo common portion of the descriptor */
371 
372     AcpiDmGpioCommon (Info, Resource, Level);
373 }
374 
375 
376 /*******************************************************************************
377  *
378  * FUNCTION:    AcpiDmGpioDescriptor
379  *
380  * PARAMETERS:  Info                - Extra resource info
381  *              Resource            - Pointer to the resource descriptor
382  *              Length              - Length of the descriptor in bytes
383  *              Level               - Current source code indentation level
384  *
385  * RETURN:      None
386  *
387  * DESCRIPTION: Decode a GpioInt/GpioIo GPIO Interrupt/IO descriptor
388  *
389  ******************************************************************************/
390 
391 void
AcpiDmGpioDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)392 AcpiDmGpioDescriptor (
393     ACPI_OP_WALK_INFO       *Info,
394     AML_RESOURCE            *Resource,
395     UINT32                  Length,
396     UINT32                  Level)
397 {
398     UINT8                   ConnectionType;
399 
400 
401     ConnectionType = Resource->Gpio.ConnectionType;
402 
403     switch (ConnectionType)
404     {
405     case AML_RESOURCE_GPIO_TYPE_INT:
406 
407         AcpiDmGpioIntDescriptor (Info, Resource, Length, Level);
408         break;
409 
410     case AML_RESOURCE_GPIO_TYPE_IO:
411 
412         AcpiDmGpioIoDescriptor (Info, Resource, Length, Level);
413         break;
414 
415     default:
416 
417         AcpiOsPrintf ("Unknown GPIO type\n");
418         break;
419     }
420 }
421 
422 /*******************************************************************************
423  *
424  * FUNCTION:    AcpiDmPinFunctionDescriptor
425  *
426  * PARAMETERS:  Info                - Extra resource info
427  *              Resource            - Pointer to the resource descriptor
428  *              Length              - Length of the descriptor in bytes
429  *              Level               - Current source code indentation level
430  *
431  * RETURN:      None
432  *
433  * DESCRIPTION: Decode a PinFunction descriptor
434  *
435  ******************************************************************************/
436 
437 void
AcpiDmPinFunctionDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)438 AcpiDmPinFunctionDescriptor (
439     ACPI_OP_WALK_INFO       *Info,
440     AML_RESOURCE            *Resource,
441     UINT32                  Length,
442     UINT32                  Level)
443 {
444     UINT16                  *PinList;
445     UINT8                   *VendorData;
446     char                    *DeviceName = NULL;
447     UINT32                  PinCount;
448     UINT32                  i;
449 
450     AcpiDmIndent (Level);
451     AcpiOsPrintf ("PinFunction (%s, ",
452         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinFunction.Flags)]);
453 
454     if (Resource->PinFunction.PinConfig <= 3)
455     {
456         AcpiOsPrintf ("%s, ",
457             AcpiGbl_PpcDecode[Resource->PinFunction.PinConfig]);
458     }
459     else
460     {
461         AcpiOsPrintf ("0x%2.2X, ", Resource->PinFunction.PinConfig);
462     }
463 
464     /* FunctionNumber */
465 
466     AcpiOsPrintf ("0x%4.4X, ", Resource->PinFunction.FunctionNumber);
467 
468     if (Resource->PinFunction.ResSourceOffset)
469     {
470         DeviceName = ACPI_ADD_PTR (char,
471             Resource, Resource->PinFunction.ResSourceOffset),
472         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
473     }
474 
475     AcpiOsPrintf (", ");
476     AcpiOsPrintf ("0x%2.2X,\n", Resource->PinFunction.ResSourceIndex);
477 
478     AcpiDmIndent (Level + 1);
479 
480     /* Always ResourceConsumer */
481     AcpiOsPrintf ("%s, ", AcpiGbl_ConsumeDecode [ACPI_CONSUMER]);
482 
483     /* Insert a descriptor name */
484 
485     AcpiDmDescriptorName ();
486 
487     AcpiOsPrintf (",");
488 
489     /* Dump the vendor data */
490 
491     if (Resource->PinFunction.VendorLength)
492     {
493         AcpiOsPrintf ("\n");
494         AcpiDmIndent (Level + 1);
495         VendorData = ACPI_ADD_PTR (UINT8, Resource,
496             Resource->PinFunction.VendorOffset);
497 
498         AcpiDmDumpRawDataBuffer (VendorData,
499             Resource->PinFunction.VendorLength, Level);
500     }
501 
502     AcpiOsPrintf (")\n");
503 
504     AcpiDmIndent (Level + 1);
505 
506     /* Dump the interrupt list */
507 
508     AcpiOsPrintf ("{   // Pin list\n");
509 
510     PinCount = ((UINT32) (Resource->PinFunction.ResSourceOffset -
511         Resource->PinFunction.PinTableOffset)) /
512         sizeof (UINT16);
513 
514     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
515         Resource->PinFunction.PinTableOffset);
516 
517     for (i = 0; i < PinCount; i++)
518     {
519         AcpiDmIndent (Level + 2);
520         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
521             ((i + 1) < PinCount) ? "," : "");
522     }
523 
524     AcpiDmIndent (Level + 1);
525     AcpiOsPrintf ("}\n");
526 }
527 
528 
529 /*******************************************************************************
530  *
531  * FUNCTION:    AcpiDmDumpSerialBusVendorData
532  *
533  * PARAMETERS:  Resource            - Pointer to the resource descriptor
534  *
535  * RETURN:      None
536  *
537  * DESCRIPTION: Dump optional serial bus vendor data
538  *
539  ******************************************************************************/
540 
541 static void
AcpiDmDumpSerialBusVendorData(AML_RESOURCE * Resource,UINT32 Level)542 AcpiDmDumpSerialBusVendorData (
543     AML_RESOURCE            *Resource,
544     UINT32                  Level)
545 {
546     UINT8                   *VendorData;
547     UINT32                  VendorLength;
548 
549 
550     /* Get the (optional) vendor data and length */
551 
552     switch (Resource->CommonSerialBus.Type)
553     {
554     case AML_RESOURCE_I2C_SERIALBUSTYPE:
555 
556         VendorLength = Resource->CommonSerialBus.TypeDataLength -
557             AML_RESOURCE_I2C_MIN_DATA_LEN;
558 
559         VendorData = ACPI_ADD_PTR (UINT8, Resource,
560             sizeof (AML_RESOURCE_I2C_SERIALBUS));
561         break;
562 
563     case AML_RESOURCE_SPI_SERIALBUSTYPE:
564 
565         VendorLength = Resource->CommonSerialBus.TypeDataLength -
566             AML_RESOURCE_SPI_MIN_DATA_LEN;
567 
568         VendorData = ACPI_ADD_PTR (UINT8, Resource,
569             sizeof (AML_RESOURCE_SPI_SERIALBUS));
570         break;
571 
572     case AML_RESOURCE_UART_SERIALBUSTYPE:
573 
574         VendorLength = Resource->CommonSerialBus.TypeDataLength -
575             AML_RESOURCE_UART_MIN_DATA_LEN;
576 
577         VendorData = ACPI_ADD_PTR (UINT8, Resource,
578             sizeof (AML_RESOURCE_UART_SERIALBUS));
579         break;
580 
581     case AML_RESOURCE_CSI2_SERIALBUSTYPE:
582 
583         VendorLength = Resource->CommonSerialBus.TypeDataLength -
584             AML_RESOURCE_CSI2_MIN_DATA_LEN;
585 
586         VendorData = ACPI_ADD_PTR (UINT8, Resource,
587             sizeof (AML_RESOURCE_CSI2_SERIALBUS));
588         break;
589 
590     default:
591 
592         return;
593     }
594 
595     /* Dump the vendor bytes as a RawDataBuffer object */
596 
597     AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level);
598 }
599 
600 
601 /*******************************************************************************
602  *
603  * FUNCTION:    AcpiDmCsi2SerialBusDescriptor
604  *
605  * PARAMETERS:  Info                - Extra resource info
606  *              Resource            - Pointer to the resource descriptor
607  *              Length              - Length of the descriptor in bytes
608  *              Level               - Current source code indentation level
609  *
610  * RETURN:      None
611  *
612  * DESCRIPTION: Decode a CSI2 serial bus descriptor
613  *
614  ******************************************************************************/
615 
616 static void
AcpiDmCsi2SerialBusDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)617 AcpiDmCsi2SerialBusDescriptor (
618     ACPI_OP_WALK_INFO       *Info,
619     AML_RESOURCE            *Resource,
620     UINT32                  Length,
621     UINT32                  Level)
622 {
623     UINT32                  ResourceSourceOffset;
624     char                    *DeviceName;
625 
626 
627     /* SlaveMode, PhyType, LocalPortInstance */
628 
629     AcpiDmIndent (Level);
630     AcpiOsPrintf ("Csi2Bus (%s,",
631         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->Csi2SerialBus.Flags)]);
632 
633     AcpiOsPrintf (" 0x%2.2X, 0x%2.2X,\n",
634         Resource->Csi2SerialBus.TypeSpecificFlags & 0x03,
635         Resource->Csi2SerialBus.TypeSpecificFlags & 0xFC);
636 
637     /* ResourceSource is a required field */
638 
639     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
640         Resource->CommonSerialBus.TypeDataLength;
641 
642     AcpiDmIndent (Level + 1);
643     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
644     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
645 
646     /* ResourceSourceIndex, ResourceUsage */
647 
648     AcpiOsPrintf (",\n");
649     AcpiDmIndent (Level + 1);
650     AcpiOsPrintf ("0x%2.2X, ", Resource->Csi2SerialBus.ResSourceIndex);
651 
652     AcpiOsPrintf ("%s, ",
653         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Csi2SerialBus.Flags, 1)]);
654 
655     /* Insert a descriptor name */
656 
657     AcpiDmDescriptorName ();
658 
659     /* Dump the vendor data */
660 
661     AcpiOsPrintf (",\n");
662     AcpiDmIndent (Level + 1);
663     AcpiDmDumpSerialBusVendorData (Resource, Level);
664     AcpiOsPrintf (")\n");
665 
666     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
667 }
668 
669 
670 /*******************************************************************************
671  *
672  * FUNCTION:    AcpiDmI2cSerialBusDescriptor
673  *
674  * PARAMETERS:  Info                - Extra resource info
675  *              Resource            - Pointer to the resource descriptor
676  *              Length              - Length of the descriptor in bytes
677  *              Level               - Current source code indentation level
678  *
679  * RETURN:      None
680  *
681  * DESCRIPTION: Decode a I2C serial bus descriptor
682  *
683  ******************************************************************************/
684 
685 static void
AcpiDmI2cSerialBusDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)686 AcpiDmI2cSerialBusDescriptor (
687     ACPI_OP_WALK_INFO       *Info,
688     AML_RESOURCE            *Resource,
689     UINT32                  Length,
690     UINT32                  Level)
691 {
692     UINT32                  ResourceSourceOffset;
693     char                    *DeviceName;
694 
695 
696     /* SlaveAddress, SlaveMode, ConnectionSpeed, AddressingMode */
697 
698     AcpiDmIndent (Level);
699     AcpiOsPrintf ("I2cSerialBusV2 (0x%4.4X, %s, 0x%8.8X,\n",
700         Resource->I2cSerialBus.SlaveAddress,
701         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.Flags)],
702         Resource->I2cSerialBus.ConnectionSpeed);
703 
704     AcpiDmIndent (Level + 1);
705     AcpiOsPrintf ("%s, ",
706         AcpiGbl_AmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.TypeSpecificFlags)]);
707 
708     /* ResourceSource is a required field */
709 
710     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
711         Resource->CommonSerialBus.TypeDataLength;
712 
713     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
714     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
715 
716     /* ResourceSourceIndex, ResourceUsage */
717 
718     AcpiOsPrintf (",\n");
719     AcpiDmIndent (Level + 1);
720     AcpiOsPrintf ("0x%2.2X, ", Resource->I2cSerialBus.ResSourceIndex);
721 
722     AcpiOsPrintf ("%s, ",
723         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 1)]);
724 
725     /* Insert a descriptor name */
726 
727     AcpiDmDescriptorName ();
728 
729     /* Share */
730 
731     AcpiOsPrintf (", %s,\n",
732         AcpiGbl_ShrDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 2)]);
733 
734     /* Dump the vendor data */
735 
736     AcpiDmIndent (Level + 1);
737     AcpiDmDumpSerialBusVendorData (Resource, Level);
738     AcpiOsPrintf (")\n");
739 
740     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
741 }
742 
743 
744 /*******************************************************************************
745  *
746  * FUNCTION:    AcpiDmSpiSerialBusDescriptor
747  *
748  * PARAMETERS:  Info                - Extra resource info
749  *              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 SPI serial bus descriptor
756  *
757  ******************************************************************************/
758 
759 static void
AcpiDmSpiSerialBusDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)760 AcpiDmSpiSerialBusDescriptor (
761     ACPI_OP_WALK_INFO       *Info,
762     AML_RESOURCE            *Resource,
763     UINT32                  Length,
764     UINT32                  Level)
765 {
766     UINT32                  ResourceSourceOffset;
767     char                    *DeviceName;
768 
769 
770     /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */
771 
772     AcpiDmIndent (Level);
773     AcpiOsPrintf ("SpiSerialBusV2 (0x%4.4X, %s, %s, 0x%2.2X,\n",
774         Resource->SpiSerialBus.DeviceSelection,
775         AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags, 1)],
776         AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags)],
777         Resource->SpiSerialBus.DataBitLength);
778 
779     /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */
780 
781     AcpiDmIndent (Level + 1);
782     AcpiOsPrintf ("%s, 0x%8.8X, %s,\n",
783         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.Flags)],
784         Resource->SpiSerialBus.ConnectionSpeed,
785         AcpiGbl_CpoDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPolarity)]);
786 
787     AcpiDmIndent (Level + 1);
788     AcpiOsPrintf ("%s, ",
789         AcpiGbl_CphDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPhase)]);
790 
791     /* ResourceSource is a required field */
792 
793     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
794         Resource->CommonSerialBus.TypeDataLength;
795 
796     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
797     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
798 
799     /* ResourceSourceIndex, ResourceUsage */
800 
801     AcpiOsPrintf (",\n");
802     AcpiDmIndent (Level + 1);
803     AcpiOsPrintf ("0x%2.2X, ", Resource->SpiSerialBus.ResSourceIndex);
804 
805     AcpiOsPrintf ("%s, ",
806         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 1)]);
807 
808     /* Insert a descriptor name */
809 
810     AcpiDmDescriptorName ();
811 
812     /* Share */
813 
814     AcpiOsPrintf (", %s,\n",
815         AcpiGbl_ShrDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 2)]);
816 
817     /* Dump the vendor data */
818 
819     AcpiDmIndent (Level + 1);
820     AcpiDmDumpSerialBusVendorData (Resource, Level);
821     AcpiOsPrintf (")\n");
822 
823     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
824 }
825 
826 
827 /*******************************************************************************
828  *
829  * FUNCTION:    AcpiDmUartSerialBusDescriptor
830  *
831  * PARAMETERS:  Info                - Extra resource info
832  *              Resource            - Pointer to the resource descriptor
833  *              Length              - Length of the descriptor in bytes
834  *              Level               - Current source code indentation level
835  *
836  * RETURN:      None
837  *
838  * DESCRIPTION: Decode a UART serial bus descriptor
839  *
840  ******************************************************************************/
841 
842 static void
AcpiDmUartSerialBusDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)843 AcpiDmUartSerialBusDescriptor (
844     ACPI_OP_WALK_INFO       *Info,
845     AML_RESOURCE            *Resource,
846     UINT32                  Length,
847     UINT32                  Level)
848 {
849     UINT32                  ResourceSourceOffset;
850     char                    *DeviceName;
851 
852 
853     /* ConnectionSpeed, BitsPerByte, StopBits */
854 
855     AcpiDmIndent (Level);
856     AcpiOsPrintf ("UartSerialBusV2 (0x%8.8X, %s, %s,\n",
857         Resource->UartSerialBus.DefaultBaudRate,
858         AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 4)],
859         AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 2)]);
860 
861     /* LinesInUse, IsBigEndian, Parity, FlowControl */
862 
863     AcpiDmIndent (Level + 1);
864     AcpiOsPrintf ("0x%2.2X, %s, %s, %s,\n",
865         Resource->UartSerialBus.LinesEnabled,
866         AcpiGbl_EdDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 7)],
867         AcpiGbl_PtDecode [ACPI_GET_3BIT_FLAG (Resource->UartSerialBus.Parity)],
868         AcpiGbl_FcDecode [ACPI_GET_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags)]);
869 
870     /* ReceiveBufferSize, TransmitBufferSize */
871 
872     AcpiDmIndent (Level + 1);
873     AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ",
874         Resource->UartSerialBus.RxFifoSize,
875         Resource->UartSerialBus.TxFifoSize);
876 
877     /* ResourceSource is a required field */
878 
879     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
880         Resource->CommonSerialBus.TypeDataLength;
881 
882     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
883     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
884 
885     /* ResourceSourceIndex, ResourceUsage */
886 
887     AcpiOsPrintf (",\n");
888     AcpiDmIndent (Level + 1);
889     AcpiOsPrintf ("0x%2.2X, ", Resource->UartSerialBus.ResSourceIndex);
890 
891     AcpiOsPrintf ("%s, ",
892         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 1)]);
893 
894     /* Insert a descriptor name */
895 
896     AcpiDmDescriptorName ();
897 
898     /* Share */
899 
900     AcpiOsPrintf (", %s,\n",
901         AcpiGbl_ShrDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 2)]);
902 
903     /* Dump the vendor data */
904 
905     AcpiDmIndent (Level + 1);
906     AcpiDmDumpSerialBusVendorData (Resource, Level);
907     AcpiOsPrintf (")\n");
908 
909     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
910 }
911 
912 
913 /*******************************************************************************
914  *
915  * FUNCTION:    AcpiDmSerialBusDescriptor
916  *
917  * PARAMETERS:  Info                - Extra resource info
918  *              Resource            - Pointer to the resource descriptor
919  *              Length              - Length of the descriptor in bytes
920  *              Level               - Current source code indentation level
921  *
922  * RETURN:      None
923  *
924  * DESCRIPTION: Decode a I2C/SPI/UART/CSI2 serial bus descriptor
925  *
926  ******************************************************************************/
927 
928 void
AcpiDmSerialBusDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)929 AcpiDmSerialBusDescriptor (
930     ACPI_OP_WALK_INFO       *Info,
931     AML_RESOURCE            *Resource,
932     UINT32                  Length,
933     UINT32                  Level)
934 {
935 
936     SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
937         Info, Resource, Length, Level);
938 }
939 
940 /*******************************************************************************
941  *
942  * FUNCTION:    AcpiDmPinConfig
943  *
944  * PARAMETERS:  PinConfigType       - Pin configuration type
945  *              PinConfigValue      - Pin configuration value
946  *
947  * RETURN:      None
948  *
949  * DESCRIPTION: Pretty prints PinConfig type and value.
950  *
951  ******************************************************************************/
952 
953 static void
AcpiDmPinConfig(UINT8 PinConfigType,UINT32 PinConfigValue)954 AcpiDmPinConfig(
955     UINT8                   PinConfigType,
956     UINT32                  PinConfigValue)
957 {
958     if (PinConfigType <= 13)
959     {
960         AcpiOsPrintf ("0x%2.2X /* %s */, ", PinConfigType,
961             AcpiGbl_PtypDecode[PinConfigType]);
962     }
963     else
964     {
965         AcpiOsPrintf ("0x%2.2X, /* Vendor Defined */ ", PinConfigType);
966     }
967 
968     /* PinConfigValue */
969 
970     AcpiOsPrintf ("0x%4.4X,\n", PinConfigValue);
971 }
972 
973 /*******************************************************************************
974  *
975  * FUNCTION:    AcpiDmPinConfigDescriptor
976  *
977  * PARAMETERS:  Info                - Extra resource info
978  *              Resource            - Pointer to the resource descriptor
979  *              Length              - Length of the descriptor in bytes
980  *              Level               - Current source code indentation level
981  *
982  * RETURN:      None
983  *
984  * DESCRIPTION: Decode a PinConfig descriptor
985  *
986  ******************************************************************************/
987 
988 void
AcpiDmPinConfigDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)989 AcpiDmPinConfigDescriptor (
990     ACPI_OP_WALK_INFO       *Info,
991     AML_RESOURCE            *Resource,
992     UINT32                  Length,
993     UINT32                  Level)
994 {
995     UINT16                  *PinList;
996     UINT8                   *VendorData;
997     char                    *DeviceName = NULL;
998     UINT32                  PinCount;
999     UINT32                  i;
1000 
1001     AcpiDmIndent (Level);
1002     AcpiOsPrintf ("PinConfig (%s, ",
1003         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinConfig.Flags)]);
1004 
1005     AcpiDmPinConfig (Resource->PinConfig.PinConfigType,
1006         Resource->PinConfig.PinConfigValue);
1007 
1008     AcpiDmIndent (Level + 1);
1009 
1010     if (Resource->PinConfig.ResSourceOffset)
1011     {
1012         DeviceName = ACPI_ADD_PTR (char,
1013             Resource, Resource->PinConfig.ResSourceOffset),
1014         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
1015     }
1016 
1017     AcpiOsPrintf (", ");
1018     AcpiOsPrintf ("0x%2.2X, ", Resource->PinConfig.ResSourceIndex);
1019 
1020     AcpiOsPrintf ("%s, ",
1021         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinConfig.Flags, 1)]);
1022 
1023     /* Insert a descriptor name */
1024 
1025     AcpiDmDescriptorName ();
1026 
1027     AcpiOsPrintf (",");
1028 
1029     /* Dump the vendor data */
1030 
1031     if (Resource->PinConfig.VendorLength)
1032     {
1033         AcpiOsPrintf ("\n");
1034         AcpiDmIndent (Level + 1);
1035         VendorData = ACPI_ADD_PTR (UINT8, Resource,
1036             Resource->PinConfig.VendorOffset);
1037 
1038         AcpiDmDumpRawDataBuffer (VendorData,
1039             Resource->PinConfig.VendorLength, Level);
1040     }
1041 
1042     AcpiOsPrintf (")\n");
1043 
1044     AcpiDmIndent (Level + 1);
1045 
1046     /* Dump the interrupt list */
1047 
1048     AcpiOsPrintf ("{   // Pin list\n");
1049 
1050     PinCount = ((UINT32) (Resource->PinConfig.ResSourceOffset -
1051         Resource->PinConfig.PinTableOffset)) /
1052         sizeof (UINT16);
1053 
1054     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
1055         Resource->PinConfig.PinTableOffset);
1056 
1057     for (i = 0; i < PinCount; i++)
1058     {
1059         AcpiDmIndent (Level + 2);
1060         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
1061             ((i + 1) < PinCount) ? "," : "");
1062     }
1063 
1064     AcpiDmIndent (Level + 1);
1065     AcpiOsPrintf ("}\n");
1066 }
1067 
1068 /*******************************************************************************
1069  *
1070  * FUNCTION:    AcpiDmPinGroupDescriptor
1071  *
1072  * PARAMETERS:  Info                - Extra resource info
1073  *              Resource            - Pointer to the resource descriptor
1074  *              Length              - Length of the descriptor in bytes
1075  *              Level               - Current source code indentation level
1076  *
1077  * RETURN:      None
1078  *
1079  * DESCRIPTION: Decode a PinGroup descriptor
1080  *
1081  ******************************************************************************/
1082 
1083 void
AcpiDmPinGroupDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)1084 AcpiDmPinGroupDescriptor (
1085     ACPI_OP_WALK_INFO       *Info,
1086     AML_RESOURCE            *Resource,
1087     UINT32                  Length,
1088     UINT32                  Level)
1089 {
1090     char                    *Label;
1091     UINT16                  *PinList;
1092     UINT8                   *VendorData;
1093     UINT32                  PinCount;
1094     UINT32                  i;
1095 
1096     AcpiDmIndent (Level);
1097     /* Always producer */
1098     AcpiOsPrintf ("PinGroup (");
1099 
1100     Label = ACPI_ADD_PTR (char,
1101         Resource, Resource->PinGroup.LabelOffset),
1102     AcpiUtPrintString (Label, ACPI_UINT16_MAX);
1103 
1104     AcpiOsPrintf (", ");
1105 
1106     AcpiOsPrintf ("%s, ",
1107         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroup.Flags)]);
1108 
1109     /* Insert a descriptor name */
1110 
1111     AcpiDmDescriptorName ();
1112 
1113     AcpiOsPrintf (",");
1114 
1115     /* Dump the vendor data */
1116 
1117     if (Resource->PinGroup.VendorLength)
1118     {
1119         AcpiOsPrintf ("\n");
1120         AcpiDmIndent (Level + 1);
1121         VendorData = ACPI_ADD_PTR (UINT8, Resource,
1122             Resource->PinGroup.VendorOffset);
1123 
1124         AcpiDmDumpRawDataBuffer (VendorData,
1125             Resource->PinGroup.VendorLength, Level);
1126     }
1127 
1128     AcpiOsPrintf (")\n");
1129 
1130     AcpiDmIndent (Level + 1);
1131 
1132     /* Dump the interrupt list */
1133 
1134     AcpiOsPrintf ("{   // Pin list\n");
1135 
1136     PinCount = (Resource->PinGroup.LabelOffset -
1137         Resource->PinGroup.PinTableOffset) / sizeof (UINT16);
1138 
1139     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
1140         Resource->PinGroup.PinTableOffset);
1141 
1142     for (i = 0; i < PinCount; i++)
1143     {
1144         AcpiDmIndent (Level + 2);
1145         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
1146             ((i + 1) < PinCount) ? "," : "");
1147     }
1148 
1149     AcpiDmIndent (Level + 1);
1150     AcpiOsPrintf ("}\n");
1151 }
1152 
1153 /*******************************************************************************
1154  *
1155  * FUNCTION:    AcpiDmPinGroupFunctionDescriptor
1156  *
1157  * PARAMETERS:  Info                - Extra resource info
1158  *              Resource            - Pointer to the resource descriptor
1159  *              Length              - Length of the descriptor in bytes
1160  *              Level               - Current source code indentation level
1161  *
1162  * RETURN:      None
1163  *
1164  * DESCRIPTION: Decode a PinGroupFunction descriptor
1165  *
1166  ******************************************************************************/
1167 
1168 void
AcpiDmPinGroupFunctionDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)1169 AcpiDmPinGroupFunctionDescriptor (
1170     ACPI_OP_WALK_INFO       *Info,
1171     AML_RESOURCE            *Resource,
1172     UINT32                  Length,
1173     UINT32                  Level)
1174 {
1175     UINT8                   *VendorData;
1176     char                    *DeviceName = NULL;
1177     char                    *Label = NULL;
1178 
1179     AcpiDmIndent (Level);
1180     AcpiOsPrintf ("PinGroupFunction (%s, ",
1181         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupFunction.Flags)]);
1182 
1183     /* FunctionNumber */
1184 
1185     AcpiOsPrintf ("0x%4.4X, ", Resource->PinGroupFunction.FunctionNumber);
1186 
1187     DeviceName = ACPI_ADD_PTR (char,
1188         Resource, Resource->PinGroupFunction.ResSourceOffset),
1189     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
1190 
1191     AcpiOsPrintf (", ");
1192     AcpiOsPrintf ("0x%2.2X,\n", Resource->PinGroupFunction.ResSourceIndex);
1193 
1194     AcpiDmIndent (Level + 1);
1195 
1196     Label = ACPI_ADD_PTR (char, Resource,
1197         Resource->PinGroupFunction.ResSourceLabelOffset);
1198     AcpiUtPrintString (Label, ACPI_UINT16_MAX);
1199 
1200     AcpiOsPrintf (", ");
1201 
1202     AcpiOsPrintf ("%s, ",
1203         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupFunction.Flags, 1)]);
1204 
1205     /* Insert a descriptor name */
1206 
1207     AcpiDmDescriptorName ();
1208 
1209     AcpiOsPrintf (",");
1210 
1211     /* Dump the vendor data */
1212 
1213     if (Resource->PinGroupFunction.VendorLength)
1214     {
1215         AcpiOsPrintf ("\n");
1216         AcpiDmIndent (Level + 1);
1217         VendorData = ACPI_ADD_PTR (UINT8, Resource,
1218             Resource->PinGroupFunction.VendorOffset);
1219 
1220         AcpiDmDumpRawDataBuffer (VendorData,
1221             Resource->PinGroupFunction.VendorLength, Level);
1222     }
1223 
1224     AcpiOsPrintf (")\n");
1225 }
1226 
1227 /*******************************************************************************
1228  *
1229  * FUNCTION:    AcpiDmPinGroupConfigDescriptor
1230  *
1231  * PARAMETERS:  Info                - Extra resource info
1232  *              Resource            - Pointer to the resource descriptor
1233  *              Length              - Length of the descriptor in bytes
1234  *              Level               - Current source code indentation level
1235  *
1236  * RETURN:      None
1237  *
1238  * DESCRIPTION: Decode a PinGroupConfig descriptor
1239  *
1240  ******************************************************************************/
1241 
1242 void
AcpiDmPinGroupConfigDescriptor(ACPI_OP_WALK_INFO * Info,AML_RESOURCE * Resource,UINT32 Length,UINT32 Level)1243 AcpiDmPinGroupConfigDescriptor (
1244     ACPI_OP_WALK_INFO       *Info,
1245     AML_RESOURCE            *Resource,
1246     UINT32                  Length,
1247     UINT32                  Level)
1248 {
1249     UINT8                   *VendorData;
1250     char                    *DeviceName = NULL;
1251     char                    *Label = NULL;
1252 
1253     AcpiDmIndent (Level);
1254     AcpiOsPrintf ("PinGroupConfig (%s, ",
1255         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupConfig.Flags)]);
1256 
1257     AcpiDmPinConfig(Resource->PinGroupConfig.PinConfigType,
1258         Resource->PinGroupConfig.PinConfigValue);
1259 
1260     AcpiDmIndent (Level + 1);
1261 
1262     DeviceName = ACPI_ADD_PTR (char,
1263         Resource, Resource->PinGroupConfig.ResSourceOffset),
1264     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
1265 
1266     AcpiOsPrintf (", ");
1267     AcpiOsPrintf ("0x%2.2X, ", Resource->PinGroupConfig.ResSourceIndex);
1268 
1269     Label = ACPI_ADD_PTR (char, Resource,
1270         Resource->PinGroupConfig.ResSourceLabelOffset);
1271     AcpiUtPrintString (Label, ACPI_UINT16_MAX);
1272 
1273     AcpiOsPrintf (", ");
1274 
1275     AcpiOsPrintf ("%s, ",
1276         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupConfig.Flags, 1)]);
1277 
1278     /* Insert a descriptor name */
1279 
1280     AcpiDmDescriptorName ();
1281 
1282     AcpiOsPrintf (",");
1283 
1284     /* Dump the vendor data */
1285 
1286     if (Resource->PinGroupConfig.VendorLength)
1287     {
1288         AcpiOsPrintf ("\n");
1289         AcpiDmIndent (Level + 1);
1290         VendorData = ACPI_ADD_PTR (UINT8, Resource,
1291             Resource->PinGroupConfig.VendorOffset);
1292 
1293         AcpiDmDumpRawDataBuffer (VendorData,
1294             Resource->PinGroupConfig.VendorLength, Level);
1295     }
1296 
1297     AcpiOsPrintf (")\n");
1298 }
1299