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 | |