1 1.8 thorpej /* $NetBSD: acpi_debug.c,v 1.8 2020/07/08 13:41:53 thorpej Exp $ */ 2 1.1 jruoho 3 1.1 jruoho /*- 4 1.1 jruoho * Copyright (c) 2010 Jukka Ruohonen <jruohonen (at) iki.fi> 5 1.1 jruoho * All rights reserved. 6 1.1 jruoho * 7 1.1 jruoho * Redistribution and use in source and binary forms, with or without 8 1.1 jruoho * modification, are permitted provided that the following conditions 9 1.1 jruoho * are met: 10 1.1 jruoho * 11 1.1 jruoho * 1. Redistributions of source code must retain the above copyright 12 1.1 jruoho * notice, this list of conditions and the following disclaimer. 13 1.1 jruoho * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 jruoho * notice, this list of conditions and the following disclaimer in the 15 1.1 jruoho * documentation and/or other materials provided with the distribution. 16 1.1 jruoho * 17 1.1 jruoho * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 1.1 jruoho * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 1.1 jruoho * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 1.1 jruoho * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 1.1 jruoho * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 1.1 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 1.1 jruoho * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 jruoho * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 jruoho * SUCH DAMAGE. 28 1.1 jruoho */ 29 1.1 jruoho #include <sys/cdefs.h> 30 1.8 thorpej __KERNEL_RCSID(0, "$NetBSD: acpi_debug.c,v 1.8 2020/07/08 13:41:53 thorpej Exp $"); 31 1.1 jruoho 32 1.1 jruoho #include <sys/param.h> 33 1.1 jruoho #include <sys/sysctl.h> 34 1.1 jruoho 35 1.1 jruoho #include <dev/acpi/acpireg.h> 36 1.1 jruoho #include <dev/acpi/acpivar.h> 37 1.1 jruoho 38 1.1 jruoho #include <prop/proplib.h> 39 1.1 jruoho 40 1.1 jruoho #ifdef ACPI_DEBUG 41 1.1 jruoho 42 1.1 jruoho #define _COMPONENT ACPI_UTILITIES 43 1.1 jruoho ACPI_MODULE_NAME ("acpi_debug") 44 1.1 jruoho 45 1.1 jruoho #define ACPI_DEBUG_MAX 64 46 1.1 jruoho #define ACPI_DEBUG_NONE 0 47 1.1 jruoho 48 1.1 jruoho #define ACPI_DEBUG_ADD(d, x) \ 49 1.1 jruoho do { \ 50 1.1 jruoho (void)prop_dictionary_set_uint32(d, #x, x); \ 51 1.1 jruoho \ 52 1.1 jruoho } while (/* CONSTCOND */ 0) 53 1.1 jruoho 54 1.1 jruoho 55 1.1 jruoho static prop_dictionary_t acpi_debug_layer_d; 56 1.1 jruoho static prop_dictionary_t acpi_debug_level_d; 57 1.1 jruoho static char acpi_debug_layer_s[ACPI_DEBUG_MAX]; 58 1.1 jruoho static char acpi_debug_level_s[ACPI_DEBUG_MAX]; 59 1.1 jruoho 60 1.1 jruoho static int acpi_debug_create(void); 61 1.1 jruoho static const char *acpi_debug_getkey(prop_dictionary_t, uint32_t); 62 1.1 jruoho static int acpi_debug_sysctl_layer(SYSCTLFN_PROTO); 63 1.1 jruoho static int acpi_debug_sysctl_level(SYSCTLFN_PROTO); 64 1.1 jruoho 65 1.1 jruoho void 66 1.1 jruoho acpi_debug_init(void) 67 1.1 jruoho { 68 1.2 jruoho const struct sysctlnode *rnode; 69 1.2 jruoho const char *layer, *level; 70 1.1 jruoho int rv; 71 1.1 jruoho 72 1.1 jruoho KASSERT(acpi_debug_layer_d == NULL); 73 1.1 jruoho KASSERT(acpi_debug_level_d == NULL); 74 1.1 jruoho 75 1.1 jruoho rv = acpi_debug_create(); 76 1.1 jruoho 77 1.1 jruoho if (rv != 0) 78 1.1 jruoho goto fail; 79 1.1 jruoho 80 1.2 jruoho rv = sysctl_createv(NULL, 0, NULL, &rnode, 81 1.1 jruoho CTLFLAG_PERMANENT, CTLTYPE_NODE, "acpi", 82 1.2 jruoho NULL, NULL, 0, NULL, 0, 83 1.5 pooka CTL_HW, CTL_CREATE, CTL_EOL); 84 1.1 jruoho 85 1.1 jruoho if (rv != 0) 86 1.1 jruoho goto fail; 87 1.1 jruoho 88 1.2 jruoho rv = sysctl_createv(NULL, 0, &rnode, &rnode, 89 1.2 jruoho 0, CTLTYPE_NODE, "debug", 90 1.2 jruoho SYSCTL_DESCR("ACPI debug subtree"), 91 1.2 jruoho NULL, 0, NULL, 0, 92 1.2 jruoho CTL_CREATE, CTL_EOL); 93 1.2 jruoho 94 1.2 jruoho if (rv != 0) 95 1.2 jruoho goto fail; 96 1.2 jruoho 97 1.2 jruoho rv = sysctl_createv(NULL, 0, &rnode, NULL, 98 1.2 jruoho CTLFLAG_READWRITE, CTLTYPE_STRING, "layer", 99 1.1 jruoho SYSCTL_DESCR("ACPI debug layer"), 100 1.1 jruoho acpi_debug_sysctl_layer, 0, acpi_debug_layer_s, ACPI_DEBUG_MAX, 101 1.2 jruoho CTL_CREATE, CTL_EOL); 102 1.1 jruoho 103 1.1 jruoho if (rv != 0) 104 1.1 jruoho goto fail; 105 1.1 jruoho 106 1.2 jruoho rv = sysctl_createv(NULL, 0, &rnode, NULL, 107 1.2 jruoho CTLFLAG_READWRITE, CTLTYPE_STRING, "level", 108 1.1 jruoho SYSCTL_DESCR("ACPI debug level"), 109 1.1 jruoho acpi_debug_sysctl_level, 0, acpi_debug_level_s, ACPI_DEBUG_MAX, 110 1.2 jruoho CTL_CREATE, CTL_EOL); 111 1.1 jruoho 112 1.1 jruoho if (rv != 0) 113 1.1 jruoho goto fail; 114 1.1 jruoho 115 1.3 jruoho rv = sysctl_createv(NULL, 0, &rnode, NULL, 116 1.3 jruoho CTLFLAG_READWRITE, CTLTYPE_BOOL, "object", 117 1.3 jruoho SYSCTL_DESCR("ACPI debug object"), 118 1.3 jruoho NULL, 0, &AcpiGbl_EnableAmlDebugObject, 0, 119 1.3 jruoho CTL_CREATE, CTL_EOL); 120 1.3 jruoho 121 1.3 jruoho if (rv != 0) 122 1.3 jruoho goto fail; 123 1.3 jruoho 124 1.1 jruoho layer = acpi_debug_getkey(acpi_debug_layer_d, AcpiDbgLayer); 125 1.1 jruoho level = acpi_debug_getkey(acpi_debug_level_d, AcpiDbgLevel); 126 1.1 jruoho 127 1.7 chs strlcpy(acpi_debug_layer_s, layer, ACPI_DEBUG_MAX); 128 1.7 chs strlcpy(acpi_debug_level_s, level, ACPI_DEBUG_MAX); 129 1.1 jruoho 130 1.1 jruoho return; 131 1.1 jruoho 132 1.1 jruoho fail: 133 1.1 jruoho aprint_error("acpi0: failed to initialize ACPI debug\n"); 134 1.1 jruoho } 135 1.1 jruoho 136 1.1 jruoho static int 137 1.1 jruoho acpi_debug_create(void) 138 1.1 jruoho { 139 1.1 jruoho 140 1.1 jruoho acpi_debug_layer_d = prop_dictionary_create(); 141 1.1 jruoho acpi_debug_level_d = prop_dictionary_create(); 142 1.1 jruoho 143 1.1 jruoho KASSERT(acpi_debug_layer_d != NULL); 144 1.1 jruoho KASSERT(acpi_debug_level_d != NULL); 145 1.1 jruoho 146 1.1 jruoho /* 147 1.1 jruoho * General components. 148 1.1 jruoho */ 149 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_UTILITIES); 150 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_HARDWARE); 151 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EVENTS); 152 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_TABLES); 153 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_NAMESPACE); 154 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_PARSER); 155 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DISPATCHER); 156 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EXECUTER); 157 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_RESOURCES); 158 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_CA_DEBUGGER); 159 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_OS_SERVICES); 160 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_CA_DISASSEMBLER); 161 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_COMPILER); 162 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_TOOLS); 163 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EXAMPLE); 164 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DRIVER); 165 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_ALL_COMPONENTS); 166 1.1 jruoho 167 1.1 jruoho /* 168 1.1 jruoho * NetBSD specific components. 169 1.1 jruoho */ 170 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_BUS_COMPONENT); 171 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_ACAD_COMPONENT); 172 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_BAT_COMPONENT); 173 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_BUTTON_COMPONENT); 174 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_EC_COMPONENT); 175 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_LID_COMPONENT); 176 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_RESOURCE_COMPONENT); 177 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_TZ_COMPONENT); 178 1.4 gsutre ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DISPLAY_COMPONENT); 179 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_ALL_DRIVERS); 180 1.1 jruoho 181 1.1 jruoho /* 182 1.1 jruoho * Debug levels. 183 1.1 jruoho */ 184 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INIT); 185 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_DEBUG_OBJECT); 186 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INFO); 187 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_ALL_EXCEPTIONS); 188 1.1 jruoho 189 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INIT_NAMES); 190 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_PARSE); 191 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_LOAD); 192 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_DISPATCH); 193 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_EXEC); 194 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_NAMES); 195 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_OPREGION); 196 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_BFIELD); 197 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_TABLES); 198 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VALUES); 199 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_OBJECTS); 200 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_RESOURCES); 201 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_USER_REQUESTS); 202 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_PACKAGE); 203 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSITY1); 204 1.1 jruoho 205 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_ALLOCATIONS); 206 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_FUNCTIONS); 207 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_OPTIMIZATIONS); 208 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSITY2); 209 1.1 jruoho 210 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_MUTEX); 211 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_THREADS); 212 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_IO); 213 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_INTERRUPTS); 214 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSITY3); 215 1.1 jruoho 216 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_AML_DISASSEMBLE); 217 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSE_INFO); 218 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_FULL_TABLES); 219 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_EVENTS); 220 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_LV_VERBOSE); 221 1.1 jruoho 222 1.6 christos ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_NORMAL_DEFAULT); 223 1.6 christos 224 1.1 jruoho /* 225 1.1 jruoho * The default debug level. 226 1.1 jruoho */ 227 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_DEBUG_DEFAULT); 228 1.1 jruoho 229 1.1 jruoho /* 230 1.1 jruoho * A custom ACPI_DEBUG_NONE disables debugging. 231 1.1 jruoho */ 232 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_layer_d, ACPI_DEBUG_NONE); 233 1.1 jruoho ACPI_DEBUG_ADD(acpi_debug_level_d, ACPI_DEBUG_NONE); 234 1.1 jruoho 235 1.1 jruoho prop_dictionary_make_immutable(acpi_debug_layer_d); 236 1.1 jruoho prop_dictionary_make_immutable(acpi_debug_level_d); 237 1.1 jruoho 238 1.1 jruoho return 0; 239 1.1 jruoho } 240 1.1 jruoho 241 1.1 jruoho static const char * 242 1.1 jruoho acpi_debug_getkey(prop_dictionary_t dict, uint32_t arg) 243 1.1 jruoho { 244 1.1 jruoho prop_object_iterator_t i; 245 1.1 jruoho prop_object_t obj, val; 246 1.1 jruoho const char *key; 247 1.1 jruoho uint32_t num; 248 1.1 jruoho 249 1.1 jruoho i = prop_dictionary_iterator(dict); 250 1.1 jruoho 251 1.1 jruoho while ((obj = prop_object_iterator_next(i)) != NULL) { 252 1.1 jruoho 253 1.8 thorpej key = prop_dictionary_keysym_value(obj); 254 1.1 jruoho val = prop_dictionary_get(dict, key); 255 1.8 thorpej num = prop_number_unsigned_value(val); 256 1.1 jruoho 257 1.1 jruoho if (arg == num) 258 1.1 jruoho return key; 259 1.1 jruoho } 260 1.1 jruoho 261 1.1 jruoho return "UNKNOWN"; 262 1.1 jruoho } 263 1.1 jruoho 264 1.1 jruoho static int 265 1.1 jruoho acpi_debug_sysctl_layer(SYSCTLFN_ARGS) 266 1.1 jruoho { 267 1.1 jruoho char buf[ACPI_DEBUG_MAX]; 268 1.1 jruoho struct sysctlnode node; 269 1.1 jruoho prop_object_t obj; 270 1.1 jruoho int error; 271 1.1 jruoho 272 1.1 jruoho node = *rnode; 273 1.1 jruoho node.sysctl_data = buf; 274 1.1 jruoho 275 1.1 jruoho (void)memcpy(node.sysctl_data, rnode->sysctl_data, ACPI_DEBUG_MAX); 276 1.1 jruoho 277 1.1 jruoho error = sysctl_lookup(SYSCTLFN_CALL(&node)); 278 1.1 jruoho 279 1.1 jruoho if (error || newp == NULL) 280 1.1 jruoho return error; 281 1.1 jruoho 282 1.1 jruoho obj = prop_dictionary_get(acpi_debug_layer_d, node.sysctl_data); 283 1.1 jruoho 284 1.1 jruoho if (obj == NULL) 285 1.1 jruoho return EINVAL; 286 1.1 jruoho 287 1.8 thorpej AcpiDbgLayer = prop_number_unsigned_value(obj); 288 1.1 jruoho 289 1.1 jruoho (void)memcpy(rnode->sysctl_data, node.sysctl_data, ACPI_DEBUG_MAX); 290 1.1 jruoho 291 1.1 jruoho return 0; 292 1.1 jruoho } 293 1.1 jruoho 294 1.1 jruoho static int 295 1.1 jruoho acpi_debug_sysctl_level(SYSCTLFN_ARGS) 296 1.1 jruoho { 297 1.1 jruoho char buf[ACPI_DEBUG_MAX]; 298 1.1 jruoho struct sysctlnode node; 299 1.1 jruoho prop_object_t obj; 300 1.1 jruoho int error; 301 1.1 jruoho 302 1.1 jruoho node = *rnode; 303 1.1 jruoho node.sysctl_data = buf; 304 1.1 jruoho 305 1.1 jruoho (void)memcpy(node.sysctl_data, rnode->sysctl_data, ACPI_DEBUG_MAX); 306 1.1 jruoho 307 1.1 jruoho error = sysctl_lookup(SYSCTLFN_CALL(&node)); 308 1.1 jruoho 309 1.1 jruoho if (error || newp == NULL) 310 1.1 jruoho return error; 311 1.1 jruoho 312 1.1 jruoho obj = prop_dictionary_get(acpi_debug_level_d, node.sysctl_data); 313 1.1 jruoho 314 1.1 jruoho if (obj == NULL) 315 1.1 jruoho return EINVAL; 316 1.1 jruoho 317 1.8 thorpej AcpiDbgLevel = prop_number_unsigned_value(obj); 318 1.1 jruoho 319 1.1 jruoho (void)memcpy(rnode->sysctl_data, node.sysctl_data, ACPI_DEBUG_MAX); 320 1.1 jruoho 321 1.1 jruoho return 0; 322 1.1 jruoho } 323 1.1 jruoho 324 1.1 jruoho #endif /* ACPI_DEBUG */ 325