dmbuffer.c revision 1.4 1 1.1 jruoho /*******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: dmbuffer - AML disassembler, buffer and string support
4 1.1 jruoho *
5 1.1 jruoho ******************************************************************************/
6 1.1 jruoho
7 1.2 christos /*
8 1.4 christos * Copyright (C) 2000 - 2016, Intel Corp.
9 1.1 jruoho * All rights reserved.
10 1.1 jruoho *
11 1.2 christos * Redistribution and use in source and binary forms, with or without
12 1.2 christos * modification, are permitted provided that the following conditions
13 1.2 christos * are met:
14 1.2 christos * 1. Redistributions of source code must retain the above copyright
15 1.2 christos * notice, this list of conditions, and the following disclaimer,
16 1.2 christos * without modification.
17 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below
19 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon
20 1.2 christos * including a substantially similar Disclaimer requirement for further
21 1.2 christos * binary redistribution.
22 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names
23 1.2 christos * of any contributors may be used to endorse or promote products derived
24 1.2 christos * from this software without specific prior written permission.
25 1.2 christos *
26 1.2 christos * Alternatively, this software may be distributed under the terms of the
27 1.2 christos * GNU General Public License ("GPL") version 2 as published by the Free
28 1.2 christos * Software Foundation.
29 1.2 christos *
30 1.2 christos * NO WARRANTY
31 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 1.2 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 1.2 christos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 1.2 christos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 1.2 christos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 1.2 christos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 1.2 christos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 1.2 christos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 1.2 christos * POSSIBILITY OF SUCH DAMAGES.
42 1.2 christos */
43 1.1 jruoho
44 1.1 jruoho #include "acpi.h"
45 1.1 jruoho #include "accommon.h"
46 1.2 christos #include "acutils.h"
47 1.1 jruoho #include "acdisasm.h"
48 1.1 jruoho #include "acparser.h"
49 1.1 jruoho #include "amlcode.h"
50 1.2 christos #include "acinterp.h"
51 1.1 jruoho
52 1.1 jruoho
53 1.1 jruoho #define _COMPONENT ACPI_CA_DEBUGGER
54 1.1 jruoho ACPI_MODULE_NAME ("dmbuffer")
55 1.1 jruoho
56 1.1 jruoho /* Local prototypes */
57 1.1 jruoho
58 1.1 jruoho static void
59 1.2 christos AcpiDmUuid (
60 1.2 christos ACPI_PARSE_OBJECT *Op);
61 1.2 christos
62 1.2 christos static void
63 1.1 jruoho AcpiDmUnicode (
64 1.1 jruoho ACPI_PARSE_OBJECT *Op);
65 1.1 jruoho
66 1.1 jruoho static void
67 1.2 christos AcpiDmGetHardwareIdType (
68 1.1 jruoho ACPI_PARSE_OBJECT *Op);
69 1.1 jruoho
70 1.2 christos static void
71 1.2 christos AcpiDmPldBuffer (
72 1.2 christos UINT32 Level,
73 1.2 christos UINT8 *ByteData,
74 1.2 christos UINT32 ByteCount);
75 1.2 christos
76 1.2 christos
77 1.2 christos #define ACPI_BUFFER_BYTES_PER_LINE 8
78 1.2 christos
79 1.2 christos
80 1.2 christos /* Strings for ToPld */
81 1.2 christos
82 1.2 christos static const char *DmPanelList[] =
83 1.2 christos {
84 1.2 christos "TOP",
85 1.2 christos "BOTTOM",
86 1.2 christos "LEFT",
87 1.2 christos "RIGHT",
88 1.2 christos "FRONT",
89 1.2 christos "BACK",
90 1.2 christos "UNKNOWN",
91 1.2 christos NULL
92 1.2 christos };
93 1.2 christos
94 1.2 christos static const char *DmVerticalPositionList[] =
95 1.2 christos {
96 1.2 christos "UPPER",
97 1.2 christos "CENTER",
98 1.2 christos "LOWER",
99 1.2 christos NULL
100 1.2 christos };
101 1.2 christos
102 1.2 christos static const char *DmHorizontalPositionList[] =
103 1.2 christos {
104 1.2 christos "LEFT",
105 1.2 christos "CENTER",
106 1.2 christos "RIGHT",
107 1.2 christos NULL
108 1.2 christos };
109 1.2 christos
110 1.2 christos static const char *DmShapeList[] =
111 1.2 christos {
112 1.2 christos "ROUND",
113 1.2 christos "OVAL",
114 1.2 christos "SQUARE",
115 1.2 christos "VERTICALRECTANGLE",
116 1.2 christos "HORIZONTALRECTANGLE",
117 1.2 christos "VERTICALTRAPEZOID",
118 1.2 christos "HORIZONTALTRAPEZOID",
119 1.2 christos "UNKNOWN",
120 1.2 christos "CHAMFERED",
121 1.2 christos NULL
122 1.2 christos };
123 1.2 christos
124 1.1 jruoho
125 1.1 jruoho /*******************************************************************************
126 1.1 jruoho *
127 1.1 jruoho * FUNCTION: AcpiDmDisasmByteList
128 1.1 jruoho *
129 1.1 jruoho * PARAMETERS: Level - Current source code indentation level
130 1.1 jruoho * ByteData - Pointer to the byte list
131 1.1 jruoho * ByteCount - Length of the byte list
132 1.1 jruoho *
133 1.1 jruoho * RETURN: None
134 1.1 jruoho *
135 1.1 jruoho * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed
136 1.1 jruoho * with the hex buffer offset.
137 1.1 jruoho *
138 1.1 jruoho ******************************************************************************/
139 1.1 jruoho
140 1.1 jruoho void
141 1.1 jruoho AcpiDmDisasmByteList (
142 1.1 jruoho UINT32 Level,
143 1.1 jruoho UINT8 *ByteData,
144 1.1 jruoho UINT32 ByteCount)
145 1.1 jruoho {
146 1.1 jruoho UINT32 i;
147 1.2 christos UINT32 j;
148 1.2 christos UINT32 CurrentIndex;
149 1.2 christos UINT8 BufChar;
150 1.1 jruoho
151 1.1 jruoho
152 1.1 jruoho if (!ByteCount)
153 1.1 jruoho {
154 1.1 jruoho return;
155 1.1 jruoho }
156 1.1 jruoho
157 1.2 christos for (i = 0; i < ByteCount; i += ACPI_BUFFER_BYTES_PER_LINE)
158 1.2 christos {
159 1.2 christos /* Line indent and offset prefix for each new line */
160 1.2 christos
161 1.2 christos AcpiDmIndent (Level);
162 1.2 christos if (ByteCount > ACPI_BUFFER_BYTES_PER_LINE)
163 1.2 christos {
164 1.2 christos AcpiOsPrintf ("/* %04X */ ", i);
165 1.2 christos }
166 1.1 jruoho
167 1.2 christos /* Dump the actual hex values */
168 1.1 jruoho
169 1.2 christos for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
170 1.1 jruoho {
171 1.2 christos CurrentIndex = i + j;
172 1.2 christos if (CurrentIndex >= ByteCount)
173 1.1 jruoho {
174 1.2 christos /* Dump fill spaces */
175 1.2 christos
176 1.2 christos AcpiOsPrintf (" ");
177 1.2 christos continue;
178 1.1 jruoho }
179 1.1 jruoho
180 1.2 christos AcpiOsPrintf (" 0x%2.2X", ByteData[CurrentIndex]);
181 1.2 christos
182 1.2 christos /* Add comma if there are more bytes to display */
183 1.2 christos
184 1.2 christos if (CurrentIndex < (ByteCount - 1))
185 1.1 jruoho {
186 1.2 christos AcpiOsPrintf (",");
187 1.2 christos }
188 1.2 christos else
189 1.2 christos {
190 1.2 christos AcpiOsPrintf (" ");
191 1.1 jruoho }
192 1.1 jruoho }
193 1.1 jruoho
194 1.2 christos /* Dump the ASCII equivalents within a comment */
195 1.1 jruoho
196 1.2 christos AcpiOsPrintf (" /* ");
197 1.2 christos for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
198 1.2 christos {
199 1.2 christos CurrentIndex = i + j;
200 1.2 christos if (CurrentIndex >= ByteCount)
201 1.2 christos {
202 1.2 christos break;
203 1.2 christos }
204 1.1 jruoho
205 1.2 christos BufChar = ByteData[CurrentIndex];
206 1.3 christos if (isprint (BufChar))
207 1.2 christos {
208 1.2 christos AcpiOsPrintf ("%c", BufChar);
209 1.2 christos }
210 1.2 christos else
211 1.2 christos {
212 1.2 christos AcpiOsPrintf (".");
213 1.2 christos }
214 1.1 jruoho }
215 1.1 jruoho
216 1.2 christos /* Finished with this line */
217 1.2 christos
218 1.2 christos AcpiOsPrintf (" */\n");
219 1.1 jruoho }
220 1.1 jruoho }
221 1.1 jruoho
222 1.1 jruoho
223 1.1 jruoho /*******************************************************************************
224 1.1 jruoho *
225 1.1 jruoho * FUNCTION: AcpiDmByteList
226 1.1 jruoho *
227 1.1 jruoho * PARAMETERS: Info - Parse tree walk info
228 1.1 jruoho * Op - Byte list op
229 1.1 jruoho *
230 1.1 jruoho * RETURN: None
231 1.1 jruoho *
232 1.1 jruoho * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers.
233 1.1 jruoho * Buffer type must be already set in the Op DisasmOpcode.
234 1.1 jruoho *
235 1.1 jruoho ******************************************************************************/
236 1.1 jruoho
237 1.1 jruoho void
238 1.1 jruoho AcpiDmByteList (
239 1.1 jruoho ACPI_OP_WALK_INFO *Info,
240 1.1 jruoho ACPI_PARSE_OBJECT *Op)
241 1.1 jruoho {
242 1.1 jruoho UINT8 *ByteData;
243 1.1 jruoho UINT32 ByteCount;
244 1.1 jruoho
245 1.1 jruoho
246 1.1 jruoho ByteData = Op->Named.Data;
247 1.1 jruoho ByteCount = (UINT32) Op->Common.Value.Integer;
248 1.1 jruoho
249 1.1 jruoho /*
250 1.1 jruoho * The byte list belongs to a buffer, and can be produced by either
251 1.1 jruoho * a ResourceTemplate, Unicode, quoted string, or a plain byte list.
252 1.1 jruoho */
253 1.1 jruoho switch (Op->Common.Parent->Common.DisasmOpcode)
254 1.1 jruoho {
255 1.1 jruoho case ACPI_DASM_RESOURCE:
256 1.1 jruoho
257 1.4 christos AcpiDmResourceTemplate (
258 1.4 christos Info, Op->Common.Parent, ByteData, ByteCount);
259 1.1 jruoho break;
260 1.1 jruoho
261 1.1 jruoho case ACPI_DASM_STRING:
262 1.1 jruoho
263 1.1 jruoho AcpiDmIndent (Info->Level);
264 1.2 christos AcpiUtPrintString ((char *) ByteData, ACPI_UINT16_MAX);
265 1.1 jruoho AcpiOsPrintf ("\n");
266 1.1 jruoho break;
267 1.1 jruoho
268 1.2 christos case ACPI_DASM_UUID:
269 1.2 christos
270 1.2 christos AcpiDmUuid (Op);
271 1.2 christos break;
272 1.2 christos
273 1.1 jruoho case ACPI_DASM_UNICODE:
274 1.1 jruoho
275 1.1 jruoho AcpiDmUnicode (Op);
276 1.1 jruoho break;
277 1.1 jruoho
278 1.2 christos case ACPI_DASM_PLD_METHOD:
279 1.2 christos #if 0
280 1.2 christos AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount);
281 1.2 christos #endif
282 1.2 christos AcpiDmPldBuffer (Info->Level, ByteData, ByteCount);
283 1.2 christos break;
284 1.2 christos
285 1.1 jruoho case ACPI_DASM_BUFFER:
286 1.1 jruoho default:
287 1.1 jruoho /*
288 1.1 jruoho * Not a resource, string, or unicode string.
289 1.1 jruoho * Just dump the buffer
290 1.1 jruoho */
291 1.1 jruoho AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount);
292 1.1 jruoho break;
293 1.1 jruoho }
294 1.1 jruoho }
295 1.1 jruoho
296 1.1 jruoho
297 1.1 jruoho /*******************************************************************************
298 1.1 jruoho *
299 1.2 christos * FUNCTION: AcpiDmIsUuidBuffer
300 1.2 christos *
301 1.2 christos * PARAMETERS: Op - Buffer Object to be examined
302 1.2 christos *
303 1.2 christos * RETURN: TRUE if buffer contains a UUID
304 1.2 christos *
305 1.2 christos * DESCRIPTION: Determine if a buffer Op contains a UUID
306 1.2 christos *
307 1.2 christos * To help determine whether the buffer is a UUID versus a raw data buffer,
308 1.2 christos * there a are a couple bytes we can look at:
309 1.2 christos *
310 1.2 christos * xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
311 1.2 christos *
312 1.2 christos * The variant covered by the UUID specification is indicated by the two most
313 1.2 christos * significant bits of N being 1 0 (i.e., the hexadecimal N will always be
314 1.2 christos * 8, 9, A, or B).
315 1.2 christos *
316 1.2 christos * The variant covered by the UUID specification has five versions. For this
317 1.2 christos * variant, the four bits of M indicates the UUID version (i.e., the
318 1.2 christos * hexadecimal M will be either 1, 2, 3, 4, or 5).
319 1.2 christos *
320 1.2 christos ******************************************************************************/
321 1.2 christos
322 1.2 christos BOOLEAN
323 1.2 christos AcpiDmIsUuidBuffer (
324 1.2 christos ACPI_PARSE_OBJECT *Op)
325 1.2 christos {
326 1.2 christos UINT8 *ByteData;
327 1.2 christos UINT32 ByteCount;
328 1.2 christos ACPI_PARSE_OBJECT *SizeOp;
329 1.2 christos ACPI_PARSE_OBJECT *NextOp;
330 1.2 christos
331 1.2 christos
332 1.2 christos /* Buffer size is the buffer argument */
333 1.2 christos
334 1.2 christos SizeOp = Op->Common.Value.Arg;
335 1.2 christos
336 1.2 christos /* Next, the initializer byte list to examine */
337 1.2 christos
338 1.2 christos NextOp = SizeOp->Common.Next;
339 1.2 christos if (!NextOp)
340 1.2 christos {
341 1.2 christos return (FALSE);
342 1.2 christos }
343 1.2 christos
344 1.2 christos /* Extract the byte list info */
345 1.2 christos
346 1.2 christos ByteData = NextOp->Named.Data;
347 1.2 christos ByteCount = (UINT32) NextOp->Common.Value.Integer;
348 1.2 christos
349 1.2 christos /* Byte count must be exactly 16 */
350 1.2 christos
351 1.2 christos if (ByteCount != UUID_BUFFER_LENGTH)
352 1.2 christos {
353 1.2 christos return (FALSE);
354 1.2 christos }
355 1.2 christos
356 1.2 christos /* Check for valid "M" and "N" values (see function header above) */
357 1.2 christos
358 1.2 christos if (((ByteData[7] & 0xF0) == 0x00) || /* M={1,2,3,4,5} */
359 1.2 christos ((ByteData[7] & 0xF0) > 0x50) ||
360 1.2 christos ((ByteData[8] & 0xF0) < 0x80) || /* N={8,9,A,B} */
361 1.2 christos ((ByteData[8] & 0xF0) > 0xB0))
362 1.2 christos {
363 1.2 christos return (FALSE);
364 1.2 christos }
365 1.2 christos
366 1.2 christos /* Ignore the Size argument in the disassembly of this buffer op */
367 1.2 christos
368 1.2 christos SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
369 1.2 christos return (TRUE);
370 1.2 christos }
371 1.2 christos
372 1.2 christos
373 1.2 christos /*******************************************************************************
374 1.2 christos *
375 1.2 christos * FUNCTION: AcpiDmUuid
376 1.2 christos *
377 1.2 christos * PARAMETERS: Op - Byte List op containing a UUID
378 1.2 christos *
379 1.2 christos * RETURN: None
380 1.2 christos *
381 1.2 christos * DESCRIPTION: Dump a buffer containing a UUID as a standard ASCII string.
382 1.2 christos *
383 1.2 christos * Output Format:
384 1.2 christos * In its canonical form, the UUID is represented by a string containing 32
385 1.2 christos * lowercase hexadecimal digits, displayed in 5 groups separated by hyphens.
386 1.2 christos * The complete form is 8-4-4-4-12 for a total of 36 characters (32
387 1.2 christos * alphanumeric characters representing hex digits and 4 hyphens). In bytes,
388 1.2 christos * 4-2-2-2-6. Example:
389 1.2 christos *
390 1.2 christos * ToUUID ("107ededd-d381-4fd7-8da9-08e9a6c79644")
391 1.2 christos *
392 1.2 christos ******************************************************************************/
393 1.2 christos
394 1.2 christos static void
395 1.2 christos AcpiDmUuid (
396 1.2 christos ACPI_PARSE_OBJECT *Op)
397 1.2 christos {
398 1.2 christos UINT8 *Data;
399 1.2 christos const char *Description;
400 1.2 christos
401 1.2 christos
402 1.2 christos Data = ACPI_CAST_PTR (UINT8, Op->Named.Data);
403 1.2 christos
404 1.2 christos /* Emit the 36-byte UUID string in the proper format/order */
405 1.2 christos
406 1.2 christos AcpiOsPrintf (
407 1.2 christos "\"%2.2x%2.2x%2.2x%2.2x-"
408 1.2 christos "%2.2x%2.2x-"
409 1.2 christos "%2.2x%2.2x-"
410 1.2 christos "%2.2x%2.2x-"
411 1.2 christos "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\")",
412 1.2 christos Data[3], Data[2], Data[1], Data[0],
413 1.2 christos Data[5], Data[4],
414 1.2 christos Data[7], Data[6],
415 1.2 christos Data[8], Data[9],
416 1.2 christos Data[10], Data[11], Data[12], Data[13], Data[14], Data[15]);
417 1.2 christos
418 1.2 christos /* Dump the UUID description string if available */
419 1.2 christos
420 1.2 christos Description = AcpiAhMatchUuid (Data);
421 1.2 christos if (Description)
422 1.2 christos {
423 1.2 christos AcpiOsPrintf (" /* %s */", Description);
424 1.2 christos }
425 1.2 christos }
426 1.2 christos
427 1.2 christos
428 1.2 christos /*******************************************************************************
429 1.2 christos *
430 1.1 jruoho * FUNCTION: AcpiDmIsUnicodeBuffer
431 1.1 jruoho *
432 1.1 jruoho * PARAMETERS: Op - Buffer Object to be examined
433 1.1 jruoho *
434 1.1 jruoho * RETURN: TRUE if buffer contains a UNICODE string
435 1.1 jruoho *
436 1.1 jruoho * DESCRIPTION: Determine if a buffer Op contains a Unicode string
437 1.1 jruoho *
438 1.1 jruoho ******************************************************************************/
439 1.1 jruoho
440 1.1 jruoho BOOLEAN
441 1.1 jruoho AcpiDmIsUnicodeBuffer (
442 1.1 jruoho ACPI_PARSE_OBJECT *Op)
443 1.1 jruoho {
444 1.1 jruoho UINT8 *ByteData;
445 1.1 jruoho UINT32 ByteCount;
446 1.1 jruoho UINT32 WordCount;
447 1.1 jruoho ACPI_PARSE_OBJECT *SizeOp;
448 1.1 jruoho ACPI_PARSE_OBJECT *NextOp;
449 1.1 jruoho UINT32 i;
450 1.1 jruoho
451 1.1 jruoho
452 1.1 jruoho /* Buffer size is the buffer argument */
453 1.1 jruoho
454 1.1 jruoho SizeOp = Op->Common.Value.Arg;
455 1.1 jruoho
456 1.1 jruoho /* Next, the initializer byte list to examine */
457 1.1 jruoho
458 1.1 jruoho NextOp = SizeOp->Common.Next;
459 1.1 jruoho if (!NextOp)
460 1.1 jruoho {
461 1.1 jruoho return (FALSE);
462 1.1 jruoho }
463 1.1 jruoho
464 1.1 jruoho /* Extract the byte list info */
465 1.1 jruoho
466 1.1 jruoho ByteData = NextOp->Named.Data;
467 1.1 jruoho ByteCount = (UINT32) NextOp->Common.Value.Integer;
468 1.1 jruoho WordCount = ACPI_DIV_2 (ByteCount);
469 1.1 jruoho
470 1.1 jruoho /*
471 1.1 jruoho * Unicode string must have an even number of bytes and last
472 1.1 jruoho * word must be zero
473 1.1 jruoho */
474 1.1 jruoho if ((!ByteCount) ||
475 1.1 jruoho (ByteCount < 4) ||
476 1.1 jruoho (ByteCount & 1) ||
477 1.1 jruoho ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0)
478 1.1 jruoho {
479 1.1 jruoho return (FALSE);
480 1.1 jruoho }
481 1.1 jruoho
482 1.2 christos /* For each word, 1st byte must be ascii (1-0x7F), 2nd byte must be zero */
483 1.1 jruoho
484 1.1 jruoho for (i = 0; i < (ByteCount - 2); i += 2)
485 1.1 jruoho {
486 1.2 christos if ((ByteData[i] == 0) ||
487 1.2 christos (ByteData[i] > 0x7F) ||
488 1.1 jruoho (ByteData[(ACPI_SIZE) i + 1] != 0))
489 1.1 jruoho {
490 1.1 jruoho return (FALSE);
491 1.1 jruoho }
492 1.1 jruoho }
493 1.1 jruoho
494 1.1 jruoho /* Ignore the Size argument in the disassembly of this buffer op */
495 1.1 jruoho
496 1.1 jruoho SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
497 1.1 jruoho return (TRUE);
498 1.1 jruoho }
499 1.1 jruoho
500 1.1 jruoho
501 1.1 jruoho /*******************************************************************************
502 1.1 jruoho *
503 1.1 jruoho * FUNCTION: AcpiDmIsStringBuffer
504 1.1 jruoho *
505 1.1 jruoho * PARAMETERS: Op - Buffer Object to be examined
506 1.1 jruoho *
507 1.1 jruoho * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise
508 1.1 jruoho *
509 1.1 jruoho * DESCRIPTION: Determine if a buffer Op contains a ASCII string
510 1.1 jruoho *
511 1.1 jruoho ******************************************************************************/
512 1.1 jruoho
513 1.1 jruoho BOOLEAN
514 1.1 jruoho AcpiDmIsStringBuffer (
515 1.1 jruoho ACPI_PARSE_OBJECT *Op)
516 1.1 jruoho {
517 1.1 jruoho UINT8 *ByteData;
518 1.1 jruoho UINT32 ByteCount;
519 1.1 jruoho ACPI_PARSE_OBJECT *SizeOp;
520 1.1 jruoho ACPI_PARSE_OBJECT *NextOp;
521 1.1 jruoho UINT32 i;
522 1.1 jruoho
523 1.1 jruoho
524 1.1 jruoho /* Buffer size is the buffer argument */
525 1.1 jruoho
526 1.1 jruoho SizeOp = Op->Common.Value.Arg;
527 1.1 jruoho
528 1.1 jruoho /* Next, the initializer byte list to examine */
529 1.1 jruoho
530 1.1 jruoho NextOp = SizeOp->Common.Next;
531 1.1 jruoho if (!NextOp)
532 1.1 jruoho {
533 1.1 jruoho return (FALSE);
534 1.1 jruoho }
535 1.1 jruoho
536 1.1 jruoho /* Extract the byte list info */
537 1.1 jruoho
538 1.1 jruoho ByteData = NextOp->Named.Data;
539 1.1 jruoho ByteCount = (UINT32) NextOp->Common.Value.Integer;
540 1.1 jruoho
541 1.1 jruoho /* Last byte must be the null terminator */
542 1.1 jruoho
543 1.1 jruoho if ((!ByteCount) ||
544 1.1 jruoho (ByteCount < 2) ||
545 1.1 jruoho (ByteData[ByteCount-1] != 0))
546 1.1 jruoho {
547 1.1 jruoho return (FALSE);
548 1.1 jruoho }
549 1.1 jruoho
550 1.1 jruoho for (i = 0; i < (ByteCount - 1); i++)
551 1.1 jruoho {
552 1.1 jruoho /* TBD: allow some escapes (non-ascii chars).
553 1.1 jruoho * they will be handled in the string output routine
554 1.1 jruoho */
555 1.1 jruoho
556 1.3 christos if (!isprint (ByteData[i]))
557 1.1 jruoho {
558 1.1 jruoho return (FALSE);
559 1.1 jruoho }
560 1.1 jruoho }
561 1.1 jruoho
562 1.1 jruoho return (TRUE);
563 1.1 jruoho }
564 1.1 jruoho
565 1.1 jruoho
566 1.1 jruoho /*******************************************************************************
567 1.1 jruoho *
568 1.2 christos * FUNCTION: AcpiDmIsPldBuffer
569 1.2 christos *
570 1.2 christos * PARAMETERS: Op - Buffer Object to be examined
571 1.2 christos *
572 1.2 christos * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise
573 1.2 christos *
574 1.2 christos * DESCRIPTION: Determine if a buffer Op contains a _PLD structure
575 1.2 christos *
576 1.2 christos ******************************************************************************/
577 1.2 christos
578 1.2 christos BOOLEAN
579 1.2 christos AcpiDmIsPldBuffer (
580 1.2 christos ACPI_PARSE_OBJECT *Op)
581 1.2 christos {
582 1.2 christos ACPI_NAMESPACE_NODE *Node;
583 1.2 christos ACPI_PARSE_OBJECT *SizeOp;
584 1.2 christos ACPI_PARSE_OBJECT *ParentOp;
585 1.2 christos
586 1.2 christos
587 1.2 christos /* Buffer size is the buffer argument */
588 1.2 christos
589 1.2 christos SizeOp = Op->Common.Value.Arg;
590 1.2 christos
591 1.2 christos ParentOp = Op->Common.Parent;
592 1.2 christos if (!ParentOp)
593 1.2 christos {
594 1.2 christos return (FALSE);
595 1.2 christos }
596 1.2 christos
597 1.2 christos /* Check for form: Name(_PLD, Buffer() {}). Not legal, however */
598 1.2 christos
599 1.2 christos if (ParentOp->Common.AmlOpcode == AML_NAME_OP)
600 1.2 christos {
601 1.2 christos Node = ParentOp->Common.Node;
602 1.2 christos
603 1.2 christos if (ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__PLD))
604 1.2 christos {
605 1.2 christos /* Ignore the Size argument in the disassembly of this buffer op */
606 1.2 christos
607 1.2 christos SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
608 1.2 christos return (TRUE);
609 1.2 christos }
610 1.2 christos
611 1.2 christos return (FALSE);
612 1.2 christos }
613 1.2 christos
614 1.2 christos /* Check for proper form: Name(_PLD, Package() {Buffer() {}}) */
615 1.2 christos
616 1.2 christos if (ParentOp->Common.AmlOpcode == AML_PACKAGE_OP)
617 1.2 christos {
618 1.2 christos ParentOp = ParentOp->Common.Parent;
619 1.2 christos if (!ParentOp)
620 1.2 christos {
621 1.2 christos return (FALSE);
622 1.2 christos }
623 1.2 christos
624 1.2 christos if (ParentOp->Common.AmlOpcode == AML_NAME_OP)
625 1.2 christos {
626 1.2 christos Node = ParentOp->Common.Node;
627 1.2 christos
628 1.2 christos if (ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__PLD))
629 1.2 christos {
630 1.2 christos /* Ignore the Size argument in the disassembly of this buffer op */
631 1.2 christos
632 1.2 christos SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
633 1.2 christos return (TRUE);
634 1.2 christos }
635 1.2 christos }
636 1.2 christos }
637 1.2 christos
638 1.2 christos return (FALSE);
639 1.2 christos }
640 1.2 christos
641 1.2 christos
642 1.2 christos /*******************************************************************************
643 1.2 christos *
644 1.2 christos * FUNCTION: AcpiDmFindNameByIndex
645 1.2 christos *
646 1.2 christos * PARAMETERS: Index - Index of array to check
647 1.2 christos * List - Array to reference
648 1.2 christos *
649 1.2 christos * RETURN: String from List or empty string
650 1.2 christos *
651 1.2 christos * DESCRIPTION: Finds and returns the char string located at the given index
652 1.2 christos * position in List.
653 1.2 christos *
654 1.2 christos ******************************************************************************/
655 1.2 christos
656 1.2 christos static const char *
657 1.2 christos AcpiDmFindNameByIndex (
658 1.2 christos UINT64 Index,
659 1.2 christos const char **List)
660 1.2 christos {
661 1.2 christos const char *Str;
662 1.2 christos UINT32 i;
663 1.2 christos
664 1.2 christos
665 1.2 christos /* Bounds check */
666 1.2 christos
667 1.2 christos Str = List[0];
668 1.2 christos i = 0;
669 1.2 christos
670 1.2 christos while(Str)
671 1.2 christos {
672 1.2 christos i++;
673 1.2 christos Str = List[i];
674 1.2 christos }
675 1.2 christos
676 1.2 christos if (Index >= i)
677 1.2 christos {
678 1.2 christos /* TBD: Add error msg */
679 1.2 christos
680 1.2 christos return ("");
681 1.2 christos }
682 1.2 christos
683 1.2 christos return (List[Index]);
684 1.2 christos }
685 1.2 christos
686 1.2 christos
687 1.2 christos /*******************************************************************************
688 1.2 christos *
689 1.2 christos * FUNCTION: AcpiDmPldBuffer
690 1.2 christos *
691 1.2 christos * PARAMETERS: Level - Current source code indentation level
692 1.2 christos * ByteData - Pointer to the byte list
693 1.2 christos * ByteCount - Length of the byte list
694 1.2 christos *
695 1.2 christos * RETURN: None
696 1.2 christos *
697 1.2 christos * DESCRIPTION: Dump and format the contents of a _PLD buffer object
698 1.2 christos *
699 1.2 christos ******************************************************************************/
700 1.2 christos
701 1.2 christos #define ACPI_PLD_OUTPUT08 "%*.s%-18s = 0x%X,\n", ACPI_MUL_4 (Level), " "
702 1.2 christos #define ACPI_PLD_OUTPUT08P "%*.s%-18s = 0x%X)\n", ACPI_MUL_4 (Level), " "
703 1.2 christos #define ACPI_PLD_OUTPUT16 "%*.s%-18s = 0x%X,\n", ACPI_MUL_4 (Level), " "
704 1.2 christos #define ACPI_PLD_OUTPUT16P "%*.s%-18s = 0x%X)\n", ACPI_MUL_4 (Level), " "
705 1.2 christos #define ACPI_PLD_OUTPUT24 "%*.s%-18s = 0x%X,\n", ACPI_MUL_4 (Level), " "
706 1.2 christos #define ACPI_PLD_OUTPUTSTR "%*.s%-18s = \"%s\",\n", ACPI_MUL_4 (Level), " "
707 1.2 christos
708 1.2 christos static void
709 1.2 christos AcpiDmPldBuffer (
710 1.2 christos UINT32 Level,
711 1.2 christos UINT8 *ByteData,
712 1.2 christos UINT32 ByteCount)
713 1.2 christos {
714 1.2 christos ACPI_PLD_INFO *PldInfo;
715 1.2 christos ACPI_STATUS Status;
716 1.2 christos
717 1.2 christos
718 1.2 christos /* Check for valid byte count */
719 1.2 christos
720 1.2 christos if (ByteCount < ACPI_PLD_REV1_BUFFER_SIZE)
721 1.2 christos {
722 1.2 christos return;
723 1.2 christos }
724 1.2 christos
725 1.2 christos /* Convert _PLD buffer to local _PLD struct */
726 1.2 christos
727 1.2 christos Status = AcpiDecodePldBuffer (ByteData, ByteCount, &PldInfo);
728 1.2 christos if (ACPI_FAILURE (Status))
729 1.2 christos {
730 1.2 christos return;
731 1.2 christos }
732 1.2 christos
733 1.2 christos AcpiOsPrintf ("\n");
734 1.2 christos
735 1.2 christos /* First 32-bit dword */
736 1.2 christos
737 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Revision", PldInfo->Revision);
738 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_IgnoreColor", PldInfo->IgnoreColor);
739 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Red", PldInfo->Red);
740 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Green", PldInfo->Green);
741 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Blue", PldInfo->Blue);
742 1.2 christos
743 1.2 christos /* Second 32-bit dword */
744 1.2 christos
745 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT16, "PLD_Width", PldInfo->Width);
746 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT16, "PLD_Height", PldInfo->Height);
747 1.2 christos
748 1.2 christos /* Third 32-bit dword */
749 1.2 christos
750 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_UserVisible", PldInfo->UserVisible);
751 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Dock", PldInfo->Dock);
752 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Lid", PldInfo->Lid);
753 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_Panel",
754 1.2 christos AcpiDmFindNameByIndex(PldInfo->Panel, DmPanelList));
755 1.4 christos
756 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_VerticalPosition",
757 1.2 christos AcpiDmFindNameByIndex(PldInfo->VerticalPosition, DmVerticalPositionList));
758 1.4 christos
759 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_HorizontalPosition",
760 1.2 christos AcpiDmFindNameByIndex(PldInfo->HorizontalPosition, DmHorizontalPositionList));
761 1.4 christos
762 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_Shape",
763 1.2 christos AcpiDmFindNameByIndex(PldInfo->Shape, DmShapeList));
764 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_GroupOrientation", PldInfo->GroupOrientation);
765 1.4 christos
766 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_GroupToken", PldInfo->GroupToken);
767 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_GroupPosition", PldInfo->GroupPosition);
768 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Bay", PldInfo->Bay);
769 1.2 christos
770 1.2 christos /* Fourth 32-bit dword */
771 1.2 christos
772 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Ejectable", PldInfo->Ejectable);
773 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_EjectRequired", PldInfo->OspmEjectRequired);
774 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_CabinetNumber", PldInfo->CabinetNumber);
775 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_CardCageNumber", PldInfo->CardCageNumber);
776 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Reference", PldInfo->Reference);
777 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Rotation", PldInfo->Rotation);
778 1.2 christos
779 1.4 christos if (ByteCount >= ACPI_PLD_REV2_BUFFER_SIZE)
780 1.2 christos {
781 1.2 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Order", PldInfo->Order);
782 1.2 christos
783 1.4 christos /* Fifth 32-bit dword */
784 1.2 christos
785 1.4 christos AcpiOsPrintf (ACPI_PLD_OUTPUT16, "PLD_VerticalOffset", PldInfo->VerticalOffset);
786 1.4 christos AcpiOsPrintf (ACPI_PLD_OUTPUT16P, "PLD_HorizontalOffset", PldInfo->HorizontalOffset);
787 1.4 christos }
788 1.4 christos else /* Rev 1 buffer */
789 1.2 christos {
790 1.4 christos AcpiOsPrintf (ACPI_PLD_OUTPUT08P, "PLD_Order", PldInfo->Order);
791 1.2 christos }
792 1.2 christos
793 1.2 christos ACPI_FREE (PldInfo);
794 1.2 christos }
795 1.2 christos
796 1.2 christos
797 1.2 christos /*******************************************************************************
798 1.2 christos *
799 1.1 jruoho * FUNCTION: AcpiDmUnicode
800 1.1 jruoho *
801 1.1 jruoho * PARAMETERS: Op - Byte List op containing Unicode string
802 1.1 jruoho *
803 1.1 jruoho * RETURN: None
804 1.1 jruoho *
805 1.2 christos * DESCRIPTION: Dump Unicode string as a standard ASCII string. (Remove
806 1.1 jruoho * the extra zero bytes).
807 1.1 jruoho *
808 1.1 jruoho ******************************************************************************/
809 1.1 jruoho
810 1.1 jruoho static void
811 1.1 jruoho AcpiDmUnicode (
812 1.1 jruoho ACPI_PARSE_OBJECT *Op)
813 1.1 jruoho {
814 1.1 jruoho UINT16 *WordData;
815 1.1 jruoho UINT32 WordCount;
816 1.1 jruoho UINT32 i;
817 1.2 christos int OutputValue;
818 1.1 jruoho
819 1.1 jruoho
820 1.1 jruoho /* Extract the buffer info as a WORD buffer */
821 1.1 jruoho
822 1.1 jruoho WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data);
823 1.1 jruoho WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer));
824 1.1 jruoho
825 1.2 christos /* Write every other byte as an ASCII character */
826 1.1 jruoho
827 1.1 jruoho AcpiOsPrintf ("\"");
828 1.2 christos for (i = 0; i < (WordCount - 1); i++)
829 1.2 christos {
830 1.2 christos OutputValue = (int) WordData[i];
831 1.1 jruoho
832 1.2 christos /* Handle values that must be escaped */
833 1.1 jruoho
834 1.2 christos if ((OutputValue == '\"') ||
835 1.2 christos (OutputValue == '\\'))
836 1.2 christos {
837 1.2 christos AcpiOsPrintf ("\\%c", OutputValue);
838 1.2 christos }
839 1.3 christos else if (!isprint (OutputValue))
840 1.2 christos {
841 1.2 christos AcpiOsPrintf ("\\x%2.2X", OutputValue);
842 1.2 christos }
843 1.2 christos else
844 1.2 christos {
845 1.2 christos AcpiOsPrintf ("%c", OutputValue);
846 1.2 christos }
847 1.1 jruoho }
848 1.1 jruoho
849 1.1 jruoho AcpiOsPrintf ("\")");
850 1.1 jruoho }
851 1.1 jruoho
852 1.1 jruoho
853 1.1 jruoho /*******************************************************************************
854 1.1 jruoho *
855 1.2 christos * FUNCTION: AcpiDmGetHardwareIdType
856 1.1 jruoho *
857 1.1 jruoho * PARAMETERS: Op - Op to be examined
858 1.1 jruoho *
859 1.1 jruoho * RETURN: None
860 1.1 jruoho *
861 1.2 christos * DESCRIPTION: Determine the type of the argument to a _HID or _CID
862 1.2 christos * 1) Strings are allowed
863 1.2 christos * 2) If Integer, determine if it is a valid EISAID
864 1.1 jruoho *
865 1.1 jruoho ******************************************************************************/
866 1.1 jruoho
867 1.1 jruoho static void
868 1.2 christos AcpiDmGetHardwareIdType (
869 1.1 jruoho ACPI_PARSE_OBJECT *Op)
870 1.1 jruoho {
871 1.1 jruoho UINT32 BigEndianId;
872 1.1 jruoho UINT32 Prefix[3];
873 1.1 jruoho UINT32 i;
874 1.1 jruoho
875 1.1 jruoho
876 1.2 christos switch (Op->Common.AmlOpcode)
877 1.2 christos {
878 1.2 christos case AML_STRING_OP:
879 1.2 christos
880 1.2 christos /* Mark this string as an _HID/_CID string */
881 1.2 christos
882 1.2 christos Op->Common.DisasmOpcode = ACPI_DASM_HID_STRING;
883 1.2 christos break;
884 1.2 christos
885 1.2 christos case AML_WORD_OP:
886 1.2 christos case AML_DWORD_OP:
887 1.1 jruoho
888 1.2 christos /* Determine if a Word/Dword is a valid encoded EISAID */
889 1.1 jruoho
890 1.2 christos /* Swap from little-endian to big-endian to simplify conversion */
891 1.1 jruoho
892 1.2 christos BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer);
893 1.1 jruoho
894 1.2 christos /* Create the 3 leading ASCII letters */
895 1.1 jruoho
896 1.2 christos Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40;
897 1.2 christos Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40;
898 1.2 christos Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40;
899 1.1 jruoho
900 1.2 christos /* Verify that all 3 are ascii and alpha */
901 1.1 jruoho
902 1.2 christos for (i = 0; i < 3; i++)
903 1.1 jruoho {
904 1.2 christos if (!ACPI_IS_ASCII (Prefix[i]) ||
905 1.3 christos !isalpha (Prefix[i]))
906 1.2 christos {
907 1.2 christos return;
908 1.2 christos }
909 1.1 jruoho }
910 1.1 jruoho
911 1.2 christos /* Mark this node as convertable to an EISA ID string */
912 1.2 christos
913 1.2 christos Op->Common.DisasmOpcode = ACPI_DASM_EISAID;
914 1.2 christos break;
915 1.1 jruoho
916 1.2 christos default:
917 1.2 christos break;
918 1.2 christos }
919 1.1 jruoho }
920 1.1 jruoho
921 1.1 jruoho
922 1.1 jruoho /*******************************************************************************
923 1.1 jruoho *
924 1.2 christos * FUNCTION: AcpiDmCheckForHardwareId
925 1.1 jruoho *
926 1.1 jruoho * PARAMETERS: Op - Op to be examined
927 1.1 jruoho *
928 1.1 jruoho * RETURN: None
929 1.1 jruoho *
930 1.2 christos * DESCRIPTION: Determine if a Name() Op is a _HID/_CID.
931 1.1 jruoho *
932 1.1 jruoho ******************************************************************************/
933 1.1 jruoho
934 1.1 jruoho void
935 1.2 christos AcpiDmCheckForHardwareId (
936 1.1 jruoho ACPI_PARSE_OBJECT *Op)
937 1.1 jruoho {
938 1.1 jruoho UINT32 Name;
939 1.1 jruoho ACPI_PARSE_OBJECT *NextOp;
940 1.1 jruoho
941 1.1 jruoho
942 1.1 jruoho /* Get the NameSegment */
943 1.1 jruoho
944 1.1 jruoho Name = AcpiPsGetName (Op);
945 1.1 jruoho if (!Name)
946 1.1 jruoho {
947 1.1 jruoho return;
948 1.1 jruoho }
949 1.1 jruoho
950 1.1 jruoho NextOp = AcpiPsGetDepthNext (NULL, Op);
951 1.1 jruoho if (!NextOp)
952 1.1 jruoho {
953 1.1 jruoho return;
954 1.1 jruoho }
955 1.1 jruoho
956 1.1 jruoho /* Check for _HID - has one argument */
957 1.1 jruoho
958 1.1 jruoho if (ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID))
959 1.1 jruoho {
960 1.2 christos AcpiDmGetHardwareIdType (NextOp);
961 1.1 jruoho return;
962 1.1 jruoho }
963 1.1 jruoho
964 1.1 jruoho /* Exit if not _CID */
965 1.1 jruoho
966 1.1 jruoho if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__CID))
967 1.1 jruoho {
968 1.1 jruoho return;
969 1.1 jruoho }
970 1.1 jruoho
971 1.1 jruoho /* _CID can contain a single argument or a package */
972 1.1 jruoho
973 1.1 jruoho if (NextOp->Common.AmlOpcode != AML_PACKAGE_OP)
974 1.1 jruoho {
975 1.2 christos AcpiDmGetHardwareIdType (NextOp);
976 1.1 jruoho return;
977 1.1 jruoho }
978 1.1 jruoho
979 1.2 christos /* _CID with Package: get the package length, check all elements */
980 1.1 jruoho
981 1.1 jruoho NextOp = AcpiPsGetDepthNext (NULL, NextOp);
982 1.2 christos if (!NextOp)
983 1.2 christos {
984 1.2 christos return;
985 1.2 christos }
986 1.1 jruoho
987 1.1 jruoho /* Don't need to use the length, just walk the peer list */
988 1.1 jruoho
989 1.1 jruoho NextOp = NextOp->Common.Next;
990 1.1 jruoho while (NextOp)
991 1.1 jruoho {
992 1.2 christos AcpiDmGetHardwareIdType (NextOp);
993 1.1 jruoho NextOp = NextOp->Common.Next;
994 1.1 jruoho }
995 1.1 jruoho }
996 1.1 jruoho
997 1.1 jruoho
998 1.1 jruoho /*******************************************************************************
999 1.1 jruoho *
1000 1.2 christos * FUNCTION: AcpiDmDecompressEisaId
1001 1.1 jruoho *
1002 1.1 jruoho * PARAMETERS: EncodedId - Raw encoded EISA ID.
1003 1.1 jruoho *
1004 1.1 jruoho * RETURN: None
1005 1.1 jruoho *
1006 1.2 christos * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String
1007 1.2 christos * and emit the correct ASL statement. If the ID is known, emit
1008 1.2 christos * a description of the ID as a comment.
1009 1.1 jruoho *
1010 1.1 jruoho ******************************************************************************/
1011 1.1 jruoho
1012 1.1 jruoho void
1013 1.2 christos AcpiDmDecompressEisaId (
1014 1.1 jruoho UINT32 EncodedId)
1015 1.1 jruoho {
1016 1.2 christos char IdBuffer[ACPI_EISAID_STRING_SIZE];
1017 1.2 christos const AH_DEVICE_ID *Info;
1018 1.1 jruoho
1019 1.1 jruoho
1020 1.2 christos /* Convert EISAID to a string an emit the statement */
1021 1.1 jruoho
1022 1.2 christos AcpiExEisaIdToString (IdBuffer, EncodedId);
1023 1.2 christos AcpiOsPrintf ("EisaId (\"%s\")", IdBuffer);
1024 1.1 jruoho
1025 1.2 christos /* If we know about the ID, emit the description */
1026 1.1 jruoho
1027 1.2 christos Info = AcpiAhMatchHardwareId (IdBuffer);
1028 1.2 christos if (Info)
1029 1.2 christos {
1030 1.2 christos AcpiOsPrintf (" /* %s */", Info->Description);
1031 1.2 christos }
1032 1.1 jruoho }
1033