167754Smsmith/*******************************************************************************
267754Smsmith *
377424Smsmith * Module Name: rsaddr - Address resource descriptors (16/32/64)
467754Smsmith *
567754Smsmith ******************************************************************************/
667754Smsmith
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
970243Smsmith * All rights reserved.
1067754Smsmith *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
2567754Smsmith *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
2967754Smsmith *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
4367754Smsmith
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/acresrc.h>
4767754Smsmith
4877424Smsmith#define _COMPONENT          ACPI_RESOURCES
4991116Smsmith        ACPI_MODULE_NAME    ("rsaddr")
5067754Smsmith
5167754Smsmith
5267754Smsmith/*******************************************************************************
5367754Smsmith *
54151937Sjkim * AcpiRsConvertAddress16 - All WORD (16-bit) address resources
5567754Smsmith *
5667754Smsmith ******************************************************************************/
5767754Smsmith
58151937SjkimACPI_RSCONVERT_INFO     AcpiRsConvertAddress16[5] =
5967754Smsmith{
60151937Sjkim    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_ADDRESS16,
61151937Sjkim                        ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS16),
62151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress16)},
6367754Smsmith
64151937Sjkim    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_ADDRESS16,
65151937Sjkim                        sizeof (AML_RESOURCE_ADDRESS16),
66151937Sjkim                        0},
6767754Smsmith
68151937Sjkim    /* Resource Type, General Flags, and Type-Specific Flags */
6967754Smsmith
70151937Sjkim    {ACPI_RSC_ADDRESS,  0, 0, 0},
71128212Snjl
7267754Smsmith    /*
73151937Sjkim     * These fields are contiguous in both the source and destination:
74151937Sjkim     * Address Granularity
75151937Sjkim     * Address Range Minimum
76151937Sjkim     * Address Range Maximum
77151937Sjkim     * Address Translation Offset
78151937Sjkim     * Address Length
7967754Smsmith     */
80281687Sjkim    {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.Address16.Address.Granularity),
81151937Sjkim                        AML_OFFSET (Address16.Granularity),
82151937Sjkim                        5},
8367754Smsmith
84151937Sjkim    /* Optional ResourceSource (Index and String) */
85123315Snjl
86151937Sjkim    {ACPI_RSC_SOURCE,   ACPI_RS_OFFSET (Data.Address16.ResourceSource),
87151937Sjkim                        0,
88151937Sjkim                        sizeof (AML_RESOURCE_ADDRESS16)}
89151937Sjkim};
90120239Snjl
9167754Smsmith
92151937Sjkim/*******************************************************************************
93151937Sjkim *
94151937Sjkim * AcpiRsConvertAddress32 - All DWORD (32-bit) address resources
95151937Sjkim *
96151937Sjkim ******************************************************************************/
9767754Smsmith
98151937SjkimACPI_RSCONVERT_INFO     AcpiRsConvertAddress32[5] =
99151937Sjkim{
100151937Sjkim    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_ADDRESS32,
101151937Sjkim                        ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS32),
102151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress32)},
10387031Smsmith
104151937Sjkim    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_ADDRESS32,
105151937Sjkim                        sizeof (AML_RESOURCE_ADDRESS32),
106151937Sjkim                        0},
10767754Smsmith
108151937Sjkim    /* Resource Type, General Flags, and Type-Specific Flags */
10967754Smsmith
110151937Sjkim    {ACPI_RSC_ADDRESS,  0, 0, 0},
11167754Smsmith
11267754Smsmith    /*
113151937Sjkim     * These fields are contiguous in both the source and destination:
114151937Sjkim     * Address Granularity
115151937Sjkim     * Address Range Minimum
116151937Sjkim     * Address Range Maximum
117151937Sjkim     * Address Translation Offset
118151937Sjkim     * Address Length
11967754Smsmith     */
120281687Sjkim    {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.Address32.Address.Granularity),
121151937Sjkim                        AML_OFFSET (Address32.Granularity),
122151937Sjkim                        5},
12367754Smsmith
124151937Sjkim    /* Optional ResourceSource (Index and String) */
12567754Smsmith
126151937Sjkim    {ACPI_RSC_SOURCE,   ACPI_RS_OFFSET (Data.Address32.ResourceSource),
127151937Sjkim                        0,
128151937Sjkim                        sizeof (AML_RESOURCE_ADDRESS32)}
129151937Sjkim};
13067754Smsmith
13167754Smsmith
13267754Smsmith/*******************************************************************************
13367754Smsmith *
134151937Sjkim * AcpiRsConvertAddress64 - All QWORD (64-bit) address resources
13567754Smsmith *
13667754Smsmith ******************************************************************************/
13767754Smsmith
138151937SjkimACPI_RSCONVERT_INFO     AcpiRsConvertAddress64[5] =
13967754Smsmith{
140151937Sjkim    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_ADDRESS64,
141151937Sjkim                        ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS64),
142151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress64)},
14367754Smsmith
144151937Sjkim    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_ADDRESS64,
145151937Sjkim                        sizeof (AML_RESOURCE_ADDRESS64),
146151937Sjkim                        0},
14767754Smsmith
148151937Sjkim    /* Resource Type, General Flags, and Type-Specific Flags */
14967754Smsmith
150151937Sjkim    {ACPI_RSC_ADDRESS,  0, 0, 0},
15177424Smsmith
15267754Smsmith    /*
153151937Sjkim     * These fields are contiguous in both the source and destination:
154151937Sjkim     * Address Granularity
155151937Sjkim     * Address Range Minimum
156151937Sjkim     * Address Range Maximum
157151937Sjkim     * Address Translation Offset
158151937Sjkim     * Address Length
15967754Smsmith     */
160281687Sjkim    {ACPI_RSC_MOVE64,   ACPI_RS_OFFSET (Data.Address64.Address.Granularity),
161151937Sjkim                        AML_OFFSET (Address64.Granularity),
162151937Sjkim                        5},
16367754Smsmith
164151937Sjkim    /* Optional ResourceSource (Index and String) */
16567754Smsmith
166151937Sjkim    {ACPI_RSC_SOURCE,   ACPI_RS_OFFSET (Data.Address64.ResourceSource),
167151937Sjkim                        0,
168151937Sjkim                        sizeof (AML_RESOURCE_ADDRESS64)}
169151937Sjkim};
17067754Smsmith
17167754Smsmith
172151937Sjkim/*******************************************************************************
173151937Sjkim *
174151937Sjkim * AcpiRsConvertExtAddress64 - All Extended (64-bit) address resources
175151937Sjkim *
176151937Sjkim ******************************************************************************/
17767754Smsmith
178151937SjkimACPI_RSCONVERT_INFO     AcpiRsConvertExtAddress64[5] =
179151937Sjkim{
180151937Sjkim    {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
181151937Sjkim                        ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_ADDRESS64),
182151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertExtAddress64)},
18367754Smsmith
184151937Sjkim    {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
185151937Sjkim                        sizeof (AML_RESOURCE_EXTENDED_ADDRESS64),
186151937Sjkim                        0},
18767754Smsmith
188151937Sjkim    /* Resource Type, General Flags, and Type-Specific Flags */
18967754Smsmith
190151937Sjkim    {ACPI_RSC_ADDRESS,  0, 0, 0},
19167754Smsmith
192151937Sjkim    /* Revision ID */
19367754Smsmith
194151937Sjkim    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.ExtAddress64.RevisionID),
195151937Sjkim                        AML_OFFSET (ExtAddress64.RevisionID),
196151937Sjkim                        1},
19767754Smsmith    /*
198151937Sjkim     * These fields are contiguous in both the source and destination:
199151937Sjkim     * Address Granularity
200151937Sjkim     * Address Range Minimum
201151937Sjkim     * Address Range Maximum
202151937Sjkim     * Address Translation Offset
203151937Sjkim     * Address Length
204151937Sjkim     * Type-Specific Attribute
20567754Smsmith     */
206281687Sjkim    {ACPI_RSC_MOVE64,   ACPI_RS_OFFSET (Data.ExtAddress64.Address.Granularity),
207151937Sjkim                        AML_OFFSET (ExtAddress64.Granularity),
208151937Sjkim                        6}
209151937Sjkim};
21067754Smsmith
21167754Smsmith
212151937Sjkim/*******************************************************************************
213151937Sjkim *
214151937Sjkim * AcpiRsConvertGeneralFlags - Flags common to all address descriptors
215151937Sjkim *
216151937Sjkim ******************************************************************************/
21767754Smsmith
218151937Sjkimstatic ACPI_RSCONVERT_INFO  AcpiRsConvertGeneralFlags[6] =
219151937Sjkim{
220151937Sjkim    {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.Flags),
221151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertGeneralFlags)},
22267754Smsmith
223151937Sjkim    /* Resource Type (Memory, Io, BusNumber, etc.) */
22467754Smsmith
225151937Sjkim    {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Address.ResourceType),
226151937Sjkim                        AML_OFFSET (Address.ResourceType),
227151937Sjkim                        1},
22867754Smsmith
229151937Sjkim    /* General Flags - Consume, Decode, MinFixed, MaxFixed */
23067754Smsmith
231151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.ProducerConsumer),
232151937Sjkim                        AML_OFFSET (Address.Flags),
233151937Sjkim                        0},
23467754Smsmith
235151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Decode),
236151937Sjkim                        AML_OFFSET (Address.Flags),
237151937Sjkim                        1},
23867754Smsmith
239151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.MinAddressFixed),
240151937Sjkim                        AML_OFFSET (Address.Flags),
241151937Sjkim                        2},
24267754Smsmith
243151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.MaxAddressFixed),
244151937Sjkim                        AML_OFFSET (Address.Flags),
245151937Sjkim                        3}
246151937Sjkim};
24767754Smsmith
24867754Smsmith
24967754Smsmith/*******************************************************************************
25067754Smsmith *
251151937Sjkim * AcpiRsConvertMemFlags - Flags common to Memory address descriptors
25267754Smsmith *
25367754Smsmith ******************************************************************************/
25467754Smsmith
255151937Sjkimstatic ACPI_RSCONVERT_INFO  AcpiRsConvertMemFlags[5] =
25667754Smsmith{
257151937Sjkim    {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.SpecificFlags),
258151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemFlags)},
25967754Smsmith
260151937Sjkim    /* Memory-specific flags */
26167754Smsmith
262151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.WriteProtect),
263151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
264151937Sjkim                        0},
26567754Smsmith
266151937Sjkim    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.Caching),
267151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
268151937Sjkim                        1},
26977424Smsmith
270151937Sjkim    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.RangeType),
271151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
272151937Sjkim                        3},
27367754Smsmith
274151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.Translation),
275151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
276151937Sjkim                        5}
277151937Sjkim};
278120239Snjl
279123315Snjl
28067754Smsmith/*******************************************************************************
28167754Smsmith *
282151937Sjkim * AcpiRsConvertIoFlags - Flags common to I/O address descriptors
28367754Smsmith *
28467754Smsmith ******************************************************************************/
28567754Smsmith
286151937Sjkimstatic ACPI_RSCONVERT_INFO  AcpiRsConvertIoFlags[4] =
28767754Smsmith{
288151937Sjkim    {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.SpecificFlags),
289151937Sjkim                        ACPI_RSC_TABLE_SIZE (AcpiRsConvertIoFlags)},
29067754Smsmith
291151937Sjkim    /* I/O-specific flags */
29267754Smsmith
293151937Sjkim    {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.RangeType),
294151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
295151937Sjkim                        0},
29667754Smsmith
297151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.Translation),
298151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
299151937Sjkim                        4},
30077424Smsmith
301151937Sjkim    {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.TranslationType),
302151937Sjkim                        AML_OFFSET (Address.SpecificFlags),
303151937Sjkim                        5}
304151937Sjkim};
30567754Smsmith
30667754Smsmith
30777424Smsmith/*******************************************************************************
30877424Smsmith *
309151937Sjkim * FUNCTION:    AcpiRsGetAddressCommon
31077424Smsmith *
311151937Sjkim * PARAMETERS:  Resource            - Pointer to the internal resource struct
312151937Sjkim *              Aml                 - Pointer to the AML resource descriptor
31377424Smsmith *
314151937Sjkim * RETURN:      TRUE if the ResourceType field is OK, FALSE otherwise
31577424Smsmith *
316151937Sjkim * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
317151937Sjkim *              to an internal resource descriptor
31877424Smsmith *
31977424Smsmith ******************************************************************************/
32077424Smsmith
321151937SjkimBOOLEAN
322151937SjkimAcpiRsGetAddressCommon (
323151937Sjkim    ACPI_RESOURCE           *Resource,
324151937Sjkim    AML_RESOURCE            *Aml)
32577424Smsmith{
326151937Sjkim    ACPI_FUNCTION_ENTRY ();
32777424Smsmith
32877424Smsmith
329151937Sjkim    /* Validate the Resource Type */
33077424Smsmith
331306536Sjkim    if ((Aml->Address.ResourceType > 2) &&
332306536Sjkim        (Aml->Address.ResourceType < 0xC0))
333123315Snjl    {
334151937Sjkim        return (FALSE);
335123315Snjl    }
336123315Snjl
337151937Sjkim    /* Get the Resource Type and General Flags */
33877424Smsmith
339306536Sjkim    (void) AcpiRsConvertAmlToResource (
340306536Sjkim        Resource, Aml, AcpiRsConvertGeneralFlags);
34177424Smsmith
342151937Sjkim    /* Get the Type-Specific Flags (Memory and I/O descriptors only) */
34387031Smsmith
344151937Sjkim    if (Resource->Data.Address.ResourceType == ACPI_MEMORY_RANGE)
34577424Smsmith    {
346306536Sjkim        (void) AcpiRsConvertAmlToResource (
347306536Sjkim            Resource, Aml, AcpiRsConvertMemFlags);
34877424Smsmith    }
349151937Sjkim    else if (Resource->Data.Address.ResourceType == ACPI_IO_RANGE)
35077424Smsmith    {
351306536Sjkim        (void) AcpiRsConvertAmlToResource (
352306536Sjkim            Resource, Aml, AcpiRsConvertIoFlags);
35377424Smsmith    }
35477424Smsmith    else
35577424Smsmith    {
356151937Sjkim        /* Generic resource type, just grab the TypeSpecific byte */
35777424Smsmith
358306536Sjkim        Resource->Data.Address.Info.TypeSpecific =
359306536Sjkim            Aml->Address.SpecificFlags;
36077424Smsmith    }
36177424Smsmith
362151937Sjkim    return (TRUE);
36367754Smsmith}
36467754Smsmith
36577424Smsmith
36677424Smsmith/*******************************************************************************
36777424Smsmith *
368151937Sjkim * FUNCTION:    AcpiRsSetAddressCommon
36977424Smsmith *
370151937Sjkim * PARAMETERS:  Aml                 - Pointer to the AML resource descriptor
371151937Sjkim *              Resource            - Pointer to the internal resource struct
37277424Smsmith *
373151937Sjkim * RETURN:      None
37477424Smsmith *
375151937Sjkim * DESCRIPTION: Convert common flag fields from a resource descriptor to an
376151937Sjkim *              AML descriptor
37777424Smsmith *
37877424Smsmith ******************************************************************************/
37977424Smsmith
380151937Sjkimvoid
381151937SjkimAcpiRsSetAddressCommon (
382151937Sjkim    AML_RESOURCE            *Aml,
383151937Sjkim    ACPI_RESOURCE           *Resource)
38477424Smsmith{
385151937Sjkim    ACPI_FUNCTION_ENTRY ();
38677424Smsmith
38777424Smsmith
388151937Sjkim    /* Set the Resource Type and General Flags */
38977424Smsmith
390306536Sjkim    (void) AcpiRsConvertResourceToAml (
391306536Sjkim        Resource, Aml, AcpiRsConvertGeneralFlags);
39277424Smsmith
393151937Sjkim    /* Set the Type-Specific Flags (Memory and I/O descriptors only) */
39477424Smsmith
395151937Sjkim    if (Resource->Data.Address.ResourceType == ACPI_MEMORY_RANGE)
39677424Smsmith    {
397306536Sjkim        (void) AcpiRsConvertResourceToAml (
398306536Sjkim            Resource, Aml, AcpiRsConvertMemFlags);
39977424Smsmith    }
400151937Sjkim    else if (Resource->Data.Address.ResourceType == ACPI_IO_RANGE)
40177424Smsmith    {
402306536Sjkim        (void) AcpiRsConvertResourceToAml (
403306536Sjkim            Resource, Aml, AcpiRsConvertIoFlags);
40477424Smsmith    }
405151937Sjkim    else
40677424Smsmith    {
407151937Sjkim        /* Generic resource type, just copy the TypeSpecific byte */
40877424Smsmith
409306536Sjkim        Aml->Address.SpecificFlags =
410306536Sjkim            Resource->Data.Address.Info.TypeSpecific;
41177424Smsmith    }
412151937Sjkim}
413