1*7851SDana.Myers@Sun.COM 2*7851SDana.Myers@Sun.COM /****************************************************************************** 3*7851SDana.Myers@Sun.COM * 4*7851SDana.Myers@Sun.COM * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities 5*7851SDana.Myers@Sun.COM * $Revision: 1.144 $ 6*7851SDana.Myers@Sun.COM * 7*7851SDana.Myers@Sun.COM *****************************************************************************/ 8*7851SDana.Myers@Sun.COM 9*7851SDana.Myers@Sun.COM /****************************************************************************** 10*7851SDana.Myers@Sun.COM * 11*7851SDana.Myers@Sun.COM * 1. Copyright Notice 12*7851SDana.Myers@Sun.COM * 13*7851SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp. 14*7851SDana.Myers@Sun.COM * All rights reserved. 15*7851SDana.Myers@Sun.COM * 16*7851SDana.Myers@Sun.COM * 2. License 17*7851SDana.Myers@Sun.COM * 18*7851SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property 19*7851SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided 20*7851SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual 21*7851SDana.Myers@Sun.COM * property rights. 22*7851SDana.Myers@Sun.COM * 23*7851SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 24*7851SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an 25*7851SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the 26*7851SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy, 27*7851SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered 28*7851SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and 29*7851SDana.Myers@Sun.COM * 30*7851SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 31*7851SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel 32*7851SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell, 33*7851SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof 34*7851SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright 35*7851SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions 36*7851SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right 37*7851SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise; 38*7851SDana.Myers@Sun.COM * 39*7851SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following 40*7851SDana.Myers@Sun.COM * conditions are met: 41*7851SDana.Myers@Sun.COM * 42*7851SDana.Myers@Sun.COM * 3. Conditions 43*7851SDana.Myers@Sun.COM * 44*7851SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source. 45*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 46*7851SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include 47*7851SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions, 48*7851SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition, 49*7851SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to 50*7851SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered 51*7851SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the 52*7851SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee 53*7851SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived, 54*7851SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code. 55*7851SDana.Myers@Sun.COM * 56*7851SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 57*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 58*7851SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must 59*7851SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the 60*7851SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In 61*7851SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any 62*7851SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the 63*7851SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual 64*7851SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and 65*7851SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may 66*7851SDana.Myers@Sun.COM * make. 67*7851SDana.Myers@Sun.COM * 68*7851SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any 69*7851SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the 70*7851SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance 71*7851SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the 72*7851SDana.Myers@Sun.COM * distribution. 73*7851SDana.Myers@Sun.COM * 74*7851SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original 75*7851SDana.Myers@Sun.COM * Intel Code. 76*7851SDana.Myers@Sun.COM * 77*7851SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by 78*7851SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or 79*7851SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code 80*7851SDana.Myers@Sun.COM * without prior written authorization from Intel. 81*7851SDana.Myers@Sun.COM * 82*7851SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance 83*7851SDana.Myers@Sun.COM * 84*7851SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 85*7851SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 86*7851SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 87*7851SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 88*7851SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 89*7851SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 90*7851SDana.Myers@Sun.COM * PARTICULAR PURPOSE. 91*7851SDana.Myers@Sun.COM * 92*7851SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 93*7851SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 94*7851SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 95*7851SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 96*7851SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 97*7851SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 98*7851SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 99*7851SDana.Myers@Sun.COM * LIMITED REMEDY. 100*7851SDana.Myers@Sun.COM * 101*7851SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this 102*7851SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any 103*7851SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or 104*7851SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the 105*7851SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or 106*7851SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall 107*7851SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in 108*7851SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the 109*7851SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor 110*7851SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process, 111*7851SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the 112*7851SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license, 113*7851SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining 114*7851SDana.Myers@Sun.COM * such license, approval or letter. 115*7851SDana.Myers@Sun.COM * 116*7851SDana.Myers@Sun.COM *****************************************************************************/ 117*7851SDana.Myers@Sun.COM 118*7851SDana.Myers@Sun.COM #define __EXPREP_C__ 119*7851SDana.Myers@Sun.COM 120*7851SDana.Myers@Sun.COM #include "acpi.h" 121*7851SDana.Myers@Sun.COM #include "acinterp.h" 122*7851SDana.Myers@Sun.COM #include "amlcode.h" 123*7851SDana.Myers@Sun.COM #include "acnamesp.h" 124*7851SDana.Myers@Sun.COM 125*7851SDana.Myers@Sun.COM 126*7851SDana.Myers@Sun.COM #define _COMPONENT ACPI_EXECUTER 127*7851SDana.Myers@Sun.COM ACPI_MODULE_NAME ("exprep") 128*7851SDana.Myers@Sun.COM 129*7851SDana.Myers@Sun.COM /* Local prototypes */ 130*7851SDana.Myers@Sun.COM 131*7851SDana.Myers@Sun.COM static UINT32 132*7851SDana.Myers@Sun.COM AcpiExDecodeFieldAccess ( 133*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc, 134*7851SDana.Myers@Sun.COM UINT8 FieldFlags, 135*7851SDana.Myers@Sun.COM UINT32 *ReturnByteAlignment); 136*7851SDana.Myers@Sun.COM 137*7851SDana.Myers@Sun.COM 138*7851SDana.Myers@Sun.COM #ifdef ACPI_UNDER_DEVELOPMENT 139*7851SDana.Myers@Sun.COM 140*7851SDana.Myers@Sun.COM static UINT32 141*7851SDana.Myers@Sun.COM AcpiExGenerateAccess ( 142*7851SDana.Myers@Sun.COM UINT32 FieldBitOffset, 143*7851SDana.Myers@Sun.COM UINT32 FieldBitLength, 144*7851SDana.Myers@Sun.COM UINT32 RegionLength); 145*7851SDana.Myers@Sun.COM 146*7851SDana.Myers@Sun.COM /******************************************************************************* 147*7851SDana.Myers@Sun.COM * 148*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExGenerateAccess 149*7851SDana.Myers@Sun.COM * 150*7851SDana.Myers@Sun.COM * PARAMETERS: FieldBitOffset - Start of field within parent region/buffer 151*7851SDana.Myers@Sun.COM * FieldBitLength - Length of field in bits 152*7851SDana.Myers@Sun.COM * RegionLength - Length of parent in bytes 153*7851SDana.Myers@Sun.COM * 154*7851SDana.Myers@Sun.COM * RETURN: Field granularity (8, 16, 32 or 64) and 155*7851SDana.Myers@Sun.COM * ByteAlignment (1, 2, 3, or 4) 156*7851SDana.Myers@Sun.COM * 157*7851SDana.Myers@Sun.COM * DESCRIPTION: Generate an optimal access width for fields defined with the 158*7851SDana.Myers@Sun.COM * AnyAcc keyword. 159*7851SDana.Myers@Sun.COM * 160*7851SDana.Myers@Sun.COM * NOTE: Need to have the RegionLength in order to check for boundary 161*7851SDana.Myers@Sun.COM * conditions (end-of-region). However, the RegionLength is a deferred 162*7851SDana.Myers@Sun.COM * operation. Therefore, to complete this implementation, the generation 163*7851SDana.Myers@Sun.COM * of this access width must be deferred until the region length has 164*7851SDana.Myers@Sun.COM * been evaluated. 165*7851SDana.Myers@Sun.COM * 166*7851SDana.Myers@Sun.COM ******************************************************************************/ 167*7851SDana.Myers@Sun.COM 168*7851SDana.Myers@Sun.COM static UINT32 169*7851SDana.Myers@Sun.COM AcpiExGenerateAccess ( 170*7851SDana.Myers@Sun.COM UINT32 FieldBitOffset, 171*7851SDana.Myers@Sun.COM UINT32 FieldBitLength, 172*7851SDana.Myers@Sun.COM UINT32 RegionLength) 173*7851SDana.Myers@Sun.COM { 174*7851SDana.Myers@Sun.COM UINT32 FieldByteLength; 175*7851SDana.Myers@Sun.COM UINT32 FieldByteOffset; 176*7851SDana.Myers@Sun.COM UINT32 FieldByteEndOffset; 177*7851SDana.Myers@Sun.COM UINT32 AccessByteWidth; 178*7851SDana.Myers@Sun.COM UINT32 FieldStartOffset; 179*7851SDana.Myers@Sun.COM UINT32 FieldEndOffset; 180*7851SDana.Myers@Sun.COM UINT32 MinimumAccessWidth = 0xFFFFFFFF; 181*7851SDana.Myers@Sun.COM UINT32 MinimumAccesses = 0xFFFFFFFF; 182*7851SDana.Myers@Sun.COM UINT32 Accesses; 183*7851SDana.Myers@Sun.COM 184*7851SDana.Myers@Sun.COM 185*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (ExGenerateAccess); 186*7851SDana.Myers@Sun.COM 187*7851SDana.Myers@Sun.COM 188*7851SDana.Myers@Sun.COM /* Round Field start offset and length to "minimal" byte boundaries */ 189*7851SDana.Myers@Sun.COM 190*7851SDana.Myers@Sun.COM FieldByteOffset = ACPI_DIV_8 (ACPI_ROUND_DOWN (FieldBitOffset, 8)); 191*7851SDana.Myers@Sun.COM FieldByteEndOffset = ACPI_DIV_8 (ACPI_ROUND_UP (FieldBitLength + 192*7851SDana.Myers@Sun.COM FieldBitOffset, 8)); 193*7851SDana.Myers@Sun.COM FieldByteLength = FieldByteEndOffset - FieldByteOffset; 194*7851SDana.Myers@Sun.COM 195*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 196*7851SDana.Myers@Sun.COM "Bit length %d, Bit offset %d\n", 197*7851SDana.Myers@Sun.COM FieldBitLength, FieldBitOffset)); 198*7851SDana.Myers@Sun.COM 199*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 200*7851SDana.Myers@Sun.COM "Byte Length %d, Byte Offset %d, End Offset %d\n", 201*7851SDana.Myers@Sun.COM FieldByteLength, FieldByteOffset, FieldByteEndOffset)); 202*7851SDana.Myers@Sun.COM 203*7851SDana.Myers@Sun.COM /* 204*7851SDana.Myers@Sun.COM * Iterative search for the maximum access width that is both aligned 205*7851SDana.Myers@Sun.COM * and does not go beyond the end of the region 206*7851SDana.Myers@Sun.COM * 207*7851SDana.Myers@Sun.COM * Start at ByteAcc and work upwards to QwordAcc max. (1,2,4,8 bytes) 208*7851SDana.Myers@Sun.COM */ 209*7851SDana.Myers@Sun.COM for (AccessByteWidth = 1; AccessByteWidth <= 8; AccessByteWidth <<= 1) 210*7851SDana.Myers@Sun.COM { 211*7851SDana.Myers@Sun.COM /* 212*7851SDana.Myers@Sun.COM * 1) Round end offset up to next access boundary and make sure that 213*7851SDana.Myers@Sun.COM * this does not go beyond the end of the parent region. 214*7851SDana.Myers@Sun.COM * 2) When the Access width is greater than the FieldByteLength, we 215*7851SDana.Myers@Sun.COM * are done. (This does not optimize for the perfectly aligned 216*7851SDana.Myers@Sun.COM * case yet). 217*7851SDana.Myers@Sun.COM */ 218*7851SDana.Myers@Sun.COM if (ACPI_ROUND_UP (FieldByteEndOffset, AccessByteWidth) <= RegionLength) 219*7851SDana.Myers@Sun.COM { 220*7851SDana.Myers@Sun.COM FieldStartOffset = 221*7851SDana.Myers@Sun.COM ACPI_ROUND_DOWN (FieldByteOffset, AccessByteWidth) / 222*7851SDana.Myers@Sun.COM AccessByteWidth; 223*7851SDana.Myers@Sun.COM 224*7851SDana.Myers@Sun.COM FieldEndOffset = 225*7851SDana.Myers@Sun.COM ACPI_ROUND_UP ((FieldByteLength + FieldByteOffset), 226*7851SDana.Myers@Sun.COM AccessByteWidth) / AccessByteWidth; 227*7851SDana.Myers@Sun.COM 228*7851SDana.Myers@Sun.COM Accesses = FieldEndOffset - FieldStartOffset; 229*7851SDana.Myers@Sun.COM 230*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 231*7851SDana.Myers@Sun.COM "AccessWidth %d end is within region\n", AccessByteWidth)); 232*7851SDana.Myers@Sun.COM 233*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 234*7851SDana.Myers@Sun.COM "Field Start %d, Field End %d -- requires %d accesses\n", 235*7851SDana.Myers@Sun.COM FieldStartOffset, FieldEndOffset, Accesses)); 236*7851SDana.Myers@Sun.COM 237*7851SDana.Myers@Sun.COM /* Single access is optimal */ 238*7851SDana.Myers@Sun.COM 239*7851SDana.Myers@Sun.COM if (Accesses <= 1) 240*7851SDana.Myers@Sun.COM { 241*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 242*7851SDana.Myers@Sun.COM "Entire field can be accessed with one operation of size %d\n", 243*7851SDana.Myers@Sun.COM AccessByteWidth)); 244*7851SDana.Myers@Sun.COM return_VALUE (AccessByteWidth); 245*7851SDana.Myers@Sun.COM } 246*7851SDana.Myers@Sun.COM 247*7851SDana.Myers@Sun.COM /* 248*7851SDana.Myers@Sun.COM * Fits in the region, but requires more than one read/write. 249*7851SDana.Myers@Sun.COM * try the next wider access on next iteration 250*7851SDana.Myers@Sun.COM */ 251*7851SDana.Myers@Sun.COM if (Accesses < MinimumAccesses) 252*7851SDana.Myers@Sun.COM { 253*7851SDana.Myers@Sun.COM MinimumAccesses = Accesses; 254*7851SDana.Myers@Sun.COM MinimumAccessWidth = AccessByteWidth; 255*7851SDana.Myers@Sun.COM } 256*7851SDana.Myers@Sun.COM } 257*7851SDana.Myers@Sun.COM else 258*7851SDana.Myers@Sun.COM { 259*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 260*7851SDana.Myers@Sun.COM "AccessWidth %d end is NOT within region\n", AccessByteWidth)); 261*7851SDana.Myers@Sun.COM if (AccessByteWidth == 1) 262*7851SDana.Myers@Sun.COM { 263*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 264*7851SDana.Myers@Sun.COM "Field goes beyond end-of-region!\n")); 265*7851SDana.Myers@Sun.COM 266*7851SDana.Myers@Sun.COM /* Field does not fit in the region at all */ 267*7851SDana.Myers@Sun.COM 268*7851SDana.Myers@Sun.COM return_VALUE (0); 269*7851SDana.Myers@Sun.COM } 270*7851SDana.Myers@Sun.COM 271*7851SDana.Myers@Sun.COM /* 272*7851SDana.Myers@Sun.COM * This width goes beyond the end-of-region, back off to 273*7851SDana.Myers@Sun.COM * previous access 274*7851SDana.Myers@Sun.COM */ 275*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 276*7851SDana.Myers@Sun.COM "Backing off to previous optimal access width of %d\n", 277*7851SDana.Myers@Sun.COM MinimumAccessWidth)); 278*7851SDana.Myers@Sun.COM return_VALUE (MinimumAccessWidth); 279*7851SDana.Myers@Sun.COM } 280*7851SDana.Myers@Sun.COM } 281*7851SDana.Myers@Sun.COM 282*7851SDana.Myers@Sun.COM /* 283*7851SDana.Myers@Sun.COM * Could not read/write field with one operation, 284*7851SDana.Myers@Sun.COM * just use max access width 285*7851SDana.Myers@Sun.COM */ 286*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 287*7851SDana.Myers@Sun.COM "Cannot access field in one operation, using width 8\n")); 288*7851SDana.Myers@Sun.COM return_VALUE (8); 289*7851SDana.Myers@Sun.COM } 290*7851SDana.Myers@Sun.COM #endif /* ACPI_UNDER_DEVELOPMENT */ 291*7851SDana.Myers@Sun.COM 292*7851SDana.Myers@Sun.COM 293*7851SDana.Myers@Sun.COM /******************************************************************************* 294*7851SDana.Myers@Sun.COM * 295*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExDecodeFieldAccess 296*7851SDana.Myers@Sun.COM * 297*7851SDana.Myers@Sun.COM * PARAMETERS: ObjDesc - Field object 298*7851SDana.Myers@Sun.COM * FieldFlags - Encoded fieldflags (contains access bits) 299*7851SDana.Myers@Sun.COM * ReturnByteAlignment - Where the byte alignment is returned 300*7851SDana.Myers@Sun.COM * 301*7851SDana.Myers@Sun.COM * RETURN: Field granularity (8, 16, 32 or 64) and 302*7851SDana.Myers@Sun.COM * ByteAlignment (1, 2, 3, or 4) 303*7851SDana.Myers@Sun.COM * 304*7851SDana.Myers@Sun.COM * DESCRIPTION: Decode the AccessType bits of a field definition. 305*7851SDana.Myers@Sun.COM * 306*7851SDana.Myers@Sun.COM ******************************************************************************/ 307*7851SDana.Myers@Sun.COM 308*7851SDana.Myers@Sun.COM static UINT32 309*7851SDana.Myers@Sun.COM AcpiExDecodeFieldAccess ( 310*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc, 311*7851SDana.Myers@Sun.COM UINT8 FieldFlags, 312*7851SDana.Myers@Sun.COM UINT32 *ReturnByteAlignment) 313*7851SDana.Myers@Sun.COM { 314*7851SDana.Myers@Sun.COM UINT32 Access; 315*7851SDana.Myers@Sun.COM UINT32 ByteAlignment; 316*7851SDana.Myers@Sun.COM UINT32 BitLength; 317*7851SDana.Myers@Sun.COM 318*7851SDana.Myers@Sun.COM 319*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (ExDecodeFieldAccess); 320*7851SDana.Myers@Sun.COM 321*7851SDana.Myers@Sun.COM 322*7851SDana.Myers@Sun.COM Access = (FieldFlags & AML_FIELD_ACCESS_TYPE_MASK); 323*7851SDana.Myers@Sun.COM 324*7851SDana.Myers@Sun.COM switch (Access) 325*7851SDana.Myers@Sun.COM { 326*7851SDana.Myers@Sun.COM case AML_FIELD_ACCESS_ANY: 327*7851SDana.Myers@Sun.COM 328*7851SDana.Myers@Sun.COM #ifdef ACPI_UNDER_DEVELOPMENT 329*7851SDana.Myers@Sun.COM ByteAlignment = 330*7851SDana.Myers@Sun.COM AcpiExGenerateAccess (ObjDesc->CommonField.StartFieldBitOffset, 331*7851SDana.Myers@Sun.COM ObjDesc->CommonField.BitLength, 332*7851SDana.Myers@Sun.COM 0xFFFFFFFF /* Temp until we pass RegionLength as parameter */); 333*7851SDana.Myers@Sun.COM BitLength = ByteAlignment * 8; 334*7851SDana.Myers@Sun.COM #endif 335*7851SDana.Myers@Sun.COM 336*7851SDana.Myers@Sun.COM ByteAlignment = 1; 337*7851SDana.Myers@Sun.COM BitLength = 8; 338*7851SDana.Myers@Sun.COM break; 339*7851SDana.Myers@Sun.COM 340*7851SDana.Myers@Sun.COM case AML_FIELD_ACCESS_BYTE: 341*7851SDana.Myers@Sun.COM case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 (SMBus Buffer) */ 342*7851SDana.Myers@Sun.COM ByteAlignment = 1; 343*7851SDana.Myers@Sun.COM BitLength = 8; 344*7851SDana.Myers@Sun.COM break; 345*7851SDana.Myers@Sun.COM 346*7851SDana.Myers@Sun.COM case AML_FIELD_ACCESS_WORD: 347*7851SDana.Myers@Sun.COM ByteAlignment = 2; 348*7851SDana.Myers@Sun.COM BitLength = 16; 349*7851SDana.Myers@Sun.COM break; 350*7851SDana.Myers@Sun.COM 351*7851SDana.Myers@Sun.COM case AML_FIELD_ACCESS_DWORD: 352*7851SDana.Myers@Sun.COM ByteAlignment = 4; 353*7851SDana.Myers@Sun.COM BitLength = 32; 354*7851SDana.Myers@Sun.COM break; 355*7851SDana.Myers@Sun.COM 356*7851SDana.Myers@Sun.COM case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */ 357*7851SDana.Myers@Sun.COM ByteAlignment = 8; 358*7851SDana.Myers@Sun.COM BitLength = 64; 359*7851SDana.Myers@Sun.COM break; 360*7851SDana.Myers@Sun.COM 361*7851SDana.Myers@Sun.COM default: 362*7851SDana.Myers@Sun.COM /* Invalid field access type */ 363*7851SDana.Myers@Sun.COM 364*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 365*7851SDana.Myers@Sun.COM "Unknown field access type %X", 366*7851SDana.Myers@Sun.COM Access)); 367*7851SDana.Myers@Sun.COM return_UINT32 (0); 368*7851SDana.Myers@Sun.COM } 369*7851SDana.Myers@Sun.COM 370*7851SDana.Myers@Sun.COM if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_BUFFER_FIELD) 371*7851SDana.Myers@Sun.COM { 372*7851SDana.Myers@Sun.COM /* 373*7851SDana.Myers@Sun.COM * BufferField access can be on any byte boundary, so the 374*7851SDana.Myers@Sun.COM * ByteAlignment is always 1 byte -- regardless of any ByteAlignment 375*7851SDana.Myers@Sun.COM * implied by the field access type. 376*7851SDana.Myers@Sun.COM */ 377*7851SDana.Myers@Sun.COM ByteAlignment = 1; 378*7851SDana.Myers@Sun.COM } 379*7851SDana.Myers@Sun.COM 380*7851SDana.Myers@Sun.COM *ReturnByteAlignment = ByteAlignment; 381*7851SDana.Myers@Sun.COM return_UINT32 (BitLength); 382*7851SDana.Myers@Sun.COM } 383*7851SDana.Myers@Sun.COM 384*7851SDana.Myers@Sun.COM 385*7851SDana.Myers@Sun.COM /******************************************************************************* 386*7851SDana.Myers@Sun.COM * 387*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExPrepCommonFieldObject 388*7851SDana.Myers@Sun.COM * 389*7851SDana.Myers@Sun.COM * PARAMETERS: ObjDesc - The field object 390*7851SDana.Myers@Sun.COM * FieldFlags - Access, LockRule, and UpdateRule. 391*7851SDana.Myers@Sun.COM * The format of a FieldFlag is described 392*7851SDana.Myers@Sun.COM * in the ACPI specification 393*7851SDana.Myers@Sun.COM * FieldAttribute - Special attributes (not used) 394*7851SDana.Myers@Sun.COM * FieldBitPosition - Field start position 395*7851SDana.Myers@Sun.COM * FieldBitLength - Field length in number of bits 396*7851SDana.Myers@Sun.COM * 397*7851SDana.Myers@Sun.COM * RETURN: Status 398*7851SDana.Myers@Sun.COM * 399*7851SDana.Myers@Sun.COM * DESCRIPTION: Initialize the areas of the field object that are common 400*7851SDana.Myers@Sun.COM * to the various types of fields. Note: This is very "sensitive" 401*7851SDana.Myers@Sun.COM * code because we are solving the general case for field 402*7851SDana.Myers@Sun.COM * alignment. 403*7851SDana.Myers@Sun.COM * 404*7851SDana.Myers@Sun.COM ******************************************************************************/ 405*7851SDana.Myers@Sun.COM 406*7851SDana.Myers@Sun.COM ACPI_STATUS 407*7851SDana.Myers@Sun.COM AcpiExPrepCommonFieldObject ( 408*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc, 409*7851SDana.Myers@Sun.COM UINT8 FieldFlags, 410*7851SDana.Myers@Sun.COM UINT8 FieldAttribute, 411*7851SDana.Myers@Sun.COM UINT32 FieldBitPosition, 412*7851SDana.Myers@Sun.COM UINT32 FieldBitLength) 413*7851SDana.Myers@Sun.COM { 414*7851SDana.Myers@Sun.COM UINT32 AccessBitWidth; 415*7851SDana.Myers@Sun.COM UINT32 ByteAlignment; 416*7851SDana.Myers@Sun.COM UINT32 NearestByteAddress; 417*7851SDana.Myers@Sun.COM 418*7851SDana.Myers@Sun.COM 419*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (ExPrepCommonFieldObject); 420*7851SDana.Myers@Sun.COM 421*7851SDana.Myers@Sun.COM 422*7851SDana.Myers@Sun.COM /* 423*7851SDana.Myers@Sun.COM * Note: the structure being initialized is the 424*7851SDana.Myers@Sun.COM * ACPI_COMMON_FIELD_INFO; No structure fields outside of the common 425*7851SDana.Myers@Sun.COM * area are initialized by this procedure. 426*7851SDana.Myers@Sun.COM */ 427*7851SDana.Myers@Sun.COM ObjDesc->CommonField.FieldFlags = FieldFlags; 428*7851SDana.Myers@Sun.COM ObjDesc->CommonField.Attribute = FieldAttribute; 429*7851SDana.Myers@Sun.COM ObjDesc->CommonField.BitLength = FieldBitLength; 430*7851SDana.Myers@Sun.COM 431*7851SDana.Myers@Sun.COM /* 432*7851SDana.Myers@Sun.COM * Decode the access type so we can compute offsets. The access type gives 433*7851SDana.Myers@Sun.COM * two pieces of information - the width of each field access and the 434*7851SDana.Myers@Sun.COM * necessary ByteAlignment (address granularity) of the access. 435*7851SDana.Myers@Sun.COM * 436*7851SDana.Myers@Sun.COM * For AnyAcc, the AccessBitWidth is the largest width that is both 437*7851SDana.Myers@Sun.COM * necessary and possible in an attempt to access the whole field in one 438*7851SDana.Myers@Sun.COM * I/O operation. However, for AnyAcc, the ByteAlignment is always one 439*7851SDana.Myers@Sun.COM * byte. 440*7851SDana.Myers@Sun.COM * 441*7851SDana.Myers@Sun.COM * For all Buffer Fields, the ByteAlignment is always one byte. 442*7851SDana.Myers@Sun.COM * 443*7851SDana.Myers@Sun.COM * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is 444*7851SDana.Myers@Sun.COM * the same (equivalent) as the ByteAlignment. 445*7851SDana.Myers@Sun.COM */ 446*7851SDana.Myers@Sun.COM AccessBitWidth = AcpiExDecodeFieldAccess (ObjDesc, FieldFlags, 447*7851SDana.Myers@Sun.COM &ByteAlignment); 448*7851SDana.Myers@Sun.COM if (!AccessBitWidth) 449*7851SDana.Myers@Sun.COM { 450*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_OPERAND_VALUE); 451*7851SDana.Myers@Sun.COM } 452*7851SDana.Myers@Sun.COM 453*7851SDana.Myers@Sun.COM /* Setup width (access granularity) fields */ 454*7851SDana.Myers@Sun.COM 455*7851SDana.Myers@Sun.COM ObjDesc->CommonField.AccessByteWidth = (UINT8) 456*7851SDana.Myers@Sun.COM ACPI_DIV_8 (AccessBitWidth); /* 1, 2, 4, 8 */ 457*7851SDana.Myers@Sun.COM 458*7851SDana.Myers@Sun.COM ObjDesc->CommonField.AccessBitWidth = (UINT8) AccessBitWidth; 459*7851SDana.Myers@Sun.COM 460*7851SDana.Myers@Sun.COM /* 461*7851SDana.Myers@Sun.COM * BaseByteOffset is the address of the start of the field within the 462*7851SDana.Myers@Sun.COM * region. It is the byte address of the first *datum* (field-width data 463*7851SDana.Myers@Sun.COM * unit) of the field. (i.e., the first datum that contains at least the 464*7851SDana.Myers@Sun.COM * first *bit* of the field.) 465*7851SDana.Myers@Sun.COM * 466*7851SDana.Myers@Sun.COM * Note: ByteAlignment is always either equal to the AccessBitWidth or 8 467*7851SDana.Myers@Sun.COM * (Byte access), and it defines the addressing granularity of the parent 468*7851SDana.Myers@Sun.COM * region or buffer. 469*7851SDana.Myers@Sun.COM */ 470*7851SDana.Myers@Sun.COM NearestByteAddress = 471*7851SDana.Myers@Sun.COM ACPI_ROUND_BITS_DOWN_TO_BYTES (FieldBitPosition); 472*7851SDana.Myers@Sun.COM ObjDesc->CommonField.BaseByteOffset = (UINT32) 473*7851SDana.Myers@Sun.COM ACPI_ROUND_DOWN (NearestByteAddress, ByteAlignment); 474*7851SDana.Myers@Sun.COM 475*7851SDana.Myers@Sun.COM /* 476*7851SDana.Myers@Sun.COM * StartFieldBitOffset is the offset of the first bit of the field within 477*7851SDana.Myers@Sun.COM * a field datum. 478*7851SDana.Myers@Sun.COM */ 479*7851SDana.Myers@Sun.COM ObjDesc->CommonField.StartFieldBitOffset = (UINT8) 480*7851SDana.Myers@Sun.COM (FieldBitPosition - ACPI_MUL_8 (ObjDesc->CommonField.BaseByteOffset)); 481*7851SDana.Myers@Sun.COM 482*7851SDana.Myers@Sun.COM /* 483*7851SDana.Myers@Sun.COM * Does the entire field fit within a single field access element? (datum) 484*7851SDana.Myers@Sun.COM * (i.e., without crossing a datum boundary) 485*7851SDana.Myers@Sun.COM */ 486*7851SDana.Myers@Sun.COM if ((ObjDesc->CommonField.StartFieldBitOffset + FieldBitLength) <= 487*7851SDana.Myers@Sun.COM (UINT16) AccessBitWidth) 488*7851SDana.Myers@Sun.COM { 489*7851SDana.Myers@Sun.COM ObjDesc->Common.Flags |= AOPOBJ_SINGLE_DATUM; 490*7851SDana.Myers@Sun.COM } 491*7851SDana.Myers@Sun.COM 492*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 493*7851SDana.Myers@Sun.COM } 494*7851SDana.Myers@Sun.COM 495*7851SDana.Myers@Sun.COM 496*7851SDana.Myers@Sun.COM /******************************************************************************* 497*7851SDana.Myers@Sun.COM * 498*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExPrepFieldValue 499*7851SDana.Myers@Sun.COM * 500*7851SDana.Myers@Sun.COM * PARAMETERS: Info - Contains all field creation info 501*7851SDana.Myers@Sun.COM * 502*7851SDana.Myers@Sun.COM * RETURN: Status 503*7851SDana.Myers@Sun.COM * 504*7851SDana.Myers@Sun.COM * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and 505*7851SDana.Myers@Sun.COM * connect it to the parent Node. 506*7851SDana.Myers@Sun.COM * 507*7851SDana.Myers@Sun.COM ******************************************************************************/ 508*7851SDana.Myers@Sun.COM 509*7851SDana.Myers@Sun.COM ACPI_STATUS 510*7851SDana.Myers@Sun.COM AcpiExPrepFieldValue ( 511*7851SDana.Myers@Sun.COM ACPI_CREATE_FIELD_INFO *Info) 512*7851SDana.Myers@Sun.COM { 513*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc; 514*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *SecondDesc = NULL; 515*7851SDana.Myers@Sun.COM UINT32 Type; 516*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 517*7851SDana.Myers@Sun.COM 518*7851SDana.Myers@Sun.COM 519*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (ExPrepFieldValue); 520*7851SDana.Myers@Sun.COM 521*7851SDana.Myers@Sun.COM 522*7851SDana.Myers@Sun.COM /* Parameter validation */ 523*7851SDana.Myers@Sun.COM 524*7851SDana.Myers@Sun.COM if (Info->FieldType != ACPI_TYPE_LOCAL_INDEX_FIELD) 525*7851SDana.Myers@Sun.COM { 526*7851SDana.Myers@Sun.COM if (!Info->RegionNode) 527*7851SDana.Myers@Sun.COM { 528*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, "Null RegionNode")); 529*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_NO_OPERAND); 530*7851SDana.Myers@Sun.COM } 531*7851SDana.Myers@Sun.COM 532*7851SDana.Myers@Sun.COM Type = AcpiNsGetType (Info->RegionNode); 533*7851SDana.Myers@Sun.COM if (Type != ACPI_TYPE_REGION) 534*7851SDana.Myers@Sun.COM { 535*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 536*7851SDana.Myers@Sun.COM "Needed Region, found type %X (%s)", 537*7851SDana.Myers@Sun.COM Type, AcpiUtGetTypeName (Type))); 538*7851SDana.Myers@Sun.COM 539*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_OPERAND_TYPE); 540*7851SDana.Myers@Sun.COM } 541*7851SDana.Myers@Sun.COM } 542*7851SDana.Myers@Sun.COM 543*7851SDana.Myers@Sun.COM /* Allocate a new field object */ 544*7851SDana.Myers@Sun.COM 545*7851SDana.Myers@Sun.COM ObjDesc = AcpiUtCreateInternalObject (Info->FieldType); 546*7851SDana.Myers@Sun.COM if (!ObjDesc) 547*7851SDana.Myers@Sun.COM { 548*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_NO_MEMORY); 549*7851SDana.Myers@Sun.COM } 550*7851SDana.Myers@Sun.COM 551*7851SDana.Myers@Sun.COM /* Initialize areas of the object that are common to all fields */ 552*7851SDana.Myers@Sun.COM 553*7851SDana.Myers@Sun.COM ObjDesc->CommonField.Node = Info->FieldNode; 554*7851SDana.Myers@Sun.COM Status = AcpiExPrepCommonFieldObject (ObjDesc, Info->FieldFlags, 555*7851SDana.Myers@Sun.COM Info->Attribute, Info->FieldBitPosition, Info->FieldBitLength); 556*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 557*7851SDana.Myers@Sun.COM { 558*7851SDana.Myers@Sun.COM AcpiUtDeleteObjectDesc (ObjDesc); 559*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 560*7851SDana.Myers@Sun.COM } 561*7851SDana.Myers@Sun.COM 562*7851SDana.Myers@Sun.COM /* Initialize areas of the object that are specific to the field type */ 563*7851SDana.Myers@Sun.COM 564*7851SDana.Myers@Sun.COM switch (Info->FieldType) 565*7851SDana.Myers@Sun.COM { 566*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_REGION_FIELD: 567*7851SDana.Myers@Sun.COM 568*7851SDana.Myers@Sun.COM ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode); 569*7851SDana.Myers@Sun.COM 570*7851SDana.Myers@Sun.COM /* An additional reference for the container */ 571*7851SDana.Myers@Sun.COM 572*7851SDana.Myers@Sun.COM AcpiUtAddReference (ObjDesc->Field.RegionObj); 573*7851SDana.Myers@Sun.COM 574*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 575*7851SDana.Myers@Sun.COM "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n", 576*7851SDana.Myers@Sun.COM ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset, 577*7851SDana.Myers@Sun.COM ObjDesc->Field.AccessByteWidth, ObjDesc->Field.RegionObj)); 578*7851SDana.Myers@Sun.COM break; 579*7851SDana.Myers@Sun.COM 580*7851SDana.Myers@Sun.COM 581*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_BANK_FIELD: 582*7851SDana.Myers@Sun.COM 583*7851SDana.Myers@Sun.COM ObjDesc->BankField.Value = Info->BankValue; 584*7851SDana.Myers@Sun.COM ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject ( 585*7851SDana.Myers@Sun.COM Info->RegionNode); 586*7851SDana.Myers@Sun.COM ObjDesc->BankField.BankObj = AcpiNsGetAttachedObject ( 587*7851SDana.Myers@Sun.COM Info->RegisterNode); 588*7851SDana.Myers@Sun.COM 589*7851SDana.Myers@Sun.COM /* An additional reference for the attached objects */ 590*7851SDana.Myers@Sun.COM 591*7851SDana.Myers@Sun.COM AcpiUtAddReference (ObjDesc->BankField.RegionObj); 592*7851SDana.Myers@Sun.COM AcpiUtAddReference (ObjDesc->BankField.BankObj); 593*7851SDana.Myers@Sun.COM 594*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 595*7851SDana.Myers@Sun.COM "Bank Field: BitOff %X, Off %X, Gran %X, Region %p, BankReg %p\n", 596*7851SDana.Myers@Sun.COM ObjDesc->BankField.StartFieldBitOffset, 597*7851SDana.Myers@Sun.COM ObjDesc->BankField.BaseByteOffset, 598*7851SDana.Myers@Sun.COM ObjDesc->Field.AccessByteWidth, 599*7851SDana.Myers@Sun.COM ObjDesc->BankField.RegionObj, 600*7851SDana.Myers@Sun.COM ObjDesc->BankField.BankObj)); 601*7851SDana.Myers@Sun.COM 602*7851SDana.Myers@Sun.COM /* 603*7851SDana.Myers@Sun.COM * Remember location in AML stream of the field unit 604*7851SDana.Myers@Sun.COM * opcode and operands -- since the BankValue 605*7851SDana.Myers@Sun.COM * operands must be evaluated. 606*7851SDana.Myers@Sun.COM */ 607*7851SDana.Myers@Sun.COM SecondDesc = ObjDesc->Common.NextObject; 608*7851SDana.Myers@Sun.COM SecondDesc->Extra.AmlStart = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Info->DataRegisterNode)->Named.Data; 609*7851SDana.Myers@Sun.COM SecondDesc->Extra.AmlLength = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Info->DataRegisterNode)->Named.Length; 610*7851SDana.Myers@Sun.COM 611*7851SDana.Myers@Sun.COM break; 612*7851SDana.Myers@Sun.COM 613*7851SDana.Myers@Sun.COM 614*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_INDEX_FIELD: 615*7851SDana.Myers@Sun.COM 616*7851SDana.Myers@Sun.COM /* Get the Index and Data registers */ 617*7851SDana.Myers@Sun.COM 618*7851SDana.Myers@Sun.COM ObjDesc->IndexField.IndexObj = AcpiNsGetAttachedObject ( 619*7851SDana.Myers@Sun.COM Info->RegisterNode); 620*7851SDana.Myers@Sun.COM ObjDesc->IndexField.DataObj = AcpiNsGetAttachedObject ( 621*7851SDana.Myers@Sun.COM Info->DataRegisterNode); 622*7851SDana.Myers@Sun.COM 623*7851SDana.Myers@Sun.COM if (!ObjDesc->IndexField.DataObj || !ObjDesc->IndexField.IndexObj) 624*7851SDana.Myers@Sun.COM { 625*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, "Null Index Object during field prep")); 626*7851SDana.Myers@Sun.COM AcpiUtDeleteObjectDesc (ObjDesc); 627*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_INTERNAL); 628*7851SDana.Myers@Sun.COM } 629*7851SDana.Myers@Sun.COM 630*7851SDana.Myers@Sun.COM /* An additional reference for the attached objects */ 631*7851SDana.Myers@Sun.COM 632*7851SDana.Myers@Sun.COM AcpiUtAddReference (ObjDesc->IndexField.DataObj); 633*7851SDana.Myers@Sun.COM AcpiUtAddReference (ObjDesc->IndexField.IndexObj); 634*7851SDana.Myers@Sun.COM 635*7851SDana.Myers@Sun.COM /* 636*7851SDana.Myers@Sun.COM * April 2006: Changed to match MS behavior 637*7851SDana.Myers@Sun.COM * 638*7851SDana.Myers@Sun.COM * The value written to the Index register is the byte offset of the 639*7851SDana.Myers@Sun.COM * target field in units of the granularity of the IndexField 640*7851SDana.Myers@Sun.COM * 641*7851SDana.Myers@Sun.COM * Previously, the value was calculated as an index in terms of the 642*7851SDana.Myers@Sun.COM * width of the Data register, as below: 643*7851SDana.Myers@Sun.COM * 644*7851SDana.Myers@Sun.COM * ObjDesc->IndexField.Value = (UINT32) 645*7851SDana.Myers@Sun.COM * (Info->FieldBitPosition / ACPI_MUL_8 ( 646*7851SDana.Myers@Sun.COM * ObjDesc->Field.AccessByteWidth)); 647*7851SDana.Myers@Sun.COM * 648*7851SDana.Myers@Sun.COM * February 2006: Tried value as a byte offset: 649*7851SDana.Myers@Sun.COM * ObjDesc->IndexField.Value = (UINT32) 650*7851SDana.Myers@Sun.COM * ACPI_DIV_8 (Info->FieldBitPosition); 651*7851SDana.Myers@Sun.COM */ 652*7851SDana.Myers@Sun.COM ObjDesc->IndexField.Value = (UINT32) ACPI_ROUND_DOWN ( 653*7851SDana.Myers@Sun.COM ACPI_DIV_8 (Info->FieldBitPosition), 654*7851SDana.Myers@Sun.COM ObjDesc->IndexField.AccessByteWidth); 655*7851SDana.Myers@Sun.COM 656*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, 657*7851SDana.Myers@Sun.COM "IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", 658*7851SDana.Myers@Sun.COM ObjDesc->IndexField.StartFieldBitOffset, 659*7851SDana.Myers@Sun.COM ObjDesc->IndexField.BaseByteOffset, 660*7851SDana.Myers@Sun.COM ObjDesc->IndexField.Value, 661*7851SDana.Myers@Sun.COM ObjDesc->Field.AccessByteWidth, 662*7851SDana.Myers@Sun.COM ObjDesc->IndexField.IndexObj, 663*7851SDana.Myers@Sun.COM ObjDesc->IndexField.DataObj)); 664*7851SDana.Myers@Sun.COM break; 665*7851SDana.Myers@Sun.COM 666*7851SDana.Myers@Sun.COM default: 667*7851SDana.Myers@Sun.COM /* No other types should get here */ 668*7851SDana.Myers@Sun.COM break; 669*7851SDana.Myers@Sun.COM } 670*7851SDana.Myers@Sun.COM 671*7851SDana.Myers@Sun.COM /* 672*7851SDana.Myers@Sun.COM * Store the constructed descriptor (ObjDesc) into the parent Node, 673*7851SDana.Myers@Sun.COM * preserving the current type of that NamedObj. 674*7851SDana.Myers@Sun.COM */ 675*7851SDana.Myers@Sun.COM Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc, 676*7851SDana.Myers@Sun.COM AcpiNsGetType (Info->FieldNode)); 677*7851SDana.Myers@Sun.COM 678*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set NamedObj %p [%4.4s], ObjDesc %p\n", 679*7851SDana.Myers@Sun.COM Info->FieldNode, AcpiUtGetNodeName (Info->FieldNode), ObjDesc)); 680*7851SDana.Myers@Sun.COM 681*7851SDana.Myers@Sun.COM /* Remove local reference to the object */ 682*7851SDana.Myers@Sun.COM 683*7851SDana.Myers@Sun.COM AcpiUtRemoveReference (ObjDesc); 684*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 685*7851SDana.Myers@Sun.COM } 686*7851SDana.Myers@Sun.COM 687