* Intel ACPI 20030228 distribution with local DragonFly changes.
[dragonfly.git] / sys / contrib / dev / acpica / dmutils.c
1 /*******************************************************************************
2  *
3  * Module Name: dmutils - AML disassembler utilities
4  *              $Revision: 8 $
5  *
6  ******************************************************************************/
7
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2003, Intel Corp.
13  * All rights reserved.
14  *
15  * 2. License
16  *
17  * 2.1. This is your license from Intel Corp. under its intellectual property
18  * rights.  You may have additional license terms from the party that provided
19  * you this software, covering your right to use that party's intellectual
20  * property rights.
21  *
22  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23  * copy of the source code appearing in this file ("Covered Code") an
24  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25  * base code distributed originally by Intel ("Original Intel Code") to copy,
26  * make derivatives, distribute, use and display any portion of the Covered
27  * Code in any form, with the right to sublicense such rights; and
28  *
29  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30  * license (with the right to sublicense), under only those claims of Intel
31  * patents that are infringed by the Original Intel Code, to make, use, sell,
32  * offer to sell, and import the Covered Code and derivative works thereof
33  * solely to the minimum extent necessary to exercise the above copyright
34  * license, and in no event shall the patent license extend to any additions
35  * to or modifications of the Original Intel Code.  No other license or right
36  * is granted directly or by implication, estoppel or otherwise;
37  *
38  * The above copyright and patent license is granted only if the following
39  * conditions are met:
40  *
41  * 3. Conditions
42  *
43  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44  * Redistribution of source code of any substantial portion of the Covered
45  * Code or modification with rights to further distribute source must include
46  * the above Copyright Notice, the above License, this list of Conditions,
47  * and the following Disclaimer and Export Compliance provision.  In addition,
48  * Licensee must cause all Covered Code to which Licensee contributes to
49  * contain a file documenting the changes Licensee made to create that Covered
50  * Code and the date of any change.  Licensee must include in that file the
51  * documentation of any changes made by any predecessor Licensee.  Licensee
52  * must include a prominent statement that the modification is derived,
53  * directly or indirectly, from Original Intel Code.
54  *
55  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56  * Redistribution of source code of any substantial portion of the Covered
57  * Code or modification without rights to further distribute source must
58  * include the following Disclaimer and Export Compliance provision in the
59  * documentation and/or other materials provided with distribution.  In
60  * addition, Licensee may not authorize further sublicense of source of any
61  * portion of the Covered Code, and must include terms to the effect that the
62  * license from Licensee to its licensee is limited to the intellectual
63  * property embodied in the software Licensee provides to its licensee, and
64  * not to intellectual property embodied in modifications its licensee may
65  * make.
66  *
67  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68  * substantial portion of the Covered Code or modification must reproduce the
69  * above Copyright Notice, and the following Disclaimer and Export Compliance
70  * provision in the documentation and/or other materials provided with the
71  * distribution.
72  *
73  * 3.4. Intel retains all right, title, and interest in and to the Original
74  * Intel Code.
75  *
76  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77  * Intel shall be used in advertising or otherwise to promote the sale, use or
78  * other dealings in products derived from or relating to the Covered Code
79  * without prior written authorization from Intel.
80  *
81  * 4. Disclaimer and Export Compliance
82  *
83  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89  * PARTICULAR PURPOSE.
90  *
91  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98  * LIMITED REMEDY.
99  *
100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101  * software or system incorporating such software without first obtaining any
102  * required license or other approval from the U. S. Department of Commerce or
103  * any other agency or department of the United States Government.  In the
104  * event Licensee exports any such software from the United States or
105  * re-exports any such software from a foreign destination, Licensee shall
106  * ensure that the distribution and export/re-export of the software is in
107  * compliance with all laws, regulations, orders, or other restrictions of the
108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109  * any of its subsidiaries will export/re-export any technical data, process,
110  * software, or service, directly or indirectly, to any country for which the
111  * United States government or any agency thereof requires an export license,
112  * other governmental approval, or letter of assurance, without first obtaining
113  * such license, approval or letter.
114  *
115  *****************************************************************************/
116 /* $DragonFly: src/sys/contrib/dev/acpica/Attic/dmutils.c,v 1.1 2003/09/24 03:32:15 drhodus Exp $                                                               */
117
118
119 #include "acpi.h"
120 #include "amlcode.h"
121 #include "acdisasm.h"
122
123
124 #ifdef ACPI_DISASSEMBLER
125
126 #define _COMPONENT          ACPI_CA_DEBUGGER
127         ACPI_MODULE_NAME    ("dmutils")
128
129
130 /* Data used in keeping track of fields */
131 #if 0
132 const char                      *AcpiGbl_FENames[ACPI_NUM_FIELD_NAMES] =
133 {
134     "skip",
135     "?access?"
136 };              /* FE = Field Element */
137 #endif
138
139
140 const char                      *AcpiGbl_MatchOps[ACPI_NUM_MATCH_OPS] =
141 {
142     "MTR",
143     "MEQ",
144     "MLE",
145     "MLT",
146     "MGE",
147     "MGT"
148 };
149
150
151 /* Access type decoding */
152
153 const char                      *AcpiGbl_AccessTypes[ACPI_NUM_ACCESS_TYPES] =
154 {
155     "AnyAcc",
156     "ByteAcc",
157     "WordAcc",
158     "DWordAcc",
159     "QWordAcc",
160     "BufferAcc",
161 };
162
163
164 /* Lock rule decoding */
165
166 const char                      *AcpiGbl_LockRule[ACPI_NUM_LOCK_RULES] =
167 {
168     "NoLock",
169     "Lock"
170 };
171
172 /* Update rule decoding */
173
174 const char                      *AcpiGbl_UpdateRules[ACPI_NUM_UPDATE_RULES] =
175 {
176     "Preserve",
177     "WriteAsOnes",
178     "WriteAsZeros"
179 };
180
181 /*
182  * Strings used to decode resource descriptors
183  */
184 const char                      *AcpiGbl_IoDecode[2] =
185 {
186     "Decode10",
187     "Decode16"
188 };
189
190 const char                      *AcpiGbl_WordDecode[4] =
191 {
192     "WordMemory",
193     "WordIO",
194     "WordBusNumber",
195     "Unknown-resource-type"
196 };
197
198 const char                      *AcpiGbl_ConsumeDecode[2] =
199 {
200     "ResourceProducer",
201     "ResourceConsumer"
202 };
203
204 const char                      *AcpiGbl_MinDecode[2] =
205 {
206     "MinNotFixed",
207     "MinFixed"
208 };
209
210 const char                      *AcpiGbl_MaxDecode[2] =
211 {
212     "MaxNotFixed",
213     "MaxFixed"
214 };
215
216 const char                      *AcpiGbl_DECDecode[2] =
217 {
218     "PosDecode",
219     "SubDecode"
220 };
221
222 const char                      *AcpiGbl_RNGDecode[4] =
223 {
224     "InvalidRanges",
225     "NonISAOnlyRanges",
226     "ISAOnlyRanges",
227     "EntireRange"
228 };
229
230 const char                      *AcpiGbl_MEMDecode[4] =
231 {
232     "NonCacheable",
233     "Cacheable",
234     "WriteCombining",
235     "Prefetchable"
236 };
237
238 const char                      *AcpiGbl_RWDecode[2] =
239 {
240     "ReadOnly",
241     "ReadWrite"
242 };
243
244 const char                      *AcpiGbl_IrqDecode[2] =
245 {
246     "IRQNoFlags",
247     "IRQ"
248 };
249
250 const char                      *AcpiGbl_HEDecode[2] =
251 {
252     "Level",
253     "Edge"
254 };
255
256 const char                      *AcpiGbl_LLDecode[2] =
257 {
258     "ActiveHigh",
259     "ActiveLow"
260 };
261
262 const char                      *AcpiGbl_SHRDecode[2] =
263 {
264     "Exclusive",
265     "Shared"
266 };
267
268 const char                      *AcpiGbl_TYPDecode[4] =
269 {
270     "Compatibility",
271     "TypeA",
272     "TypeB",
273     "TypeF"
274 };
275
276 const char                      *AcpiGbl_BMDecode[2] =
277 {
278     "NotBusMaster",
279     "BusMaster"
280 };
281
282 const char                      *AcpiGbl_SIZDecode[4] =
283 {
284     "Transfer8",
285     "Transfer8_16",
286     "Transfer16",
287     "InvalidSize"
288 };
289
290
291 /*******************************************************************************
292  *
293  * FUNCTION:    AcpiDmDecodeAttribute
294  *
295  * PARAMETERS:  Attribute       - Attribute field of AccessAs keyword
296  *
297  * RETURN:      None
298  *
299  * DESCRIPTION: Decode the AccessAs attribute byte.  (Mostly SMBus stuff)
300  *
301  ******************************************************************************/
302
303 void
304 AcpiDmDecodeAttribute (
305     UINT8                   Attribute)
306 {
307
308     switch (Attribute)
309     {
310     case AML_FIELD_ATTRIB_SMB_QUICK:
311
312         AcpiOsPrintf ("SMBQuick");
313         break;
314
315     case AML_FIELD_ATTRIB_SMB_SEND_RCV:
316
317         AcpiOsPrintf ("SMBSendReceive");
318         break;
319
320     case AML_FIELD_ATTRIB_SMB_BYTE:
321
322         AcpiOsPrintf ("SMBByte");
323         break;
324
325     case AML_FIELD_ATTRIB_SMB_WORD:
326
327         AcpiOsPrintf ("SMBWord");
328         break;
329
330     case AML_FIELD_ATTRIB_SMB_WORD_CALL:
331
332         AcpiOsPrintf ("SMBProcessCall");
333         break;
334
335     case AML_FIELD_ATTRIB_SMB_BLOCK:
336
337         AcpiOsPrintf ("SMBBlock");
338         break;
339
340     case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
341
342         AcpiOsPrintf ("SMBBlockProcessCall");
343         break;
344
345     default:
346
347         AcpiOsPrintf ("0x%.2X", Attribute);
348         break;
349     }
350 }
351
352
353 /*******************************************************************************
354  *
355  * FUNCTION:    AcpiDmIndent
356  *
357  * PARAMETERS:  Level               - Current source code indentation level
358  *
359  * RETURN:      None
360  *
361  * DESCRIPTION: Indent 4 spaces per indentation level.
362  *
363  ******************************************************************************/
364
365 void
366 AcpiDmIndent (
367     UINT32                  Level)
368 {
369
370     if (!Level)
371     {
372         return;
373     }
374
375     AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
376 }
377
378
379 /*******************************************************************************
380  *
381  * FUNCTION:    AcpiDmCommaIfListMember
382  *
383  * PARAMETERS:  Op              - Current operator/operand
384  *
385  * RETURN:      TRUE if a comma was inserted
386  *
387  * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
388  *
389  ******************************************************************************/
390
391 BOOLEAN
392 AcpiDmCommaIfListMember (
393     ACPI_PARSE_OBJECT       *Op)
394 {
395
396     if (!Op->Common.Next)
397     {
398         return FALSE;
399     }
400
401     if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
402     {
403         /* Check for a NULL target operand */
404
405         if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
406             (!Op->Common.Next->Common.Value.String))
407         {
408             /*
409              * To handle the Divide() case where there are two optional
410              * targets, look ahead one more op.  If null, this null target
411              * is the one and only target -- no comma needed.  Otherwise,
412              * we need a comma to prepare for the next target.
413              */
414             if (!Op->Common.Next->Common.Next)
415             {
416                 return FALSE;
417             }
418         }
419
420         if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
421             (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
422         {
423             return FALSE;
424         }
425
426         AcpiOsPrintf (", ");
427         return (TRUE);
428     }
429
430     else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
431              (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
432     {
433         AcpiOsPrintf (", ");
434         return (TRUE);
435     }
436
437     return (FALSE);
438 }
439
440
441 /*******************************************************************************
442  *
443  * FUNCTION:    AcpiDmCommaIfFieldMember
444  *
445  * PARAMETERS:  Op              - Current operator/operand
446  *
447  * RETURN:      None
448  *
449  * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
450  *
451  ******************************************************************************/
452
453 void
454 AcpiDmCommaIfFieldMember (
455     ACPI_PARSE_OBJECT       *Op)
456 {
457
458     if (Op->Common.Next)
459     {
460         AcpiOsPrintf (", ");
461     }
462 }
463
464
465 #endif