Rev 1498 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1498 | Rev 2216 | ||
---|---|---|---|
1 | /****************************************************************************** |
1 | /****************************************************************************** |
2 | * |
2 | * |
3 | * Module Name: tbxfroot - Find the root ACPI table (RSDT) |
3 | * Module Name: tbxfroot - Find the root ACPI table (RSDT) |
4 | * |
4 | * |
5 | *****************************************************************************/ |
5 | *****************************************************************************/ |
6 | 6 | ||
7 | /****************************************************************************** |
7 | /****************************************************************************** |
8 | * |
8 | * |
9 | * 1. Copyright Notice |
9 | * 1. Copyright Notice |
10 | * |
10 | * |
11 | * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
11 | * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
12 | * All rights reserved. |
12 | * All rights reserved. |
13 | * |
13 | * |
14 | * 2. License |
14 | * 2. License |
15 | * |
15 | * |
16 | * 2.1. This is your license from Intel Corp. under its intellectual property |
16 | * 2.1. This is your license from Intel Corp. under its intellectual property |
17 | * rights. You may have additional license terms from the party that provided |
17 | * rights. You may have additional license terms from the party that provided |
18 | * you this software, covering your right to use that party's intellectual |
18 | * you this software, covering your right to use that party's intellectual |
19 | * property rights. |
19 | * property rights. |
20 | * |
20 | * |
21 | * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a |
21 | * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a |
22 | * copy of the source code appearing in this file ("Covered Code") an |
22 | * copy of the source code appearing in this file ("Covered Code") an |
23 | * irrevocable, perpetual, worldwide license under Intel's copyrights in the |
23 | * irrevocable, perpetual, worldwide license under Intel's copyrights in the |
24 | * base code distributed originally by Intel ("Original Intel Code") to copy, |
24 | * base code distributed originally by Intel ("Original Intel Code") to copy, |
25 | * make derivatives, distribute, use and display any portion of the Covered |
25 | * make derivatives, distribute, use and display any portion of the Covered |
26 | * Code in any form, with the right to sublicense such rights; and |
26 | * Code in any form, with the right to sublicense such rights; and |
27 | * |
27 | * |
28 | * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent |
28 | * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent |
29 | * license (with the right to sublicense), under only those claims of Intel |
29 | * license (with the right to sublicense), under only those claims of Intel |
30 | * patents that are infringed by the Original Intel Code, to make, use, sell, |
30 | * patents that are infringed by the Original Intel Code, to make, use, sell, |
31 | * offer to sell, and import the Covered Code and derivative works thereof |
31 | * offer to sell, and import the Covered Code and derivative works thereof |
32 | * solely to the minimum extent necessary to exercise the above copyright |
32 | * solely to the minimum extent necessary to exercise the above copyright |
33 | * license, and in no event shall the patent license extend to any additions |
33 | * license, and in no event shall the patent license extend to any additions |
34 | * to or modifications of the Original Intel Code. No other license or right |
34 | * to or modifications of the Original Intel Code. No other license or right |
35 | * is granted directly or by implication, estoppel or otherwise; |
35 | * is granted directly or by implication, estoppel or otherwise; |
36 | * |
36 | * |
37 | * The above copyright and patent license is granted only if the following |
37 | * The above copyright and patent license is granted only if the following |
38 | * conditions are met: |
38 | * conditions are met: |
39 | * |
39 | * |
40 | * 3. Conditions |
40 | * 3. Conditions |
41 | * |
41 | * |
42 | * 3.1. Redistribution of Source with Rights to Further Distribute Source. |
42 | * 3.1. Redistribution of Source with Rights to Further Distribute Source. |
43 | * Redistribution of source code of any substantial portion of the Covered |
43 | * Redistribution of source code of any substantial portion of the Covered |
44 | * Code or modification with rights to further distribute source must include |
44 | * Code or modification with rights to further distribute source must include |
45 | * the above Copyright Notice, the above License, this list of Conditions, |
45 | * the above Copyright Notice, the above License, this list of Conditions, |
46 | * and the following Disclaimer and Export Compliance provision. In addition, |
46 | * and the following Disclaimer and Export Compliance provision. In addition, |
47 | * Licensee must cause all Covered Code to which Licensee contributes to |
47 | * Licensee must cause all Covered Code to which Licensee contributes to |
48 | * contain a file documenting the changes Licensee made to create that Covered |
48 | * contain a file documenting the changes Licensee made to create that Covered |
49 | * Code and the date of any change. Licensee must include in that file the |
49 | * Code and the date of any change. Licensee must include in that file the |
50 | * documentation of any changes made by any predecessor Licensee. Licensee |
50 | * documentation of any changes made by any predecessor Licensee. Licensee |
51 | * must include a prominent statement that the modification is derived, |
51 | * must include a prominent statement that the modification is derived, |
52 | * directly or indirectly, from Original Intel Code. |
52 | * directly or indirectly, from Original Intel Code. |
53 | * |
53 | * |
54 | * 3.2. Redistribution of Source with no Rights to Further Distribute Source. |
54 | * 3.2. Redistribution of Source with no Rights to Further Distribute Source. |
55 | * Redistribution of source code of any substantial portion of the Covered |
55 | * Redistribution of source code of any substantial portion of the Covered |
56 | * Code or modification without rights to further distribute source must |
56 | * Code or modification without rights to further distribute source must |
57 | * include the following Disclaimer and Export Compliance provision in the |
57 | * include the following Disclaimer and Export Compliance provision in the |
58 | * documentation and/or other materials provided with distribution. In |
58 | * documentation and/or other materials provided with distribution. In |
59 | * addition, Licensee may not authorize further sublicense of source of any |
59 | * addition, Licensee may not authorize further sublicense of source of any |
60 | * portion of the Covered Code, and must include terms to the effect that the |
60 | * portion of the Covered Code, and must include terms to the effect that the |
61 | * license from Licensee to its licensee is limited to the intellectual |
61 | * license from Licensee to its licensee is limited to the intellectual |
62 | * property embodied in the software Licensee provides to its licensee, and |
62 | * property embodied in the software Licensee provides to its licensee, and |
63 | * not to intellectual property embodied in modifications its licensee may |
63 | * not to intellectual property embodied in modifications its licensee may |
64 | * make. |
64 | * make. |
65 | * |
65 | * |
66 | * 3.3. Redistribution of Executable. Redistribution in executable form of any |
66 | * 3.3. Redistribution of Executable. Redistribution in executable form of any |
67 | * substantial portion of the Covered Code or modification must reproduce the |
67 | * substantial portion of the Covered Code or modification must reproduce the |
68 | * above Copyright Notice, and the following Disclaimer and Export Compliance |
68 | * above Copyright Notice, and the following Disclaimer and Export Compliance |
69 | * provision in the documentation and/or other materials provided with the |
69 | * provision in the documentation and/or other materials provided with the |
70 | * distribution. |
70 | * distribution. |
71 | * |
71 | * |
72 | * 3.4. Intel retains all right, title, and interest in and to the Original |
72 | * 3.4. Intel retains all right, title, and interest in and to the Original |
73 | * Intel Code. |
73 | * Intel Code. |
74 | * |
74 | * |
75 | * 3.5. Neither the name Intel nor any other trademark owned or controlled by |
75 | * 3.5. Neither the name Intel nor any other trademark owned or controlled by |
76 | * Intel shall be used in advertising or otherwise to promote the sale, use or |
76 | * Intel shall be used in advertising or otherwise to promote the sale, use or |
77 | * other dealings in products derived from or relating to the Covered Code |
77 | * other dealings in products derived from or relating to the Covered Code |
78 | * without prior written authorization from Intel. |
78 | * without prior written authorization from Intel. |
79 | * |
79 | * |
80 | * 4. Disclaimer and Export Compliance |
80 | * 4. Disclaimer and Export Compliance |
81 | * |
81 | * |
82 | * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED |
82 | * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED |
83 | * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE |
83 | * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE |
84 | * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, |
84 | * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, |
85 | * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY |
85 | * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY |
86 | * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY |
86 | * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY |
87 | * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A |
87 | * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A |
88 | * PARTICULAR PURPOSE. |
88 | * PARTICULAR PURPOSE. |
89 | * |
89 | * |
90 | * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES |
90 | * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES |
91 | * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR |
91 | * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR |
92 | * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, |
92 | * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, |
93 | * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY |
93 | * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY |
94 | * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL |
94 | * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL |
95 | * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS |
95 | * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS |
96 | * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY |
96 | * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY |
97 | * LIMITED REMEDY. |
97 | * LIMITED REMEDY. |
98 | * |
98 | * |
99 | * 4.3. Licensee shall not export, either directly or indirectly, any of this |
99 | * 4.3. Licensee shall not export, either directly or indirectly, any of this |
100 | * software or system incorporating such software without first obtaining any |
100 | * software or system incorporating such software without first obtaining any |
101 | * required license or other approval from the U. S. Department of Commerce or |
101 | * required license or other approval from the U. S. Department of Commerce or |
102 | * any other agency or department of the United States Government. In the |
102 | * any other agency or department of the United States Government. In the |
103 | * event Licensee exports any such software from the United States or |
103 | * event Licensee exports any such software from the United States or |
104 | * re-exports any such software from a foreign destination, Licensee shall |
104 | * re-exports any such software from a foreign destination, Licensee shall |
105 | * ensure that the distribution and export/re-export of the software is in |
105 | * ensure that the distribution and export/re-export of the software is in |
106 | * compliance with all laws, regulations, orders, or other restrictions of the |
106 | * compliance with all laws, regulations, orders, or other restrictions of the |
107 | * U.S. Export Administration Regulations. Licensee agrees that neither it nor |
107 | * U.S. Export Administration Regulations. Licensee agrees that neither it nor |
108 | * any of its subsidiaries will export/re-export any technical data, process, |
108 | * any of its subsidiaries will export/re-export any technical data, process, |
109 | * software, or service, directly or indirectly, to any country for which the |
109 | * software, or service, directly or indirectly, to any country for which the |
110 | * United States government or any agency thereof requires an export license, |
110 | * United States government or any agency thereof requires an export license, |
111 | * other governmental approval, or letter of assurance, without first obtaining |
111 | * other governmental approval, or letter of assurance, without first obtaining |
112 | * such license, approval or letter. |
112 | * such license, approval or letter. |
113 | * |
113 | * |
114 | *****************************************************************************/ |
114 | *****************************************************************************/ |
115 | 115 | ||
116 | #define __TBXFROOT_C__ |
116 | #define __TBXFROOT_C__ |
117 | 117 | ||
118 | #include "acpi.h" |
118 | #include "acpi.h" |
119 | #include "accommon.h" |
119 | #include "accommon.h" |
120 | #include "actables.h" |
120 | #include "actables.h" |
121 | 121 | ||
122 | 122 | ||
123 | #define _COMPONENT ACPI_TABLES |
123 | #define _COMPONENT ACPI_TABLES |
124 | ACPI_MODULE_NAME ("tbxfroot") |
124 | ACPI_MODULE_NAME ("tbxfroot") |
125 | 125 | ||
126 | /* Local prototypes */ |
126 | /* Local prototypes */ |
127 | 127 | ||
128 | static UINT8 * |
128 | static UINT8 * |
129 | AcpiTbScanMemoryForRsdp ( |
129 | AcpiTbScanMemoryForRsdp ( |
130 | UINT8 *StartAddress, |
130 | UINT8 *StartAddress, |
131 | UINT32 Length); |
131 | UINT32 Length); |
132 | 132 | ||
133 | static ACPI_STATUS |
133 | static ACPI_STATUS |
134 | AcpiTbValidateRsdp ( |
134 | AcpiTbValidateRsdp ( |
135 | ACPI_TABLE_RSDP *Rsdp); |
135 | ACPI_TABLE_RSDP *Rsdp); |
136 | 136 | ||
137 | 137 | ||
138 | /******************************************************************************* |
138 | /******************************************************************************* |
139 | * |
139 | * |
140 | * FUNCTION: AcpiTbValidateRsdp |
140 | * FUNCTION: AcpiTbValidateRsdp |
141 | * |
141 | * |
142 | * PARAMETERS: Rsdp - Pointer to unvalidated RSDP |
142 | * PARAMETERS: Rsdp - Pointer to unvalidated RSDP |
143 | * |
143 | * |
144 | * RETURN: Status |
144 | * RETURN: Status |
145 | * |
145 | * |
146 | * DESCRIPTION: Validate the RSDP (ptr) |
146 | * DESCRIPTION: Validate the RSDP (ptr) |
147 | * |
147 | * |
148 | ******************************************************************************/ |
148 | ******************************************************************************/ |
149 | 149 | ||
150 | static ACPI_STATUS |
150 | static ACPI_STATUS |
151 | AcpiTbValidateRsdp ( |
151 | AcpiTbValidateRsdp ( |
152 | ACPI_TABLE_RSDP *Rsdp) |
152 | ACPI_TABLE_RSDP *Rsdp) |
153 | { |
153 | { |
154 | ACPI_FUNCTION_ENTRY (); |
154 | ACPI_FUNCTION_ENTRY (); |
155 | 155 | ||
156 | 156 | ||
157 | /* |
157 | /* |
158 | * The signature and checksum must both be correct |
158 | * The signature and checksum must both be correct |
159 | * |
159 | * |
160 | * Note: Sometimes there exists more than one RSDP in memory; the valid |
160 | * Note: Sometimes there exists more than one RSDP in memory; the valid |
161 | * RSDP has a valid checksum, all others have an invalid checksum. |
161 | * RSDP has a valid checksum, all others have an invalid checksum. |
162 | */ |
162 | */ |
163 | if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP, |
163 | if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP, |
164 | sizeof (ACPI_SIG_RSDP)-1) != 0) |
164 | sizeof (ACPI_SIG_RSDP)-1) != 0) |
165 | { |
165 | { |
166 | /* Nope, BAD Signature */ |
166 | /* Nope, BAD Signature */ |
167 | 167 | ||
168 | return (AE_BAD_SIGNATURE); |
168 | return (AE_BAD_SIGNATURE); |
169 | } |
169 | } |
170 | 170 | ||
171 | /* Check the standard checksum */ |
171 | /* Check the standard checksum */ |
172 | 172 | ||
173 | if (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) |
173 | if (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) |
174 | { |
174 | { |
175 | return (AE_BAD_CHECKSUM); |
175 | return (AE_BAD_CHECKSUM); |
176 | } |
176 | } |
177 | 177 | ||
178 | /* Check extended checksum if table version >= 2 */ |
178 | /* Check extended checksum if table version >= 2 */ |
179 | 179 | ||
180 | if ((Rsdp->Revision >= 2) && |
180 | if ((Rsdp->Revision >= 2) && |
181 | (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) |
181 | (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) |
182 | { |
182 | { |
183 | return (AE_BAD_CHECKSUM); |
183 | return (AE_BAD_CHECKSUM); |
184 | } |
184 | } |
185 | 185 | ||
186 | return (AE_OK); |
186 | return (AE_OK); |
187 | } |
187 | } |
188 | 188 | ||
189 | 189 | ||
190 | /******************************************************************************* |
190 | /******************************************************************************* |
191 | * |
191 | * |
192 | * FUNCTION: AcpiFindRootPointer |
192 | * FUNCTION: AcpiFindRootPointer |
193 | * |
193 | * |
194 | * PARAMETERS: TableAddress - Where the table pointer is returned |
194 | * PARAMETERS: TableAddress - Where the table pointer is returned |
195 | * |
195 | * |
196 | * RETURN: Status, RSDP physical address |
196 | * RETURN: Status, RSDP physical address |
197 | * |
197 | * |
198 | * DESCRIPTION: Search lower 1Mbyte of memory for the root system descriptor |
198 | * DESCRIPTION: Search lower 1Mbyte of memory for the root system descriptor |
199 | * pointer structure. If it is found, set *RSDP to point to it. |
199 | * pointer structure. If it is found, set *RSDP to point to it. |
200 | * |
200 | * |
201 | * NOTE1: The RSDP must be either in the first 1K of the Extended |
201 | * NOTE1: The RSDP must be either in the first 1K of the Extended |
202 | * BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.) |
202 | * BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.) |
203 | * Only a 32-bit physical address is necessary. |
203 | * Only a 32-bit physical address is necessary. |
204 | * |
204 | * |
205 | * NOTE2: This function is always available, regardless of the |
205 | * NOTE2: This function is always available, regardless of the |
206 | * initialization state of the rest of ACPI. |
206 | * initialization state of the rest of ACPI. |
207 | * |
207 | * |
208 | ******************************************************************************/ |
208 | ******************************************************************************/ |
209 | 209 | ||
210 | ACPI_STATUS |
210 | ACPI_STATUS |
211 | AcpiFindRootPointer ( |
211 | AcpiFindRootPointer ( |
212 | ACPI_SIZE *TableAddress) |
212 | ACPI_SIZE *TableAddress) |
213 | { |
213 | { |
214 | UINT8 *TablePtr; |
214 | UINT8 *TablePtr; |
215 | UINT8 *MemRover; |
215 | UINT8 *MemRover; |
216 | UINT32 PhysicalAddress; |
216 | UINT32 PhysicalAddress; |
217 | 217 | ||
218 | 218 | ||
219 | ACPI_FUNCTION_TRACE (AcpiFindRootPointer); |
219 | ACPI_FUNCTION_TRACE (AcpiFindRootPointer); |
220 | 220 | ||
221 | 221 | ||
222 | /* 1a) Get the location of the Extended BIOS Data Area (EBDA) */ |
222 | /* 1a) Get the location of the Extended BIOS Data Area (EBDA) */ |
223 | 223 | ||
224 | TablePtr = AcpiOsMapMemory ( |
224 | TablePtr = AcpiOsMapMemory ( |
225 | (ACPI_PHYSICAL_ADDRESS) ACPI_EBDA_PTR_LOCATION, |
225 | (ACPI_PHYSICAL_ADDRESS) ACPI_EBDA_PTR_LOCATION, |
226 | ACPI_EBDA_PTR_LENGTH); |
226 | ACPI_EBDA_PTR_LENGTH); |
227 | if (!TablePtr) |
227 | if (!TablePtr) |
228 | { |
228 | { |
229 | ACPI_ERROR ((AE_INFO, |
229 | ACPI_ERROR ((AE_INFO, |
230 | "Could not map memory at 0x%8.8X for length %u", |
230 | "Could not map memory at 0x%8.8X for length %u", |
231 | ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH)); |
231 | ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH)); |
232 | 232 | ||
233 | return_ACPI_STATUS (AE_NO_MEMORY); |
233 | return_ACPI_STATUS (AE_NO_MEMORY); |
234 | } |
234 | } |
235 | 235 | ||
236 | ACPI_MOVE_16_TO_32 (&PhysicalAddress, TablePtr); |
236 | ACPI_MOVE_16_TO_32 (&PhysicalAddress, TablePtr); |
237 | 237 | ||
238 | /* Convert segment part to physical address */ |
238 | /* Convert segment part to physical address */ |
239 | 239 | ||
240 | PhysicalAddress <<= 4; |
240 | PhysicalAddress <<= 4; |
241 | AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_PTR_LENGTH); |
241 | AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_PTR_LENGTH); |
242 | 242 | ||
243 | /* EBDA present? */ |
243 | /* EBDA present? */ |
244 | 244 | ||
245 | if (PhysicalAddress > 0x400) |
245 | if (PhysicalAddress > 0x400) |
246 | { |
246 | { |
247 | /* |
247 | /* |
248 | * 1b) Search EBDA paragraphs (EBDA is required to be a |
248 | * 1b) Search EBDA paragraphs (EBDA is required to be a |
249 | * minimum of 1K length) |
249 | * minimum of 1K length) |
250 | */ |
250 | */ |
251 | TablePtr = AcpiOsMapMemory ( |
251 | TablePtr = AcpiOsMapMemory ( |
252 | (ACPI_PHYSICAL_ADDRESS) PhysicalAddress, |
252 | (ACPI_PHYSICAL_ADDRESS) PhysicalAddress, |
253 | ACPI_EBDA_WINDOW_SIZE); |
253 | ACPI_EBDA_WINDOW_SIZE); |
254 | if (!TablePtr) |
254 | if (!TablePtr) |
255 | { |
255 | { |
256 | ACPI_ERROR ((AE_INFO, |
256 | ACPI_ERROR ((AE_INFO, |
257 | "Could not map memory at 0x%8.8X for length %u", |
257 | "Could not map memory at 0x%8.8X for length %u", |
258 | PhysicalAddress, ACPI_EBDA_WINDOW_SIZE)); |
258 | PhysicalAddress, ACPI_EBDA_WINDOW_SIZE)); |
259 | 259 | ||
260 | return_ACPI_STATUS (AE_NO_MEMORY); |
260 | return_ACPI_STATUS (AE_NO_MEMORY); |
261 | } |
261 | } |
262 | 262 | ||
263 | MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_EBDA_WINDOW_SIZE); |
263 | MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_EBDA_WINDOW_SIZE); |
264 | AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_WINDOW_SIZE); |
264 | AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_WINDOW_SIZE); |
265 | 265 | ||
266 | if (MemRover) |
266 | if (MemRover) |
267 | { |
267 | { |
268 | /* Return the physical address */ |
268 | /* Return the physical address */ |
269 | 269 | ||
270 | PhysicalAddress += (UINT32) ACPI_PTR_DIFF (MemRover, TablePtr); |
270 | PhysicalAddress += (UINT32) ACPI_PTR_DIFF (MemRover, TablePtr); |
271 | 271 | ||
272 | *TableAddress = PhysicalAddress; |
272 | *TableAddress = PhysicalAddress; |
273 | return_ACPI_STATUS (AE_OK); |
273 | return_ACPI_STATUS (AE_OK); |
274 | } |
274 | } |
275 | } |
275 | } |
276 | 276 | ||
277 | /* |
277 | /* |
278 | * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh |
278 | * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh |
279 | */ |
279 | */ |
280 | TablePtr = AcpiOsMapMemory ( |
280 | TablePtr = AcpiOsMapMemory ( |
281 | (ACPI_PHYSICAL_ADDRESS) ACPI_HI_RSDP_WINDOW_BASE, |
281 | (ACPI_PHYSICAL_ADDRESS) ACPI_HI_RSDP_WINDOW_BASE, |
282 | ACPI_HI_RSDP_WINDOW_SIZE); |
282 | ACPI_HI_RSDP_WINDOW_SIZE); |
283 | 283 | ||
284 | if (!TablePtr) |
284 | if (!TablePtr) |
285 | { |
285 | { |
286 | ACPI_ERROR ((AE_INFO, |
286 | ACPI_ERROR ((AE_INFO, |
287 | "Could not map memory at 0x%8.8X for length %u", |
287 | "Could not map memory at 0x%8.8X for length %u", |
288 | ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE)); |
288 | ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE)); |
289 | 289 | ||
290 | return_ACPI_STATUS (AE_NO_MEMORY); |
290 | return_ACPI_STATUS (AE_NO_MEMORY); |
291 | } |
291 | } |
292 | 292 | ||
293 | MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); |
293 | MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); |
294 | AcpiOsUnmapMemory (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); |
294 | AcpiOsUnmapMemory (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); |
295 | 295 | ||
296 | if (MemRover) |
296 | if (MemRover) |
297 | { |
297 | { |
298 | /* Return the physical address */ |
298 | /* Return the physical address */ |
299 | 299 | ||
300 | PhysicalAddress = (UINT32) |
300 | PhysicalAddress = (UINT32) |
301 | (ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (MemRover, TablePtr)); |
301 | (ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (MemRover, TablePtr)); |
302 | 302 | ||
303 | *TableAddress = PhysicalAddress; |
303 | *TableAddress = PhysicalAddress; |
304 | return_ACPI_STATUS (AE_OK); |
304 | return_ACPI_STATUS (AE_OK); |
305 | } |
305 | } |
306 | 306 | ||
307 | /* A valid RSDP was not found */ |
307 | /* A valid RSDP was not found */ |
308 | 308 | ||
309 | ACPI_ERROR ((AE_INFO, "A valid RSDP was not found")); |
309 | ACPI_ERROR ((AE_INFO, "A valid RSDP was not found")); |
310 | return_ACPI_STATUS (AE_NOT_FOUND); |
310 | return_ACPI_STATUS (AE_NOT_FOUND); |
311 | } |
311 | } |
312 | 312 | ||
313 | ACPI_EXPORT_SYMBOL (AcpiFindRootPointer) |
313 | ACPI_EXPORT_SYMBOL (AcpiFindRootPointer) |
314 | 314 | ||
315 | 315 | ||
316 | /******************************************************************************* |
316 | /******************************************************************************* |
317 | * |
317 | * |
318 | * FUNCTION: AcpiTbScanMemoryForRsdp |
318 | * FUNCTION: AcpiTbScanMemoryForRsdp |
319 | * |
319 | * |
320 | * PARAMETERS: StartAddress - Starting pointer for search |
320 | * PARAMETERS: StartAddress - Starting pointer for search |
321 | * Length - Maximum length to search |
321 | * Length - Maximum length to search |
322 | * |
322 | * |
323 | * RETURN: Pointer to the RSDP if found, otherwise NULL. |
323 | * RETURN: Pointer to the RSDP if found, otherwise NULL. |
324 | * |
324 | * |
325 | * DESCRIPTION: Search a block of memory for the RSDP signature |
325 | * DESCRIPTION: Search a block of memory for the RSDP signature |
326 | * |
326 | * |
327 | ******************************************************************************/ |
327 | ******************************************************************************/ |
328 | 328 | ||
329 | static UINT8 * |
329 | static UINT8 * |
330 | AcpiTbScanMemoryForRsdp ( |
330 | AcpiTbScanMemoryForRsdp ( |
331 | UINT8 *StartAddress, |
331 | UINT8 *StartAddress, |
332 | UINT32 Length) |
332 | UINT32 Length) |
333 | { |
333 | { |
334 | ACPI_STATUS Status; |
334 | ACPI_STATUS Status; |
335 | UINT8 *MemRover; |
335 | UINT8 *MemRover; |
336 | UINT8 *EndAddress; |
336 | UINT8 *EndAddress; |
337 | 337 | ||
338 | 338 | ||
339 | ACPI_FUNCTION_TRACE (TbScanMemoryForRsdp); |
339 | ACPI_FUNCTION_TRACE (TbScanMemoryForRsdp); |
340 | 340 | ||
341 | 341 | ||
342 | EndAddress = StartAddress + Length; |
342 | EndAddress = StartAddress + Length; |
343 | 343 | ||
344 | /* Search from given start address for the requested length */ |
344 | /* Search from given start address for the requested length */ |
345 | 345 | ||
346 | for (MemRover = StartAddress; MemRover < EndAddress; |
346 | for (MemRover = StartAddress; MemRover < EndAddress; |
347 | MemRover += ACPI_RSDP_SCAN_STEP) |
347 | MemRover += ACPI_RSDP_SCAN_STEP) |
348 | { |
348 | { |
349 | /* The RSDP signature and checksum must both be correct */ |
349 | /* The RSDP signature and checksum must both be correct */ |
350 | 350 | ||
351 | Status = AcpiTbValidateRsdp (ACPI_CAST_PTR (ACPI_TABLE_RSDP, MemRover)); |
351 | Status = AcpiTbValidateRsdp (ACPI_CAST_PTR (ACPI_TABLE_RSDP, MemRover)); |
352 | if (ACPI_SUCCESS (Status)) |
352 | if (ACPI_SUCCESS (Status)) |
353 | { |
353 | { |
354 | /* Sig and checksum valid, we have found a real RSDP */ |
354 | /* Sig and checksum valid, we have found a real RSDP */ |
355 | 355 | ||
356 | ACPI_DEBUG_PRINT ((ACPI_DB_INFO, |
356 | ACPI_DEBUG_PRINT ((ACPI_DB_INFO, |
357 | "RSDP located at physical address %p\n", MemRover)); |
357 | "RSDP located at physical address %p\n", MemRover)); |
358 | return_PTR (MemRover); |
358 | return_PTR (MemRover); |
359 | } |
359 | } |
360 | 360 | ||
361 | /* No sig match or bad checksum, keep searching */ |
361 | /* No sig match or bad checksum, keep searching */ |
362 | } |
362 | } |
363 | 363 | ||
364 | /* Searched entire block, no RSDP was found */ |
364 | /* Searched entire block, no RSDP was found */ |
365 | 365 | ||
366 | ACPI_DEBUG_PRINT ((ACPI_DB_INFO, |
366 | ACPI_DEBUG_PRINT ((ACPI_DB_INFO, |
367 | "Searched entire block from %p, valid RSDP was not found\n", |
367 | "Searched entire block from %p, valid RSDP was not found\n", |
368 | StartAddress)); |
368 | StartAddress)); |
369 | return_PTR (NULL); |
369 | return_PTR (NULL); |
370 | }>=><=> |
370 | }>=><=> |