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