Sat Aug 7 14:17:22 2010 UTC ()
Dump MADT in ACPIVERBOSE.


(jruoho)
diff -r1.7 -r1.8 src/sys/dev/acpi/acpi_verbose.c

cvs diff -r1.7 -r1.8 src/sys/dev/acpi/acpi_verbose.c (expand / switch to unified diff)

--- src/sys/dev/acpi/acpi_verbose.c 2010/08/07 08:59:51 1.7
+++ src/sys/dev/acpi/acpi_verbose.c 2010/08/07 14:17:21 1.8
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: acpi_verbose.c,v 1.7 2010/08/07 08:59:51 jruoho Exp $ */ 1/* $NetBSD: acpi_verbose.c,v 1.8 2010/08/07 14:17:21 jruoho Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2003, 2007, 2010 The NetBSD Foundation, Inc. 4 * Copyright (c) 2003, 2007, 2010 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Charles M. Hannum of By Noon Software, Inc, and Jukka Ruohonen. 8 * by Charles M. Hannum of By Noon Software, Inc, and Jukka Ruohonen.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -55,43 +55,47 @@ @@ -55,43 +55,47 @@
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
56 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 56 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
57 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 57 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
58 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 58 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
59 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 59 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
60 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 60 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
61 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 61 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
62 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 62 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
63 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 63 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
64 * POSSIBILITY OF SUCH DAMAGE. 64 * POSSIBILITY OF SUCH DAMAGE.
65 */ 65 */
66 66
67#include <sys/cdefs.h> 67#include <sys/cdefs.h>
68__KERNEL_RCSID(0, "$NetBSD: acpi_verbose.c,v 1.7 2010/08/07 08:59:51 jruoho Exp $"); 68__KERNEL_RCSID(0, "$NetBSD: acpi_verbose.c,v 1.8 2010/08/07 14:17:21 jruoho Exp $");
69 69
70#include <sys/param.h> 70#include <sys/param.h>
71#include <sys/device.h> 71#include <sys/device.h>
72#include <sys/kernel.h> 72#include <sys/kernel.h>
73#include <sys/systm.h> 73#include <sys/systm.h>
74#include <sys/module.h> 74#include <sys/module.h>
75 75
76#include <dev/acpi/acpireg.h> 76#include <dev/acpi/acpireg.h>
77#include <dev/acpi/acpivar.h> 77#include <dev/acpi/acpivar.h>
78#include <dev/acpi/acpidevs_data.h> 78#include <dev/acpi/acpidevs_data.h>
79 79
80void acpi_print_verbose_real(struct acpi_softc *); 80void acpi_print_verbose_real(struct acpi_softc *);
81void acpi_print_dev_real(const char *); 81void acpi_print_dev_real(const char *);
82static void acpi_print_fadt(struct acpi_softc *); 82static void acpi_print_madt(struct acpi_softc *);
83static void acpi_print_devnodes(struct acpi_softc *); 83static ACPI_STATUS acpi_print_madt_callback(ACPI_SUBTABLE_HEADER *, void *);
84static void acpi_print_tree(struct acpi_devnode *, uint32_t); 84static void acpi_print_fadt(struct acpi_softc *);
 85static void acpi_print_devnodes(struct acpi_softc *);
 86static void acpi_print_tree(struct acpi_devnode *, uint32_t);
 87
 88extern ACPI_TABLE_HEADER *madt_header;
