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