]> CyberLeo.Net >> Repos - FreeBSD/releng/8.2.git/blob - sys/contrib/dev/acpica/compiler/aslrestype2.c
Copy stable/8 to releng/8.2 in preparation for FreeBSD-8.2 release.
[FreeBSD/releng/8.2.git] / sys / contrib / dev / acpica / compiler / aslrestype2.c
1
2 /******************************************************************************
3  *
4  * Module Name: aslrestype2 - Miscellaneous Large resource descriptors
5  *
6  *****************************************************************************/
7
8 /******************************************************************************
9  *
10  * 1. Copyright Notice
11  *
12  * Some or all of this work - Copyright (c) 1999 - 2010, 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
117
118 #include <contrib/dev/acpica/compiler/aslcompiler.h>
119 #include "aslcompiler.y.h"
120 #include <contrib/dev/acpica/include/amlcode.h>
121
122 #define _COMPONENT          ACPI_COMPILER
123         ACPI_MODULE_NAME    ("aslrestype2")
124
125 /*
126  * This module contains miscellaneous large resource descriptors:
127  *
128  * Register
129  * Interrupt
130  * VendorLong
131  */
132
133 /*******************************************************************************
134  *
135  * FUNCTION:    RsDoGeneralRegisterDescriptor
136  *
137  * PARAMETERS:  Op                  - Parent resource descriptor parse node
138  *              CurrentByteOffset   - Offset into the resource template AML
139  *                                    buffer (to track references to the desc)
140  *
141  * RETURN:      Completed resource node
142  *
143  * DESCRIPTION: Construct a long "Register" descriptor
144  *
145  ******************************************************************************/
146
147 ASL_RESOURCE_NODE *
148 RsDoGeneralRegisterDescriptor (
149     ACPI_PARSE_OBJECT       *Op,
150     UINT32                  CurrentByteOffset)
151 {
152     AML_RESOURCE            *Descriptor;
153     ACPI_PARSE_OBJECT       *InitializerOp;
154     ASL_RESOURCE_NODE       *Rnode;
155     UINT32                  i;
156
157
158     InitializerOp = Op->Asl.Child;
159     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_GENERIC_REGISTER));
160
161     Descriptor = Rnode->Buffer;
162     Descriptor->GenericReg.DescriptorType = ACPI_RESOURCE_NAME_GENERIC_REGISTER;
163     Descriptor->GenericReg.ResourceLength = 12;
164
165     /* Process all child initialization nodes */
166
167     for (i = 0; InitializerOp; i++)
168     {
169         switch (i)
170         {
171         case 0: /* Address space */
172
173             Descriptor->GenericReg.AddressSpaceId = (UINT8) InitializerOp->Asl.Value.Integer;
174             RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESSSPACE,
175                 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AddressSpaceId));
176            break;
177
178         case 1: /* Register Bit Width */
179
180             Descriptor->GenericReg.BitWidth = (UINT8) InitializerOp->Asl.Value.Integer;
181             RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITWIDTH,
182                 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitWidth));
183             break;
184
185         case 2: /* Register Bit Offset */
186
187             Descriptor->GenericReg.BitOffset = (UINT8) InitializerOp->Asl.Value.Integer;
188             RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITOFFSET,
189                 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitOffset));
190             break;
191
192         case 3: /* Register Address */
193
194             Descriptor->GenericReg.Address = InitializerOp->Asl.Value.Integer;
195             RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESS,
196                 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address));
197             break;
198
199         case 4: /* Access Size (ACPI 3.0) */
200
201             Descriptor->GenericReg.AccessSize = (UINT8) InitializerOp->Asl.Value.Integer;
202             RsCreateByteField (InitializerOp, ACPI_RESTAG_ACCESSSIZE,
203                 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AccessSize));
204
205             if (Descriptor->GenericReg.AccessSize > AML_FIELD_ACCESS_QWORD)
206             {
207                 AslError (ASL_ERROR, ASL_MSG_INVALID_ACCESS_SIZE,
208                     InitializerOp, NULL);
209             }
210             break;
211
212         case 5: /* ResourceTag (ACPI 3.0b) */
213
214             UtAttachNamepathToOwner (Op, InitializerOp);
215             break;
216
217         default:
218
219             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
220             break;
221         }
222
223         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
224     }
225     return (Rnode);
226 }
227
228
229 /*******************************************************************************
230  *
231  * FUNCTION:    RsDoInterruptDescriptor
232  *
233  * PARAMETERS:  Op                  - Parent resource descriptor parse node
234  *              CurrentByteOffset   - Offset into the resource template AML
235  *                                    buffer (to track references to the desc)
236  *
237  * RETURN:      Completed resource node
238  *
239  * DESCRIPTION: Construct a long "Interrupt" descriptor
240  *
241  ******************************************************************************/
242
243 ASL_RESOURCE_NODE *
244 RsDoInterruptDescriptor (
245     ACPI_PARSE_OBJECT       *Op,
246     UINT32                  CurrentByteOffset)
247 {
248     AML_RESOURCE            *Descriptor;
249     AML_RESOURCE            *Rover = NULL;
250     ACPI_PARSE_OBJECT       *InitializerOp;
251     ASL_RESOURCE_NODE       *Rnode;
252     UINT16                  StringLength = 0;
253     UINT32                  OptionIndex = 0;
254     UINT32                  i;
255     BOOLEAN                 HasResSourceIndex = FALSE;
256     UINT8                   ResSourceIndex = 0;
257     UINT8                   *ResSourceString = NULL;
258
259
260     InitializerOp = Op->Asl.Child;
261     StringLength = RsGetStringDataLength (InitializerOp);
262
263     /* Count the interrupt numbers */
264
265     for (i = 0; InitializerOp; i++)
266     {
267         InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
268
269         if (i <= 6)
270         {
271             if (i == 3 &&
272                 InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
273             {
274                 /*
275                  * ResourceSourceIndex was specified, always make room for
276                  * it, even if the ResourceSource was omitted.
277                  */
278                 OptionIndex++;
279             }
280
281             continue;
282         }
283
284         OptionIndex += 4;
285     }
286
287     InitializerOp = Op->Asl.Child;
288     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_EXTENDED_IRQ) +
289                 1 + OptionIndex + StringLength);
290
291     Descriptor = Rnode->Buffer;
292     Descriptor->ExtendedIrq.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_IRQ;
293
294     /*
295      * Initial descriptor length -- may be enlarged if there are
296      * optional fields present
297      */
298     Descriptor->ExtendedIrq.ResourceLength  = 2;  /* Flags and table length byte */
299     Descriptor->ExtendedIrq.InterruptCount  = 0;
300
301     Rover = ACPI_CAST_PTR (AML_RESOURCE,
302                 (&(Descriptor->ExtendedIrq.Interrupts[0])));
303
304     /* Process all child initialization nodes */
305
306     for (i = 0; InitializerOp; i++)
307     {
308         switch (i)
309         {
310         case 0: /* Resource Usage (Default: consumer (1) */
311
312             RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 0, 1);
313             break;
314
315         case 1: /* Interrupt Type (or Mode - edge/level) */
316
317             RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 1, 0);
318             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,
319                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 1);
320             break;
321
322         case 2: /* Interrupt Level (or Polarity - Active high/low) */
323
324             RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 2, 0);
325             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,
326                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 2);
327             break;
328
329         case 3: /* Share Type - Default: exclusive (0) */
330
331             RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 3, 0);
332             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
333                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 3);
334             break;
335
336         case 4: /* ResSourceIndex [Optional Field - BYTE] */
337
338             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
339             {
340                 HasResSourceIndex = TRUE;
341                 ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
342             }
343             break;
344
345         case 5: /* ResSource [Optional Field - STRING] */
346
347             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
348                 (InitializerOp->Asl.Value.String))
349             {
350                 if (StringLength)
351                 {
352                     ResSourceString = (UINT8 *) InitializerOp->Asl.Value.String;
353                 }
354
355                 /* ResourceSourceIndex must also be valid */
356
357                 if (!HasResSourceIndex)
358                 {
359                     AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
360                         InitializerOp, NULL);
361                 }
362             }
363
364 #if 0
365             /*
366              * Not a valid ResourceSource, ResourceSourceIndex must also
367              * be invalid
368              */
369             else if (HasResSourceIndex)
370             {
371                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
372                     InitializerOp, NULL);
373             }
374 #endif
375             break;
376
377         case 6: /* ResourceTag */
378
379             UtAttachNamepathToOwner (Op, InitializerOp);
380             break;
381
382         default:
383             /*
384              * Interrupt Numbers come through here, repeatedly
385              */
386
387             /* Maximum 255 interrupts allowed for this descriptor */
388
389             if (Descriptor->ExtendedIrq.InterruptCount == 255)
390             {
391                 AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST,
392                     InitializerOp, NULL);
393                 return (Rnode);
394             }
395
396             /* Each interrupt number must be a 32-bit value */
397
398             if (InitializerOp->Asl.Value.Integer > ACPI_UINT32_MAX)
399             {
400                 AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_NUMBER,
401                     InitializerOp, NULL);
402             }
403
404             /* Save the integer and move pointer to the next one */
405
406             Rover->DwordItem = (UINT32) InitializerOp->Asl.Value.Integer;
407             Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->DwordItem), 4);
408             Descriptor->ExtendedIrq.InterruptCount++;
409             Descriptor->ExtendedIrq.ResourceLength += 4;
410
411             /* Case 7: First interrupt number in list */
412
413             if (i == 7)
414             {
415                 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
416                 {
417                     /* Must be at least one interrupt */
418
419                     AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
420                         InitializerOp, NULL);
421                 }
422
423                 /* Check now for duplicates in list */
424
425                 RsCheckListForDuplicates (InitializerOp);
426
427                 /* Create a named field at the start of the list */
428
429                 RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
430                     CurrentByteOffset +
431                     ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]));
432             }
433         }
434
435         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
436     }
437
438
439     /* Add optional ResSourceIndex if present */
440
441     if (HasResSourceIndex)
442     {
443         Rover->ByteItem = ResSourceIndex;
444         Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->ByteItem), 1);
445         Descriptor->ExtendedIrq.ResourceLength += 1;
446     }
447
448     /* Add optional ResSource string if present */
449
450     if (StringLength && ResSourceString)
451     {
452
453         strcpy ((char *) Rover, (char *) ResSourceString);
454         Rover = ACPI_ADD_PTR (
455                     AML_RESOURCE, &(Rover->ByteItem), StringLength);
456
457         Descriptor->ExtendedIrq.ResourceLength = (UINT16)
458             (Descriptor->ExtendedIrq.ResourceLength + StringLength);
459     }
460
461     Rnode->BufferLength = (ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]) -
462                            ASL_RESDESC_OFFSET (ExtendedIrq.DescriptorType))
463                            + OptionIndex + StringLength;
464     return (Rnode);
465 }
466
467
468 /*******************************************************************************
469  *
470  * FUNCTION:    RsDoVendorLargeDescriptor
471  *
472  * PARAMETERS:  Op                  - Parent resource descriptor parse node
473  *              CurrentByteOffset   - Offset into the resource template AML
474  *                                    buffer (to track references to the desc)
475  *
476  * RETURN:      Completed resource node
477  *
478  * DESCRIPTION: Construct a long "VendorLong" descriptor
479  *
480  ******************************************************************************/
481
482 ASL_RESOURCE_NODE *
483 RsDoVendorLargeDescriptor (
484     ACPI_PARSE_OBJECT       *Op,
485     UINT32                  CurrentByteOffset)
486 {
487     AML_RESOURCE            *Descriptor;
488     ACPI_PARSE_OBJECT       *InitializerOp;
489     ASL_RESOURCE_NODE       *Rnode;
490     UINT8                   *VendorData;
491     UINT32                  i;
492
493
494     /* Count the number of data bytes */
495
496     InitializerOp = Op->Asl.Child;
497     InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
498
499     for (i = 0; InitializerOp; i++)
500     {
501         if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
502         {
503             break;
504         }
505         InitializerOp = InitializerOp->Asl.Next;
506     }
507
508     InitializerOp = Op->Asl.Child;
509     InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
510     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_LARGE) + i);
511
512     Descriptor = Rnode->Buffer;
513     Descriptor->VendorLarge.DescriptorType  = ACPI_RESOURCE_NAME_VENDOR_LARGE;
514     Descriptor->VendorLarge.ResourceLength = (UINT16) i;
515
516     /* Point to end-of-descriptor for vendor data */
517
518     VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_LARGE_HEADER);
519
520     /* Process all child initialization nodes */
521
522     for (i = 0; InitializerOp; i++)
523     {
524         if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
525         {
526             break;
527         }
528
529         VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
530         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
531     }
532
533     return (Rnode);
534 }