Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
[linux-2.6] / drivers / acpi / resources / rsio.c
1 /*******************************************************************************
2  *
3  * Module Name: rsio - IO and DMA resource descriptors
4  *
5  ******************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2007, R. Byron Moore
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 <acpi/acpi.h>
45 #include <acpi/acresrc.h>
46
47 #define _COMPONENT          ACPI_RESOURCES
48 ACPI_MODULE_NAME("rsio")
49
50 /*******************************************************************************
51  *
52  * acpi_rs_convert_io
53  *
54  ******************************************************************************/
55 struct acpi_rsconvert_info acpi_rs_convert_io[5] = {
56         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
57          ACPI_RS_SIZE(struct acpi_resource_io),
58          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
59
60         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
61          sizeof(struct aml_resource_io),
62          0},
63
64         /* Decode flag */
65
66         {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
67          AML_OFFSET(io.flags),
68          0},
69         /*
70          * These fields are contiguous in both the source and destination:
71          * Address Alignment
72          * Length
73          * Minimum Base Address
74          * Maximum Base Address
75          */
76         {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
77          AML_OFFSET(io.alignment),
78          2},
79
80         {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
81          AML_OFFSET(io.minimum),
82          2}
83 };
84
85 /*******************************************************************************
86  *
87  * acpi_rs_convert_fixed_io
88  *
89  ******************************************************************************/
90
91 struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
92         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
93          ACPI_RS_SIZE(struct acpi_resource_fixed_io),
94          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
95
96         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
97          sizeof(struct aml_resource_fixed_io),
98          0},
99         /*
100          * These fields are contiguous in both the source and destination:
101          * Base Address
102          * Length
103          */
104         {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
105          AML_OFFSET(fixed_io.address_length),
106          1},
107
108         {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
109          AML_OFFSET(fixed_io.address),
110          1}
111 };
112
113 /*******************************************************************************
114  *
115  * acpi_rs_convert_generic_reg
116  *
117  ******************************************************************************/
118
119 struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
120         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
121          ACPI_RS_SIZE(struct acpi_resource_generic_register),
122          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
123
124         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
125          sizeof(struct aml_resource_generic_register),
126          0},
127         /*
128          * These fields are contiguous in both the source and destination:
129          * Address Space ID
130          * Register Bit Width
131          * Register Bit Offset
132          * Access Size
133          */
134         {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
135          AML_OFFSET(generic_reg.address_space_id),
136          4},
137
138         /* Get the Register Address */
139
140         {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
141          AML_OFFSET(generic_reg.address),
142          1}
143 };
144
145 /*******************************************************************************
146  *
147  * acpi_rs_convert_end_dpf
148  *
149  ******************************************************************************/
150
151 struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
152         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
153          ACPI_RS_SIZE_MIN,
154          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
155
156         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
157          sizeof(struct aml_resource_end_dependent),
158          0}
159 };
160
161 /*******************************************************************************
162  *
163  * acpi_rs_convert_end_tag
164  *
165  ******************************************************************************/
166
167 struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
168         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
169          ACPI_RS_SIZE_MIN,
170          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
171
172         /*
173          * Note: The checksum field is set to zero, meaning that the resource
174          * data is treated as if the checksum operation succeeded.
175          * (ACPI Spec 1.0b Section 6.4.2.8)
176          */
177         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
178          sizeof(struct aml_resource_end_tag),
179          0}
180 };
181
182 /*******************************************************************************
183  *
184  * acpi_rs_get_start_dpf
185  *
186  ******************************************************************************/
187
188 struct acpi_rsconvert_info acpi_rs_get_start_dpf[5] = {
189         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
190          ACPI_RS_SIZE(struct acpi_resource_start_dependent),
191          ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
192
193         /* Defaults for Compatibility and Performance priorities */
194
195         {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
196          ACPI_ACCEPTABLE_CONFIGURATION,
197          2},
198
199         /* All done if there is no flag byte present in the descriptor */
200
201         {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
202
203         /* Flag byte is present, get the flags */
204
205         {ACPI_RSC_2BITFLAG,
206          ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
207          AML_OFFSET(start_dpf.flags),
208          0},
209
210         {ACPI_RSC_2BITFLAG,
211          ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
212          AML_OFFSET(start_dpf.flags),
213          2}
214 };
215
216 /*******************************************************************************
217  *
218  * acpi_rs_set_start_dpf
219  *
220  ******************************************************************************/
221
222 struct acpi_rsconvert_info acpi_rs_set_start_dpf[6] = {
223         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
224          sizeof(struct aml_resource_start_dependent),
225          ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
226
227         /* Set the default flag values */
228
229         {ACPI_RSC_2BITFLAG,
230          ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
231          AML_OFFSET(start_dpf.flags),
232          0},
233
234         {ACPI_RSC_2BITFLAG,
235          ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
236          AML_OFFSET(start_dpf.flags),
237          2},
238         /*
239          * All done if flags byte is necessary -- if either priority value
240          * is not ACPI_ACCEPTABLE_CONFIGURATION
241          */
242         {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
243          ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
244          ACPI_ACCEPTABLE_CONFIGURATION},
245
246         {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
247          ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
248          ACPI_ACCEPTABLE_CONFIGURATION},
249
250         /* Flag byte is not necessary */
251
252         {ACPI_RSC_LENGTH, 0, 0,
253          sizeof(struct aml_resource_start_dependent_noprio)}
254 };