]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/dev/acpica/components/resources/rsio.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / dev / acpica / components / resources / rsio.c
1 /*******************************************************************************
2  *
3  * Module Name: rsio - IO and DMA resource descriptors
4  *
5  ******************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2013, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44 #define __RSIO_C__
45
46 #include <contrib/dev/acpica/include/acpi.h>
47 #include <contrib/dev/acpica/include/accommon.h>
48 #include <contrib/dev/acpica/include/acresrc.h>
49
50 #define _COMPONENT          ACPI_RESOURCES
51         ACPI_MODULE_NAME    ("rsio")
52
53
54 /*******************************************************************************
55  *
56  * AcpiRsConvertIo
57  *
58  ******************************************************************************/
59
60 ACPI_RSCONVERT_INFO     AcpiRsConvertIo[5] =
61 {
62     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_IO,
63                         ACPI_RS_SIZE (ACPI_RESOURCE_IO),
64                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertIo)},
65
66     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_IO,
67                         sizeof (AML_RESOURCE_IO),
68                         0},
69
70     /* Decode flag */
71
72     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Io.IoDecode),
73                         AML_OFFSET (Io.Flags),
74                         0},
75     /*
76      * These fields are contiguous in both the source and destination:
77      * Address Alignment
78      * Length
79      * Minimum Base Address
80      * Maximum Base Address
81      */
82     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Io.Alignment),
83                         AML_OFFSET (Io.Alignment),
84                         2},
85
86     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.Io.Minimum),
87                         AML_OFFSET (Io.Minimum),
88                         2}
89 };
90
91
92 /*******************************************************************************
93  *
94  * AcpiRsConvertFixedIo
95  *
96  ******************************************************************************/
97
98 ACPI_RSCONVERT_INFO     AcpiRsConvertFixedIo[4] =
99 {
100     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_FIXED_IO,
101                         ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_IO),
102                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedIo)},
103
104     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_FIXED_IO,
105                         sizeof (AML_RESOURCE_FIXED_IO),
106                         0},
107     /*
108      * These fields are contiguous in both the source and destination:
109      * Base Address
110      * Length
111      */
112     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.FixedIo.AddressLength),
113                         AML_OFFSET (FixedIo.AddressLength),
114                         1},
115
116     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.FixedIo.Address),
117                         AML_OFFSET (FixedIo.Address),
118                         1}
119 };
120
121
122 /*******************************************************************************
123  *
124  * AcpiRsConvertGenericReg
125  *
126  ******************************************************************************/
127
128 ACPI_RSCONVERT_INFO     AcpiRsConvertGenericReg[4] =
129 {
130     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
131                         ACPI_RS_SIZE (ACPI_RESOURCE_GENERIC_REGISTER),
132                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertGenericReg)},
133
134     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_GENERIC_REGISTER,
135                         sizeof (AML_RESOURCE_GENERIC_REGISTER),
136                         0},
137     /*
138      * These fields are contiguous in both the source and destination:
139      * Address Space ID
140      * Register Bit Width
141      * Register Bit Offset
142      * Access Size
143      */
144     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.GenericReg.SpaceId),
145                         AML_OFFSET (GenericReg.AddressSpaceId),
146                         4},
147
148     /* Get the Register Address */
149
150     {ACPI_RSC_MOVE64,   ACPI_RS_OFFSET (Data.GenericReg.Address),
151                         AML_OFFSET (GenericReg.Address),
152                         1}
153 };
154
155
156 /*******************************************************************************
157  *
158  * AcpiRsConvertEndDpf
159  *
160  ******************************************************************************/
161
162 ACPI_RSCONVERT_INFO   AcpiRsConvertEndDpf[2] =
163 {
164     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_DEPENDENT,
165                         ACPI_RS_SIZE_MIN,
166                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndDpf)},
167
168     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_DEPENDENT,
169                         sizeof (AML_RESOURCE_END_DEPENDENT),
170                         0}
171 };
172
173
174 /*******************************************************************************
175  *
176  * AcpiRsConvertEndTag
177  *
178  ******************************************************************************/
179
180 ACPI_RSCONVERT_INFO   AcpiRsConvertEndTag[2] =
181 {
182     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_TAG,
183                         ACPI_RS_SIZE_MIN,
184                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndTag)},
185
186     /*
187      * Note: The checksum field is set to zero, meaning that the resource
188      * data is treated as if the checksum operation succeeded.
189      * (ACPI Spec 1.0b Section 6.4.2.8)
190      */
191     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_TAG,
192                         sizeof (AML_RESOURCE_END_TAG),
193                         0}
194 };
195
196
197 /*******************************************************************************
198  *
199  * AcpiRsGetStartDpf
200  *
201  ******************************************************************************/
202
203 ACPI_RSCONVERT_INFO   AcpiRsGetStartDpf[6] =
204 {
205     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_START_DEPENDENT,
206                         ACPI_RS_SIZE (ACPI_RESOURCE_START_DEPENDENT),
207                         ACPI_RSC_TABLE_SIZE (AcpiRsGetStartDpf)},
208
209     /* Defaults for Compatibility and Performance priorities */
210
211     {ACPI_RSC_SET8,     ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
212                         ACPI_ACCEPTABLE_CONFIGURATION,
213                         2},
214
215     /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
216
217     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.DescriptorLength),
218                         AML_OFFSET (StartDpf.DescriptorType),
219                         0},
220
221     /* All done if there is no flag byte present in the descriptor */
222
223     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
224
225     /* Flag byte is present, get the flags */
226
227     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
228                         AML_OFFSET (StartDpf.Flags),
229                         0},
230
231     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
232                         AML_OFFSET (StartDpf.Flags),
233                         2}
234 };
235
236
237 /*******************************************************************************
238  *
239  * AcpiRsSetStartDpf
240  *
241  ******************************************************************************/
242
243 ACPI_RSCONVERT_INFO   AcpiRsSetStartDpf[10] =
244 {
245     /* Start with a default descriptor of length 1 */
246
247     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_START_DEPENDENT,
248                         sizeof (AML_RESOURCE_START_DEPENDENT),
249                         ACPI_RSC_TABLE_SIZE (AcpiRsSetStartDpf)},
250
251     /* Set the default flag values */
252
253     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
254                         AML_OFFSET (StartDpf.Flags),
255                         0},
256
257     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
258                         AML_OFFSET (StartDpf.Flags),
259                         2},
260     /*
261      * All done if the output descriptor length is required to be 1
262      * (i.e., optimization to 0 bytes cannot be attempted)
263      */
264     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
265                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
266                         1},
267
268     /* Set length to 0 bytes (no flags byte) */
269
270     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)},
271
272     /*
273      * All done if the output descriptor length is required to be 0.
274      *
275      * TBD: Perhaps we should check for error if input flags are not
276      * compatible with a 0-byte descriptor.
277      */
278     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
279                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
280                         0},
281
282     /* Reset length to 1 byte (descriptor with flags byte) */
283
284     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT)},
285
286
287     /*
288      * All done if flags byte is necessary -- if either priority value
289      * is not ACPI_ACCEPTABLE_CONFIGURATION
290      */
291     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
292                         ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
293                         ACPI_ACCEPTABLE_CONFIGURATION},
294
295     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
296                         ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
297                         ACPI_ACCEPTABLE_CONFIGURATION},
298
299     /* Flag byte is not necessary */
300
301     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)}
302 };