rsxface.c revision 151937
1209878Snwhitehorn/*******************************************************************************
2209878Snwhitehorn *
3209878Snwhitehorn * Module Name: rsxface - Public interfaces to the resource manager
4209878Snwhitehorn *              $Revision: 1.37 $
5209878Snwhitehorn *
6209878Snwhitehorn ******************************************************************************/
7209878Snwhitehorn
8209878Snwhitehorn/******************************************************************************
9209878Snwhitehorn *
10209878Snwhitehorn * 1. Copyright Notice
11209878Snwhitehorn *
12209878Snwhitehorn * Some or all of this work - Copyright (c) 1999 - 2005, Intel Corp.
13209878Snwhitehorn * All rights reserved.
14209878Snwhitehorn *
15209878Snwhitehorn * 2. License
16209878Snwhitehorn *
17209878Snwhitehorn * 2.1. This is your license from Intel Corp. under its intellectual property
18209878Snwhitehorn * rights.  You may have additional license terms from the party that provided
19209878Snwhitehorn * you this software, covering your right to use that party's intellectual
20209878Snwhitehorn * property rights.
21209878Snwhitehorn *
22209878Snwhitehorn * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23209878Snwhitehorn * copy of the source code appearing in this file ("Covered Code") an
24209878Snwhitehorn * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25209878Snwhitehorn * base code distributed originally by Intel ("Original Intel Code") to copy,
26209878Snwhitehorn * make derivatives, distribute, use and display any portion of the Covered
27209878Snwhitehorn * Code in any form, with the right to sublicense such rights; and
28209878Snwhitehorn *
29209878Snwhitehorn * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30209878Snwhitehorn * license (with the right to sublicense), under only those claims of Intel
31209878Snwhitehorn * patents that are infringed by the Original Intel Code, to make, use, sell,
32209878Snwhitehorn * offer to sell, and import the Covered Code and derivative works thereof
33209878Snwhitehorn * solely to the minimum extent necessary to exercise the above copyright
34209878Snwhitehorn * license, and in no event shall the patent license extend to any additions
35209878Snwhitehorn * to or modifications of the Original Intel Code.  No other license or right
36231044Sandreast * is granted directly or by implication, estoppel or otherwise;
37209878Snwhitehorn *
38209878Snwhitehorn * The above copyright and patent license is granted only if the following
39258502Sandreast * conditions are met:
40209878Snwhitehorn *
41209878Snwhitehorn * 3. Conditions
42231044Sandreast *
43209878Snwhitehorn * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44209878Snwhitehorn * Redistribution of source code of any substantial portion of the Covered
45209878Snwhitehorn * Code or modification with rights to further distribute source must include
46209878Snwhitehorn * the above Copyright Notice, the above License, this list of Conditions,
47209878Snwhitehorn * and the following Disclaimer and Export Compliance provision.  In addition,
48218824Snwhitehorn * Licensee must cause all Covered Code to which Licensee contributes to
49209878Snwhitehorn * contain a file documenting the changes Licensee made to create that Covered
50209878Snwhitehorn * Code and the date of any change.  Licensee must include in that file the
51209878Snwhitehorn * documentation of any changes made by any predecessor Licensee.  Licensee
52209878Snwhitehorn * must include a prominent statement that the modification is derived,
53209878Snwhitehorn * directly or indirectly, from Original Intel Code.
54258502Sandreast *
55258502Sandreast * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56258502Sandreast * Redistribution of source code of any substantial portion of the Covered
57258502Sandreast * Code or modification without rights to further distribute source must
58209878Snwhitehorn * include the following Disclaimer and Export Compliance provision in the
59209878Snwhitehorn * documentation and/or other materials provided with distribution.  In
60231044Sandreast * addition, Licensee may not authorize further sublicense of source of any
61209878Snwhitehorn * portion of the Covered Code, and must include terms to the effect that the
62209878Snwhitehorn * license from Licensee to its licensee is limited to the intellectual
63258502Sandreast * property embodied in the software Licensee provides to its licensee, and
64258502Sandreast * not to intellectual property embodied in modifications its licensee may
65231044Sandreast * make.
66209878Snwhitehorn *
67209878Snwhitehorn * 3.3. Redistribution of Executable. Redistribution in executable form of any
68209878Snwhitehorn * substantial portion of the Covered Code or modification must reproduce the
69209878Snwhitehorn * above Copyright Notice, and the following Disclaimer and Export Compliance
70218824Snwhitehorn * provision in the documentation and/or other materials provided with the
71209878Snwhitehorn * distribution.
72209878Snwhitehorn *
73209878Snwhitehorn * 3.4. Intel retains all right, title, and interest in and to the Original
74209878Snwhitehorn * Intel Code.
75209878Snwhitehorn *
76209878Snwhitehorn * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77231044Sandreast * Intel shall be used in advertising or otherwise to promote the sale, use or
78209878Snwhitehorn * other dealings in products derived from or relating to the Covered Code
79209878Snwhitehorn * without prior written authorization from Intel.
80258502Sandreast *
81258502Sandreast * 4. Disclaimer and Export Compliance
82258502Sandreast *
83231044Sandreast * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84209878Snwhitehorn * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85209878Snwhitehorn * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86209878Snwhitehorn * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87209878Snwhitehorn * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88209878Snwhitehorn * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89218824Snwhitehorn * PARTICULAR PURPOSE.
90209878Snwhitehorn *
91209878Snwhitehorn * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92209878Snwhitehorn * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93209878Snwhitehorn * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94209878Snwhitehorn * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government.  In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117
118#define __RSXFACE_C__
119
120#include <contrib/dev/acpica/acpi.h>
121#include <contrib/dev/acpica/acresrc.h>
122
123#define _COMPONENT          ACPI_RESOURCES
124        ACPI_MODULE_NAME    ("rsxface")
125
126/* Local macros for 16,32-bit to 64-bit conversion */
127
128#define ACPI_COPY_FIELD(Out, In, Field)  ((Out)->Field = (In)->Field)
129#define ACPI_COPY_ADDRESS(Out, In)                      \
130    ACPI_COPY_FIELD(Out, In, ResourceType);              \
131    ACPI_COPY_FIELD(Out, In, ProducerConsumer);          \
132    ACPI_COPY_FIELD(Out, In, Decode);                    \
133    ACPI_COPY_FIELD(Out, In, MinAddressFixed);           \
134    ACPI_COPY_FIELD(Out, In, MaxAddressFixed);           \
135    ACPI_COPY_FIELD(Out, In, Info);                      \
136    ACPI_COPY_FIELD(Out, In, Granularity);               \
137    ACPI_COPY_FIELD(Out, In, Minimum);                   \
138    ACPI_COPY_FIELD(Out, In, Maximum);                   \
139    ACPI_COPY_FIELD(Out, In, TranslationOffset);         \
140    ACPI_COPY_FIELD(Out, In, AddressLength);             \
141    ACPI_COPY_FIELD(Out, In, ResourceSource);
142
143
144/*******************************************************************************
145 *
146 * FUNCTION:    AcpiGetIrqRoutingTable
147 *
148 * PARAMETERS:  DeviceHandle    - a handle to the Bus device we are querying
149 *              RetBuffer       - a pointer to a buffer to receive the
150 *                                current resources for the device
151 *
152 * RETURN:      Status
153 *
154 * DESCRIPTION: This function is called to get the IRQ routing table for a
155 *              specific bus.  The caller must first acquire a handle for the
156 *              desired bus.  The routine table is placed in the buffer pointed
157 *              to by the RetBuffer variable parameter.
158 *
159 *              If the function fails an appropriate status will be returned
160 *              and the value of RetBuffer is undefined.
161 *
162 *              This function attempts to execute the _PRT method contained in
163 *              the object indicated by the passed DeviceHandle.
164 *
165 ******************************************************************************/
166
167ACPI_STATUS
168AcpiGetIrqRoutingTable  (
169    ACPI_HANDLE             DeviceHandle,
170    ACPI_BUFFER             *RetBuffer)
171{
172    ACPI_STATUS             Status;
173
174
175    ACPI_FUNCTION_TRACE ("AcpiGetIrqRoutingTable ");
176
177
178    /*
179     * Must have a valid handle and buffer, So we have to have a handle
180     * and a return buffer structure, and if there is a non-zero buffer length
181     * we also need a valid pointer in the buffer. If it's a zero buffer length,
182     * we'll be returning the needed buffer size, so keep going.
183     */
184    if (!DeviceHandle)
185    {
186        return_ACPI_STATUS (AE_BAD_PARAMETER);
187    }
188
189    Status = AcpiUtValidateBuffer (RetBuffer);
190    if (ACPI_FAILURE (Status))
191    {
192        return_ACPI_STATUS (Status);
193    }
194
195    Status = AcpiRsGetPrtMethodData (DeviceHandle, RetBuffer);
196    return_ACPI_STATUS (Status);
197}
198
199
200/*******************************************************************************
201 *
202 * FUNCTION:    AcpiGetCurrentResources
203 *
204 * PARAMETERS:  DeviceHandle    - a handle to the device object for the
205 *                                device we are querying
206 *              RetBuffer       - a pointer to a buffer to receive the
207 *                                current resources for the device
208 *
209 * RETURN:      Status
210 *
211 * DESCRIPTION: This function is called to get the current resources for a
212 *              specific device.  The caller must first acquire a handle for
213 *              the desired device.  The resource data is placed in the buffer
214 *              pointed to by the RetBuffer variable parameter.
215 *
216 *              If the function fails an appropriate status will be returned
217 *              and the value of RetBuffer is undefined.
218 *
219 *              This function attempts to execute the _CRS method contained in
220 *              the object indicated by the passed DeviceHandle.
221 *
222 ******************************************************************************/
223
224ACPI_STATUS
225AcpiGetCurrentResources (
226    ACPI_HANDLE             DeviceHandle,
227    ACPI_BUFFER             *RetBuffer)
228{
229    ACPI_STATUS             Status;
230
231
232    ACPI_FUNCTION_TRACE ("AcpiGetCurrentResources");
233
234
235    /*
236     * Must have a valid handle and buffer, So we have to have a handle
237     * and a return buffer structure, and if there is a non-zero buffer length
238     * we also need a valid pointer in the buffer. If it's a zero buffer length,
239     * we'll be returning the needed buffer size, so keep going.
240     */
241    if (!DeviceHandle)
242    {
243        return_ACPI_STATUS (AE_BAD_PARAMETER);
244    }
245
246    Status = AcpiUtValidateBuffer (RetBuffer);
247    if (ACPI_FAILURE (Status))
248    {
249        return_ACPI_STATUS (Status);
250    }
251
252    Status = AcpiRsGetCrsMethodData (DeviceHandle, RetBuffer);
253    return_ACPI_STATUS (Status);
254}
255
256
257/*******************************************************************************
258 *
259 * FUNCTION:    AcpiGetPossibleResources
260 *
261 * PARAMETERS:  DeviceHandle    - a handle to the device object for the
262 *                                device we are querying
263 *              RetBuffer       - a pointer to a buffer to receive the
264 *                                resources for the device
265 *
266 * RETURN:      Status
267 *
268 * DESCRIPTION: This function is called to get a list of the possible resources
269 *              for a specific device.  The caller must first acquire a handle
270 *              for the desired device.  The resource data is placed in the
271 *              buffer pointed to by the RetBuffer variable.
272 *
273 *              If the function fails an appropriate status will be returned
274 *              and the value of RetBuffer is undefined.
275 *
276 ******************************************************************************/
277
278ACPI_STATUS
279AcpiGetPossibleResources (
280    ACPI_HANDLE             DeviceHandle,
281    ACPI_BUFFER             *RetBuffer)
282{
283    ACPI_STATUS             Status;
284
285
286    ACPI_FUNCTION_TRACE ("AcpiGetPossibleResources");
287
288
289    /*
290     * Must have a valid handle and buffer, So we have to have a handle
291     * and a return buffer structure, and if there is a non-zero buffer length
292     * we also need a valid pointer in the buffer. If it's a zero buffer length,
293     * we'll be returning the needed buffer size, so keep going.
294     */
295    if (!DeviceHandle)
296    {
297        return_ACPI_STATUS (AE_BAD_PARAMETER);
298    }
299
300    Status = AcpiUtValidateBuffer (RetBuffer);
301    if (ACPI_FAILURE (Status))
302    {
303        return_ACPI_STATUS (Status);
304    }
305
306    Status = AcpiRsGetPrsMethodData (DeviceHandle, RetBuffer);
307    return_ACPI_STATUS (Status);
308}
309
310
311/*******************************************************************************
312 *
313 * FUNCTION:    AcpiWalkResources
314 *
315 * PARAMETERS:  DeviceHandle    - a handle to the device object for the
316 *                                device we are querying
317 *              Path            - method name of the resources we want
318 *                                (METHOD_NAME__CRS or METHOD_NAME__PRS)
319 *              UserFunction    - called for each resource
320 *              Context         - passed to UserFunction
321 *
322 * RETURN:      Status
323 *
324 * DESCRIPTION: Retrieves the current or possible resource list for the
325 *              specified device.  The UserFunction is called once for
326 *              each resource in the list.
327 *
328 ******************************************************************************/
329
330ACPI_STATUS
331AcpiWalkResources (
332    ACPI_HANDLE                 DeviceHandle,
333    char                        *Path,
334    ACPI_WALK_RESOURCE_CALLBACK UserFunction,
335    void                        *Context)
336{
337    ACPI_STATUS                 Status;
338    ACPI_BUFFER                 Buffer = {ACPI_ALLOCATE_BUFFER, NULL};
339    ACPI_RESOURCE               *Resource;
340    ACPI_RESOURCE               *BufferEnd;
341
342
343    ACPI_FUNCTION_TRACE ("AcpiWalkResources");
344
345
346    if (!DeviceHandle ||
347        (ACPI_STRNCMP (Path, METHOD_NAME__CRS, sizeof (METHOD_NAME__CRS)) &&
348         ACPI_STRNCMP (Path, METHOD_NAME__PRS, sizeof (METHOD_NAME__PRS))))
349    {
350        return_ACPI_STATUS (AE_BAD_PARAMETER);
351    }
352
353    Status = AcpiRsGetMethodData (DeviceHandle, Path, &Buffer);
354    if (ACPI_FAILURE (Status))
355    {
356        return_ACPI_STATUS (Status);
357    }
358
359    /* Setup pointers */
360
361    Resource  = (ACPI_RESOURCE *) Buffer.Pointer;
362    BufferEnd = ACPI_CAST_PTR (ACPI_RESOURCE,
363                    ((UINT8 *) Buffer.Pointer + Buffer.Length));
364
365    /* Walk the resource list */
366
367    for (;;)
368    {
369        if (!Resource || Resource->Type == ACPI_RESOURCE_TYPE_END_TAG)
370        {
371            break;
372        }
373
374        Status = UserFunction (Resource, Context);
375
376        switch (Status)
377        {
378        case AE_OK:
379        case AE_CTRL_DEPTH:
380
381            /* Just keep going */
382
383            Status = AE_OK;
384            break;
385
386        case AE_CTRL_TERMINATE:
387
388            /* Exit now, with OK stats */
389
390            Status = AE_OK;
391            goto Cleanup;
392
393        default:
394
395            /* All others are valid exceptions */
396
397            goto Cleanup;
398        }
399
400        /* Get the next resource descriptor */
401
402        Resource = ACPI_NEXT_RESOURCE (Resource);
403
404        /* Check for end-of-buffer */
405
406        if (Resource >= BufferEnd)
407        {
408            goto Cleanup;
409        }
410    }
411
412Cleanup:
413
414    AcpiOsFree (Buffer.Pointer);
415    return_ACPI_STATUS (Status);
416}
417
418
419/*******************************************************************************
420 *
421 * FUNCTION:    AcpiSetCurrentResources
422 *
423 * PARAMETERS:  DeviceHandle    - a handle to the device object for the
424 *                                device we are changing the resources of
425 *              InBuffer        - a pointer to a buffer containing the
426 *                                resources to be set for the device
427 *
428 * RETURN:      Status
429 *
430 * DESCRIPTION: This function is called to set the current resources for a
431 *              specific device.  The caller must first acquire a handle for
432 *              the desired device.  The resource data is passed to the routine
433 *              the buffer pointed to by the InBuffer variable.
434 *
435 ******************************************************************************/
436
437ACPI_STATUS
438AcpiSetCurrentResources (
439    ACPI_HANDLE             DeviceHandle,
440    ACPI_BUFFER             *InBuffer)
441{
442    ACPI_STATUS             Status;
443
444
445    ACPI_FUNCTION_TRACE ("AcpiSetCurrentResources");
446
447
448    /* Must have a valid handle and buffer */
449
450    if ((!DeviceHandle)       ||
451        (!InBuffer)           ||
452        (!InBuffer->Pointer)  ||
453        (!InBuffer->Length))
454    {
455        return_ACPI_STATUS (AE_BAD_PARAMETER);
456    }
457
458    Status = AcpiRsSetSrsMethodData (DeviceHandle, InBuffer);
459    return_ACPI_STATUS (Status);
460}
461
462
463/******************************************************************************
464 *
465 * FUNCTION:    AcpiResourceToAddress64
466 *
467 * PARAMETERS:  Resource                - Pointer to a resource
468 *              Out                     - Pointer to the users's return
469 *                                        buffer (a struct
470 *                                        acpi_resource_address64)
471 *
472 * RETURN:      Status
473 *
474 * DESCRIPTION: If the resource is an address16, address32, or address64,
475 *              copy it to the address64 return buffer.  This saves the
476 *              caller from having to duplicate code for different-sized
477 *              addresses.
478 *
479 ******************************************************************************/
480
481ACPI_STATUS
482AcpiResourceToAddress64 (
483    ACPI_RESOURCE               *Resource,
484    ACPI_RESOURCE_ADDRESS64     *Out)
485{
486    ACPI_RESOURCE_ADDRESS16     *Address16;
487    ACPI_RESOURCE_ADDRESS32     *Address32;
488
489
490    switch (Resource->Type)
491    {
492    case ACPI_RESOURCE_TYPE_ADDRESS16:
493
494        Address16 = (ACPI_RESOURCE_ADDRESS16 *) &Resource->Data;
495        ACPI_COPY_ADDRESS (Out, Address16);
496        break;
497
498    case ACPI_RESOURCE_TYPE_ADDRESS32:
499
500        Address32 = (ACPI_RESOURCE_ADDRESS32 *) &Resource->Data;
501        ACPI_COPY_ADDRESS (Out, Address32);
502        break;
503
504    case ACPI_RESOURCE_TYPE_ADDRESS64:
505
506        /* Simple copy for 64 bit source */
507
508        ACPI_MEMCPY (Out, &Resource->Data, sizeof (ACPI_RESOURCE_ADDRESS64));
509        break;
510
511    default:
512        return (AE_BAD_PARAMETER);
513    }
514
515    return (AE_OK);
516}
517