• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*******************************************************************************
2   *
3   * Module Name: rsio - IO and DMA resource descriptors
4   *
5   ******************************************************************************/
6  
7  /*
8   * Copyright (C) 2000 - 2015, 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   ******************************************************************************/
56  struct acpi_rsconvert_info acpi_rs_convert_io[5] = {
57  	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
58  	 ACPI_RS_SIZE(struct acpi_resource_io),
59  	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
60  
61  	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
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  
92  struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
93  	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
94  	 ACPI_RS_SIZE(struct acpi_resource_fixed_io),
95  	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
96  
97  	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
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  
120  struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
121  	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
122  	 ACPI_RS_SIZE(struct acpi_resource_generic_register),
123  	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
124  
125  	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
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  
152  struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
153  	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
154  	 ACPI_RS_SIZE_MIN,
155  	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
156  
157  	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
158  	 sizeof(struct aml_resource_end_dependent),
159  	 0}
160  };
161  
162  /*******************************************************************************
163   *
164   * acpi_rs_convert_end_tag
165   *
166   ******************************************************************************/
167  
168  struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
169  	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
170  	 ACPI_RS_SIZE_MIN,
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  	 */
178  	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
179  	 sizeof(struct aml_resource_end_tag),
180  	 0}
181  };
182  
183  /*******************************************************************************
184   *
185   * acpi_rs_get_start_dpf
186   *
187   ******************************************************************************/
188  
189  struct acpi_rsconvert_info acpi_rs_get_start_dpf[6] = {
190  	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
191  	 ACPI_RS_SIZE(struct acpi_resource_start_dependent),
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),
197  	 ACPI_ACCEPTABLE_CONFIGURATION,
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  
208  	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
209  
210  	/* Flag byte is present, get the flags */
211  
212  	{ACPI_RSC_2BITFLAG,
213  	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
214  	 AML_OFFSET(start_dpf.flags),
215  	 0},
216  
217  	{ACPI_RSC_2BITFLAG,
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  
229  struct acpi_rsconvert_info acpi_rs_set_start_dpf[10] = {
230  	/* Start with a default descriptor of length 1 */
231  
232  	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
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  
238  	{ACPI_RSC_2BITFLAG,
239  	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
240  	 AML_OFFSET(start_dpf.flags),
241  	 0},
242  
243  	{ACPI_RSC_2BITFLAG,
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  	 */
251  	{ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
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  	 */
266  	{ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
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  	 */
278  	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
279  	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
280  	 ACPI_ACCEPTABLE_CONFIGURATION},
281  
282  	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
283  	 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
284  	 ACPI_ACCEPTABLE_CONFIGURATION},
285  
286  	/* Flag byte is not necessary */
287  
288  	{ACPI_RSC_LENGTH, 0, 0,
289  	 sizeof(struct aml_resource_start_dependent_noprio)}
290  };
291