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