acpi_verbose.c revision 1.21
1285612Sdelphij/* $NetBSD: acpi_verbose.c,v 1.21 2022/05/31 20:28:57 mrg Exp $ */ 2132451Sroberto 354359Sroberto/*- 4285612Sdelphij * Copyright (c) 2003, 2007, 2010 The NetBSD Foundation, Inc. 5285612Sdelphij * All rights reserved. 654359Sroberto * 754359Sroberto * This code is derived from software contributed to The NetBSD Foundation 854359Sroberto * by Charles M. Hannum of By Noon Software, Inc, and Jukka Ruohonen. 954359Sroberto * 1054359Sroberto * Redistribution and use in source and binary forms, with or without 1154359Sroberto * modification, are permitted provided that the following conditions 1254359Sroberto * are met: 1354359Sroberto * 1. Redistributions of source code must retain the above copyright 1454359Sroberto * notice, this list of conditions and the following disclaimer. 15106163Sroberto * 2. Redistributions in binary form must reproduce the above copyright 16106163Sroberto * notice, this list of conditions and the following disclaimer in the 1754359Sroberto * documentation and/or other materials provided with the distribution. 18285612Sdelphij * 19285612Sdelphij * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20285612Sdelphij * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21285612Sdelphij * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22285612Sdelphij * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23285612Sdelphij * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24285612Sdelphij * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25285612Sdelphij * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26285612Sdelphij * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27285612Sdelphij * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28285612Sdelphij * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29285612Sdelphij * POSSIBILITY OF SUCH DAMAGE. 30285612Sdelphij */ 31285612Sdelphij 32285612Sdelphij/* 33285612Sdelphij * Copyright 2001, 2003 Wasabi Systems, Inc. 34285612Sdelphij * All rights reserved. 35285612Sdelphij * 36285612Sdelphij * Written by Jason R. Thorpe for Wasabi Systems, Inc. 37285612Sdelphij * 38285612Sdelphij * Redistribution and use in source and binary forms, with or without 39285612Sdelphij * modification, are permitted provided that the following conditions 40285612Sdelphij * are met: 41285612Sdelphij * 1. Redistributions of source code must retain the above copyright 42285612Sdelphij * notice, this list of conditions and the following disclaimer. 43285612Sdelphij * 2. Redistributions in binary form must reproduce the above copyright 44285612Sdelphij * notice, this list of conditions and the following disclaimer in the 45285612Sdelphij * documentation and/or other materials provided with the distribution. 46285612Sdelphij * 3. All advertising materials mentioning features or use of this software 47285612Sdelphij * must display the following acknowledgement: 48285612Sdelphij * This product includes software developed for the NetBSD Project by 49285612Sdelphij * Wasabi Systems, Inc. 50285612Sdelphij * 4. The name of Wasabi Systems, Inc. may not be used to endorse 51285612Sdelphij * or promote products derived from this software without specific prior 52285612Sdelphij * written permission. 53285612Sdelphij * 54285612Sdelphij * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 55285612Sdelphij * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 56285612Sdelphij * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 57285612Sdelphij * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 58285612Sdelphij * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 59285612Sdelphij * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 60285612Sdelphij * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 61285612Sdelphij * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 62285612Sdelphij * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 63285612Sdelphij * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 64285612Sdelphij * POSSIBILITY OF SUCH DAMAGE. 65285612Sdelphij */ 66285612Sdelphij 67285612Sdelphij#include <sys/cdefs.h> 68285612Sdelphij__KERNEL_RCSID(0, "$NetBSD: acpi_verbose.c,v 1.21 2022/05/31 20:28:57 mrg Exp $"); 69285612Sdelphij 70285612Sdelphij#include "pci.h" 71285612Sdelphij 72285612Sdelphij#include <sys/param.h> 7354359Sroberto#include <sys/device.h> 74200576Sroberto#include <sys/kernel.h> 7554359Sroberto#include <sys/systm.h> 76200576Sroberto#include <sys/module.h> 77132451Sroberto 78132451Sroberto#include <dev/acpi/acpireg.h> 79132451Sroberto#include <dev/acpi/acpivar.h> 80132451Sroberto#include <dev/acpi/acpidevs_data.h> 8182498Sroberto#include <dev/acpi/acpi_pci.h> 82132451Sroberto 8354359Sroberto#include <prop/proplib.h> 8454359Sroberto 8554359Sroberto#define _COMPONENT ACPI_UTILITIES 8654359SrobertoACPI_MODULE_NAME ("acpi_verbose") 8754359Sroberto 8854359Srobertostatic bool acpiverbose_modcmd_prop(prop_dictionary_t); 8954359Sroberto 9054359Srobertovoid acpi_print_verbose_real(struct acpi_softc *); 91285612Sdelphijvoid acpi_print_dev_real(const char *); 92182007Srobertostatic void acpi_print_madt(struct acpi_softc *); 93182007Srobertostatic ACPI_STATUS acpi_print_madt_callback(ACPI_SUBTABLE_HEADER *, void *); 94285612Sdelphijstatic void acpi_print_fadt(struct acpi_softc *); 95285612Sdelphijstatic void acpi_print_devnodes(struct acpi_softc *); 96285612Sdelphijstatic void acpi_print_tree(struct acpi_devnode *, uint32_t); 97285612Sdelphij 98285612Sdelphijextern ACPI_TABLE_HEADER *madt_header; 99285612Sdelphij 100285612SdelphijMODULE(MODULE_CLASS_MISC, acpiverbose, NULL); 101285612Sdelphij 102285612Sdelphijstatic int 103285612Sdelphijacpiverbose_modcmd(modcmd_t cmd, void *arg) 104285612Sdelphij{ 105285612Sdelphij static void (*saved_print_verbose)(struct acpi_softc *); 106285612Sdelphij static void (*saved_print_dev)(const char *); 107285612Sdelphij bool dump; 108285612Sdelphij 109285612Sdelphij dump = false; 110285612Sdelphij 111285612Sdelphij switch (cmd) { 112285612Sdelphij 113285612Sdelphij case MODULE_CMD_INIT: 114285612Sdelphij saved_print_verbose = acpi_print_verbose; 115285612Sdelphij saved_print_dev = acpi_print_dev; 116285612Sdelphij acpi_print_verbose = acpi_print_verbose_real; 117285612Sdelphij acpi_print_dev = acpi_print_dev_real; 118285612Sdelphij acpi_verbose_loaded = 1; 119285612Sdelphij 120289997Sglebius if (arg != NULL) 121285612Sdelphij dump = acpiverbose_modcmd_prop(arg); 122285612Sdelphij 123285612Sdelphij if (dump != false) 124285612Sdelphij acpi_print_verbose_real(acpi_softc); 125285612Sdelphij 126285612Sdelphij return 0; 127285612Sdelphij 128285612Sdelphij case MODULE_CMD_FINI: 129285612Sdelphij acpi_print_verbose = saved_print_verbose; 130285612Sdelphij acpi_print_dev = saved_print_dev; 131285612Sdelphij acpi_verbose_loaded = 0; 132182007Sroberto return 0; 133182007Sroberto 134285612Sdelphij default: 135182007Sroberto return ENOTTY; 136182007Sroberto } 137182007Sroberto} 138200576Sroberto 139182007Srobertostatic bool 140243933Seadleracpiverbose_modcmd_prop(prop_dictionary_t dict) 141285612Sdelphij{ 142285612Sdelphij prop_object_t obj; 143285612Sdelphij 144285612Sdelphij obj = prop_dictionary_get(dict, "dump"); 145182007Sroberto 146182007Sroberto if (obj == NULL || prop_object_type(obj) != PROP_TYPE_BOOL) 147285612Sdelphij return false; 148285612Sdelphij 149285612Sdelphij return prop_bool_true(obj); 150285612Sdelphij} 151285612Sdelphij 152285612Sdelphijvoid 153294569Sdelphijacpi_print_verbose_real(struct acpi_softc *sc) 154294569Sdelphij{ 155294569Sdelphij 156294569Sdelphij acpi_print_madt(sc); 157294569Sdelphij acpi_print_fadt(sc); 158294569Sdelphij acpi_print_devnodes(sc); 159285612Sdelphij acpi_print_tree(sc->sc_root, 0); 160285612Sdelphij} 161285612Sdelphij 162285612Sdelphijvoid 163285612Sdelphijacpi_print_dev_real(const char *pnpstr) 164285612Sdelphij{ 165285612Sdelphij int i; 166285612Sdelphij 167285612Sdelphij for (i = 0; i < __arraycount(acpi_knowndevs); i++) { 168285612Sdelphij 169285612Sdelphij if (strcmp(acpi_knowndevs[i].pnp, pnpstr) == 0) 170285612Sdelphij aprint_normal("[%s] ", acpi_knowndevs[i].str); 171285612Sdelphij } 172285612Sdelphij} 173285612Sdelphij 174285612Sdelphijstatic void 175285612Sdelphijacpi_print_madt(struct acpi_softc *sc) 176285612Sdelphij{ 177285612Sdelphij ACPI_STATUS rv; 178285612Sdelphij 179285612Sdelphij rv = acpi_madt_map(); 180285612Sdelphij 181285612Sdelphij if (ACPI_FAILURE(rv) && rv != AE_ALREADY_EXISTS) 182285612Sdelphij return; 183285612Sdelphij 184285612Sdelphij if (madt_header == NULL) 185285612Sdelphij return; 186285612Sdelphij 187285612Sdelphij acpi_madt_walk(acpi_print_madt_callback, sc); 188285612Sdelphij} 189285612Sdelphij 190285612Sdelphijstatic ACPI_STATUS 191285612Sdelphijacpi_print_madt_callback(ACPI_SUBTABLE_HEADER *hdr, void *aux) 192285612Sdelphij{ 193285612Sdelphij struct acpi_softc *sc = aux; 194285612Sdelphij device_t self = sc->sc_dev; 195285612Sdelphij 196285612Sdelphij /* 197285612Sdelphij * See ACPI 4.0, section 5.2.12. 198285612Sdelphij */ 199285612Sdelphij switch (hdr->Type) { 200285612Sdelphij 201285612Sdelphij case ACPI_MADT_TYPE_LOCAL_APIC: 202285612Sdelphij 203285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 204285612Sdelphij "CPU ID %u, LAPIC ID %u, FLAGS 0x%02X", "LAPIC", 205285612Sdelphij ((ACPI_MADT_LOCAL_APIC *)hdr)->ProcessorId, 206285612Sdelphij ((ACPI_MADT_LOCAL_APIC *)hdr)->Id, 207285612Sdelphij ((ACPI_MADT_LOCAL_APIC *)hdr)->LapicFlags); 208285612Sdelphij 209285612Sdelphij break; 210294569Sdelphij 211294569Sdelphij case ACPI_MADT_TYPE_IO_APIC: 212294569Sdelphij 213294569Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 214294569Sdelphij "ID %u, GSI %u, ADDR 0x%04X", "I/O APIC", 215294569Sdelphij ((ACPI_MADT_IO_APIC *)hdr)->Id, 216294569Sdelphij ((ACPI_MADT_IO_APIC *)hdr)->GlobalIrqBase, 217294569Sdelphij ((ACPI_MADT_IO_APIC *)hdr)->Address); 218294569Sdelphij 219294569Sdelphij break; 220294569Sdelphij 221294569Sdelphij case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: 222294569Sdelphij 223294569Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 224294569Sdelphij "BUS %u, IRQ %u, GSI %u, FLAGS 0x%02X", "INTR OVERRIDE", 225285612Sdelphij ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->Bus, 226182007Sroberto ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->SourceIrq, 227182007Sroberto ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->GlobalIrq, 228182007Sroberto ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->IntiFlags); 229285612Sdelphij 230285612Sdelphij break; 231285612Sdelphij 232285612Sdelphij case ACPI_MADT_TYPE_NMI_SOURCE: 233285612Sdelphij 234285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 235294569Sdelphij "GSI %u, FLAGS 0x%02X", "NMI SOURCE", 236294569Sdelphij ((ACPI_MADT_NMI_SOURCE *)hdr)->GlobalIrq, 237294569Sdelphij ((ACPI_MADT_NMI_SOURCE *)hdr)->IntiFlags); 238294569Sdelphij 239294569Sdelphij break; 240294569Sdelphij 241285612Sdelphij case ACPI_MADT_TYPE_LOCAL_APIC_NMI: 242285612Sdelphij 243285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 244285612Sdelphij "CPU ID %u, LINT %u, FLAGS 0x%02X", "LAPIC NMI", 245285612Sdelphij ((ACPI_MADT_LOCAL_APIC_NMI *)hdr)->ProcessorId, 246285612Sdelphij ((ACPI_MADT_LOCAL_APIC_NMI *)hdr)->Lint, 247285612Sdelphij ((ACPI_MADT_LOCAL_APIC_NMI *)hdr)->IntiFlags); 248285612Sdelphij 249285612Sdelphij break; 250285612Sdelphij 251285612Sdelphij case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: 252285612Sdelphij 253285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 254285612Sdelphij "ADDR 0x%016" PRIX64"", "APIC OVERRIDE", 255285612Sdelphij ((ACPI_MADT_LOCAL_APIC_OVERRIDE *)hdr)->Address); 256285612Sdelphij 257285612Sdelphij break; 258285612Sdelphij 259285612Sdelphij case ACPI_MADT_TYPE_IO_SAPIC: 260285612Sdelphij 261285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 262285612Sdelphij "ID %u, GSI %u, ADDR 0x%016" PRIX64"", "I/O SAPIC", 263285612Sdelphij ((ACPI_MADT_IO_SAPIC *)hdr)->Id, 264285612Sdelphij ((ACPI_MADT_IO_SAPIC *)hdr)->GlobalIrqBase, 265285612Sdelphij ((ACPI_MADT_IO_SAPIC *)hdr)->Address); 266285612Sdelphij 267285612Sdelphij break; 268285612Sdelphij 269182007Sroberto case ACPI_MADT_TYPE_LOCAL_SAPIC: 270285612Sdelphij 271285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 272285612Sdelphij "CPU ID %u, ID %u, EID %u, UID %u, FLAGS 0x%02X", "LSAPIC", 273285612Sdelphij ((ACPI_MADT_LOCAL_SAPIC*)hdr)->ProcessorId, 274285612Sdelphij ((ACPI_MADT_LOCAL_SAPIC*)hdr)->Id, 275285612Sdelphij ((ACPI_MADT_LOCAL_SAPIC*)hdr)->Eid, 276285612Sdelphij ((ACPI_MADT_LOCAL_SAPIC*)hdr)->Uid, 277285612Sdelphij ((ACPI_MADT_LOCAL_SAPIC*)hdr)->LapicFlags); 278285612Sdelphij 279285612Sdelphij break; 280285612Sdelphij 281285612Sdelphij case ACPI_MADT_TYPE_INTERRUPT_SOURCE: 282200576Sroberto 283285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: ID %u, EID %u, " 284182007Sroberto "TYPE %u, PMI %u, GSI %u, FLAGS 0x%02X", "INTR SOURCE", 285200576Sroberto ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Id, 286285612Sdelphij ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Eid, 287285612Sdelphij ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Type, 288285612Sdelphij ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->IoSapicVector, 289285612Sdelphij ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->GlobalIrq, 290182007Sroberto ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Flags); 291182007Sroberto 292285612Sdelphij break; 293285612Sdelphij 294285612Sdelphij case ACPI_MADT_TYPE_LOCAL_X2APIC: 295285612Sdelphij 296285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 297285612Sdelphij "ID %u, UID %u, FLAGS 0x%02X", "X2APIC", 298285612Sdelphij ((ACPI_MADT_LOCAL_X2APIC *)hdr)->LocalApicId, 299285612Sdelphij ((ACPI_MADT_LOCAL_X2APIC *)hdr)->Uid, 300182007Sroberto ((ACPI_MADT_LOCAL_X2APIC *)hdr)->LapicFlags); 301285612Sdelphij 302285612Sdelphij break; 303285612Sdelphij 304285612Sdelphij case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: 305285612Sdelphij 306285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s: " 307285612Sdelphij "UID %u, LINT %u, FLAGS 0x%02X", "X2APIC NMI", 308182007Sroberto ((ACPI_MADT_LOCAL_X2APIC_NMI *)hdr)->Uid, 309182007Sroberto ((ACPI_MADT_LOCAL_X2APIC_NMI *)hdr)->Lint, 310285612Sdelphij ((ACPI_MADT_LOCAL_X2APIC_NMI *)hdr)->IntiFlags); 311285612Sdelphij 312285612Sdelphij break; 313285612Sdelphij 314285612Sdelphij default: 315285612Sdelphij aprint_normal_dev(self, "[MADT] %-15s", "UNKNOWN"); 316285612Sdelphij break; 317285612Sdelphij } 318285612Sdelphij 319285612Sdelphij aprint_normal("\n"); 320285612Sdelphij 321285612Sdelphij return AE_OK; 322285612Sdelphij} 323285612Sdelphij 324285612Sdelphijstatic void 325285612Sdelphijacpi_print_fadt(struct acpi_softc *sc) 326285612Sdelphij{ 327285612Sdelphij uint32_t i; 328285612Sdelphij 329285612Sdelphij /* 330285612Sdelphij * See ACPI 4.0, section 5.2.9. 331285612Sdelphij */ 332285612Sdelphij struct acpi_fadt { 333285612Sdelphij uint32_t fadt_offset; 334182007Sroberto const char *fadt_name; 335182007Sroberto uint64_t fadt_value; 336285612Sdelphij }; 337285612Sdelphij 338285612Sdelphij struct acpi_fadt_genaddr { 339182007Sroberto uint32_t fadt_offset; 340132451Sroberto const char *fadt_name; 341285612Sdelphij ACPI_GENERIC_ADDRESS fadt_value; 34254359Sroberto }; 343285612Sdelphij 344182007Sroberto const struct acpi_fadt acpi_fadt_table[] = { 345132451Sroberto 346132451Sroberto { 36, "FACS", AcpiGbl_FADT.Facs }, 347132451Sroberto { 40, "DSDT", AcpiGbl_FADT.Dsdt }, 34854359Sroberto { 44, "INT_MODEL", AcpiGbl_FADT.Model }, 349289997Sglebius { 45, "PM_PROFILE", AcpiGbl_FADT.PreferredProfile }, 350285612Sdelphij { 46, "SCI_INT", AcpiGbl_FADT.SciInterrupt }, 351285612Sdelphij { 48, "SMI_CMD", AcpiGbl_FADT.SmiCommand }, 352285612Sdelphij { 52, "ACPI_ENABLE", AcpiGbl_FADT.AcpiEnable }, 353285612Sdelphij { 53, "ACPI_DISABLE", AcpiGbl_FADT.AcpiDisable }, 354285612Sdelphij { 54, "S4BIOS_REQ", AcpiGbl_FADT.S4BiosRequest }, 35554359Sroberto { 55, "PSTATE_CNT", AcpiGbl_FADT.PstateControl }, 356132451Sroberto { 56, "PM1a_EVT_BLK", AcpiGbl_FADT.Pm1aEventBlock }, 35754359Sroberto { 60, "PM1b_EVT_BLK", AcpiGbl_FADT.Pm1bEventBlock }, 358289997Sglebius { 64, "PM1a_CNT_BLK", AcpiGbl_FADT.Pm1aControlBlock }, 359285612Sdelphij { 68, "PM1b_CNT_BLK", AcpiGbl_FADT.Pm1bControlBlock }, 36054359Sroberto { 72, "PM2_CNT_BLK", AcpiGbl_FADT.Pm2ControlBlock }, 361285612Sdelphij { 76, "PM_TMR_BLK", AcpiGbl_FADT.PmTimerBlock }, 36254359Sroberto { 80, "GPE0_BLK", AcpiGbl_FADT.Gpe0Block }, 363132451Sroberto { 84, "GPE1_BLK", AcpiGbl_FADT.Gpe1Block }, 364285612Sdelphij { 88, "PM1_EVT_LEN", AcpiGbl_FADT.Pm1EventLength }, 365285612Sdelphij { 89, "PM1_CNT_LEN", AcpiGbl_FADT.Pm1ControlLength }, 366285612Sdelphij { 90, "PM2_CNT_LEN", AcpiGbl_FADT.Pm2ControlLength }, 367285612Sdelphij { 91, "PM_TMR_LEN", AcpiGbl_FADT.PmTimerLength }, 368285612Sdelphij { 92, "GPE0_BLK_LEN", AcpiGbl_FADT.Gpe0BlockLength }, 369285612Sdelphij { 93, "GPE1_BLK_LEN", AcpiGbl_FADT.Gpe1BlockLength }, 370132451Sroberto { 94, "GPE1_BASE", AcpiGbl_FADT.Gpe1Base }, 37154359Sroberto { 95, "CST_CNT", AcpiGbl_FADT.CstControl }, 372132451Sroberto { 96, "P_LVL2_LAT", AcpiGbl_FADT.C2Latency }, 37356746Sroberto { 98, "P_LVL3_LAT", AcpiGbl_FADT.C3Latency }, 374285612Sdelphij { 100, "FLUSH_SIZE", AcpiGbl_FADT.FlushSize }, 375285612Sdelphij { 102, "FLUSH_STRIDE", AcpiGbl_FADT.FlushStride }, 376285612Sdelphij { 104, "DUTY_OFFSET", AcpiGbl_FADT.DutyOffset }, 377132451Sroberto { 105, "DUTY_WIDTH", AcpiGbl_FADT.DutyWidth }, 378132451Sroberto { 106, "DAY_ALRM", AcpiGbl_FADT.DayAlarm }, 379132451Sroberto { 107, "MON_ALRM", AcpiGbl_FADT.MonthAlarm }, 380285612Sdelphij { 108, "CENTURY", AcpiGbl_FADT.Century }, 381132451Sroberto { 109, "IAPC_BOOT_ARCH",AcpiGbl_FADT.BootFlags }, 382106163Sroberto { 128, "RESET_VALUE", AcpiGbl_FADT.ResetValue }, 383285612Sdelphij { 129, "ARM_BOOT_ARCH", AcpiGbl_FADT.ArmBootFlags }, 384200576Sroberto { 132, "X_FACS", AcpiGbl_FADT.XFacs }, 385285612Sdelphij { 140, "X_DSDT", AcpiGbl_FADT.XDsdt }, 386285612Sdelphij }; 387285612Sdelphij 388285612Sdelphij const struct acpi_fadt_genaddr acpi_fadt_genaddr_table[] = { 389285612Sdelphij 390200576Sroberto { 116, "RESET_REG", AcpiGbl_FADT.ResetRegister }, 391285612Sdelphij { 148, "X_PM1a_EVT_BLK",AcpiGbl_FADT.XPm1aEventBlock }, 392285612Sdelphij { 160, "X_PM1b_EVT_BLK",AcpiGbl_FADT.XPm1bEventBlock }, 393285612Sdelphij { 172, "X_PM1a_CNT_BLK",AcpiGbl_FADT.XPm1aControlBlock }, 394200576Sroberto { 184, "X_PM1b_CNT_BLK",AcpiGbl_FADT.XPm1bControlBlock }, 395132451Sroberto { 196, "X_PM2_CNT_BLK", AcpiGbl_FADT.XPm2ControlBlock }, 396132451Sroberto { 208, "X_PM_TMR_BLK", AcpiGbl_FADT.XPmTimerBlock }, 397132451Sroberto { 220, "X_GPE0_BLK", AcpiGbl_FADT.XGpe0Block }, 39882498Sroberto { 232, "X_GPE1_BLK", AcpiGbl_FADT.XGpe1Block }, 399285612Sdelphij { 244, "SLEEP_CTRL_REG",AcpiGbl_FADT.SleepControl }, 400285612Sdelphij { 256, "SLEEP_STAT_REG",AcpiGbl_FADT.SleepStatus }, 401285612Sdelphij }; 402285612Sdelphij 403285612Sdelphij const struct acpi_fadt acpi_fadt_flags[] = { 404285612Sdelphij 40554359Sroberto { 0, "WBINVD", ACPI_FADT_WBINVD }, 406285612Sdelphij { 1, "WBINVD_FLUSH", ACPI_FADT_WBINVD_FLUSH }, 407285612Sdelphij { 2, "PROC_C1", ACPI_FADT_C1_SUPPORTED }, 408285612Sdelphij { 3, "P_LVL2_UP", ACPI_FADT_C2_MP_SUPPORTED }, 409132451Sroberto { 4, "PWR_BUTTON", ACPI_FADT_POWER_BUTTON }, 410182007Sroberto { 5, "SLP_BUTTON", ACPI_FADT_SLEEP_BUTTON }, 411182007Sroberto { 6, "FIX_RTC", ACPI_FADT_FIXED_RTC }, 412182007Sroberto { 7, "RTC_S4", ACPI_FADT_S4_RTC_WAKE }, 41354359Sroberto { 8, "TMR_VAL_EXT", ACPI_FADT_32BIT_TIMER }, 414132451Sroberto { 9, "DCK_CAP", ACPI_FADT_DOCKING_SUPPORTED }, 415182007Sroberto { 10, "RESET_REG_SUP",ACPI_FADT_RESET_REGISTER }, 416285612Sdelphij { 11, "SEALED_CASE", ACPI_FADT_SEALED_CASE }, 417285612Sdelphij { 12, "HEADLESS", ACPI_FADT_HEADLESS }, 41854359Sroberto { 13, "CPU_SW_SLP", ACPI_FADT_SLEEP_TYPE }, 419200576Sroberto { 14, "PCI_EXP_WAK", ACPI_FADT_PCI_EXPRESS_WAKE }, 420289997Sglebius { 15, "PLATFORM_CLK", ACPI_FADT_PLATFORM_CLOCK }, 421132451Sroberto { 16, "S4_RTC_STS", ACPI_FADT_S4_RTC_VALID }, 422132451Sroberto { 17, "REMOTE_POWER", ACPI_FADT_REMOTE_POWER_ON }, 42354359Sroberto { 18, "APIC_CLUSTER", ACPI_FADT_APIC_CLUSTER }, 424182007Sroberto { 19, "APIC_PHYSICAL",ACPI_FADT_APIC_PHYSICAL }, 42554359Sroberto { 20, "HW_REDUCED", ACPI_FADT_HW_REDUCED }, 426132451Sroberto { 21, "LOW_POWER_S0", ACPI_FADT_LOW_POWER_S0 }, 42754359Sroberto }; 42854359Sroberto 429132451Sroberto for (i = 0; i < __arraycount(acpi_fadt_table); i++) { 430285612Sdelphij 43154359Sroberto aprint_normal_dev(sc->sc_dev, 43254359Sroberto "[FADT] %-15s: 0x%016" PRIX64"\n", 43354359Sroberto acpi_fadt_table[i].fadt_name, 43482498Sroberto acpi_fadt_table[i].fadt_value); 435285612Sdelphij } 436285612Sdelphij 437200576Sroberto for (i = 0; i < __arraycount(acpi_fadt_genaddr_table); i++) { 438285612Sdelphij 439285612Sdelphij aprint_normal_dev(sc->sc_dev, 440285612Sdelphij "[FADT] %-15s: 0x%016" PRIX64", " 441285612Sdelphij "SPACE ID %u, BIT WIDTH %u, BIT OFFSET %u, " 442285612Sdelphij "ACCESS WIDTH %u\n", 443285612Sdelphij acpi_fadt_genaddr_table[i].fadt_name, 444285612Sdelphij acpi_fadt_genaddr_table[i].fadt_value.Address, 445285612Sdelphij acpi_fadt_genaddr_table[i].fadt_value.SpaceId, 446285612Sdelphij acpi_fadt_genaddr_table[i].fadt_value.BitWidth, 447285612Sdelphij acpi_fadt_genaddr_table[i].fadt_value.BitOffset, 448285612Sdelphij acpi_fadt_genaddr_table[i].fadt_value.AccessWidth); 449285612Sdelphij } 450285612Sdelphij 451285612Sdelphij for (i = 0; i < __arraycount(acpi_fadt_flags); i++) { 452285612Sdelphij 453285612Sdelphij aprint_normal_dev(sc->sc_dev, 454285612Sdelphij "[FADT] %-15s: 0x%016" PRIX64"\n", 455285612Sdelphij acpi_fadt_flags[i].fadt_name, AcpiGbl_FADT.Flags & 456285612Sdelphij acpi_fadt_flags[i].fadt_value); 457285612Sdelphij 458285612Sdelphij KASSERT(i == acpi_fadt_flags[i].fadt_offset); 459285612Sdelphij KASSERT(__BIT(acpi_fadt_flags[i].fadt_offset) == 460285612Sdelphij acpi_fadt_flags[i].fadt_value); 461285612Sdelphij } 462285612Sdelphij} 463285612Sdelphij 464285612Sdelphijstatic void 465285612Sdelphijacpi_print_devnodes(struct acpi_softc *sc) 466285612Sdelphij{ 467285612Sdelphij struct acpi_devnode *ad; 468285612Sdelphij ACPI_DEVICE_INFO *di; 469285612Sdelphij 470285612Sdelphij SIMPLEQ_FOREACH(ad, &sc->sc_head, ad_list) { 471285612Sdelphij 472285612Sdelphij di = ad->ad_devinfo; 473285612Sdelphij aprint_normal_dev(sc->sc_dev, "[%-4s] ", ad->ad_name); 474285612Sdelphij 475285612Sdelphij aprint_normal("HID %-10s ", 476285612Sdelphij ((di->Valid & ACPI_VALID_HID) != 0) ? 477285612Sdelphij di->HardwareId.String: "-"); 478285612Sdelphij 479285612Sdelphij aprint_normal("UID %-4s ", 480285612Sdelphij ((di->Valid & ACPI_VALID_UID) != 0) ? 481285612Sdelphij di->UniqueId.String : "-"); 482285612Sdelphij 483285612Sdelphij if ((di->Valid & ACPI_VALID_ADR) != 0) 484285612Sdelphij aprint_normal("ADR 0x%016" PRIX64"", di->Address); 485285612Sdelphij else 486285612Sdelphij aprint_normal("ADR -"); 487285612Sdelphij 488285612Sdelphij aprint_normal("\n"); 489285612Sdelphij } 490285612Sdelphij aprint_normal("\n"); 491285612Sdelphij} 492285612Sdelphij 493285612Sdelphijstatic void 494285612Sdelphijacpi_print_tree(struct acpi_devnode *ad, uint32_t level) 495285612Sdelphij{ 496285612Sdelphij struct acpi_devnode *child; 497106163Sroberto device_t dev; 498285612Sdelphij char buf[5]; 499285612Sdelphij uint32_t i; 50054359Sroberto 501132451Sroberto for (i = 0; i < level; i++) 502132451Sroberto aprint_normal(" "); 503132451Sroberto 504132451Sroberto buf[0] = '\0'; 505200576Sroberto 506132451Sroberto if ((ad->ad_flags & ACPI_DEVICE_POWER) != 0) 507285612Sdelphij (void)strlcat(buf, "P", sizeof(buf)); 50882498Sroberto 509285612Sdelphij if ((ad->ad_flags & ACPI_DEVICE_WAKEUP) != 0) 510132451Sroberto (void)strlcat(buf, "W", sizeof(buf)); 511285612Sdelphij 512285612Sdelphij if ((ad->ad_flags & ACPI_DEVICE_EJECT) != 0) 513285612Sdelphij (void)strlcat(buf, "E", sizeof(buf)); 514285612Sdelphij 51554359Sroberto aprint_normal("%-5s [%02u] [%s]", ad->ad_name, ad->ad_type, buf); 516285612Sdelphij 51754359Sroberto if (ad->ad_device != NULL) 518285612Sdelphij aprint_normal(" <%s>", device_xname(ad->ad_device)); 519132451Sroberto 520132451Sroberto#if NPCI > 0 521285612Sdelphij if (ad->ad_pciinfo != NULL) { 522285612Sdelphij 523285612Sdelphij aprint_normal(" (PCI)"); 524285612Sdelphij 525285612Sdelphij if ((ad->ad_pciinfo->ap_flags & ACPI_PCI_INFO_DEVICE) != 0) 526285612Sdelphij aprint_normal(" @ 0x%02X:0x%02X:0x%02X:0x%02X", 527285612Sdelphij ad->ad_pciinfo->ap_segment, 528285612Sdelphij ad->ad_pciinfo->ap_bus, 529285612Sdelphij ad->ad_pciinfo->ap_device, 530285612Sdelphij ad->ad_pciinfo->ap_function); 531132451Sroberto 53254359Sroberto if ((ad->ad_devinfo->Flags & ACPI_PCI_ROOT_BRIDGE) != 0) 533285612Sdelphij aprint_normal(" [R]"); 534285612Sdelphij 535285612Sdelphij if ((ad->ad_pciinfo->ap_flags & ACPI_PCI_INFO_BRIDGE) != 0) 536285612Sdelphij aprint_normal(" [B] -> 0x%02X:0x%02X", 537285612Sdelphij ad->ad_pciinfo->ap_segment, 538285612Sdelphij ad->ad_pciinfo->ap_downbus); 539285612Sdelphij 540285612Sdelphij dev = acpi_pcidev_find_dev(ad); 541285612Sdelphij 542285612Sdelphij if (dev != NULL) 543285612Sdelphij aprint_normal(" <%s>", device_xname(dev)); 544285612Sdelphij } 545285612Sdelphij#endif 546285612Sdelphij 547285612Sdelphij aprint_normal("\n"); 54854359Sroberto 549285612Sdelphij SIMPLEQ_FOREACH(child, &ad->ad_child_head, ad_child_list) 550285612Sdelphij acpi_print_tree(child, level + 1); 551285612Sdelphij} 552200576Sroberto