OsdMisc.c revision 1.14.6.2 1 1.14.6.2 skrll /* $NetBSD: OsdMisc.c,v 1.14.6.2 2017/02/05 13:40:26 skrll Exp $ */
2 1.1 kochi
3 1.1 kochi /*
4 1.1 kochi * Copyright 2001 Wasabi Systems, Inc.
5 1.1 kochi * All rights reserved.
6 1.1 kochi *
7 1.1 kochi * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 1.1 kochi *
9 1.1 kochi * Redistribution and use in source and binary forms, with or without
10 1.1 kochi * modification, are permitted provided that the following conditions
11 1.1 kochi * are met:
12 1.1 kochi * 1. Redistributions of source code must retain the above copyright
13 1.1 kochi * notice, this list of conditions and the following disclaimer.
14 1.1 kochi * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 kochi * notice, this list of conditions and the following disclaimer in the
16 1.1 kochi * documentation and/or other materials provided with the distribution.
17 1.1 kochi * 3. All advertising materials mentioning features or use of this software
18 1.1 kochi * must display the following acknowledgement:
19 1.1 kochi * This product includes software developed for the NetBSD Project by
20 1.1 kochi * Wasabi Systems, Inc.
21 1.1 kochi * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 1.1 kochi * or promote products derived from this software without specific prior
23 1.1 kochi * written permission.
24 1.1 kochi *
25 1.1 kochi * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 1.1 kochi * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 1.1 kochi * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 1.1 kochi * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 1.1 kochi * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 1.1 kochi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 1.1 kochi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 1.1 kochi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 1.1 kochi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 1.1 kochi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 1.1 kochi * POSSIBILITY OF SUCH DAMAGE.
36 1.1 kochi */
37 1.1 kochi
38 1.1 kochi /*
39 1.14.6.2 skrll * Copyright (C) 2000 - 2017, Intel Corp.
40 1.14.6.2 skrll * All rights reserved.
41 1.14.6.2 skrll *
42 1.14.6.2 skrll * Redistribution and use in source and binary forms, with or without
43 1.14.6.2 skrll * modification, are permitted provided that the following conditions
44 1.14.6.2 skrll * are met:
45 1.14.6.2 skrll * 1. Redistributions of source code must retain the above copyright
46 1.14.6.2 skrll * notice, this list of conditions, and the following disclaimer,
47 1.14.6.2 skrll * without modification.
48 1.14.6.2 skrll * 2. Redistributions in binary form must reproduce at minimum a disclaimer
49 1.14.6.2 skrll * substantially similar to the "NO WARRANTY" disclaimer below
50 1.14.6.2 skrll * ("Disclaimer") and any redistribution must be conditioned upon
51 1.14.6.2 skrll * including a substantially similar Disclaimer requirement for further
52 1.14.6.2 skrll * binary redistribution.
53 1.14.6.2 skrll * 3. Neither the names of the above-listed copyright holders nor the names
54 1.14.6.2 skrll * of any contributors may be used to endorse or promote products derived
55 1.14.6.2 skrll * from this software without specific prior written permission.
56 1.14.6.2 skrll *
57 1.14.6.2 skrll * Alternatively, this software may be distributed under the terms of the
58 1.14.6.2 skrll * GNU General Public License ("GPL") version 2 as published by the Free
59 1.14.6.2 skrll * Software Foundation.
60 1.14.6.2 skrll *
61 1.14.6.2 skrll * NO WARRANTY
62 1.14.6.2 skrll * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
63 1.14.6.2 skrll * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
64 1.14.6.2 skrll * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
65 1.14.6.2 skrll * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
66 1.14.6.2 skrll * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
67 1.14.6.2 skrll * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
68 1.14.6.2 skrll * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
69 1.14.6.2 skrll * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
70 1.14.6.2 skrll * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
71 1.14.6.2 skrll * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
72 1.14.6.2 skrll * POSSIBILITY OF SUCH DAMAGES.
73 1.14.6.2 skrll */
74 1.14.6.2 skrll
75 1.14.6.2 skrll /*
76 1.1 kochi * OS Services Layer
77 1.1 kochi *
78 1.1 kochi * 6.10: Miscellaneous
79 1.1 kochi */
80 1.1 kochi
81 1.1 kochi #include <sys/cdefs.h>
82 1.14.6.2 skrll __KERNEL_RCSID(0, "$NetBSD: OsdMisc.c,v 1.14.6.2 2017/02/05 13:40:26 skrll Exp $");
83 1.1 kochi
84 1.1 kochi #include "opt_acpi.h"
85 1.1 kochi #include "opt_ddb.h"
86 1.1 kochi
87 1.1 kochi #include <sys/param.h>
88 1.1 kochi #include <sys/systm.h>
89 1.1 kochi
90 1.1 kochi #include <machine/db_machdep.h>
91 1.1 kochi
92 1.1 kochi #include <ddb/db_extern.h>
93 1.1 kochi #include <ddb/db_output.h>
94 1.1 kochi
95 1.1 kochi #include <dev/acpi/acpica.h>
96 1.1 kochi #include <dev/acpi/acpi_osd.h>
97 1.1 kochi
98 1.11 jruoho #ifdef ACPI_DEBUG
99 1.14.6.2 skrll #include <external/bsd/acpica/dist/include/acpi.h>
100 1.14.6.2 skrll #include <external/bsd/acpica/dist/include/accommon.h>
101 1.11 jruoho #include <external/bsd/acpica/dist/include/acdebug.h>
102 1.11 jruoho #endif
103 1.11 jruoho
104 1.1 kochi #ifdef ACPI_DSDT_OVERRIDE
105 1.1 kochi #ifndef ACPI_DSDT_FILE
106 1.1 kochi #define ACPI_DSDT_FILE "dsdt.hex"
107 1.1 kochi #endif
108 1.1 kochi #include ACPI_DSDT_FILE
109 1.1 kochi #endif
110 1.1 kochi
111 1.1 kochi int acpi_indebugger;
112 1.1 kochi
113 1.1 kochi /*
114 1.1 kochi * AcpiOsSignal:
115 1.1 kochi *
116 1.1 kochi * Break to the debugger or display a breakpoint message.
117 1.1 kochi */
118 1.1 kochi ACPI_STATUS
119 1.7 jmcneill AcpiOsSignal(UINT32 Function, void *Info)
120 1.1 kochi {
121 1.3 kochi /*
122 1.3 kochi * the upper layer might call with Info = NULL,
123 1.3 kochi * which makes little sense.
124 1.3 kochi */
125 1.3 kochi if (Info == NULL)
126 1.3 kochi return AE_NO_MEMORY;
127 1.1 kochi
128 1.1 kochi switch (Function) {
129 1.1 kochi case ACPI_SIGNAL_FATAL:
130 1.1 kochi {
131 1.7 jmcneill ACPI_SIGNAL_FATAL_INFO *info = Info;
132 1.1 kochi
133 1.1 kochi panic("ACPI fatal signal: "
134 1.1 kochi "Type 0x%08x, Code 0x%08x, Argument 0x%08x",
135 1.1 kochi info->Type, info->Code, info->Argument);
136 1.1 kochi /* NOTREACHED */
137 1.1 kochi break;
138 1.1 kochi }
139 1.1 kochi
140 1.1 kochi case ACPI_SIGNAL_BREAKPOINT:
141 1.1 kochi {
142 1.6 joerg #ifdef ACPI_BREAKPOINT
143 1.7 jmcneill char *info = Info;
144 1.1 kochi
145 1.1 kochi printf("%s\n", info);
146 1.6 joerg # if defined(DDB)
147 1.1 kochi Debugger();
148 1.6 joerg # else
149 1.1 kochi printf("ACPI: WARNING: DDB not configured into kernel.\n");
150 1.1 kochi return AE_NOT_EXIST;
151 1.6 joerg # endif
152 1.1 kochi #endif
153 1.1 kochi break;
154 1.1 kochi }
155 1.1 kochi
156 1.1 kochi default:
157 1.1 kochi return AE_BAD_PARAMETER;
158 1.1 kochi }
159 1.1 kochi
160 1.1 kochi return AE_OK;
161 1.1 kochi }
162 1.1 kochi
163 1.1 kochi ACPI_STATUS
164 1.12 jruoho AcpiOsGetLine(char *Buffer, UINT32 BufferLength, UINT32 *BytesRead)
165 1.1 kochi {
166 1.1 kochi #if defined(DDB)
167 1.1 kochi char *cp;
168 1.1 kochi
169 1.1 kochi db_readline(Buffer, 80);
170 1.1 kochi for (cp = Buffer; *cp != 0; cp++)
171 1.1 kochi if (*cp == '\n' || *cp == '\r')
172 1.1 kochi *cp = 0;
173 1.1 kochi db_output_line = 0;
174 1.1 kochi return AE_OK;
175 1.1 kochi #else
176 1.1 kochi printf("ACPI: WARNING: DDB not configured into kernel.\n");
177 1.1 kochi return AE_NOT_EXIST;
178 1.1 kochi #endif
179 1.1 kochi }
180 1.1 kochi
181 1.1 kochi ACPI_STATUS
182 1.5 christos AcpiOsTableOverride(ACPI_TABLE_HEADER *ExistingTable,
183 1.1 kochi ACPI_TABLE_HEADER **NewTable)
184 1.1 kochi {
185 1.1 kochi #ifndef ACPI_DSDT_OVERRIDE
186 1.1 kochi *NewTable = NULL;
187 1.1 kochi #else
188 1.1 kochi if (strncmp(ExistingTable->Signature, "DSDT", 4) == 0)
189 1.1 kochi *NewTable = (ACPI_TABLE_HEADER *)AmlCode;
190 1.1 kochi else
191 1.1 kochi *NewTable = NULL;
192 1.1 kochi #endif
193 1.1 kochi return AE_OK;
194 1.1 kochi }
195 1.1 kochi
196 1.1 kochi ACPI_STATUS
197 1.1 kochi AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES *InitVal,
198 1.1 kochi ACPI_STRING *NewVal)
199 1.1 kochi {
200 1.1 kochi if (!InitVal || !NewVal)
201 1.1 kochi return AE_BAD_PARAMETER;
202 1.1 kochi
203 1.1 kochi *NewVal = NULL;
204 1.1 kochi return AE_OK;
205 1.1 kochi }
206 1.1 kochi
207 1.13 christos
208 1.13 christos /*
209 1.13 christos * AcpiOsPhysicalTableOverride:
210 1.13 christos *
211 1.13 christos * ExistingTable - Header of current table (probably firmware)
212 1.13 christos * NewAddress - Where new table address is returned
213 1.13 christos * (Physical address)
214 1.13 christos * NewTableLength - Where new table length is returned
215 1.13 christos *
216 1.13 christos * RETURN: Status, address/length of new table. Null pointer returned
217 1.13 christos * if no table is available to override.
218 1.13 christos *
219 1.13 christos * DESCRIPTION: Returns AE_SUPPORT, function not used in user space.
220 1.13 christos */
221 1.13 christos ACPI_STATUS
222 1.13 christos AcpiOsPhysicalTableOverride (
223 1.13 christos ACPI_TABLE_HEADER *ExistingTable,
224 1.13 christos ACPI_PHYSICAL_ADDRESS *NewAddress,
225 1.13 christos UINT32 *NewTableLength)
226 1.13 christos {
227 1.13 christos
228 1.13 christos return AE_SUPPORT;
229 1.13 christos }
230 1.13 christos
231 1.14.6.2 skrll /******************************************************************************
232 1.14.6.2 skrll *
233 1.14.6.2 skrll * FUNCTION: AcpiOsEnterSleep
234 1.14.6.2 skrll *
235 1.14.6.2 skrll * PARAMETERS: SleepState - Which sleep state to enter
236 1.14.6.2 skrll * RegaValue - Register A value
237 1.14.6.2 skrll * RegbValue - Register B value
238 1.14.6.2 skrll *
239 1.14.6.2 skrll * RETURN: Status
240 1.14.6.2 skrll *
241 1.14.6.2 skrll * DESCRIPTION: A hook before writing sleep registers to enter the sleep
242 1.14.6.2 skrll * state. Return AE_CTRL_TERMINATE to skip further sleep register
243 1.14.6.2 skrll * writes.
244 1.14.6.2 skrll *
245 1.14.6.2 skrll *****************************************************************************/
246 1.14.6.2 skrll
247 1.14.6.2 skrll ACPI_STATUS
248 1.14.6.2 skrll AcpiOsEnterSleep (
249 1.14.6.2 skrll UINT8 SleepState,
250 1.14.6.2 skrll UINT32 RegaValue,
251 1.14.6.2 skrll UINT32 RegbValue)
252 1.14.6.2 skrll {
253 1.14.6.2 skrll
254 1.14.6.2 skrll return AE_OK;
255 1.14.6.2 skrll }
256 1.14.6.2 skrll
257 1.14.6.2 skrll
258 1.1 kochi /*
259 1.1 kochi * acpi_osd_debugger:
260 1.1 kochi *
261 1.1 kochi * Enter the ACPICA debugger.
262 1.1 kochi */
263 1.1 kochi void
264 1.1 kochi acpi_osd_debugger(void)
265 1.1 kochi {
266 1.14 christos #ifdef ACPI_DEBUG
267 1.1 kochi label_t acpi_jmpbuf;
268 1.1 kochi label_t *savejmp;
269 1.1 kochi
270 1.1 kochi printf("Entering ACPICA debugger...\n");
271 1.1 kochi savejmp = db_recover;
272 1.1 kochi setjmp(&acpi_jmpbuf);
273 1.1 kochi db_recover = &acpi_jmpbuf;
274 1.1 kochi
275 1.1 kochi acpi_indebugger = 1;
276 1.14.6.2 skrll AcpiDbUserCommands();
277 1.1 kochi acpi_indebugger = 0;
278 1.1 kochi
279 1.1 kochi db_recover = savejmp;
280 1.1 kochi #else
281 1.1 kochi printf("ACPI: WARNING: ACPICA debugger not present.\n");
282 1.1 kochi #endif
283 1.1 kochi }
284 1.14.6.2 skrll
285 1.14.6.2 skrll #ifdef ACPI_DEBUG
286 1.14.6.2 skrll
287 1.14.6.2 skrll #define _COMPONENT ACPI_CA_DEBUGGER
288 1.14.6.2 skrll ACPI_MODULE_NAME ("osnetbsdbg")
289 1.14.6.2 skrll
290 1.14.6.2 skrll
291 1.14.6.2 skrll /******************************************************************************
292 1.14.6.2 skrll *
293 1.14.6.2 skrll * FUNCTION: AcpiOsWaitCommandReady
294 1.14.6.2 skrll *
295 1.14.6.2 skrll * PARAMETERS: None
296 1.14.6.2 skrll *
297 1.14.6.2 skrll * RETURN: Status
298 1.14.6.2 skrll *
299 1.14.6.2 skrll * DESCRIPTION: Negotiate with the debugger foreground thread (the user
300 1.14.6.2 skrll * thread) to wait the readiness of a command.
301 1.14.6.2 skrll *
302 1.14.6.2 skrll *****************************************************************************/
303 1.14.6.2 skrll
304 1.14.6.2 skrll ACPI_STATUS
305 1.14.6.2 skrll AcpiOsWaitCommandReady (
306 1.14.6.2 skrll void)
307 1.14.6.2 skrll {
308 1.14.6.2 skrll ACPI_STATUS Status;
309 1.14.6.2 skrll /* Force output to console until a command is entered */
310 1.14.6.2 skrll
311 1.14.6.2 skrll AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
312 1.14.6.2 skrll
313 1.14.6.2 skrll /* Different prompt if method is executing */
314 1.14.6.2 skrll
315 1.14.6.2 skrll if (!AcpiGbl_MethodExecuting)
316 1.14.6.2 skrll {
317 1.14.6.2 skrll AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
318 1.14.6.2 skrll }
319 1.14.6.2 skrll else
320 1.14.6.2 skrll {
321 1.14.6.2 skrll AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
322 1.14.6.2 skrll }
323 1.14.6.2 skrll
324 1.14.6.2 skrll /* Get the user input line */
325 1.14.6.2 skrll
326 1.14.6.2 skrll Status = AcpiOsGetLine (AcpiGbl_DbLineBuf,
327 1.14.6.2 skrll ACPI_DB_LINE_BUFFER_SIZE, NULL);
328 1.14.6.2 skrll
329 1.14.6.2 skrll if (ACPI_FAILURE (Status) && Status != AE_CTRL_TERMINATE)
330 1.14.6.2 skrll {
331 1.14.6.2 skrll ACPI_EXCEPTION ((AE_INFO, Status,
332 1.14.6.2 skrll "While parsing/handling command line"));
333 1.14.6.2 skrll }
334 1.14.6.2 skrll return (Status);
335 1.14.6.2 skrll }
336 1.14.6.2 skrll
337 1.14.6.2 skrll
338 1.14.6.2 skrll /******************************************************************************
339 1.14.6.2 skrll *
340 1.14.6.2 skrll * FUNCTION: AcpiOsNotifyCommandComplete
341 1.14.6.2 skrll *
342 1.14.6.2 skrll * PARAMETERS: void
343 1.14.6.2 skrll *
344 1.14.6.2 skrll * RETURN: Status
345 1.14.6.2 skrll *
346 1.14.6.2 skrll * DESCRIPTION: Negotiate with the debugger foreground thread (the user
347 1.14.6.2 skrll * thread) to notify the completion of a command.
348 1.14.6.2 skrll *
349 1.14.6.2 skrll *****************************************************************************/
350 1.14.6.2 skrll
351 1.14.6.2 skrll ACPI_STATUS
352 1.14.6.2 skrll AcpiOsNotifyCommandComplete (
353 1.14.6.2 skrll void)
354 1.14.6.2 skrll {
355 1.14.6.2 skrll
356 1.14.6.2 skrll return AE_OK;
357 1.14.6.2 skrll }
358 1.14.6.2 skrll
359 1.14.6.2 skrll
360 1.14.6.2 skrll /******************************************************************************
361 1.14.6.2 skrll *
362 1.14.6.2 skrll * FUNCTION: AcpiOsInitializeDebugger
363 1.14.6.2 skrll *
364 1.14.6.2 skrll * PARAMETERS: None
365 1.14.6.2 skrll *
366 1.14.6.2 skrll * RETURN: Status
367 1.14.6.2 skrll *
368 1.14.6.2 skrll * DESCRIPTION: Initialize OSPM specific part of the debugger
369 1.14.6.2 skrll *
370 1.14.6.2 skrll *****************************************************************************/
371 1.14.6.2 skrll
372 1.14.6.2 skrll ACPI_STATUS
373 1.14.6.2 skrll AcpiOsInitializeDebugger (
374 1.14.6.2 skrll void)
375 1.14.6.2 skrll {
376 1.14.6.2 skrll return AE_OK;
377 1.14.6.2 skrll }
378 1.14.6.2 skrll
379 1.14.6.2 skrll
380 1.14.6.2 skrll /******************************************************************************
381 1.14.6.2 skrll *
382 1.14.6.2 skrll * FUNCTION: AcpiOsTerminateDebugger
383 1.14.6.2 skrll *
384 1.14.6.2 skrll * PARAMETERS: None
385 1.14.6.2 skrll *
386 1.14.6.2 skrll * RETURN: None
387 1.14.6.2 skrll *
388 1.14.6.2 skrll * DESCRIPTION: Terminate signals used by the multi-threading debugger
389 1.14.6.2 skrll *
390 1.14.6.2 skrll *****************************************************************************/
391 1.14.6.2 skrll
392 1.14.6.2 skrll void
393 1.14.6.2 skrll AcpiOsTerminateDebugger (
394 1.14.6.2 skrll void)
395 1.14.6.2 skrll {
396 1.14.6.2 skrll }
397 1.14.6.2 skrll
398 1.14.6.2 skrll
399 1.14.6.2 skrll /******************************************************************************
400 1.14.6.2 skrll *
401 1.14.6.2 skrll * FUNCTION: AcpiRunDebugger
402 1.14.6.2 skrll *
403 1.14.6.2 skrll * PARAMETERS: BatchBuffer - Buffer containing commands running in
404 1.14.6.2 skrll * the batch mode
405 1.14.6.2 skrll *
406 1.14.6.2 skrll * RETURN: None
407 1.14.6.2 skrll *
408 1.14.6.2 skrll * DESCRIPTION: Run a local/remote debugger
409 1.14.6.2 skrll *
410 1.14.6.2 skrll *****************************************************************************/
411 1.14.6.2 skrll
412 1.14.6.2 skrll void
413 1.14.6.2 skrll AcpiRunDebugger (
414 1.14.6.2 skrll char *BatchBuffer)
415 1.14.6.2 skrll {
416 1.14.6.2 skrll AcpiDbUserCommands ();
417 1.14.6.2 skrll }
418 1.14.6.2 skrll
419 1.14.6.2 skrll ACPI_EXPORT_SYMBOL (AcpiRunDebugger)
420 1.14.6.2 skrll #endif
421