85 89
86MODULE(MODULE_CLASS_MISC, acpiverbose, NULL); 90MODULE(MODULE_CLASS_MISC, acpiverbose, NULL);
87 91
88static int 92static int
89acpiverbose_modcmd(modcmd_t cmd, void *arg) 93acpiverbose_modcmd(modcmd_t cmd, void *arg)
90{ 94{
91 static void (*saved_print_verbose)(struct acpi_softc *); 95 static void (*saved_print_verbose)(struct acpi_softc *);
92 static void (*saved_print_dev)(const char *); 96 static void (*saved_print_dev)(const char *);
93 97
94 switch (cmd) { 98 switch (cmd) {
95 99
96 case MODULE_CMD_INIT: 100 case MODULE_CMD_INIT:
97 saved_print_verbose = acpi_print_verbose; 101 saved_print_verbose = acpi_print_verbose;
@@ -106,44 +110,197 @@ acpiverbose_modcmd(modcmd_t cmd, void *a @@ -106,44 +110,197 @@ acpiverbose_modcmd(modcmd_t cmd, void *a
106 acpi_print_dev = saved_print_dev; 110 acpi_print_dev = saved_print_dev;
107 acpi_verbose_loaded = 0; 111 acpi_verbose_loaded = 0;
108 return 0; 112 return 0;
109 113
110 default: 114 default:
111 return ENOTTY; 115 return ENOTTY;
112 } 116 }
113} 117}
114 118
115void 119void
116acpi_print_verbose_real(struct acpi_softc *sc) 120acpi_print_verbose_real(struct acpi_softc *sc)
117{ 121{
118 122
 123 acpi_print_madt(sc);
119 acpi_print_fadt(sc); 124 acpi_print_fadt(sc);
120 acpi_print_devnodes(sc); 125 acpi_print_devnodes(sc);
121 acpi_print_tree(sc->sc_root, 0); 126 acpi_print_tree(sc->sc_root, 0);
122} 127}
123 128
124void 129void
125acpi_print_dev_real(const char *pnpstr) 130acpi_print_dev_real(const char *pnpstr)
126{ 131{
127 int i; 132 int i;
128 133
129 for (i = 0; i < __arraycount(acpi_knowndevs); i++) { 134 for (i = 0; i < __arraycount(acpi_knowndevs); i++) {
130 135
131 if (strcmp(acpi_knowndevs[i].pnp, pnpstr) == 0) 136 if (strcmp(acpi_knowndevs[i].pnp, pnpstr) == 0)
132 aprint_normal("[%s] ", acpi_knowndevs[i].str); 137 aprint_normal("[%s] ", acpi_knowndevs[i].str);
133 } 138 }
134} 139}
135 140
136static void 141static void
 142acpi_print_madt(struct acpi_softc *sc)
 143{
 144 ACPI_TABLE_MADT *madt;
 145 ACPI_STATUS rv;
 146
 147 rv = acpi_madt_map();
 148
 149 if (ACPI_FAILURE(rv) && rv != AE_ALREADY_EXISTS)
 150 return;
 151
 152 if (madt_header == NULL)
 153 return;
 154
 155 madt = (ACPI_TABLE_MADT *)madt_header;
 156 acpi_madt_walk(acpi_print_madt_callback, sc);
 157}
 158
 159static ACPI_STATUS
 160acpi_print_madt_callback(ACPI_SUBTABLE_HEADER *hdr, void *aux)
 161{
 162 struct acpi_softc *sc = aux;
 163 device_t self = sc->sc_dev;
 164
 165 /*
 166 * See ACPI 4.0, section 5.2.12.
 167 */
 168 switch (hdr->Type) {
 169
 170 case ACPI_MADT_TYPE_LOCAL_APIC:
 171
 172 aprint_normal_dev(self, "[MADT] %-15s: "
 173 "CPU ID %u, LAPIC ID %u, FLAGS 0x%02X", "LAPIC",
 174 ((ACPI_MADT_LOCAL_APIC *)hdr)->ProcessorId,
 175 ((ACPI_MADT_LOCAL_APIC *)hdr)->Id,
 176 ((ACPI_MADT_LOCAL_APIC *)hdr)->LapicFlags);
 177
 178 break;
 179
 180 case ACPI_MADT_TYPE_IO_APIC:
 181
 182 aprint_normal_dev(self, "[MADT] %-15s: "
 183 "ID %u, GSI %u, ADDR 0x%04X", "I/O APIC",
 184 ((ACPI_MADT_IO_APIC *)hdr)->Id,
 185 ((ACPI_MADT_IO_APIC *)hdr)->GlobalIrqBase,
 186 ((ACPI_MADT_IO_APIC *)hdr)->Address);
 187
 188 break;
 189
 190 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
 191
 192 aprint_normal_dev(self, "[MADT] %-15s: "
 193 "BUS %u, IRQ %u, GSI %u, FLAGS 0x%02X", "INTR OVERRIDE",
 194 ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->Bus,
 195 ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->SourceIrq,
 196 ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->GlobalIrq,
 197 ((ACPI_MADT_INTERRUPT_OVERRIDE *)hdr)->IntiFlags);
 198
 199 break;
 200
 201 case ACPI_MADT_TYPE_NMI_SOURCE:
 202
 203 aprint_normal_dev(self, "[MADT] %-15s: "
 204 "GSI %u, FLAGS 0x%02X", "NMI SOURCE",
 205 ((ACPI_MADT_NMI_SOURCE *)hdr)->GlobalIrq,
 206 ((ACPI_MADT_NMI_SOURCE *)hdr)->IntiFlags);
 207
 208 break;
 209
 210 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
 211
 212 aprint_normal_dev(self, "[MADT] %-15s: "
 213 "CPU ID %u, LINT %u, FLAGS 0x%02X", "LAPIC NMI",
 214 ((ACPI_MADT_LOCAL_APIC_NMI *)hdr)->ProcessorId,
 215 ((ACPI_MADT_LOCAL_APIC_NMI *)hdr)->Lint,
 216 ((ACPI_MADT_LOCAL_APIC_NMI *)hdr)->IntiFlags);
 217
 218 break;
 219
 220 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
 221
 222 aprint_normal_dev(self, "[MADT] %-15s: "
 223 "ADDR 0x%016" PRIX64"", "APIC OVERRIDE",
 224 ((ACPI_MADT_LOCAL_APIC_OVERRIDE *)hdr)->Address);
 225
 226 break;
 227
 228 case ACPI_MADT_TYPE_IO_SAPIC:
 229
 230 aprint_normal_dev(self, "[MADT] %-15s: "
 231 "ID %u, GSI %u, ADDR 0x%016" PRIX64"", "I/O SAPIC",
 232 ((ACPI_MADT_IO_SAPIC *)hdr)->Id,
 233 ((ACPI_MADT_IO_SAPIC *)hdr)->GlobalIrqBase,
 234 ((ACPI_MADT_IO_SAPIC *)hdr)->Address);
 235
 236 break;
 237
 238 case ACPI_MADT_TYPE_LOCAL_SAPIC:
 239
 240 aprint_normal_dev(self, "[MADT] %-15s: "
 241 "CPU ID %u, ID %u, EID %u, UID %u, FLAGS 0x%02X", "LSAPIC",
 242 ((ACPI_MADT_LOCAL_SAPIC*)hdr)->ProcessorId,
 243 ((ACPI_MADT_LOCAL_SAPIC*)hdr)->Id,
 244 ((ACPI_MADT_LOCAL_SAPIC*)hdr)->Eid,
 245 ((ACPI_MADT_LOCAL_SAPIC*)hdr)->Uid,
 246 ((ACPI_MADT_LOCAL_SAPIC*)hdr)->LapicFlags);
 247
 248 break;
 249
 250 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
 251
 252 aprint_normal_dev(self, "[MADT] %-15s: ID %u, EID %u, "
 253 "TYPE %u, PMI %u, GSI %u, FLAGS 0x%02X", "INTR SOURCE",
 254 ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Id,
 255 ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Eid,
 256 ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Type,
 257 ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->IoSapicVector,
 258 ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->GlobalIrq,
 259 ((ACPI_MADT_INTERRUPT_SOURCE *)hdr)->Flags);
 260
 261 break;
 262
 263 case ACPI_MADT_TYPE_LOCAL_X2APIC:
 264
 265 aprint_normal_dev(self, "[MADT] %-15s: "
 266 "ID %u, UID %u, FLAGS 0x%02X", "X2APIC",
 267 ((ACPI_MADT_LOCAL_X2APIC *)hdr)->LocalApicId,
 268 ((ACPI_MADT_LOCAL_X2APIC *)hdr)->Uid,
 269 ((ACPI_MADT_LOCAL_X2APIC *)hdr)->LapicFlags);
 270
 271 break;
 272
 273 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
 274
 275 aprint_normal_dev(self, "[MADT] %-15s: "
 276 "UID %u, LINT %u, FLAGS 0x%02X", "X2APIC NMI",
 277 ((ACPI_MADT_LOCAL_X2APIC_NMI *)hdr)->Uid,
 278 ((ACPI_MADT_LOCAL_X2APIC_NMI *)hdr)->Lint,
 279 ((ACPI_MADT_LOCAL_X2APIC_NMI *)hdr)->IntiFlags);
 280
 281 break;
 282
 283 default:
 284 aprint_normal_dev(self, "[MADT] %-15s", "UNKNOWN");
 285 break;
 286 }
 287
 288 aprint_normal("\n");
 289
 290 return AE_OK;
 291}
 292
 293static void
137acpi_print_fadt(struct acpi_softc *sc) 294acpi_print_fadt(struct acpi_softc *sc)
138{ 295{
139 uint32_t i; 296 uint32_t i;
140 297
141 /* 298 /*
142 * See ACPI 4.0, section 5.2.9. 299 * See ACPI 4.0, section 5.2.9.
143 */ 300 */
144 struct acpi_fadt { 301 struct acpi_fadt {
145 uint32_t fadt_offset; 302 uint32_t fadt_offset;
146 const char *fadt_name; 303 const char *fadt_name;
147 uint64_t fadt_value; 304 uint64_t fadt_value;
148 }; 305 };
149 306