1118611Snjl/****************************************************************************** 2118611Snjl * 3207344Sjkim * Module Name: aslrestype1 - Miscellaneous small resource descriptors 4118611Snjl * 5118611Snjl *****************************************************************************/ 6118611Snjl 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9118611Snjl * All rights reserved. 10118611Snjl * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25118611Snjl * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29118611Snjl * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43118611Snjl 44151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45118611Snjl#include "aslcompiler.y.h" 46118611Snjl 47118611Snjl#define _COMPONENT ACPI_COMPILER 48118611Snjl ACPI_MODULE_NAME ("aslrestype1") 49118611Snjl 50207344Sjkim/* 51207344Sjkim * This module contains miscellaneous small resource descriptors: 52207344Sjkim * 53207344Sjkim * EndTag 54207344Sjkim * EndDependentFn 55207344Sjkim * Memory24 56207344Sjkim * Memory32 57207344Sjkim * Memory32Fixed 58207344Sjkim * StartDependentFn 59207344Sjkim * StartDependentFnNoPri 60207344Sjkim * VendorShort 61207344Sjkim */ 62118611Snjl 63118611Snjl/******************************************************************************* 64118611Snjl * 65167802Sjkim * FUNCTION: RsDoEndTagDescriptor 66167802Sjkim * 67281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 68167802Sjkim * 69167802Sjkim * RETURN: Completed resource node 70167802Sjkim * 71167802Sjkim * DESCRIPTION: Construct a short "EndDependentFn" descriptor 72167802Sjkim * 73167802Sjkim ******************************************************************************/ 74167802Sjkim 75167802SjkimASL_RESOURCE_NODE * 76167802SjkimRsDoEndTagDescriptor ( 77281075Sdim ASL_RESOURCE_INFO *Info) 78167802Sjkim{ 79167802Sjkim AML_RESOURCE *Descriptor; 80167802Sjkim ASL_RESOURCE_NODE *Rnode; 81167802Sjkim 82167802Sjkim 83167802Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_TAG)); 84167802Sjkim 85167802Sjkim Descriptor = Rnode->Buffer; 86167802Sjkim Descriptor->EndTag.DescriptorType = ACPI_RESOURCE_NAME_END_TAG | 87167802Sjkim ASL_RDESC_END_TAG_SIZE; 88167802Sjkim Descriptor->EndTag.Checksum = 0; 89167802Sjkim return (Rnode); 90167802Sjkim} 91167802Sjkim 92167802Sjkim 93167802Sjkim/******************************************************************************* 94167802Sjkim * 95118611Snjl * FUNCTION: RsDoEndDependentDescriptor 96118611Snjl * 97281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 98118611Snjl * 99118611Snjl * RETURN: Completed resource node 100118611Snjl * 101118611Snjl * DESCRIPTION: Construct a short "EndDependentFn" descriptor 102118611Snjl * 103118611Snjl ******************************************************************************/ 104118611Snjl 105118611SnjlASL_RESOURCE_NODE * 106118611SnjlRsDoEndDependentDescriptor ( 107281075Sdim ASL_RESOURCE_INFO *Info) 108118611Snjl{ 109151937Sjkim AML_RESOURCE *Descriptor; 110118611Snjl ASL_RESOURCE_NODE *Rnode; 111118611Snjl 112118611Snjl 113151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_DEPENDENT)); 114118611Snjl 115118611Snjl Descriptor = Rnode->Buffer; 116306536Sjkim Descriptor->EndDpf.DescriptorType = 117306536Sjkim ACPI_RESOURCE_NAME_END_DEPENDENT | ASL_RDESC_END_DEPEND_SIZE; 118118611Snjl return (Rnode); 119118611Snjl} 120118611Snjl 121118611Snjl 122118611Snjl/******************************************************************************* 123118611Snjl * 124118611Snjl * FUNCTION: RsDoMemory24Descriptor 125118611Snjl * 126281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 127118611Snjl * 128118611Snjl * RETURN: Completed resource node 129118611Snjl * 130118611Snjl * DESCRIPTION: Construct a short "Memory24" descriptor 131118611Snjl * 132118611Snjl ******************************************************************************/ 133118611Snjl 134118611SnjlASL_RESOURCE_NODE * 135118611SnjlRsDoMemory24Descriptor ( 136281075Sdim ASL_RESOURCE_INFO *Info) 137118611Snjl{ 138151937Sjkim AML_RESOURCE *Descriptor; 139118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 140207344Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 141207344Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 142207344Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 143118611Snjl ASL_RESOURCE_NODE *Rnode; 144281075Sdim UINT32 CurrentByteOffset; 145118611Snjl UINT32 i; 146118611Snjl 147118611Snjl 148281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 149281075Sdim CurrentByteOffset = Info->CurrentByteOffset; 150151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24)); 151118611Snjl 152118611Snjl Descriptor = Rnode->Buffer; 153306536Sjkim Descriptor->Memory24.DescriptorType = ACPI_RESOURCE_NAME_MEMORY24; 154151937Sjkim Descriptor->Memory24.ResourceLength = 9; 155118611Snjl 156151937Sjkim /* Process all child initialization nodes */ 157151937Sjkim 158118611Snjl for (i = 0; InitializerOp; i++) 159118611Snjl { 160118611Snjl switch (i) 161118611Snjl { 162118611Snjl case 0: /* Read/Write type */ 163118611Snjl 164151937Sjkim RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1); 165167802Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 166151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0); 167118611Snjl break; 168118611Snjl 169118611Snjl case 1: /* Min Address */ 170118611Snjl 171151937Sjkim Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; 172228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, 173151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum)); 174207344Sjkim MinOp = InitializerOp; 175118611Snjl break; 176118611Snjl 177118611Snjl case 2: /* Max Address */ 178118611Snjl 179151937Sjkim Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; 180228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, 181151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum)); 182207344Sjkim MaxOp = InitializerOp; 183118611Snjl break; 184118611Snjl 185118611Snjl case 3: /* Alignment */ 186118611Snjl 187151937Sjkim Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer; 188228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_ALIGNMENT, 189151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment)); 190118611Snjl break; 191118611Snjl 192118611Snjl case 4: /* Length */ 193118611Snjl 194151937Sjkim Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; 195228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, 196151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength)); 197207344Sjkim LengthOp = InitializerOp; 198118611Snjl break; 199118611Snjl 200118611Snjl case 5: /* Name */ 201118611Snjl 202281075Sdim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 203118611Snjl break; 204118611Snjl 205118611Snjl default: 206118611Snjl 207118611Snjl AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 208118611Snjl break; 209118611Snjl } 210118611Snjl 211118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 212118611Snjl } 213118611Snjl 214207344Sjkim /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */ 215207344Sjkim 216207344Sjkim RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24, 217207344Sjkim Descriptor->Memory24.Minimum, 218207344Sjkim Descriptor->Memory24.Maximum, 219207344Sjkim Descriptor->Memory24.AddressLength, 220207344Sjkim Descriptor->Memory24.Alignment, 221281075Sdim MinOp, MaxOp, LengthOp, NULL, Info->DescriptorTypeOp); 222207344Sjkim 223118611Snjl return (Rnode); 224118611Snjl} 225118611Snjl 226118611Snjl 227118611Snjl/******************************************************************************* 228118611Snjl * 229118611Snjl * FUNCTION: RsDoMemory32Descriptor 230118611Snjl * 231281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 232118611Snjl * 233118611Snjl * RETURN: Completed resource node 234118611Snjl * 235118611Snjl * DESCRIPTION: Construct a short "Memory32" descriptor 236118611Snjl * 237118611Snjl ******************************************************************************/ 238118611Snjl 239118611SnjlASL_RESOURCE_NODE * 240118611SnjlRsDoMemory32Descriptor ( 241281075Sdim ASL_RESOURCE_INFO *Info) 242118611Snjl{ 243151937Sjkim AML_RESOURCE *Descriptor; 244118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 245207344Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 246207344Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 247207344Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 248207344Sjkim ACPI_PARSE_OBJECT *AlignOp = NULL; 249118611Snjl ASL_RESOURCE_NODE *Rnode; 250281075Sdim UINT32 CurrentByteOffset; 251118611Snjl UINT32 i; 252118611Snjl 253118611Snjl 254281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 255281075Sdim CurrentByteOffset = Info->CurrentByteOffset; 256151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY32)); 257118611Snjl 258118611Snjl Descriptor = Rnode->Buffer; 259306536Sjkim Descriptor->Memory32.DescriptorType = ACPI_RESOURCE_NAME_MEMORY32; 260151937Sjkim Descriptor->Memory32.ResourceLength = 17; 261118611Snjl 262151937Sjkim /* Process all child initialization nodes */ 263151937Sjkim 264118611Snjl for (i = 0; InitializerOp; i++) 265118611Snjl { 266118611Snjl switch (i) 267118611Snjl { 268118611Snjl case 0: /* Read/Write type */ 269118611Snjl 270151937Sjkim RsSetFlagBits (&Descriptor->Memory32.Flags, InitializerOp, 0, 1); 271167802Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 272151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Flags), 0); 273118611Snjl break; 274118611Snjl 275118611Snjl case 1: /* Min Address */ 276118611Snjl 277151937Sjkim Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer; 278228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, 279151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum)); 280207344Sjkim MinOp = InitializerOp; 281118611Snjl break; 282118611Snjl 283118611Snjl case 2: /* Max Address */ 284118611Snjl 285151937Sjkim Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer; 286228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 287151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum)); 288207344Sjkim MaxOp = InitializerOp; 289118611Snjl break; 290118611Snjl 291118611Snjl case 3: /* Alignment */ 292118611Snjl 293151937Sjkim Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer; 294228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_ALIGNMENT, 295151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment)); 296207344Sjkim AlignOp = InitializerOp; 297118611Snjl break; 298118611Snjl 299118611Snjl case 4: /* Length */ 300118611Snjl 301151937Sjkim Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; 302228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, 303151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength)); 304207344Sjkim LengthOp = InitializerOp; 305118611Snjl break; 306118611Snjl 307118611Snjl case 5: /* Name */ 308118611Snjl 309281075Sdim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 310118611Snjl break; 311118611Snjl 312118611Snjl default: 313118611Snjl 314118611Snjl AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 315118611Snjl break; 316118611Snjl } 317118611Snjl 318118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 319118611Snjl } 320118611Snjl 321207344Sjkim /* Validate the Min/Max/Len/Align values */ 322207344Sjkim 323207344Sjkim RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32, 324207344Sjkim Descriptor->Memory32.Minimum, 325207344Sjkim Descriptor->Memory32.Maximum, 326207344Sjkim Descriptor->Memory32.AddressLength, 327207344Sjkim Descriptor->Memory32.Alignment, 328281075Sdim MinOp, MaxOp, LengthOp, AlignOp, Info->DescriptorTypeOp); 329207344Sjkim 330118611Snjl return (Rnode); 331118611Snjl} 332118611Snjl 333118611Snjl 334118611Snjl/******************************************************************************* 335118611Snjl * 336118611Snjl * FUNCTION: RsDoMemory32FixedDescriptor 337118611Snjl * 338281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 339118611Snjl * 340118611Snjl * RETURN: Completed resource node 341118611Snjl * 342118611Snjl * DESCRIPTION: Construct a short "Memory32Fixed" descriptor 343118611Snjl * 344118611Snjl ******************************************************************************/ 345118611Snjl 346118611SnjlASL_RESOURCE_NODE * 347118611SnjlRsDoMemory32FixedDescriptor ( 348281075Sdim ASL_RESOURCE_INFO *Info) 349118611Snjl{ 350151937Sjkim AML_RESOURCE *Descriptor; 351118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 352118611Snjl ASL_RESOURCE_NODE *Rnode; 353281075Sdim UINT32 CurrentByteOffset; 354118611Snjl UINT32 i; 355118611Snjl 356118611Snjl 357281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 358281075Sdim CurrentByteOffset = Info->CurrentByteOffset; 359151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_MEMORY32)); 360118611Snjl 361118611Snjl Descriptor = Rnode->Buffer; 362306536Sjkim Descriptor->FixedMemory32.DescriptorType = ACPI_RESOURCE_NAME_FIXED_MEMORY32; 363151937Sjkim Descriptor->FixedMemory32.ResourceLength = 9; 364118611Snjl 365151937Sjkim /* Process all child initialization nodes */ 366151937Sjkim 367118611Snjl for (i = 0; InitializerOp; i++) 368118611Snjl { 369118611Snjl switch (i) 370118611Snjl { 371118611Snjl case 0: /* Read/Write type */ 372118611Snjl 373151937Sjkim RsSetFlagBits (&Descriptor->FixedMemory32.Flags, InitializerOp, 0, 1); 374167802Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 375151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Flags), 0); 376118611Snjl break; 377118611Snjl 378118611Snjl case 1: /* Address */ 379118611Snjl 380151937Sjkim Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer; 381228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_BASEADDRESS, 382151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address)); 383118611Snjl break; 384118611Snjl 385118611Snjl case 2: /* Length */ 386118611Snjl 387151937Sjkim Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer; 388228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, 389151937Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength)); 390118611Snjl break; 391118611Snjl 392118611Snjl case 3: /* Name */ 393118611Snjl 394281075Sdim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 395118611Snjl break; 396118611Snjl 397118611Snjl default: 398118611Snjl 399118611Snjl AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 400118611Snjl break; 401118611Snjl } 402118611Snjl 403118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 404118611Snjl } 405118611Snjl 406118611Snjl return (Rnode); 407118611Snjl} 408118611Snjl 409118611Snjl 410118611Snjl/******************************************************************************* 411118611Snjl * 412118611Snjl * FUNCTION: RsDoStartDependentDescriptor 413118611Snjl * 414281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 415118611Snjl * 416118611Snjl * RETURN: Completed resource node 417118611Snjl * 418118611Snjl * DESCRIPTION: Construct a short "StartDependentFn" descriptor 419118611Snjl * 420118611Snjl ******************************************************************************/ 421118611Snjl 422118611SnjlASL_RESOURCE_NODE * 423118611SnjlRsDoStartDependentDescriptor ( 424281075Sdim ASL_RESOURCE_INFO *Info) 425118611Snjl{ 426151937Sjkim AML_RESOURCE *Descriptor; 427118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 428118611Snjl ASL_RESOURCE_NODE *Rnode; 429118611Snjl ASL_RESOURCE_NODE *PreviousRnode; 430118611Snjl ASL_RESOURCE_NODE *NextRnode; 431281075Sdim ASL_RESOURCE_INFO NextInfo; 432281075Sdim UINT32 CurrentByteOffset; 433118611Snjl UINT32 i; 434118611Snjl UINT8 State; 435118611Snjl 436118611Snjl 437281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 438281075Sdim CurrentByteOffset = Info->CurrentByteOffset; 439151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT)); 440118611Snjl 441118611Snjl PreviousRnode = Rnode; 442118611Snjl Descriptor = Rnode->Buffer; 443118611Snjl 444234623Sjkim /* Increment offset past StartDependent descriptor */ 445234623Sjkim 446234623Sjkim CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT); 447234623Sjkim 448118611Snjl /* Descriptor has priority byte */ 449118611Snjl 450306536Sjkim Descriptor->StartDpf.DescriptorType = 451306536Sjkim ACPI_RESOURCE_NAME_START_DEPENDENT | (ASL_RDESC_ST_DEPEND_SIZE + 0x01); 452118611Snjl 453151937Sjkim /* Process all child initialization nodes */ 454151937Sjkim 455118611Snjl State = ACPI_RSTATE_START_DEPENDENT; 456118611Snjl for (i = 0; InitializerOp; i++) 457118611Snjl { 458118611Snjl switch (i) 459118611Snjl { 460118611Snjl case 0: /* Compatibility Priority */ 461118611Snjl 462118611Snjl if ((UINT8) InitializerOp->Asl.Value.Integer > 2) 463118611Snjl { 464151937Sjkim AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY, 465151937Sjkim InitializerOp, NULL); 466118611Snjl } 467118611Snjl 468151937Sjkim RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0); 469118611Snjl break; 470118611Snjl 471118611Snjl case 1: /* Performance/Robustness Priority */ 472118611Snjl 473118611Snjl if ((UINT8) InitializerOp->Asl.Value.Integer > 2) 474118611Snjl { 475151937Sjkim AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE, 476151937Sjkim InitializerOp, NULL); 477118611Snjl } 478118611Snjl 479151937Sjkim RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0); 480118611Snjl break; 481118611Snjl 482118611Snjl default: 483207344Sjkim 484281075Sdim NextInfo.CurrentByteOffset = CurrentByteOffset; 485281075Sdim NextInfo.DescriptorTypeOp = InitializerOp; 486118611Snjl 487281075Sdim NextRnode = RsDoOneResourceDescriptor (&NextInfo, &State); 488281075Sdim 489118611Snjl /* 490118611Snjl * Update current byte offset to indicate the number of bytes from the 491241973Sjkim * start of the buffer. Buffer can include multiple descriptors, we 492118611Snjl * must keep track of the offset of not only each descriptor, but each 493118611Snjl * element (field) within each descriptor as well. 494118611Snjl */ 495306536Sjkim CurrentByteOffset += RsLinkDescriptorChain ( 496306536Sjkim &PreviousRnode, NextRnode); 497118611Snjl break; 498118611Snjl } 499118611Snjl 500118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 501118611Snjl } 502118611Snjl 503118611Snjl return (Rnode); 504118611Snjl} 505118611Snjl 506118611Snjl 507118611Snjl/******************************************************************************* 508118611Snjl * 509118611Snjl * FUNCTION: RsDoStartDependentNoPriDescriptor 510118611Snjl * 511281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 512118611Snjl * 513118611Snjl * RETURN: Completed resource node 514118611Snjl * 515118611Snjl * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor 516118611Snjl * 517118611Snjl ******************************************************************************/ 518118611Snjl 519118611SnjlASL_RESOURCE_NODE * 520118611SnjlRsDoStartDependentNoPriDescriptor ( 521281075Sdim ASL_RESOURCE_INFO *Info) 522118611Snjl{ 523151937Sjkim AML_RESOURCE *Descriptor; 524118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 525118611Snjl ASL_RESOURCE_NODE *Rnode; 526118611Snjl ASL_RESOURCE_NODE *PreviousRnode; 527118611Snjl ASL_RESOURCE_NODE *NextRnode; 528281075Sdim ASL_RESOURCE_INFO NextInfo; 529281075Sdim UINT32 CurrentByteOffset; 530118611Snjl UINT8 State; 531118611Snjl 532118611Snjl 533281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 534281075Sdim CurrentByteOffset = Info->CurrentByteOffset; 535151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)); 536118611Snjl 537118611Snjl Descriptor = Rnode->Buffer; 538306536Sjkim Descriptor->StartDpf.DescriptorType = 539306536Sjkim ACPI_RESOURCE_NAME_START_DEPENDENT | ASL_RDESC_ST_DEPEND_SIZE; 540118611Snjl PreviousRnode = Rnode; 541118611Snjl 542234623Sjkim /* Increment offset past StartDependentNoPri descriptor */ 543234623Sjkim 544234623Sjkim CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO); 545234623Sjkim 546151937Sjkim /* Process all child initialization nodes */ 547151937Sjkim 548118611Snjl State = ACPI_RSTATE_START_DEPENDENT; 549118611Snjl while (InitializerOp) 550118611Snjl { 551281075Sdim NextInfo.CurrentByteOffset = CurrentByteOffset; 552281075Sdim NextInfo.DescriptorTypeOp = InitializerOp; 553118611Snjl 554281075Sdim NextRnode = RsDoOneResourceDescriptor (&NextInfo, &State); 555281075Sdim 556118611Snjl /* 557118611Snjl * Update current byte offset to indicate the number of bytes from the 558241973Sjkim * 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 * 575281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 576118611Snjl * 577118611Snjl * RETURN: Completed resource node 578118611Snjl * 579118611Snjl * DESCRIPTION: Construct a short "VendorShort" descriptor 580118611Snjl * 581118611Snjl ******************************************************************************/ 582118611Snjl 583118611SnjlASL_RESOURCE_NODE * 584118611SnjlRsDoVendorSmallDescriptor ( 585281075Sdim ASL_RESOURCE_INFO *Info) 586118611Snjl{ 587151937Sjkim AML_RESOURCE *Descriptor; 588118611Snjl ACPI_PARSE_OBJECT *InitializerOp; 589118611Snjl ASL_RESOURCE_NODE *Rnode; 590151937Sjkim UINT8 *VendorData; 591118611Snjl UINT32 i; 592118611Snjl 593118611Snjl 594281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 595118611Snjl 596151937Sjkim /* Allocate worst case - 7 vendor bytes */ 597151937Sjkim 598151937Sjkim Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7); 599151937Sjkim 600118611Snjl Descriptor = Rnode->Buffer; 601306536Sjkim Descriptor->VendorSmall.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_SMALL; 602151937Sjkim VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER); 603118611Snjl 604151937Sjkim /* Process all child initialization nodes */ 605151937Sjkim 606118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 607151937Sjkim for (i = 0; InitializerOp; i++) 608118611Snjl { 609167802Sjkim if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 610167802Sjkim { 611167802Sjkim break; 612167802Sjkim } 613167802Sjkim 614151937Sjkim /* Maximum 7 vendor data bytes allowed (0-6) */ 615151937Sjkim 616151937Sjkim if (i >= 7) 617151937Sjkim { 618151937Sjkim AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL); 619151937Sjkim 620151937Sjkim /* Eat the excess initializers */ 621151937Sjkim 622151937Sjkim while (InitializerOp) 623151937Sjkim { 624151937Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 625151937Sjkim } 626151937Sjkim break; 627151937Sjkim } 628151937Sjkim 629151937Sjkim VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer; 630118611Snjl InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 631118611Snjl } 632118611Snjl 633118611Snjl /* Adjust the Rnode buffer size, so correct number of bytes are emitted */ 634118611Snjl 635118611Snjl Rnode->BufferLength -= (7 - i); 636118611Snjl 637118611Snjl /* Set the length in the Type Tag */ 638118611Snjl 639151937Sjkim Descriptor->VendorSmall.DescriptorType |= (UINT8) i; 640118611Snjl return (Rnode); 641118611Snjl} 642