1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*******************************************************************************
3  *
4  * Module Name: rsmem24 - Memory 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("rsmemory")
14 
15 /*******************************************************************************
16  *
17  * acpi_rs_convert_memory24
18  *
19  ******************************************************************************/
20 struct acpi_rsconvert_info acpi_rs_convert_memory24[4] = {
21 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY24,
22 	 ACPI_RS_SIZE(struct acpi_resource_memory24),
23 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory24)},
24 
25 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY24,
26 	 sizeof(struct aml_resource_memory24),
27 	 0},
28 
29 	/* Read/Write bit */
30 
31 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory24.write_protect),
32 	 AML_OFFSET(memory24.flags),
33 	 0},
34 	/*
35 	 * These fields are contiguous in both the source and destination:
36 	 * Minimum Base Address
37 	 * Maximum Base Address
38 	 * Address Base Alignment
39 	 * Range Length
40 	 */
41 	{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.memory24.minimum),
42 	 AML_OFFSET(memory24.minimum),
43 	 4}
44 };
45 
46 /*******************************************************************************
47  *
48  * acpi_rs_convert_memory32
49  *
50  ******************************************************************************/
51 
52 struct acpi_rsconvert_info acpi_rs_convert_memory32[4] = {
53 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY32,
54 	 ACPI_RS_SIZE(struct acpi_resource_memory32),
55 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_memory32)},
56 
57 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY32,
58 	 sizeof(struct aml_resource_memory32),
59 	 0},
60 
61 	/* Read/Write bit */
62 
63 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.memory32.write_protect),
64 	 AML_OFFSET(memory32.flags),
65 	 0},
66 	/*
67 	 * These fields are contiguous in both the source and destination:
68 	 * Minimum Base Address
69 	 * Maximum Base Address
70 	 * Address Base Alignment
71 	 * Range Length
72 	 */
73 	{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.memory32.minimum),
74 	 AML_OFFSET(memory32.minimum),
75 	 4}
76 };
77 
78 /*******************************************************************************
79  *
80  * acpi_rs_convert_fixed_memory32
81  *
82  ******************************************************************************/
83 
84 struct acpi_rsconvert_info acpi_rs_convert_fixed_memory32[4] = {
85 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_MEMORY32,
86 	 ACPI_RS_SIZE(struct acpi_resource_fixed_memory32),
87 	 ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_memory32)},
88 
89 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_MEMORY32,
90 	 sizeof(struct aml_resource_fixed_memory32),
91 	 0},
92 
93 	/* Read/Write bit */
94 
95 	{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.fixed_memory32.write_protect),
96 	 AML_OFFSET(fixed_memory32.flags),
97 	 0},
98 	/*
99 	 * These fields are contiguous in both the source and destination:
100 	 * Base Address
101 	 * Range Length
102 	 */
103 	{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.fixed_memory32.address),
104 	 AML_OFFSET(fixed_memory32.address),
105 	 2}
106 };
107 
108 /*******************************************************************************
109  *
110  * acpi_rs_get_vendor_small
111  *
112  ******************************************************************************/
113 
114 struct acpi_rsconvert_info acpi_rs_get_vendor_small[3] = {
115 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
116 	 ACPI_RS_SIZE(struct acpi_resource_vendor),
117 	 ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_small)},
118 
119 	/* Length of the vendor data (byte count) */
120 
121 	{ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
122 	 0,
123 	 sizeof(u8)},
124 
125 	/* Vendor data */
126 
127 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
128 	 sizeof(struct aml_resource_small_header),
129 	 0}
130 };
131 
132 /*******************************************************************************
133  *
134  * acpi_rs_get_vendor_large
135  *
136  ******************************************************************************/
137 
138 struct acpi_rsconvert_info acpi_rs_get_vendor_large[3] = {
139 	{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
140 	 ACPI_RS_SIZE(struct acpi_resource_vendor),
141 	 ACPI_RSC_TABLE_SIZE(acpi_rs_get_vendor_large)},
142 
143 	/* Length of the vendor data (byte count) */
144 
145 	{ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
146 	 0,
147 	 sizeof(u8)},
148 
149 	/* Vendor data */
150 
151 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
152 	 sizeof(struct aml_resource_large_header),
153 	 0}
154 };
155 
156 /*******************************************************************************
157  *
158  * acpi_rs_set_vendor
159  *
160  ******************************************************************************/
161 
162 struct acpi_rsconvert_info acpi_rs_set_vendor[7] = {
163 	/* Default is a small vendor descriptor */
164 
165 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_SMALL,
166 	 sizeof(struct aml_resource_small_header),
167 	 ACPI_RSC_TABLE_SIZE(acpi_rs_set_vendor)},
168 
169 	/* Get the length and copy the data */
170 
171 	{ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
172 	 0,
173 	 0},
174 
175 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
176 	 sizeof(struct aml_resource_small_header),
177 	 0},
178 
179 	/*
180 	 * All done if the Vendor byte length is 7 or less, meaning that it will
181 	 * fit within a small descriptor
182 	 */
183 	{ACPI_RSC_EXIT_LE, 0, 0, 7},
184 
185 	/* Must create a large vendor descriptor */
186 
187 	{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_LARGE,
188 	 sizeof(struct aml_resource_large_header),
189 	 0},
190 
191 	{ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
192 	 0,
193 	 0},
194 
195 	{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.vendor.byte_data[0]),
196 	 sizeof(struct aml_resource_large_header),
197 	 0}
198 };
199