aslrestype1.c revision 217365
1118611Snjl 2118611Snjl/****************************************************************************** 3118611Snjl * 4207344Sjkim * Module Name: aslrestype1 - Miscellaneous small resource descriptors 5118611Snjl * 6118611Snjl *****************************************************************************/ 7118611Snjl 8217365Sjkim/* 9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 10118611Snjl * All rights reserved. 11118611Snjl * 12217365Sjkim * Redistribution and use in source and binary forms, with or without 13217365Sjkim * modification, are permitted provided that the following conditions 14217365Sjkim * are met: 15217365Sjkim * 1. Redistributions of source code must retain the above copyright 16217365Sjkim * notice, this list of conditions, and the following disclaimer, 17217365Sjkim * without modification. 18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 20217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 21217365Sjkim * including a substantially similar Disclaimer requirement for further 22217365Sjkim * binary redistribution. 23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 24217365Sjkim * of any contributors may be used to endorse or promote products derived 25217365Sjkim * from this software without specific prior written permission. 26118611Snjl * 27217365Sjkim * Alternatively, this software may be distributed under the terms of the 28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 29217365Sjkim * Software Foundation. 30118611Snjl * 31217365Sjkim * NO WARRANTY 32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 43217365Sjkim */ 44118611Snjl 45118611Snjl 46151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 47118611Snjl#include "aslcompiler.y.h" 48118611Snjl 49118611Snjl#define _COMPONENT ACPI_COMPILER 50118611Snjl ACPI_MODULE_NAME ("aslrestype1") 51118611Snjl 52207344Sjkim/* 53207344Sjkim * This module contains miscellaneous small resource descriptors: 54207344Sjkim * 55207344Sjkim * EndTag 56207344Sjkim * EndDependentFn 57207344Sjkim * Memory24 58207344Sjkim * Memory32 59207344Sjkim * Memory32Fixed 60207344Sjkim * StartDependentFn 61207344Sjkim * StartDependentFnNoPri 62207344Sjkim * VendorShort 63207344Sjkim */ 64118611Snjl 65118611Snjl/******************************************************************************* 66118611Snjl * 67167802Sjkim * FUNCTION: RsDoEndTagDescriptor 68167802Sjkim * 69167802Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 70167802Sjkim * CurrentByteOffset - Offset into the resource template AML 71167802Sjkim * buffer (to track references to the desc) 72167802Sjkim * 73167802Sjkim * RETURN: Completed resource node 74167802Sjkim * 75167802Sjkim * DESCRIPTION: Construct a short "EndDependentFn" descriptor 76167802Sjkim * 77167802Sjkim ******************************************************************************/ 78167802Sjkim 79167802SjkimASL_RESOURCE_NODE * 80167802SjkimRsDoEndTagDescriptor ( 81167802Sjkim ACPI_PARSE_OBJECT *Op, 82167802Sjkim UINT32 CurrentByteOffset) 83167802Sjkim{ 84167802Sjkim AML_RESOURCE *Descriptor; 85167802Sjkim ASL_RESOURCE_NODE *Rnode; 86167802Sjkim 87167802Sjkim 88167802Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_TAG)); 89167802Sjkim 90167802Sjkim Descriptor = Rnode->Buffer; 91167802Sjkim Descriptor->EndTag.DescriptorType = ACPI_RESOURCE_NAME_END_TAG | 92167802Sjkim ASL_RDESC_END_TAG_SIZE; 93167802Sjkim Descriptor->EndTag.Checksum = 0; 94167802Sjkim 95167802Sjkim return (Rnode); 96167802Sjkim} 97167802Sjkim 98167802Sjkim 99167802Sjkim/******************************************************************************* 100167802Sjkim * 101118611Snjl * FUNCTION: RsDoEndDependentDescriptor 102118611Snjl * 103118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 104118611Snjl * CurrentByteOffset - Offset into the resource template AML 105118611Snjl * buffer (to track references to the desc) 106118611Snjl * 107118611Snjl * RETURN: Completed resource node 108118611Snjl * 109118611Snjl * DESCRIPTION: Construct a short "EndDependentFn" descriptor 110118611Snjl * 111118611Snjl ******************************************************************************/ 112118611Snjl 113118611SnjlASL_RESOURCE_NODE * 114118611SnjlRsDoEndDependentDescriptor ( 115118611Snjl ACPI_PARSE_OBJECT *Op, 116118611Snjl UINT32 CurrentByteOffset) 117118611Snjl{ 118151937Sjkim AML_RESOURCE *Descriptor; 119118611Snjl ASL_RESOURCE_NODE *Rnode; 120118611Snjl 121118611Snjl 122151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_DEPENDENT)); 123118611Snjl 124118611Snjl Descriptor = Rnode->Buffer; 125151937Sjkim Descriptor->EndDpf.DescriptorType = ACPI_RESOURCE_NAME_END_DEPENDENT | 126151937Sjkim ASL_RDESC_END_DEPEND_SIZE; 127118611Snjl return (Rnode); 128118611Snjl} 129118611Snjl 130118611Snjl 131118611Snjl/******************************************************************************* 132118611Snjl * 133118611Snjl * FUNCTION: RsDoMemory24Descriptor 134118611Snjl * 135118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 136118611Snjl * CurrentByteOffset - Offset into the resource template AML 137118611Snjl * buffer (to track references to the desc) 138118611Snjl * 139118611Snjl * RETURN: Completed resource node 140118611Snjl * 141118611Snjl * DESCRIPTION: Construct a short "Memory24" descriptor 142118611Snjl * 143118611Snjl ******************************************************************************/ 144118611Snjl 145118611SnjlASL_RESOURCE_NODE * 146118611SnjlRsDoMemory24Descriptor ( 147118611Snjl ACPI_PARSE_OBJECT *Op, 148118611Snjl UINT32 CurrentByteOffset) 149118611Snjl{ 150151937Sjkim AML_RESOURCE *Descriptor; 151118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 152207344Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 153207344Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 154207344Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 155118611Snjl ASL_RESOURCE_NODE *Rnode; 156118611Snjl UINT32 i; 157118611Snjl 158118611Snjl 159118611Snjl InitializerOp = Op->Asl.Child; 160151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24)); 161118611Snjl 162118611Snjl Descriptor = Rnode->Buffer; 163151937Sjkim Descriptor->Memory24.DescriptorType = ACPI_RESOURCE_NAME_MEMORY24; 164151937Sjkim Descriptor->Memory24.ResourceLength = 9; 165118611Snjl 166151937Sjkim /* Process all child initialization nodes */ 167151937Sjkim 168118611Snjl for (i = 0; InitializerOp; i++) 169118611Snjl { 170118611Snjl switch (i) 171118611Snjl { 172118611Snjl case 0: /* Read/Write type */ 173118611Snjl 174151937Sjkim RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1); 175167802Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 176151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0); 177118611Snjl break; 178118611Snjl 179118611Snjl case 1: /* Min Address */ 180118611Snjl 181151937Sjkim Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; 182167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 183151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum)); 184207344Sjkim MinOp = InitializerOp; 185118611Snjl break; 186118611Snjl 187118611Snjl case 2: /* Max Address */ 188118611Snjl 189151937Sjkim Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; 190167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 191151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum)); 192207344Sjkim MaxOp = InitializerOp; 193118611Snjl break; 194118611Snjl 195118611Snjl case 3: /* Alignment */ 196118611Snjl 197151937Sjkim Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer; 198167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT, 199151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment)); 200118611Snjl break; 201118611Snjl 202118611Snjl case 4: /* Length */ 203118611Snjl 204151937Sjkim Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; 205167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 206151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength)); 207207344Sjkim LengthOp = InitializerOp; 208118611Snjl break; 209118611Snjl 210118611Snjl case 5: /* Name */ 211118611Snjl 212118611Snjl UtAttachNamepathToOwner (Op, InitializerOp); 213118611Snjl break; 214118611Snjl 215118611Snjl default: 216118611Snjl 217118611Snjl AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 218118611Snjl break; 219118611Snjl } 220118611Snjl 221118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 222118611Snjl } 223118611Snjl 224207344Sjkim /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */ 225207344Sjkim 226207344Sjkim RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24, 227207344Sjkim Descriptor->Memory24.Minimum, 228207344Sjkim Descriptor->Memory24.Maximum, 229207344Sjkim Descriptor->Memory24.AddressLength, 230207344Sjkim Descriptor->Memory24.Alignment, 231213806Sjkim MinOp, MaxOp, LengthOp, NULL, Op); 232207344Sjkim 233118611Snjl return (Rnode); 234118611Snjl} 235118611Snjl 236118611Snjl 237118611Snjl/******************************************************************************* 238118611Snjl * 239118611Snjl * FUNCTION: RsDoMemory32Descriptor 240118611Snjl * 241118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 242118611Snjl * CurrentByteOffset - Offset into the resource template AML 243118611Snjl * buffer (to track references to the desc) 244118611Snjl * 245118611Snjl * RETURN: Completed resource node 246118611Snjl * 247118611Snjl * DESCRIPTION: Construct a short "Memory32" descriptor 248118611Snjl * 249118611Snjl ******************************************************************************/ 250118611Snjl 251118611SnjlASL_RESOURCE_NODE * 252118611SnjlRsDoMemory32Descriptor ( 253118611Snjl ACPI_PARSE_OBJECT *Op, 254118611Snjl UINT32 CurrentByteOffset) 255118611Snjl{ 256151937Sjkim AML_RESOURCE *Descriptor; 257118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 258207344Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 259207344Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 260207344Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 261207344Sjkim ACPI_PARSE_OBJECT *AlignOp = NULL; 262118611Snjl ASL_RESOURCE_NODE *Rnode; 263118611Snjl UINT32 i; 264118611Snjl 265118611Snjl 266118611Snjl InitializerOp = Op->Asl.Child; 267151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY32)); 268118611Snjl 269118611Snjl Descriptor = Rnode->Buffer; 270151937Sjkim Descriptor->Memory32.DescriptorType = ACPI_RESOURCE_NAME_MEMORY32; 271151937Sjkim Descriptor->Memory32.ResourceLength = 17; 272118611Snjl 273151937Sjkim /* Process all child initialization nodes */ 274151937Sjkim 275118611Snjl for (i = 0; InitializerOp; i++) 276118611Snjl { 277118611Snjl switch (i) 278118611Snjl { 279118611Snjl case 0: /* Read/Write type */ 280118611Snjl 281151937Sjkim RsSetFlagBits (&Descriptor->Memory32.Flags, InitializerOp, 0, 1); 282167802Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 283151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Flags), 0); 284118611Snjl break; 285118611Snjl 286118611Snjl case 1: /* Min Address */ 287118611Snjl 288151937Sjkim Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer; 289167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 290151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum)); 291207344Sjkim MinOp = InitializerOp; 292118611Snjl break; 293118611Snjl 294118611Snjl case 2: /* Max Address */ 295118611Snjl 296151937Sjkim Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer; 297167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 298151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum)); 299207344Sjkim MaxOp = InitializerOp; 300118611Snjl break; 301118611Snjl 302118611Snjl case 3: /* Alignment */ 303118611Snjl 304151937Sjkim Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer; 305167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT, 306151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment)); 307207344Sjkim AlignOp = InitializerOp; 308118611Snjl break; 309118611Snjl 310118611Snjl case 4: /* Length */ 311118611Snjl 312151937Sjkim Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; 313167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 314151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength)); 315207344Sjkim LengthOp = InitializerOp; 316118611Snjl break; 317118611Snjl 318118611Snjl case 5: /* Name */ 319118611Snjl 320118611Snjl UtAttachNamepathToOwner (Op, InitializerOp); 321118611Snjl break; 322118611Snjl 323118611Snjl default: 324118611Snjl 325118611Snjl AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 326118611Snjl break; 327118611Snjl } 328118611Snjl 329118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 330118611Snjl } 331118611Snjl 332207344Sjkim /* Validate the Min/Max/Len/Align values */ 333207344Sjkim 334207344Sjkim RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32, 335207344Sjkim Descriptor->Memory32.Minimum, 336207344Sjkim Descriptor->Memory32.Maximum, 337207344Sjkim Descriptor->Memory32.AddressLength, 338207344Sjkim Descriptor->Memory32.Alignment, 339213806Sjkim MinOp, MaxOp, LengthOp, AlignOp, Op); 340207344Sjkim 341118611Snjl return (Rnode); 342118611Snjl} 343118611Snjl 344118611Snjl 345118611Snjl/******************************************************************************* 346118611Snjl * 347118611Snjl * FUNCTION: RsDoMemory32FixedDescriptor 348118611Snjl * 349118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 350118611Snjl * CurrentByteOffset - Offset into the resource template AML 351118611Snjl * buffer (to track references to the desc) 352118611Snjl * 353118611Snjl * RETURN: Completed resource node 354118611Snjl * 355118611Snjl * DESCRIPTION: Construct a short "Memory32Fixed" descriptor 356118611Snjl * 357118611Snjl ******************************************************************************/ 358118611Snjl 359118611SnjlASL_RESOURCE_NODE * 360118611SnjlRsDoMemory32FixedDescriptor ( 361118611Snjl ACPI_PARSE_OBJECT *Op, 362118611Snjl UINT32 CurrentByteOffset) 363118611Snjl{ 364151937Sjkim AML_RESOURCE *Descriptor; 365118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 366118611Snjl ASL_RESOURCE_NODE *Rnode; 367118611Snjl UINT32 i; 368118611Snjl 369118611Snjl 370118611Snjl InitializerOp = Op->Asl.Child; 371151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_MEMORY32)); 372118611Snjl 373118611Snjl Descriptor = Rnode->Buffer; 374151937Sjkim Descriptor->FixedMemory32.DescriptorType = ACPI_RESOURCE_NAME_FIXED_MEMORY32; 375151937Sjkim Descriptor->FixedMemory32.ResourceLength = 9; 376118611Snjl 377151937Sjkim /* Process all child initialization nodes */ 378151937Sjkim 379118611Snjl for (i = 0; InitializerOp; i++) 380118611Snjl { 381118611Snjl switch (i) 382118611Snjl { 383118611Snjl case 0: /* Read/Write type */ 384118611Snjl 385151937Sjkim RsSetFlagBits (&Descriptor->FixedMemory32.Flags, InitializerOp, 0, 1); 386167802Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 387151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Flags), 0); 388118611Snjl break; 389118611Snjl 390118611Snjl case 1: /* Address */ 391118611Snjl 392151937Sjkim Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer; 393167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS, 394151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address)); 395118611Snjl break; 396118611Snjl 397118611Snjl case 2: /* Length */ 398118611Snjl 399151937Sjkim Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; 400167802Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 401151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength)); 402118611Snjl break; 403118611Snjl 404118611Snjl case 3: /* Name */ 405118611Snjl 406118611Snjl UtAttachNamepathToOwner (Op, InitializerOp); 407118611Snjl break; 408118611Snjl 409118611Snjl default: 410118611Snjl 411118611Snjl AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 412118611Snjl break; 413118611Snjl } 414118611Snjl 415118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 416118611Snjl } 417118611Snjl 418118611Snjl return (Rnode); 419118611Snjl} 420118611Snjl 421118611Snjl 422118611Snjl/******************************************************************************* 423118611Snjl * 424118611Snjl * FUNCTION: RsDoStartDependentDescriptor 425118611Snjl * 426118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 427118611Snjl * CurrentByteOffset - Offset into the resource template AML 428118611Snjl * buffer (to track references to the desc) 429118611Snjl * 430118611Snjl * RETURN: Completed resource node 431118611Snjl * 432118611Snjl * DESCRIPTION: Construct a short "StartDependentFn" descriptor 433118611Snjl * 434118611Snjl ******************************************************************************/ 435118611Snjl 436118611SnjlASL_RESOURCE_NODE * 437118611SnjlRsDoStartDependentDescriptor ( 438118611Snjl ACPI_PARSE_OBJECT *Op, 439118611Snjl UINT32 CurrentByteOffset) 440118611Snjl{ 441151937Sjkim AML_RESOURCE *Descriptor; 442118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 443118611Snjl ASL_RESOURCE_NODE *Rnode; 444118611Snjl ASL_RESOURCE_NODE *PreviousRnode; 445118611Snjl ASL_RESOURCE_NODE *NextRnode; 446118611Snjl UINT32 i; 447118611Snjl UINT8 State; 448118611Snjl 449118611Snjl 450118611Snjl InitializerOp = Op->Asl.Child; 451151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT)); 452118611Snjl 453118611Snjl PreviousRnode = Rnode; 454118611Snjl Descriptor = Rnode->Buffer; 455118611Snjl 456118611Snjl /* Descriptor has priority byte */ 457118611Snjl 458151937Sjkim Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT | 459151937Sjkim (ASL_RDESC_ST_DEPEND_SIZE + 0x01); 460118611Snjl 461151937Sjkim /* Process all child initialization nodes */ 462151937Sjkim 463118611Snjl State = ACPI_RSTATE_START_DEPENDENT; 464118611Snjl for (i = 0; InitializerOp; i++) 465118611Snjl { 466118611Snjl switch (i) 467118611Snjl { 468118611Snjl case 0: /* Compatibility Priority */ 469118611Snjl 470118611Snjl if ((UINT8) InitializerOp->Asl.Value.Integer > 2) 471118611Snjl { 472151937Sjkim AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY, 473151937Sjkim InitializerOp, NULL); 474118611Snjl } 475118611Snjl 476151937Sjkim RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0); 477118611Snjl break; 478118611Snjl 479118611Snjl case 1: /* Performance/Robustness Priority */ 480118611Snjl 481118611Snjl if ((UINT8) InitializerOp->Asl.Value.Integer > 2) 482118611Snjl { 483151937Sjkim AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE, 484151937Sjkim InitializerOp, NULL); 485118611Snjl } 486118611Snjl 487151937Sjkim RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0); 488118611Snjl break; 489118611Snjl 490118611Snjl default: 491207344Sjkim 492151937Sjkim NextRnode = RsDoOneResourceDescriptor (InitializerOp, 493151937Sjkim CurrentByteOffset, &State); 494118611Snjl 495118611Snjl /* 496118611Snjl * Update current byte offset to indicate the number of bytes from the 497118611Snjl * start of the buffer. Buffer can include multiple descriptors, we 498118611Snjl * must keep track of the offset of not only each descriptor, but each 499118611Snjl * element (field) within each descriptor as well. 500118611Snjl */ 501151937Sjkim CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, 502151937Sjkim NextRnode); 503118611Snjl break; 504118611Snjl } 505118611Snjl 506118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 507118611Snjl } 508118611Snjl 509118611Snjl return (Rnode); 510118611Snjl} 511118611Snjl 512118611Snjl 513118611Snjl/******************************************************************************* 514118611Snjl * 515118611Snjl * FUNCTION: RsDoStartDependentNoPriDescriptor 516118611Snjl * 517118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 518118611Snjl * CurrentByteOffset - Offset into the resource template AML 519118611Snjl * buffer (to track references to the desc) 520118611Snjl * 521118611Snjl * RETURN: Completed resource node 522118611Snjl * 523118611Snjl * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor 524118611Snjl * 525118611Snjl ******************************************************************************/ 526118611Snjl 527118611SnjlASL_RESOURCE_NODE * 528118611SnjlRsDoStartDependentNoPriDescriptor ( 529118611Snjl ACPI_PARSE_OBJECT *Op, 530118611Snjl UINT32 CurrentByteOffset) 531118611Snjl{ 532151937Sjkim AML_RESOURCE *Descriptor; 533118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 534118611Snjl ASL_RESOURCE_NODE *Rnode; 535118611Snjl ASL_RESOURCE_NODE *PreviousRnode; 536118611Snjl ASL_RESOURCE_NODE *NextRnode; 537118611Snjl UINT8 State; 538118611Snjl 539118611Snjl 540118611Snjl InitializerOp = Op->Asl.Child; 541151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)); 542118611Snjl 543118611Snjl Descriptor = Rnode->Buffer; 544151937Sjkim Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT | 545151937Sjkim ASL_RDESC_ST_DEPEND_SIZE; 546118611Snjl PreviousRnode = Rnode; 547118611Snjl 548151937Sjkim /* Process all child initialization nodes */ 549151937Sjkim 550118611Snjl State = ACPI_RSTATE_START_DEPENDENT; 551118611Snjl while (InitializerOp) 552118611Snjl { 553151937Sjkim NextRnode = RsDoOneResourceDescriptor (InitializerOp, 554151937Sjkim CurrentByteOffset, &State); 555118611Snjl 556118611Snjl /* 557118611Snjl * Update current byte offset to indicate the number of bytes from the 558118611Snjl * start of the buffer. Buffer can include multiple descriptors, we 559118611Snjl * must keep track of the offset of not only each descriptor, but each 560118611Snjl * element (field) within each descriptor as well. 561118611Snjl */ 562118611Snjl CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, NextRnode); 563118611Snjl 564118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 565118611Snjl } 566118611Snjl 567118611Snjl return (Rnode); 568118611Snjl} 569118611Snjl 570118611Snjl 571118611Snjl/******************************************************************************* 572118611Snjl * 573118611Snjl * FUNCTION: RsDoVendorSmallDescriptor 574118611Snjl * 575118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 576118611Snjl * CurrentByteOffset - Offset into the resource template AML 577118611Snjl * buffer (to track references to the desc) 578118611Snjl * 579118611Snjl * RETURN: Completed resource node 580118611Snjl * 581118611Snjl * DESCRIPTION: Construct a short "VendorShort" descriptor 582118611Snjl * 583118611Snjl ******************************************************************************/ 584118611Snjl 585118611SnjlASL_RESOURCE_NODE * 586118611SnjlRsDoVendorSmallDescriptor ( 587118611Snjl ACPI_PARSE_OBJECT *Op, 588118611Snjl UINT32 CurrentByteOffset) 589118611Snjl{ 590151937Sjkim AML_RESOURCE *Descriptor; 591118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 592118611Snjl ASL_RESOURCE_NODE *Rnode; 593151937Sjkim UINT8 *VendorData; 594118611Snjl UINT32 i; 595118611Snjl 596118611Snjl 597118611Snjl InitializerOp = Op->Asl.Child; 598118611Snjl 599151937Sjkim /* Allocate worst case - 7 vendor bytes */ 600151937Sjkim 601151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7); 602151937Sjkim 603118611Snjl Descriptor = Rnode->Buffer; 604151937Sjkim Descriptor->VendorSmall.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_SMALL; 605151937Sjkim VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER); 606118611Snjl 607151937Sjkim /* Process all child initialization nodes */ 608151937Sjkim 609118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 610151937Sjkim for (i = 0; InitializerOp; i++) 611118611Snjl { 612167802Sjkim if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 613167802Sjkim { 614167802Sjkim break; 615167802Sjkim } 616167802Sjkim 617151937Sjkim /* Maximum 7 vendor data bytes allowed (0-6) */ 618151937Sjkim 619151937Sjkim if (i >= 7) 620151937Sjkim { 621151937Sjkim AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL); 622151937Sjkim 623151937Sjkim /* Eat the excess initializers */ 624151937Sjkim 625151937Sjkim while (InitializerOp) 626151937Sjkim { 627151937Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 628151937Sjkim } 629151937Sjkim break; 630151937Sjkim } 631151937Sjkim 632151937Sjkim VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer; 633118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 634118611Snjl } 635118611Snjl 636118611Snjl /* Adjust the Rnode buffer size, so correct number of bytes are emitted */ 637118611Snjl 638118611Snjl Rnode->BufferLength -= (7 - i); 639118611Snjl 640118611Snjl /* Set the length in the Type Tag */ 641118611Snjl 642151937Sjkim Descriptor->VendorSmall.DescriptorType |= (UINT8) i; 643118611Snjl return (Rnode); 644118611Snjl} 645118611Snjl 646