1 /*******************************************************************************
2  *
3  * Module Name: rsmem24 - Memory resource descriptors
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2020, 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.h"
45 #include "accommon.h"
46 #include "acresrc.h"
47 
48 #define _COMPONENT          ACPI_RESOURCES
49         ACPI_MODULE_NAME    ("rsmemory")
50 
51 
52 /*******************************************************************************
53  *
54  * AcpiRsConvertMemory24
55  *
56  ******************************************************************************/
57 
58 ACPI_RSCONVERT_INFO     AcpiRsConvertMemory24[4] =
59 {
60     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_MEMORY24,
61                         ACPI_RS_SIZE (ACPI_RESOURCE_MEMORY24),
62                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemory24)},
63 
64     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_MEMORY24,
65                         sizeof (AML_RESOURCE_MEMORY24),
66                         0},
67 
68     /* Read/Write bit */
69 
70     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Memory24.WriteProtect),
71                         AML_OFFSET (Memory24.Flags),
72                         0},
73     /*
74      * These fields are contiguous in both the source and destination:
75      * Minimum Base Address
76      * Maximum Base Address
77      * Address Base Alignment
78      * Range Length
79      */
80     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.Memory24.Minimum),
81                         AML_OFFSET (Memory24.Minimum),
82                         4}
83 };
84 
85 
86 /*******************************************************************************
87  *
88  * AcpiRsConvertMemory32
89  *
90  ******************************************************************************/
91 
92 ACPI_RSCONVERT_INFO     AcpiRsConvertMemory32[4] =
93 {
94     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_MEMORY32,
95                         ACPI_RS_SIZE (ACPI_RESOURCE_MEMORY32),
96                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemory32)},
97 
98     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_MEMORY32,
99                         sizeof (AML_RESOURCE_MEMORY32),
100                         0},
101 
102     /* Read/Write bit */
103 
104     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Memory32.WriteProtect),
105                         AML_OFFSET (Memory32.Flags),
106                         0},
107     /*
108      * These fields are contiguous in both the source and destination:
109      * Minimum Base Address
110      * Maximum Base Address
111      * Address Base Alignment
112      * Range Length
113      */
114     {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.Memory32.Minimum),
115                         AML_OFFSET (Memory32.Minimum),
116                         4}
117 };
118 
119 
120 /*******************************************************************************
121  *
122  * AcpiRsConvertFixedMemory32
123  *
124  ******************************************************************************/
125 
126 ACPI_RSCONVERT_INFO     AcpiRsConvertFixedMemory32[4] =
127 {
128     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_FIXED_MEMORY32,
129                         ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_MEMORY32),
130                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedMemory32)},
131 
132     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_FIXED_MEMORY32,
133                         sizeof (AML_RESOURCE_FIXED_MEMORY32),
134                         0},
135 
136     /* Read/Write bit */
137 
138     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.FixedMemory32.WriteProtect),
139                         AML_OFFSET (FixedMemory32.Flags),
140                         0},
141     /*
142      * These fields are contiguous in both the source and destination:
143      * Base Address
144      * Range Length
145      */
146     {ACPI_RSC_MOVE32,   ACPI_RS_OFFSET (Data.FixedMemory32.Address),
147                         AML_OFFSET (FixedMemory32.Address),
148                         2}
149 };
150 
151 
152 /*******************************************************************************
153  *
154  * AcpiRsGetVendorSmall
155  *
156  ******************************************************************************/
157 
158 ACPI_RSCONVERT_INFO     AcpiRsGetVendorSmall[3] =
159 {
160     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_VENDOR,
161                         ACPI_RS_SIZE (ACPI_RESOURCE_VENDOR),
162                         ACPI_RSC_TABLE_SIZE (AcpiRsGetVendorSmall)},
163 
164     /* Length of the vendor data (byte count) */
165 
166     {ACPI_RSC_COUNT16,  ACPI_RS_OFFSET (Data.Vendor.ByteLength),
167                         0,
168                         sizeof (UINT8)},
169 
170     /* Vendor data */
171 
172     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
173                         sizeof (AML_RESOURCE_SMALL_HEADER),
174                         0}
175 };
176 
177 
178 /*******************************************************************************
179  *
180  * AcpiRsGetVendorLarge
181  *
182  ******************************************************************************/
183 
184 ACPI_RSCONVERT_INFO     AcpiRsGetVendorLarge[3] =
185 {
186     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_VENDOR,
187                         ACPI_RS_SIZE (ACPI_RESOURCE_VENDOR),
188                         ACPI_RSC_TABLE_SIZE (AcpiRsGetVendorLarge)},
189 
190     /* Length of the vendor data (byte count) */
191 
192     {ACPI_RSC_COUNT16,  ACPI_RS_OFFSET (Data.Vendor.ByteLength),
193                         0,
194                         sizeof (UINT8)},
195 
196     /* Vendor data */
197 
198     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
199                         sizeof (AML_RESOURCE_LARGE_HEADER),
200                         0}
201 };
202 
203 
204 /*******************************************************************************
205  *
206  * AcpiRsSetVendor
207  *
208  ******************************************************************************/
209 
210 ACPI_RSCONVERT_INFO     AcpiRsSetVendor[7] =
211 {
212     /* Default is a small vendor descriptor */
213 
214     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_VENDOR_SMALL,
215                         sizeof (AML_RESOURCE_SMALL_HEADER),
216                         ACPI_RSC_TABLE_SIZE (AcpiRsSetVendor)},
217 
218     /* Get the length and copy the data */
219 
220     {ACPI_RSC_COUNT16,  ACPI_RS_OFFSET (Data.Vendor.ByteLength),
221                         0,
222                         0},
223 
224     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
225                         sizeof (AML_RESOURCE_SMALL_HEADER),
226                         0},
227 
228     /*
229      * All done if the Vendor byte length is 7 or less, meaning that it will
230      * fit within a small descriptor
231      */
232     {ACPI_RSC_EXIT_LE,  0, 0, 7},
233 
234     /* Must create a large vendor descriptor */
235 
236     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_VENDOR_LARGE,
237                         sizeof (AML_RESOURCE_LARGE_HEADER),
238                         0},
239 
240     {ACPI_RSC_COUNT16,  ACPI_RS_OFFSET (Data.Vendor.ByteLength),
241                         0,
242                         0},
243 
244     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
245                         sizeof (AML_RESOURCE_LARGE_HEADER),
246                         0}
247 };
248