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