1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: rsutils - Utilities for the resource manager 4ae115bc7Smrj * 5ae115bc7Smrj ******************************************************************************/ 6ae115bc7Smrj 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9ae115bc7Smrj * All rights reserved. 10ae115bc7Smrj * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25ae115bc7Smrj * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29ae115bc7Smrj * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43ae115bc7Smrj 44ae115bc7Smrj #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46ae115bc7Smrj #include "acnamesp.h" 47ae115bc7Smrj #include "acresrc.h" 48ae115bc7Smrj 49ae115bc7Smrj 50ae115bc7Smrj #define _COMPONENT ACPI_RESOURCES 51ae115bc7Smrj ACPI_MODULE_NAME ("rsutils") 52ae115bc7Smrj 53ae115bc7Smrj 54ae115bc7Smrj /******************************************************************************* 55ae115bc7Smrj * 56ae115bc7Smrj * FUNCTION: AcpiRsDecodeBitmask 57ae115bc7Smrj * 58ae115bc7Smrj * PARAMETERS: Mask - Bitmask to decode 59ae115bc7Smrj * List - Where the converted list is returned 60ae115bc7Smrj * 61ae115bc7Smrj * RETURN: Count of bits set (length of list) 62ae115bc7Smrj * 63ae115bc7Smrj * DESCRIPTION: Convert a bit mask into a list of values 64ae115bc7Smrj * 65ae115bc7Smrj ******************************************************************************/ 66ae115bc7Smrj 67ae115bc7Smrj UINT8 68ae115bc7Smrj AcpiRsDecodeBitmask ( 69ae115bc7Smrj UINT16 Mask, 70ae115bc7Smrj UINT8 *List) 71ae115bc7Smrj { 72db2bae30SDana Myers UINT8 i; 73ae115bc7Smrj UINT8 BitCount; 74ae115bc7Smrj 75ae115bc7Smrj 76ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 77ae115bc7Smrj 78ae115bc7Smrj 79ae115bc7Smrj /* Decode the mask bits */ 80ae115bc7Smrj 81ae115bc7Smrj for (i = 0, BitCount = 0; Mask; i++) 82ae115bc7Smrj { 83ae115bc7Smrj if (Mask & 0x0001) 84ae115bc7Smrj { 85db2bae30SDana Myers List[BitCount] = i; 86ae115bc7Smrj BitCount++; 87ae115bc7Smrj } 88ae115bc7Smrj 89ae115bc7Smrj Mask >>= 1; 90ae115bc7Smrj } 91ae115bc7Smrj 92ae115bc7Smrj return (BitCount); 93ae115bc7Smrj } 94ae115bc7Smrj 95ae115bc7Smrj 96ae115bc7Smrj /******************************************************************************* 97ae115bc7Smrj * 98ae115bc7Smrj * FUNCTION: AcpiRsEncodeBitmask 99ae115bc7Smrj * 100ae115bc7Smrj * PARAMETERS: List - List of values to encode 101ae115bc7Smrj * Count - Length of list 102ae115bc7Smrj * 103ae115bc7Smrj * RETURN: Encoded bitmask 104ae115bc7Smrj * 105ae115bc7Smrj * DESCRIPTION: Convert a list of values to an encoded bitmask 106ae115bc7Smrj * 107ae115bc7Smrj ******************************************************************************/ 108ae115bc7Smrj 109ae115bc7Smrj UINT16 110ae115bc7Smrj AcpiRsEncodeBitmask ( 111ae115bc7Smrj UINT8 *List, 112ae115bc7Smrj UINT8 Count) 113ae115bc7Smrj { 114db2bae30SDana Myers UINT32 i; 115ae115bc7Smrj UINT16 Mask; 116ae115bc7Smrj 117ae115bc7Smrj 118ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 119ae115bc7Smrj 120ae115bc7Smrj 121ae115bc7Smrj /* Encode the list into a single bitmask */ 122ae115bc7Smrj 123ae115bc7Smrj for (i = 0, Mask = 0; i < Count; i++) 124ae115bc7Smrj { 125db2bae30SDana Myers Mask |= (0x1 << List[i]); 126ae115bc7Smrj } 127ae115bc7Smrj 128ae115bc7Smrj return (Mask); 129ae115bc7Smrj } 130ae115bc7Smrj 131ae115bc7Smrj 132ae115bc7Smrj /******************************************************************************* 133ae115bc7Smrj * 134ae115bc7Smrj * FUNCTION: AcpiRsMoveData 135ae115bc7Smrj * 136ae115bc7Smrj * PARAMETERS: Destination - Pointer to the destination descriptor 137ae115bc7Smrj * Source - Pointer to the source descriptor 138ae115bc7Smrj * ItemCount - How many items to move 139ae115bc7Smrj * MoveType - Byte width 140ae115bc7Smrj * 141ae115bc7Smrj * RETURN: None 142ae115bc7Smrj * 143ae115bc7Smrj * DESCRIPTION: Move multiple data items from one descriptor to another. Handles 144ae115bc7Smrj * alignment issues and endian issues if necessary, as configured 145ae115bc7Smrj * via the ACPI_MOVE_* macros. (This is why a memcpy is not used) 146ae115bc7Smrj * 147ae115bc7Smrj ******************************************************************************/ 148ae115bc7Smrj 149ae115bc7Smrj void 150ae115bc7Smrj AcpiRsMoveData ( 151ae115bc7Smrj void *Destination, 152ae115bc7Smrj void *Source, 153ae115bc7Smrj UINT16 ItemCount, 154ae115bc7Smrj UINT8 MoveType) 155ae115bc7Smrj { 156db2bae30SDana Myers UINT32 i; 157ae115bc7Smrj 158ae115bc7Smrj 159ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 160ae115bc7Smrj 161ae115bc7Smrj 162ae115bc7Smrj /* One move per item */ 163ae115bc7Smrj 164ae115bc7Smrj for (i = 0; i < ItemCount; i++) 165ae115bc7Smrj { 166ae115bc7Smrj switch (MoveType) 167ae115bc7Smrj { 168ae115bc7Smrj /* 169ae115bc7Smrj * For the 8-bit case, we can perform the move all at once 170ae115bc7Smrj * since there are no alignment or endian issues 171ae115bc7Smrj */ 172ae115bc7Smrj case ACPI_RSC_MOVE8: 173*385cc6b4SJerry Jelinek case ACPI_RSC_MOVE_GPIO_RES: 174*385cc6b4SJerry Jelinek case ACPI_RSC_MOVE_SERIAL_VEN: 175*385cc6b4SJerry Jelinek case ACPI_RSC_MOVE_SERIAL_RES: 176*385cc6b4SJerry Jelinek 177*385cc6b4SJerry Jelinek memcpy (Destination, Source, ItemCount); 178ae115bc7Smrj return; 179ae115bc7Smrj 180ae115bc7Smrj /* 181ae115bc7Smrj * 16-, 32-, and 64-bit cases must use the move macros that perform 182*385cc6b4SJerry Jelinek * endian conversion and/or accommodate hardware that cannot perform 183ae115bc7Smrj * misaligned memory transfers 184ae115bc7Smrj */ 185ae115bc7Smrj case ACPI_RSC_MOVE16: 186*385cc6b4SJerry Jelinek case ACPI_RSC_MOVE_GPIO_PIN: 187*385cc6b4SJerry Jelinek 188*385cc6b4SJerry Jelinek ACPI_MOVE_16_TO_16 ( 189*385cc6b4SJerry Jelinek &ACPI_CAST_PTR (UINT16, Destination)[i], 190ae115bc7Smrj &ACPI_CAST_PTR (UINT16, Source)[i]); 191ae115bc7Smrj break; 192ae115bc7Smrj 193ae115bc7Smrj case ACPI_RSC_MOVE32: 194*385cc6b4SJerry Jelinek 195*385cc6b4SJerry Jelinek ACPI_MOVE_32_TO_32 ( 196*385cc6b4SJerry Jelinek &ACPI_CAST_PTR (UINT32, Destination)[i], 197ae115bc7Smrj &ACPI_CAST_PTR (UINT32, Source)[i]); 198ae115bc7Smrj break; 199ae115bc7Smrj 200ae115bc7Smrj case ACPI_RSC_MOVE64: 201*385cc6b4SJerry Jelinek 202*385cc6b4SJerry Jelinek ACPI_MOVE_64_TO_64 ( 203*385cc6b4SJerry Jelinek &ACPI_CAST_PTR (UINT64, Destination)[i], 204ae115bc7Smrj &ACPI_CAST_PTR (UINT64, Source)[i]); 205ae115bc7Smrj break; 206ae115bc7Smrj 207ae115bc7Smrj default: 208*385cc6b4SJerry Jelinek 209ae115bc7Smrj return; 210ae115bc7Smrj } 211ae115bc7Smrj } 212ae115bc7Smrj } 213ae115bc7Smrj 214ae115bc7Smrj 215ae115bc7Smrj /******************************************************************************* 216ae115bc7Smrj * 217ae115bc7Smrj * FUNCTION: AcpiRsSetResourceLength 218ae115bc7Smrj * 219ae115bc7Smrj * PARAMETERS: TotalLength - Length of the AML descriptor, including 220ae115bc7Smrj * the header and length fields. 221ae115bc7Smrj * Aml - Pointer to the raw AML descriptor 222ae115bc7Smrj * 223ae115bc7Smrj * RETURN: None 224ae115bc7Smrj * 225ae115bc7Smrj * DESCRIPTION: Set the ResourceLength field of an AML 226ae115bc7Smrj * resource descriptor, both Large and Small descriptors are 227ae115bc7Smrj * supported automatically. Note: Descriptor Type field must 228ae115bc7Smrj * be valid. 229ae115bc7Smrj * 230ae115bc7Smrj ******************************************************************************/ 231ae115bc7Smrj 232ae115bc7Smrj void 233ae115bc7Smrj AcpiRsSetResourceLength ( 234ae115bc7Smrj ACPI_RSDESC_SIZE TotalLength, 235ae115bc7Smrj AML_RESOURCE *Aml) 236ae115bc7Smrj { 237ae115bc7Smrj ACPI_RS_LENGTH ResourceLength; 238ae115bc7Smrj 239ae115bc7Smrj 240ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 241ae115bc7Smrj 242ae115bc7Smrj 243ae115bc7Smrj /* Length is the total descriptor length minus the header length */ 244ae115bc7Smrj 245ae115bc7Smrj ResourceLength = (ACPI_RS_LENGTH) 246ae115bc7Smrj (TotalLength - AcpiUtGetResourceHeaderLength (Aml)); 247ae115bc7Smrj 248ae115bc7Smrj /* Length is stored differently for large and small descriptors */ 249ae115bc7Smrj 250ae115bc7Smrj if (Aml->SmallHeader.DescriptorType & ACPI_RESOURCE_NAME_LARGE) 251ae115bc7Smrj { 252ae115bc7Smrj /* Large descriptor -- bytes 1-2 contain the 16-bit length */ 253ae115bc7Smrj 254*385cc6b4SJerry Jelinek ACPI_MOVE_16_TO_16 ( 255*385cc6b4SJerry Jelinek &Aml->LargeHeader.ResourceLength, &ResourceLength); 256ae115bc7Smrj } 257ae115bc7Smrj else 258ae115bc7Smrj { 259*385cc6b4SJerry Jelinek /* 260*385cc6b4SJerry Jelinek * Small descriptor -- bits 2:0 of byte 0 contain the length 261*385cc6b4SJerry Jelinek * Clear any existing length, preserving descriptor type bits 262*385cc6b4SJerry Jelinek */ 263ae115bc7Smrj Aml->SmallHeader.DescriptorType = (UINT8) 264*385cc6b4SJerry Jelinek ((Aml->SmallHeader.DescriptorType & 265*385cc6b4SJerry Jelinek ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK) 266ae115bc7Smrj | ResourceLength); 267ae115bc7Smrj } 268ae115bc7Smrj } 269ae115bc7Smrj 270ae115bc7Smrj 271ae115bc7Smrj /******************************************************************************* 272ae115bc7Smrj * 273ae115bc7Smrj * FUNCTION: AcpiRsSetResourceHeader 274ae115bc7Smrj * 275ae115bc7Smrj * PARAMETERS: DescriptorType - Byte to be inserted as the type 276ae115bc7Smrj * TotalLength - Length of the AML descriptor, including 277ae115bc7Smrj * the header and length fields. 278ae115bc7Smrj * Aml - Pointer to the raw AML descriptor 279ae115bc7Smrj * 280ae115bc7Smrj * RETURN: None 281ae115bc7Smrj * 282ae115bc7Smrj * DESCRIPTION: Set the DescriptorType and ResourceLength fields of an AML 283ae115bc7Smrj * resource descriptor, both Large and Small descriptors are 284ae115bc7Smrj * supported automatically 285ae115bc7Smrj * 286ae115bc7Smrj ******************************************************************************/ 287ae115bc7Smrj 288ae115bc7Smrj void 289ae115bc7Smrj AcpiRsSetResourceHeader ( 290ae115bc7Smrj UINT8 DescriptorType, 291ae115bc7Smrj ACPI_RSDESC_SIZE TotalLength, 292ae115bc7Smrj AML_RESOURCE *Aml) 293ae115bc7Smrj { 294ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 295ae115bc7Smrj 296ae115bc7Smrj 297ae115bc7Smrj /* Set the Resource Type */ 298ae115bc7Smrj 299ae115bc7Smrj Aml->SmallHeader.DescriptorType = DescriptorType; 300ae115bc7Smrj 301ae115bc7Smrj /* Set the Resource Length */ 302ae115bc7Smrj 303ae115bc7Smrj AcpiRsSetResourceLength (TotalLength, Aml); 304ae115bc7Smrj } 305ae115bc7Smrj 306ae115bc7Smrj 307ae115bc7Smrj /******************************************************************************* 308ae115bc7Smrj * 309ae115bc7Smrj * FUNCTION: AcpiRsStrcpy 310ae115bc7Smrj * 311ae115bc7Smrj * PARAMETERS: Destination - Pointer to the destination string 312ae115bc7Smrj * Source - Pointer to the source string 313ae115bc7Smrj * 314ae115bc7Smrj * RETURN: String length, including NULL terminator 315ae115bc7Smrj * 316ae115bc7Smrj * DESCRIPTION: Local string copy that returns the string length, saving a 317ae115bc7Smrj * strcpy followed by a strlen. 318ae115bc7Smrj * 319ae115bc7Smrj ******************************************************************************/ 320ae115bc7Smrj 321ae115bc7Smrj static UINT16 322ae115bc7Smrj AcpiRsStrcpy ( 323ae115bc7Smrj char *Destination, 324ae115bc7Smrj char *Source) 325ae115bc7Smrj { 326ae115bc7Smrj UINT16 i; 327ae115bc7Smrj 328ae115bc7Smrj 329ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 330ae115bc7Smrj 331ae115bc7Smrj 332ae115bc7Smrj for (i = 0; Source[i]; i++) 333ae115bc7Smrj { 334ae115bc7Smrj Destination[i] = Source[i]; 335ae115bc7Smrj } 336ae115bc7Smrj 337ae115bc7Smrj Destination[i] = 0; 338ae115bc7Smrj 339ae115bc7Smrj /* Return string length including the NULL terminator */ 340ae115bc7Smrj 341ae115bc7Smrj return ((UINT16) (i + 1)); 342ae115bc7Smrj } 343ae115bc7Smrj 344ae115bc7Smrj 345ae115bc7Smrj /******************************************************************************* 346ae115bc7Smrj * 347ae115bc7Smrj * FUNCTION: AcpiRsGetResourceSource 348ae115bc7Smrj * 349ae115bc7Smrj * PARAMETERS: ResourceLength - Length field of the descriptor 350ae115bc7Smrj * MinimumLength - Minimum length of the descriptor (minus 351ae115bc7Smrj * any optional fields) 352ae115bc7Smrj * ResourceSource - Where the ResourceSource is returned 353ae115bc7Smrj * Aml - Pointer to the raw AML descriptor 354ae115bc7Smrj * StringPtr - (optional) where to store the actual 355ae115bc7Smrj * ResourceSource string 356ae115bc7Smrj * 357ae115bc7Smrj * RETURN: Length of the string plus NULL terminator, rounded up to native 358ae115bc7Smrj * word boundary 359ae115bc7Smrj * 360ae115bc7Smrj * DESCRIPTION: Copy the optional ResourceSource data from a raw AML descriptor 361ae115bc7Smrj * to an internal resource descriptor 362ae115bc7Smrj * 363ae115bc7Smrj ******************************************************************************/ 364ae115bc7Smrj 365ae115bc7Smrj ACPI_RS_LENGTH 366ae115bc7Smrj AcpiRsGetResourceSource ( 367ae115bc7Smrj ACPI_RS_LENGTH ResourceLength, 368ae115bc7Smrj ACPI_RS_LENGTH MinimumLength, 369ae115bc7Smrj ACPI_RESOURCE_SOURCE *ResourceSource, 370ae115bc7Smrj AML_RESOURCE *Aml, 371ae115bc7Smrj char *StringPtr) 372ae115bc7Smrj { 373ae115bc7Smrj ACPI_RSDESC_SIZE TotalLength; 374ae115bc7Smrj UINT8 *AmlResourceSource; 375ae115bc7Smrj 376ae115bc7Smrj 377ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 378ae115bc7Smrj 379ae115bc7Smrj 380ae115bc7Smrj TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER); 381ae115bc7Smrj AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength); 382ae115bc7Smrj 383ae115bc7Smrj /* 384*385cc6b4SJerry Jelinek * ResourceSource is present if the length of the descriptor is longer 385*385cc6b4SJerry Jelinek * than the minimum length. 386ae115bc7Smrj * 387ae115bc7Smrj * Note: Some resource descriptors will have an additional null, so 388ae115bc7Smrj * we add 1 to the minimum length. 389ae115bc7Smrj */ 390ae115bc7Smrj if (TotalLength > (ACPI_RSDESC_SIZE) (MinimumLength + 1)) 391ae115bc7Smrj { 392ae115bc7Smrj /* Get the ResourceSourceIndex */ 393ae115bc7Smrj 394ae115bc7Smrj ResourceSource->Index = AmlResourceSource[0]; 395ae115bc7Smrj 396ae115bc7Smrj ResourceSource->StringPtr = StringPtr; 397ae115bc7Smrj if (!StringPtr) 398ae115bc7Smrj { 399ae115bc7Smrj /* 400ae115bc7Smrj * String destination pointer is not specified; Set the String 401ae115bc7Smrj * pointer to the end of the current ResourceSource structure. 402ae115bc7Smrj */ 403*385cc6b4SJerry Jelinek ResourceSource->StringPtr = ACPI_ADD_PTR ( 404*385cc6b4SJerry Jelinek char, ResourceSource, sizeof (ACPI_RESOURCE_SOURCE)); 405ae115bc7Smrj } 406ae115bc7Smrj 407ae115bc7Smrj /* 408ae115bc7Smrj * In order for the Resource length to be a multiple of the native 409ae115bc7Smrj * word, calculate the length of the string (+1 for NULL terminator) 410ae115bc7Smrj * and expand to the next word multiple. 411ae115bc7Smrj * 412ae115bc7Smrj * Zero the entire area of the buffer. 413ae115bc7Smrj */ 414*385cc6b4SJerry Jelinek TotalLength = (UINT32) strlen ( 415ae115bc7Smrj ACPI_CAST_PTR (char, &AmlResourceSource[1])) + 1; 416*385cc6b4SJerry Jelinek 417ae115bc7Smrj TotalLength = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (TotalLength); 418ae115bc7Smrj 419*385cc6b4SJerry Jelinek memset (ResourceSource->StringPtr, 0, TotalLength); 420ae115bc7Smrj 421ae115bc7Smrj /* Copy the ResourceSource string to the destination */ 422ae115bc7Smrj 423*385cc6b4SJerry Jelinek ResourceSource->StringLength = AcpiRsStrcpy ( 424*385cc6b4SJerry Jelinek ResourceSource->StringPtr, 425ae115bc7Smrj ACPI_CAST_PTR (char, &AmlResourceSource[1])); 426ae115bc7Smrj 427ae115bc7Smrj return ((ACPI_RS_LENGTH) TotalLength); 428ae115bc7Smrj } 429ae115bc7Smrj 430ae115bc7Smrj /* ResourceSource is not present */ 431ae115bc7Smrj 432ae115bc7Smrj ResourceSource->Index = 0; 433ae115bc7Smrj ResourceSource->StringLength = 0; 434ae115bc7Smrj ResourceSource->StringPtr = NULL; 435ae115bc7Smrj return (0); 436ae115bc7Smrj } 437ae115bc7Smrj 438ae115bc7Smrj 439ae115bc7Smrj /******************************************************************************* 440ae115bc7Smrj * 441ae115bc7Smrj * FUNCTION: AcpiRsSetResourceSource 442ae115bc7Smrj * 443ae115bc7Smrj * PARAMETERS: Aml - Pointer to the raw AML descriptor 444ae115bc7Smrj * MinimumLength - Minimum length of the descriptor (minus 445ae115bc7Smrj * any optional fields) 446ae115bc7Smrj * ResourceSource - Internal ResourceSource 447ae115bc7Smrj 448ae115bc7Smrj * 449ae115bc7Smrj * RETURN: Total length of the AML descriptor 450ae115bc7Smrj * 451ae115bc7Smrj * DESCRIPTION: Convert an optional ResourceSource from internal format to a 452ae115bc7Smrj * raw AML resource descriptor 453ae115bc7Smrj * 454ae115bc7Smrj ******************************************************************************/ 455ae115bc7Smrj 456ae115bc7Smrj ACPI_RSDESC_SIZE 457ae115bc7Smrj AcpiRsSetResourceSource ( 458ae115bc7Smrj AML_RESOURCE *Aml, 459ae115bc7Smrj ACPI_RS_LENGTH MinimumLength, 460ae115bc7Smrj ACPI_RESOURCE_SOURCE *ResourceSource) 461ae115bc7Smrj { 462ae115bc7Smrj UINT8 *AmlResourceSource; 463ae115bc7Smrj ACPI_RSDESC_SIZE DescriptorLength; 464ae115bc7Smrj 465ae115bc7Smrj 466ae115bc7Smrj ACPI_FUNCTION_ENTRY (); 467ae115bc7Smrj 468ae115bc7Smrj 469ae115bc7Smrj DescriptorLength = MinimumLength; 470ae115bc7Smrj 471ae115bc7Smrj /* Non-zero string length indicates presence of a ResourceSource */ 472ae115bc7Smrj 473ae115bc7Smrj if (ResourceSource->StringLength) 474ae115bc7Smrj { 475ae115bc7Smrj /* Point to the end of the AML descriptor */ 476ae115bc7Smrj 477ae115bc7Smrj AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength); 478ae115bc7Smrj 479ae115bc7Smrj /* Copy the ResourceSourceIndex */ 480ae115bc7Smrj 481ae115bc7Smrj AmlResourceSource[0] = (UINT8) ResourceSource->Index; 482ae115bc7Smrj 483ae115bc7Smrj /* Copy the ResourceSource string */ 484ae115bc7Smrj 485*385cc6b4SJerry Jelinek strcpy (ACPI_CAST_PTR (char, &AmlResourceSource[1]), 486ae115bc7Smrj ResourceSource->StringPtr); 487ae115bc7Smrj 488ae115bc7Smrj /* 489ae115bc7Smrj * Add the length of the string (+ 1 for null terminator) to the 490ae115bc7Smrj * final descriptor length 491ae115bc7Smrj */ 492*385cc6b4SJerry Jelinek DescriptorLength += ((ACPI_RSDESC_SIZE) 493*385cc6b4SJerry Jelinek ResourceSource->StringLength + 1); 494ae115bc7Smrj } 495ae115bc7Smrj 496ae115bc7Smrj /* Return the new total length of the AML descriptor */ 497ae115bc7Smrj 498ae115bc7Smrj return (DescriptorLength); 499ae115bc7Smrj } 500ae115bc7Smrj 501ae115bc7Smrj 502ae115bc7Smrj /******************************************************************************* 503ae115bc7Smrj * 504ae115bc7Smrj * FUNCTION: AcpiRsGetPrtMethodData 505ae115bc7Smrj * 506ae115bc7Smrj * PARAMETERS: Node - Device node 507ae115bc7Smrj * RetBuffer - Pointer to a buffer structure for the 508ae115bc7Smrj * results 509ae115bc7Smrj * 510ae115bc7Smrj * RETURN: Status 511ae115bc7Smrj * 512ae115bc7Smrj * DESCRIPTION: This function is called to get the _PRT value of an object 513ae115bc7Smrj * contained in an object specified by the handle passed in 514ae115bc7Smrj * 515ae115bc7Smrj * If the function fails an appropriate status will be returned 516ae115bc7Smrj * and the contents of the callers buffer is undefined. 517ae115bc7Smrj * 518ae115bc7Smrj ******************************************************************************/ 519ae115bc7Smrj 520ae115bc7Smrj ACPI_STATUS 521ae115bc7Smrj AcpiRsGetPrtMethodData ( 522ae115bc7Smrj ACPI_NAMESPACE_NODE *Node, 523ae115bc7Smrj ACPI_BUFFER *RetBuffer) 524ae115bc7Smrj { 525ae115bc7Smrj ACPI_OPERAND_OBJECT *ObjDesc; 526ae115bc7Smrj ACPI_STATUS Status; 527ae115bc7Smrj 528ae115bc7Smrj 529ae115bc7Smrj ACPI_FUNCTION_TRACE (RsGetPrtMethodData); 530ae115bc7Smrj 531ae115bc7Smrj 532ae115bc7Smrj /* Parameters guaranteed valid by caller */ 533ae115bc7Smrj 534ae115bc7Smrj /* Execute the method, no parameters */ 535ae115bc7Smrj 536*385cc6b4SJerry Jelinek Status = AcpiUtEvaluateObject ( 537*385cc6b4SJerry Jelinek Node, METHOD_NAME__PRT, ACPI_BTYPE_PACKAGE, &ObjDesc); 538ae115bc7Smrj if (ACPI_FAILURE (Status)) 539ae115bc7Smrj { 540ae115bc7Smrj return_ACPI_STATUS (Status); 541ae115bc7Smrj } 542ae115bc7Smrj 543ae115bc7Smrj /* 544ae115bc7Smrj * Create a resource linked list from the byte stream buffer that comes 545ae115bc7Smrj * back from the _CRS method execution. 546ae115bc7Smrj */ 547ae115bc7Smrj Status = AcpiRsCreatePciRoutingTable (ObjDesc, RetBuffer); 548ae115bc7Smrj 549ae115bc7Smrj /* On exit, we must delete the object returned by EvaluateObject */ 550ae115bc7Smrj 551ae115bc7Smrj AcpiUtRemoveReference (ObjDesc); 552ae115bc7Smrj return_ACPI_STATUS (Status); 553ae115bc7Smrj } 554ae115bc7Smrj 555ae115bc7Smrj 556ae115bc7Smrj /******************************************************************************* 557ae115bc7Smrj * 558ae115bc7Smrj * FUNCTION: AcpiRsGetCrsMethodData 559ae115bc7Smrj * 560ae115bc7Smrj * PARAMETERS: Node - Device node 561ae115bc7Smrj * RetBuffer - Pointer to a buffer structure for the 562ae115bc7Smrj * results 563ae115bc7Smrj * 564ae115bc7Smrj * RETURN: Status 565ae115bc7Smrj * 566ae115bc7Smrj * DESCRIPTION: This function is called to get the _CRS value of an object 567ae115bc7Smrj * contained in an object specified by the handle passed in 568ae115bc7Smrj * 569ae115bc7Smrj * If the function fails an appropriate status will be returned 570ae115bc7Smrj * and the contents of the callers buffer is undefined. 571ae115bc7Smrj * 572ae115bc7Smrj ******************************************************************************/ 573ae115bc7Smrj 574ae115bc7Smrj ACPI_STATUS 575ae115bc7Smrj AcpiRsGetCrsMethodData ( 576ae115bc7Smrj ACPI_NAMESPACE_NODE *Node, 577ae115bc7Smrj ACPI_BUFFER *RetBuffer) 578ae115bc7Smrj { 579ae115bc7Smrj ACPI_OPERAND_OBJECT *ObjDesc; 580ae115bc7Smrj ACPI_STATUS Status; 581ae115bc7Smrj 582ae115bc7Smrj 583ae115bc7Smrj ACPI_FUNCTION_TRACE (RsGetCrsMethodData); 584ae115bc7Smrj 585ae115bc7Smrj 586ae115bc7Smrj /* Parameters guaranteed valid by caller */ 587ae115bc7Smrj 588ae115bc7Smrj /* Execute the method, no parameters */ 589ae115bc7Smrj 590*385cc6b4SJerry Jelinek Status = AcpiUtEvaluateObject ( 591*385cc6b4SJerry Jelinek Node, METHOD_NAME__CRS, ACPI_BTYPE_BUFFER, &ObjDesc); 592ae115bc7Smrj if (ACPI_FAILURE (Status)) 593ae115bc7Smrj { 594ae115bc7Smrj return_ACPI_STATUS (Status); 595ae115bc7Smrj } 596ae115bc7Smrj 597ae115bc7Smrj /* 598ae115bc7Smrj * Make the call to create a resource linked list from the 599ae115bc7Smrj * byte stream buffer that comes back from the _CRS method 600ae115bc7Smrj * execution. 601ae115bc7Smrj */ 602ae115bc7Smrj Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 603ae115bc7Smrj 604ae115bc7Smrj /* On exit, we must delete the object returned by evaluateObject */ 605ae115bc7Smrj 606ae115bc7Smrj AcpiUtRemoveReference (ObjDesc); 607ae115bc7Smrj return_ACPI_STATUS (Status); 608ae115bc7Smrj } 609ae115bc7Smrj 610ae115bc7Smrj 611ae115bc7Smrj /******************************************************************************* 612ae115bc7Smrj * 613ae115bc7Smrj * FUNCTION: AcpiRsGetPrsMethodData 614ae115bc7Smrj * 615ae115bc7Smrj * PARAMETERS: Node - Device node 616ae115bc7Smrj * RetBuffer - Pointer to a buffer structure for the 617ae115bc7Smrj * results 618ae115bc7Smrj * 619ae115bc7Smrj * RETURN: Status 620ae115bc7Smrj * 621ae115bc7Smrj * DESCRIPTION: This function is called to get the _PRS value of an object 622ae115bc7Smrj * contained in an object specified by the handle passed in 623ae115bc7Smrj * 624ae115bc7Smrj * If the function fails an appropriate status will be returned 625ae115bc7Smrj * and the contents of the callers buffer is undefined. 626ae115bc7Smrj * 627ae115bc7Smrj ******************************************************************************/ 628ae115bc7Smrj 629ae115bc7Smrj ACPI_STATUS 630ae115bc7Smrj AcpiRsGetPrsMethodData ( 631ae115bc7Smrj ACPI_NAMESPACE_NODE *Node, 632ae115bc7Smrj ACPI_BUFFER *RetBuffer) 633ae115bc7Smrj { 634ae115bc7Smrj ACPI_OPERAND_OBJECT *ObjDesc; 635ae115bc7Smrj ACPI_STATUS Status; 636ae115bc7Smrj 637ae115bc7Smrj 638ae115bc7Smrj ACPI_FUNCTION_TRACE (RsGetPrsMethodData); 639ae115bc7Smrj 640ae115bc7Smrj 641ae115bc7Smrj /* Parameters guaranteed valid by caller */ 642ae115bc7Smrj 643ae115bc7Smrj /* Execute the method, no parameters */ 644ae115bc7Smrj 645*385cc6b4SJerry Jelinek Status = AcpiUtEvaluateObject ( 646*385cc6b4SJerry Jelinek Node, METHOD_NAME__PRS, ACPI_BTYPE_BUFFER, &ObjDesc); 647*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 648*385cc6b4SJerry Jelinek { 649*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 650*385cc6b4SJerry Jelinek } 651*385cc6b4SJerry Jelinek 652*385cc6b4SJerry Jelinek /* 653*385cc6b4SJerry Jelinek * Make the call to create a resource linked list from the 654*385cc6b4SJerry Jelinek * byte stream buffer that comes back from the _CRS method 655*385cc6b4SJerry Jelinek * execution. 656*385cc6b4SJerry Jelinek */ 657*385cc6b4SJerry Jelinek Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 658*385cc6b4SJerry Jelinek 659*385cc6b4SJerry Jelinek /* On exit, we must delete the object returned by evaluateObject */ 660*385cc6b4SJerry Jelinek 661*385cc6b4SJerry Jelinek AcpiUtRemoveReference (ObjDesc); 662*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 663*385cc6b4SJerry Jelinek } 664*385cc6b4SJerry Jelinek 665*385cc6b4SJerry Jelinek 666*385cc6b4SJerry Jelinek /******************************************************************************* 667*385cc6b4SJerry Jelinek * 668*385cc6b4SJerry Jelinek * FUNCTION: AcpiRsGetAeiMethodData 669*385cc6b4SJerry Jelinek * 670*385cc6b4SJerry Jelinek * PARAMETERS: Node - Device node 671*385cc6b4SJerry Jelinek * RetBuffer - Pointer to a buffer structure for the 672*385cc6b4SJerry Jelinek * results 673*385cc6b4SJerry Jelinek * 674*385cc6b4SJerry Jelinek * RETURN: Status 675*385cc6b4SJerry Jelinek * 676*385cc6b4SJerry Jelinek * DESCRIPTION: This function is called to get the _AEI value of an object 677*385cc6b4SJerry Jelinek * contained in an object specified by the handle passed in 678*385cc6b4SJerry Jelinek * 679*385cc6b4SJerry Jelinek * If the function fails an appropriate status will be returned 680*385cc6b4SJerry Jelinek * and the contents of the callers buffer is undefined. 681*385cc6b4SJerry Jelinek * 682*385cc6b4SJerry Jelinek ******************************************************************************/ 683*385cc6b4SJerry Jelinek 684*385cc6b4SJerry Jelinek ACPI_STATUS 685*385cc6b4SJerry Jelinek AcpiRsGetAeiMethodData ( 686*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *Node, 687*385cc6b4SJerry Jelinek ACPI_BUFFER *RetBuffer) 688*385cc6b4SJerry Jelinek { 689*385cc6b4SJerry Jelinek ACPI_OPERAND_OBJECT *ObjDesc; 690*385cc6b4SJerry Jelinek ACPI_STATUS Status; 691*385cc6b4SJerry Jelinek 692*385cc6b4SJerry Jelinek 693*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (RsGetAeiMethodData); 694*385cc6b4SJerry Jelinek 695*385cc6b4SJerry Jelinek 696*385cc6b4SJerry Jelinek /* Parameters guaranteed valid by caller */ 697*385cc6b4SJerry Jelinek 698*385cc6b4SJerry Jelinek /* Execute the method, no parameters */ 699*385cc6b4SJerry Jelinek 700*385cc6b4SJerry Jelinek Status = AcpiUtEvaluateObject ( 701*385cc6b4SJerry Jelinek Node, METHOD_NAME__AEI, ACPI_BTYPE_BUFFER, &ObjDesc); 702ae115bc7Smrj if (ACPI_FAILURE (Status)) 703ae115bc7Smrj { 704ae115bc7Smrj return_ACPI_STATUS (Status); 705ae115bc7Smrj } 706ae115bc7Smrj 707ae115bc7Smrj /* 708ae115bc7Smrj * Make the call to create a resource linked list from the 709ae115bc7Smrj * byte stream buffer that comes back from the _CRS method 710ae115bc7Smrj * execution. 711ae115bc7Smrj */ 712ae115bc7Smrj Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 713ae115bc7Smrj 714ae115bc7Smrj /* On exit, we must delete the object returned by evaluateObject */ 715ae115bc7Smrj 716ae115bc7Smrj AcpiUtRemoveReference (ObjDesc); 717ae115bc7Smrj return_ACPI_STATUS (Status); 718ae115bc7Smrj } 719ae115bc7Smrj 720ae115bc7Smrj 721ae115bc7Smrj /******************************************************************************* 722ae115bc7Smrj * 723ae115bc7Smrj * FUNCTION: AcpiRsGetMethodData 724ae115bc7Smrj * 725ae115bc7Smrj * PARAMETERS: Handle - Handle to the containing object 726ae115bc7Smrj * Path - Path to method, relative to Handle 727ae115bc7Smrj * RetBuffer - Pointer to a buffer structure for the 728ae115bc7Smrj * results 729ae115bc7Smrj * 730ae115bc7Smrj * RETURN: Status 731ae115bc7Smrj * 732ae115bc7Smrj * DESCRIPTION: This function is called to get the _CRS or _PRS value of an 733ae115bc7Smrj * object contained in an object specified by the handle passed in 734ae115bc7Smrj * 735ae115bc7Smrj * If the function fails an appropriate status will be returned 736ae115bc7Smrj * and the contents of the callers buffer is undefined. 737ae115bc7Smrj * 738ae115bc7Smrj ******************************************************************************/ 739ae115bc7Smrj 740ae115bc7Smrj ACPI_STATUS 741ae115bc7Smrj AcpiRsGetMethodData ( 742ae115bc7Smrj ACPI_HANDLE Handle, 743*385cc6b4SJerry Jelinek const char *Path, 744ae115bc7Smrj ACPI_BUFFER *RetBuffer) 745ae115bc7Smrj { 746ae115bc7Smrj ACPI_OPERAND_OBJECT *ObjDesc; 747ae115bc7Smrj ACPI_STATUS Status; 748ae115bc7Smrj 749ae115bc7Smrj 750ae115bc7Smrj ACPI_FUNCTION_TRACE (RsGetMethodData); 751ae115bc7Smrj 752ae115bc7Smrj 753ae115bc7Smrj /* Parameters guaranteed valid by caller */ 754ae115bc7Smrj 755ae115bc7Smrj /* Execute the method, no parameters */ 756ae115bc7Smrj 757*385cc6b4SJerry Jelinek Status = AcpiUtEvaluateObject ( 758*385cc6b4SJerry Jelinek ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Handle), 759*385cc6b4SJerry Jelinek Path, ACPI_BTYPE_BUFFER, &ObjDesc); 760ae115bc7Smrj if (ACPI_FAILURE (Status)) 761ae115bc7Smrj { 762ae115bc7Smrj return_ACPI_STATUS (Status); 763ae115bc7Smrj } 764ae115bc7Smrj 765ae115bc7Smrj /* 766ae115bc7Smrj * Make the call to create a resource linked list from the 767ae115bc7Smrj * byte stream buffer that comes back from the method 768ae115bc7Smrj * execution. 769ae115bc7Smrj */ 770ae115bc7Smrj Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer); 771ae115bc7Smrj 772ae115bc7Smrj /* On exit, we must delete the object returned by EvaluateObject */ 773ae115bc7Smrj 774ae115bc7Smrj AcpiUtRemoveReference (ObjDesc); 775ae115bc7Smrj return_ACPI_STATUS (Status); 776ae115bc7Smrj } 777ae115bc7Smrj 778ae115bc7Smrj 779ae115bc7Smrj /******************************************************************************* 780ae115bc7Smrj * 781ae115bc7Smrj * FUNCTION: AcpiRsSetSrsMethodData 782ae115bc7Smrj * 783ae115bc7Smrj * PARAMETERS: Node - Device node 784ae115bc7Smrj * InBuffer - Pointer to a buffer structure of the 785ae115bc7Smrj * parameter 786ae115bc7Smrj * 787ae115bc7Smrj * RETURN: Status 788ae115bc7Smrj * 789ae115bc7Smrj * DESCRIPTION: This function is called to set the _SRS of an object contained 790ae115bc7Smrj * in an object specified by the handle passed in 791ae115bc7Smrj * 792ae115bc7Smrj * If the function fails an appropriate status will be returned 793ae115bc7Smrj * and the contents of the callers buffer is undefined. 794ae115bc7Smrj * 795ae115bc7Smrj * Note: Parameters guaranteed valid by caller 796ae115bc7Smrj * 797ae115bc7Smrj ******************************************************************************/ 798ae115bc7Smrj 799ae115bc7Smrj ACPI_STATUS 800ae115bc7Smrj AcpiRsSetSrsMethodData ( 801ae115bc7Smrj ACPI_NAMESPACE_NODE *Node, 802ae115bc7Smrj ACPI_BUFFER *InBuffer) 803ae115bc7Smrj { 804ae115bc7Smrj ACPI_EVALUATE_INFO *Info; 805ae115bc7Smrj ACPI_OPERAND_OBJECT *Args[2]; 806ae115bc7Smrj ACPI_STATUS Status; 807ae115bc7Smrj ACPI_BUFFER Buffer; 808ae115bc7Smrj 809ae115bc7Smrj 810ae115bc7Smrj ACPI_FUNCTION_TRACE (RsSetSrsMethodData); 811ae115bc7Smrj 812ae115bc7Smrj 813ae115bc7Smrj /* Allocate and initialize the evaluation information block */ 814ae115bc7Smrj 815ae115bc7Smrj Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO)); 816ae115bc7Smrj if (!Info) 817ae115bc7Smrj { 818ae115bc7Smrj return_ACPI_STATUS (AE_NO_MEMORY); 819ae115bc7Smrj } 820ae115bc7Smrj 821ae115bc7Smrj Info->PrefixNode = Node; 822*385cc6b4SJerry Jelinek Info->RelativePathname = METHOD_NAME__SRS; 823ae115bc7Smrj Info->Parameters = Args; 824ae115bc7Smrj Info->Flags = ACPI_IGNORE_RETURN_VALUE; 825ae115bc7Smrj 826ae115bc7Smrj /* 827ae115bc7Smrj * The InBuffer parameter will point to a linked list of 828ae115bc7Smrj * resource parameters. It needs to be formatted into a 829ae115bc7Smrj * byte stream to be sent in as an input parameter to _SRS 830ae115bc7Smrj * 831ae115bc7Smrj * Convert the linked list into a byte stream 832ae115bc7Smrj */ 833ae115bc7Smrj Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 834*385cc6b4SJerry Jelinek Status = AcpiRsCreateAmlResources (InBuffer, &Buffer); 835ae115bc7Smrj if (ACPI_FAILURE (Status)) 836ae115bc7Smrj { 837ae115bc7Smrj goto Cleanup; 838ae115bc7Smrj } 839ae115bc7Smrj 840ae115bc7Smrj /* Create and initialize the method parameter object */ 841ae115bc7Smrj 842ae115bc7Smrj Args[0] = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER); 843ae115bc7Smrj if (!Args[0]) 844ae115bc7Smrj { 845ae115bc7Smrj /* 846ae115bc7Smrj * Must free the buffer allocated above (otherwise it is freed 847ae115bc7Smrj * later) 848ae115bc7Smrj */ 849ae115bc7Smrj ACPI_FREE (Buffer.Pointer); 850ae115bc7Smrj Status = AE_NO_MEMORY; 851ae115bc7Smrj goto Cleanup; 852ae115bc7Smrj } 853ae115bc7Smrj 854ae115bc7Smrj Args[0]->Buffer.Length = (UINT32) Buffer.Length; 855ae115bc7Smrj Args[0]->Buffer.Pointer = Buffer.Pointer; 856ae115bc7Smrj Args[0]->Common.Flags = AOPOBJ_DATA_VALID; 857ae115bc7Smrj Args[1] = NULL; 858ae115bc7Smrj 859ae115bc7Smrj /* Execute the method, no return value is expected */ 860ae115bc7Smrj 861ae115bc7Smrj Status = AcpiNsEvaluate (Info); 862ae115bc7Smrj 863ae115bc7Smrj /* Clean up and return the status from AcpiNsEvaluate */ 864ae115bc7Smrj 865ae115bc7Smrj AcpiUtRemoveReference (Args[0]); 866ae115bc7Smrj 867ae115bc7Smrj Cleanup: 868ae115bc7Smrj ACPI_FREE (Info); 869ae115bc7Smrj return_ACPI_STATUS (Status); 870ae115bc7Smrj } 871