Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rsio.c
Go to the documentation of this file.
1 /*******************************************************************************
2  *
3  * Module Name: rsio - IO and DMA resource descriptors
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2012, 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 <acpi/acpi.h>
45 #include "accommon.h"
46 #include "acresrc.h"
47 
48 #define _COMPONENT ACPI_RESOURCES
49 ACPI_MODULE_NAME("rsio")
50 
51 /*******************************************************************************
52  *
53  * acpi_rs_convert_io
54  *
55  ******************************************************************************/
59  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
60 
62  sizeof(struct aml_resource_io),
63  0},
64 
65  /* Decode flag */
66 
67  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
68  AML_OFFSET(io.flags),
69  0},
70  /*
71  * These fields are contiguous in both the source and destination:
72  * Address Alignment
73  * Length
74  * Minimum Base Address
75  * Maximum Base Address
76  */
77  {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
78  AML_OFFSET(io.alignment),
79  2},
80 
81  {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
82  AML_OFFSET(io.minimum),
83  2}
84 };
85 
86 /*******************************************************************************
87  *
88  * acpi_rs_convert_fixed_io
89  *
90  ******************************************************************************/
91 
95  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
96 
98  sizeof(struct aml_resource_fixed_io),
99  0},
100  /*
101  * These fields are contiguous in both the source and destination:
102  * Base Address
103  * Length
104  */
105  {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
106  AML_OFFSET(fixed_io.address_length),
107  1},
108 
109  {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
110  AML_OFFSET(fixed_io.address),
111  1}
112 };
113 
114 /*******************************************************************************
115  *
116  * acpi_rs_convert_generic_reg
117  *
118  ******************************************************************************/
119 
123  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
124 
126  sizeof(struct aml_resource_generic_register),
127  0},
128  /*
129  * These fields are contiguous in both the source and destination:
130  * Address Space ID
131  * Register Bit Width
132  * Register Bit Offset
133  * Access Size
134  */
135  {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
136  AML_OFFSET(generic_reg.address_space_id),
137  4},
138 
139  /* Get the Register Address */
140 
141  {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
142  AML_OFFSET(generic_reg.address),
143  1}
144 };
145 
146 /*******************************************************************************
147  *
148  * acpi_rs_convert_end_dpf
149  *
150  ******************************************************************************/
151 
155  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
156 
158  sizeof(struct aml_resource_end_dependent),
159  0}
160 };
161 
162 /*******************************************************************************
163  *
164  * acpi_rs_convert_end_tag
165  *
166  ******************************************************************************/
167 
171  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
172 
173  /*
174  * Note: The checksum field is set to zero, meaning that the resource
175  * data is treated as if the checksum operation succeeded.
176  * (ACPI Spec 1.0b Section 6.4.2.8)
177  */
179  sizeof(struct aml_resource_end_tag),
180  0}
181 };
182 
183 /*******************************************************************************
184  *
185  * acpi_rs_get_start_dpf
186  *
187  ******************************************************************************/
188 
192  ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
193 
194  /* Defaults for Compatibility and Performance priorities */
195 
196  {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
198  2},
199 
200  /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
201 
202  {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
203  AML_OFFSET(start_dpf.descriptor_type),
204  0},
205 
206  /* All done if there is no flag byte present in the descriptor */
207 
209 
210  /* Flag byte is present, get the flags */
211 
213  ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
214  AML_OFFSET(start_dpf.flags),
215  0},
216 
218  ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
219  AML_OFFSET(start_dpf.flags),
220  2}
221 };
222 
223 /*******************************************************************************
224  *
225  * acpi_rs_set_start_dpf
226  *
227  ******************************************************************************/
228 
230  /* Start with a default descriptor of length 1 */
231 
233  sizeof(struct aml_resource_start_dependent),
234  ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
235 
236  /* Set the default flag values */
237 
239  ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
240  AML_OFFSET(start_dpf.flags),
241  0},
242 
244  ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
245  AML_OFFSET(start_dpf.flags),
246  2},
247  /*
248  * All done if the output descriptor length is required to be 1
249  * (i.e., optimization to 0 bytes cannot be attempted)
250  */
252  ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
253  1},
254 
255  /* Set length to 0 bytes (no flags byte) */
256 
257  {ACPI_RSC_LENGTH, 0, 0,
258  sizeof(struct aml_resource_start_dependent_noprio)},
259 
260  /*
261  * All done if the output descriptor length is required to be 0.
262  *
263  * TBD: Perhaps we should check for error if input flags are not
264  * compatible with a 0-byte descriptor.
265  */
267  ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
268  0},
269 
270  /* Reset length to 1 byte (descriptor with flags byte) */
271 
272  {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_start_dependent)},
273 
274  /*
275  * All done if flags byte is necessary -- if either priority value
276  * is not ACPI_ACCEPTABLE_CONFIGURATION
277  */
279  ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
281 
283  ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
285 
286  /* Flag byte is not necessary */
287 
288  {ACPI_RSC_LENGTH, 0, 0,
290 };