xref: /netbsd-src/sys/external/bsd/acpica/dist/disassembler/dmresrcl2.c (revision 04028aa9310ca9c619eca5cf58ddf1e58624d1d7)
1 /*******************************************************************************
2  *
3  * Module Name: dmresrcl2.c - "Large" Resource Descriptor disassembly (#2)
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 "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 AcpiDmI2cSerialBusDescriptor (
60     ACPI_OP_WALK_INFO       *Info,
61     AML_RESOURCE            *Resource,
62     UINT32                  Length,
63     UINT32                  Level);
64 
65 static void
66 AcpiDmSpiSerialBusDescriptor (
67     ACPI_OP_WALK_INFO       *Info,
68     AML_RESOURCE            *Resource,
69     UINT32                  Length,
70     UINT32                  Level);
71 
72 static void
73 AcpiDmUartSerialBusDescriptor (
74     ACPI_OP_WALK_INFO       *Info,
75     AML_RESOURCE            *Resource,
76     UINT32                  Length,
77     UINT32                  Level);
78 
79 static void
80 AcpiDmGpioCommon (
81     ACPI_OP_WALK_INFO       *Info,
82     AML_RESOURCE            *Resource,
83     UINT32                  Level);
84 
85 static void
86 AcpiDmDumpRawDataBuffer (
87     UINT8                   *Buffer,
88     UINT32                  Length,
89     UINT32                  Level);
90 
91 
92 /* Dispatch table for the serial bus descriptors */
93 
94 static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
95 {
96     NULL,
97     AcpiDmI2cSerialBusDescriptor,
98     AcpiDmSpiSerialBusDescriptor,
99     AcpiDmUartSerialBusDescriptor
100 };
101 
102 
103 /*******************************************************************************
104  *
105  * FUNCTION:    AcpiDmDumpRawDataBuffer
106  *
107  * PARAMETERS:  Buffer              - Pointer to the data bytes
108  *              Length              - Length of the descriptor in bytes
109  *              Level               - Current source code indentation level
110  *
111  * RETURN:      None
112  *
113  * DESCRIPTION: Dump a data buffer as a RawDataBuffer() object. Used for
114  *              vendor data bytes.
115  *
116  ******************************************************************************/
117 
118 static void
119 AcpiDmDumpRawDataBuffer (
120     UINT8                   *Buffer,
121     UINT32                  Length,
122     UINT32                  Level)
123 {
124     UINT32                  Index;
125     UINT32                  i;
126     UINT32                  j;
127 
128 
129     if (!Length)
130     {
131         return;
132     }
133 
134     AcpiOsPrintf ("RawDataBuffer (0x%.2X)  // Vendor Data", Length);
135 
136     AcpiOsPrintf ("\n");
137     AcpiDmIndent (Level + 1);
138     AcpiOsPrintf ("{\n");
139     AcpiDmIndent (Level + 2);
140 
141     for (i = 0; i < Length;)
142     {
143         for (j = 0; j < 8; j++)
144         {
145             Index = i + j;
146             if (Index >= Length)
147             {
148                 goto Finish;
149             }
150 
151             AcpiOsPrintf ("0x%2.2X", Buffer[Index]);
152             if ((Index + 1) >= Length)
153             {
154                 goto Finish;
155             }
156 
157             AcpiOsPrintf (", ");
158         }
159 
160         AcpiOsPrintf ("\n");
161         AcpiDmIndent (Level + 2);
162 
163         i += 8;
164     }
165 
166 Finish:
167     AcpiOsPrintf ("\n");
168     AcpiDmIndent (Level + 1);
169     AcpiOsPrintf ("}");
170 }
171 
172 
173 /*******************************************************************************
174  *
175  * FUNCTION:    AcpiDmGpioCommon
176  *
177  * PARAMETERS:  Info                - Extra resource info
178  *              Resource            - Pointer to the resource descriptor
179  *              Level               - Current source code indentation level
180  *
181  * RETURN:      None
182  *
183  * DESCRIPTION: Decode common parts of a GPIO Interrupt descriptor
184  *
185  ******************************************************************************/
186 
187 static void
188 AcpiDmGpioCommon (
189     ACPI_OP_WALK_INFO       *Info,
190     AML_RESOURCE            *Resource,
191     UINT32                  Level)
192 {
193     UINT16                  *PinList;
194     UINT8                   *VendorData;
195     char                    *DeviceName = NULL;
196     UINT32                  PinCount;
197     UINT32                  i;
198 
199 
200     /* ResourceSource, ResourceSourceIndex, ResourceType */
201 
202     AcpiDmIndent (Level + 1);
203     if (Resource->Gpio.ResSourceOffset)
204     {
205         DeviceName = ACPI_ADD_PTR (char,
206             Resource, Resource->Gpio.ResSourceOffset),
207         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
208     }
209 
210     AcpiOsPrintf (", ");
211     AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex);
212     AcpiOsPrintf ("%s, ",
213         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.Flags)]);
214 
215     /* Insert a descriptor name */
216 
217     AcpiDmDescriptorName ();
218     AcpiOsPrintf (",");
219 
220     /* Dump the vendor data */
221 
222     if (Resource->Gpio.VendorOffset)
223     {
224         AcpiOsPrintf ("\n");
225         AcpiDmIndent (Level + 1);
226         VendorData = ACPI_ADD_PTR (UINT8, Resource,
227             Resource->Gpio.VendorOffset);
228 
229         AcpiDmDumpRawDataBuffer (VendorData,
230             Resource->Gpio.VendorLength, Level);
231     }
232 
233     AcpiOsPrintf (")\n");
234 
235     /* Dump the interrupt list */
236 
237     AcpiDmIndent (Level + 1);
238     AcpiOsPrintf ("{   // Pin list\n");
239 
240     PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset -
241         Resource->Gpio.PinTableOffset)) /
242         sizeof (UINT16);
243 
244     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
245         Resource->Gpio.PinTableOffset);
246 
247     for (i = 0; i < PinCount; i++)
248     {
249         AcpiDmIndent (Level + 2);
250         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
251             ((i + 1) < PinCount) ? "," : "");
252     }
253 
254     AcpiDmIndent (Level + 1);
255     AcpiOsPrintf ("}\n");
256 
257     MpSaveGpioInfo (Info->MappingOp, Resource,
258         PinCount, PinList, DeviceName);
259 }
260 
261 
262 /*******************************************************************************
263  *
264  * FUNCTION:    AcpiDmGpioIntDescriptor
265  *
266  * PARAMETERS:  Info                - Extra resource info
267  *              Resource            - Pointer to the resource descriptor
268  *              Length              - Length of the descriptor in bytes
269  *              Level               - Current source code indentation level
270  *
271  * RETURN:      None
272  *
273  * DESCRIPTION: Decode a GPIO Interrupt descriptor
274  *
275  ******************************************************************************/
276 
277 static void
278 AcpiDmGpioIntDescriptor (
279     ACPI_OP_WALK_INFO       *Info,
280     AML_RESOURCE            *Resource,
281     UINT32                  Length,
282     UINT32                  Level)
283 {
284 
285     /* Dump the GpioInt-specific portion of the descriptor */
286 
287     /* EdgeLevel, ActiveLevel, Shared */
288 
289     AcpiDmIndent (Level);
290     AcpiOsPrintf ("GpioInt (%s, %s, %s, ",
291         AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.IntFlags)],
292         AcpiGbl_LlDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 1)],
293         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
294 
295     /* PinConfig, DebounceTimeout */
296 
297     if (Resource->Gpio.PinConfig <= 3)
298     {
299         AcpiOsPrintf ("%s, ",
300             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
301     }
302     else
303     {
304         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
305     }
306     AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout);
307 
308     /* Dump the GpioInt/GpioIo common portion of the descriptor */
309 
310     AcpiDmGpioCommon (Info, Resource, Level);
311 }
312 
313 
314 /*******************************************************************************
315  *
316  * FUNCTION:    AcpiDmGpioIoDescriptor
317  *
318  * PARAMETERS:  Info                - Extra resource info
319  *              Resource            - Pointer to the resource descriptor
320  *              Length              - Length of the descriptor in bytes
321  *              Level               - Current source code indentation level
322  *
323  * RETURN:      None
324  *
325  * DESCRIPTION: Decode a GPIO I/O descriptor
326  *
327  ******************************************************************************/
328 
329 static void
330 AcpiDmGpioIoDescriptor (
331     ACPI_OP_WALK_INFO       *Info,
332     AML_RESOURCE            *Resource,
333     UINT32                  Length,
334     UINT32                  Level)
335 {
336 
337     /* Dump the GpioIo-specific portion of the descriptor */
338 
339     /* Shared, PinConfig */
340 
341     AcpiDmIndent (Level);
342     AcpiOsPrintf ("GpioIo (%s, ",
343         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
344 
345     if (Resource->Gpio.PinConfig <= 3)
346     {
347         AcpiOsPrintf ("%s, ",
348             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
349     }
350     else
351     {
352         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
353     }
354 
355     /* DebounceTimeout, DriveStrength, IoRestriction */
356 
357     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout);
358     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength);
359     AcpiOsPrintf ("%s,\n",
360         AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Resource->Gpio.IntFlags)]);
361 
362     /* Dump the GpioInt/GpioIo common portion of the descriptor */
363 
364     AcpiDmGpioCommon (Info, Resource, Level);
365 }
366 
367 
368 /*******************************************************************************
369  *
370  * FUNCTION:    AcpiDmGpioDescriptor
371  *
372  * PARAMETERS:  Info                - Extra resource info
373  *              Resource            - Pointer to the resource descriptor
374  *              Length              - Length of the descriptor in bytes
375  *              Level               - Current source code indentation level
376  *
377  * RETURN:      None
378  *
379  * DESCRIPTION: Decode a GpioInt/GpioIo GPIO Interrupt/IO descriptor
380  *
381  ******************************************************************************/
382 
383 void
384 AcpiDmGpioDescriptor (
385     ACPI_OP_WALK_INFO       *Info,
386     AML_RESOURCE            *Resource,
387     UINT32                  Length,
388     UINT32                  Level)
389 {
390     UINT8                   ConnectionType;
391 
392 
393     ConnectionType = Resource->Gpio.ConnectionType;
394 
395     switch (ConnectionType)
396     {
397     case AML_RESOURCE_GPIO_TYPE_INT:
398 
399         AcpiDmGpioIntDescriptor (Info, Resource, Length, Level);
400         break;
401 
402     case AML_RESOURCE_GPIO_TYPE_IO:
403 
404         AcpiDmGpioIoDescriptor (Info, Resource, Length, Level);
405         break;
406 
407     default:
408 
409         AcpiOsPrintf ("Unknown GPIO type\n");
410         break;
411     }
412 }
413 
414 
415 /*******************************************************************************
416  *
417  * FUNCTION:    AcpiDmDumpSerialBusVendorData
418  *
419  * PARAMETERS:  Resource            - Pointer to the resource descriptor
420  *
421  * RETURN:      None
422  *
423  * DESCRIPTION: Dump optional serial bus vendor data
424  *
425  ******************************************************************************/
426 
427 static void
428 AcpiDmDumpSerialBusVendorData (
429     AML_RESOURCE            *Resource,
430     UINT32                  Level)
431 {
432     UINT8                   *VendorData;
433     UINT32                  VendorLength;
434 
435 
436     /* Get the (optional) vendor data and length */
437 
438     switch (Resource->CommonSerialBus.Type)
439     {
440     case AML_RESOURCE_I2C_SERIALBUSTYPE:
441 
442         VendorLength = Resource->CommonSerialBus.TypeDataLength -
443             AML_RESOURCE_I2C_MIN_DATA_LEN;
444 
445         VendorData = ACPI_ADD_PTR (UINT8, Resource,
446             sizeof (AML_RESOURCE_I2C_SERIALBUS));
447         break;
448 
449     case AML_RESOURCE_SPI_SERIALBUSTYPE:
450 
451         VendorLength = Resource->CommonSerialBus.TypeDataLength -
452             AML_RESOURCE_SPI_MIN_DATA_LEN;
453 
454         VendorData = ACPI_ADD_PTR (UINT8, Resource,
455             sizeof (AML_RESOURCE_SPI_SERIALBUS));
456         break;
457 
458     case AML_RESOURCE_UART_SERIALBUSTYPE:
459 
460         VendorLength = Resource->CommonSerialBus.TypeDataLength -
461             AML_RESOURCE_UART_MIN_DATA_LEN;
462 
463         VendorData = ACPI_ADD_PTR (UINT8, Resource,
464             sizeof (AML_RESOURCE_UART_SERIALBUS));
465         break;
466 
467     default:
468 
469         return;
470     }
471 
472     /* Dump the vendor bytes as a RawDataBuffer object */
473 
474     AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level);
475 }
476 
477 
478 /*******************************************************************************
479  *
480  * FUNCTION:    AcpiDmI2cSerialBusDescriptor
481  *
482  * PARAMETERS:  Info                - Extra resource info
483  *              Resource            - Pointer to the resource descriptor
484  *              Length              - Length of the descriptor in bytes
485  *              Level               - Current source code indentation level
486  *
487  * RETURN:      None
488  *
489  * DESCRIPTION: Decode a I2C serial bus descriptor
490  *
491  ******************************************************************************/
492 
493 static void
494 AcpiDmI2cSerialBusDescriptor (
495     ACPI_OP_WALK_INFO       *Info,
496     AML_RESOURCE            *Resource,
497     UINT32                  Length,
498     UINT32                  Level)
499 {
500     UINT32                  ResourceSourceOffset;
501     char                    *DeviceName;
502 
503 
504     /* SlaveAddress, SlaveMode, ConnectionSpeed, AddressingMode */
505 
506     AcpiDmIndent (Level);
507     AcpiOsPrintf ("I2cSerialBus (0x%4.4X, %s, 0x%8.8X,\n",
508         Resource->I2cSerialBus.SlaveAddress,
509         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.Flags)],
510         Resource->I2cSerialBus.ConnectionSpeed);
511 
512     AcpiDmIndent (Level + 1);
513     AcpiOsPrintf ("%s, ",
514         AcpiGbl_AmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.TypeSpecificFlags)]);
515 
516     /* ResourceSource is a required field */
517 
518     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
519         Resource->CommonSerialBus.TypeDataLength;
520 
521     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
522     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
523 
524     /* ResourceSourceIndex, ResourceUsage */
525 
526     AcpiOsPrintf (",\n");
527     AcpiDmIndent (Level + 1);
528     AcpiOsPrintf ("0x%2.2X, ", Resource->I2cSerialBus.ResSourceIndex);
529 
530     AcpiOsPrintf ("%s, ",
531         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 1)]);
532 
533     /* Insert a descriptor name */
534 
535     AcpiDmDescriptorName ();
536     AcpiOsPrintf (",\n");
537 
538     /* Dump the vendor data */
539 
540     AcpiDmIndent (Level + 1);
541     AcpiDmDumpSerialBusVendorData (Resource, Level);
542     AcpiOsPrintf (")\n");
543 
544     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
545 }
546 
547 
548 /*******************************************************************************
549  *
550  * FUNCTION:    AcpiDmSpiSerialBusDescriptor
551  *
552  * PARAMETERS:  Info                - Extra resource info
553  *              Resource            - Pointer to the resource descriptor
554  *              Length              - Length of the descriptor in bytes
555  *              Level               - Current source code indentation level
556  *
557  * RETURN:      None
558  *
559  * DESCRIPTION: Decode a SPI serial bus descriptor
560  *
561  ******************************************************************************/
562 
563 static void
564 AcpiDmSpiSerialBusDescriptor (
565     ACPI_OP_WALK_INFO       *Info,
566     AML_RESOURCE            *Resource,
567     UINT32                  Length,
568     UINT32                  Level)
569 {
570     UINT32                  ResourceSourceOffset;
571     char                    *DeviceName;
572 
573 
574     /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */
575 
576     AcpiDmIndent (Level);
577     AcpiOsPrintf ("SpiSerialBus (0x%4.4X, %s, %s, 0x%2.2X,\n",
578         Resource->SpiSerialBus.DeviceSelection,
579         AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags, 1)],
580         AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags)],
581         Resource->SpiSerialBus.DataBitLength);
582 
583     /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */
584 
585     AcpiDmIndent (Level + 1);
586     AcpiOsPrintf ("%s, 0x%8.8X, %s,\n",
587         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.Flags)],
588         Resource->SpiSerialBus.ConnectionSpeed,
589         AcpiGbl_CpoDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPolarity)]);
590 
591     AcpiDmIndent (Level + 1);
592     AcpiOsPrintf ("%s, ",
593         AcpiGbl_CphDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPhase)]);
594 
595     /* ResourceSource is a required field */
596 
597     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
598         Resource->CommonSerialBus.TypeDataLength;
599 
600     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
601     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
602 
603     /* ResourceSourceIndex, ResourceUsage */
604 
605     AcpiOsPrintf (",\n");
606     AcpiDmIndent (Level + 1);
607     AcpiOsPrintf ("0x%2.2X, ", Resource->SpiSerialBus.ResSourceIndex);
608 
609     AcpiOsPrintf ("%s, ",
610         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 1)]);
611 
612     /* Insert a descriptor name */
613 
614     AcpiDmDescriptorName ();
615     AcpiOsPrintf (",\n");
616 
617     /* Dump the vendor data */
618 
619     AcpiDmIndent (Level + 1);
620     AcpiDmDumpSerialBusVendorData (Resource, Level);
621     AcpiOsPrintf (")\n");
622 
623     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
624 }
625 
626 
627 /*******************************************************************************
628  *
629  * FUNCTION:    AcpiDmUartSerialBusDescriptor
630  *
631  * PARAMETERS:  Info                - Extra resource info
632  *              Resource            - Pointer to the resource descriptor
633  *              Length              - Length of the descriptor in bytes
634  *              Level               - Current source code indentation level
635  *
636  * RETURN:      None
637  *
638  * DESCRIPTION: Decode a UART serial bus descriptor
639  *
640  ******************************************************************************/
641 
642 static void
643 AcpiDmUartSerialBusDescriptor (
644     ACPI_OP_WALK_INFO       *Info,
645     AML_RESOURCE            *Resource,
646     UINT32                  Length,
647     UINT32                  Level)
648 {
649     UINT32                  ResourceSourceOffset;
650     char                    *DeviceName;
651 
652 
653     /* ConnectionSpeed, BitsPerByte, StopBits */
654 
655     AcpiDmIndent (Level);
656     AcpiOsPrintf ("UartSerialBus (0x%8.8X, %s, %s,\n",
657         Resource->UartSerialBus.DefaultBaudRate,
658         AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 4)],
659         AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 2)]);
660 
661     /* LinesInUse, IsBigEndian, Parity, FlowControl */
662 
663     AcpiDmIndent (Level + 1);
664     AcpiOsPrintf ("0x%2.2X, %s, %s, %s,\n",
665         Resource->UartSerialBus.LinesEnabled,
666         AcpiGbl_EdDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 7)],
667         AcpiGbl_PtDecode [ACPI_GET_3BIT_FLAG (Resource->UartSerialBus.Parity)],
668         AcpiGbl_FcDecode [ACPI_GET_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags)]);
669 
670     /* ReceiveBufferSize, TransmitBufferSize */
671 
672     AcpiDmIndent (Level + 1);
673     AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ",
674         Resource->UartSerialBus.RxFifoSize,
675         Resource->UartSerialBus.TxFifoSize);
676 
677     /* ResourceSource is a required field */
678 
679     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
680         Resource->CommonSerialBus.TypeDataLength;
681 
682     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
683     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
684 
685     /* ResourceSourceIndex, ResourceUsage */
686 
687     AcpiOsPrintf (",\n");
688     AcpiDmIndent (Level + 1);
689     AcpiOsPrintf ("0x%2.2X, ", Resource->UartSerialBus.ResSourceIndex);
690 
691     AcpiOsPrintf ("%s, ",
692         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 1)]);
693 
694     /* Insert a descriptor name */
695 
696     AcpiDmDescriptorName ();
697     AcpiOsPrintf (",\n");
698 
699     /* Dump the vendor data */
700 
701     AcpiDmIndent (Level + 1);
702     AcpiDmDumpSerialBusVendorData (Resource, Level);
703     AcpiOsPrintf (")\n");
704 
705     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
706 }
707 
708 
709 /*******************************************************************************
710  *
711  * FUNCTION:    AcpiDmSerialBusDescriptor
712  *
713  * PARAMETERS:  Info                - Extra resource info
714  *              Resource            - Pointer to the resource descriptor
715  *              Length              - Length of the descriptor in bytes
716  *              Level               - Current source code indentation level
717  *
718  * RETURN:      None
719  *
720  * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
721  *
722  ******************************************************************************/
723 
724 void
725 AcpiDmSerialBusDescriptor (
726     ACPI_OP_WALK_INFO       *Info,
727     AML_RESOURCE            *Resource,
728     UINT32                  Length,
729     UINT32                  Level)
730 {
731 
732     SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
733         Info, Resource, Length, Level);
734 }
735