aslrestype1i.c revision 217365
1168404Spjd 2168404Spjd/****************************************************************************** 3168404Spjd * 4168404Spjd * Module Name: aslrestype1i - Small I/O-related resource descriptors 5168404Spjd * 6168404Spjd *****************************************************************************/ 7168404Spjd 8168404Spjd/* 9168404Spjd * Copyright (C) 2000 - 2011, Intel Corp. 10168404Spjd * All rights reserved. 11168404Spjd * 12168404Spjd * Redistribution and use in source and binary forms, with or without 13168404Spjd * modification, are permitted provided that the following conditions 14168404Spjd * are met: 15168404Spjd * 1. Redistributions of source code must retain the above copyright 16168404Spjd * notice, this list of conditions, and the following disclaimer, 17168404Spjd * without modification. 18168404Spjd * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19168404Spjd * substantially similar to the "NO WARRANTY" disclaimer below 20168404Spjd * ("Disclaimer") and any redistribution must be conditioned upon 21168404Spjd * including a substantially similar Disclaimer requirement for further 22219089Spjd * binary redistribution. 23289562Smav * 3. Neither the names of the above-listed copyright holders nor the names 24264669Sdelphij * of any contributors may be used to endorse or promote products derived 25168404Spjd * from this software without specific prior written permission. 26168404Spjd * 27168404Spjd * Alternatively, this software may be distributed under the terms of the 28168404Spjd * GNU General Public License ("GPL") version 2 as published by the Free 29168404Spjd * Software Foundation. 30168404Spjd * 31168404Spjd * NO WARRANTY 32168404Spjd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33168404Spjd * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34268084Sdelphij * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35168404Spjd * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36168404Spjd * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37168404Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38168404Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39248571Smm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40168404Spjd * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41168498Spjd * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42219089Spjd * POSSIBILITY OF SUCH DAMAGES. 43168404Spjd */ 44168404Spjd 45168404Spjd 46168404Spjd#include <contrib/dev/acpica/compiler/aslcompiler.h> 47168404Spjd#include "aslcompiler.y.h" 48288340Savg 49219089Spjd#define _COMPONENT ACPI_COMPILER 50288340Savg ACPI_MODULE_NAME ("aslrestype1i") 51168404Spjd 52168404Spjd/* 53219089Spjd * This module contains the I/O-related small resource descriptors: 54247265Smm * 55247265Smm * DMA 56247265Smm * FixedIO 57168404Spjd * IO 58268084Sdelphij * IRQ 59268084Sdelphij * IRQNoFlags 60268084Sdelphij */ 61168498Spjd 62168498Spjd/******************************************************************************* 63168498Spjd * 64168498Spjd * FUNCTION: RsDoDmaDescriptor 65219089Spjd * 66219089Spjd * PARAMETERS: Op - Parent resource descriptor parse node 67219089Spjd * CurrentByteOffset - Offset into the resource template AML 68168404Spjd * buffer (to track references to the desc) 69168404Spjd * 70168404Spjd * RETURN: Completed resource node 71168404Spjd * 72168404Spjd * DESCRIPTION: Construct a short "DMA" descriptor 73168404Spjd * 74168404Spjd ******************************************************************************/ 75168404Spjd 76168404SpjdASL_RESOURCE_NODE * 77168404SpjdRsDoDmaDescriptor ( 78168404Spjd ACPI_PARSE_OBJECT *Op, 79168404Spjd UINT32 CurrentByteOffset) 80168404Spjd{ 81168404Spjd AML_RESOURCE *Descriptor; 82168404Spjd ACPI_PARSE_OBJECT *InitializerOp; 83168404Spjd ASL_RESOURCE_NODE *Rnode; 84168404Spjd UINT32 i; 85168404Spjd UINT8 DmaChannelMask = 0; 86168404Spjd UINT8 DmaChannels = 0; 87168404Spjd 88168404Spjd 89168404Spjd InitializerOp = Op->Asl.Child; 90168404Spjd Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_DMA)); 91168404Spjd 92168404Spjd Descriptor = Rnode->Buffer; 93168404Spjd Descriptor->Dma.DescriptorType = ACPI_RESOURCE_NAME_DMA | 94168404Spjd ASL_RDESC_DMA_SIZE; 95168404Spjd 96168404Spjd /* Process all child initialization nodes */ 97168404Spjd 98168404Spjd for (i = 0; InitializerOp; i++) 99168404Spjd { 100321529Smav switch (i) 101321529Smav { 102321529Smav case 0: /* DMA type */ 103321529Smav 104321529Smav RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 5, 0); 105168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_DMATYPE, 106168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 5); 107168404Spjd break; 108168404Spjd 109168404Spjd case 1: /* Bus Master */ 110168404Spjd 111168404Spjd RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 2, 0); 112168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_BUSMASTER, 113168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 2); 114168404Spjd break; 115168404Spjd 116168404Spjd case 2: /* Xfer Type (transfer width) */ 117168404Spjd 118168404Spjd RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 0, 0); 119168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_XFERTYPE, 120168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 0); 121168404Spjd break; 122185029Spjd 123168404Spjd case 3: /* Name */ 124168404Spjd 125168404Spjd UtAttachNamepathToOwner (Op, InitializerOp); 126168404Spjd break; 127168404Spjd 128168404Spjd default: 129185029Spjd 130168404Spjd /* All DMA channel bytes are handled here, after flags and name */ 131168404Spjd 132168404Spjd if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 133185029Spjd { 134168404Spjd /* Up to 8 channels can be specified in the list */ 135168404Spjd 136195515Spjd DmaChannels++; 137195515Spjd if (DmaChannels > 8) 138195515Spjd { 139195515Spjd AslError (ASL_ERROR, ASL_MSG_DMA_LIST, 140195515Spjd InitializerOp, NULL); 141195515Spjd return (Rnode); 142195515Spjd } 143195515Spjd 144168404Spjd /* Only DMA channels 0-7 are allowed (mask is 8 bits) */ 145168404Spjd 146168404Spjd if (InitializerOp->Asl.Value.Integer > 7) 147185029Spjd { 148168404Spjd AslError (ASL_ERROR, ASL_MSG_DMA_CHANNEL, 149168404Spjd InitializerOp, NULL); 150168404Spjd } 151168404Spjd 152168404Spjd /* Build the mask */ 153168404Spjd 154168404Spjd DmaChannelMask |= 155168404Spjd (1 << ((UINT8) InitializerOp->Asl.Value.Integer)); 156168404Spjd } 157168404Spjd 158185029Spjd if (i == 4) /* case 4: First DMA byte */ 159168404Spjd { 160219089Spjd /* Check now for duplicates in list */ 161168404Spjd 162168404Spjd RsCheckListForDuplicates (InitializerOp); 163168404Spjd 164168404Spjd /* Create a named field at the start of the list */ 165168404Spjd 166168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_DMA, 167168404Spjd CurrentByteOffset + 168168404Spjd ASL_RESDESC_OFFSET (Dma.DmaChannelMask)); 169168404Spjd } 170168404Spjd break; 171168404Spjd } 172185029Spjd 173219089Spjd InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 174168404Spjd } 175168404Spjd 176168404Spjd /* Now we can set the channel mask */ 177168404Spjd 178168404Spjd Descriptor->Dma.DmaChannelMask = DmaChannelMask; 179168404Spjd return (Rnode); 180168404Spjd} 181185029Spjd 182168404Spjd 183168404Spjd/******************************************************************************* 184168404Spjd * 185168404Spjd * FUNCTION: RsDoFixedIoDescriptor 186168404Spjd * 187168404Spjd * PARAMETERS: Op - Parent resource descriptor parse node 188168404Spjd * CurrentByteOffset - Offset into the resource template AML 189168404Spjd * buffer (to track references to the desc) 190168404Spjd * 191168404Spjd * RETURN: Completed resource node 192168404Spjd * 193168404Spjd * DESCRIPTION: Construct a short "FixedIO" descriptor 194168404Spjd * 195168404Spjd ******************************************************************************/ 196185029Spjd 197210044SpjdASL_RESOURCE_NODE * 198168404SpjdRsDoFixedIoDescriptor ( 199168404Spjd ACPI_PARSE_OBJECT *Op, 200168404Spjd UINT32 CurrentByteOffset) 201168404Spjd{ 202168404Spjd AML_RESOURCE *Descriptor; 203210044Spjd ACPI_PARSE_OBJECT *InitializerOp; 204168404Spjd ACPI_PARSE_OBJECT *AddressOp = NULL; 205168404Spjd ASL_RESOURCE_NODE *Rnode; 206185029Spjd UINT32 i; 207168404Spjd 208168404Spjd 209168404Spjd InitializerOp = Op->Asl.Child; 210168404Spjd Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_IO)); 211168404Spjd 212168404Spjd Descriptor = Rnode->Buffer; 213185029Spjd Descriptor->Io.DescriptorType = ACPI_RESOURCE_NAME_FIXED_IO | 214168404Spjd ASL_RDESC_FIXED_IO_SIZE; 215168404Spjd 216168404Spjd /* Process all child initialization nodes */ 217168404Spjd 218185029Spjd for (i = 0; InitializerOp; i++) 219168404Spjd { 220168404Spjd switch (i) 221168404Spjd { 222185029Spjd case 0: /* Base Address */ 223168404Spjd 224168404Spjd Descriptor->FixedIo.Address = 225168404Spjd (UINT16) InitializerOp->Asl.Value.Integer; 226168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS, 227168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address)); 228168404Spjd AddressOp = InitializerOp; 229168404Spjd break; 230168404Spjd 231168404Spjd case 1: /* Length */ 232185029Spjd 233168404Spjd Descriptor->FixedIo.AddressLength = 234168404Spjd (UINT8) InitializerOp->Asl.Value.Integer; 235168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 236168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.AddressLength)); 237168404Spjd break; 238168404Spjd 239168404Spjd case 2: /* Name */ 240168404Spjd 241168404Spjd UtAttachNamepathToOwner (Op, InitializerOp); 242168404Spjd break; 243168404Spjd 244168404Spjd default: 245185029Spjd 246168404Spjd AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 247168404Spjd break; 248168404Spjd } 249168404Spjd 250168404Spjd InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 251168404Spjd } 252168404Spjd 253185029Spjd /* Error checks */ 254168404Spjd 255168404Spjd if (Descriptor->FixedIo.Address > 0x03FF) 256168404Spjd { 257168404Spjd AslError (ASL_WARNING, ASL_MSG_ISA_ADDRESS, AddressOp, NULL); 258168404Spjd } 259168404Spjd 260168404Spjd return (Rnode); 261168404Spjd} 262168404Spjd 263168404Spjd 264168404Spjd/******************************************************************************* 265168404Spjd * 266168404Spjd * FUNCTION: RsDoIoDescriptor 267168404Spjd * 268168404Spjd * PARAMETERS: Op - Parent resource descriptor parse node 269168404Spjd * CurrentByteOffset - Offset into the resource template AML 270168404Spjd * buffer (to track references to the desc) 271168404Spjd * 272168404Spjd * RETURN: Completed resource node 273168404Spjd * 274168404Spjd * DESCRIPTION: Construct a short "IO" descriptor 275168404Spjd * 276168404Spjd ******************************************************************************/ 277168404Spjd 278168404SpjdASL_RESOURCE_NODE * 279168404SpjdRsDoIoDescriptor ( 280168404Spjd ACPI_PARSE_OBJECT *Op, 281168404Spjd UINT32 CurrentByteOffset) 282185029Spjd{ 283168404Spjd AML_RESOURCE *Descriptor; 284168404Spjd ACPI_PARSE_OBJECT *InitializerOp; 285168404Spjd ACPI_PARSE_OBJECT *MinOp = NULL; 286168404Spjd ACPI_PARSE_OBJECT *MaxOp = NULL; 287168404Spjd ACPI_PARSE_OBJECT *LengthOp = NULL; 288168404Spjd ACPI_PARSE_OBJECT *AlignOp = NULL; 289168404Spjd ASL_RESOURCE_NODE *Rnode; 290168404Spjd UINT32 i; 291168404Spjd 292168404Spjd 293168404Spjd InitializerOp = Op->Asl.Child; 294168404Spjd Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IO)); 295168404Spjd 296168404Spjd Descriptor = Rnode->Buffer; 297168404Spjd Descriptor->Io.DescriptorType = ACPI_RESOURCE_NAME_IO | 298168404Spjd ASL_RDESC_IO_SIZE; 299168404Spjd 300168404Spjd /* Process all child initialization nodes */ 301168404Spjd 302168404Spjd for (i = 0; InitializerOp; i++) 303168404Spjd { 304168404Spjd switch (i) 305168404Spjd { 306168404Spjd case 0: /* Decode size */ 307168404Spjd 308168404Spjd RsSetFlagBits (&Descriptor->Io.Flags, InitializerOp, 0, 1); 309168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 310168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Flags), 0); 311168404Spjd break; 312168404Spjd 313168404Spjd case 1: /* Min Address */ 314168404Spjd 315168404Spjd Descriptor->Io.Minimum = 316168404Spjd (UINT16) InitializerOp->Asl.Value.Integer; 317168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 318168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum)); 319168404Spjd MinOp = InitializerOp; 320168404Spjd break; 321168404Spjd 322168404Spjd case 2: /* Max Address */ 323168404Spjd 324168404Spjd Descriptor->Io.Maximum = 325168404Spjd (UINT16) InitializerOp->Asl.Value.Integer; 326168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 327168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum)); 328168404Spjd MaxOp = InitializerOp; 329168404Spjd break; 330168404Spjd 331219089Spjd case 3: /* Alignment */ 332168404Spjd 333219089Spjd Descriptor->Io.Alignment = 334168404Spjd (UINT8) InitializerOp->Asl.Value.Integer; 335168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT, 336168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Alignment)); 337168404Spjd AlignOp = InitializerOp; 338168404Spjd break; 339168404Spjd 340168404Spjd case 4: /* Length */ 341168404Spjd 342168404Spjd Descriptor->Io.AddressLength = 343168404Spjd (UINT8) InitializerOp->Asl.Value.Integer; 344214622Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 345168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Io.AddressLength)); 346168404Spjd LengthOp = InitializerOp; 347168404Spjd break; 348168404Spjd 349168404Spjd case 5: /* Name */ 350168404Spjd 351168404Spjd UtAttachNamepathToOwner (Op, InitializerOp); 352168404Spjd break; 353168404Spjd 354168404Spjd default: 355168404Spjd 356168404Spjd AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 357168404Spjd break; 358168404Spjd } 359168404Spjd 360168404Spjd InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 361168404Spjd } 362168404Spjd 363168404Spjd /* Validate the Min/Max/Len/Align values */ 364168404Spjd 365255437Sdelphij RsSmallAddressCheck (ACPI_RESOURCE_NAME_IO, 366255437Sdelphij Descriptor->Io.Minimum, 367255437Sdelphij Descriptor->Io.Maximum, 368255437Sdelphij Descriptor->Io.AddressLength, 369255437Sdelphij Descriptor->Io.Alignment, 370255437Sdelphij MinOp, MaxOp, LengthOp, AlignOp, Op); 371318909Smav 372255437Sdelphij return (Rnode); 373255437Sdelphij} 374297508Smav 375255437Sdelphij 376255437Sdelphij/******************************************************************************* 377297508Smav * 378297508Smav * FUNCTION: RsDoIrqDescriptor 379297508Smav * 380297508Smav * PARAMETERS: Op - Parent resource descriptor parse node 381255437Sdelphij * CurrentByteOffset - Offset into the resource template AML 382255437Sdelphij * buffer (to track references to the desc) 383255437Sdelphij * 384318909Smav * RETURN: Completed resource node 385318909Smav * 386318909Smav * DESCRIPTION: Construct a short "IRQ" descriptor 387318909Smav * 388318909Smav ******************************************************************************/ 389318909Smav 390318909SmavASL_RESOURCE_NODE * 391255437SdelphijRsDoIrqDescriptor ( 392255437Sdelphij ACPI_PARSE_OBJECT *Op, 393255437Sdelphij UINT32 CurrentByteOffset) 394255437Sdelphij{ 395255437Sdelphij AML_RESOURCE *Descriptor; 396255437Sdelphij ACPI_PARSE_OBJECT *InitializerOp; 397255437Sdelphij ASL_RESOURCE_NODE *Rnode; 398255437Sdelphij UINT32 Interrupts = 0; 399255437Sdelphij UINT16 IrqMask = 0; 400255437Sdelphij UINT32 i; 401255437Sdelphij 402255437Sdelphij 403255437Sdelphij InitializerOp = Op->Asl.Child; 404255437Sdelphij Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ)); 405255437Sdelphij 406255437Sdelphij /* Length = 3 (with flag byte) */ 407255437Sdelphij 408168404Spjd Descriptor = Rnode->Buffer; 409168404Spjd Descriptor->Irq.DescriptorType = ACPI_RESOURCE_NAME_IRQ | 410168404Spjd (ASL_RDESC_IRQ_SIZE + 0x01); 411168404Spjd 412168404Spjd /* Process all child initialization nodes */ 413168404Spjd 414168404Spjd for (i = 0; InitializerOp; i++) 415168404Spjd { 416168404Spjd switch (i) 417168404Spjd { 418168404Spjd case 0: /* Interrupt Type (or Mode - edge/level) */ 419168404Spjd 420168404Spjd RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 0, 1); 421168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE, 422168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 0); 423168404Spjd break; 424168404Spjd 425168404Spjd case 1: /* Interrupt Level (or Polarity - Active high/low) */ 426168404Spjd 427168404Spjd RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 3, 0); 428168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL, 429168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 3); 430168404Spjd break; 431168404Spjd 432168404Spjd case 2: /* Share Type - Default: exclusive (0) */ 433168404Spjd 434168404Spjd RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 4, 0); 435168404Spjd RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE, 436168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 4); 437268084Sdelphij break; 438168404Spjd 439168404Spjd case 3: /* Name */ 440168404Spjd 441168404Spjd UtAttachNamepathToOwner (Op, InitializerOp); 442168404Spjd break; 443168404Spjd 444168404Spjd default: 445168404Spjd 446168404Spjd /* All IRQ bytes are handled here, after the flags and name */ 447168404Spjd 448168404Spjd if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 449168404Spjd { 450168404Spjd /* Up to 16 interrupts can be specified in the list */ 451168404Spjd 452168404Spjd Interrupts++; 453168404Spjd if (Interrupts > 16) 454168404Spjd { 455168404Spjd AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST, 456168404Spjd InitializerOp, NULL); 457168404Spjd return (Rnode); 458168404Spjd } 459168404Spjd 460168404Spjd /* Only interrupts 0-15 are allowed (mask is 16 bits) */ 461168404Spjd 462168404Spjd if (InitializerOp->Asl.Value.Integer > 15) 463168404Spjd { 464168404Spjd AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER, 465168404Spjd InitializerOp, NULL); 466168404Spjd } 467168404Spjd else 468168404Spjd { 469168404Spjd IrqMask |= (1 << (UINT8) InitializerOp->Asl.Value.Integer); 470168404Spjd } 471168404Spjd } 472168404Spjd 473168404Spjd /* Case 4: First IRQ value in list */ 474168404Spjd 475168404Spjd if (i == 4) 476168404Spjd { 477168404Spjd /* Check now for duplicates in list */ 478168404Spjd 479168404Spjd RsCheckListForDuplicates (InitializerOp); 480168404Spjd 481168404Spjd /* Create a named field at the start of the list */ 482168404Spjd 483168404Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT, 484168404Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask)); 485168404Spjd } 486268084Sdelphij break; 487268084Sdelphij } 488268084Sdelphij 489268084Sdelphij InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 490268084Sdelphij } 491268084Sdelphij 492268084Sdelphij /* Now we can set the channel mask */ 493268084Sdelphij 494268084Sdelphij Descriptor->Irq.IrqMask = IrqMask; 495268084Sdelphij return (Rnode); 496268084Sdelphij} 497168404Spjd 498168404Spjd 499168404Spjd/******************************************************************************* 500168404Spjd * 501168404Spjd * FUNCTION: RsDoIrqNoFlagsDescriptor 502168404Spjd * 503168404Spjd * PARAMETERS: Op - Parent resource descriptor parse node 504168404Spjd * CurrentByteOffset - Offset into the resource template AML 505168404Spjd * buffer (to track references to the desc) 506168404Spjd * 507168404Spjd * RETURN: Completed resource node 508168404Spjd * 509168404Spjd * DESCRIPTION: Construct a short "IRQNoFlags" descriptor 510219089Spjd * 511168404Spjd ******************************************************************************/ 512268084Sdelphij 513168404SpjdASL_RESOURCE_NODE * 514168404SpjdRsDoIrqNoFlagsDescriptor ( 515168404Spjd ACPI_PARSE_OBJECT *Op, 516168404Spjd UINT32 CurrentByteOffset) 517185029Spjd{ 518168404Spjd AML_RESOURCE *Descriptor; 519168404Spjd ACPI_PARSE_OBJECT *InitializerOp; 520185029Spjd ASL_RESOURCE_NODE *Rnode; 521168404Spjd UINT16 IrqMask = 0; 522168404Spjd UINT32 Interrupts = 0; 523168404Spjd UINT32 i; 524168404Spjd 525168404Spjd 526168404Spjd InitializerOp = Op->Asl.Child; 527168404Spjd Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ_NOFLAGS)); 528185029Spjd 529168404Spjd Descriptor = Rnode->Buffer; 530168404Spjd Descriptor->Irq.DescriptorType = ACPI_RESOURCE_NAME_IRQ | 531168404Spjd ASL_RDESC_IRQ_SIZE; 532168404Spjd 533168404Spjd /* Process all child initialization nodes */ 534168404Spjd 535168404Spjd for (i = 0; InitializerOp; i++) 536168404Spjd { 537168404Spjd switch (i) 538168404Spjd { 539289562Smav case 0: /* Name */ 540168404Spjd 541168404Spjd UtAttachNamepathToOwner (Op, InitializerOp); 542168404Spjd break; 543168404Spjd 544168404Spjd default: 545268084Sdelphij 546268084Sdelphij /* IRQ bytes are handled here, after the flags and name */ 547268084Sdelphij 548268084Sdelphij if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 549268084Sdelphij { 550168404Spjd /* Up to 16 interrupts can be specified in the list */ 551168404Spjd 552168404Spjd Interrupts++; 553168404Spjd if (Interrupts > 16) 554168404Spjd { 555236884Smm AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST, 556236884Smm InitializerOp, NULL); 557236884Smm return (Rnode); 558168404Spjd } 559168404Spjd 560168404Spjd /* Only interrupts 0-15 are allowed (mask is 16 bits) */ 561168404Spjd 562168404Spjd if (InitializerOp->Asl.Value.Integer > 15) 563168404Spjd { 564168404Spjd AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER, 565168404Spjd InitializerOp, NULL); 566168404Spjd } 567168404Spjd else 568168404Spjd { 569168404Spjd IrqMask |= (1 << ((UINT8) InitializerOp->Asl.Value.Integer)); 570168404Spjd } 571168404Spjd } 572168404Spjd 573185029Spjd /* Case 1: First IRQ value in list */ 574168404Spjd 575168404Spjd if (i == 1) 576268084Sdelphij { 577268084Sdelphij /* Check now for duplicates in list */ 578168404Spjd 579168404Spjd RsCheckListForDuplicates (InitializerOp); 580168404Spjd 581168404Spjd /* Create a named field at the start of the list */ 582219089Spjd 583219089Spjd RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT, 584219089Spjd CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask)); 585219089Spjd } 586219089Spjd break; 587219089Spjd } 588219089Spjd 589219089Spjd InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 590219089Spjd } 591219089Spjd 592219089Spjd /* Now we can set the interrupt mask */ 593219089Spjd 594219089Spjd Descriptor->Irq.IrqMask = IrqMask; 595219089Spjd return (Rnode); 596219089Spjd} 597219089Spjd