Merge from amd64-branch:
[reactos.git] / reactos / drivers / bus / acpi / utils / cminit.c
1 /******************************************************************************
2 *
3 * Module Name: cminit - Common ACPI subsystem initialization
4 * $Revision: 1.1 $
5 *
6 *****************************************************************************/
7
8 /*
9 * Copyright (C) 2000, 2001 R. Byron Moore
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26
27 #include <acpi.h>
28
29 #define _COMPONENT ACPI_UTILITIES
30 MODULE_NAME ("cminit")
31
32
33 #define ACPI_OFFSET(d,o) ((u32) &(((d *)0)->o))
34 #define ACPI_FADT_OFFSET(o) ACPI_OFFSET (FADT_DESCRIPTOR, o)
35
36 /*******************************************************************************
37 *
38 * FUNCTION: Acpi_cm_fadt_register_error
39 *
40 * PARAMETERS: *Register_name - Pointer to string identifying register
41 * Value - Actual register contents value
42 * Acpi_test_spec_section - TDS section containing assertion
43 * Acpi_assertion - Assertion number being tested
44 *
45 * RETURN: AE_BAD_VALUE
46 *
47 * DESCRIPTION: Display failure message and link failure to TDS assertion
48 *
49 ******************************************************************************/
50
51 static ACPI_STATUS
52 acpi_cm_fadt_register_error (
53 NATIVE_CHAR *register_name,
54 u32 value,
55 u32 offset)
56 {
57
58 REPORT_ERROR (
59 ("Invalid FADT value %s=%lX at offset %lX FADT=%p\n",
60 register_name, value, offset, acpi_gbl_FADT));
61
62
63 return (AE_BAD_VALUE);
64 }
65
66
67 /******************************************************************************
68 *
69 * FUNCTION: Acpi_cm_validate_fadt
70 *
71 * PARAMETERS: None
72 *
73 * RETURN: Status
74 *
75 * DESCRIPTION: Validate various ACPI registers in the FADT
76 *
77 ******************************************************************************/
78
79 ACPI_STATUS
80 acpi_cm_validate_fadt (
81 void)
82 {
83 ACPI_STATUS status = AE_OK;
84
85
86 /*
87 * Verify Fixed ACPI Description Table fields,
88 * but don't abort on any problems, just display error
89 */
90
91 if (acpi_gbl_FADT->pm1_evt_len < 4) {
92 status = acpi_cm_fadt_register_error ("PM1_EVT_LEN",
93 (u32) acpi_gbl_FADT->pm1_evt_len,
94 ACPI_FADT_OFFSET (pm1_evt_len));
95 }
96
97 if (!acpi_gbl_FADT->pm1_cnt_len) {
98 status = acpi_cm_fadt_register_error ("PM1_CNT_LEN", 0,
99 ACPI_FADT_OFFSET (pm1_cnt_len));
100 }
101
102 if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_evt_blk.address)) {
103 status = acpi_cm_fadt_register_error ("X_PM1a_EVT_BLK", 0,
104 ACPI_FADT_OFFSET (Xpm1a_evt_blk.address));
105 }
106
107 if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_cnt_blk.address)) {
108 status = acpi_cm_fadt_register_error ("X_PM1a_CNT_BLK", 0,
109 ACPI_FADT_OFFSET (Xpm1a_cnt_blk.address));
110 }
111
112 if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address)) {
113 status = acpi_cm_fadt_register_error ("X_PM_TMR_BLK", 0,
114 ACPI_FADT_OFFSET (Xpm_tmr_blk.address));
115 }
116
117 if ((ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm2_cnt_blk.address) &&
118 !acpi_gbl_FADT->pm2_cnt_len)) {
119 status = acpi_cm_fadt_register_error ("PM2_CNT_LEN",
120 (u32) acpi_gbl_FADT->pm2_cnt_len,
121 ACPI_FADT_OFFSET (pm2_cnt_len));
122 }
123
124 if (acpi_gbl_FADT->pm_tm_len < 4) {
125 status = acpi_cm_fadt_register_error ("PM_TM_LEN",
126 (u32) acpi_gbl_FADT->pm_tm_len,
127 ACPI_FADT_OFFSET (pm_tm_len));
128 }
129
130 /* length of GPE blocks must be a multiple of 2 */
131
132
133 if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) &&
134 (acpi_gbl_FADT->gpe0blk_len & 1)) {
135 status = acpi_cm_fadt_register_error ("(x)GPE0_BLK_LEN",
136 (u32) acpi_gbl_FADT->gpe0blk_len,
137 ACPI_FADT_OFFSET (gpe0blk_len));
138 }
139
140 if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) &&
141 (acpi_gbl_FADT->gpe1_blk_len & 1)) {
142 status = acpi_cm_fadt_register_error ("(x)GPE1_BLK_LEN",
143 (u32) acpi_gbl_FADT->gpe1_blk_len,
144 ACPI_FADT_OFFSET (gpe1_blk_len));
145 }
146
147 return (status);
148 }
149
150
151 /******************************************************************************
152 *
153 * FUNCTION: Acpi_cm_terminate
154 *
155 * PARAMETERS: none
156 *
157 * RETURN: none
158 *
159 * DESCRIPTION: free memory allocated for table storage.
160 *
161 ******************************************************************************/
162
163 void
164 acpi_cm_terminate (void)
165 {
166
167
168 /* Free global tables, etc. */
169
170 if (acpi_gbl_gpe0enable_register_save) {
171 acpi_cm_free (acpi_gbl_gpe0enable_register_save);
172 }
173
174 if (acpi_gbl_gpe1_enable_register_save) {
175 acpi_cm_free (acpi_gbl_gpe1_enable_register_save);
176 }
177
178
179 return;
180 }
181
182
183 /******************************************************************************
184 *
185 * FUNCTION: Acpi_cm_subsystem_shutdown
186 *
187 * PARAMETERS: none
188 *
189 * RETURN: none
190 *
191 * DESCRIPTION: Shutdown the various subsystems. Don't delete the mutex
192 * objects here -- because the AML debugger may be still running.
193 *
194 ******************************************************************************/
195
196 ACPI_STATUS
197 acpi_cm_subsystem_shutdown (void)
198 {
199
200 /* Just exit if subsystem is already shutdown */
201
202 if (acpi_gbl_shutdown) {
203 return (AE_OK);
204 }
205
206 /* Subsystem appears active, go ahead and shut it down */
207
208 acpi_gbl_shutdown = TRUE;
209
210 /* Close the Namespace */
211
212 acpi_ns_terminate ();
213
214 /* Close the Acpi_event Handling */
215
216 acpi_ev_terminate ();
217
218 /* Close the globals */
219
220 acpi_cm_terminate ();
221
222 /* Flush the local cache(s) */
223
224 acpi_cm_delete_generic_state_cache ();
225 acpi_cm_delete_object_cache ();
226 acpi_ds_delete_walk_state_cache ();
227
228 /* Close the Parser */
229
230 /* TBD: [Restructure] Acpi_ps_terminate () */
231
232 acpi_ps_delete_parse_cache ();
233
234 /* Debug only - display leftover memory allocation, if any */
235 #ifdef ENABLE_DEBUGGER
236 acpi_cm_dump_current_allocations (ACPI_UINT32_MAX, NULL);
237 #endif
238
239 return (AE_OK);
240 }
241
242