1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: rsxface - Public interfaces to 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 44*385cc6b4SJerry Jelinek #define EXPORT_ACPI_INTERFACES 45ae115bc7Smrj 46ae115bc7Smrj #include "acpi.h" 47aa2aa9a6SDana Myers #include "accommon.h" 48ae115bc7Smrj #include "acresrc.h" 49ae115bc7Smrj #include "acnamesp.h" 50ae115bc7Smrj 51ae115bc7Smrj #define _COMPONENT ACPI_RESOURCES 52ae115bc7Smrj ACPI_MODULE_NAME ("rsxface") 53ae115bc7Smrj 54ae115bc7Smrj /* Local macros for 16,32-bit to 64-bit conversion */ 55ae115bc7Smrj 56ae115bc7Smrj #define ACPI_COPY_FIELD(Out, In, Field) ((Out)->Field = (In)->Field) 57ae115bc7Smrj #define ACPI_COPY_ADDRESS(Out, In) \ 58ae115bc7Smrj ACPI_COPY_FIELD(Out, In, ResourceType); \ 59ae115bc7Smrj ACPI_COPY_FIELD(Out, In, ProducerConsumer); \ 60ae115bc7Smrj ACPI_COPY_FIELD(Out, In, Decode); \ 61ae115bc7Smrj ACPI_COPY_FIELD(Out, In, MinAddressFixed); \ 62ae115bc7Smrj ACPI_COPY_FIELD(Out, In, MaxAddressFixed); \ 63ae115bc7Smrj ACPI_COPY_FIELD(Out, In, Info); \ 64*385cc6b4SJerry Jelinek ACPI_COPY_FIELD(Out, In, Address.Granularity); \ 65*385cc6b4SJerry Jelinek ACPI_COPY_FIELD(Out, In, Address.Minimum); \ 66*385cc6b4SJerry Jelinek ACPI_COPY_FIELD(Out, In, Address.Maximum); \ 67*385cc6b4SJerry Jelinek ACPI_COPY_FIELD(Out, In, Address.TranslationOffset); \ 68*385cc6b4SJerry Jelinek ACPI_COPY_FIELD(Out, In, Address.AddressLength); \ 69ae115bc7Smrj ACPI_COPY_FIELD(Out, In, ResourceSource); 70ae115bc7Smrj 71ae115bc7Smrj 72ae115bc7Smrj /* Local prototypes */ 73ae115bc7Smrj 74ae115bc7Smrj static ACPI_STATUS 75ae115bc7Smrj AcpiRsMatchVendorResource ( 76ae115bc7Smrj ACPI_RESOURCE *Resource, 77ae115bc7Smrj void *Context); 78ae115bc7Smrj 79ae115bc7Smrj static ACPI_STATUS 80ae115bc7Smrj AcpiRsValidateParameters ( 81ae115bc7Smrj ACPI_HANDLE DeviceHandle, 82ae115bc7Smrj ACPI_BUFFER *Buffer, 83ae115bc7Smrj ACPI_NAMESPACE_NODE **ReturnNode); 84ae115bc7Smrj 85ae115bc7Smrj 86ae115bc7Smrj /******************************************************************************* 87ae115bc7Smrj * 88ae115bc7Smrj * FUNCTION: AcpiRsValidateParameters 89ae115bc7Smrj * 90ae115bc7Smrj * PARAMETERS: DeviceHandle - Handle to a device 91ae115bc7Smrj * Buffer - Pointer to a data buffer 92ae115bc7Smrj * ReturnNode - Pointer to where the device node is returned 93ae115bc7Smrj * 94ae115bc7Smrj * RETURN: Status 95ae115bc7Smrj * 96ae115bc7Smrj * DESCRIPTION: Common parameter validation for resource interfaces 97ae115bc7Smrj * 98ae115bc7Smrj ******************************************************************************/ 99ae115bc7Smrj 100ae115bc7Smrj static ACPI_STATUS 101ae115bc7Smrj AcpiRsValidateParameters ( 102ae115bc7Smrj ACPI_HANDLE DeviceHandle, 103ae115bc7Smrj ACPI_BUFFER *Buffer, 104ae115bc7Smrj ACPI_NAMESPACE_NODE **ReturnNode) 105ae115bc7Smrj { 106ae115bc7Smrj ACPI_STATUS Status; 107ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 108ae115bc7Smrj 109ae115bc7Smrj 110ae115bc7Smrj ACPI_FUNCTION_TRACE (RsValidateParameters); 111ae115bc7Smrj 112ae115bc7Smrj 113ae115bc7Smrj /* 114ae115bc7Smrj * Must have a valid handle to an ACPI device 115ae115bc7Smrj */ 116ae115bc7Smrj if (!DeviceHandle) 117ae115bc7Smrj { 118ae115bc7Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 119ae115bc7Smrj } 120ae115bc7Smrj 12126f3cdf0SGordon Ross Node = AcpiNsValidateHandle (DeviceHandle); 122ae115bc7Smrj if (!Node) 123ae115bc7Smrj { 124ae115bc7Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 125ae115bc7Smrj } 126ae115bc7Smrj 127ae115bc7Smrj if (Node->Type != ACPI_TYPE_DEVICE) 128ae115bc7Smrj { 129ae115bc7Smrj return_ACPI_STATUS (AE_TYPE); 130ae115bc7Smrj } 131ae115bc7Smrj 132ae115bc7Smrj /* 133ae115bc7Smrj * Validate the user buffer object 134ae115bc7Smrj * 135ae115bc7Smrj * if there is a non-zero buffer length we also need a valid pointer in 136ae115bc7Smrj * the buffer. If it's a zero buffer length, we'll be returning the 137ae115bc7Smrj * needed buffer size (later), so keep going. 138ae115bc7Smrj */ 139ae115bc7Smrj Status = AcpiUtValidateBuffer (Buffer); 140ae115bc7Smrj if (ACPI_FAILURE (Status)) 141ae115bc7Smrj { 142ae115bc7Smrj return_ACPI_STATUS (Status); 143ae115bc7Smrj } 144ae115bc7Smrj 145ae115bc7Smrj *ReturnNode = Node; 146ae115bc7Smrj return_ACPI_STATUS (AE_OK); 147ae115bc7Smrj } 148ae115bc7Smrj 149ae115bc7Smrj 150ae115bc7Smrj /******************************************************************************* 151ae115bc7Smrj * 152ae115bc7Smrj * FUNCTION: AcpiGetIrqRoutingTable 153ae115bc7Smrj * 154ae115bc7Smrj * PARAMETERS: DeviceHandle - Handle to the Bus device we are querying 155ae115bc7Smrj * RetBuffer - Pointer to a buffer to receive the 156ae115bc7Smrj * current resources for the device 157ae115bc7Smrj * 158ae115bc7Smrj * RETURN: Status 159ae115bc7Smrj * 160ae115bc7Smrj * DESCRIPTION: This function is called to get the IRQ routing table for a 161ae115bc7Smrj * specific bus. The caller must first acquire a handle for the 162ae115bc7Smrj * desired bus. The routine table is placed in the buffer pointed 163ae115bc7Smrj * to by the RetBuffer variable parameter. 164ae115bc7Smrj * 165ae115bc7Smrj * If the function fails an appropriate status will be returned 166ae115bc7Smrj * and the value of RetBuffer is undefined. 167ae115bc7Smrj * 168ae115bc7Smrj * This function attempts to execute the _PRT method contained in 169ae115bc7Smrj * the object indicated by the passed DeviceHandle. 170ae115bc7Smrj * 171ae115bc7Smrj ******************************************************************************/ 172ae115bc7Smrj 173ae115bc7Smrj ACPI_STATUS 174ae115bc7Smrj AcpiGetIrqRoutingTable ( 175ae115bc7Smrj ACPI_HANDLE DeviceHandle, 176ae115bc7Smrj ACPI_BUFFER *RetBuffer) 177ae115bc7Smrj { 178ae115bc7Smrj ACPI_STATUS Status; 179ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 180ae115bc7Smrj 181ae115bc7Smrj 182ae115bc7Smrj ACPI_FUNCTION_TRACE (AcpiGetIrqRoutingTable); 183ae115bc7Smrj 184ae115bc7Smrj 185ae115bc7Smrj /* Validate parameters then dispatch to internal routine */ 186ae115bc7Smrj 187ae115bc7Smrj Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node); 188ae115bc7Smrj if (ACPI_FAILURE (Status)) 189ae115bc7Smrj { 190ae115bc7Smrj return_ACPI_STATUS (Status); 191ae115bc7Smrj } 192ae115bc7Smrj 193ae115bc7Smrj Status = AcpiRsGetPrtMethodData (Node, RetBuffer); 194ae115bc7Smrj return_ACPI_STATUS (Status); 195ae115bc7Smrj } 196ae115bc7Smrj 197ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiGetIrqRoutingTable) 198ae115bc7Smrj 199ae115bc7Smrj 200ae115bc7Smrj /******************************************************************************* 201ae115bc7Smrj * 202ae115bc7Smrj * FUNCTION: AcpiGetCurrentResources 203ae115bc7Smrj * 204ae115bc7Smrj * PARAMETERS: DeviceHandle - Handle to the device object for the 205ae115bc7Smrj * device we are querying 206ae115bc7Smrj * RetBuffer - Pointer to a buffer to receive the 207ae115bc7Smrj * current resources for the device 208ae115bc7Smrj * 209ae115bc7Smrj * RETURN: Status 210ae115bc7Smrj * 211ae115bc7Smrj * DESCRIPTION: This function is called to get the current resources for a 212ae115bc7Smrj * specific device. The caller must first acquire a handle for 213ae115bc7Smrj * the desired device. The resource data is placed in the buffer 214ae115bc7Smrj * pointed to by the RetBuffer variable parameter. 215ae115bc7Smrj * 216ae115bc7Smrj * If the function fails an appropriate status will be returned 217ae115bc7Smrj * and the value of RetBuffer is undefined. 218ae115bc7Smrj * 219ae115bc7Smrj * This function attempts to execute the _CRS method contained in 220ae115bc7Smrj * the object indicated by the passed DeviceHandle. 221ae115bc7Smrj * 222ae115bc7Smrj ******************************************************************************/ 223ae115bc7Smrj 224ae115bc7Smrj ACPI_STATUS 225ae115bc7Smrj AcpiGetCurrentResources ( 226ae115bc7Smrj ACPI_HANDLE DeviceHandle, 227ae115bc7Smrj ACPI_BUFFER *RetBuffer) 228ae115bc7Smrj { 229ae115bc7Smrj ACPI_STATUS Status; 230ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 231ae115bc7Smrj 232ae115bc7Smrj 233ae115bc7Smrj ACPI_FUNCTION_TRACE (AcpiGetCurrentResources); 234ae115bc7Smrj 235ae115bc7Smrj 236ae115bc7Smrj /* Validate parameters then dispatch to internal routine */ 237ae115bc7Smrj 238ae115bc7Smrj Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node); 239ae115bc7Smrj if (ACPI_FAILURE (Status)) 240ae115bc7Smrj { 241ae115bc7Smrj return_ACPI_STATUS (Status); 242ae115bc7Smrj } 243ae115bc7Smrj 244ae115bc7Smrj Status = AcpiRsGetCrsMethodData (Node, RetBuffer); 245ae115bc7Smrj return_ACPI_STATUS (Status); 246ae115bc7Smrj } 247ae115bc7Smrj 248ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiGetCurrentResources) 249ae115bc7Smrj 250ae115bc7Smrj 251ae115bc7Smrj /******************************************************************************* 252ae115bc7Smrj * 253ae115bc7Smrj * FUNCTION: AcpiGetPossibleResources 254ae115bc7Smrj * 255ae115bc7Smrj * PARAMETERS: DeviceHandle - Handle to the device object for the 256ae115bc7Smrj * device we are querying 257ae115bc7Smrj * RetBuffer - Pointer to a buffer to receive the 258ae115bc7Smrj * resources for the device 259ae115bc7Smrj * 260ae115bc7Smrj * RETURN: Status 261ae115bc7Smrj * 262ae115bc7Smrj * DESCRIPTION: This function is called to get a list of the possible resources 263ae115bc7Smrj * for a specific device. The caller must first acquire a handle 264ae115bc7Smrj * for the desired device. The resource data is placed in the 265ae115bc7Smrj * buffer pointed to by the RetBuffer variable. 266ae115bc7Smrj * 267ae115bc7Smrj * If the function fails an appropriate status will be returned 268ae115bc7Smrj * and the value of RetBuffer is undefined. 269ae115bc7Smrj * 270ae115bc7Smrj ******************************************************************************/ 271ae115bc7Smrj 272ae115bc7Smrj ACPI_STATUS 273ae115bc7Smrj AcpiGetPossibleResources ( 274ae115bc7Smrj ACPI_HANDLE DeviceHandle, 275ae115bc7Smrj ACPI_BUFFER *RetBuffer) 276ae115bc7Smrj { 277ae115bc7Smrj ACPI_STATUS Status; 278ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 279ae115bc7Smrj 280ae115bc7Smrj 281ae115bc7Smrj ACPI_FUNCTION_TRACE (AcpiGetPossibleResources); 282ae115bc7Smrj 283ae115bc7Smrj 284ae115bc7Smrj /* Validate parameters then dispatch to internal routine */ 285ae115bc7Smrj 286ae115bc7Smrj Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node); 287ae115bc7Smrj if (ACPI_FAILURE (Status)) 288ae115bc7Smrj { 289ae115bc7Smrj return_ACPI_STATUS (Status); 290ae115bc7Smrj } 291ae115bc7Smrj 292ae115bc7Smrj Status = AcpiRsGetPrsMethodData (Node, RetBuffer); 293ae115bc7Smrj return_ACPI_STATUS (Status); 294ae115bc7Smrj } 295ae115bc7Smrj 296ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiGetPossibleResources) 297ae115bc7Smrj 298ae115bc7Smrj 299ae115bc7Smrj /******************************************************************************* 300ae115bc7Smrj * 301ae115bc7Smrj * FUNCTION: AcpiSetCurrentResources 302ae115bc7Smrj * 303ae115bc7Smrj * PARAMETERS: DeviceHandle - Handle to the device object for the 304ae115bc7Smrj * device we are setting resources 305ae115bc7Smrj * InBuffer - Pointer to a buffer containing the 306ae115bc7Smrj * resources to be set for the device 307ae115bc7Smrj * 308ae115bc7Smrj * RETURN: Status 309ae115bc7Smrj * 310ae115bc7Smrj * DESCRIPTION: This function is called to set the current resources for a 311ae115bc7Smrj * specific device. The caller must first acquire a handle for 312ae115bc7Smrj * the desired device. The resource data is passed to the routine 313ae115bc7Smrj * the buffer pointed to by the InBuffer variable. 314ae115bc7Smrj * 315ae115bc7Smrj ******************************************************************************/ 316ae115bc7Smrj 317ae115bc7Smrj ACPI_STATUS 318ae115bc7Smrj AcpiSetCurrentResources ( 319ae115bc7Smrj ACPI_HANDLE DeviceHandle, 320ae115bc7Smrj ACPI_BUFFER *InBuffer) 321ae115bc7Smrj { 322ae115bc7Smrj ACPI_STATUS Status; 323ae115bc7Smrj ACPI_NAMESPACE_NODE *Node; 324ae115bc7Smrj 325ae115bc7Smrj 326ae115bc7Smrj ACPI_FUNCTION_TRACE (AcpiSetCurrentResources); 327ae115bc7Smrj 328ae115bc7Smrj 329ae115bc7Smrj /* Validate the buffer, don't allow zero length */ 330ae115bc7Smrj 331ae115bc7Smrj if ((!InBuffer) || 332ae115bc7Smrj (!InBuffer->Pointer) || 333ae115bc7Smrj (!InBuffer->Length)) 334ae115bc7Smrj { 335ae115bc7Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 336ae115bc7Smrj } 337ae115bc7Smrj 338ae115bc7Smrj /* Validate parameters then dispatch to internal routine */ 339ae115bc7Smrj 340ae115bc7Smrj Status = AcpiRsValidateParameters (DeviceHandle, InBuffer, &Node); 341ae115bc7Smrj if (ACPI_FAILURE (Status)) 342ae115bc7Smrj { 343ae115bc7Smrj return_ACPI_STATUS (Status); 344ae115bc7Smrj } 345ae115bc7Smrj 346ae115bc7Smrj Status = AcpiRsSetSrsMethodData (Node, InBuffer); 347ae115bc7Smrj return_ACPI_STATUS (Status); 348ae115bc7Smrj } 349ae115bc7Smrj 350ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiSetCurrentResources) 351ae115bc7Smrj 352ae115bc7Smrj 353*385cc6b4SJerry Jelinek /******************************************************************************* 354*385cc6b4SJerry Jelinek * 355*385cc6b4SJerry Jelinek * FUNCTION: AcpiGetEventResources 356*385cc6b4SJerry Jelinek * 357*385cc6b4SJerry Jelinek * PARAMETERS: DeviceHandle - Handle to the device object for the 358*385cc6b4SJerry Jelinek * device we are getting resources 359*385cc6b4SJerry Jelinek * InBuffer - Pointer to a buffer containing the 360*385cc6b4SJerry Jelinek * resources to be set for the device 361*385cc6b4SJerry Jelinek * 362*385cc6b4SJerry Jelinek * RETURN: Status 363*385cc6b4SJerry Jelinek * 364*385cc6b4SJerry Jelinek * DESCRIPTION: This function is called to get the event resources for a 365*385cc6b4SJerry Jelinek * specific device. The caller must first acquire a handle for 366*385cc6b4SJerry Jelinek * the desired device. The resource data is passed to the routine 367*385cc6b4SJerry Jelinek * the buffer pointed to by the InBuffer variable. Uses the 368*385cc6b4SJerry Jelinek * _AEI method. 369*385cc6b4SJerry Jelinek * 370*385cc6b4SJerry Jelinek ******************************************************************************/ 371*385cc6b4SJerry Jelinek 372*385cc6b4SJerry Jelinek ACPI_STATUS 373*385cc6b4SJerry Jelinek AcpiGetEventResources ( 374*385cc6b4SJerry Jelinek ACPI_HANDLE DeviceHandle, 375*385cc6b4SJerry Jelinek ACPI_BUFFER *RetBuffer) 376*385cc6b4SJerry Jelinek { 377*385cc6b4SJerry Jelinek ACPI_STATUS Status; 378*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *Node; 379*385cc6b4SJerry Jelinek 380*385cc6b4SJerry Jelinek 381*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiGetEventResources); 382*385cc6b4SJerry Jelinek 383*385cc6b4SJerry Jelinek 384*385cc6b4SJerry Jelinek /* Validate parameters then dispatch to internal routine */ 385*385cc6b4SJerry Jelinek 386*385cc6b4SJerry Jelinek Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node); 387*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 388*385cc6b4SJerry Jelinek { 389*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 390*385cc6b4SJerry Jelinek } 391*385cc6b4SJerry Jelinek 392*385cc6b4SJerry Jelinek Status = AcpiRsGetAeiMethodData (Node, RetBuffer); 393*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 394*385cc6b4SJerry Jelinek } 395*385cc6b4SJerry Jelinek 396*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiGetEventResources) 397*385cc6b4SJerry Jelinek 398*385cc6b4SJerry Jelinek 399ae115bc7Smrj /****************************************************************************** 400ae115bc7Smrj * 401ae115bc7Smrj * FUNCTION: AcpiResourceToAddress64 402ae115bc7Smrj * 403ae115bc7Smrj * PARAMETERS: Resource - Pointer to a resource 404ae115bc7Smrj * Out - Pointer to the users's return buffer 405ae115bc7Smrj * (a struct acpi_resource_address64) 406ae115bc7Smrj * 407ae115bc7Smrj * RETURN: Status 408ae115bc7Smrj * 409ae115bc7Smrj * DESCRIPTION: If the resource is an address16, address32, or address64, 410ae115bc7Smrj * copy it to the address64 return buffer. This saves the 411ae115bc7Smrj * caller from having to duplicate code for different-sized 412ae115bc7Smrj * addresses. 413ae115bc7Smrj * 414ae115bc7Smrj ******************************************************************************/ 415ae115bc7Smrj 416ae115bc7Smrj ACPI_STATUS 417ae115bc7Smrj AcpiResourceToAddress64 ( 418ae115bc7Smrj ACPI_RESOURCE *Resource, 419ae115bc7Smrj ACPI_RESOURCE_ADDRESS64 *Out) 420ae115bc7Smrj { 421ae115bc7Smrj ACPI_RESOURCE_ADDRESS16 *Address16; 422ae115bc7Smrj ACPI_RESOURCE_ADDRESS32 *Address32; 423ae115bc7Smrj 424ae115bc7Smrj 425ae115bc7Smrj if (!Resource || !Out) 426ae115bc7Smrj { 427ae115bc7Smrj return (AE_BAD_PARAMETER); 428ae115bc7Smrj } 429ae115bc7Smrj 430ae115bc7Smrj /* Convert 16 or 32 address descriptor to 64 */ 431ae115bc7Smrj 432ae115bc7Smrj switch (Resource->Type) 433ae115bc7Smrj { 434ae115bc7Smrj case ACPI_RESOURCE_TYPE_ADDRESS16: 435ae115bc7Smrj 436*385cc6b4SJerry Jelinek Address16 = ACPI_CAST_PTR ( 437*385cc6b4SJerry Jelinek ACPI_RESOURCE_ADDRESS16, &Resource->Data); 438ae115bc7Smrj ACPI_COPY_ADDRESS (Out, Address16); 439ae115bc7Smrj break; 440ae115bc7Smrj 441ae115bc7Smrj case ACPI_RESOURCE_TYPE_ADDRESS32: 442ae115bc7Smrj 443*385cc6b4SJerry Jelinek Address32 = ACPI_CAST_PTR ( 444*385cc6b4SJerry Jelinek ACPI_RESOURCE_ADDRESS32, &Resource->Data); 445ae115bc7Smrj ACPI_COPY_ADDRESS (Out, Address32); 446ae115bc7Smrj break; 447ae115bc7Smrj 448ae115bc7Smrj case ACPI_RESOURCE_TYPE_ADDRESS64: 449ae115bc7Smrj 450ae115bc7Smrj /* Simple copy for 64 bit source */ 451ae115bc7Smrj 452*385cc6b4SJerry Jelinek memcpy (Out, &Resource->Data, sizeof (ACPI_RESOURCE_ADDRESS64)); 453ae115bc7Smrj break; 454ae115bc7Smrj 455ae115bc7Smrj default: 456*385cc6b4SJerry Jelinek 457ae115bc7Smrj return (AE_BAD_PARAMETER); 458ae115bc7Smrj } 459ae115bc7Smrj 460ae115bc7Smrj return (AE_OK); 461ae115bc7Smrj } 462ae115bc7Smrj 463ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiResourceToAddress64) 464ae115bc7Smrj 465ae115bc7Smrj 466ae115bc7Smrj /******************************************************************************* 467ae115bc7Smrj * 468ae115bc7Smrj * FUNCTION: AcpiGetVendorResource 469ae115bc7Smrj * 470ae115bc7Smrj * PARAMETERS: DeviceHandle - Handle for the parent device object 471ae115bc7Smrj * Name - Method name for the parent resource 472ae115bc7Smrj * (METHOD_NAME__CRS or METHOD_NAME__PRS) 473ae115bc7Smrj * Uuid - Pointer to the UUID to be matched. 474ae115bc7Smrj * includes both subtype and 16-byte UUID 475ae115bc7Smrj * RetBuffer - Where the vendor resource is returned 476ae115bc7Smrj * 477ae115bc7Smrj * RETURN: Status 478ae115bc7Smrj * 479*385cc6b4SJerry Jelinek * DESCRIPTION: Walk a resource template for the specified device to find a 480ae115bc7Smrj * vendor-defined resource that matches the supplied UUID and 481ae115bc7Smrj * UUID subtype. Returns a ACPI_RESOURCE of type Vendor. 482ae115bc7Smrj * 483ae115bc7Smrj ******************************************************************************/ 484ae115bc7Smrj 485ae115bc7Smrj ACPI_STATUS 486ae115bc7Smrj AcpiGetVendorResource ( 487ae115bc7Smrj ACPI_HANDLE DeviceHandle, 488ae115bc7Smrj char *Name, 489ae115bc7Smrj ACPI_VENDOR_UUID *Uuid, 490ae115bc7Smrj ACPI_BUFFER *RetBuffer) 491ae115bc7Smrj { 492ae115bc7Smrj ACPI_VENDOR_WALK_INFO Info; 493ae115bc7Smrj ACPI_STATUS Status; 494ae115bc7Smrj 495ae115bc7Smrj 496ae115bc7Smrj /* Other parameters are validated by AcpiWalkResources */ 497ae115bc7Smrj 498ae115bc7Smrj if (!Uuid || !RetBuffer) 499ae115bc7Smrj { 500ae115bc7Smrj return (AE_BAD_PARAMETER); 501ae115bc7Smrj } 502ae115bc7Smrj 503ae115bc7Smrj Info.Uuid = Uuid; 504ae115bc7Smrj Info.Buffer = RetBuffer; 505ae115bc7Smrj Info.Status = AE_NOT_EXIST; 506ae115bc7Smrj 507ae115bc7Smrj /* Walk the _CRS or _PRS resource list for this device */ 508ae115bc7Smrj 509*385cc6b4SJerry Jelinek Status = AcpiWalkResources ( 510*385cc6b4SJerry Jelinek DeviceHandle, Name, AcpiRsMatchVendorResource, &Info); 511ae115bc7Smrj if (ACPI_FAILURE (Status)) 512ae115bc7Smrj { 513ae115bc7Smrj return (Status); 514ae115bc7Smrj } 515ae115bc7Smrj 516ae115bc7Smrj return (Info.Status); 517ae115bc7Smrj } 518ae115bc7Smrj 519ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiGetVendorResource) 520ae115bc7Smrj 521ae115bc7Smrj 522ae115bc7Smrj /******************************************************************************* 523ae115bc7Smrj * 524ae115bc7Smrj * FUNCTION: AcpiRsMatchVendorResource 525ae115bc7Smrj * 526ae115bc7Smrj * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 527ae115bc7Smrj * 528ae115bc7Smrj * RETURN: Status 529ae115bc7Smrj * 530ae115bc7Smrj * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID 531ae115bc7Smrj * 532ae115bc7Smrj ******************************************************************************/ 533ae115bc7Smrj 534ae115bc7Smrj static ACPI_STATUS 535ae115bc7Smrj AcpiRsMatchVendorResource ( 536ae115bc7Smrj ACPI_RESOURCE *Resource, 537ae115bc7Smrj void *Context) 538ae115bc7Smrj { 539ae115bc7Smrj ACPI_VENDOR_WALK_INFO *Info = Context; 540ae115bc7Smrj ACPI_RESOURCE_VENDOR_TYPED *Vendor; 541ae115bc7Smrj ACPI_BUFFER *Buffer; 542ae115bc7Smrj ACPI_STATUS Status; 543ae115bc7Smrj 544ae115bc7Smrj 545ae115bc7Smrj /* Ignore all descriptors except Vendor */ 546ae115bc7Smrj 547ae115bc7Smrj if (Resource->Type != ACPI_RESOURCE_TYPE_VENDOR) 548ae115bc7Smrj { 549ae115bc7Smrj return (AE_OK); 550ae115bc7Smrj } 551ae115bc7Smrj 552ae115bc7Smrj Vendor = &Resource->Data.VendorTyped; 553ae115bc7Smrj 554ae115bc7Smrj /* 555ae115bc7Smrj * For a valid match, these conditions must hold: 556ae115bc7Smrj * 557ae115bc7Smrj * 1) Length of descriptor data must be at least as long as a UUID struct 558ae115bc7Smrj * 2) The UUID subtypes must match 559ae115bc7Smrj * 3) The UUID data must match 560ae115bc7Smrj */ 561ae115bc7Smrj if ((Vendor->ByteLength < (ACPI_UUID_LENGTH + 1)) || 562ae115bc7Smrj (Vendor->UuidSubtype != Info->Uuid->Subtype) || 563*385cc6b4SJerry Jelinek (memcmp (Vendor->Uuid, Info->Uuid->Data, ACPI_UUID_LENGTH))) 564ae115bc7Smrj { 565ae115bc7Smrj return (AE_OK); 566ae115bc7Smrj } 567ae115bc7Smrj 568ae115bc7Smrj /* Validate/Allocate/Clear caller buffer */ 569ae115bc7Smrj 570ae115bc7Smrj Buffer = Info->Buffer; 571ae115bc7Smrj Status = AcpiUtInitializeBuffer (Buffer, Resource->Length); 572ae115bc7Smrj if (ACPI_FAILURE (Status)) 573ae115bc7Smrj { 574ae115bc7Smrj return (Status); 575ae115bc7Smrj } 576ae115bc7Smrj 577ae115bc7Smrj /* Found the correct resource, copy and return it */ 578ae115bc7Smrj 579*385cc6b4SJerry Jelinek memcpy (Buffer->Pointer, Resource, Resource->Length); 580ae115bc7Smrj Buffer->Length = Resource->Length; 581ae115bc7Smrj 582ae115bc7Smrj /* Found the desired descriptor, terminate resource walk */ 583ae115bc7Smrj 584ae115bc7Smrj Info->Status = AE_OK; 585ae115bc7Smrj return (AE_CTRL_TERMINATE); 586ae115bc7Smrj } 587ae115bc7Smrj 588ae115bc7Smrj 589ae115bc7Smrj /******************************************************************************* 590ae115bc7Smrj * 591*385cc6b4SJerry Jelinek * FUNCTION: AcpiWalkResourceBuffer 592ae115bc7Smrj * 593*385cc6b4SJerry Jelinek * PARAMETERS: Buffer - Formatted buffer returned by one of the 594*385cc6b4SJerry Jelinek * various Get*Resource functions 595ae115bc7Smrj * UserFunction - Called for each resource 596ae115bc7Smrj * Context - Passed to UserFunction 597ae115bc7Smrj * 598ae115bc7Smrj * RETURN: Status 599ae115bc7Smrj * 600*385cc6b4SJerry Jelinek * DESCRIPTION: Walks the input resource template. The UserFunction is called 601*385cc6b4SJerry Jelinek * once for each resource in the list. 602ae115bc7Smrj * 603ae115bc7Smrj ******************************************************************************/ 604ae115bc7Smrj 605ae115bc7Smrj ACPI_STATUS 606*385cc6b4SJerry Jelinek AcpiWalkResourceBuffer ( 607*385cc6b4SJerry Jelinek ACPI_BUFFER *Buffer, 608ae115bc7Smrj ACPI_WALK_RESOURCE_CALLBACK UserFunction, 609ae115bc7Smrj void *Context) 610ae115bc7Smrj { 611*385cc6b4SJerry Jelinek ACPI_STATUS Status = AE_OK; 612ae115bc7Smrj ACPI_RESOURCE *Resource; 613ae115bc7Smrj ACPI_RESOURCE *ResourceEnd; 614ae115bc7Smrj 615ae115bc7Smrj 616*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiWalkResourceBuffer); 617ae115bc7Smrj 618ae115bc7Smrj 619ae115bc7Smrj /* Parameter validation */ 620ae115bc7Smrj 621*385cc6b4SJerry Jelinek if (!Buffer || !Buffer->Pointer || !UserFunction) 622ae115bc7Smrj { 623ae115bc7Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 624ae115bc7Smrj } 625ae115bc7Smrj 626*385cc6b4SJerry Jelinek /* Buffer contains the resource list and length */ 627ae115bc7Smrj 628*385cc6b4SJerry Jelinek Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer->Pointer); 629*385cc6b4SJerry Jelinek ResourceEnd = ACPI_ADD_PTR ( 630*385cc6b4SJerry Jelinek ACPI_RESOURCE, Buffer->Pointer, Buffer->Length); 631ae115bc7Smrj 632ae115bc7Smrj /* Walk the resource list until the EndTag is found (or buffer end) */ 633ae115bc7Smrj 634ae115bc7Smrj while (Resource < ResourceEnd) 635ae115bc7Smrj { 636*385cc6b4SJerry Jelinek /* Sanity check the resource type */ 637ae115bc7Smrj 638ae115bc7Smrj if (Resource->Type > ACPI_RESOURCE_TYPE_MAX) 639ae115bc7Smrj { 640ae115bc7Smrj Status = AE_AML_INVALID_RESOURCE_TYPE; 641ae115bc7Smrj break; 642ae115bc7Smrj } 643ae115bc7Smrj 644*385cc6b4SJerry Jelinek /* Sanity check the length. It must not be zero, or we loop forever */ 645*385cc6b4SJerry Jelinek 646*385cc6b4SJerry Jelinek if (!Resource->Length) 647*385cc6b4SJerry Jelinek { 648*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); 649*385cc6b4SJerry Jelinek } 650*385cc6b4SJerry Jelinek 651ae115bc7Smrj /* Invoke the user function, abort on any error returned */ 652ae115bc7Smrj 653ae115bc7Smrj Status = UserFunction (Resource, Context); 654ae115bc7Smrj if (ACPI_FAILURE (Status)) 655ae115bc7Smrj { 656ae115bc7Smrj if (Status == AE_CTRL_TERMINATE) 657ae115bc7Smrj { 658ae115bc7Smrj /* This is an OK termination by the user function */ 659ae115bc7Smrj 660ae115bc7Smrj Status = AE_OK; 661ae115bc7Smrj } 662ae115bc7Smrj break; 663ae115bc7Smrj } 664ae115bc7Smrj 665ae115bc7Smrj /* EndTag indicates end-of-list */ 666ae115bc7Smrj 667ae115bc7Smrj if (Resource->Type == ACPI_RESOURCE_TYPE_END_TAG) 668ae115bc7Smrj { 669ae115bc7Smrj break; 670ae115bc7Smrj } 671ae115bc7Smrj 672ae115bc7Smrj /* Get the next resource descriptor */ 673ae115bc7Smrj 674*385cc6b4SJerry Jelinek Resource = ACPI_NEXT_RESOURCE (Resource); 675ae115bc7Smrj } 676ae115bc7Smrj 677*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 678*385cc6b4SJerry Jelinek } 679*385cc6b4SJerry Jelinek 680*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer) 681*385cc6b4SJerry Jelinek 682*385cc6b4SJerry Jelinek 683*385cc6b4SJerry Jelinek /******************************************************************************* 684*385cc6b4SJerry Jelinek * 685*385cc6b4SJerry Jelinek * FUNCTION: AcpiWalkResources 686*385cc6b4SJerry Jelinek * 687*385cc6b4SJerry Jelinek * PARAMETERS: DeviceHandle - Handle to the device object for the 688*385cc6b4SJerry Jelinek * device we are querying 689*385cc6b4SJerry Jelinek * Name - Method name of the resources we want. 690*385cc6b4SJerry Jelinek * (METHOD_NAME__CRS, METHOD_NAME__PRS, or 691*385cc6b4SJerry Jelinek * METHOD_NAME__AEI) 692*385cc6b4SJerry Jelinek * UserFunction - Called for each resource 693*385cc6b4SJerry Jelinek * Context - Passed to UserFunction 694*385cc6b4SJerry Jelinek * 695*385cc6b4SJerry Jelinek * RETURN: Status 696*385cc6b4SJerry Jelinek * 697*385cc6b4SJerry Jelinek * DESCRIPTION: Retrieves the current or possible resource list for the 698*385cc6b4SJerry Jelinek * specified device. The UserFunction is called once for 699*385cc6b4SJerry Jelinek * each resource in the list. 700*385cc6b4SJerry Jelinek * 701*385cc6b4SJerry Jelinek ******************************************************************************/ 702*385cc6b4SJerry Jelinek 703*385cc6b4SJerry Jelinek ACPI_STATUS 704*385cc6b4SJerry Jelinek AcpiWalkResources ( 705*385cc6b4SJerry Jelinek ACPI_HANDLE DeviceHandle, 706*385cc6b4SJerry Jelinek char *Name, 707*385cc6b4SJerry Jelinek ACPI_WALK_RESOURCE_CALLBACK UserFunction, 708*385cc6b4SJerry Jelinek void *Context) 709*385cc6b4SJerry Jelinek { 710*385cc6b4SJerry Jelinek ACPI_STATUS Status; 711*385cc6b4SJerry Jelinek ACPI_BUFFER Buffer; 712*385cc6b4SJerry Jelinek 713*385cc6b4SJerry Jelinek 714*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiWalkResources); 715*385cc6b4SJerry Jelinek 716*385cc6b4SJerry Jelinek 717*385cc6b4SJerry Jelinek /* Parameter validation */ 718*385cc6b4SJerry Jelinek 719*385cc6b4SJerry Jelinek if (!DeviceHandle || !UserFunction || !Name || 720*385cc6b4SJerry Jelinek (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) && 721*385cc6b4SJerry Jelinek !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) && 722*385cc6b4SJerry Jelinek !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI))) 723*385cc6b4SJerry Jelinek { 724*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_BAD_PARAMETER); 725*385cc6b4SJerry Jelinek } 726*385cc6b4SJerry Jelinek 727*385cc6b4SJerry Jelinek /* Get the _CRS/_PRS/_AEI resource list */ 728*385cc6b4SJerry Jelinek 729*385cc6b4SJerry Jelinek Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 730*385cc6b4SJerry Jelinek Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer); 731*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 732*385cc6b4SJerry Jelinek { 733*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status); 734*385cc6b4SJerry Jelinek } 735*385cc6b4SJerry Jelinek 736*385cc6b4SJerry Jelinek /* Walk the resource list and cleanup */ 737*385cc6b4SJerry Jelinek 738*385cc6b4SJerry Jelinek Status = AcpiWalkResourceBuffer (&Buffer, UserFunction, Context); 739ae115bc7Smrj ACPI_FREE (Buffer.Pointer); 740ae115bc7Smrj return_ACPI_STATUS (Status); 741ae115bc7Smrj } 742ae115bc7Smrj 743ae115bc7Smrj ACPI_EXPORT_SYMBOL (AcpiWalkResources) 744