1 1.16 christos /* $NetBSD: OsdMisc.c,v 1.16 2017/01/25 13:38:40 christos 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.16 christos * Copyright (C) 2000 - 2017, Intel Corp. 40 1.16 christos * All rights reserved. 41 1.16 christos * 42 1.16 christos * Redistribution and use in source and binary forms, with or without 43 1.16 christos * modification, are permitted provided that the following conditions 44 1.16 christos * are met: 45 1.16 christos * 1. Redistributions of source code must retain the above copyright 46 1.16 christos * notice, this list of conditions, and the following disclaimer, 47 1.16 christos * without modification. 48 1.16 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 49 1.16 christos * substantially similar to the "NO WARRANTY" disclaimer below 50 1.16 christos * ("Disclaimer") and any redistribution must be conditioned upon 51 1.16 christos * including a substantially similar Disclaimer requirement for further 52 1.16 christos * binary redistribution. 53 1.16 christos * 3. Neither the names of the above-listed copyright holders nor the names 54 1.16 christos * of any contributors may be used to endorse or promote products derived 55 1.16 christos * from this software without specific prior written permission. 56 1.16 christos * 57 1.16 christos * Alternatively, this software may be distributed under the terms of the 58 1.16 christos * GNU General Public License ("GPL") version 2 as published by the Free 59 1.16 christos * Software Foundation. 60 1.16 christos * 61 1.16 christos * NO WARRANTY 62 1.16 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 63 1.16 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 64 1.16 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 65 1.16 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 66 1.16 christos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 67 1.16 christos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 68 1.16 christos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 69 1.16 christos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 70 1.16 christos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 71 1.16 christos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 72 1.16 christos * POSSIBILITY OF SUCH DAMAGES. 73 1.16 christos */ 74 1.16 christos 75 1.16 christos /* 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.16 christos __KERNEL_RCSID(0, "$NetBSD: OsdMisc.c,v 1.16 2017/01/25 13:38:40 christos 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.16 christos #include <external/bsd/acpica/dist/include/acpi.h> 100 1.16 christos #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.16 christos /****************************************************************************** 232 1.16 christos * 233 1.16 christos * FUNCTION: AcpiOsEnterSleep 234 1.16 christos * 235 1.16 christos * PARAMETERS: SleepState - Which sleep state to enter 236 1.16 christos * RegaValue - Register A value 237 1.16 christos * RegbValue - Register B value 238 1.16 christos * 239 1.16 christos * RETURN: Status 240 1.16 christos * 241 1.16 christos * DESCRIPTION: A hook before writing sleep registers to enter the sleep 242 1.16 christos * state. Return AE_CTRL_TERMINATE to skip further sleep register 243 1.16 christos * writes. 244 1.16 christos * 245 1.16 christos *****************************************************************************/ 246 1.16 christos 247 1.16 christos ACPI_STATUS 248 1.16 christos AcpiOsEnterSleep ( 249 1.16 christos UINT8 SleepState, 250 1.16 christos UINT32 RegaValue, 251 1.16 christos UINT32 RegbValue) 252 1.16 christos { 253 1.16 christos 254 1.16 christos return AE_OK; 255 1.16 christos } 256 1.16 christos 257 1.16 christos 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.16 christos 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.16 christos 285 1.16 christos #ifdef ACPI_DEBUG 286 1.16 christos 287 1.16 christos #define _COMPONENT ACPI_CA_DEBUGGER 288 1.16 christos ACPI_MODULE_NAME ("osnetbsdbg") 289 1.16 christos 290 1.16 christos 291 1.16 christos /****************************************************************************** 292 1.16 christos * 293 1.16 christos * FUNCTION: AcpiOsWaitCommandReady 294 1.16 christos * 295 1.16 christos * PARAMETERS: None 296 1.16 christos * 297 1.16 christos * RETURN: Status 298 1.16 christos * 299 1.16 christos * DESCRIPTION: Negotiate with the debugger foreground thread (the user 300 1.16 christos * thread) to wait the readiness of a command. 301 1.16 christos * 302 1.16 christos *****************************************************************************/ 303 1.16 christos 304 1.16 christos ACPI_STATUS 305 1.16 christos AcpiOsWaitCommandReady ( 306 1.16 christos void) 307 1.16 christos { 308 1.16 christos ACPI_STATUS Status; 309 1.16 christos /* Force output to console until a command is entered */ 310 1.16 christos 311 1.16 christos AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 312 1.16 christos 313 1.16 christos /* Different prompt if method is executing */ 314 1.16 christos 315 1.16 christos if (!AcpiGbl_MethodExecuting) 316 1.16 christos { 317 1.16 christos AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT); 318 1.16 christos } 319 1.16 christos else 320 1.16 christos { 321 1.16 christos AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT); 322 1.16 christos } 323 1.16 christos 324 1.16 christos /* Get the user input line */ 325 1.16 christos 326 1.16 christos Status = AcpiOsGetLine (AcpiGbl_DbLineBuf, 327 1.16 christos ACPI_DB_LINE_BUFFER_SIZE, NULL); 328 1.16 christos 329 1.16 christos if (ACPI_FAILURE (Status) && Status != AE_CTRL_TERMINATE) 330 1.16 christos { 331 1.16 christos ACPI_EXCEPTION ((AE_INFO, Status, 332 1.16 christos "While parsing/handling command line")); 333 1.16 christos } 334 1.16 christos return (Status); 335 1.16 christos } 336 1.16 christos 337 1.16 christos 338 1.16 christos /****************************************************************************** 339 1.16 christos * 340 1.16 christos * FUNCTION: AcpiOsNotifyCommandComplete 341 1.16 christos * 342 1.16 christos * PARAMETERS: void 343 1.16 christos * 344 1.16 christos * RETURN: Status 345 1.16 christos * 346 1.16 christos * DESCRIPTION: Negotiate with the debugger foreground thread (the user 347 1.16 christos * thread) to notify the completion of a command. 348 1.16 christos * 349 1.16 christos *****************************************************************************/ 350 1.16 christos 351 1.16 christos ACPI_STATUS 352 1.16 christos AcpiOsNotifyCommandComplete ( 353 1.16 christos void) 354 1.16 christos { 355 1.16 christos 356 1.16 christos return AE_OK; 357 1.16 christos } 358 1.16 christos 359 1.16 christos 360 1.16 christos /****************************************************************************** 361 1.16 christos * 362 1.16 christos * FUNCTION: AcpiOsInitializeDebugger 363 1.16 christos * 364 1.16 christos * PARAMETERS: None 365 1.16 christos * 366 1.16 christos * RETURN: Status 367 1.16 christos * 368 1.16 christos * DESCRIPTION: Initialize OSPM specific part of the debugger 369 1.16 christos * 370 1.16 christos *****************************************************************************/ 371 1.16 christos 372 1.16 christos ACPI_STATUS 373 1.16 christos AcpiOsInitializeDebugger ( 374 1.16 christos void) 375 1.16 christos { 376 1.16 christos return AE_OK; 377 1.16 christos } 378 1.16 christos 379 1.16 christos 380 1.16 christos /****************************************************************************** 381 1.16 christos * 382 1.16 christos * FUNCTION: AcpiOsTerminateDebugger 383 1.16 christos * 384 1.16 christos * PARAMETERS: None 385 1.16 christos * 386 1.16 christos * RETURN: None 387 1.16 christos * 388 1.16 christos * DESCRIPTION: Terminate signals used by the multi-threading debugger 389 1.16 christos * 390 1.16 christos *****************************************************************************/ 391 1.16 christos 392 1.16 christos void 393 1.16 christos AcpiOsTerminateDebugger ( 394 1.16 christos void) 395 1.16 christos { 396 1.16 christos } 397 1.16 christos 398 1.16 christos 399 1.16 christos /****************************************************************************** 400 1.16 christos * 401 1.16 christos * FUNCTION: AcpiRunDebugger 402 1.16 christos * 403 1.16 christos * PARAMETERS: BatchBuffer - Buffer containing commands running in 404 1.16 christos * the batch mode 405 1.16 christos * 406 1.16 christos * RETURN: None 407 1.16 christos * 408 1.16 christos * DESCRIPTION: Run a local/remote debugger 409 1.16 christos * 410 1.16 christos *****************************************************************************/ 411 1.16 christos 412 1.16 christos void 413 1.16 christos AcpiRunDebugger ( 414 1.16 christos char *BatchBuffer) 415 1.16 christos { 416 1.16 christos AcpiDbUserCommands (); 417 1.16 christos } 418 1.16 christos 419 1.16 christos ACPI_EXPORT_SYMBOL (AcpiRunDebugger) 420 1.16 christos #endif 421