xref: /freebsd/sys/contrib/dev/acpica/components/resources/rsio.c (revision 273c26a3c3bea87a241d6879abd4f991db180bf0)
1 /*******************************************************************************
2  *
3  * Module Name: rsio - IO and DMA resource descriptors
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2016, 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 #include <contrib/dev/acpica/include/acpi.h>
45 #include <contrib/dev/acpica/include/accommon.h>
46 #include <contrib/dev/acpica/include/acresrc.h>
47 
48 #define _COMPONENT          ACPI_RESOURCES
49         ACPI_MODULE_NAME    ("rsio")
50 
51 
52 /*******************************************************************************
53  *
54  * AcpiRsConvertIo
55  *
56  ******************************************************************************/
57 
58 ACPI_RSCONVERT_INFO     AcpiRsConvertIo[5] =
59 {
60     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_IO,
61                         ACPI_RS_SIZE (ACPI_RESOURCE_IO),
62                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertIo)},
63 
64     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_IO,
65                         sizeof (AML_RESOURCE_IO),
66                         0},
67 
68     /* Decode flag */
69 
70     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Io.IoDecode),
71                         AML_OFFSET (Io.Flags),
72                         0},
73     /*
74      * These fields are contiguous in both the source and destination:
75      * Address Alignment
76      * Length
77      * Minimum Base Address
78      * Maximum Base Address
79      */
80     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Io.Alignment),
81                         AML_OFFSET (Io.Alignment),
82                         2},
83 
84     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.Io.Minimum),
85                         AML_OFFSET (Io.Minimum),
86                         2}
87 };
88 
89 
90 /*******************************************************************************
91  *
92  * AcpiRsConvertFixedIo
93  *
94  ******************************************************************************/
95 
96 ACPI_RSCONVERT_INFO     AcpiRsConvertFixedIo[4] =
97 {
98     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_FIXED_IO,
99                         ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_IO),
100                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedIo)},
101 
102     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_FIXED_IO,
103                         sizeof (AML_RESOURCE_FIXED_IO),
104                         0},
105     /*
106      * These fields are contiguous in both the source and destination:
107      * Base Address
108      * Length
109      */
110     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.FixedIo.AddressLength),
111                         AML_OFFSET (FixedIo.AddressLength),
112                         1},
113 
114     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.FixedIo.Address),
115                         AML_OFFSET (FixedIo.Address),
116                         1}
117 };
118 
119 
120 /*******************************************************************************
121  *
122  * AcpiRsConvertGenericReg
123  *
124  ******************************************************************************/
125 
126 ACPI_RSCONVERT_INFO     AcpiRsConvertGenericReg[4] =
127 {
128     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
129                         ACPI_RS_SIZE (ACPI_RESOURCE_GENERIC_REGISTER),
130                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertGenericReg)},
131 
132     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_GENERIC_REGISTER,
133                         sizeof (AML_RESOURCE_GENERIC_REGISTER),
134                         0},
135     /*
136      * These fields are contiguous in both the source and destination:
137      * Address Space ID
138      * Register Bit Width
139      * Register Bit Offset
140      * Access Size
141      */
142     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.GenericReg.SpaceId),
143                         AML_OFFSET (GenericReg.AddressSpaceId),
144                         4},
145 
146     /* Get the Register Address */
147 
148     {ACPI_RSC_MOVE64,   ACPI_RS_OFFSET (Data.GenericReg.Address),
149                         AML_OFFSET (GenericReg.Address),
150                         1}
151 };
152 
153 
154 /*******************************************************************************
155  *
156  * AcpiRsConvertEndDpf
157  *
158  ******************************************************************************/
159 
160 ACPI_RSCONVERT_INFO   AcpiRsConvertEndDpf[2] =
161 {
162     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_DEPENDENT,
163                         ACPI_RS_SIZE_MIN,
164                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndDpf)},
165 
166     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_DEPENDENT,
167                         sizeof (AML_RESOURCE_END_DEPENDENT),
168                         0}
169 };
170 
171 
172 /*******************************************************************************
173  *
174  * AcpiRsConvertEndTag
175  *
176  ******************************************************************************/
177 
178 ACPI_RSCONVERT_INFO   AcpiRsConvertEndTag[2] =
179 {
180     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_TAG,
181                         ACPI_RS_SIZE_MIN,
182                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndTag)},
183 
184     /*
185      * Note: The checksum field is set to zero, meaning that the resource
186      * data is treated as if the checksum operation succeeded.
187      * (ACPI Spec 1.0b Section 6.4.2.8)
188      */
189     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_TAG,
190                         sizeof (AML_RESOURCE_END_TAG),
191                         0}
192 };
193 
194 
195 /*******************************************************************************
196  *
197  * AcpiRsGetStartDpf
198  *
199  ******************************************************************************/
200 
201 ACPI_RSCONVERT_INFO   AcpiRsGetStartDpf[6] =
202 {
203     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_START_DEPENDENT,
204                         ACPI_RS_SIZE (ACPI_RESOURCE_START_DEPENDENT),
205                         ACPI_RSC_TABLE_SIZE (AcpiRsGetStartDpf)},
206 
207     /* Defaults for Compatibility and Performance priorities */
208 
209     {ACPI_RSC_SET8,     ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
210                         ACPI_ACCEPTABLE_CONFIGURATION,
211                         2},
212 
213     /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
214 
215     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.DescriptorLength),
216                         AML_OFFSET (StartDpf.DescriptorType),
217                         0},
218 
219     /* All done if there is no flag byte present in the descriptor */
220 
221     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
222 
223     /* Flag byte is present, get the flags */
224 
225     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
226                         AML_OFFSET (StartDpf.Flags),
227                         0},
228 
229     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
230                         AML_OFFSET (StartDpf.Flags),
231                         2}
232 };
233 
234 
235 /*******************************************************************************
236  *
237  * AcpiRsSetStartDpf
238  *
239  ******************************************************************************/
240 
241 ACPI_RSCONVERT_INFO   AcpiRsSetStartDpf[10] =
242 {
243     /* Start with a default descriptor of length 1 */
244 
245     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_START_DEPENDENT,
246                         sizeof (AML_RESOURCE_START_DEPENDENT),
247                         ACPI_RSC_TABLE_SIZE (AcpiRsSetStartDpf)},
248 
249     /* Set the default flag values */
250 
251     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
252                         AML_OFFSET (StartDpf.Flags),
253                         0},
254 
255     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
256                         AML_OFFSET (StartDpf.Flags),
257                         2},
258     /*
259      * All done if the output descriptor length is required to be 1
260      * (i.e., optimization to 0 bytes cannot be attempted)
261      */
262     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
263                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
264                         1},
265 
266     /* Set length to 0 bytes (no flags byte) */
267 
268     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)},
269 
270     /*
271      * All done if the output descriptor length is required to be 0.
272      *
273      * TBD: Perhaps we should check for error if input flags are not
274      * compatible with a 0-byte descriptor.
275      */
276     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
277                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
278                         0},
279 
280     /* Reset length to 1 byte (descriptor with flags byte) */
281 
282     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT)},
283 
284 
285     /*
286      * All done if flags byte is necessary -- if either priority value
287      * is not ACPI_ACCEPTABLE_CONFIGURATION
288      */
289     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
290                         ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
291                         ACPI_ACCEPTABLE_CONFIGURATION},
292 
293     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
294                         ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
295                         ACPI_ACCEPTABLE_CONFIGURATION},
296 
297     /* Flag byte is not necessary */
298 
299     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)}
300 };
301