aslrestype1.c revision 234623
1118611Snjl 2118611Snjl/****************************************************************************** 3118611Snjl * 4207344Sjkim * Module Name: aslrestype1 - Miscellaneous small resource descriptors 5118611Snjl * 6118611Snjl *****************************************************************************/ 7118611Snjl 8217365Sjkim/* 9229989Sjkim * Copyright (C) 2000 - 2012, 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; 182228110Sjkim RsCreateWordField (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; 190228110Sjkim RsCreateWordField (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; 198228110Sjkim RsCreateWordField (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; 205228110Sjkim RsCreateWordField (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; 289228110Sjkim RsCreateDwordField (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; 297228110Sjkim RsCreateDwordField (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; 305228110Sjkim RsCreateDwordField (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; 313228110Sjkim RsCreateDwordField (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; 393228110Sjkim RsCreateDwordField (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; 400228110Sjkim RsCreateDwordField (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 456234623Sjkim /* Increment offset past StartDependent descriptor */ 457234623Sjkim 458234623Sjkim CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT); 459234623Sjkim 460118611Snjl /* Descriptor has priority byte */ 461118611Snjl 462151937Sjkim Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT | 463151937Sjkim (ASL_RDESC_ST_DEPEND_SIZE + 0x01); 464118611Snjl 465151937Sjkim /* Process all child initialization nodes */ 466151937Sjkim 467118611Snjl State = ACPI_RSTATE_START_DEPENDENT; 468118611Snjl for (i = 0; InitializerOp; i++) 469118611Snjl { 470118611Snjl switch (i) 471118611Snjl { 472118611Snjl case 0: /* Compatibility Priority */ 473118611Snjl 474118611Snjl if ((UINT8) InitializerOp->Asl.Value.Integer > 2) 475118611Snjl { 476151937Sjkim AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY, 477151937Sjkim InitializerOp, NULL); 478118611Snjl } 479118611Snjl 480151937Sjkim RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0); 481118611Snjl break; 482118611Snjl 483118611Snjl case 1: /* Performance/Robustness Priority */ 484118611Snjl 485118611Snjl if ((UINT8) InitializerOp->Asl.Value.Integer > 2) 486118611Snjl { 487151937Sjkim AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE, 488151937Sjkim InitializerOp, NULL); 489118611Snjl } 490118611Snjl 491151937Sjkim RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0); 492118611Snjl break; 493118611Snjl 494118611Snjl default: 495207344Sjkim 496151937Sjkim NextRnode = RsDoOneResourceDescriptor (InitializerOp, 497151937Sjkim CurrentByteOffset, &State); 498118611Snjl 499118611Snjl /* 500118611Snjl * Update current byte offset to indicate the number of bytes from the 501118611Snjl * start of the buffer. Buffer can include multiple descriptors, we 502118611Snjl * must keep track of the offset of not only each descriptor, but each 503118611Snjl * element (field) within each descriptor as well. 504118611Snjl */ 505151937Sjkim CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, 506151937Sjkim NextRnode); 507118611Snjl break; 508118611Snjl } 509118611Snjl 510118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 511118611Snjl } 512118611Snjl 513118611Snjl return (Rnode); 514118611Snjl} 515118611Snjl 516118611Snjl 517118611Snjl/******************************************************************************* 518118611Snjl * 519118611Snjl * FUNCTION: RsDoStartDependentNoPriDescriptor 520118611Snjl * 521118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 522118611Snjl * CurrentByteOffset - Offset into the resource template AML 523118611Snjl * buffer (to track references to the desc) 524118611Snjl * 525118611Snjl * RETURN: Completed resource node 526118611Snjl * 527118611Snjl * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor 528118611Snjl * 529118611Snjl ******************************************************************************/ 530118611Snjl 531118611SnjlASL_RESOURCE_NODE * 532118611SnjlRsDoStartDependentNoPriDescriptor ( 533118611Snjl ACPI_PARSE_OBJECT *Op, 534118611Snjl UINT32 CurrentByteOffset) 535118611Snjl{ 536151937Sjkim AML_RESOURCE *Descriptor; 537118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 538118611Snjl ASL_RESOURCE_NODE *Rnode; 539118611Snjl ASL_RESOURCE_NODE *PreviousRnode; 540118611Snjl ASL_RESOURCE_NODE *NextRnode; 541118611Snjl UINT8 State; 542118611Snjl 543118611Snjl 544118611Snjl InitializerOp = Op->Asl.Child; 545151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)); 546118611Snjl 547118611Snjl Descriptor = Rnode->Buffer; 548151937Sjkim Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT | 549151937Sjkim ASL_RDESC_ST_DEPEND_SIZE; 550118611Snjl PreviousRnode = Rnode; 551118611Snjl 552234623Sjkim /* Increment offset past StartDependentNoPri descriptor */ 553234623Sjkim 554234623Sjkim CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO); 555234623Sjkim 556151937Sjkim /* Process all child initialization nodes */ 557151937Sjkim 558118611Snjl State = ACPI_RSTATE_START_DEPENDENT; 559118611Snjl while (InitializerOp) 560118611Snjl { 561151937Sjkim NextRnode = RsDoOneResourceDescriptor (InitializerOp, 562151937Sjkim CurrentByteOffset, &State); 563118611Snjl 564118611Snjl /* 565118611Snjl * Update current byte offset to indicate the number of bytes from the 566118611Snjl * start of the buffer. Buffer can include multiple descriptors, we 567118611Snjl * must keep track of the offset of not only each descriptor, but each 568118611Snjl * element (field) within each descriptor as well. 569118611Snjl */ 570118611Snjl CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, NextRnode); 571118611Snjl 572118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 573118611Snjl } 574118611Snjl 575118611Snjl return (Rnode); 576118611Snjl} 577118611Snjl 578118611Snjl 579118611Snjl/******************************************************************************* 580118611Snjl * 581118611Snjl * FUNCTION: RsDoVendorSmallDescriptor 582118611Snjl * 583118611Snjl * PARAMETERS: Op - Parent resource descriptor parse node 584118611Snjl * CurrentByteOffset - Offset into the resource template AML 585118611Snjl * buffer (to track references to the desc) 586118611Snjl * 587118611Snjl * RETURN: Completed resource node 588118611Snjl * 589118611Snjl * DESCRIPTION: Construct a short "VendorShort" descriptor 590118611Snjl * 591118611Snjl ******************************************************************************/ 592118611Snjl 593118611SnjlASL_RESOURCE_NODE * 594118611SnjlRsDoVendorSmallDescriptor ( 595118611Snjl ACPI_PARSE_OBJECT *Op, 596118611Snjl UINT32 CurrentByteOffset) 597118611Snjl{ 598151937Sjkim AML_RESOURCE *Descriptor; 599118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 600118611Snjl ASL_RESOURCE_NODE *Rnode; 601151937Sjkim UINT8 *VendorData; 602118611Snjl UINT32 i; 603118611Snjl 604118611Snjl 605118611Snjl InitializerOp = Op->Asl.Child; 606118611Snjl 607151937Sjkim /* Allocate worst case - 7 vendor bytes */ 608151937Sjkim 609151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7); 610151937Sjkim 611118611Snjl Descriptor = Rnode->Buffer; 612151937Sjkim Descriptor->VendorSmall.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_SMALL; 613151937Sjkim VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER); 614118611Snjl 615151937Sjkim /* Process all child initialization nodes */ 616151937Sjkim 617118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 618151937Sjkim for (i = 0; InitializerOp; i++) 619118611Snjl { 620167802Sjkim if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 621167802Sjkim { 622167802Sjkim break; 623167802Sjkim } 624167802Sjkim 625151937Sjkim /* Maximum 7 vendor data bytes allowed (0-6) */ 626151937Sjkim 627151937Sjkim if (i >= 7) 628151937Sjkim { 629151937Sjkim AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL); 630151937Sjkim 631151937Sjkim /* Eat the excess initializers */ 632151937Sjkim 633151937Sjkim while (InitializerOp) 634151937Sjkim { 635151937Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 636151937Sjkim } 637151937Sjkim break; 638151937Sjkim } 639151937Sjkim 640151937Sjkim VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer; 641118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 642118611Snjl } 643118611Snjl 644118611Snjl /* Adjust the Rnode buffer size, so correct number of bytes are emitted */ 645118611Snjl 646118611Snjl Rnode->BufferLength -= (7 - i); 647118611Snjl 648118611Snjl /* Set the length in the Type Tag */ 649118611Snjl 650151937Sjkim Descriptor->VendorSmall.DescriptorType |= (UINT8) i; 651118611Snjl return (Rnode); 652118611Snjl} 653118611Snjl 654