xref: /linux/drivers/acpi/acpica/rsio.c (revision 8e3ed5440b0c305dcd1d5fa7419bd8066d22ef42)
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*******************************************************************************
3  *
4  * Module Name: rsio - IO and DMA resource descriptors
5  *
6  ******************************************************************************/
7 
8 #include <acpi/acpi.h>
9 #include "accommon.h"
10 #include "acresrc.h"
11 
12 #define _COMPONENT          ACPI_RESOURCES
13 ACPI_MODULE_NAME("rsio")
14 
15 /*******************************************************************************
16  *
17  * acpi_rs_convert_io
18  *
19  ******************************************************************************/
20 struct acpi_rsconvert_info acpi_rs_convert_io[5] = {
21 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
22 	 ACPI_RS_SIZE(struct acpi_resource_io),
23 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
24 
25 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
26 	 sizeof(struct aml_resource_io),
27 	 0},
28 
29 	/* Decode flag */
30 
31 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
32 	 AML_OFFSET(io.flags),
33 	 0},
34 	/*
35 	 * These fields are contiguous in both the source and destination:
36 	 * Address Alignment
37 	 * Length
38 	 * Minimum Base Address
39 	 * Maximum Base Address
40 	 */
41 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
42 	 AML_OFFSET(io.alignment),
43 	 2},
44 
45 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
46 	 AML_OFFSET(io.minimum),
47 	 2}
48 };
49 
50 /*******************************************************************************
51  *
52  * acpi_rs_convert_fixed_io
53  *
54  ******************************************************************************/
55 
56 struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
57 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
58 	 ACPI_RS_SIZE(struct acpi_resource_fixed_io),
59 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
60 
61 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
62 	 sizeof(struct aml_resource_fixed_io),
63 	 0},
64 	/*
65 	 * These fields are contiguous in both the source and destination:
66 	 * Base Address
67 	 * Length
68 	 */
69 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
70 	 AML_OFFSET(fixed_io.address_length),
71 	 1},
72 
73 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
74 	 AML_OFFSET(fixed_io.address),
75 	 1}
76 };
77 
78 /*******************************************************************************
79  *
80  * acpi_rs_convert_generic_reg
81  *
82  ******************************************************************************/
83 
84 struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
85 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
86 	 ACPI_RS_SIZE(struct acpi_resource_generic_register),
87 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
88 
89 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
90 	 sizeof(struct aml_resource_generic_register),
91 	 0},
92 	/*
93 	 * These fields are contiguous in both the source and destination:
94 	 * Address Space ID
95 	 * Register Bit Width
96 	 * Register Bit Offset
97 	 * Access Size
98 	 */
99 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
100 	 AML_OFFSET(generic_reg.address_space_id),
101 	 4},
102 
103 	/* Get the Register Address */
104 
105 	{ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
106 	 AML_OFFSET(generic_reg.address),
107 	 1}
108 };
109 
110 /*******************************************************************************
111  *
112  * acpi_rs_convert_end_dpf
113  *
114  ******************************************************************************/
115 
116 struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
117 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
118 	 ACPI_RS_SIZE_MIN,
119 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
120 
121 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
122 	 sizeof(struct aml_resource_end_dependent),
123 	 0}
124 };
125 
126 /*******************************************************************************
127  *
128  * acpi_rs_convert_end_tag
129  *
130  ******************************************************************************/
131 
132 struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
133 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
134 	 ACPI_RS_SIZE_MIN,
135 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
136 
137 	/*
138 	 * Note: The checksum field is set to zero, meaning that the resource
139 	 * data is treated as if the checksum operation succeeded.
140 	 * (ACPI Spec 1.0b Section 6.4.2.8)
141 	 */
142 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
143 	 sizeof(struct aml_resource_end_tag),
144 	 0}
145 };
146 
147 /*******************************************************************************
148  *
149  * acpi_rs_get_start_dpf
150  *
151  ******************************************************************************/
152 
153 struct acpi_rsconvert_info acpi_rs_get_start_dpf[6] = {
154 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
155 	 ACPI_RS_SIZE(struct acpi_resource_start_dependent),
156 	 ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
157 
158 	/* Defaults for Compatibility and Performance priorities */
159 
160 	{ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
161 	 ACPI_ACCEPTABLE_CONFIGURATION,
162 	 2},
163 
164 	/* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
165 
166 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
167 	 AML_OFFSET(start_dpf.descriptor_type),
168 	 0},
169 
170 	/* All done if there is no flag byte present in the descriptor */
171 
172 	{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
173 
174 	/* Flag byte is present, get the flags */
175 
176 	{ACPI_RSC_2BITFLAG,
177 	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
178 	 AML_OFFSET(start_dpf.flags),
179 	 0},
180 
181 	{ACPI_RSC_2BITFLAG,
182 	 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
183 	 AML_OFFSET(start_dpf.flags),
184 	 2}
185 };
186 
187 /*******************************************************************************
188  *
189  * acpi_rs_set_start_dpf
190  *
191  ******************************************************************************/
192 
193 struct acpi_rsconvert_info acpi_rs_set_start_dpf[10] = {
194 	/* Start with a default descriptor of length 1 */
195 
196 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
197 	 sizeof(struct aml_resource_start_dependent),
198 	 ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
199 
200 	/* Set the default flag values */
201 
202 	{ACPI_RSC_2BITFLAG,
203 	 ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
204 	 AML_OFFSET(start_dpf.flags),
205 	 0},
206 
207 	{ACPI_RSC_2BITFLAG,
208 	 ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
209 	 AML_OFFSET(start_dpf.flags),
210 	 2},
211 	/*
212 	 * All done if the output descriptor length is required to be 1
213 	 * (i.e., optimization to 0 bytes cannot be attempted)
214 	 */
215 	{ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
216 	 ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
217 	 1},
218 
219 	/* Set length to 0 bytes (no flags byte) */
220 
221 	{ACPI_RSC_LENGTH, 0, 0,
222 	 sizeof(struct aml_resource_start_dependent_noprio)},
223 
224 	/*
225 	 * All done if the output descriptor length is required to be 0.
226 	 *
227 	 * TBD: Perhaps we should check for error if input flags are not
228 	 * compatible with a 0-byte descriptor.
229 	 */
230 	{ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
231 	 ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
232 	 0},
233 
234 	/* Reset length to 1 byte (descriptor with flags byte) */
235 
236 	{ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_start_dependent)},
237 
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 };
255