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