acpi.c revision 118334
1158559Snyan/*- 2158559Snyan * Copyright (c) 1998 Doug Rabson 3158559Snyan * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 4158559Snyan * All rights reserved. 5158559Snyan * 6158559Snyan * Redistribution and use in source and binary forms, with or without 7158559Snyan * modification, are permitted provided that the following conditions 8158559Snyan * are met: 9158559Snyan * 1. Redistributions of source code must retain the above copyright 10158559Snyan * notice, this list of conditions and the following disclaimer. 11158559Snyan * 2. Redistributions in binary form must reproduce the above copyright 12158559Snyan * notice, this list of conditions and the following disclaimer in the 13158559Snyan * documentation and/or other materials provided with the distribution. 14158559Snyan * 15158559Snyan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16158559Snyan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17158559Snyan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18158559Snyan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19158559Snyan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20158559Snyan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21158559Snyan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22158559Snyan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23158559Snyan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24158559Snyan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25158559Snyan * SUCH DAMAGE. 26158559Snyan * 27158559Snyan * $Id: acpi.c,v 1.4 2000/08/09 14:47:52 iwasaki Exp $ 28158559Snyan * $FreeBSD: head/usr.sbin/acpi/acpidump/acpi.c 118334 2003-08-02 01:55:03Z peter $ 29158559Snyan */ 30158559Snyan 31158559Snyan#include <sys/param.h> 32158559Snyan#include <sys/stat.h> 33158559Snyan 34158559Snyan#include <assert.h> 35158559Snyan#include <err.h> 36158559Snyan#include <fcntl.h> 37158559Snyan#include <stdio.h> 38158559Snyan#include <unistd.h> 39239069Snyan 40239069Snyan#include "acpidump.h" 41158559Snyan 42158559Snyan#include "aml/aml_env.h" 43158559Snyan#include "aml/aml_common.h" 44158559Snyan 45158559Snyan#define BEGIN_COMMENT "/*\n" 46158559Snyan#define END_COMMENT " */\n" 47158559Snyan 48158559Snyanstruct ACPIsdt dsdt_header = { 49158559Snyan "DSDT", 0, 1, 0, "OEMID", "OEMTBLID", 0x12345678, "CRTR", 0x12345678 50158559Snyan}; 51158559Snyan 52158559Snyanstatic void 53158559Snyanacpi_trim_string(char *s, size_t length) 54158559Snyan{ 55158559Snyan 56158559Snyan /* Trim trailing spaces and NULLs */ 57158559Snyan while (length > 0 && (s[length - 1] == ' ' || s[length - 1] == '\0')) 58158559Snyan s[length-- - 1] = '\0'; 59158559Snyan} 60158559Snyan 61158559Snyanstatic void 62158559Snyanacpi_print_dsdt_definition(void) 63158559Snyan{ 64158559Snyan char oemid[6 + 1]; 65158559Snyan char oemtblid[8 + 1]; 66158559Snyan 67158559Snyan acpi_trim_string(dsdt_header.oemid, 6); 68158559Snyan acpi_trim_string(dsdt_header.oemtblid, 8); 69158559Snyan strncpy(oemid, dsdt_header.oemid, 6); 70158559Snyan oemid[6] = '\0'; 71158559Snyan strncpy(oemtblid, dsdt_header.oemtblid, 8); 72158559Snyan oemtblid[8] = '\0'; 73158559Snyan 74158559Snyan printf("DefinitionBlock (\n" 75158559Snyan " \"acpi_dsdt.aml\", //Output filename\n" 76158559Snyan " \"DSDT\", //Signature\n" 77158559Snyan " 0x%x, //DSDT Revision\n" 78158559Snyan " \"%s\", //OEMID\n" 79158559Snyan " \"%s\", //TABLE ID\n" 80158559Snyan " 0x%x //OEM Revision\n)\n", 81158559Snyan dsdt_header.rev, oemid, oemtblid, dsdt_header.oemrev); 82158559Snyan} 83158559Snyan 84158559Snyanstatic void 85158559Snyanacpi_print_string(char *s, size_t length) 86158559Snyan{ 87158559Snyan int c; 88158559Snyan 89158559Snyan /* Trim trailing spaces and NULLs */ 90158559Snyan while (length > 0 && (s[length - 1] == ' ' || s[length - 1] == '\0')) 91158559Snyan length--; 92158559Snyan 93158559Snyan while (length--) { 94158559Snyan c = *s++; 95158559Snyan putchar(c); 96158559Snyan } 97158559Snyan} 98158559Snyan 99158559Snyanstatic void 100158559Snyanacpi_handle_dsdt(struct ACPIsdt *dsdp) 101158559Snyan{ 102158559Snyan u_int8_t *dp; 103158559Snyan u_int8_t *end; 104158559Snyan 105158559Snyan acpi_print_dsdt(dsdp); 106158559Snyan dp = (u_int8_t *)dsdp->body; 107158559Snyan end = (u_int8_t *)dsdp + dsdp->len; 108158559Snyan 109158559Snyan acpi_dump_dsdt(dp, end); 110158559Snyan} 111158559Snyan 112158559Snyanstatic void 113158559Snyanacpi_handle_facp(struct FACPbody *facp) 114158559Snyan{ 115158559Snyan struct ACPIsdt *dsdp; 116158559Snyan 117158559Snyan acpi_print_facp(facp); 118158559Snyan dsdp = (struct ACPIsdt *) acpi_map_sdt(facp->dsdt_ptr); 119158559Snyan if (acpi_checksum(dsdp, dsdp->len)) 120158559Snyan errx(1, "DSDT is corrupt\n"); 121158559Snyan acpi_handle_dsdt(dsdp); 122158559Snyan aml_dump(dsdp); 123158559Snyan} 124158559Snyan 125158559Snyanstatic void 126158559Snyanacpi_print_cpu(u_char cpu_id) 127158559Snyan{ 128158559Snyan 129158559Snyan printf("\tACPI CPU="); 130158559Snyan if (cpu_id == 0xff) 131158559Snyan printf("ALL\n"); 132158559Snyan else 133158559Snyan printf("%d\n", (u_int)cpu_id); 134158559Snyan} 135158559Snyan 136158559Snyanstatic void 137158559Snyanacpi_print_local_apic(u_char cpu_id, u_char apic_id, u_int32_t flags) 138158559Snyan{ 139158559Snyan acpi_print_cpu(cpu_id); 140158559Snyan printf("\tFlags={"); 141158559Snyan if (flags & ACPI_MADT_APIC_LOCAL_FLAG_ENABLED) 142158559Snyan printf("ENABLED"); 143158559Snyan else 144158559Snyan printf("DISABLED"); 145158559Snyan printf("}\n"); 146158559Snyan printf("\tAPIC ID=%d\n", (u_int)apic_id); 147158559Snyan} 148158559Snyan 149158559Snyanstatic void 150158559Snyanacpi_print_io_apic(u_char apic_id, u_int32_t int_base, u_int64_t apic_addr) 151158559Snyan{ 152158559Snyan u_int addr_hi; 153158559Snyan 154158559Snyan printf("\tAPIC ID=%d\n", (u_int)apic_id); 155158559Snyan printf("\tINT BASE=%d\n", int_base); 156158559Snyan printf("\tADDR=0x"); 157158559Snyan addr_hi = apic_addr >> 32; 158158559Snyan if (addr_hi != 0) { 159158559Snyan printf("%08x", addr_hi); 160158559Snyan apic_addr &= 0xffffffff; 161158559Snyan } 162158559Snyan printf("%08x\n", (u_int)apic_addr); 163158559Snyan} 164158559Snyan 165158559Snyanstatic void 166158559Snyanacpi_print_mps_flags(u_int16_t flags) 167158559Snyan{ 168158559Snyan 169158559Snyan printf("\tFlags={Polarity="); 170158559Snyan switch (flags & MPS_INT_FLAG_POLARITY_MASK) { 171158559Snyan case MPS_INT_FLAG_POLARITY_CONFORM: 172158559Snyan printf("conforming"); 173158559Snyan break; 174158559Snyan case MPS_INT_FLAG_POLARITY_HIGH: 175158559Snyan printf("active-hi"); 176158559Snyan break; 177158559Snyan case MPS_INT_FLAG_POLARITY_LOW: 178158559Snyan printf("active-lo"); 179158559Snyan break; 180158559Snyan default: 181158559Snyan printf("0x%x", flags & MPS_INT_FLAG_POLARITY_MASK); 182158559Snyan break; 183158559Snyan } 184158559Snyan printf(", Trigger="); 185158559Snyan switch (flags & MPS_INT_FLAG_TRIGGER_MASK) { 186158559Snyan case MPS_INT_FLAG_TRIGGER_CONFORM: 187158559Snyan printf("conforming"); 188158559Snyan break; 189158559Snyan case MPS_INT_FLAG_TRIGGER_EDGE: 190158559Snyan printf("edge"); 191158559Snyan break; 192158559Snyan case MPS_INT_FLAG_TRIGGER_LEVEL: 193158559Snyan printf("level"); 194158559Snyan break; 195158559Snyan default: 196158559Snyan printf("0x%x", (flags & MPS_INT_FLAG_TRIGGER_MASK) >> 2); 197158559Snyan } 198158559Snyan printf("}\n"); 199158559Snyan} 200158559Snyan 201158559Snyanstatic void 202158559Snyanacpi_print_intr(u_int32_t intr, u_int16_t mps_flags) 203158559Snyan{ 204158559Snyan 205158559Snyan printf("\tINTR=%d\n", (u_int)intr); 206158559Snyan acpi_print_mps_flags(mps_flags); 207158559Snyan} 208158559Snyan 209158559Snyanconst char *apic_types[] = { "Local APIC", "IO APIC", "INT Override", "NMI", 210158559Snyan "Local NMI", "Local APIC Override", "IO SAPIC", 211158559Snyan "Local SAPIC", "Platform Interrupt" }; 212158559Snyanconst char *platform_int_types[] = { "PMI", "INIT", 213158559Snyan "Corrected Platform Error" }; 214158559Snyan 215158559Snyanstatic void 216158559Snyanacpi_print_apic(struct MADT_APIC *mp) 217158559Snyan{ 218158559Snyan 219158559Snyan printf("\tType=%s\n", apic_types[mp->type]); 220158559Snyan switch (mp->type) { 221158559Snyan case ACPI_MADT_APIC_TYPE_LOCAL_APIC: 222158559Snyan acpi_print_local_apic(mp->body.local_apic.cpu_id, 223158559Snyan mp->body.local_apic.apic_id, mp->body.local_apic.flags); 224158559Snyan break; 225158559Snyan case ACPI_MADT_APIC_TYPE_IO_APIC: 226158559Snyan acpi_print_io_apic(mp->body.io_apic.apic_id, 227158559Snyan mp->body.io_apic.int_base, 228158559Snyan mp->body.io_apic.apic_addr); 229158559Snyan break; 230158559Snyan case ACPI_MADT_APIC_TYPE_INT_OVERRIDE: 231158559Snyan printf("\tBUS=%d\n", (u_int)mp->body.int_override.bus); 232158559Snyan printf("\tIRQ=%d\n", (u_int)mp->body.int_override.source); 233158559Snyan acpi_print_intr(mp->body.int_override.intr, 234158559Snyan mp->body.int_override.mps_flags); 235158559Snyan break; 236158559Snyan case ACPI_MADT_APIC_TYPE_NMI: 237158559Snyan acpi_print_intr(mp->body.nmi.intr, mp->body.nmi.mps_flags); 238158559Snyan break; 239158559Snyan case ACPI_MADT_APIC_TYPE_LOCAL_NMI: 240158559Snyan acpi_print_cpu(mp->body.local_nmi.cpu_id); 241158559Snyan printf("\tLINT Pin=%d\n", mp->body.local_nmi.lintpin); 242158559Snyan acpi_print_mps_flags(mp->body.local_nmi.mps_flags); 243158559Snyan break; 244158559Snyan case ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE: 245158559Snyan printf("\tLocal APIC ADDR=0x%08x%08x\n", 246158559Snyan (u_int)(mp->body.local_apic_override.apic_addr >> 32), 247158559Snyan (u_int)(mp->body.local_apic_override.apic_addr & 0xffffffff)); 248158559Snyan break; 249158559Snyan case ACPI_MADT_APIC_TYPE_IO_SAPIC: 250158559Snyan acpi_print_io_apic(mp->body.io_sapic.apic_id, 251158559Snyan mp->body.io_sapic.int_base, 252158559Snyan mp->body.io_sapic.apic_addr); 253158559Snyan break; 254158559Snyan case ACPI_MADT_APIC_TYPE_LOCAL_SAPIC: 255158559Snyan acpi_print_local_apic(mp->body.local_sapic.cpu_id, 256158559Snyan mp->body.local_sapic.apic_id, mp->body.local_sapic.flags); 257158559Snyan printf("\tAPIC EID=%d\n", (u_int)mp->body.local_sapic.apic_eid); 258158559Snyan break; 259158559Snyan case ACPI_MADT_APIC_TYPE_INT_SRC: 260158559Snyan printf("\tType=%s\n", 261158559Snyan platform_int_types[mp->body.int_src.type]); 262158559Snyan printf("\tCPU ID=%d\n", (u_int)mp->body.int_src.cpu_id); 263158559Snyan printf("\tCPU EID=%d\n", (u_int)mp->body.int_src.cpu_id); 264158559Snyan printf("\tSAPIC Vector=%d\n", 265158559Snyan (u_int)mp->body.int_src.sapic_vector); 266158559Snyan acpi_print_intr(mp->body.int_src.intr, 267158559Snyan mp->body.int_src.mps_flags); 268158559Snyan break; 269158559Snyan default: 270158559Snyan printf("\tUnknown type %d\n", (u_int)mp->type); 271158559Snyan } 272158559Snyan} 273158559Snyan 274158559Snyanstatic void 275158559Snyanacpi_handle_apic(struct ACPIsdt *sdp) 276158559Snyan{ 277158559Snyan struct MADTbody *madtp; 278158559Snyan struct MADT_APIC *madt_apicp; 279158559Snyan 280158559Snyan acpi_print_sdt(sdp); 281158559Snyan madtp = (struct MADTbody *) sdp->body; 282158559Snyan printf(BEGIN_COMMENT); 283158559Snyan printf("\tLocal APIC ADDR=0x%08x\n", madtp->lapic_addr); 284158559Snyan printf("\tFlags={"); 285158559Snyan if (madtp->flags & ACPI_APIC_FLAG_PCAT_COMPAT) 286158559Snyan printf("PC-AT"); 287158559Snyan printf("}\n"); 288158559Snyan madt_apicp = (struct MADT_APIC *) madtp->body; 289158559Snyan while (((uintptr_t)madt_apicp) - ((uintptr_t)sdp) < sdp->len) { 290158559Snyan printf("\n"); 291158559Snyan acpi_print_apic(madt_apicp); 292158559Snyan madt_apicp = (struct MADT_APIC *) ((char *)madt_apicp + 293158559Snyan madt_apicp->len); 294158559Snyan } 295158559Snyan printf(END_COMMENT); 296158559Snyan} 297158559Snyan 298158559Snyanstatic void 299158559Snyanacpi_handle_hpet(struct ACPIsdt *sdp) 300158559Snyan{ 301158559Snyan struct HPETbody *hpetp; 302158559Snyan 303158559Snyan acpi_print_sdt(sdp); 304158559Snyan hpetp = (struct HPETbody *) sdp->body; 305158559Snyan printf(BEGIN_COMMENT); 306158559Snyan printf("\tHPET Number=%d\n", hpetp->hpet_number); 307158559Snyan printf("\tADDR=0x%08x\n", hpetp->base_addr); 308158559Snyan printf("\tHW Rev=0x%x\n", hpetp->block_hwrev); 309158559Snyan printf("\tComparitors=%d\n", hpetp->block_comparitors); 310158559Snyan printf("\tCounter Size=%d\n", hpetp->block_counter_size); 311158559Snyan printf("\tLegacy IRQ routing capable={"); 312158559Snyan if (hpetp->block_legacy_capable) 313158559Snyan printf("TRUE}\n"); 314158559Snyan else 315158559Snyan printf("FALSE}\n"); 316158559Snyan printf("\tPCI Vendor ID=0x%04x\n", hpetp->block_pcivendor); 317158559Snyan printf("\tMinimul Tick=%d\n", hpetp->clock_tick); 318158559Snyan printf(END_COMMENT); 319158559Snyan} 320158559Snyan 321158559Snyanstatic void 322158559Snyaninit_namespace() 323158559Snyan{ 324158559Snyan struct aml_environ env; 325158559Snyan struct aml_name *newname; 326158559Snyan 327158559Snyan aml_new_name_group(AML_NAME_GROUP_OS_DEFINED); 328158559Snyan env.curname = aml_get_rootname(); 329158559Snyan newname = aml_create_name(&env, "\\_OS_"); 330158559Snyan newname->property = aml_alloc_object(aml_t_string, NULL); 331158559Snyan newname->property->str.needfree = 0; 332158559Snyan newname->property->str.string = "Microsoft Windows NT"; 333158559Snyan} 334158559Snyan 335158559Snyan/* 336158559Snyan * Public interfaces 337158559Snyan */ 338158559Snyan 339158559Snyanvoid 340158559Snyanacpi_dump_dsdt(u_int8_t *dp, u_int8_t *end) 341158559Snyan{ 342158559Snyan extern struct aml_environ asl_env; 343158559Snyan 344158559Snyan acpi_print_dsdt_definition(); 345158559Snyan 346158559Snyan /* 1st stage: parse only w/o printing */ 347158559Snyan init_namespace(); 348158559Snyan aml_new_name_group((int)dp); 349158559Snyan bzero(&asl_env, sizeof(asl_env)); 350158559Snyan 351158559Snyan asl_env.dp = dp; 352158559Snyan asl_env.end = end; 353158559Snyan asl_env.curname = aml_get_rootname(); 354158559Snyan 355158559Snyan aml_local_stack_push(aml_local_stack_create()); 356158559Snyan aml_parse_objectlist(&asl_env, 0); 357158559Snyan aml_local_stack_delete(aml_local_stack_pop()); 358158559Snyan 359158559Snyan assert(asl_env.dp == asl_env.end); 360158559Snyan asl_env.dp = dp; 361158559Snyan 362158559Snyan /* 2nd stage: dump whole object list */ 363158559Snyan printf("\n{\n"); 364158559Snyan asl_dump_objectlist(&dp, end, 0); 365158559Snyan printf("\n}\n"); 366158559Snyan assert(dp == end); 367158559Snyan} 368158559Snyan 369158559Snyanvoid 370158559Snyanacpi_print_sdt(struct ACPIsdt *sdp) 371158559Snyan{ 372158559Snyan 373158559Snyan printf(BEGIN_COMMENT); 374158559Snyan acpi_print_string(sdp->signature, 4); 375158559Snyan printf(": Length=%d, Revision=%d, Checksum=%d,\n", 376158559Snyan sdp->len, sdp->rev, sdp->check); 377158559Snyan printf("\tOEMID="); 378158559Snyan acpi_print_string(sdp->oemid, 6); 379158559Snyan printf(", OEM Table ID="); 380158559Snyan acpi_print_string(sdp->oemtblid, 8); 381158559Snyan printf(", OEM Revision=0x%x,\n", sdp->oemrev); 382158559Snyan printf("\tCreator ID="); 383158559Snyan acpi_print_string(sdp->creator, 4); 384158559Snyan printf(", Creator Revision=0x%x\n", sdp->crerev); 385158559Snyan printf(END_COMMENT); 386158559Snyan if (!memcmp(sdp->signature, "DSDT", 4)) { 387158559Snyan memcpy(&dsdt_header, sdp, sizeof(dsdt_header)); 388158559Snyan } 389158559Snyan} 390158559Snyan 391158559Snyanvoid 392158559Snyanacpi_print_rsdt(struct ACPIsdt *rsdp) 393158559Snyan{ 394158559Snyan int i, entries; 395158559Snyan 396158559Snyan acpi_print_sdt(rsdp); 397158559Snyan entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); 398158559Snyan printf(BEGIN_COMMENT); 399158559Snyan printf("\tEntries={ "); 400158559Snyan for (i = 0; i < entries; i++) { 401158559Snyan if (i > 0) 402158559Snyan printf(", "); 403158559Snyan printf("0x%08x", rsdp->body[i]); 404158559Snyan } 405158559Snyan printf(" }\n"); 406158559Snyan printf(END_COMMENT); 407158559Snyan} 408158559Snyan 409158559Snyanvoid 410158559Snyanacpi_print_facp(struct FACPbody *facp) 411158559Snyan{ 412158559Snyan char sep; 413158559Snyan 414158559Snyan printf(BEGIN_COMMENT); 415219126Sbrucec printf("\tDSDT=0x%x\n", facp->dsdt_ptr); 416158559Snyan printf("\tINT_MODEL=%s\n", facp->int_model ? "APIC" : "PIC"); 417158559Snyan printf("\tSCI_INT=%d\n", facp->sci_int); 418158559Snyan printf("\tSMI_CMD=0x%x, ", facp->smi_cmd); 419158559Snyan printf("ACPI_ENABLE=0x%x, ", facp->acpi_enable); 420158559Snyan printf("ACPI_DISABLE=0x%x, ", facp->acpi_disable); 421158559Snyan printf("S4BIOS_REQ=0x%x\n", facp->s4biosreq); 422158559Snyan if (facp->pm1a_evt_blk) 423158559Snyan printf("\tPM1a_EVT_BLK=0x%x-0x%x\n", 424158559Snyan facp->pm1a_evt_blk, 425158559Snyan facp->pm1a_evt_blk + facp->pm1_evt_len - 1); 426158559Snyan if (facp->pm1b_evt_blk) 427158559Snyan printf("\tPM1b_EVT_BLK=0x%x-0x%x\n", 428158559Snyan facp->pm1b_evt_blk, 429158559Snyan facp->pm1b_evt_blk + facp->pm1_evt_len - 1); 430158559Snyan if (facp->pm1a_cnt_blk) 431158559Snyan printf("\tPM1a_CNT_BLK=0x%x-0x%x\n", 432158559Snyan facp->pm1a_cnt_blk, 433158559Snyan facp->pm1a_cnt_blk + facp->pm1_cnt_len - 1); 434158559Snyan if (facp->pm1b_cnt_blk) 435158559Snyan printf("\tPM1b_CNT_BLK=0x%x-0x%x\n", 436158559Snyan facp->pm1b_cnt_blk, 437158559Snyan facp->pm1b_cnt_blk + facp->pm1_cnt_len - 1); 438158559Snyan if (facp->pm2_cnt_blk) 439158559Snyan printf("\tPM2_CNT_BLK=0x%x-0x%x\n", 440158559Snyan facp->pm2_cnt_blk, 441158559Snyan facp->pm2_cnt_blk + facp->pm2_cnt_len - 1); 442158559Snyan if (facp->pm_tmr_blk) 443158559Snyan printf("\tPM2_TMR_BLK=0x%x-0x%x\n", 444158559Snyan facp->pm_tmr_blk, 445158559Snyan facp->pm_tmr_blk + facp->pm_tmr_len - 1); 446158559Snyan if (facp->gpe0_blk) 447158559Snyan printf("\tPM2_GPE0_BLK=0x%x-0x%x\n", 448158559Snyan facp->gpe0_blk, 449158559Snyan facp->gpe0_blk + facp->gpe0_len - 1); 450158559Snyan if (facp->gpe1_blk) 451158559Snyan printf("\tPM2_GPE1_BLK=0x%x-0x%x, GPE1_BASE=%d\n", 452158559Snyan facp->gpe1_blk, 453158559Snyan facp->gpe1_blk + facp->gpe1_len - 1, 454158559Snyan facp->gpe1_base); 455158559Snyan printf("\tP_LVL2_LAT=%dms, P_LVL3_LAT=%dms\n", 456158559Snyan facp->p_lvl2_lat, facp->p_lvl3_lat); 457158559Snyan printf("\tFLUSH_SIZE=%d, FLUSH_STRIDE=%d\n", 458158559Snyan facp->flush_size, facp->flush_stride); 459158559Snyan printf("\tDUTY_OFFSET=%d, DUTY_WIDTH=%d\n", 460158559Snyan facp->duty_off, facp->duty_width); 461158559Snyan printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n", 462158559Snyan facp->day_alrm, facp->mon_alrm, facp->century); 463158559Snyan printf("\tFlags="); 464158559Snyan sep = '{'; 465158559Snyan 466158559Snyan#define PRINTFLAG(xx) do { \ 467158559Snyan if (facp->flags & ACPI_FACP_FLAG_## xx) { \ 468158559Snyan printf("%c%s", sep, #xx); sep = ','; \ 469158559Snyan } \ 470158559Snyan} while (0) 471158559Snyan 472158559Snyan PRINTFLAG(WBINVD); 473158559Snyan PRINTFLAG(WBINVD_FLUSH); 474158559Snyan PRINTFLAG(PROC_C1); 475158559Snyan PRINTFLAG(P_LVL2_UP); 476158559Snyan PRINTFLAG(PWR_BUTTON); 477158559Snyan PRINTFLAG(SLP_BUTTON); 478158559Snyan PRINTFLAG(FIX_RTC); 479158559Snyan PRINTFLAG(RTC_S4); 480158559Snyan PRINTFLAG(TMR_VAL_EXT); 481158559Snyan PRINTFLAG(DCK_CAP); 482158559Snyan 483158559Snyan#undef PRINTFLAG 484158559Snyan 485158559Snyan printf("}\n"); 486158559Snyan printf(END_COMMENT); 487158559Snyan} 488158559Snyan 489158559Snyanvoid 490158559Snyanacpi_print_dsdt(struct ACPIsdt *dsdp) 491158559Snyan{ 492158559Snyan 493158559Snyan acpi_print_sdt(dsdp); 494158559Snyan} 495158559Snyan 496158559Snyanint 497158559Snyanacpi_checksum(void *p, size_t length) 498158559Snyan{ 499158559Snyan u_int8_t *bp; 500158559Snyan u_int8_t sum; 501158559Snyan 502158559Snyan bp = p; 503158559Snyan sum = 0; 504158559Snyan while (length--) 505158559Snyan sum += *bp++; 506158559Snyan 507158559Snyan return (sum); 508158559Snyan} 509158559Snyan 510158559Snyanstruct ACPIsdt * 511158559Snyanacpi_map_sdt(vm_offset_t pa) 512158559Snyan{ 513158559Snyan struct ACPIsdt *sp; 514158559Snyan 515158559Snyan sp = acpi_map_physical(pa, sizeof(struct ACPIsdt)); 516158559Snyan sp = acpi_map_physical(pa, sp->len); 517158559Snyan return (sp); 518158559Snyan} 519158559Snyan 520158559Snyanvoid 521158559Snyanacpi_print_rsd_ptr(struct ACPIrsdp *rp) 522158559Snyan{ 523158559Snyan 524158559Snyan printf(BEGIN_COMMENT); 525158559Snyan printf("RSD PTR: Checksum=%d, OEMID=", rp->sum); 526158559Snyan acpi_print_string(rp->oem, 6); 527158559Snyan printf(", RsdtAddress=0x%08x\n", rp->rsdt_addr); 528158559Snyan printf(END_COMMENT); 529158559Snyan} 530158559Snyan 531158559Snyanvoid 532158559Snyanacpi_handle_rsdt(struct ACPIsdt *rsdp) 533158559Snyan{ 534158559Snyan int i; 535158559Snyan int entries; 536158559Snyan struct ACPIsdt *sdp; 537158559Snyan 538158559Snyan entries = (rsdp->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); 539158559Snyan acpi_print_rsdt(rsdp); 540158559Snyan for (i = 0; i < entries; i++) { 541158559Snyan sdp = (struct ACPIsdt *) acpi_map_sdt(rsdp->body[i]); 542158559Snyan if (acpi_checksum(sdp, sdp->len)) 543158559Snyan errx(1, "RSDT entry %d is corrupt\n", i); 544158559Snyan if (!memcmp(sdp->signature, "FACP", 4)) { 545158559Snyan acpi_handle_facp((struct FACPbody *) sdp->body); 546158559Snyan } else if (!memcmp(sdp->signature, "APIC", 4)) { 547158559Snyan acpi_handle_apic(sdp); 548158559Snyan } else if (!memcmp(sdp->signature, "HPET", 4)) { 549158559Snyan acpi_handle_hpet(sdp); 550158559Snyan } else { 551158559Snyan acpi_print_sdt(sdp); 552158559Snyan } 553158559Snyan } 554158559Snyan} 555158559Snyan 556158559Snyan/* 557158559Snyan * Dummy functions 558158559Snyan */ 559158559Snyan 560158559Snyanvoid 561158559Snyanaml_dbgr(struct aml_environ *env1, struct aml_environ *env2) 562158559Snyan{ 563158559Snyan /* do nothing */ 564158559Snyan} 565158559Snyan 566158559Snyanint 567158559Snyanaml_region_read_simple(struct aml_region_handle *h, vm_offset_t offset, 568158559Snyan u_int32_t *valuep) 569158559Snyan{ 570158559Snyan return (0); 571158559Snyan} 572158559Snyan 573158559Snyanint 574158559Snyanaml_region_write_simple(struct aml_region_handle *h, vm_offset_t offset, 575158559Snyan u_int32_t value) 576158559Snyan{ 577158559Snyan return (0); 578158559Snyan} 579158559Snyan 580158559Snyanu_int32_t 581158559Snyanaml_region_prompt_read(struct aml_region_handle *h, u_int32_t value) 582158559Snyan{ 583158559Snyan return (0); 584158559Snyan} 585158559Snyan 586158559Snyanu_int32_t 587158559Snyanaml_region_prompt_write(struct aml_region_handle *h, u_int32_t value) 588158559Snyan{ 589158559Snyan return (0); 590158559Snyan} 591158559Snyan 592158559Snyanint 593158559Snyanaml_region_prompt_update_value(u_int32_t orgval, u_int32_t value, 594158559Snyan struct aml_region_handle *h) 595158559Snyan{ 596158559Snyan return (0); 597158559Snyan} 598158559Snyan 599158559Snyanu_int32_t 600158559Snyanaml_region_read(struct aml_environ *env, int regtype, u_int32_t flags, 601158559Snyan u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen) 602158559Snyan{ 603158559Snyan return (0); 604158559Snyan} 605158559Snyan 606158559Snyanint 607158559Snyanaml_region_write(struct aml_environ *env, int regtype, u_int32_t flags, 608158559Snyan u_int32_t value, u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen) 609158559Snyan{ 610158559Snyan return (0); 611158559Snyan} 612158559Snyan 613158559Snyanint 614158559Snyanaml_region_write_from_buffer(struct aml_environ *env, int regtype, 615158559Snyan u_int32_t flags, u_int8_t *buffer, u_int32_t addr, u_int32_t bitoffset, 616158559Snyan u_int32_t bitlen) 617158559Snyan{ 618158559Snyan return (0); 619158559Snyan} 620158559Snyan 621158559Snyanint 622158559Snyanaml_region_bcopy(struct aml_environ *env, int regtype, u_int32_t flags, 623158559Snyan u_int32_t addr, u_int32_t bitoffset, u_int32_t bitlen, 624158559Snyan u_int32_t dflags, u_int32_t daddr, 625158559Snyan u_int32_t dbitoffset, u_int32_t dbitlen) 626158559Snyan{ 627158559Snyan return (0); 628158559Snyan} 629158559Snyan 630158559Snyanint 631158559Snyanaml_region_read_into_buffer(struct aml_environ *env, int regtype, 632158559Snyan u_int32_t flags, u_int32_t addr, u_int32_t bitoffset, 633158559Snyan u_int32_t bitlen, u_int8_t *buffer) 634158559Snyan{ 635158559Snyan return (0); 636158559Snyan} 637158559Snyan 638158559Snyan