1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: dmbuffer - AML disassembler, buffer and string support
4100966Siwasaki *
5100966Siwasaki ******************************************************************************/
6100966Siwasaki
7217365Sjkim/*
8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
9100966Siwasaki * All rights reserved.
10100966Siwasaki *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25100966Siwasaki *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29100966Siwasaki *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43100966Siwasaki
44100966Siwasaki
45193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
46193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
47193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
48193341Sjkim#include <contrib/dev/acpica/include/acparser.h>
49193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
50100966Siwasaki
51100966Siwasaki
52100966Siwasaki#ifdef ACPI_DISASSEMBLER
53100966Siwasaki
54102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
55100966Siwasaki        ACPI_MODULE_NAME    ("dmbuffer")
56100966Siwasaki
57151937Sjkim/* Local prototypes */
58100966Siwasaki
59151937Sjkimstatic void
60151937SjkimAcpiDmUnicode (
61151937Sjkim    ACPI_PARSE_OBJECT       *Op);
62151937Sjkim
63193267Sjkimstatic void
64193267SjkimAcpiDmIsEisaIdElement (
65193267Sjkim    ACPI_PARSE_OBJECT       *Op);
66151937Sjkim
67193267Sjkim
68100966Siwasaki/*******************************************************************************
69100966Siwasaki *
70100966Siwasaki * FUNCTION:    AcpiDmDisasmByteList
71100966Siwasaki *
72100966Siwasaki * PARAMETERS:  Level               - Current source code indentation level
73100966Siwasaki *              ByteData            - Pointer to the byte list
74100966Siwasaki *              ByteCount           - Length of the byte list
75100966Siwasaki *
76100966Siwasaki * RETURN:      None
77100966Siwasaki *
78167802Sjkim * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed
79167802Sjkim *              with the hex buffer offset.
80100966Siwasaki *
81100966Siwasaki ******************************************************************************/
82100966Siwasaki
83100966Siwasakivoid
84100966SiwasakiAcpiDmDisasmByteList (
85100966Siwasaki    UINT32                  Level,
86100966Siwasaki    UINT8                   *ByteData,
87100966Siwasaki    UINT32                  ByteCount)
88100966Siwasaki{
89100966Siwasaki    UINT32                  i;
90100966Siwasaki
91100966Siwasaki
92167802Sjkim    if (!ByteCount)
93167802Sjkim    {
94167802Sjkim        return;
95167802Sjkim    }
96100966Siwasaki
97100966Siwasaki    /* Dump the byte list */
98100966Siwasaki
99100966Siwasaki    for (i = 0; i < ByteCount; i++)
100100966Siwasaki    {
101167802Sjkim        /* New line every 8 bytes */
102167802Sjkim
103167802Sjkim        if (((i % 8) == 0) && (i < ByteCount))
104167802Sjkim        {
105167802Sjkim            if (i > 0)
106167802Sjkim            {
107167802Sjkim                AcpiOsPrintf ("\n");
108167802Sjkim            }
109167802Sjkim
110167802Sjkim            AcpiDmIndent (Level);
111167802Sjkim            if (ByteCount > 7)
112167802Sjkim            {
113167802Sjkim                AcpiOsPrintf ("/* %04X */    ", i);
114167802Sjkim            }
115167802Sjkim        }
116167802Sjkim
117100966Siwasaki        AcpiOsPrintf ("0x%2.2X", (UINT32) ByteData[i]);
118100966Siwasaki
119100966Siwasaki        /* Add comma if there are more bytes to display */
120100966Siwasaki
121100966Siwasaki        if (i < (ByteCount -1))
122100966Siwasaki        {
123100966Siwasaki            AcpiOsPrintf (", ");
124100966Siwasaki        }
125100966Siwasaki    }
126100966Siwasaki
127100966Siwasaki    if (Level)
128100966Siwasaki    {
129100966Siwasaki        AcpiOsPrintf ("\n");
130100966Siwasaki    }
131100966Siwasaki}
132100966Siwasaki
133100966Siwasaki
134100966Siwasaki/*******************************************************************************
135100966Siwasaki *
136100966Siwasaki * FUNCTION:    AcpiDmByteList
137100966Siwasaki *
138100966Siwasaki * PARAMETERS:  Info            - Parse tree walk info
139100966Siwasaki *              Op              - Byte list op
140100966Siwasaki *
141100966Siwasaki * RETURN:      None
142100966Siwasaki *
143100966Siwasaki * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers.
144100966Siwasaki *              Buffer type must be already set in the Op DisasmOpcode.
145100966Siwasaki *
146100966Siwasaki ******************************************************************************/
147100966Siwasaki
148100966Siwasakivoid
149100966SiwasakiAcpiDmByteList (
150100966Siwasaki    ACPI_OP_WALK_INFO       *Info,
151100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
152100966Siwasaki{
153100966Siwasaki    UINT8                   *ByteData;
154100966Siwasaki    UINT32                  ByteCount;
155100966Siwasaki
156100966Siwasaki
157100966Siwasaki    ByteData = Op->Named.Data;
158117521Snjl    ByteCount = (UINT32) Op->Common.Value.Integer;
159100966Siwasaki
160100966Siwasaki    /*
161100966Siwasaki     * The byte list belongs to a buffer, and can be produced by either
162100966Siwasaki     * a ResourceTemplate, Unicode, quoted string, or a plain byte list.
163100966Siwasaki     */
164100966Siwasaki    switch (Op->Common.Parent->Common.DisasmOpcode)
165100966Siwasaki    {
166100966Siwasaki    case ACPI_DASM_RESOURCE:
167100966Siwasaki
168167802Sjkim        AcpiDmResourceTemplate (Info, Op->Common.Parent, ByteData, ByteCount);
169100966Siwasaki        break;
170100966Siwasaki
171100966Siwasaki    case ACPI_DASM_STRING:
172100966Siwasaki
173100966Siwasaki        AcpiDmIndent (Info->Level);
174107325Siwasaki        AcpiUtPrintString ((char *) ByteData, ACPI_UINT8_MAX);
175100966Siwasaki        AcpiOsPrintf ("\n");
176100966Siwasaki        break;
177100966Siwasaki
178100966Siwasaki    case ACPI_DASM_UNICODE:
179100966Siwasaki
180100966Siwasaki        AcpiDmUnicode (Op);
181100966Siwasaki        break;
182100966Siwasaki
183100966Siwasaki    case ACPI_DASM_BUFFER:
184100966Siwasaki    default:
185100966Siwasaki
186100966Siwasaki        /*
187100966Siwasaki         * Not a resource, string, or unicode string.
188100966Siwasaki         * Just dump the buffer
189100966Siwasaki         */
190100966Siwasaki        AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount);
191100966Siwasaki        break;
192100966Siwasaki    }
193100966Siwasaki}
194100966Siwasaki
195100966Siwasaki
196100966Siwasaki/*******************************************************************************
197100966Siwasaki *
198100966Siwasaki * FUNCTION:    AcpiDmIsUnicodeBuffer
199100966Siwasaki *
200100966Siwasaki * PARAMETERS:  Op              - Buffer Object to be examined
201100966Siwasaki *
202100966Siwasaki * RETURN:      TRUE if buffer contains a UNICODE string
203100966Siwasaki *
204100966Siwasaki * DESCRIPTION: Determine if a buffer Op contains a Unicode string
205100966Siwasaki *
206100966Siwasaki ******************************************************************************/
207100966Siwasaki
208100966SiwasakiBOOLEAN
209100966SiwasakiAcpiDmIsUnicodeBuffer (
210100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
211100966Siwasaki{
212100966Siwasaki    UINT8                   *ByteData;
213100966Siwasaki    UINT32                  ByteCount;
214100966Siwasaki    UINT32                  WordCount;
215100966Siwasaki    ACPI_PARSE_OBJECT       *SizeOp;
216100966Siwasaki    ACPI_PARSE_OBJECT       *NextOp;
217193267Sjkim    UINT32                  i;
218100966Siwasaki
219100966Siwasaki
220100966Siwasaki    /* Buffer size is the buffer argument */
221100966Siwasaki
222100966Siwasaki    SizeOp = Op->Common.Value.Arg;
223100966Siwasaki
224100966Siwasaki    /* Next, the initializer byte list to examine */
225100966Siwasaki
226100966Siwasaki    NextOp = SizeOp->Common.Next;
227100966Siwasaki    if (!NextOp)
228100966Siwasaki    {
229100966Siwasaki        return (FALSE);
230100966Siwasaki    }
231100966Siwasaki
232100966Siwasaki    /* Extract the byte list info */
233100966Siwasaki
234100966Siwasaki    ByteData = NextOp->Named.Data;
235117521Snjl    ByteCount = (UINT32) NextOp->Common.Value.Integer;
236100966Siwasaki    WordCount = ACPI_DIV_2 (ByteCount);
237100966Siwasaki
238100966Siwasaki    /*
239100966Siwasaki     * Unicode string must have an even number of bytes and last
240100966Siwasaki     * word must be zero
241100966Siwasaki     */
242100966Siwasaki    if ((!ByteCount)     ||
243100966Siwasaki         (ByteCount < 4) ||
244100966Siwasaki         (ByteCount & 1) ||
245100966Siwasaki        ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0)
246100966Siwasaki    {
247100966Siwasaki        return (FALSE);
248100966Siwasaki    }
249100966Siwasaki
250100966Siwasaki    /* For each word, 1st byte must be ascii, 2nd byte must be zero */
251100966Siwasaki
252100966Siwasaki    for (i = 0; i < (ByteCount - 2); i += 2)
253100966Siwasaki    {
254100966Siwasaki        if ((!ACPI_IS_PRINT (ByteData[i])) ||
255193267Sjkim            (ByteData[(ACPI_SIZE) i + 1] != 0))
256100966Siwasaki        {
257100966Siwasaki            return (FALSE);
258100966Siwasaki        }
259100966Siwasaki    }
260100966Siwasaki
261100966Siwasaki    /* Ignore the Size argument in the disassembly of this buffer op */
262100966Siwasaki
263100966Siwasaki    SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
264100966Siwasaki    return (TRUE);
265100966Siwasaki}
266100966Siwasaki
267100966Siwasaki
268100966Siwasaki/*******************************************************************************
269100966Siwasaki *
270100966Siwasaki * FUNCTION:    AcpiDmIsStringBuffer
271100966Siwasaki *
272100966Siwasaki * PARAMETERS:  Op              - Buffer Object to be examined
273100966Siwasaki *
274151937Sjkim * RETURN:      TRUE if buffer contains a ASCII string, FALSE otherwise
275100966Siwasaki *
276100966Siwasaki * DESCRIPTION: Determine if a buffer Op contains a ASCII string
277100966Siwasaki *
278100966Siwasaki ******************************************************************************/
279100966Siwasaki
280100966SiwasakiBOOLEAN
281100966SiwasakiAcpiDmIsStringBuffer (
282100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
283100966Siwasaki{
284100966Siwasaki    UINT8                   *ByteData;
285100966Siwasaki    UINT32                  ByteCount;
286100966Siwasaki    ACPI_PARSE_OBJECT       *SizeOp;
287100966Siwasaki    ACPI_PARSE_OBJECT       *NextOp;
288100966Siwasaki    UINT32                  i;
289100966Siwasaki
290100966Siwasaki
291100966Siwasaki    /* Buffer size is the buffer argument */
292100966Siwasaki
293100966Siwasaki    SizeOp = Op->Common.Value.Arg;
294100966Siwasaki
295100966Siwasaki    /* Next, the initializer byte list to examine */
296100966Siwasaki
297100966Siwasaki    NextOp = SizeOp->Common.Next;
298100966Siwasaki    if (!NextOp)
299100966Siwasaki    {
300100966Siwasaki        return (FALSE);
301100966Siwasaki    }
302100966Siwasaki
303100966Siwasaki    /* Extract the byte list info */
304100966Siwasaki
305100966Siwasaki    ByteData = NextOp->Named.Data;
306117521Snjl    ByteCount = (UINT32) NextOp->Common.Value.Integer;
307100966Siwasaki
308100966Siwasaki    /* Last byte must be the null terminator */
309100966Siwasaki
310100966Siwasaki    if ((!ByteCount)     ||
311100966Siwasaki         (ByteCount < 2) ||
312100966Siwasaki         (ByteData[ByteCount-1] != 0))
313100966Siwasaki    {
314100966Siwasaki        return (FALSE);
315100966Siwasaki    }
316100966Siwasaki
317100966Siwasaki    for (i = 0; i < (ByteCount - 1); i++)
318100966Siwasaki    {
319100966Siwasaki        /* TBD: allow some escapes (non-ascii chars).
320100966Siwasaki         * they will be handled in the string output routine
321100966Siwasaki         */
322100966Siwasaki
323100966Siwasaki        if (!ACPI_IS_PRINT (ByteData[i]))
324100966Siwasaki        {
325100966Siwasaki            return (FALSE);
326100966Siwasaki        }
327100966Siwasaki    }
328100966Siwasaki
329100966Siwasaki    return (TRUE);
330100966Siwasaki}
331100966Siwasaki
332100966Siwasaki
333100966Siwasaki/*******************************************************************************
334100966Siwasaki *
335100966Siwasaki * FUNCTION:    AcpiDmUnicode
336100966Siwasaki *
337100966Siwasaki * PARAMETERS:  Op              - Byte List op containing Unicode string
338100966Siwasaki *
339100966Siwasaki * RETURN:      None
340100966Siwasaki *
341100966Siwasaki * DESCRIPTION: Dump Unicode string as a standard ASCII string.  (Remove
342100966Siwasaki *              the extra zero bytes).
343100966Siwasaki *
344100966Siwasaki ******************************************************************************/
345100966Siwasaki
346151937Sjkimstatic void
347100966SiwasakiAcpiDmUnicode (
348100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
349100966Siwasaki{
350100966Siwasaki    UINT16                  *WordData;
351100966Siwasaki    UINT32                  WordCount;
352100966Siwasaki    UINT32                  i;
353100966Siwasaki
354100966Siwasaki
355100966Siwasaki    /* Extract the buffer info as a WORD buffer */
356100966Siwasaki
357100966Siwasaki    WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data);
358117521Snjl    WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer));
359100966Siwasaki
360100966Siwasaki
361100966Siwasaki    AcpiOsPrintf ("\"");
362100966Siwasaki
363100966Siwasaki    /* Write every other byte as an ASCII character */
364100966Siwasaki
365100966Siwasaki    for (i = 0; i < (WordCount - 1); i++)
366100966Siwasaki    {
367100966Siwasaki        AcpiOsPrintf ("%c", (int) WordData[i]);
368100966Siwasaki    }
369100966Siwasaki
370100966Siwasaki    AcpiOsPrintf ("\")");
371100966Siwasaki}
372100966Siwasaki
373100966Siwasaki
374100966Siwasaki/*******************************************************************************
375100966Siwasaki *
376193267Sjkim * FUNCTION:    AcpiDmIsEisaIdElement
377100966Siwasaki *
378100966Siwasaki * PARAMETERS:  Op              - Op to be examined
379100966Siwasaki *
380100966Siwasaki * RETURN:      None
381100966Siwasaki *
382193267Sjkim * DESCRIPTION: Determine if an Op (argument to _HID or _CID) can be converted
383193267Sjkim *              to an EISA ID.
384100966Siwasaki *
385100966Siwasaki ******************************************************************************/
386100966Siwasaki
387193267Sjkimstatic void
388193267SjkimAcpiDmIsEisaIdElement (
389100966Siwasaki    ACPI_PARSE_OBJECT       *Op)
390100966Siwasaki{
391100966Siwasaki    UINT32                  BigEndianId;
392100966Siwasaki    UINT32                  Prefix[3];
393193267Sjkim    UINT32                  i;
394100966Siwasaki
395100966Siwasaki
396100966Siwasaki    /* The parameter must be either a word or a dword */
397100966Siwasaki
398193267Sjkim    if ((Op->Common.AmlOpcode != AML_DWORD_OP) &&
399193267Sjkim        (Op->Common.AmlOpcode != AML_WORD_OP))
400100966Siwasaki    {
401100966Siwasaki        return;
402100966Siwasaki    }
403100966Siwasaki
404100966Siwasaki    /* Swap from little-endian to big-endian to simplify conversion */
405100966Siwasaki
406193267Sjkim    BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer);
407100966Siwasaki
408100966Siwasaki    /* Create the 3 leading ASCII letters */
409100966Siwasaki
410100966Siwasaki    Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40;
411100966Siwasaki    Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40;
412100966Siwasaki    Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40;
413100966Siwasaki
414100966Siwasaki    /* Verify that all 3 are ascii and alpha */
415100966Siwasaki
416100966Siwasaki    for (i = 0; i < 3; i++)
417100966Siwasaki    {
418100966Siwasaki        if (!ACPI_IS_ASCII (Prefix[i]) ||
419100966Siwasaki            !ACPI_IS_ALPHA (Prefix[i]))
420100966Siwasaki        {
421100966Siwasaki            return;
422100966Siwasaki        }
423100966Siwasaki    }
424100966Siwasaki
425100966Siwasaki    /* OK - mark this node as convertable to an EISA ID */
426100966Siwasaki
427193267Sjkim    Op->Common.DisasmOpcode = ACPI_DASM_EISAID;
428100966Siwasaki}
429100966Siwasaki
430100966Siwasaki
431100966Siwasaki/*******************************************************************************
432100966Siwasaki *
433193267Sjkim * FUNCTION:    AcpiDmIsEisaId
434193267Sjkim *
435193267Sjkim * PARAMETERS:  Op              - Op to be examined
436193267Sjkim *
437193267Sjkim * RETURN:      None
438193267Sjkim *
439193267Sjkim * DESCRIPTION: Determine if a Name() Op can be converted to an EisaId.
440193267Sjkim *
441193267Sjkim ******************************************************************************/
442193267Sjkim
443193267Sjkimvoid
444193267SjkimAcpiDmIsEisaId (
445193267Sjkim    ACPI_PARSE_OBJECT       *Op)
446193267Sjkim{
447193267Sjkim    UINT32                  Name;
448193267Sjkim    ACPI_PARSE_OBJECT       *NextOp;
449193267Sjkim
450193267Sjkim
451193267Sjkim    /* Get the NameSegment */
452193267Sjkim
453193267Sjkim    Name = AcpiPsGetName (Op);
454193267Sjkim    if (!Name)
455193267Sjkim    {
456193267Sjkim        return;
457193267Sjkim    }
458193267Sjkim
459193267Sjkim    NextOp = AcpiPsGetDepthNext (NULL, Op);
460193267Sjkim    if (!NextOp)
461193267Sjkim    {
462193267Sjkim        return;
463193267Sjkim    }
464193267Sjkim
465193267Sjkim    /* Check for _HID - has one argument */
466193267Sjkim
467193267Sjkim    if (ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID))
468193267Sjkim    {
469193267Sjkim        AcpiDmIsEisaIdElement (NextOp);
470193267Sjkim        return;
471193267Sjkim    }
472193267Sjkim
473193267Sjkim    /* Exit if not _CID */
474193267Sjkim
475193267Sjkim    if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__CID))
476193267Sjkim    {
477193267Sjkim        return;
478193267Sjkim    }
479193267Sjkim
480193267Sjkim    /* _CID can contain a single argument or a package */
481193267Sjkim
482193267Sjkim    if (NextOp->Common.AmlOpcode != AML_PACKAGE_OP)
483193267Sjkim    {
484193267Sjkim        AcpiDmIsEisaIdElement (NextOp);
485193267Sjkim        return;
486193267Sjkim    }
487193267Sjkim
488193267Sjkim    /* _CID with Package: get the package length */
489193267Sjkim
490193267Sjkim    NextOp = AcpiPsGetDepthNext (NULL, NextOp);
491193267Sjkim
492193267Sjkim    /* Don't need to use the length, just walk the peer list */
493193267Sjkim
494193267Sjkim    NextOp = NextOp->Common.Next;
495193267Sjkim    while (NextOp)
496193267Sjkim    {
497193267Sjkim        AcpiDmIsEisaIdElement (NextOp);
498193267Sjkim        NextOp = NextOp->Common.Next;
499193267Sjkim    }
500193267Sjkim}
501193267Sjkim
502193267Sjkim
503193267Sjkim/*******************************************************************************
504193267Sjkim *
505102550Siwasaki * FUNCTION:    AcpiDmEisaId
506100966Siwasaki *
507100966Siwasaki * PARAMETERS:  EncodedId       - Raw encoded EISA ID.
508100966Siwasaki *
509100966Siwasaki * RETURN:      None
510100966Siwasaki *
511100966Siwasaki * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String.
512100966Siwasaki *
513100966Siwasaki ******************************************************************************/
514100966Siwasaki
515100966Siwasakivoid
516100966SiwasakiAcpiDmEisaId (
517100966Siwasaki    UINT32                  EncodedId)
518100966Siwasaki{
519100966Siwasaki    UINT32                  BigEndianId;
520100966Siwasaki
521100966Siwasaki
522100966Siwasaki    /* Swap from little-endian to big-endian to simplify conversion */
523100966Siwasaki
524100966Siwasaki    BigEndianId = AcpiUtDwordByteSwap (EncodedId);
525100966Siwasaki
526100966Siwasaki
527100966Siwasaki    /* Split to form "AAANNNN" string */
528100966Siwasaki
529100966Siwasaki    AcpiOsPrintf ("EisaId (\"%c%c%c%4.4X\")",
530100966Siwasaki
531100966Siwasaki        /* Three Alpha characters (AAA), 5 bits each */
532100966Siwasaki
533100966Siwasaki        (int) ((BigEndianId >> 26) & 0x1F) + 0x40,
534100966Siwasaki        (int) ((BigEndianId >> 21) & 0x1F) + 0x40,
535100966Siwasaki        (int) ((BigEndianId >> 16) & 0x1F) + 0x40,
536100966Siwasaki
537100966Siwasaki        /* Numeric part (NNNN) is simply the lower 16 bits */
538100966Siwasaki
539100966Siwasaki        (UINT32) (BigEndianId & 0xFFFF));
540100966Siwasaki}
541100966Siwasaki
542100966Siwasaki#endif
543