11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: rsxface - Public interfaces to the resource manager 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 877848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 44214f2c90b970e098e75cf719c0c5b0f1fe69b716Paul Gortmaker#include <linux/export.h> 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acresrc.h" 48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_RESOURCES 514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("rsxface") 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/* Local macros for 16,32-bit to 64-bit conversion */ 5444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore#define ACPI_COPY_FIELD(out, in, field) ((out)->field = (in)->field) 5544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore#define ACPI_COPY_ADDRESS(out, in) \ 5644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, resource_type); \ 5744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, producer_consumer); \ 5844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, decode); \ 5944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, min_address_fixed); \ 6044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, max_address_fixed); \ 610897831bb54eb36fd9e2a22da7f0f64be1b20d09Bob Moore ACPI_COPY_FIELD(out, in, info); \ 6244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, granularity); \ 6350eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore ACPI_COPY_FIELD(out, in, minimum); \ 6450eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore ACPI_COPY_FIELD(out, in, maximum); \ 6550eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore ACPI_COPY_FIELD(out, in, translation_offset); \ 6644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, address_length); \ 6744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ACPI_COPY_FIELD(out, in, resource_source); 68c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore/* Local prototypes */ 69c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moorestatic acpi_status 70c51a4de85de720670f2fbc592a6f8040af72ad87Bob Mooreacpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context); 71c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 724119532c95547821dbe72d6916dfa1b2148475b3Bob Moorestatic acpi_status 734119532c95547821dbe72d6916dfa1b2148475b3Bob Mooreacpi_rs_validate_parameters(acpi_handle device_handle, 744119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_buffer *buffer, 754119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node **return_node); 764119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 774119532c95547821dbe72d6916dfa1b2148475b3Bob Moore/******************************************************************************* 784119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 794119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * FUNCTION: acpi_rs_validate_parameters 804119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 814119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle to a device 824119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Buffer - Pointer to a data buffer 834119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * return_node - Pointer to where the device node is returned 844119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 854119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * RETURN: Status 864119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 874119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * DESCRIPTION: Common parameter validation for resource interfaces 884119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 894119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ******************************************************************************/ 904119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 914119532c95547821dbe72d6916dfa1b2148475b3Bob Moorestatic acpi_status 924119532c95547821dbe72d6916dfa1b2148475b3Bob Mooreacpi_rs_validate_parameters(acpi_handle device_handle, 934119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_buffer *buffer, 944119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node **return_node) 954119532c95547821dbe72d6916dfa1b2148475b3Bob Moore{ 964119532c95547821dbe72d6916dfa1b2148475b3Bob Moore acpi_status status; 974119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node *node; 984119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 994119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ACPI_FUNCTION_TRACE(rs_validate_parameters); 1004119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 1014119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* 1024119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Must have a valid handle to an ACPI device 1034119532c95547821dbe72d6916dfa1b2148475b3Bob Moore */ 1044119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (!device_handle) { 1054119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(AE_BAD_PARAMETER); 1064119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 1074119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 108f24b664dc44a4ab4df61db2258cea298eeb43a8eBob Moore node = acpi_ns_validate_handle(device_handle); 1094119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (!node) { 1104119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(AE_BAD_PARAMETER); 1114119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 1124119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 1134119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (node->type != ACPI_TYPE_DEVICE) { 1144119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(AE_TYPE); 1154119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 1164119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 1174119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* 1184119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Validate the user buffer object 1194119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 1204119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * if there is a non-zero buffer length we also need a valid pointer in 1214119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * the buffer. If it's a zero buffer length, we'll be returning the 1224119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * needed buffer size (later), so keep going. 1234119532c95547821dbe72d6916dfa1b2148475b3Bob Moore */ 1244119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_ut_validate_buffer(buffer); 1254119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (ACPI_FAILURE(status)) { 1264119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(status); 1274119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 1284119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 1294119532c95547821dbe72d6916dfa1b2148475b3Bob Moore *return_node = node; 1304119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(AE_OK); 1314119532c95547821dbe72d6916dfa1b2148475b3Bob Moore} 1324119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_get_irq_routing_table 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1374119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle to the Bus device we are querying 1384119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * ret_buffer - Pointer to a buffer to receive the 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * current resources for the device 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to get the IRQ routing table for a 1444119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * specific bus. The caller must first acquire a handle for the 1454119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * desired bus. The routine table is placed in the buffer pointed 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to by the ret_buffer variable parameter. 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the function fails an appropriate status will be returned 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and the value of ret_buffer is undefined. 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This function attempts to execute the _PRT method contained in 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the object indicated by the passed device_handle. 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 155c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 1574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_get_irq_routing_table(acpi_handle device_handle, 1584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer *ret_buffer) 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 1614119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node *node; 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 163b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(acpi_get_irq_routing_table); 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1654119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Validate parameters then dispatch to internal routine */ 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1674119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_validate_parameters(device_handle, ret_buffer, &node); 1684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1724119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_get_prt_method_data(node, ret_buffer); 1734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1768313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_get_irq_routing_table) 1778313524a0d466f451a62709aaedf988d8257b21cBob Moore 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_get_current_resources 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1824119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle to the device object for the 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * device we are querying 1844119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * ret_buffer - Pointer to a buffer to receive the 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * current resources for the device 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to get the current resources for a 1904119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * specific device. The caller must first acquire a handle for 1914119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * the desired device. The resource data is placed in the buffer 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * pointed to by the ret_buffer variable parameter. 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the function fails an appropriate status will be returned 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and the value of ret_buffer is undefined. 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This function attempts to execute the _CRS method contained in 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the object indicated by the passed device_handle. 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 2024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_get_current_resources(acpi_handle device_handle, 2034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer *ret_buffer) 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 2064119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node *node; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 208b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(acpi_get_current_resources); 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2104119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Validate parameters then dispatch to internal routine */ 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2124119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_validate_parameters(device_handle, ret_buffer, &node); 2134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 2144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2174119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_get_crs_method_data(node, ret_buffer); 2184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2218313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_get_current_resources) 2228313524a0d466f451a62709aaedf988d8257b21cBob Moore#ifdef ACPI_FUTURE_USAGE 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_get_possible_resources 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2274119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle to the device object for the 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * device we are querying 2294119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * ret_buffer - Pointer to a buffer to receive the 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * resources for the device 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to get a list of the possible resources 2354119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * for a specific device. The caller must first acquire a handle 2364119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * for the desired device. The resource data is placed in the 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * buffer pointed to by the ret_buffer variable. 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If the function fails an appropriate status will be returned 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and the value of ret_buffer is undefined. 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_get_possible_resources(acpi_handle device_handle, 2454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer *ret_buffer) 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 2484119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node *node; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 250b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(acpi_get_possible_resources); 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2524119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Validate parameters then dispatch to internal routine */ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2544119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_validate_parameters(device_handle, ret_buffer, &node); 2554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 2564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2594119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_get_prs_method_data(node, ret_buffer); 2604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2638313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_get_possible_resources) 2644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown#endif /* ACPI_FUTURE_USAGE */ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_set_current_resources 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2694119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle to the device object for the 2704119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * device we are setting resources 2714119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * in_buffer - Pointer to a buffer containing the 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * resources to be set for the device 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to set the current resources for a 2774119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * specific device. The caller must first acquire a handle for 2784119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * the desired device. The resource data is passed to the routine 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the buffer pointed to by the in_buffer variable. 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 2834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_set_current_resources(acpi_handle device_handle, 2844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer *in_buffer) 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 2874119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_namespace_node *node; 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 289b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(acpi_set_current_resources); 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2914119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Validate the buffer, don't allow zero length */ 29244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 2934119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if ((!in_buffer) || (!in_buffer->pointer) || (!in_buffer->length)) { 2944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_BAD_PARAMETER); 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2974119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Validate parameters then dispatch to internal routine */ 2984119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 2994119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_validate_parameters(device_handle, in_buffer, &node); 3004119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (ACPI_FAILURE(status)) { 3014119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(status); 3024119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 3034119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 3044119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_set_srs_method_data(node, in_buffer); 3054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3088313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_set_current_resources) 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 310a91cdde20a870bd773d605c764ed211539bf3020Bob Moore/******************************************************************************* 311a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * 312a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * FUNCTION: acpi_get_event_resources 313a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * 314a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * PARAMETERS: device_handle - Handle to the device object for the 315a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * device we are getting resources 316a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * in_buffer - Pointer to a buffer containing the 317a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * resources to be set for the device 318a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * 319a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * RETURN: Status 320a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * 321a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * DESCRIPTION: This function is called to get the event resources for a 322a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * specific device. The caller must first acquire a handle for 323a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * the desired device. The resource data is passed to the routine 324a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * the buffer pointed to by the in_buffer variable. Uses the 325a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * _AEI method. 326a91cdde20a870bd773d605c764ed211539bf3020Bob Moore * 327a91cdde20a870bd773d605c764ed211539bf3020Bob Moore ******************************************************************************/ 328a91cdde20a870bd773d605c764ed211539bf3020Bob Mooreacpi_status 329a91cdde20a870bd773d605c764ed211539bf3020Bob Mooreacpi_get_event_resources(acpi_handle device_handle, 330a91cdde20a870bd773d605c764ed211539bf3020Bob Moore struct acpi_buffer *ret_buffer) 331a91cdde20a870bd773d605c764ed211539bf3020Bob Moore{ 332a91cdde20a870bd773d605c764ed211539bf3020Bob Moore acpi_status status; 333a91cdde20a870bd773d605c764ed211539bf3020Bob Moore struct acpi_namespace_node *node; 334a91cdde20a870bd773d605c764ed211539bf3020Bob Moore 335a91cdde20a870bd773d605c764ed211539bf3020Bob Moore ACPI_FUNCTION_TRACE(acpi_get_event_resources); 336a91cdde20a870bd773d605c764ed211539bf3020Bob Moore 337a91cdde20a870bd773d605c764ed211539bf3020Bob Moore /* Validate parameters then dispatch to internal routine */ 338a91cdde20a870bd773d605c764ed211539bf3020Bob Moore 339a91cdde20a870bd773d605c764ed211539bf3020Bob Moore status = acpi_rs_validate_parameters(device_handle, ret_buffer, &node); 340a91cdde20a870bd773d605c764ed211539bf3020Bob Moore if (ACPI_FAILURE(status)) { 341a91cdde20a870bd773d605c764ed211539bf3020Bob Moore return_ACPI_STATUS(status); 342a91cdde20a870bd773d605c764ed211539bf3020Bob Moore } 343a91cdde20a870bd773d605c764ed211539bf3020Bob Moore 344a91cdde20a870bd773d605c764ed211539bf3020Bob Moore status = acpi_rs_get_aei_method_data(node, ret_buffer); 345a91cdde20a870bd773d605c764ed211539bf3020Bob Moore return_ACPI_STATUS(status); 346a91cdde20a870bd773d605c764ed211539bf3020Bob Moore} 347a91cdde20a870bd773d605c764ed211539bf3020Bob Moore 348a91cdde20a870bd773d605c764ed211539bf3020Bob MooreACPI_EXPORT_SYMBOL(acpi_get_event_resources) 349a91cdde20a870bd773d605c764ed211539bf3020Bob Moore 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_resource_to_address64 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3544119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: Resource - Pointer to a resource 3554119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Out - Pointer to the users's return buffer 3564119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * (a struct acpi_resource_address64) 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: If the resource is an address16, address32, or address64, 3614119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * copy it to the address64 return buffer. This saves the 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * caller from having to duplicate code for different-sized 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * addresses. 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 3674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_resource_to_address64(struct acpi_resource *resource, 3684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_resource_address64 *out) 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_resource_address16 *address16; 3714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_resource_address32 *address32; 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 373c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore if (!resource || !out) { 374c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (AE_BAD_PARAMETER); 375c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 376c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 377c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Convert 16 or 32 address descriptor to 64 */ 378c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 379bda663d36b94c723153246a4231bbc0f1cd1836eRobert Moore switch (resource->type) { 38050eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore case ACPI_RESOURCE_TYPE_ADDRESS16: 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 382ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore address16 = 383ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore ACPI_CAST_PTR(struct acpi_resource_address16, 384ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore &resource->data); 3854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_COPY_ADDRESS(out, address16); 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 38850eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore case ACPI_RESOURCE_TYPE_ADDRESS32: 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 390ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore address32 = 391ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore ACPI_CAST_PTR(struct acpi_resource_address32, 392ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore &resource->data); 3934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_COPY_ADDRESS(out, address32); 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 39650eca3eb89d73d9f0aa070b126c7ee6a616016abBob Moore case ACPI_RESOURCE_TYPE_ADDRESS64: 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Simple copy for 64 bit source */ 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(out, &resource->data, 4014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown sizeof(struct acpi_resource_address64)); 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_OK); 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 4118313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_resource_to_address64) 412c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 413c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore/******************************************************************************* 414c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 415c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * FUNCTION: acpi_get_vendor_resource 416c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 4174119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle for the parent device object 4184119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Name - Method name for the parent resource 4194119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * (METHOD_NAME__CRS or METHOD_NAME__PRS) 4204119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Uuid - Pointer to the UUID to be matched. 4214119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * includes both subtype and 16-byte UUID 4224119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * ret_buffer - Where the vendor resource is returned 423c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 424c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * RETURN: Status 425c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 426c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * DESCRIPTION: Walk a resource template for the specified evice to find a 427c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * vendor-defined resource that matches the supplied UUID and 428c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * UUID subtype. Returns a struct acpi_resource of type Vendor. 429c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 430c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ******************************************************************************/ 431c51a4de85de720670f2fbc592a6f8040af72ad87Bob Mooreacpi_status 432c51a4de85de720670f2fbc592a6f8040af72ad87Bob Mooreacpi_get_vendor_resource(acpi_handle device_handle, 433c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore char *name, 434c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore struct acpi_vendor_uuid * uuid, 435c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore struct acpi_buffer * ret_buffer) 436c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore{ 437c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore struct acpi_vendor_walk_info info; 438c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_status status; 439c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 440c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Other parameters are validated by acpi_walk_resources */ 441c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 442c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore if (!uuid || !ret_buffer) { 443c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (AE_BAD_PARAMETER); 444c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 445c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 446c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore info.uuid = uuid; 447c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore info.buffer = ret_buffer; 448c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore info.status = AE_NOT_EXIST; 449c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 450c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Walk the _CRS or _PRS resource list for this device */ 451c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 452c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore status = 453c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_walk_resources(device_handle, name, 454c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_rs_match_vendor_resource, &info); 455c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore if (ACPI_FAILURE(status)) { 456c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (status); 457c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 458c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 459c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (info.status); 460c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore} 461c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 4628313524a0d466f451a62709aaedf988d8257b21cBob MooreACPI_EXPORT_SYMBOL(acpi_get_vendor_resource) 4638313524a0d466f451a62709aaedf988d8257b21cBob Moore 464c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore/******************************************************************************* 465c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 466c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * FUNCTION: acpi_rs_match_vendor_resource 467c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 46861686124f47d7c4b78610346c5f8f9d8a6d46bb5Bob Moore * PARAMETERS: acpi_walk_resource_callback 469c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 470c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * RETURN: Status 471c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 472c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID 473c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 474c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ******************************************************************************/ 475c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moorestatic acpi_status 476c51a4de85de720670f2fbc592a6f8040af72ad87Bob Mooreacpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context) 477c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore{ 478c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore struct acpi_vendor_walk_info *info = context; 479c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore struct acpi_resource_vendor_typed *vendor; 480c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore struct acpi_buffer *buffer; 481c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_status status; 482c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 483c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Ignore all descriptors except Vendor */ 484c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 485c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore if (resource->type != ACPI_RESOURCE_TYPE_VENDOR) { 486c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (AE_OK); 487c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 488c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 489c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore vendor = &resource->data.vendor_typed; 490c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 491c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* 492c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * For a valid match, these conditions must hold: 493c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 494c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 1) Length of descriptor data must be at least as long as a UUID struct 495c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 2) The UUID subtypes must match 496c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore * 3) The UUID data must match 497c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore */ 498c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore if ((vendor->byte_length < (ACPI_UUID_LENGTH + 1)) || 499c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore (vendor->uuid_subtype != info->uuid->subtype) || 500c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore (ACPI_MEMCMP(vendor->uuid, info->uuid->data, ACPI_UUID_LENGTH))) { 501c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (AE_OK); 502c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 503c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 504c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Validate/Allocate/Clear caller buffer */ 505c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 506c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore buffer = info->buffer; 507c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore status = acpi_ut_initialize_buffer(buffer, resource->length); 508c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore if (ACPI_FAILURE(status)) { 509c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (status); 510c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore } 511c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 512c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Found the correct resource, copy and return it */ 513c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 514c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_MEMCPY(buffer->pointer, resource, resource->length); 515c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore buffer->length = resource->length; 516c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 517c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore /* Found the desired descriptor, terminate resource walk */ 518c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore 519c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore info->status = AE_OK; 520c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore return (AE_CTRL_TERMINATE); 521c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore} 5228313524a0d466f451a62709aaedf988d8257b21cBob Moore 5234119532c95547821dbe72d6916dfa1b2148475b3Bob Moore/******************************************************************************* 5244119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 5254119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * FUNCTION: acpi_walk_resources 5264119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 5274119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * PARAMETERS: device_handle - Handle to the device object for the 5284119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * device we are querying 52925169b77f7c33b363db7d099d67491e977cdefc7Zhang Rui * Name - Method name of the resources we want. 53025169b77f7c33b363db7d099d67491e977cdefc7Zhang Rui * (METHOD_NAME__CRS, METHOD_NAME__PRS, or 53125169b77f7c33b363db7d099d67491e977cdefc7Zhang Rui * METHOD_NAME__AEI) 5324119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * user_function - Called for each resource 5334119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * Context - Passed to user_function 5344119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 5354119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * RETURN: Status 5364119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 5374119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * DESCRIPTION: Retrieves the current or possible resource list for the 5384119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * specified device. The user_function is called once for 5394119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * each resource in the list. 5404119532c95547821dbe72d6916dfa1b2148475b3Bob Moore * 5414119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ******************************************************************************/ 5424119532c95547821dbe72d6916dfa1b2148475b3Bob Mooreacpi_status 5434119532c95547821dbe72d6916dfa1b2148475b3Bob Mooreacpi_walk_resources(acpi_handle device_handle, 5444119532c95547821dbe72d6916dfa1b2148475b3Bob Moore char *name, 5454119532c95547821dbe72d6916dfa1b2148475b3Bob Moore acpi_walk_resource_callback user_function, void *context) 5464119532c95547821dbe72d6916dfa1b2148475b3Bob Moore{ 5474119532c95547821dbe72d6916dfa1b2148475b3Bob Moore acpi_status status; 5484119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_buffer buffer; 5494119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_resource *resource; 5504119532c95547821dbe72d6916dfa1b2148475b3Bob Moore struct acpi_resource *resource_end; 5514119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5524119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ACPI_FUNCTION_TRACE(acpi_walk_resources); 5534119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5544119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Parameter validation */ 5554119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5564119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (!device_handle || !user_function || !name || 5574119532c95547821dbe72d6916dfa1b2148475b3Bob Moore (!ACPI_COMPARE_NAME(name, METHOD_NAME__CRS) && 55825169b77f7c33b363db7d099d67491e977cdefc7Zhang Rui !ACPI_COMPARE_NAME(name, METHOD_NAME__PRS) && 55925169b77f7c33b363db7d099d67491e977cdefc7Zhang Rui !ACPI_COMPARE_NAME(name, METHOD_NAME__AEI))) { 5604119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(AE_BAD_PARAMETER); 5614119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 5624119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 56325169b77f7c33b363db7d099d67491e977cdefc7Zhang Rui /* Get the _CRS/_PRS/_AEI resource list */ 5644119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5654119532c95547821dbe72d6916dfa1b2148475b3Bob Moore buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 5664119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = acpi_rs_get_method_data(device_handle, name, &buffer); 5674119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (ACPI_FAILURE(status)) { 5684119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(status); 5694119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 5704119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5714119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Buffer now contains the resource list */ 5724119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5734119532c95547821dbe72d6916dfa1b2148475b3Bob Moore resource = ACPI_CAST_PTR(struct acpi_resource, buffer.pointer); 5744119532c95547821dbe72d6916dfa1b2148475b3Bob Moore resource_end = 5754119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ACPI_ADD_PTR(struct acpi_resource, buffer.pointer, buffer.length); 5764119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5774119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Walk the resource list until the end_tag is found (or buffer end) */ 5784119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5794119532c95547821dbe72d6916dfa1b2148475b3Bob Moore while (resource < resource_end) { 5804119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5814119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Sanity check the resource */ 5824119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5834119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (resource->type > ACPI_RESOURCE_TYPE_MAX) { 5844119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = AE_AML_INVALID_RESOURCE_TYPE; 5854119532c95547821dbe72d6916dfa1b2148475b3Bob Moore break; 5864119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 5874119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5884119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Invoke the user function, abort on any error returned */ 5894119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5904119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = user_function(resource, context); 5914119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (ACPI_FAILURE(status)) { 5924119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (status == AE_CTRL_TERMINATE) { 5934119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5944119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* This is an OK termination by the user function */ 5954119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 5964119532c95547821dbe72d6916dfa1b2148475b3Bob Moore status = AE_OK; 5974119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 5984119532c95547821dbe72d6916dfa1b2148475b3Bob Moore break; 5994119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 6004119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 6014119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* end_tag indicates end-of-list */ 6024119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 6034119532c95547821dbe72d6916dfa1b2148475b3Bob Moore if (resource->type == ACPI_RESOURCE_TYPE_END_TAG) { 6044119532c95547821dbe72d6916dfa1b2148475b3Bob Moore break; 6054119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 6064119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 6074119532c95547821dbe72d6916dfa1b2148475b3Bob Moore /* Get the next resource descriptor */ 6084119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 6094119532c95547821dbe72d6916dfa1b2148475b3Bob Moore resource = 6104119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ACPI_ADD_PTR(struct acpi_resource, resource, 6114119532c95547821dbe72d6916dfa1b2148475b3Bob Moore resource->length); 6124119532c95547821dbe72d6916dfa1b2148475b3Bob Moore } 6134119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 6144119532c95547821dbe72d6916dfa1b2148475b3Bob Moore ACPI_FREE(buffer.pointer); 6154119532c95547821dbe72d6916dfa1b2148475b3Bob Moore return_ACPI_STATUS(status); 6164119532c95547821dbe72d6916dfa1b2148475b3Bob Moore} 6174119532c95547821dbe72d6916dfa1b2148475b3Bob Moore 6184119532c95547821dbe72d6916dfa1b2148475b3Bob MooreACPI_EXPORT_SYMBOL(acpi_walk_resources) 619