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