Home | History | Annotate | Line # | Download | only in acpidump
acpi.c revision 1.56
      1  1.56   msaitoh /* $NetBSD: acpi.c,v 1.56 2024/05/12 23:00:21 msaitoh Exp $ */
      2   1.1  christos 
      3   1.1  christos /*-
      4   1.1  christos  * Copyright (c) 1998 Doug Rabson
      5   1.1  christos  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki (at) FreeBSD.org>
      6   1.1  christos  * All rights reserved.
      7   1.1  christos  *
      8   1.1  christos  * Redistribution and use in source and binary forms, with or without
      9   1.1  christos  * modification, are permitted provided that the following conditions
     10   1.1  christos  * are met:
     11   1.1  christos  * 1. Redistributions of source code must retain the above copyright
     12   1.1  christos  *    notice, this list of conditions and the following disclaimer.
     13   1.1  christos  * 2. Redistributions in binary form must reproduce the above copyright
     14   1.1  christos  *    notice, this list of conditions and the following disclaimer in the
     15   1.1  christos  *    documentation and/or other materials provided with the distribution.
     16   1.1  christos  *
     17   1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     18   1.1  christos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19   1.1  christos  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20   1.1  christos  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     21   1.1  christos  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22   1.1  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23   1.1  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24   1.1  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25   1.1  christos  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26   1.1  christos  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27   1.1  christos  * SUCH DAMAGE.
     28   1.1  christos  *
     29  1.16   msaitoh  *	$FreeBSD: head/usr.sbin/acpi/acpidump/acpi.c 321299 2017-07-20 17:36:17Z emaste $
     30   1.1  christos  */
     31   1.1  christos 
     32   1.5    cegger #include <sys/cdefs.h>
     33  1.56   msaitoh __RCSID("$NetBSD: acpi.c,v 1.56 2024/05/12 23:00:21 msaitoh Exp $");
     34   1.5    cegger 
     35   1.5    cegger #include <sys/param.h>
     36   1.5    cegger #include <sys/endian.h>
     37   1.5    cegger #include <sys/stat.h>
     38   1.5    cegger #include <sys/wait.h>
     39   1.5    cegger #include <assert.h>
     40   1.5    cegger #include <err.h>
     41   1.5    cegger #include <fcntl.h>
     42   1.5    cegger #include <paths.h>
     43  1.39   msaitoh #include <stdbool.h>
     44   1.5    cegger #include <stdio.h>
     45   1.5    cegger #include <stdint.h>
     46   1.5    cegger #include <stdlib.h>
     47   1.5    cegger #include <string.h>
     48   1.5    cegger #include <unistd.h>
     49   1.5    cegger #include <stddef.h>
     50  1.19   msaitoh #include <uuid.h>
     51   1.5    cegger 
     52   1.5    cegger #include "acpidump.h"
     53   1.5    cegger 
     54   1.5    cegger #define BEGIN_COMMENT	"/*\n"
     55   1.5    cegger #define END_COMMENT	" */\n"
     56   1.5    cegger 
     57  1.39   msaitoh /* Commonly used helper functions */
     58   1.5    cegger static void	acpi_print_string(char *s, size_t length);
     59  1.39   msaitoh static void	acpi_print_tabs(unsigned int n);
     60  1.39   msaitoh static void	acpi_dump_bytes(uint8_t *p, uint32_t len, unsigned int ntabs);
     61  1.39   msaitoh static void	acpi_dump_table(ACPI_TABLE_HEADER *sdp);
     62   1.5    cegger static void	acpi_print_gas(ACPI_GENERIC_ADDRESS *gas);
     63   1.5    cegger static void	acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
     64   1.5    cegger 		    uint8_t seg, uint8_t bus, uint8_t device, uint8_t func);
     65  1.22   msaitoh static void	acpi_print_pci_sbdf(uint8_t seg, uint8_t bus, uint8_t device,
     66   1.5    cegger 		    uint8_t func);
     67   1.5    cegger #ifdef notyet
     68   1.5    cegger static void	acpi_print_hest_generic_status(ACPI_HEST_GENERIC_STATUS *);
     69   1.5    cegger static void	acpi_print_hest_generic_data(ACPI_HEST_GENERIC_DATA *);
     70   1.5    cegger #endif
     71   1.5    cegger static void	acpi_print_whea(ACPI_WHEA_HEADER *whea,
     72   1.5    cegger 		    void (*print_action)(ACPI_WHEA_HEADER *),
     73   1.5    cegger 		    void (*print_ins)(ACPI_WHEA_HEADER *),
     74   1.5    cegger 		    void (*print_flags)(ACPI_WHEA_HEADER *));
     75  1.18   msaitoh static uint64_t	acpi_select_address(uint32_t, uint64_t);
     76  1.39   msaitoh 
     77  1.39   msaitoh /* Handlers for each table */
     78   1.5    cegger static void	acpi_handle_fadt(ACPI_TABLE_HEADER *fadt);
     79   1.5    cegger static void	acpi_print_cpu(u_char cpu_id);
     80   1.5    cegger static void	acpi_print_cpu_uid(uint32_t uid, char *uid_string);
     81   1.5    cegger static void	acpi_print_local_apic(uint32_t apic_id, uint32_t flags);
     82   1.5    cegger static void	acpi_print_io_apic(uint32_t apic_id, uint32_t int_base,
     83   1.5    cegger 		    uint64_t apic_addr);
     84   1.5    cegger static void	acpi_print_mps_flags(uint16_t flags);
     85   1.5    cegger static void	acpi_print_intr(uint32_t intr, uint16_t mps_flags);
     86  1.51    rillig static void	acpi_print_local_nmi(u_int local_int, uint16_t mps_flags);
     87   1.5    cegger static void	acpi_print_madt(ACPI_SUBTABLE_HEADER *mp);
     88   1.5    cegger static void	acpi_handle_bert(ACPI_TABLE_HEADER *sdp);
     89  1.40   msaitoh static void	acpi_handle_bgrt(ACPI_TABLE_HEADER *sdp);
     90   1.5    cegger static void	acpi_handle_boot(ACPI_TABLE_HEADER *sdp);
     91   1.5    cegger static void	acpi_handle_cpep(ACPI_TABLE_HEADER *sdp);
     92  1.39   msaitoh static void	acpi_handle_csrt(ACPI_TABLE_HEADER *sdp);
     93   1.5    cegger static void	acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp);
     94  1.22   msaitoh static void	acpi_handle_dbg2(ACPI_TABLE_HEADER *sdp);
     95   1.5    cegger static void	acpi_handle_einj(ACPI_TABLE_HEADER *sdp);
     96   1.5    cegger static void	acpi_handle_erst(ACPI_TABLE_HEADER *sdp);
     97  1.35   msaitoh static void	acpi_handle_gtdt(ACPI_TABLE_HEADER *sdp);
     98   1.5    cegger static void	acpi_handle_hest(ACPI_TABLE_HEADER *sdp);
     99  1.42   msaitoh static void	acpi_handle_iort(ACPI_TABLE_HEADER *sdp);
    100  1.30   msaitoh static void	acpi_handle_lpit(ACPI_TABLE_HEADER *sdp);
    101   1.5    cegger static void	acpi_handle_madt(ACPI_TABLE_HEADER *sdp);
    102   1.5    cegger static void	acpi_handle_msct(ACPI_TABLE_HEADER *sdp);
    103   1.5    cegger static void	acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp);
    104   1.5    cegger static void	acpi_handle_hpet(ACPI_TABLE_HEADER *sdp);
    105   1.5    cegger static void	acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp);
    106  1.48  jmcneill static void	acpi_handle_pcct(ACPI_TABLE_HEADER *sdp);
    107  1.35   msaitoh static void	acpi_handle_pptt(ACPI_TABLE_HEADER *sdp);
    108   1.5    cegger static void	acpi_handle_sbst(ACPI_TABLE_HEADER *sdp);
    109   1.5    cegger static void	acpi_handle_slit(ACPI_TABLE_HEADER *sdp);
    110   1.5    cegger static void	acpi_handle_spcr(ACPI_TABLE_HEADER *sdp);
    111  1.22   msaitoh static void	acpi_handle_spmi(ACPI_TABLE_HEADER *sdp);
    112  1.27   msaitoh static void	acpi_print_srat_cpu(uint8_t type, uint32_t apic_id,
    113   1.5    cegger 		    uint32_t proximity_domain,
    114  1.27   msaitoh 		    uint32_t flags, uint32_t clockdomain, uint8_t sapic_eid);
    115   1.5    cegger static void	acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp);
    116   1.5    cegger static void	acpi_print_srat(ACPI_SUBTABLE_HEADER *srat);
    117   1.5    cegger static void	acpi_handle_srat(ACPI_TABLE_HEADER *sdp);
    118   1.5    cegger static void	acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp);
    119  1.46      maxv static void	acpi_handle_tpm2(ACPI_TABLE_HEADER *sdp);
    120  1.19   msaitoh static void	acpi_print_nfit(ACPI_NFIT_HEADER *nfit);
    121  1.19   msaitoh static void	acpi_handle_nfit(ACPI_TABLE_HEADER *sdp);
    122  1.22   msaitoh static void	acpi_handle_uefi(ACPI_TABLE_HEADER *sdp);
    123   1.5    cegger static void	acpi_handle_waet(ACPI_TABLE_HEADER *sdp);
    124   1.5    cegger static void	acpi_handle_wdat(ACPI_TABLE_HEADER *sdp);
    125  1.22   msaitoh static void	acpi_handle_wddt(ACPI_TABLE_HEADER *sdp);
    126   1.5    cegger static void	acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp);
    127   1.5    cegger static void	acpi_print_sdt(ACPI_TABLE_HEADER *sdp);
    128   1.5    cegger static void	acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
    129   1.5    cegger static void	acpi_print_facs(ACPI_TABLE_FACS *facs);
    130   1.5    cegger static void	acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp);
    131   1.5    cegger static ACPI_TABLE_HEADER *acpi_map_sdt(vm_offset_t pa);
    132   1.5    cegger static void	acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp);
    133   1.5    cegger static void	acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp);
    134   1.5    cegger static void	acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
    135   1.5    cegger 		    void (*action)(ACPI_SUBTABLE_HEADER *));
    136  1.19   msaitoh static void	acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first,
    137  1.19   msaitoh 		    void (*action)(ACPI_NFIT_HEADER *));
    138   1.5    cegger 
    139   1.5    cegger /* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
    140   1.5    cegger static int addr_size;
    141   1.5    cegger 
    142  1.16   msaitoh /* Strings used in the TCPA table */
    143  1.16   msaitoh static const char *tcpa_event_type_strings[] = {
    144  1.16   msaitoh 	"PREBOOT Certificate",
    145  1.16   msaitoh 	"POST Code",
    146  1.16   msaitoh 	"Unused",
    147  1.16   msaitoh 	"No Action",
    148  1.16   msaitoh 	"Separator",
    149  1.16   msaitoh 	"Action",
    150  1.16   msaitoh 	"Event Tag",
    151  1.16   msaitoh 	"S-CRTM Contents",
    152  1.16   msaitoh 	"S-CRTM Version",
    153  1.16   msaitoh 	"CPU Microcode",
    154  1.16   msaitoh 	"Platform Config Flags",
    155  1.16   msaitoh 	"Table of Devices",
    156  1.16   msaitoh 	"Compact Hash",
    157  1.16   msaitoh 	"IPL",
    158  1.16   msaitoh 	"IPL Partition Data",
    159  1.16   msaitoh 	"Non-Host Code",
    160  1.16   msaitoh 	"Non-Host Config",
    161  1.16   msaitoh 	"Non-Host Info"
    162  1.16   msaitoh };
    163  1.16   msaitoh 
    164  1.16   msaitoh static const char *TCPA_pcclient_strings[] = {
    165  1.16   msaitoh 	"<undefined>",
    166  1.16   msaitoh 	"SMBIOS",
    167  1.16   msaitoh 	"BIS Certificate",
    168  1.16   msaitoh 	"POST BIOS ROM Strings",
    169  1.16   msaitoh 	"ESCD",
    170  1.16   msaitoh 	"CMOS",
    171  1.16   msaitoh 	"NVRAM",
    172  1.16   msaitoh 	"Option ROM Execute",
    173  1.16   msaitoh 	"Option ROM Configurateion",
    174  1.16   msaitoh 	"<undefined>",
    175  1.16   msaitoh 	"Option ROM Microcode Update ",
    176  1.16   msaitoh 	"S-CRTM Version String",
    177  1.16   msaitoh 	"S-CRTM Contents",
    178  1.16   msaitoh 	"POST Contents",
    179  1.16   msaitoh 	"Table of Devices",
    180  1.16   msaitoh };
    181  1.16   msaitoh 
    182  1.16   msaitoh #define	PRINTFLAG_END()		printflag_end()
    183  1.16   msaitoh 
    184  1.16   msaitoh static char pf_sep = '{';
    185  1.16   msaitoh 
    186  1.16   msaitoh static void
    187  1.16   msaitoh printflag_end(void)
    188  1.16   msaitoh {
    189  1.16   msaitoh 
    190  1.21   msaitoh 	if (pf_sep == ',') {
    191  1.16   msaitoh 		printf("}");
    192  1.21   msaitoh 	} else if (pf_sep == '{') {
    193  1.21   msaitoh 		printf("{}");
    194  1.16   msaitoh 	}
    195  1.21   msaitoh 	pf_sep = '{';
    196  1.16   msaitoh 	printf("\n");
    197  1.16   msaitoh }
    198  1.16   msaitoh 
    199  1.16   msaitoh static void
    200  1.16   msaitoh printflag(uint64_t var, uint64_t mask, const char *name)
    201  1.16   msaitoh {
    202  1.16   msaitoh 
    203  1.16   msaitoh 	if (var & mask) {
    204  1.16   msaitoh 		printf("%c%s", pf_sep, name);
    205  1.16   msaitoh 		pf_sep = ',';
    206  1.16   msaitoh 	}
    207  1.16   msaitoh }
    208  1.16   msaitoh 
    209   1.5    cegger static void
    210   1.5    cegger acpi_print_string(char *s, size_t length)
    211   1.5    cegger {
    212   1.5    cegger 	int	c;
    213   1.5    cegger 
    214   1.5    cegger 	/* Trim trailing spaces and NULLs */
    215   1.5    cegger 	while (length > 0 && (s[length - 1] == ' ' || s[length - 1] == '\0'))
    216   1.5    cegger 		length--;
    217   1.5    cegger 
    218   1.5    cegger 	while (length--) {
    219   1.5    cegger 		c = *s++;
    220  1.43   msaitoh 		if (c == '\0')
    221  1.43   msaitoh 			return;
    222   1.5    cegger 		putchar(c);
    223   1.5    cegger 	}
    224   1.5    cegger }
    225   1.5    cegger 
    226   1.5    cegger static void
    227   1.5    cegger acpi_print_gas(ACPI_GENERIC_ADDRESS *gas)
    228   1.5    cegger {
    229  1.27   msaitoh 	switch (gas->SpaceId) {
    230  1.26   msaitoh 	case ACPI_ADR_SPACE_SYSTEM_MEMORY:
    231  1.16   msaitoh 		if (gas->BitWidth <= 32)
    232  1.16   msaitoh 			printf("0x%08x:%u[%u] (Memory)",
    233  1.16   msaitoh 			    (u_int)gas->Address, gas->BitOffset,
    234  1.16   msaitoh 			    gas->BitWidth);
    235  1.16   msaitoh 		else
    236  1.16   msaitoh 			printf("0x%016jx:%u[%u] (Memory)",
    237  1.16   msaitoh 			    (uintmax_t)gas->Address, gas->BitOffset,
    238  1.16   msaitoh 			    gas->BitWidth);
    239   1.5    cegger 		break;
    240  1.26   msaitoh 	case ACPI_ADR_SPACE_SYSTEM_IO:
    241  1.16   msaitoh 		printf("0x%02x:%u[%u] (IO)", (u_int)gas->Address,
    242  1.16   msaitoh 		    gas->BitOffset, gas->BitWidth);
    243   1.5    cegger 		break;
    244  1.26   msaitoh 	case ACPI_ADR_SPACE_PCI_CONFIG:
    245   1.5    cegger 		printf("%x:%x+0x%x (PCI)", (uint16_t)(gas->Address >> 32),
    246   1.5    cegger 		       (uint16_t)((gas->Address >> 16) & 0xffff),
    247   1.5    cegger 		       (uint16_t)gas->Address);
    248   1.5    cegger 		break;
    249   1.5    cegger 	/* XXX How to handle these below? */
    250  1.26   msaitoh 	case ACPI_ADR_SPACE_EC:
    251   1.5    cegger 		printf("0x%x:%u[%u] (EC)", (uint16_t)gas->Address,
    252   1.5    cegger 		       gas->BitOffset, gas->BitWidth);
    253   1.5    cegger 		break;
    254  1.26   msaitoh 	case ACPI_ADR_SPACE_SMBUS:
    255   1.5    cegger 		printf("0x%x:%u[%u] (SMBus)", (uint16_t)gas->Address,
    256   1.5    cegger 		       gas->BitOffset, gas->BitWidth);
    257   1.5    cegger 		break;
    258  1.26   msaitoh 	case ACPI_ADR_SPACE_CMOS:
    259  1.26   msaitoh 	case ACPI_ADR_SPACE_PCI_BAR_TARGET:
    260  1.26   msaitoh 	case ACPI_ADR_SPACE_IPMI:
    261  1.26   msaitoh 	case ACPI_ADR_SPACE_GPIO:
    262  1.26   msaitoh 	case ACPI_ADR_SPACE_GSBUS:
    263  1.26   msaitoh 	case ACPI_ADR_SPACE_PLATFORM_COMM:
    264  1.26   msaitoh 	case ACPI_ADR_SPACE_FIXED_HARDWARE:
    265   1.5    cegger 	default:
    266  1.24   msaitoh 		printf("0x%016jx (SpaceID=%hhu)", (uintmax_t)gas->Address,
    267  1.24   msaitoh 		    gas->SpaceId);
    268   1.5    cegger 		break;
    269   1.5    cegger 	}
    270   1.5    cegger }
    271   1.5    cegger 
    272   1.5    cegger static void
    273   1.5    cegger acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
    274   1.5    cegger     uint8_t seg, uint8_t bus, uint8_t device, uint8_t func)
    275   1.5    cegger {
    276   1.5    cegger 	if (vendorid == 0xffff && deviceid == 0xffff) {
    277   1.5    cegger 		printf("\tPCI Device=NONE\n");
    278   1.5    cegger 		return;
    279   1.5    cegger 	}
    280   1.5    cegger 
    281   1.5    cegger 	printf("\tPCI device={\n");
    282   1.5    cegger 	printf("\t\tVendor=0x%x\n", vendorid);
    283   1.5    cegger 	printf("\t\tDevice=0x%x\n", deviceid);
    284   1.5    cegger 	printf("\n");
    285   1.5    cegger 	printf("\t\tSegment Group=%d\n", seg);
    286   1.5    cegger 	printf("\t\tBus=%d\n", bus);
    287   1.5    cegger 	printf("\t\tDevice=%d\n", device);
    288   1.5    cegger 	printf("\t\tFunction=%d\n", func);
    289   1.5    cegger 	printf("\t}\n");
    290   1.5    cegger }
    291   1.5    cegger 
    292   1.5    cegger static void
    293  1.22   msaitoh acpi_print_pci_sbdf(uint8_t seg, uint8_t bus, uint8_t device, uint8_t func)
    294   1.5    cegger {
    295   1.5    cegger 	if (bus == 0xff && device == 0xff && func == 0xff) {
    296   1.5    cegger 		printf("\tPCI Device=NONE\n");
    297   1.5    cegger 		return;
    298   1.5    cegger 	}
    299   1.5    cegger 
    300   1.5    cegger 	printf("\tPCI device={\n");
    301   1.5    cegger 	printf("\t\tSegment Group=%d\n", seg);
    302   1.5    cegger 	printf("\t\tBus=%d\n", bus);
    303   1.5    cegger 	printf("\t\tDevice=%d\n", device);
    304   1.5    cegger 	printf("\t\tFunction=%d\n", func);
    305   1.5    cegger 	printf("\t}\n");
    306   1.5    cegger }
    307   1.5    cegger 
    308   1.5    cegger #ifdef notyet
    309   1.5    cegger static void
    310   1.5    cegger acpi_print_hest_errorseverity(uint32_t error)
    311   1.5    cegger {
    312   1.5    cegger 	printf("\tError Severity={ ");
    313   1.5    cegger 	switch (error) {
    314   1.5    cegger 	case 0:
    315   1.5    cegger 		printf("Recoverable");
    316   1.5    cegger 		break;
    317   1.5    cegger 	case 1:
    318   1.5    cegger 		printf("Fatal");
    319   1.5    cegger 		break;
    320   1.5    cegger 	case 2:
    321   1.5    cegger 		printf("Corrected");
    322   1.5    cegger 		break;
    323   1.5    cegger 	case 3:
    324   1.5    cegger 		printf("None");
    325   1.5    cegger 		break;
    326   1.5    cegger 	default:
    327   1.5    cegger 		printf("%d (reserved)", error);
    328   1.5    cegger 		break;
    329   1.5    cegger 	}
    330   1.5    cegger 	printf("}\n");
    331   1.5    cegger }
    332   1.5    cegger #endif
    333   1.5    cegger 
    334   1.5    cegger static void
    335   1.5    cegger acpi_print_hest_errorbank(ACPI_HEST_IA_ERROR_BANK *bank)
    336   1.5    cegger {
    337   1.5    cegger 	printf("\n");
    338   1.5    cegger 	printf("\tBank Number=%d\n", bank->BankNumber);
    339  1.25   msaitoh 	printf("\tClear Status On Init={%s}\n",
    340   1.5    cegger 		bank->ClearStatusOnInit ? "NO" : "YES");
    341   1.5    cegger 	printf("\tStatus Data Format={ ");
    342   1.5    cegger 	switch (bank->StatusFormat) {
    343   1.5    cegger 	case 0:
    344   1.5    cegger 		printf("IA32 MCA");
    345   1.5    cegger 		break;
    346   1.5    cegger 	case 1:
    347   1.5    cegger 		printf("EMT64 MCA");
    348   1.5    cegger 		break;
    349   1.5    cegger 	case 2:
    350   1.5    cegger 		printf("AMD64 MCA");
    351   1.5    cegger 		break;
    352   1.5    cegger 	}
    353   1.5    cegger 	printf(" }\n");
    354   1.5    cegger 
    355   1.5    cegger 	if (bank->ControlRegister)
    356   1.5    cegger 		printf("\tControl Register=0x%x\n", bank->ControlRegister);
    357   1.5    cegger 	printf("\tControl Init Data=0x%"PRIx64"\n", bank->ControlData);
    358   1.5    cegger 	printf("\tStatus MSR=0x%x\n", bank->StatusRegister);
    359   1.5    cegger 	printf("\tAddress MSR=0x%x\n", bank->AddressRegister);
    360   1.5    cegger 	printf("\tMisc MSR=0x%x\n", bank->MiscRegister);
    361   1.5    cegger }
    362   1.5    cegger 
    363   1.5    cegger static void
    364   1.5    cegger acpi_print_hest_header(ACPI_HEST_HEADER *hest)
    365   1.5    cegger {
    366  1.25   msaitoh 	printf("\tType={");
    367   1.5    cegger 	switch (hest->Type) {
    368   1.5    cegger 	case ACPI_HEST_TYPE_IA32_CHECK:
    369   1.5    cegger 		printf("IA32 Machine Check Exception");
    370   1.5    cegger 		break;
    371   1.5    cegger 	case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
    372  1.25   msaitoh 		printf("IA32 Corrected Machine Check");
    373   1.5    cegger 		break;
    374   1.5    cegger 	case ACPI_HEST_TYPE_IA32_NMI:
    375  1.25   msaitoh 		printf("IA32 Non-Maskable Interrupt");
    376   1.5    cegger 		break;
    377   1.5    cegger 	case ACPI_HEST_TYPE_NOT_USED3:
    378   1.5    cegger 	case ACPI_HEST_TYPE_NOT_USED4:
    379   1.5    cegger 	case ACPI_HEST_TYPE_NOT_USED5:
    380  1.25   msaitoh 		printf("unused type: %d", hest->Type);
    381   1.5    cegger 		break;
    382   1.5    cegger 	case ACPI_HEST_TYPE_AER_ROOT_PORT:
    383  1.25   msaitoh 		printf("PCI Express Root Port AER");
    384   1.5    cegger 		break;
    385   1.5    cegger 	case ACPI_HEST_TYPE_AER_ENDPOINT:
    386  1.25   msaitoh 		printf("PCI Express Endpoint AER");
    387   1.5    cegger 		break;
    388   1.5    cegger 	case ACPI_HEST_TYPE_AER_BRIDGE:
    389  1.25   msaitoh 		printf("PCI Express/PCI-X Bridge AER");
    390   1.5    cegger 		break;
    391   1.5    cegger 	case ACPI_HEST_TYPE_GENERIC_ERROR:
    392  1.25   msaitoh 		printf("Generic Hardware Error Source");
    393   1.5    cegger 		break;
    394  1.19   msaitoh 	case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
    395  1.25   msaitoh 		printf("Generic Hardware Error Source version 2");
    396  1.19   msaitoh 		break;
    397   1.5    cegger 	case ACPI_HEST_TYPE_RESERVED:
    398   1.5    cegger 	default:
    399  1.25   msaitoh 		printf("Reserved (%d)", hest->Type);
    400   1.5    cegger 		break;
    401   1.5    cegger 	}
    402  1.25   msaitoh 	printf("}\n");
    403   1.5    cegger 	printf("\tSourceId=%d\n", hest->SourceId);
    404   1.5    cegger }
    405   1.5    cegger 
    406   1.5    cegger static void
    407   1.5    cegger acpi_print_hest_aer_common(ACPI_HEST_AER_COMMON *data)
    408   1.5    cegger {
    409  1.29   msaitoh 
    410  1.29   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_HEST_## flag, #flag)
    411  1.29   msaitoh 
    412  1.29   msaitoh 	printf("\tFlags=");
    413  1.29   msaitoh 	PRINTFLAG(data->Flags, FIRMWARE_FIRST);
    414  1.29   msaitoh 	PRINTFLAG(data->Flags, GLOBAL);
    415  1.29   msaitoh 	PRINTFLAG(data->Flags, GHES_ASSIST);
    416  1.29   msaitoh 	PRINTFLAG_END();
    417  1.29   msaitoh 
    418  1.29   msaitoh #undef PRINTFLAG
    419  1.29   msaitoh 
    420   1.5    cegger 	printf("\tEnabled={ %s ", data->Flags ? "YES" : "NO");
    421   1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    422   1.5    cegger 		printf("(ignored) ");
    423   1.5    cegger 	printf("}\n");
    424   1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    425   1.5    cegger 		data->RecordsToPreallocate);
    426   1.5    cegger 	printf("\tMax. Sections per Record=%d\n", data->MaxSectionsPerRecord);
    427   1.5    cegger 	if (!(data->Flags & ACPI_HEST_GLOBAL))
    428  1.22   msaitoh 		acpi_print_pci_sbdf(0, data->Bus, data->Device, data->Function);
    429   1.5    cegger 	printf("\tDevice Control=0x%x\n", data->DeviceControl);
    430   1.5    cegger 	printf("\tUncorrectable Error Mask Register=0x%x\n",
    431   1.5    cegger 		data->UncorrectableMask);
    432   1.5    cegger 	printf("\tUncorrectable Error Severity Register=0x%x\n",
    433   1.5    cegger 		data->UncorrectableSeverity);
    434   1.5    cegger 	printf("\tCorrectable Error Mask Register=0x%x\n",
    435   1.5    cegger 		data->CorrectableMask);
    436   1.5    cegger 	printf("\tAdvanced Capabilities Register=0x%x\n",
    437   1.5    cegger 		data->AdvancedCapabilities);
    438   1.5    cegger }
    439   1.5    cegger 
    440   1.5    cegger static void
    441   1.5    cegger acpi_print_hest_notify(ACPI_HEST_NOTIFY *notify)
    442   1.5    cegger {
    443   1.5    cegger 	printf("\tHW Error Notification={\n");
    444  1.25   msaitoh 	printf("\t\tType={");
    445   1.5    cegger 	switch (notify->Type) {
    446   1.5    cegger 	case ACPI_HEST_NOTIFY_POLLED:
    447   1.5    cegger 		printf("POLLED");
    448   1.5    cegger 		break;
    449   1.5    cegger 	case ACPI_HEST_NOTIFY_EXTERNAL:
    450   1.5    cegger 		printf("EXTERN");
    451   1.5    cegger 		break;
    452   1.5    cegger 	case ACPI_HEST_NOTIFY_LOCAL:
    453   1.5    cegger 		printf("LOCAL");
    454   1.5    cegger 		break;
    455   1.5    cegger 	case ACPI_HEST_NOTIFY_SCI:
    456   1.5    cegger 		printf("SCI");
    457   1.5    cegger 		break;
    458   1.5    cegger 	case ACPI_HEST_NOTIFY_NMI:
    459   1.5    cegger 		printf("NMI");
    460   1.5    cegger 		break;
    461  1.19   msaitoh 	case ACPI_HEST_NOTIFY_CMCI:
    462  1.19   msaitoh 		printf("CMCI");
    463  1.19   msaitoh 		break;
    464  1.19   msaitoh 	case ACPI_HEST_NOTIFY_MCE:
    465  1.19   msaitoh 		printf("MCE");
    466  1.19   msaitoh 		break;
    467  1.19   msaitoh 	case ACPI_HEST_NOTIFY_GPIO:
    468  1.19   msaitoh 		printf("GPIO-Signal");
    469  1.19   msaitoh 		break;
    470  1.19   msaitoh 	case ACPI_HEST_NOTIFY_SEA:
    471  1.19   msaitoh 		printf("ARMv8 SEA");
    472  1.19   msaitoh 		break;
    473  1.19   msaitoh 	case ACPI_HEST_NOTIFY_SEI:
    474  1.19   msaitoh 		printf("ARMv8 SEI");
    475  1.19   msaitoh 		break;
    476  1.19   msaitoh 	case ACPI_HEST_NOTIFY_GSIV:
    477  1.19   msaitoh 		printf("External Interrupt - GSIV");
    478  1.19   msaitoh 		break;
    479   1.5    cegger 	case ACPI_HEST_NOTIFY_RESERVED:
    480   1.5    cegger 		printf("RESERVED");
    481   1.5    cegger 		break;
    482   1.5    cegger 	default:
    483  1.25   msaitoh 		printf("%d (reserved)", notify->Type);
    484   1.5    cegger 		break;
    485   1.5    cegger 	}
    486  1.25   msaitoh 	printf("}\n");
    487   1.5    cegger 
    488   1.5    cegger 	printf("\t\tLength=%d\n", notify->Length);
    489  1.24   msaitoh 
    490  1.24   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_HEST_## flag, #flag)
    491  1.24   msaitoh 
    492  1.24   msaitoh 	printf("\t\tConfig Write Enable=");
    493  1.24   msaitoh 	PRINTFLAG(notify->ConfigWriteEnable, TYPE);
    494  1.24   msaitoh 	PRINTFLAG(notify->ConfigWriteEnable, POLL_INTERVAL);
    495  1.24   msaitoh 	PRINTFLAG(notify->ConfigWriteEnable, POLL_THRESHOLD_VALUE);
    496  1.24   msaitoh 	PRINTFLAG(notify->ConfigWriteEnable, POLL_THRESHOLD_WINDOW);
    497  1.24   msaitoh 	PRINTFLAG(notify->ConfigWriteEnable, ERR_THRESHOLD_VALUE);
    498  1.24   msaitoh 	PRINTFLAG(notify->ConfigWriteEnable, ERR_THRESHOLD_WINDOW);
    499  1.24   msaitoh 	PRINTFLAG_END();
    500  1.24   msaitoh 
    501  1.24   msaitoh #undef PRINTFLAG
    502   1.5    cegger 
    503   1.5    cegger 	printf("\t\tPoll Interval=%d msec\n", notify->PollInterval);
    504   1.5    cegger 	printf("\t\tInterrupt Vector=%d\n", notify->Vector);
    505   1.5    cegger 	printf("\t\tSwitch To Polling Threshold Value=%d\n",
    506   1.5    cegger 		notify->PollingThresholdValue);
    507   1.5    cegger 	printf("\t\tSwitch To Polling Threshold Window=%d msec\n",
    508   1.5    cegger 		notify->PollingThresholdWindow);
    509   1.5    cegger 	printf("\t\tError Threshold Value=%d\n",
    510   1.5    cegger 		notify->ErrorThresholdValue);
    511   1.5    cegger 	printf("\t\tError Threshold Window=%d msec\n",
    512   1.5    cegger 		notify->ErrorThresholdWindow);
    513   1.5    cegger 	printf("\t}\n");
    514   1.5    cegger }
    515   1.5    cegger 
    516   1.5    cegger #ifdef notyet
    517   1.5    cegger static void
    518   1.5    cegger acpi_print_hest_generic_status(ACPI_HEST_GENERIC_STATUS *data)
    519   1.5    cegger {
    520   1.5    cegger 	uint32_t i, pos, entries;
    521   1.5    cegger 	ACPI_HEST_GENERIC_DATA *gen;
    522   1.5    cegger 
    523   1.5    cegger 	entries = data->BlockStatus & ACPI_HEST_ERROR_ENTRY_COUNT;
    524   1.5    cegger 
    525   1.5    cegger 	printf("\tGeneric Error Status={\n");
    526   1.5    cegger 	printf("\t\tBlock Status={ ");
    527   1.5    cegger 	if (data->BlockStatus & ACPI_HEST_UNCORRECTABLE)
    528   1.5    cegger 		printf("UNCORRECTABLE");
    529   1.5    cegger 	if (data->BlockStatus & ACPI_HEST_CORRECTABLE)
    530   1.5    cegger 		printf("CORRECTABLE");
    531   1.5    cegger 	if (data->BlockStatus & ACPI_HEST_MULTIPLE_UNCORRECTABLE)
    532   1.5    cegger 		printf("MULTIPLE UNCORRECTABLE");
    533   1.5    cegger 	if (data->BlockStatus & ACPI_HEST_MULTIPLE_CORRECTABLE)
    534   1.5    cegger 		printf("MULTIPLE CORRECTABLE");
    535   1.5    cegger 	printf(" }\n");
    536   1.5    cegger 	printf("\t\tEntry Count=%d\n", entries);
    537   1.5    cegger 	printf("\t\tRaw Data Offset=%d\n", data->RawDataOffset);
    538   1.5    cegger 	printf("\t\tRaw Data Length=%d\n", data->RawDataLength);
    539   1.5    cegger 	printf("\t\tData Length=%d\n", data->DataLength);
    540   1.5    cegger 	printf("\t");
    541   1.5    cegger 	acpi_print_hest_errorseverity(data->ErrorSeverity);
    542   1.5    cegger 	printf("\t}\n");
    543   1.5    cegger 
    544   1.5    cegger 	pos = sizeof(ACPI_HEST_GENERIC_STATUS);
    545   1.5    cegger 	for (i = 0; i < entries; i++) {
    546   1.5    cegger 		gen = (ACPI_HEST_GENERIC_DATA *)((char *)data + pos);
    547   1.5    cegger 		acpi_print_hest_generic_data(gen);
    548   1.5    cegger 		pos += sizeof(ACPI_HEST_GENERIC_DATA);
    549   1.5    cegger 	}
    550   1.5    cegger }
    551   1.5    cegger #endif
    552   1.5    cegger 
    553   1.5    cegger #ifdef notyet
    554   1.5    cegger static void
    555   1.5    cegger acpi_print_hest_generic_data(ACPI_HEST_GENERIC_DATA *data)
    556   1.5    cegger {
    557   1.5    cegger 	printf("\tGeneric Error Data={\n");
    558   1.5    cegger 	printf("\t\tSectionType=");
    559   1.5    cegger 	acpi_print_string((char *)data->SectionType, sizeof(data->SectionType));
    560   1.5    cegger 	printf("\n\t");
    561   1.5    cegger 	acpi_print_hest_errorseverity(data->ErrorSeverity);
    562   1.5    cegger 	printf("\t\tRevision=0x%x\n", data->Revision);
    563   1.5    cegger 	printf("\t\tValidation Bits=0x%x\n", data->ValidationBits);
    564   1.5    cegger 	printf("\t\tFlags=0x%x\n", data->Flags);
    565   1.5    cegger 	printf("\t\tData Length=%d\n", data->ErrorDataLength);
    566   1.5    cegger 	printf("\t\tField Replication Unit Id=");
    567   1.5    cegger 	acpi_print_string((char *)data->FruId, sizeof(data->FruId));
    568   1.5    cegger 	printf("\n");
    569   1.5    cegger 	printf("\t\tField Replication Unit=");
    570   1.5    cegger 	acpi_print_string((char *)data->FruText, sizeof(data->FruText));
    571   1.5    cegger 	printf("\n");
    572   1.5    cegger 	printf("\t}\n");
    573   1.5    cegger }
    574   1.5    cegger #endif
    575   1.5    cegger 
    576   1.5    cegger static void
    577   1.5    cegger acpi_print_whea(ACPI_WHEA_HEADER *whea,
    578   1.5    cegger     void (*print_action)(ACPI_WHEA_HEADER *),
    579   1.5    cegger     void (*print_ins)(ACPI_WHEA_HEADER *),
    580   1.5    cegger     void (*print_flags)(ACPI_WHEA_HEADER *))
    581   1.5    cegger {
    582   1.5    cegger 	printf("\n");
    583   1.5    cegger 
    584   1.5    cegger 	print_action(whea);
    585   1.5    cegger 	print_ins(whea);
    586   1.5    cegger 	if (print_flags)
    587   1.5    cegger 		print_flags(whea);
    588   1.5    cegger 	printf("\tRegisterRegion=");
    589   1.5    cegger 	acpi_print_gas(&whea->RegisterRegion);
    590   1.5    cegger 	printf("\n");
    591   1.5    cegger 	printf("\tMASK=0x%08"PRIx64"\n", whea->Mask);
    592   1.5    cegger }
    593   1.5    cegger 
    594   1.5    cegger static void
    595   1.5    cegger acpi_print_hest_ia32_check(ACPI_HEST_IA_MACHINE_CHECK *data)
    596   1.5    cegger {
    597   1.5    cegger 	uint32_t i, pos;
    598   1.5    cegger 	ACPI_HEST_IA_ERROR_BANK *bank;
    599   1.5    cegger 
    600   1.5    cegger 	acpi_print_hest_header(&data->Header);
    601   1.5    cegger 	printf("\tFlags={ ");
    602   1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    603   1.5    cegger 		printf("FIRMWARE_FIRST");
    604   1.5    cegger 	printf(" }\n");
    605   1.5    cegger 	printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
    606   1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    607   1.5    cegger 		data->RecordsToPreallocate);
    608   1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    609   1.5    cegger 		data->MaxSectionsPerRecord);
    610   1.5    cegger 	printf("\tGlobal Capability Init Data=0x%"PRIx64"\n",
    611   1.5    cegger 		data->GlobalCapabilityData);
    612   1.5    cegger 	printf("\tGlobal Control Init Data=0x%"PRIx64"\n",
    613   1.5    cegger 		data->GlobalControlData);
    614   1.5    cegger 	printf("\tNumber of Hardware Error Reporting Banks=%d\n",
    615   1.5    cegger 		data->NumHardwareBanks);
    616   1.5    cegger 
    617   1.5    cegger 	pos = sizeof(ACPI_HEST_IA_MACHINE_CHECK);
    618   1.5    cegger 	for (i = 0; i < data->NumHardwareBanks; i++) {
    619   1.5    cegger 		bank = (ACPI_HEST_IA_ERROR_BANK *)((char *)data + pos);
    620   1.5    cegger 		acpi_print_hest_errorbank(bank);
    621   1.5    cegger 		pos += sizeof(ACPI_HEST_IA_ERROR_BANK);
    622   1.5    cegger 	}
    623   1.5    cegger }
    624   1.5    cegger 
    625   1.5    cegger static void
    626   1.5    cegger acpi_print_hest_ia32_correctedcheck(ACPI_HEST_IA_CORRECTED *data)
    627   1.5    cegger {
    628   1.5    cegger 	uint32_t i, pos;
    629   1.5    cegger 	ACPI_HEST_IA_ERROR_BANK *bank;
    630   1.5    cegger 
    631   1.5    cegger 	acpi_print_hest_header(&data->Header);
    632   1.5    cegger 	printf("\tFlags={ ");
    633   1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    634   1.5    cegger 		printf("FIRMWARE_FIRST");
    635   1.5    cegger 	printf(" }\n");
    636   1.5    cegger 	printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
    637   1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    638   1.5    cegger 		data->RecordsToPreallocate);
    639   1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    640   1.5    cegger 		data->MaxSectionsPerRecord);
    641   1.5    cegger 	acpi_print_hest_notify(&data->Notify);
    642   1.5    cegger 
    643   1.5    cegger 	printf("\tNumber of Hardware Error Reporting Banks=%d\n",
    644   1.5    cegger 		data->NumHardwareBanks);
    645   1.5    cegger 
    646   1.5    cegger 	pos = sizeof(ACPI_HEST_IA_MACHINE_CHECK);
    647   1.5    cegger 	for (i = 0; i < data->NumHardwareBanks; i++) {
    648   1.5    cegger 		bank = (ACPI_HEST_IA_ERROR_BANK *)((char *)data + pos);
    649   1.5    cegger 		acpi_print_hest_errorbank(bank);
    650   1.5    cegger 		pos += sizeof(ACPI_HEST_IA_ERROR_BANK);
    651   1.5    cegger 	}
    652   1.5    cegger }
    653   1.5    cegger 
    654   1.5    cegger static void
    655   1.5    cegger acpi_print_hest_ia32_nmi(ACPI_HEST_IA_NMI *data)
    656   1.5    cegger {
    657   1.5    cegger 	acpi_print_hest_header(&data->Header);
    658   1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    659   1.5    cegger 		data->RecordsToPreallocate);
    660   1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    661   1.5    cegger 		data->MaxSectionsPerRecord);
    662   1.5    cegger 	printf("\tMax Raw Data Length=%d\n",
    663   1.5    cegger 		data->MaxRawDataLength);
    664   1.5    cegger }
    665   1.5    cegger 
    666   1.5    cegger static void
    667   1.5    cegger acpi_print_hest_aer_root(ACPI_HEST_AER_ROOT *data)
    668   1.5    cegger {
    669   1.5    cegger 	acpi_print_hest_header(&data->Header);
    670   1.5    cegger 	acpi_print_hest_aer_common(&data->Aer);
    671   1.5    cegger 	printf("Root Error Command Register=0x%x\n", data->RootErrorCommand);
    672   1.5    cegger }
    673   1.5    cegger 
    674   1.5    cegger static void
    675   1.5    cegger acpi_print_hest_aer_endpoint(ACPI_HEST_AER *data)
    676   1.5    cegger {
    677   1.5    cegger 	acpi_print_hest_header(&data->Header);
    678   1.5    cegger 	acpi_print_hest_aer_common(&data->Aer);
    679   1.5    cegger }
    680   1.5    cegger 
    681   1.5    cegger static void
    682   1.5    cegger acpi_print_hest_aer_bridge(ACPI_HEST_AER_BRIDGE *data)
    683   1.5    cegger {
    684   1.5    cegger 	acpi_print_hest_header(&data->Header);
    685   1.5    cegger 	acpi_print_hest_aer_common(&data->Aer);
    686   1.5    cegger 
    687   1.5    cegger 	printf("\tSecondary Uncorrectable Error Mask Register=0x%x\n",
    688   1.5    cegger 		data->UncorrectableMask2);
    689   1.5    cegger 	printf("\tSecondary Uncorrectable Error Severity Register=0x%x\n",
    690   1.5    cegger 		data->UncorrectableSeverity2);
    691   1.5    cegger 	printf("\tSecondory Advanced Capabilities Register=0x%x\n",
    692   1.5    cegger 		data->AdvancedCapabilities2);
    693   1.5    cegger }
    694   1.5    cegger 
    695   1.5    cegger static void
    696   1.5    cegger acpi_print_hest_generic(ACPI_HEST_GENERIC *data)
    697   1.5    cegger {
    698   1.5    cegger 	acpi_print_hest_header(&data->Header);
    699   1.5    cegger 	if (data->RelatedSourceId != 0xffff)
    700   1.5    cegger 		printf("\tReleated SourceId=%d\n", data->RelatedSourceId);
    701  1.25   msaitoh 	printf("\tEnabled={%s}\n", data->Enabled ? "YES" : "NO");
    702  1.24   msaitoh 	printf("\tNumber of Records to pre-allocate=%u\n",
    703   1.5    cegger 		data->RecordsToPreallocate);
    704  1.24   msaitoh 	printf("\tMax Sections per Record=%u\n", data->MaxSectionsPerRecord);
    705  1.24   msaitoh 	printf("\tMax Raw Data Length=%u\n", data->MaxRawDataLength);
    706   1.5    cegger 	printf("\tError Status Address=");
    707   1.5    cegger 	acpi_print_gas(&data->ErrorStatusAddress);
    708  1.25   msaitoh 	printf("\n");
    709   1.5    cegger 	acpi_print_hest_notify(&data->Notify);
    710  1.24   msaitoh 	printf("\tError Block Length=%u\n", data->ErrorBlockLength);
    711   1.5    cegger }
    712   1.5    cegger 
    713   1.5    cegger static void
    714  1.19   msaitoh acpi_print_hest_generic_v2(ACPI_HEST_GENERIC_V2 *data)
    715  1.19   msaitoh {
    716  1.19   msaitoh 
    717  1.19   msaitoh 	/* The first 64 bytes are the same as ACPI_HEST_GENERIC */
    718  1.19   msaitoh 	acpi_print_hest_generic((ACPI_HEST_GENERIC *)data);
    719  1.19   msaitoh 
    720  1.19   msaitoh 	printf("\tError Status Address");
    721  1.19   msaitoh 	acpi_print_gas(&data->ReadAckRegister);
    722  1.44   msaitoh 	printf("\n\tRead Ack Preserve=0x%016jx\n",
    723  1.19   msaitoh 	    (uintmax_t)data->ReadAckPreserve);
    724  1.19   msaitoh 	printf("\tRead Ack Write=0x%016jx\n",
    725  1.19   msaitoh 	    (uintmax_t)data->ReadAckWrite);
    726  1.19   msaitoh }
    727  1.19   msaitoh 
    728  1.19   msaitoh static void
    729   1.5    cegger acpi_handle_hest(ACPI_TABLE_HEADER *sdp)
    730   1.5    cegger {
    731   1.5    cegger 	ACPI_TABLE_HEST *hest;
    732   1.5    cegger 	ACPI_HEST_HEADER *subhest;
    733   1.5    cegger 	uint32_t i, pos;
    734   1.5    cegger 
    735   1.5    cegger 	printf(BEGIN_COMMENT);
    736   1.5    cegger 	acpi_print_sdt(sdp);
    737   1.5    cegger 	hest = (ACPI_TABLE_HEST *)sdp;
    738   1.5    cegger 
    739   1.5    cegger 	printf("\tError Source Count=%d\n", hest->ErrorSourceCount);
    740   1.5    cegger 	pos = sizeof(ACPI_TABLE_HEST);
    741   1.5    cegger 	for (i = 0; i < hest->ErrorSourceCount; i++) {
    742   1.5    cegger 		subhest = (ACPI_HEST_HEADER *)((char *)hest + pos);
    743   1.5    cegger 		printf("\n");
    744   1.5    cegger 
    745   1.5    cegger 		switch (subhest->Type) {
    746   1.5    cegger 		case ACPI_HEST_TYPE_IA32_CHECK:
    747  1.24   msaitoh 			acpi_print_hest_ia32_check(
    748  1.24   msaitoh 				(ACPI_HEST_IA_MACHINE_CHECK *)subhest);
    749   1.5    cegger 			pos += sizeof(ACPI_HEST_IA_MACHINE_CHECK);
    750   1.5    cegger 			break;
    751   1.5    cegger 
    752   1.5    cegger 		case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
    753  1.24   msaitoh 			acpi_print_hest_ia32_correctedcheck(
    754  1.24   msaitoh 				(ACPI_HEST_IA_CORRECTED *)subhest);
    755   1.5    cegger 			pos += sizeof(ACPI_HEST_IA_CORRECTED);
    756   1.5    cegger 			break;
    757   1.5    cegger 
    758   1.5    cegger 		case ACPI_HEST_TYPE_IA32_NMI:
    759  1.24   msaitoh 			acpi_print_hest_ia32_nmi(
    760  1.24   msaitoh 				(ACPI_HEST_IA_NMI *)subhest);
    761   1.5    cegger 			pos += sizeof(ACPI_HEST_IA_NMI);
    762   1.5    cegger 			break;
    763   1.5    cegger 
    764   1.5    cegger 		case ACPI_HEST_TYPE_NOT_USED3:
    765   1.5    cegger 		case ACPI_HEST_TYPE_NOT_USED4:
    766   1.5    cegger 		case ACPI_HEST_TYPE_NOT_USED5:
    767   1.5    cegger 			pos += sizeof(ACPI_HEST_HEADER);
    768   1.5    cegger 			break;
    769   1.5    cegger 
    770   1.5    cegger 		case ACPI_HEST_TYPE_AER_ROOT_PORT:
    771  1.24   msaitoh 			acpi_print_hest_aer_root((ACPI_HEST_AER_ROOT *)subhest);
    772   1.5    cegger 			pos += sizeof(ACPI_HEST_AER_ROOT);
    773   1.5    cegger 			break;
    774   1.5    cegger 
    775   1.5    cegger 		case ACPI_HEST_TYPE_AER_ENDPOINT:
    776  1.24   msaitoh 			acpi_print_hest_aer_endpoint((ACPI_HEST_AER *)subhest);
    777  1.24   msaitoh 			pos += sizeof(ACPI_HEST_AER);
    778   1.5    cegger 			break;
    779   1.5    cegger 
    780   1.5    cegger 		case ACPI_HEST_TYPE_AER_BRIDGE:
    781  1.24   msaitoh 			acpi_print_hest_aer_bridge((ACPI_HEST_AER_BRIDGE *)subhest);
    782   1.5    cegger 			pos += sizeof(ACPI_HEST_AER_BRIDGE);
    783   1.5    cegger 			break;
    784   1.5    cegger 
    785   1.5    cegger 		case ACPI_HEST_TYPE_GENERIC_ERROR:
    786  1.24   msaitoh 			acpi_print_hest_generic((ACPI_HEST_GENERIC *)subhest);
    787   1.5    cegger 			pos += sizeof(ACPI_HEST_GENERIC);
    788   1.5    cegger 			break;
    789   1.5    cegger 
    790  1.19   msaitoh 		case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
    791  1.24   msaitoh 			acpi_print_hest_generic_v2(
    792  1.24   msaitoh 				(ACPI_HEST_GENERIC_V2 *)subhest);
    793  1.19   msaitoh 			pos += sizeof(ACPI_HEST_GENERIC_V2);
    794  1.19   msaitoh 			break;
    795  1.19   msaitoh 
    796   1.5    cegger 		case ACPI_HEST_TYPE_RESERVED:
    797   1.5    cegger 		default:
    798   1.5    cegger 			pos += sizeof(ACPI_HEST_HEADER);
    799   1.5    cegger 			break;
    800   1.5    cegger 		}
    801   1.5    cegger 	}
    802   1.5    cegger 
    803   1.5    cegger 	printf(END_COMMENT);
    804   1.5    cegger }
    805   1.5    cegger 
    806  1.18   msaitoh static uint64_t
    807  1.18   msaitoh acpi_select_address(uint32_t addr32, uint64_t addr64)
    808  1.18   msaitoh {
    809  1.18   msaitoh 
    810  1.18   msaitoh 	if (addr64 == 0)
    811  1.18   msaitoh 		return addr32;
    812  1.18   msaitoh 
    813  1.18   msaitoh 	if ((addr32 != 0) && ((addr64 & 0xfffffff) != addr32)) {
    814  1.18   msaitoh 		/*
    815  1.18   msaitoh 		 * A few systems (e.g., IBM T23) have an RSDP that claims
    816  1.18   msaitoh 		 * revision 2 but the 64 bit addresses are invalid.  If
    817  1.18   msaitoh 		 * revision 2 and the 32 bit address is non-zero but the
    818  1.18   msaitoh 		 * 32 and 64 bit versions don't match, prefer the 32 bit
    819  1.18   msaitoh 		 * version for all subsequent tables.
    820  1.18   msaitoh 		 */
    821  1.18   msaitoh 		return addr32;
    822  1.18   msaitoh 	}
    823  1.18   msaitoh 
    824  1.18   msaitoh 	return addr64;
    825  1.18   msaitoh }
    826  1.18   msaitoh 
    827   1.5    cegger static void
    828   1.5    cegger acpi_handle_fadt(ACPI_TABLE_HEADER *sdp)
    829   1.5    cegger {
    830   1.5    cegger 	ACPI_TABLE_HEADER *dsdp;
    831   1.5    cegger 	ACPI_TABLE_FACS	*facs;
    832   1.5    cegger 	ACPI_TABLE_FADT *fadt;
    833   1.5    cegger 
    834   1.5    cegger 	fadt = (ACPI_TABLE_FADT *)sdp;
    835   1.5    cegger 	acpi_print_fadt(sdp);
    836   1.5    cegger 
    837  1.33  jmcneill 	if (acpi_select_address(fadt->Facs, fadt->XFacs) == 0) {
    838  1.33  jmcneill 		if ((fadt->Flags & ACPI_FADT_HW_REDUCED) == 0)
    839  1.33  jmcneill 			errx(EXIT_FAILURE, "Missing FACS and HW_REDUCED_ACPI flag not set in FADT");
    840  1.47  jmcneill 	} else if ((fadt->Flags & ACPI_FADT_HW_REDUCED) == 0) {
    841  1.33  jmcneill 		facs = (ACPI_TABLE_FACS *)acpi_map_sdt(
    842  1.33  jmcneill 			acpi_select_address(fadt->Facs, fadt->XFacs));
    843  1.33  jmcneill 		if (memcmp(facs->Signature, ACPI_SIG_FACS, 4) != 0 || facs->Length < 64)
    844  1.33  jmcneill 			errx(EXIT_FAILURE, "FACS is corrupt");
    845  1.33  jmcneill 		acpi_print_facs(facs);
    846  1.33  jmcneill 	}
    847   1.5    cegger 
    848  1.18   msaitoh 	dsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(
    849  1.18   msaitoh 		acpi_select_address(fadt->Dsdt, fadt->XDsdt));
    850  1.17   msaitoh 	if (memcmp(dsdp->Signature, ACPI_SIG_DSDT, 4) != 0)
    851  1.17   msaitoh 		errx(EXIT_FAILURE, "DSDT signature mismatch");
    852   1.5    cegger 	if (acpi_checksum(dsdp, dsdp->Length))
    853   1.5    cegger 		errx(EXIT_FAILURE, "DSDT is corrupt");
    854   1.5    cegger 	acpi_print_dsdt(dsdp);
    855   1.5    cegger }
    856   1.5    cegger 
    857   1.5    cegger static void
    858   1.5    cegger acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
    859   1.5    cegger     void (*action)(ACPI_SUBTABLE_HEADER *))
    860   1.5    cegger {
    861   1.5    cegger 	ACPI_SUBTABLE_HEADER *subtable;
    862   1.5    cegger 	char *end;
    863   1.5    cegger 
    864   1.5    cegger 	subtable = first;
    865   1.5    cegger 	end = (char *)table + table->Length;
    866   1.5    cegger 	while ((char *)subtable < end) {
    867   1.5    cegger 		printf("\n");
    868  1.16   msaitoh 		if (subtable->Length < sizeof(ACPI_SUBTABLE_HEADER)) {
    869  1.16   msaitoh 			warnx("invalid subtable length %u", subtable->Length);
    870  1.16   msaitoh 			return;
    871  1.16   msaitoh 		}
    872   1.5    cegger 		action(subtable);
    873   1.5    cegger 		subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable +
    874   1.5    cegger 		    subtable->Length);
    875   1.5    cegger 	}
    876   1.5    cegger }
    877   1.5    cegger 
    878   1.5    cegger static void
    879  1.19   msaitoh acpi_walk_nfit(ACPI_TABLE_HEADER *table, void *first,
    880  1.19   msaitoh     void (*action)(ACPI_NFIT_HEADER *))
    881  1.19   msaitoh {
    882  1.19   msaitoh 	ACPI_NFIT_HEADER *subtable;
    883  1.19   msaitoh 	char *end;
    884  1.19   msaitoh 
    885  1.19   msaitoh 	subtable = first;
    886  1.19   msaitoh 	end = (char *)table + table->Length;
    887  1.19   msaitoh 	while ((char *)subtable < end) {
    888  1.19   msaitoh 		printf("\n");
    889  1.19   msaitoh 		if (subtable->Length < sizeof(ACPI_NFIT_HEADER)) {
    890  1.19   msaitoh 			warnx("invalid subtable length %u", subtable->Length);
    891  1.19   msaitoh 			return;
    892  1.19   msaitoh 		}
    893  1.19   msaitoh 		action(subtable);
    894  1.19   msaitoh 		subtable = (ACPI_NFIT_HEADER *)((char *)subtable +
    895  1.19   msaitoh 		    subtable->Length);
    896  1.19   msaitoh 	}
    897  1.19   msaitoh }
    898  1.19   msaitoh 
    899  1.19   msaitoh static void
    900   1.5    cegger acpi_print_cpu(u_char cpu_id)
    901   1.5    cegger {
    902   1.5    cegger 
    903   1.5    cegger 	printf("\tACPI CPU=");
    904   1.5    cegger 	if (cpu_id == 0xff)
    905   1.5    cegger 		printf("ALL\n");
    906   1.5    cegger 	else
    907   1.5    cegger 		printf("%d\n", (u_int)cpu_id);
    908   1.5    cegger }
    909   1.5    cegger 
    910   1.5    cegger static void
    911   1.5    cegger acpi_print_cpu_uid(uint32_t uid, char *uid_string)
    912   1.5    cegger {
    913   1.5    cegger 
    914   1.5    cegger 	printf("\tUID=%d", uid);
    915   1.5    cegger 	if (uid_string != NULL)
    916   1.5    cegger 		printf(" (%s)", uid_string);
    917   1.5    cegger 	printf("\n");
    918   1.5    cegger }
    919   1.5    cegger 
    920   1.5    cegger static void
    921   1.5    cegger acpi_print_local_apic(uint32_t apic_id, uint32_t flags)
    922   1.5    cegger {
    923   1.5    cegger 
    924   1.5    cegger 	printf("\tFlags={");
    925   1.5    cegger 	if (flags & ACPI_MADT_ENABLED)
    926   1.5    cegger 		printf("ENABLED");
    927   1.5    cegger 	else
    928   1.5    cegger 		printf("DISABLED");
    929   1.5    cegger 	printf("}\n");
    930   1.5    cegger 	printf("\tAPIC ID=%d\n", apic_id);
    931   1.5    cegger }
    932   1.5    cegger 
    933   1.5    cegger static void
    934   1.5    cegger acpi_print_io_apic(uint32_t apic_id, uint32_t int_base, uint64_t apic_addr)
    935   1.5    cegger {
    936   1.5    cegger 
    937   1.5    cegger 	printf("\tAPIC ID=%d\n", apic_id);
    938   1.5    cegger 	printf("\tINT BASE=%d\n", int_base);
    939   1.5    cegger 	printf("\tADDR=0x%016jx\n", (uintmax_t)apic_addr);
    940   1.5    cegger }
    941   1.5    cegger 
    942   1.5    cegger static void
    943   1.5    cegger acpi_print_mps_flags(uint16_t flags)
    944   1.5    cegger {
    945   1.5    cegger 
    946   1.5    cegger 	printf("\tFlags={Polarity=");
    947   1.5    cegger 	switch (flags & ACPI_MADT_POLARITY_MASK) {
    948   1.5    cegger 	case ACPI_MADT_POLARITY_CONFORMS:
    949   1.5    cegger 		printf("conforming");
    950   1.5    cegger 		break;
    951   1.5    cegger 	case ACPI_MADT_POLARITY_ACTIVE_HIGH:
    952   1.5    cegger 		printf("active-hi");
    953   1.5    cegger 		break;
    954   1.5    cegger 	case ACPI_MADT_POLARITY_ACTIVE_LOW:
    955   1.5    cegger 		printf("active-lo");
    956   1.5    cegger 		break;
    957   1.5    cegger 	default:
    958   1.5    cegger 		printf("0x%x", flags & ACPI_MADT_POLARITY_MASK);
    959   1.5    cegger 		break;
    960   1.5    cegger 	}
    961   1.5    cegger 	printf(", Trigger=");
    962   1.5    cegger 	switch (flags & ACPI_MADT_TRIGGER_MASK) {
    963   1.5    cegger 	case ACPI_MADT_TRIGGER_CONFORMS:
    964   1.5    cegger 		printf("conforming");
    965   1.5    cegger 		break;
    966   1.5    cegger 	case ACPI_MADT_TRIGGER_EDGE:
    967   1.5    cegger 		printf("edge");
    968   1.5    cegger 		break;
    969   1.5    cegger 	case ACPI_MADT_TRIGGER_LEVEL:
    970   1.5    cegger 		printf("level");
    971   1.5    cegger 		break;
    972   1.5    cegger 	default:
    973   1.5    cegger 		printf("0x%x", (flags & ACPI_MADT_TRIGGER_MASK) >> 2);
    974   1.5    cegger 	}
    975   1.5    cegger 	printf("}\n");
    976   1.5    cegger }
    977   1.5    cegger 
    978   1.5    cegger static void
    979  1.16   msaitoh acpi_print_gicc_flags(uint32_t flags)
    980  1.16   msaitoh {
    981  1.16   msaitoh 
    982  1.53     skrll 	printf("\tFlags={");
    983  1.53     skrll 	if (flags & ACPI_MADT_ENABLED)
    984  1.53     skrll 		printf("enabled");
    985  1.53     skrll 	else
    986  1.53     skrll 		printf("disabled");
    987  1.53     skrll 	printf(", Performance intr=");
    988  1.16   msaitoh 	if (flags & ACPI_MADT_PERFORMANCE_IRQ_MODE)
    989  1.16   msaitoh 		printf("edge");
    990  1.16   msaitoh 	else
    991  1.16   msaitoh 		printf("level");
    992  1.16   msaitoh 	printf(", VGIC intr=");
    993  1.16   msaitoh 	if (flags & ACPI_MADT_VGIC_IRQ_MODE)
    994  1.16   msaitoh 		printf("edge");
    995  1.16   msaitoh 	else
    996  1.16   msaitoh 		printf("level");
    997  1.16   msaitoh 	printf("}\n");
    998  1.16   msaitoh }
    999  1.16   msaitoh 
   1000  1.16   msaitoh static void
   1001   1.5    cegger acpi_print_intr(uint32_t intr, uint16_t mps_flags)
   1002   1.5    cegger {
   1003   1.5    cegger 
   1004   1.5    cegger 	printf("\tINTR=%d\n", intr);
   1005   1.5    cegger 	acpi_print_mps_flags(mps_flags);
   1006   1.5    cegger }
   1007   1.5    cegger 
   1008   1.5    cegger static void
   1009  1.51    rillig acpi_print_local_nmi(u_int local_int, uint16_t mps_flags)
   1010   1.5    cegger {
   1011   1.5    cegger 
   1012  1.51    rillig 	printf("\tLINT Pin=%d\n", local_int);
   1013   1.5    cegger 	acpi_print_mps_flags(mps_flags);
   1014   1.5    cegger }
   1015   1.5    cegger 
   1016  1.16   msaitoh static const char *apic_types[] = {
   1017  1.16   msaitoh     [ACPI_MADT_TYPE_LOCAL_APIC] = "Local APIC",
   1018  1.16   msaitoh     [ACPI_MADT_TYPE_IO_APIC] = "IO APIC",
   1019  1.16   msaitoh     [ACPI_MADT_TYPE_INTERRUPT_OVERRIDE] = "INT Override",
   1020  1.16   msaitoh     [ACPI_MADT_TYPE_NMI_SOURCE] = "NMI",
   1021  1.16   msaitoh     [ACPI_MADT_TYPE_LOCAL_APIC_NMI] = "Local APIC NMI",
   1022  1.16   msaitoh     [ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE] = "Local APIC Override",
   1023  1.16   msaitoh     [ACPI_MADT_TYPE_IO_SAPIC] = "IO SAPIC",
   1024  1.16   msaitoh     [ACPI_MADT_TYPE_LOCAL_SAPIC] = "Local SAPIC",
   1025  1.16   msaitoh     [ACPI_MADT_TYPE_INTERRUPT_SOURCE] = "Platform Interrupt",
   1026  1.16   msaitoh     [ACPI_MADT_TYPE_LOCAL_X2APIC] = "Local X2APIC",
   1027  1.16   msaitoh     [ACPI_MADT_TYPE_LOCAL_X2APIC_NMI] = "Local X2APIC NMI",
   1028  1.16   msaitoh     [ACPI_MADT_TYPE_GENERIC_INTERRUPT] = "GIC CPU Interface Structure",
   1029  1.16   msaitoh     [ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR] = "GIC Distributor Structure",
   1030  1.16   msaitoh     [ACPI_MADT_TYPE_GENERIC_MSI_FRAME] = "GICv2m MSI Frame",
   1031  1.16   msaitoh     [ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR] = "GIC Redistributor Structure",
   1032  1.16   msaitoh     [ACPI_MADT_TYPE_GENERIC_TRANSLATOR] = "GIC ITS Structure"
   1033  1.16   msaitoh };
   1034  1.16   msaitoh 
   1035  1.16   msaitoh static const char *platform_int_types[] = { "0 (unknown)", "PMI", "INIT",
   1036  1.16   msaitoh 					    "Corrected Platform Error" };
   1037   1.5    cegger 
   1038   1.5    cegger static void
   1039  1.19   msaitoh acpi_print_gicm_flags(ACPI_MADT_GENERIC_MSI_FRAME *gicm)
   1040  1.19   msaitoh {
   1041  1.19   msaitoh 	uint32_t flags = gicm->Flags;
   1042  1.19   msaitoh 
   1043  1.25   msaitoh 	printf("\tFLAGS={");
   1044  1.19   msaitoh 	if (flags & ACPI_MADT_OVERRIDE_SPI_VALUES)
   1045  1.19   msaitoh 		printf("SPI Count/Base Select");
   1046  1.19   msaitoh 	printf("}\n");
   1047  1.19   msaitoh }
   1048  1.19   msaitoh 
   1049  1.19   msaitoh static void
   1050   1.5    cegger acpi_print_madt(ACPI_SUBTABLE_HEADER *mp)
   1051   1.5    cegger {
   1052   1.5    cegger 	ACPI_MADT_LOCAL_APIC *lapic;
   1053   1.5    cegger 	ACPI_MADT_IO_APIC *ioapic;
   1054   1.5    cegger 	ACPI_MADT_INTERRUPT_OVERRIDE *over;
   1055   1.5    cegger 	ACPI_MADT_NMI_SOURCE *nmi;
   1056   1.5    cegger 	ACPI_MADT_LOCAL_APIC_NMI *lapic_nmi;
   1057   1.5    cegger 	ACPI_MADT_LOCAL_APIC_OVERRIDE *lapic_over;
   1058   1.5    cegger 	ACPI_MADT_IO_SAPIC *iosapic;
   1059   1.5    cegger 	ACPI_MADT_LOCAL_SAPIC *lsapic;
   1060   1.5    cegger 	ACPI_MADT_INTERRUPT_SOURCE *isrc;
   1061   1.5    cegger 	ACPI_MADT_LOCAL_X2APIC *x2apic;
   1062   1.5    cegger 	ACPI_MADT_LOCAL_X2APIC_NMI *x2apic_nmi;
   1063  1.16   msaitoh 	ACPI_MADT_GENERIC_INTERRUPT *gicc;
   1064  1.16   msaitoh 	ACPI_MADT_GENERIC_DISTRIBUTOR *gicd;
   1065  1.19   msaitoh 	ACPI_MADT_GENERIC_MSI_FRAME *gicm;
   1066  1.16   msaitoh 	ACPI_MADT_GENERIC_REDISTRIBUTOR *gicr;
   1067  1.16   msaitoh 	ACPI_MADT_GENERIC_TRANSLATOR *gict;
   1068   1.5    cegger 
   1069  1.16   msaitoh 	if (mp->Type < __arraycount(apic_types))
   1070   1.5    cegger 		printf("\tType=%s\n", apic_types[mp->Type]);
   1071   1.5    cegger 	else
   1072   1.5    cegger 		printf("\tType=%d (unknown)\n", mp->Type);
   1073   1.5    cegger 	switch (mp->Type) {
   1074   1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_APIC:
   1075   1.5    cegger 		lapic = (ACPI_MADT_LOCAL_APIC *)mp;
   1076   1.5    cegger 		acpi_print_cpu(lapic->ProcessorId);
   1077   1.5    cegger 		acpi_print_local_apic(lapic->Id, lapic->LapicFlags);
   1078   1.5    cegger 		break;
   1079   1.5    cegger 	case ACPI_MADT_TYPE_IO_APIC:
   1080   1.5    cegger 		ioapic = (ACPI_MADT_IO_APIC *)mp;
   1081   1.5    cegger 		acpi_print_io_apic(ioapic->Id, ioapic->GlobalIrqBase,
   1082   1.5    cegger 		    ioapic->Address);
   1083   1.5    cegger 		break;
   1084   1.5    cegger 	case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
   1085   1.5    cegger 		over = (ACPI_MADT_INTERRUPT_OVERRIDE *)mp;
   1086   1.5    cegger 		printf("\tBUS=%d\n", (u_int)over->Bus);
   1087   1.5    cegger 		printf("\tIRQ=%d\n", (u_int)over->SourceIrq);
   1088   1.5    cegger 		acpi_print_intr(over->GlobalIrq, over->IntiFlags);
   1089   1.5    cegger 		break;
   1090   1.5    cegger 	case ACPI_MADT_TYPE_NMI_SOURCE:
   1091   1.5    cegger 		nmi = (ACPI_MADT_NMI_SOURCE *)mp;
   1092   1.5    cegger 		acpi_print_intr(nmi->GlobalIrq, nmi->IntiFlags);
   1093   1.5    cegger 		break;
   1094   1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
   1095   1.5    cegger 		lapic_nmi = (ACPI_MADT_LOCAL_APIC_NMI *)mp;
   1096   1.5    cegger 		acpi_print_cpu(lapic_nmi->ProcessorId);
   1097   1.5    cegger 		acpi_print_local_nmi(lapic_nmi->Lint, lapic_nmi->IntiFlags);
   1098   1.5    cegger 		break;
   1099   1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
   1100   1.5    cegger 		lapic_over = (ACPI_MADT_LOCAL_APIC_OVERRIDE *)mp;
   1101   1.5    cegger 		printf("\tLocal APIC ADDR=0x%016jx\n",
   1102   1.5    cegger 		    (uintmax_t)lapic_over->Address);
   1103   1.5    cegger 		break;
   1104   1.5    cegger 	case ACPI_MADT_TYPE_IO_SAPIC:
   1105   1.5    cegger 		iosapic = (ACPI_MADT_IO_SAPIC *)mp;
   1106   1.5    cegger 		acpi_print_io_apic(iosapic->Id, iosapic->GlobalIrqBase,
   1107   1.5    cegger 		    iosapic->Address);
   1108   1.5    cegger 		break;
   1109   1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_SAPIC:
   1110   1.5    cegger 		lsapic = (ACPI_MADT_LOCAL_SAPIC *)mp;
   1111   1.5    cegger 		acpi_print_cpu(lsapic->ProcessorId);
   1112   1.5    cegger 		acpi_print_local_apic(lsapic->Id, lsapic->LapicFlags);
   1113   1.5    cegger 		printf("\tAPIC EID=%d\n", (u_int)lsapic->Eid);
   1114   1.5    cegger 		if (mp->Length > offsetof(ACPI_MADT_LOCAL_SAPIC, Uid))
   1115   1.5    cegger 			acpi_print_cpu_uid(lsapic->Uid, lsapic->UidString);
   1116   1.5    cegger 		break;
   1117   1.5    cegger 	case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
   1118   1.5    cegger 		isrc = (ACPI_MADT_INTERRUPT_SOURCE *)mp;
   1119  1.16   msaitoh 		if (isrc->Type < __arraycount(platform_int_types))
   1120   1.5    cegger 			printf("\tType=%s\n", platform_int_types[isrc->Type]);
   1121   1.5    cegger 		else
   1122   1.5    cegger 			printf("\tType=%d (unknown)\n", isrc->Type);
   1123   1.5    cegger 		printf("\tAPIC ID=%d\n", (u_int)isrc->Id);
   1124   1.5    cegger 		printf("\tAPIC EID=%d\n", (u_int)isrc->Eid);
   1125   1.5    cegger 		printf("\tSAPIC Vector=%d\n", (u_int)isrc->IoSapicVector);
   1126   1.5    cegger 		acpi_print_intr(isrc->GlobalIrq, isrc->IntiFlags);
   1127   1.5    cegger 		break;
   1128   1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_X2APIC:
   1129   1.5    cegger 		x2apic = (ACPI_MADT_LOCAL_X2APIC *)mp;
   1130   1.5    cegger 		acpi_print_cpu_uid(x2apic->Uid, NULL);
   1131   1.5    cegger 		acpi_print_local_apic(x2apic->LocalApicId, x2apic->LapicFlags);
   1132   1.5    cegger 		break;
   1133   1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
   1134   1.5    cegger 		x2apic_nmi = (ACPI_MADT_LOCAL_X2APIC_NMI *)mp;
   1135   1.5    cegger 		acpi_print_cpu_uid(x2apic_nmi->Uid, NULL);
   1136   1.5    cegger 		acpi_print_local_nmi(x2apic_nmi->Lint, x2apic_nmi->IntiFlags);
   1137   1.5    cegger 		break;
   1138  1.16   msaitoh 	case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
   1139  1.16   msaitoh 		gicc = (ACPI_MADT_GENERIC_INTERRUPT *)mp;
   1140  1.16   msaitoh 		acpi_print_cpu_uid(gicc->Uid, NULL);
   1141  1.16   msaitoh 		printf("\tCPU INTERFACE=%x\n", gicc->CpuInterfaceNumber);
   1142  1.16   msaitoh 		acpi_print_gicc_flags(gicc->Flags);
   1143  1.16   msaitoh 		printf("\tParking Protocol Version=%x\n", gicc->ParkingVersion);
   1144  1.16   msaitoh 		printf("\tPERF INTR=%d\n", gicc->PerformanceInterrupt);
   1145  1.16   msaitoh 		printf("\tParked ADDR=%016jx\n",
   1146  1.16   msaitoh 		    (uintmax_t)gicc->ParkedAddress);
   1147  1.16   msaitoh 		printf("\tBase ADDR=%016jx\n", (uintmax_t)gicc->BaseAddress);
   1148  1.16   msaitoh 		printf("\tGICV=%016jx\n", (uintmax_t)gicc->GicvBaseAddress);
   1149  1.16   msaitoh 		printf("\tGICH=%016jx\n", (uintmax_t)gicc->GichBaseAddress);
   1150  1.16   msaitoh 		printf("\tVGIC INTR=%d\n", gicc->VgicInterrupt);
   1151  1.16   msaitoh 		printf("\tGICR ADDR=%016jx\n",
   1152  1.16   msaitoh 		    (uintmax_t)gicc->GicrBaseAddress);
   1153  1.16   msaitoh 		printf("\tMPIDR=%jx\n", (uintmax_t)gicc->ArmMpidr);
   1154  1.55    andvar 		printf("\tEfficiency Class=%d\n", (u_int)gicc->EfficiencyClass);
   1155  1.16   msaitoh 		break;
   1156  1.16   msaitoh 	case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
   1157  1.16   msaitoh 		gicd = (ACPI_MADT_GENERIC_DISTRIBUTOR *)mp;
   1158  1.16   msaitoh 		printf("\tGIC ID=%d\n", (u_int)gicd->GicId);
   1159  1.16   msaitoh 		printf("\tBase ADDR=%016jx\n", (uintmax_t)gicd->BaseAddress);
   1160  1.16   msaitoh 		printf("\tVector Base=%d\n", gicd->GlobalIrqBase);
   1161  1.16   msaitoh 		printf("\tGIC VERSION=%d\n", (u_int)gicd->Version);
   1162  1.16   msaitoh 		break;
   1163  1.19   msaitoh 	case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
   1164  1.19   msaitoh 		gicm = (ACPI_MADT_GENERIC_MSI_FRAME*)mp;
   1165  1.19   msaitoh 		printf("\tBase ADDR=%016jx\n", (uintmax_t)gicm->BaseAddress);
   1166  1.19   msaitoh 		acpi_print_gicm_flags(gicm);
   1167  1.19   msaitoh 		printf("\tSPI Count=%u\n", gicm->SpiCount);
   1168  1.19   msaitoh 		printf("\tSPI Base=%u\n", gicm->SpiBase);
   1169  1.19   msaitoh 		break;
   1170  1.16   msaitoh 	case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
   1171  1.16   msaitoh 		gicr = (ACPI_MADT_GENERIC_REDISTRIBUTOR *)mp;
   1172  1.16   msaitoh 		printf("\tBase ADDR=%016jx\n", (uintmax_t)gicr->BaseAddress);
   1173  1.16   msaitoh 		printf("\tLength=%08x\n", gicr->Length);
   1174  1.16   msaitoh 		break;
   1175  1.16   msaitoh 	case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
   1176  1.16   msaitoh 		gict = (ACPI_MADT_GENERIC_TRANSLATOR *)mp;
   1177  1.16   msaitoh 		printf("\tGIC ITS ID=%d\n", gict->TranslationId);
   1178  1.16   msaitoh 		printf("\tBase ADDR=%016jx\n", (uintmax_t)gict->BaseAddress);
   1179  1.16   msaitoh 		break;
   1180   1.5    cegger 	}
   1181   1.5    cegger }
   1182   1.5    cegger 
   1183   1.5    cegger #ifdef notyet
   1184   1.5    cegger static void
   1185   1.5    cegger acpi_print_bert_region(ACPI_BERT_REGION *region)
   1186   1.5    cegger {
   1187   1.5    cegger 	uint32_t i, pos, entries;
   1188   1.5    cegger 	ACPI_HEST_GENERIC_DATA *data;
   1189   1.5    cegger 
   1190   1.5    cegger 	printf("\n");
   1191   1.5    cegger 	printf("\tBlockStatus={ ");
   1192   1.5    cegger 
   1193   1.5    cegger 	if (region->BlockStatus & ACPI_BERT_UNCORRECTABLE)
   1194   1.5    cegger 		printf("Uncorrectable");
   1195   1.5    cegger 	if (region->BlockStatus & ACPI_BERT_CORRECTABLE)
   1196   1.5    cegger 		printf("Correctable");
   1197   1.5    cegger 	if (region->BlockStatus & ACPI_BERT_MULTIPLE_UNCORRECTABLE)
   1198   1.5    cegger 		printf("Multiple Uncorrectable");
   1199   1.5    cegger 	if (region->BlockStatus & ACPI_BERT_MULTIPLE_CORRECTABLE)
   1200   1.5    cegger 		printf("Multiple Correctable");
   1201   1.5    cegger 	entries = region->BlockStatus & ACPI_BERT_ERROR_ENTRY_COUNT;
   1202   1.5    cegger 	printf(", Error Entry Count=%d", entries);
   1203   1.5    cegger 	printf("}\n");
   1204   1.5    cegger 
   1205   1.5    cegger 	printf("\tRaw Data Offset=0x%x\n", region->RawDataOffset);
   1206   1.5    cegger 	printf("\tRaw Data Length=0x%x\n", region->RawDataLength);
   1207   1.5    cegger 	printf("\tData Length=0x%x\n", region->DataLength);
   1208   1.5    cegger 
   1209   1.5    cegger 	acpi_print_hest_errorseverity(region->ErrorSeverity);
   1210   1.5    cegger 
   1211   1.5    cegger 	pos = sizeof(ACPI_BERT_REGION);
   1212   1.5    cegger 	for (i = 0; i < entries; i++) {
   1213   1.5    cegger 		data = (ACPI_HEST_GENERIC_DATA *)((char *)region + pos);
   1214   1.5    cegger 		acpi_print_hest_generic_data(data);
   1215   1.5    cegger 		pos += sizeof(ACPI_HEST_GENERIC_DATA);
   1216   1.5    cegger 	}
   1217   1.5    cegger }
   1218   1.5    cegger #endif
   1219   1.5    cegger 
   1220   1.5    cegger static void
   1221   1.5    cegger acpi_handle_bert(ACPI_TABLE_HEADER *sdp)
   1222   1.5    cegger {
   1223   1.5    cegger 	ACPI_TABLE_BERT *bert;
   1224   1.5    cegger 
   1225   1.5    cegger 	printf(BEGIN_COMMENT);
   1226   1.5    cegger 	acpi_print_sdt(sdp);
   1227   1.5    cegger 	bert = (ACPI_TABLE_BERT *)sdp;
   1228   1.5    cegger 
   1229   1.5    cegger 	printf("\tLength of Boot Error Region=%d bytes\n", bert->RegionLength);
   1230   1.5    cegger 	printf("\tPhysical Address of Region=0x%"PRIx64"\n", bert->Address);
   1231   1.5    cegger 
   1232   1.5    cegger 	printf(END_COMMENT);
   1233   1.5    cegger }
   1234   1.5    cegger 
   1235   1.5    cegger static void
   1236  1.40   msaitoh acpi_handle_bgrt(ACPI_TABLE_HEADER *sdp)
   1237  1.40   msaitoh {
   1238  1.40   msaitoh 	ACPI_TABLE_BGRT *bgrt;
   1239  1.40   msaitoh 	unsigned int degree;
   1240  1.40   msaitoh 
   1241  1.40   msaitoh 	printf(BEGIN_COMMENT);
   1242  1.40   msaitoh 	acpi_print_sdt(sdp);
   1243  1.40   msaitoh 	bgrt = (ACPI_TABLE_BGRT *)sdp;
   1244  1.40   msaitoh 
   1245  1.40   msaitoh 	printf("\tVersion=%hu\n", bgrt->Version);
   1246  1.40   msaitoh 	degree = ((unsigned int)(bgrt->Status & ACPI_BGRT_ORIENTATION_OFFSET)
   1247  1.40   msaitoh 	    >> 1) * 90;
   1248  1.40   msaitoh 	printf("\tDegree=%u\n", degree);
   1249  1.41      maya 	printf("\tDisplayed=%u\n", bgrt->Status & ACPI_BGRT_DISPLAYED);
   1250  1.40   msaitoh 	printf("\tImage Type=");
   1251  1.40   msaitoh 	switch (bgrt->ImageType) {
   1252  1.40   msaitoh 	case 0:
   1253  1.40   msaitoh 		printf("Bitmap\n");
   1254  1.40   msaitoh 		break;
   1255  1.40   msaitoh 	default:
   1256  1.40   msaitoh 		printf("reserved (0x%hhx)\n", bgrt->ImageType);
   1257  1.40   msaitoh 		break;
   1258  1.40   msaitoh 	}
   1259  1.40   msaitoh 	printf("\tImage Address=0x%"PRIx64"\n", bgrt->ImageAddress);
   1260  1.40   msaitoh 	printf("\tImage Offset X=0x%08x\n", bgrt->ImageOffsetX);
   1261  1.40   msaitoh 	printf("\tImage Offset Y=0x%08x\n", bgrt->ImageOffsetY);
   1262  1.40   msaitoh 
   1263  1.40   msaitoh 	printf(END_COMMENT);
   1264  1.40   msaitoh }
   1265  1.40   msaitoh 
   1266  1.40   msaitoh static void
   1267   1.5    cegger acpi_handle_boot(ACPI_TABLE_HEADER *sdp)
   1268   1.5    cegger {
   1269   1.5    cegger 	ACPI_TABLE_BOOT *boot;
   1270   1.5    cegger 
   1271   1.5    cegger 	printf(BEGIN_COMMENT);
   1272   1.5    cegger 	acpi_print_sdt(sdp);
   1273   1.5    cegger 	boot = (ACPI_TABLE_BOOT *)sdp;
   1274   1.5    cegger 	printf("\tCMOS Index=0x%02x\n", boot->CmosIndex);
   1275   1.5    cegger 	printf(END_COMMENT);
   1276   1.5    cegger }
   1277   1.5    cegger 
   1278   1.5    cegger static void
   1279   1.5    cegger acpi_handle_cpep(ACPI_TABLE_HEADER *sdp)
   1280   1.5    cegger {
   1281   1.5    cegger 	ACPI_TABLE_CPEP *cpep;
   1282   1.5    cegger 	ACPI_CPEP_POLLING *poll;
   1283   1.5    cegger 	uint32_t cpep_pos;
   1284   1.5    cegger 
   1285   1.5    cegger 	printf(BEGIN_COMMENT);
   1286   1.5    cegger 	acpi_print_sdt(sdp);
   1287   1.5    cegger 	cpep = (ACPI_TABLE_CPEP *)sdp;
   1288   1.5    cegger 
   1289   1.5    cegger 	cpep_pos = sizeof(ACPI_TABLE_CPEP);
   1290   1.5    cegger 	while (cpep_pos < sdp->Length) {
   1291   1.5    cegger 		poll = (ACPI_CPEP_POLLING *)((char *)cpep + cpep_pos);
   1292   1.5    cegger 		acpi_print_cpu(poll->Id);
   1293   1.5    cegger 		printf("\tACPI CPU EId=%d\n", poll->Eid);
   1294   1.5    cegger 		printf("\tPoll Interval=%d msec\n", poll->Interval);
   1295   1.5    cegger 		cpep_pos += sizeof(ACPI_CPEP_POLLING);
   1296   1.5    cegger 	}
   1297   1.5    cegger 	printf(END_COMMENT);
   1298   1.5    cegger }
   1299   1.5    cegger 
   1300   1.5    cegger static void
   1301  1.39   msaitoh acpi_print_csrt_resource_group(ACPI_CSRT_GROUP *grp)
   1302  1.39   msaitoh {
   1303  1.39   msaitoh 	ACPI_CSRT_DESCRIPTOR *desc;
   1304  1.39   msaitoh 
   1305  1.39   msaitoh 	printf("\tLength=%u\n", grp->Length);
   1306  1.39   msaitoh 	printf("\tVendorId=");
   1307  1.39   msaitoh 	acpi_print_string((char *)&grp->VendorId, 4);
   1308  1.39   msaitoh 	printf("\n");
   1309  1.39   msaitoh 	if (grp->SubvendorId != 0) {
   1310  1.39   msaitoh 		printf("\tSubvendorId=");
   1311  1.39   msaitoh 		acpi_print_string((char *)&grp->SubvendorId, 4);
   1312  1.39   msaitoh 		printf("\n");
   1313  1.39   msaitoh 	}
   1314  1.39   msaitoh 	printf("\tDeviceId=0x%08x\n", grp->DeviceId);
   1315  1.39   msaitoh 	if (grp->SubdeviceId != 0)
   1316  1.39   msaitoh 		printf("\tSubdeviceId=0x%08x\n", grp->SubdeviceId);
   1317  1.39   msaitoh 	printf("\tRevision=%hu\n", grp->Revision);
   1318  1.39   msaitoh 	printf("\tSharedInfoLength=%u\n", grp->SharedInfoLength);
   1319  1.39   msaitoh 
   1320  1.39   msaitoh 	/* Next is Shared Info */
   1321  1.39   msaitoh 	if (grp->SharedInfoLength != 0) {
   1322  1.39   msaitoh 		printf("\tShared Info ");
   1323  1.39   msaitoh 		acpi_dump_bytes((uint8_t *)(grp + 1),
   1324  1.39   msaitoh 		    grp->SharedInfoLength, 1);
   1325  1.39   msaitoh 	}
   1326  1.39   msaitoh 
   1327  1.39   msaitoh 	/* And then, Resource Descriptors */
   1328  1.39   msaitoh 	desc = (ACPI_CSRT_DESCRIPTOR *)
   1329  1.39   msaitoh 	    ((vaddr_t)(grp + 1) + grp->SharedInfoLength);
   1330  1.39   msaitoh 	while (desc < (ACPI_CSRT_DESCRIPTOR *)((vaddr_t)grp + grp->Length)) {
   1331  1.39   msaitoh 		bool unknownsubytpe = false;
   1332  1.39   msaitoh 		printf("\n\tLength=%u\n", desc->Length);
   1333  1.39   msaitoh 		printf("\tResource Type=");
   1334  1.39   msaitoh 		switch (desc->Type) {
   1335  1.39   msaitoh 		case ACPI_CSRT_TYPE_INTERRUPT:
   1336  1.39   msaitoh 			printf("Interrupt");
   1337  1.39   msaitoh 			switch (desc->Subtype) {
   1338  1.39   msaitoh 			case ACPI_CSRT_XRUPT_LINE:
   1339  1.39   msaitoh 				printf("(Interrupt line)\n");
   1340  1.39   msaitoh 				break;
   1341  1.39   msaitoh 			case ACPI_CSRT_XRUPT_CONTROLLER:
   1342  1.39   msaitoh 				printf("(Interrupt controller)\n");
   1343  1.39   msaitoh 				break;
   1344  1.39   msaitoh 			default:
   1345  1.39   msaitoh 				unknownsubytpe = true;
   1346  1.39   msaitoh 				break;
   1347  1.39   msaitoh 			}
   1348  1.39   msaitoh 			break;
   1349  1.39   msaitoh 		case ACPI_CSRT_TYPE_TIMER:
   1350  1.39   msaitoh 			printf("Timer");
   1351  1.39   msaitoh 			switch (desc->Subtype) {
   1352  1.39   msaitoh 			case ACPI_CSRT_TIMER:
   1353  1.39   msaitoh 				printf("\n");
   1354  1.39   msaitoh 				break;
   1355  1.39   msaitoh 			default:
   1356  1.39   msaitoh 				unknownsubytpe = true;
   1357  1.39   msaitoh 				break;
   1358  1.39   msaitoh 			}
   1359  1.39   msaitoh 			break;
   1360  1.39   msaitoh 		case ACPI_CSRT_TYPE_DMA:
   1361  1.39   msaitoh 			printf("DMA");
   1362  1.39   msaitoh 			switch (desc->Subtype) {
   1363  1.39   msaitoh 			case ACPI_CSRT_DMA_CHANNEL:
   1364  1.39   msaitoh 				printf("(DMA channel)\n");
   1365  1.39   msaitoh 				break;
   1366  1.39   msaitoh 			case ACPI_CSRT_DMA_CONTROLLER:
   1367  1.39   msaitoh 				printf("(DMA controller)\n");
   1368  1.39   msaitoh 				break;
   1369  1.39   msaitoh 			default:
   1370  1.39   msaitoh 				unknownsubytpe = true;
   1371  1.39   msaitoh 				break;
   1372  1.39   msaitoh 			}
   1373  1.39   msaitoh 			break;
   1374  1.39   msaitoh 		case 0x0004: /* XXX Platform Security */
   1375  1.39   msaitoh 			printf("Platform Security");
   1376  1.39   msaitoh 			switch (desc->Subtype) {
   1377  1.39   msaitoh 			case 0x0001:
   1378  1.39   msaitoh 				printf("\n");
   1379  1.39   msaitoh 				/* Platform Security */
   1380  1.39   msaitoh 				break;
   1381  1.39   msaitoh 			default:
   1382  1.39   msaitoh 				unknownsubytpe = true;
   1383  1.39   msaitoh 				break;
   1384  1.39   msaitoh 			}
   1385  1.39   msaitoh 			break;
   1386  1.39   msaitoh 		default:
   1387  1.39   msaitoh 			printf("Unknown (%hx)\n", desc->Type);
   1388  1.39   msaitoh 			break;
   1389  1.39   msaitoh 		}
   1390  1.39   msaitoh 		if (unknownsubytpe)
   1391  1.39   msaitoh 			printf("(unknown subtype(%hx))\n", desc->Subtype);
   1392  1.39   msaitoh 
   1393  1.39   msaitoh 		printf("\tUID=0x%08x\n", desc->Uid);
   1394  1.39   msaitoh 		printf("\tVendor defined info ");
   1395  1.39   msaitoh 		acpi_dump_bytes((uint8_t *)(desc + 1),
   1396  1.39   msaitoh 		    desc->Length - sizeof(ACPI_CSRT_DESCRIPTOR), 1);
   1397  1.39   msaitoh 
   1398  1.39   msaitoh 		/* Next */
   1399  1.39   msaitoh 		desc = (ACPI_CSRT_DESCRIPTOR *)((vaddr_t)desc + desc->Length);
   1400  1.39   msaitoh 	}
   1401  1.39   msaitoh }
   1402  1.39   msaitoh 
   1403  1.39   msaitoh static void
   1404  1.39   msaitoh acpi_handle_csrt(ACPI_TABLE_HEADER *sdp)
   1405  1.39   msaitoh {
   1406  1.39   msaitoh 	ACPI_CSRT_GROUP *grp;
   1407  1.39   msaitoh 	uint totallen = sdp->Length;
   1408  1.39   msaitoh 
   1409  1.39   msaitoh 	printf(BEGIN_COMMENT);
   1410  1.39   msaitoh 	acpi_print_sdt(sdp);
   1411  1.39   msaitoh 	grp = (ACPI_CSRT_GROUP *)(sdp + 1);
   1412  1.39   msaitoh 
   1413  1.39   msaitoh 	while (grp < (ACPI_CSRT_GROUP *)((vaddr_t)sdp + totallen)) {
   1414  1.39   msaitoh 		printf("\n");
   1415  1.39   msaitoh 		acpi_print_csrt_resource_group(grp);
   1416  1.39   msaitoh 
   1417  1.39   msaitoh 		/* Next */
   1418  1.39   msaitoh 		grp = (ACPI_CSRT_GROUP *)((vaddr_t)grp + grp->Length);
   1419  1.39   msaitoh 	}
   1420  1.39   msaitoh 
   1421  1.39   msaitoh 	printf(END_COMMENT);
   1422  1.39   msaitoh }
   1423  1.39   msaitoh 
   1424  1.39   msaitoh static void
   1425   1.5    cegger acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp)
   1426   1.5    cegger {
   1427   1.5    cegger 	ACPI_TABLE_DBGP *dbgp;
   1428   1.5    cegger 
   1429   1.5    cegger 	printf(BEGIN_COMMENT);
   1430   1.5    cegger 	acpi_print_sdt(sdp);
   1431   1.5    cegger 	dbgp = (ACPI_TABLE_DBGP *)sdp;
   1432   1.5    cegger 	printf("\tType={");
   1433   1.5    cegger 	switch (dbgp->Type) {
   1434   1.5    cegger 	case 0:
   1435   1.5    cegger 		printf("full 16550");
   1436   1.5    cegger 		break;
   1437   1.5    cegger 	case 1:
   1438   1.5    cegger 		printf("subset of 16550");
   1439   1.5    cegger 		break;
   1440   1.5    cegger 	}
   1441   1.5    cegger 	printf("}\n");
   1442  1.28   msaitoh 	printf("\tDebugPort=");
   1443   1.5    cegger 	acpi_print_gas(&dbgp->DebugPort);
   1444  1.28   msaitoh 	printf("\n");
   1445   1.5    cegger 	printf(END_COMMENT);
   1446   1.5    cegger }
   1447   1.5    cegger 
   1448  1.34   msaitoh /* This function is used by DBG2 and SPCR. */
   1449  1.34   msaitoh static void
   1450  1.34   msaitoh acpi_print_dbg2_serial_subtype(uint16_t subtype)
   1451  1.34   msaitoh {
   1452  1.34   msaitoh 
   1453  1.34   msaitoh 	switch (subtype) {
   1454  1.34   msaitoh 	case ACPI_DBG2_16550_COMPATIBLE:
   1455  1.34   msaitoh 		printf("Fully 16550 compatible\n");
   1456  1.34   msaitoh 		break;
   1457  1.34   msaitoh 	case ACPI_DBG2_16550_SUBSET:
   1458  1.34   msaitoh 		printf("16550 subset with DBGP Rev. 1\n");
   1459  1.34   msaitoh 		break;
   1460  1.34   msaitoh 	case ACPI_DBG2_ARM_PL011:
   1461  1.34   msaitoh 		printf("ARM PL011\n");
   1462  1.34   msaitoh 		break;
   1463  1.34   msaitoh 	case ACPI_DBG2_ARM_SBSA_32BIT:
   1464  1.34   msaitoh 		printf("ARM SBSA 32bit only\n");
   1465  1.34   msaitoh 		break;
   1466  1.34   msaitoh 	case ACPI_DBG2_ARM_SBSA_GENERIC:
   1467  1.34   msaitoh 		printf("ARM SBSA Generic\n");
   1468  1.34   msaitoh 		break;
   1469  1.34   msaitoh 	case ACPI_DBG2_ARM_DCC:
   1470  1.34   msaitoh 		printf("ARM DCC\n");
   1471  1.34   msaitoh 		break;
   1472  1.34   msaitoh 	case ACPI_DBG2_BCM2835:
   1473  1.34   msaitoh 		printf("BCM2835\n");
   1474  1.34   msaitoh 		break;
   1475  1.34   msaitoh 	default:
   1476  1.34   msaitoh 		printf("reserved (%04hx)\n", subtype);
   1477  1.34   msaitoh 		break;
   1478  1.34   msaitoh 	}
   1479  1.34   msaitoh }
   1480  1.34   msaitoh 
   1481   1.5    cegger static void
   1482  1.22   msaitoh acpi_print_dbg2_device(ACPI_DBG2_DEVICE *dev)
   1483  1.22   msaitoh {
   1484  1.22   msaitoh 
   1485  1.22   msaitoh 	printf("\t\tRevision=%u\n", dev->Revision);
   1486  1.22   msaitoh 	printf("\t\tLength=%u\n", dev->Length);
   1487  1.22   msaitoh 	printf("\t\tRegisterCount=%u\n", dev->RegisterCount);
   1488  1.22   msaitoh 
   1489  1.22   msaitoh 	printf("\t\tNamepath=");
   1490  1.22   msaitoh 	acpi_print_string((char *)((vaddr_t)dev + dev->NamepathOffset),
   1491  1.22   msaitoh 	    dev->NamepathLength);
   1492  1.22   msaitoh 	printf("\n");
   1493  1.22   msaitoh 
   1494  1.22   msaitoh 	if (dev->OemDataLength) {
   1495  1.22   msaitoh 		printf("\t\tOemDataLength=%u\n", dev->OemDataLength);
   1496  1.22   msaitoh 		printf("\t\tOemDataOffset=%u\n", dev->OemDataOffset);
   1497  1.22   msaitoh 		/* XXX need dump */
   1498  1.22   msaitoh 	}
   1499  1.22   msaitoh 
   1500  1.22   msaitoh 	printf("\t\tPortType=");
   1501  1.22   msaitoh 	switch (dev->PortType) {
   1502  1.22   msaitoh 	case ACPI_DBG2_SERIAL_PORT:
   1503  1.22   msaitoh 		printf("Serial\n" "\t\tPortSubtype=");
   1504  1.34   msaitoh 		acpi_print_dbg2_serial_subtype(dev->PortSubtype);
   1505  1.22   msaitoh 		break;
   1506  1.22   msaitoh 	case ACPI_DBG2_1394_PORT:
   1507  1.22   msaitoh 		printf("IEEE1394\n" "\t\tPortSubtype=");
   1508  1.22   msaitoh 		if (dev->PortSubtype == ACPI_DBG2_1394_STANDARD)
   1509  1.22   msaitoh 			printf("Standard\n");
   1510  1.22   msaitoh 		else
   1511  1.22   msaitoh 			printf("reserved (%04hx)\n", dev->PortSubtype);
   1512  1.22   msaitoh 		break;
   1513  1.22   msaitoh 	case ACPI_DBG2_USB_PORT:
   1514  1.22   msaitoh 		printf("USB\n" "\t\tPortSubtype=");
   1515  1.22   msaitoh 		switch (dev->PortSubtype) {
   1516  1.22   msaitoh 		case ACPI_DBG2_USB_XHCI:
   1517  1.22   msaitoh 			printf("XHCIn");
   1518  1.22   msaitoh 			break;
   1519  1.22   msaitoh 		case ACPI_DBG2_USB_EHCI:
   1520  1.22   msaitoh 			printf("EHCI\n");
   1521  1.22   msaitoh 			break;
   1522  1.22   msaitoh 		default:
   1523  1.22   msaitoh 			printf("reserved (%04hx)\n", dev->PortSubtype);
   1524  1.22   msaitoh 			break;
   1525  1.22   msaitoh 		}
   1526  1.22   msaitoh 		break;
   1527  1.22   msaitoh 	case ACPI_DBG2_NET_PORT:
   1528  1.22   msaitoh 		printf("Net\n" "\t\tPciVendorID=%04x\n", dev->PortSubtype);
   1529  1.22   msaitoh 		break;
   1530  1.22   msaitoh 	default:
   1531  1.22   msaitoh 		printf("reserved (%04hx)\n", dev->PortType);
   1532  1.22   msaitoh 		printf("\t\tPortSubtype=reserved (%04hx)\n", dev->PortSubtype);
   1533  1.22   msaitoh 		break;
   1534  1.22   msaitoh 	}
   1535  1.22   msaitoh 
   1536  1.22   msaitoh 	printf("\t\tBaseAddressOffset=0x%04x\n", dev->BaseAddressOffset);
   1537  1.22   msaitoh 	printf("\t\tAddressSizeOffset=0x%04x\n", dev->AddressSizeOffset);
   1538  1.22   msaitoh }
   1539  1.22   msaitoh 
   1540  1.22   msaitoh static void
   1541  1.22   msaitoh acpi_handle_dbg2(ACPI_TABLE_HEADER *sdp)
   1542  1.22   msaitoh {
   1543  1.22   msaitoh 	ACPI_TABLE_DBG2 *dbg2;
   1544  1.22   msaitoh 	ACPI_DBG2_DEVICE *device;
   1545  1.22   msaitoh 	unsigned int i;
   1546  1.22   msaitoh 
   1547  1.22   msaitoh 	printf(BEGIN_COMMENT);
   1548  1.22   msaitoh 	acpi_print_sdt(sdp);
   1549  1.22   msaitoh 	dbg2 = (ACPI_TABLE_DBG2 *)sdp;
   1550  1.22   msaitoh 
   1551  1.22   msaitoh 	printf("\tCount=%u\n", dbg2->InfoCount);
   1552  1.22   msaitoh 	device = (ACPI_DBG2_DEVICE *)((vaddr_t)sdp + dbg2->InfoOffset);
   1553  1.22   msaitoh 	for (i = 0; i < dbg2->InfoCount; i++) {
   1554  1.22   msaitoh 		printf("\tDevice %u={\n", i);
   1555  1.22   msaitoh 		acpi_print_dbg2_device(device);
   1556  1.22   msaitoh 		printf("\t}\n");
   1557  1.22   msaitoh 		device++;
   1558  1.22   msaitoh 	}
   1559  1.22   msaitoh 
   1560  1.22   msaitoh 	printf(END_COMMENT);
   1561  1.22   msaitoh }
   1562  1.22   msaitoh 
   1563  1.22   msaitoh static void
   1564   1.5    cegger acpi_print_einj_action(ACPI_WHEA_HEADER *whea)
   1565   1.5    cegger {
   1566   1.5    cegger 	printf("\tACTION={");
   1567   1.5    cegger 	switch (whea->Action) {
   1568   1.5    cegger 	case ACPI_EINJ_BEGIN_OPERATION:
   1569   1.5    cegger 		printf("Begin Operation");
   1570   1.5    cegger 		break;
   1571   1.5    cegger 	case ACPI_EINJ_GET_TRIGGER_TABLE:
   1572   1.5    cegger 		printf("Get Trigger Table");
   1573   1.5    cegger 		break;
   1574   1.5    cegger 	case ACPI_EINJ_SET_ERROR_TYPE:
   1575   1.5    cegger 		printf("Set Error Type");
   1576   1.5    cegger 		break;
   1577   1.5    cegger 	case ACPI_EINJ_GET_ERROR_TYPE:
   1578   1.5    cegger 		printf("Get Error Type");
   1579   1.5    cegger 		break;
   1580   1.5    cegger 	case ACPI_EINJ_END_OPERATION:
   1581   1.5    cegger 		printf("End Operation");
   1582   1.5    cegger 		break;
   1583   1.5    cegger 	case ACPI_EINJ_EXECUTE_OPERATION:
   1584   1.5    cegger 		printf("Execute Operation");
   1585   1.5    cegger 		break;
   1586   1.5    cegger 	case ACPI_EINJ_CHECK_BUSY_STATUS:
   1587   1.5    cegger 		printf("Check Busy Status");
   1588   1.5    cegger 		break;
   1589   1.5    cegger 	case ACPI_EINJ_GET_COMMAND_STATUS:
   1590   1.5    cegger 		printf("Get Command Status");
   1591   1.5    cegger 		break;
   1592  1.19   msaitoh 	case ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS:
   1593  1.19   msaitoh 		printf("Set Error Type With Address");
   1594  1.19   msaitoh 		break;
   1595  1.19   msaitoh 	case ACPI_EINJ_GET_EXECUTE_TIMINGS:
   1596  1.19   msaitoh 		printf("Get Execute Operation Timings");
   1597  1.19   msaitoh 		break;
   1598   1.5    cegger 	case ACPI_EINJ_ACTION_RESERVED:
   1599   1.5    cegger 		printf("Preserved");
   1600   1.5    cegger 		break;
   1601   1.5    cegger 	case ACPI_EINJ_TRIGGER_ERROR:
   1602   1.5    cegger 		printf("Trigger Error");
   1603   1.5    cegger 		break;
   1604   1.5    cegger 	default:
   1605   1.5    cegger 		printf("%d", whea->Action);
   1606   1.5    cegger 		break;
   1607   1.5    cegger 	}
   1608   1.5    cegger 	printf("}\n");
   1609   1.5    cegger }
   1610   1.5    cegger 
   1611   1.5    cegger static void
   1612   1.5    cegger acpi_print_einj_instruction(ACPI_WHEA_HEADER *whea)
   1613   1.5    cegger {
   1614   1.5    cegger 	uint32_t ins = whea->Instruction;
   1615   1.5    cegger 
   1616   1.5    cegger 	printf("\tINSTRUCTION={");
   1617   1.5    cegger 	switch (ins) {
   1618   1.5    cegger 	case ACPI_EINJ_READ_REGISTER:
   1619   1.5    cegger 		printf("Read Register");
   1620   1.5    cegger 		break;
   1621   1.5    cegger 	case ACPI_EINJ_READ_REGISTER_VALUE:
   1622   1.5    cegger 		printf("Read Register Value");
   1623   1.5    cegger 		break;
   1624   1.5    cegger 	case ACPI_EINJ_WRITE_REGISTER:
   1625   1.5    cegger 		printf("Write Register");
   1626   1.5    cegger 		break;
   1627   1.5    cegger 	case ACPI_EINJ_WRITE_REGISTER_VALUE:
   1628   1.5    cegger 		printf("Write Register Value");
   1629   1.5    cegger 		break;
   1630   1.5    cegger 	case ACPI_EINJ_NOOP:
   1631   1.5    cegger 		printf("Noop");
   1632   1.5    cegger 		break;
   1633   1.5    cegger 	case ACPI_EINJ_INSTRUCTION_RESERVED:
   1634   1.5    cegger 		printf("Reserved");
   1635   1.5    cegger 		break;
   1636   1.5    cegger 	default:
   1637   1.5    cegger 		printf("%d", ins);
   1638   1.5    cegger 		break;
   1639   1.5    cegger 	}
   1640   1.5    cegger 	printf("}\n");
   1641   1.5    cegger }
   1642   1.5    cegger 
   1643   1.5    cegger static void
   1644   1.5    cegger acpi_print_einj_flags(ACPI_WHEA_HEADER *whea)
   1645   1.5    cegger {
   1646   1.5    cegger 	uint32_t flags = whea->Flags;
   1647   1.5    cegger 
   1648  1.25   msaitoh 	printf("\tFLAGS={");
   1649   1.5    cegger 	if (flags & ACPI_EINJ_PRESERVE)
   1650   1.5    cegger 		printf("PRESERVED");
   1651   1.5    cegger 	printf("}\n");
   1652   1.5    cegger }
   1653   1.5    cegger 
   1654   1.5    cegger static void
   1655   1.5    cegger acpi_handle_einj(ACPI_TABLE_HEADER *sdp)
   1656   1.5    cegger {
   1657   1.5    cegger 	ACPI_TABLE_EINJ *einj;
   1658   1.5    cegger 	ACPI_EINJ_ENTRY *einj_entry;
   1659   1.5    cegger 	uint32_t einj_pos;
   1660   1.5    cegger 	u_int i;
   1661   1.5    cegger 
   1662   1.5    cegger 	printf(BEGIN_COMMENT);
   1663   1.5    cegger 	acpi_print_sdt(sdp);
   1664   1.5    cegger 	einj = (ACPI_TABLE_EINJ *)sdp;
   1665   1.5    cegger 
   1666   1.5    cegger 	printf("\tHeader Length=%d\n", einj->HeaderLength);
   1667   1.5    cegger 	printf("\tFlags=0x%x\n", einj->Flags);
   1668   1.5    cegger 	printf("\tEntries=%d\n", einj->Entries);
   1669   1.5    cegger 
   1670   1.5    cegger 	einj_pos = sizeof(ACPI_TABLE_EINJ);
   1671   1.5    cegger 	for (i = 0; i < einj->Entries; i++) {
   1672   1.5    cegger 		einj_entry = (ACPI_EINJ_ENTRY *)((char *)einj + einj_pos);
   1673   1.5    cegger 		acpi_print_whea(&einj_entry->WheaHeader,
   1674   1.5    cegger 		    acpi_print_einj_action, acpi_print_einj_instruction,
   1675   1.5    cegger 		    acpi_print_einj_flags);
   1676   1.5    cegger 		einj_pos += sizeof(ACPI_EINJ_ENTRY);
   1677   1.5    cegger 	}
   1678   1.5    cegger 	printf(END_COMMENT);
   1679   1.5    cegger }
   1680   1.5    cegger 
   1681   1.5    cegger static void
   1682   1.5    cegger acpi_print_erst_action(ACPI_WHEA_HEADER *whea)
   1683   1.5    cegger {
   1684   1.5    cegger 	printf("\tACTION={");
   1685   1.5    cegger 	switch (whea->Action) {
   1686   1.5    cegger 	case ACPI_ERST_BEGIN_WRITE:
   1687   1.5    cegger 		printf("Begin Write");
   1688   1.5    cegger 		break;
   1689   1.5    cegger 	case ACPI_ERST_BEGIN_READ:
   1690   1.5    cegger 		printf("Begin Read");
   1691   1.5    cegger 		break;
   1692   1.5    cegger 	case ACPI_ERST_BEGIN_CLEAR:
   1693   1.5    cegger 		printf("Begin Clear");
   1694   1.5    cegger 		break;
   1695   1.5    cegger 	case ACPI_ERST_END:
   1696   1.5    cegger 		printf("End");
   1697   1.5    cegger 		break;
   1698   1.5    cegger 	case ACPI_ERST_SET_RECORD_OFFSET:
   1699   1.5    cegger 		printf("Set Record Offset");
   1700   1.5    cegger 		break;
   1701   1.5    cegger 	case ACPI_ERST_EXECUTE_OPERATION:
   1702   1.5    cegger 		printf("Execute Operation");
   1703   1.5    cegger 		break;
   1704   1.5    cegger 	case ACPI_ERST_CHECK_BUSY_STATUS:
   1705   1.5    cegger 		printf("Check Busy Status");
   1706   1.5    cegger 		break;
   1707   1.5    cegger 	case ACPI_ERST_GET_COMMAND_STATUS:
   1708   1.5    cegger 		printf("Get Command Status");
   1709   1.5    cegger 		break;
   1710   1.5    cegger 	case ACPI_ERST_GET_RECORD_ID:
   1711   1.5    cegger 		printf("Get Record ID");
   1712   1.5    cegger 		break;
   1713   1.5    cegger 	case ACPI_ERST_SET_RECORD_ID:
   1714   1.5    cegger 		printf("Set Record ID");
   1715   1.5    cegger 		break;
   1716   1.5    cegger 	case ACPI_ERST_GET_RECORD_COUNT:
   1717   1.5    cegger 		printf("Get Record Count");
   1718   1.5    cegger 		break;
   1719   1.5    cegger 	case ACPI_ERST_BEGIN_DUMMY_WRIITE:
   1720   1.5    cegger 		printf("Begin Dummy Write");
   1721   1.5    cegger 		break;
   1722   1.5    cegger 	case ACPI_ERST_NOT_USED:
   1723   1.5    cegger 		printf("Unused");
   1724   1.5    cegger 		break;
   1725   1.5    cegger 	case ACPI_ERST_GET_ERROR_RANGE:
   1726   1.5    cegger 		printf("Get Error Range");
   1727   1.5    cegger 		break;
   1728   1.5    cegger 	case ACPI_ERST_GET_ERROR_LENGTH:
   1729   1.5    cegger 		printf("Get Error Length");
   1730   1.5    cegger 		break;
   1731   1.5    cegger 	case ACPI_ERST_GET_ERROR_ATTRIBUTES:
   1732   1.5    cegger 		printf("Get Error Attributes");
   1733   1.5    cegger 		break;
   1734  1.19   msaitoh 	case ACPI_ERST_EXECUTE_TIMINGS:
   1735  1.19   msaitoh 		printf("Execute Operation Timings");
   1736  1.19   msaitoh 		break;
   1737   1.5    cegger 	case ACPI_ERST_ACTION_RESERVED:
   1738   1.5    cegger 		printf("Reserved");
   1739   1.5    cegger 		break;
   1740   1.5    cegger 	default:
   1741   1.5    cegger 		printf("%d", whea->Action);
   1742   1.5    cegger 		break;
   1743   1.5    cegger 	}
   1744   1.5    cegger 	printf("}\n");
   1745   1.5    cegger }
   1746   1.5    cegger 
   1747   1.5    cegger static void
   1748   1.5    cegger acpi_print_erst_instruction(ACPI_WHEA_HEADER *whea)
   1749   1.5    cegger {
   1750   1.5    cegger 	printf("\tINSTRUCTION={");
   1751   1.5    cegger 	switch (whea->Instruction) {
   1752   1.5    cegger 	case ACPI_ERST_READ_REGISTER:
   1753   1.5    cegger 		printf("Read Register");
   1754   1.5    cegger 		break;
   1755   1.5    cegger 	case ACPI_ERST_READ_REGISTER_VALUE:
   1756   1.5    cegger 		printf("Read Register Value");
   1757   1.5    cegger 		break;
   1758   1.5    cegger 	case ACPI_ERST_WRITE_REGISTER:
   1759   1.5    cegger 		printf("Write Register");
   1760   1.5    cegger 		break;
   1761   1.5    cegger 	case ACPI_ERST_WRITE_REGISTER_VALUE:
   1762   1.5    cegger 		printf("Write Register Value");
   1763   1.5    cegger 		break;
   1764   1.5    cegger 	case ACPI_ERST_NOOP:
   1765   1.5    cegger 		printf("Noop");
   1766   1.5    cegger 		break;
   1767   1.5    cegger 	case ACPI_ERST_LOAD_VAR1:
   1768   1.5    cegger 		printf("Load Var1");
   1769   1.5    cegger 		break;
   1770   1.5    cegger 	case ACPI_ERST_LOAD_VAR2:
   1771   1.5    cegger 		printf("Load Var2");
   1772   1.5    cegger 		break;
   1773   1.5    cegger 	case ACPI_ERST_STORE_VAR1:
   1774   1.5    cegger 		printf("Store Var1");
   1775   1.5    cegger 		break;
   1776   1.5    cegger 	case ACPI_ERST_ADD:
   1777   1.5    cegger 		printf("Add");
   1778   1.5    cegger 		break;
   1779   1.5    cegger 	case ACPI_ERST_SUBTRACT:
   1780   1.5    cegger 		printf("Subtract");
   1781   1.5    cegger 		break;
   1782   1.5    cegger 	case ACPI_ERST_ADD_VALUE:
   1783   1.5    cegger 		printf("Add Value");
   1784   1.5    cegger 		break;
   1785   1.5    cegger 	case ACPI_ERST_SUBTRACT_VALUE:
   1786   1.5    cegger 		printf("Subtract Value");
   1787   1.5    cegger 		break;
   1788   1.5    cegger 	case ACPI_ERST_STALL:
   1789   1.5    cegger 		printf("Stall");
   1790   1.5    cegger 		break;
   1791   1.5    cegger 	case ACPI_ERST_STALL_WHILE_TRUE:
   1792   1.5    cegger 		printf("Stall While True");
   1793   1.5    cegger 		break;
   1794   1.5    cegger 	case ACPI_ERST_SKIP_NEXT_IF_TRUE:
   1795   1.5    cegger 		printf("Skip Next If True");
   1796   1.5    cegger 		break;
   1797   1.5    cegger 	case ACPI_ERST_GOTO:
   1798   1.5    cegger 		printf("Goto");
   1799   1.5    cegger 		break;
   1800   1.5    cegger 	case ACPI_ERST_SET_SRC_ADDRESS_BASE:
   1801   1.5    cegger 		printf("Set Src Address Base");
   1802   1.5    cegger 		break;
   1803   1.5    cegger 	case ACPI_ERST_SET_DST_ADDRESS_BASE:
   1804   1.5    cegger 		printf("Set Dst Address Base");
   1805   1.5    cegger 		break;
   1806   1.5    cegger 	case ACPI_ERST_MOVE_DATA:
   1807   1.5    cegger 		printf("Move Data");
   1808   1.5    cegger 		break;
   1809   1.5    cegger 	case ACPI_ERST_INSTRUCTION_RESERVED:
   1810   1.5    cegger 		printf("Reserved");
   1811   1.5    cegger 		break;
   1812   1.5    cegger 	default:
   1813   1.5    cegger 		printf("%d (reserved)", whea->Instruction);
   1814   1.5    cegger 		break;
   1815   1.5    cegger 	}
   1816   1.5    cegger 	printf("}\n");
   1817   1.5    cegger }
   1818   1.5    cegger 
   1819   1.5    cegger static void
   1820   1.5    cegger acpi_print_erst_flags(ACPI_WHEA_HEADER *whea)
   1821   1.5    cegger {
   1822   1.5    cegger 	uint32_t flags = whea->Flags;
   1823   1.5    cegger 
   1824  1.25   msaitoh 	printf("\tFLAGS={");
   1825   1.5    cegger 	if (flags & ACPI_ERST_PRESERVE)
   1826   1.5    cegger 		printf("PRESERVED");
   1827   1.5    cegger 	printf("}\n");
   1828   1.5    cegger }
   1829   1.5    cegger 
   1830   1.5    cegger static void
   1831   1.5    cegger acpi_handle_erst(ACPI_TABLE_HEADER *sdp)
   1832   1.5    cegger {
   1833   1.5    cegger 	ACPI_TABLE_ERST *erst;
   1834   1.5    cegger 	ACPI_ERST_ENTRY *erst_entry;
   1835   1.5    cegger 	uint32_t erst_pos;
   1836   1.5    cegger 	u_int i;
   1837   1.5    cegger 
   1838   1.5    cegger 	printf(BEGIN_COMMENT);
   1839   1.5    cegger 	acpi_print_sdt(sdp);
   1840   1.5    cegger 	erst = (ACPI_TABLE_ERST *)sdp;
   1841   1.5    cegger 
   1842   1.5    cegger 	printf("\tHeader Length=%d\n", erst->HeaderLength);
   1843   1.5    cegger 	printf("\tEntries=%d\n", erst->Entries);
   1844   1.5    cegger 
   1845   1.5    cegger 	erst_pos = sizeof(ACPI_TABLE_ERST);
   1846   1.5    cegger 	for (i = 0; i < erst->Entries; i++) {
   1847   1.5    cegger 		erst_entry = (ACPI_ERST_ENTRY *)((char *)erst + erst_pos);
   1848   1.5    cegger 		acpi_print_whea(&erst_entry->WheaHeader,
   1849   1.5    cegger 		    acpi_print_erst_action, acpi_print_erst_instruction,
   1850   1.5    cegger 		    acpi_print_erst_flags);
   1851   1.5    cegger 		erst_pos += sizeof(ACPI_ERST_ENTRY);
   1852   1.5    cegger 	}
   1853   1.5    cegger 	printf(END_COMMENT);
   1854   1.5    cegger }
   1855   1.5    cegger 
   1856   1.5    cegger static void
   1857  1.35   msaitoh acpi_print_gtd_timer(const char *name, uint32_t interrupt, uint32_t flags)
   1858  1.35   msaitoh {
   1859  1.35   msaitoh 
   1860  1.35   msaitoh 	printf("\t%s Timer GSIV=%d\n", name, interrupt);
   1861  1.35   msaitoh 	printf("\t%s Flags={Mode=", name);
   1862  1.35   msaitoh 	if (flags & ACPI_GTDT_INTERRUPT_MODE)
   1863  1.35   msaitoh 		printf("edge");
   1864  1.35   msaitoh 	else
   1865  1.35   msaitoh 		printf("level");
   1866  1.35   msaitoh 	printf(", Polarity=");
   1867  1.35   msaitoh 	if (flags & ACPI_GTDT_INTERRUPT_POLARITY)
   1868  1.35   msaitoh 		printf("active-lo");
   1869  1.35   msaitoh 	else
   1870  1.35   msaitoh 		printf("active-hi");
   1871  1.35   msaitoh 	if (flags & ACPI_GTDT_ALWAYS_ON)
   1872  1.35   msaitoh 		printf(", always-on");
   1873  1.35   msaitoh 	printf("}\n");
   1874  1.35   msaitoh }
   1875  1.35   msaitoh 
   1876  1.35   msaitoh static void
   1877  1.35   msaitoh acpi_print_gtd_block_timer_flags(const char *name, uint32_t interrupt,
   1878  1.35   msaitoh     uint32_t flags)
   1879  1.35   msaitoh {
   1880  1.35   msaitoh 
   1881  1.35   msaitoh 	printf("\t\t%s Timer GSIV=%d\n", name, interrupt);
   1882  1.35   msaitoh 	printf("\t\t%s Timer Flags={Mode=", name);
   1883  1.35   msaitoh 	if (flags & ACPI_GTDT_GT_IRQ_MODE)
   1884  1.35   msaitoh 		printf("Secure");
   1885  1.35   msaitoh 	else
   1886  1.35   msaitoh 		printf("Non-Secure");
   1887  1.35   msaitoh 	printf(", Polarity=");
   1888  1.35   msaitoh 	if (flags & ACPI_GTDT_GT_IRQ_POLARITY)
   1889  1.35   msaitoh 		printf("active-lo");
   1890  1.35   msaitoh 	else
   1891  1.35   msaitoh 		printf("active-hi");
   1892  1.35   msaitoh 	printf("}\n");
   1893  1.35   msaitoh }
   1894  1.35   msaitoh 
   1895  1.35   msaitoh static void
   1896  1.35   msaitoh acpi_print_gtblock(ACPI_GTDT_TIMER_BLOCK *gtblock)
   1897  1.35   msaitoh {
   1898  1.35   msaitoh 	ACPI_GTDT_TIMER_ENTRY *entry;
   1899  1.35   msaitoh 	unsigned int i;
   1900  1.35   msaitoh 
   1901  1.35   msaitoh 	printf("\tType=GT Block\n");
   1902  1.35   msaitoh 	printf("\tLength=%d\n", gtblock->Header.Length);
   1903  1.35   msaitoh 	/* XXX might not 8byte aligned */
   1904  1.35   msaitoh 	printf("\tBlockAddress=%016jx\n",
   1905  1.35   msaitoh 	    (uintmax_t)gtblock->BlockAddress);
   1906  1.35   msaitoh 
   1907  1.35   msaitoh 	printf("\tGT Block Timer Count=%d\n", gtblock->TimerCount);
   1908  1.35   msaitoh 	entry = (ACPI_GTDT_TIMER_ENTRY *)((vaddr_t)gtblock
   1909  1.35   msaitoh 	    + gtblock->TimerOffset);
   1910  1.35   msaitoh 	for (i = 0; i < gtblock->TimerCount; i++) {
   1911  1.35   msaitoh 		printf("\n");
   1912  1.35   msaitoh 		if (entry >= (ACPI_GTDT_TIMER_ENTRY *)((vaddr_t)gtblock
   1913  1.35   msaitoh 		    + gtblock->Header.Length)) {
   1914  1.35   msaitoh 			printf("\\ttWrong Timer entry\n");
   1915  1.35   msaitoh 			break;
   1916  1.35   msaitoh 		}
   1917  1.35   msaitoh 		printf("\t\tFrame Number=%d\n", entry->FrameNumber);
   1918  1.35   msaitoh 		/* XXX might not 8byte aligned */
   1919  1.35   msaitoh 		printf("\t\tBaseAddress=%016jx\n",
   1920  1.35   msaitoh 		    (uintmax_t)entry->BaseAddress);
   1921  1.35   msaitoh 		/* XXX might not 8byte aligned */
   1922  1.35   msaitoh 		printf("\t\tEl0BaseAddress=%016jx\n",
   1923  1.35   msaitoh 		    (uintmax_t)entry->El0BaseAddress);
   1924  1.35   msaitoh 
   1925  1.35   msaitoh 		acpi_print_gtd_block_timer_flags("Physical",
   1926  1.35   msaitoh 		    entry->TimerInterrupt, entry->TimerFlags);
   1927  1.35   msaitoh 		acpi_print_gtd_block_timer_flags("Virtual",
   1928  1.35   msaitoh 		    entry->VirtualTimerInterrupt, entry->VirtualTimerFlags);
   1929  1.35   msaitoh 
   1930  1.35   msaitoh 		printf("\t\tCommon Flags={Mode=");
   1931  1.35   msaitoh 		if (entry->CommonFlags & ACPI_GTDT_GT_IS_SECURE_TIMER)
   1932  1.35   msaitoh 			printf("Secure");
   1933  1.35   msaitoh 		else
   1934  1.35   msaitoh 			printf("Non-Secure");
   1935  1.35   msaitoh 		if (entry->CommonFlags & ACPI_GTDT_GT_ALWAYS_ON)
   1936  1.35   msaitoh 			printf(", always-on");
   1937  1.35   msaitoh 		printf("}\n");
   1938  1.35   msaitoh 
   1939  1.35   msaitoh 		entry++;
   1940  1.35   msaitoh 	}
   1941  1.35   msaitoh }
   1942  1.35   msaitoh 
   1943  1.35   msaitoh static void
   1944  1.35   msaitoh acpi_print_sbsa_watchdog(ACPI_GTDT_WATCHDOG *wdog)
   1945  1.35   msaitoh {
   1946  1.35   msaitoh 
   1947  1.35   msaitoh 	printf("\tType=Watchdog GT\n");
   1948  1.35   msaitoh 	printf("\tLength=%d\n", wdog->Header.Length);
   1949  1.35   msaitoh 	/* XXX might not 8byte aligned */
   1950  1.35   msaitoh 	printf("\tRefreshFrameAddress=%016jx\n",
   1951  1.35   msaitoh 	    (uintmax_t)wdog->RefreshFrameAddress);
   1952  1.35   msaitoh 	/* XXX might not 8byte aligned */
   1953  1.35   msaitoh 	printf("\tControlFrameAddress=%016jx\n",
   1954  1.35   msaitoh 	    (uintmax_t)wdog->ControlFrameAddress);
   1955  1.35   msaitoh 	printf("\tGSIV=%d\n", wdog->TimerInterrupt);
   1956  1.35   msaitoh 
   1957  1.35   msaitoh 	printf("\tFlags={Mode=");
   1958  1.35   msaitoh 	if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_IRQ_MODE)
   1959  1.35   msaitoh 		printf("edge");
   1960  1.35   msaitoh 	else
   1961  1.35   msaitoh 		printf("level");
   1962  1.35   msaitoh 	printf(", Polarity=");
   1963  1.35   msaitoh 	if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_IRQ_POLARITY)
   1964  1.35   msaitoh 		printf("active-lo");
   1965  1.35   msaitoh 	else
   1966  1.35   msaitoh 		printf("active-hi");
   1967  1.35   msaitoh 	if (wdog->TimerFlags & ACPI_GTDT_WATCHDOG_SECURE)
   1968  1.35   msaitoh 		printf(", Secure");
   1969  1.35   msaitoh 	else
   1970  1.35   msaitoh 		printf(", Non-Secure");
   1971  1.35   msaitoh 	printf("}\n");
   1972  1.35   msaitoh }
   1973  1.35   msaitoh 
   1974  1.35   msaitoh static void
   1975  1.35   msaitoh acpi_handle_gtdt(ACPI_TABLE_HEADER *sdp)
   1976  1.35   msaitoh {
   1977  1.35   msaitoh 	ACPI_TABLE_GTDT *gtdt;
   1978  1.35   msaitoh 	ACPI_GTDT_HEADER *hdr;
   1979  1.35   msaitoh 	u_int i;
   1980  1.35   msaitoh 
   1981  1.35   msaitoh 	printf(BEGIN_COMMENT);
   1982  1.35   msaitoh 	acpi_print_sdt(sdp);
   1983  1.35   msaitoh 	gtdt = (ACPI_TABLE_GTDT *)sdp;
   1984  1.35   msaitoh 
   1985  1.35   msaitoh 	printf("\tCounterBlockAddresss=%016jx\n",
   1986  1.35   msaitoh 	    (uintmax_t)gtdt->CounterBlockAddresss); /* XXX not 8byte aligned */
   1987  1.35   msaitoh 	printf("\tCounterReadBlockAddress=%016jx\n",
   1988  1.35   msaitoh 	    (uintmax_t)gtdt->CounterReadBlockAddress);
   1989  1.35   msaitoh 
   1990  1.35   msaitoh #define PRINTTIMER(gtdt, name) acpi_print_gtd_timer(	\
   1991  1.35   msaitoh 		#name, (gtdt)-> name## Interrupt,	\
   1992  1.35   msaitoh 	(gtdt)-> name ## Flags)
   1993  1.35   msaitoh 
   1994  1.35   msaitoh 	PRINTTIMER(gtdt, SecureEl1);
   1995  1.35   msaitoh 	PRINTTIMER(gtdt, NonSecureEl1);
   1996  1.35   msaitoh 	PRINTTIMER(gtdt, VirtualTimer);
   1997  1.35   msaitoh 	PRINTTIMER(gtdt, NonSecureEl2);
   1998  1.35   msaitoh 
   1999  1.35   msaitoh #undef PRINTTIMER
   2000  1.35   msaitoh 
   2001  1.35   msaitoh 	printf("\tPlatform Timer Count=%d\n", gtdt->PlatformTimerCount);
   2002  1.35   msaitoh 
   2003  1.35   msaitoh 	hdr = (ACPI_GTDT_HEADER *)((vaddr_t)sdp + gtdt->PlatformTimerOffset);
   2004  1.35   msaitoh 	for (i = 0; i < gtdt->PlatformTimerCount; i++) {
   2005  1.35   msaitoh 		printf("\n");
   2006  1.35   msaitoh 		if (hdr >= (ACPI_GTDT_HEADER *)((vaddr_t)sdp + sdp->Length)) {
   2007  1.35   msaitoh 			printf("\tWrong GTDT header"
   2008  1.35   msaitoh 			    "(type = %hhu, length = %hu)\n",
   2009  1.35   msaitoh 			    hdr->Type, hdr->Length);
   2010  1.35   msaitoh 			break;
   2011  1.35   msaitoh 		}
   2012  1.35   msaitoh 
   2013  1.35   msaitoh 		switch (hdr->Type) {
   2014  1.35   msaitoh 		case ACPI_GTDT_TYPE_TIMER_BLOCK:
   2015  1.35   msaitoh 			acpi_print_gtblock((ACPI_GTDT_TIMER_BLOCK *)hdr);
   2016  1.35   msaitoh 			break;
   2017  1.35   msaitoh 		case ACPI_GTDT_TYPE_WATCHDOG:
   2018  1.35   msaitoh 			acpi_print_sbsa_watchdog((ACPI_GTDT_WATCHDOG *)hdr);
   2019  1.35   msaitoh 			break;
   2020  1.35   msaitoh 		default:
   2021  1.35   msaitoh 			printf("\tUnknown Platform Timer Type"
   2022  1.35   msaitoh 			    "(type = %hhu, length = %hu)\n",
   2023  1.35   msaitoh 			    hdr->Type, hdr->Length);
   2024  1.35   msaitoh 			break;
   2025  1.35   msaitoh 		}
   2026  1.35   msaitoh 		/* Next */
   2027  1.35   msaitoh 		hdr = (ACPI_GTDT_HEADER *)((vaddr_t)hdr + hdr->Length);
   2028  1.35   msaitoh 	}
   2029  1.35   msaitoh 	printf(END_COMMENT);
   2030  1.35   msaitoh }
   2031  1.35   msaitoh 
   2032  1.35   msaitoh static void
   2033   1.5    cegger acpi_handle_madt(ACPI_TABLE_HEADER *sdp)
   2034   1.5    cegger {
   2035   1.5    cegger 	ACPI_TABLE_MADT *madt;
   2036   1.5    cegger 
   2037   1.5    cegger 	printf(BEGIN_COMMENT);
   2038   1.5    cegger 	acpi_print_sdt(sdp);
   2039   1.5    cegger 	madt = (ACPI_TABLE_MADT *)sdp;
   2040   1.5    cegger 	printf("\tLocal APIC ADDR=0x%08x\n", madt->Address);
   2041   1.5    cegger 	printf("\tFlags={");
   2042   1.5    cegger 	if (madt->Flags & ACPI_MADT_PCAT_COMPAT)
   2043   1.5    cegger 		printf("PC-AT");
   2044   1.5    cegger 	printf("}\n");
   2045   1.5    cegger 	acpi_walk_subtables(sdp, (madt + 1), acpi_print_madt);
   2046   1.5    cegger 	printf(END_COMMENT);
   2047   1.5    cegger }
   2048   1.5    cegger 
   2049   1.5    cegger static void
   2050   1.5    cegger acpi_handle_hpet(ACPI_TABLE_HEADER *sdp)
   2051   1.5    cegger {
   2052   1.5    cegger 	ACPI_TABLE_HPET *hpet;
   2053   1.5    cegger 
   2054   1.5    cegger 	printf(BEGIN_COMMENT);
   2055   1.5    cegger 	acpi_print_sdt(sdp);
   2056   1.5    cegger 	hpet = (ACPI_TABLE_HPET *)sdp;
   2057   1.5    cegger 	printf("\tHPET Number=%d\n", hpet->Sequence);
   2058   1.5    cegger 	printf("\tADDR=");
   2059   1.5    cegger 	acpi_print_gas(&hpet->Address);
   2060  1.44   msaitoh 	printf("\n\tHW Rev=0x%x\n", hpet->Id & ACPI_HPET_ID_HARDWARE_REV_ID);
   2061   1.5    cegger 	printf("\tComparators=%d\n", (hpet->Id & ACPI_HPET_ID_COMPARATORS) >>
   2062   1.5    cegger 	    8);
   2063   1.5    cegger 	printf("\tCounter Size=%d\n", hpet->Id & ACPI_HPET_ID_COUNT_SIZE_CAP ?
   2064   1.5    cegger 	    1 : 0);
   2065   1.5    cegger 	printf("\tLegacy IRQ routing capable={");
   2066   1.5    cegger 	if (hpet->Id & ACPI_HPET_ID_LEGACY_CAPABLE)
   2067   1.5    cegger 		printf("TRUE}\n");
   2068   1.5    cegger 	else
   2069   1.5    cegger 		printf("FALSE}\n");
   2070   1.5    cegger 	printf("\tPCI Vendor ID=0x%04x\n", hpet->Id >> 16);
   2071   1.5    cegger 	printf("\tMinimal Tick=%d\n", hpet->MinimumTick);
   2072  1.16   msaitoh 	printf("\tFlags=0x%02x\n", hpet->Flags);
   2073   1.5    cegger 	printf(END_COMMENT);
   2074   1.5    cegger }
   2075   1.5    cegger 
   2076  1.42   msaitoh /*
   2077  1.42   msaitoh  * IORT
   2078  1.42   msaitoh  * I/O Remapping Table
   2079  1.42   msaitoh  */
   2080  1.42   msaitoh 
   2081  1.42   msaitoh static void acpi_print_iort_its_group(ACPI_IORT_NODE *);
   2082  1.42   msaitoh static void acpi_print_iort_named_component(ACPI_IORT_NODE *);
   2083  1.42   msaitoh static void acpi_print_iort_root_complex(ACPI_IORT_NODE *);
   2084  1.42   msaitoh static void acpi_print_iort_smmuv1v2(ACPI_IORT_NODE *);
   2085  1.42   msaitoh static void acpi_print_iort_smmuv3(ACPI_IORT_NODE *);
   2086  1.42   msaitoh 
   2087  1.42   msaitoh struct iort_node_list {
   2088  1.42   msaitoh 	uint8_t	Type;
   2089  1.42   msaitoh 	const char *gname;
   2090  1.42   msaitoh 	void (*func)(ACPI_IORT_NODE *);
   2091  1.42   msaitoh } iort_node_list [] = {
   2092  1.42   msaitoh #define NDMAC(name)	ACPI_IORT_NODE_## name
   2093  1.42   msaitoh #define PRFN(name)	acpi_print_iort_## name
   2094  1.42   msaitoh 	{ NDMAC(ITS_GROUP),	   "ITS group",       PRFN(its_group)},
   2095  1.42   msaitoh 	{ NDMAC(NAMED_COMPONENT),  "Named component", PRFN(named_component)},
   2096  1.42   msaitoh 	{ NDMAC(PCI_ROOT_COMPLEX), "Root complex",    PRFN(root_complex)},
   2097  1.42   msaitoh 	{ NDMAC(SMMU),		   "SMMUv1 or v2",    PRFN(smmuv1v2)},
   2098  1.42   msaitoh 	{ NDMAC(SMMU_V3),	   "SMMUv3",	      PRFN(smmuv3)},
   2099  1.42   msaitoh 	{ 255, NULL, NULL},
   2100  1.42   msaitoh #undef NDMAC
   2101  1.42   msaitoh #undef PRFN
   2102  1.42   msaitoh };
   2103  1.42   msaitoh 
   2104  1.42   msaitoh static void
   2105  1.42   msaitoh acpi_print_iort_memory_access(ACPI_IORT_MEMORY_ACCESS *memacc)
   2106  1.42   msaitoh {
   2107  1.42   msaitoh 
   2108  1.42   msaitoh 	printf("\tMemory Access={\n");
   2109  1.42   msaitoh 	printf("\t\tCacheCoherency=");
   2110  1.42   msaitoh 	switch (memacc->CacheCoherency) {
   2111  1.42   msaitoh 	case ACPI_IORT_NODE_COHERENT:
   2112  1.42   msaitoh 		printf("Fully coherent\n");
   2113  1.42   msaitoh 		break;
   2114  1.42   msaitoh 	case ACPI_IORT_NODE_NOT_COHERENT:
   2115  1.42   msaitoh 		printf("Not coherent\n");
   2116  1.42   msaitoh 		break;
   2117  1.42   msaitoh 	default:
   2118  1.54    andvar 		printf("reserved (%u)\n", memacc->CacheCoherency);
   2119  1.42   msaitoh 		break;
   2120  1.42   msaitoh 	}
   2121  1.42   msaitoh 	printf("\t\tAllocation Hints=");
   2122  1.42   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_IORT_HT_## flag, #flag)
   2123  1.42   msaitoh 		PRINTFLAG(memacc->Hints, TRANSIENT);
   2124  1.42   msaitoh 		PRINTFLAG(memacc->Hints, WRITE);
   2125  1.42   msaitoh 		PRINTFLAG(memacc->Hints, READ);
   2126  1.42   msaitoh 		PRINTFLAG(memacc->Hints, OVERRIDE);
   2127  1.42   msaitoh 		PRINTFLAG_END();
   2128  1.42   msaitoh #undef PRINTFLAG
   2129  1.42   msaitoh 	printf("\t\tMemory Access Flags=");
   2130  1.42   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_IORT_MF_## flag, #flag)
   2131  1.42   msaitoh 		PRINTFLAG(memacc->MemoryFlags, COHERENCY);
   2132  1.42   msaitoh 		PRINTFLAG(memacc->MemoryFlags, ATTRIBUTES);
   2133  1.42   msaitoh 		PRINTFLAG_END();
   2134  1.42   msaitoh #undef PRINTFLAG
   2135  1.42   msaitoh 	printf("\t}\n");
   2136  1.42   msaitoh }
   2137  1.42   msaitoh 
   2138  1.42   msaitoh static void
   2139  1.42   msaitoh acpi_print_iort_its_group(ACPI_IORT_NODE *node)
   2140  1.42   msaitoh {
   2141  1.42   msaitoh 	ACPI_IORT_ITS_GROUP *itsg = (ACPI_IORT_ITS_GROUP *)node->NodeData;
   2142  1.42   msaitoh 	uint32_t *idp;
   2143  1.42   msaitoh 	unsigned int i;
   2144  1.42   msaitoh 
   2145  1.42   msaitoh 	idp = itsg->Identifiers;
   2146  1.42   msaitoh 	for (i = 0; i < itsg->ItsCount; i++)
   2147  1.42   msaitoh 		printf("\tGIC ITS ID=%d\n", idp[i]);
   2148  1.42   msaitoh }
   2149  1.42   msaitoh 
   2150  1.42   msaitoh static void
   2151  1.42   msaitoh acpi_print_iort_named_component(ACPI_IORT_NODE *node)
   2152  1.42   msaitoh {
   2153  1.42   msaitoh 	ACPI_IORT_NAMED_COMPONENT *ncomp
   2154  1.42   msaitoh 	    = (ACPI_IORT_NAMED_COMPONENT *)node->NodeData;
   2155  1.42   msaitoh 
   2156  1.42   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_IORT_NC_## flag, #flag)
   2157  1.42   msaitoh 	printf("\tNode Flags={PASID_BITS=%u",
   2158  1.42   msaitoh 	    (ncomp->NodeFlags & ACPI_IORT_NC_PASID_BITS) >> 1);
   2159  1.42   msaitoh 	pf_sep = ',';
   2160  1.42   msaitoh 	PRINTFLAG(ncomp->NodeFlags, STALL_SUPPORTED);
   2161  1.42   msaitoh 	PRINTFLAG_END();
   2162  1.42   msaitoh #undef PRINTFLAG
   2163  1.42   msaitoh 	acpi_print_iort_memory_access(
   2164  1.42   msaitoh 		(ACPI_IORT_MEMORY_ACCESS *)&ncomp->MemoryProperties);
   2165  1.42   msaitoh 	printf("\tMemory address size=%hhu\n", ncomp->MemoryAddressLimit);
   2166  1.42   msaitoh 	printf("\tDevice object Name=%s\n", ncomp->DeviceName);
   2167  1.42   msaitoh }
   2168  1.42   msaitoh 
   2169  1.42   msaitoh static void
   2170  1.42   msaitoh acpi_print_iort_root_complex(ACPI_IORT_NODE *node)
   2171  1.42   msaitoh {
   2172  1.42   msaitoh 	ACPI_IORT_ROOT_COMPLEX *rcmp
   2173  1.42   msaitoh 	    = (ACPI_IORT_ROOT_COMPLEX *)node->NodeData;
   2174  1.42   msaitoh 
   2175  1.42   msaitoh 	acpi_print_iort_memory_access(
   2176  1.42   msaitoh 		(ACPI_IORT_MEMORY_ACCESS *)&rcmp->MemoryProperties);
   2177  1.42   msaitoh 	printf("\tATS Attribute=%s\n",
   2178  1.42   msaitoh 	    (rcmp->AtsAttribute & ACPI_IORT_ATS_SUPPORTED)
   2179  1.42   msaitoh 	    ? "supported" : "not supported");
   2180  1.42   msaitoh 	printf("\tPCI Segment=%u\n", rcmp->PciSegmentNumber);
   2181  1.42   msaitoh 	printf("\tMemory address size limit=%hhu\n", rcmp->MemoryAddressLimit);
   2182  1.42   msaitoh }
   2183  1.42   msaitoh 
   2184  1.42   msaitoh static void
   2185  1.42   msaitoh acpi_print_iort_smmuv1v2_intflags(uint32_t flags)
   2186  1.42   msaitoh {
   2187  1.42   msaitoh 
   2188  1.42   msaitoh 	printf("{Mode=");
   2189  1.42   msaitoh 	if (flags & 0x01)
   2190  1.42   msaitoh 		printf("edge");
   2191  1.42   msaitoh 	else
   2192  1.42   msaitoh 		printf("level");
   2193  1.42   msaitoh 	printf("}\n");
   2194  1.42   msaitoh }
   2195  1.42   msaitoh 
   2196  1.42   msaitoh static void
   2197  1.42   msaitoh acpi_print_iort_smmuv1v2(ACPI_IORT_NODE *node)
   2198  1.42   msaitoh {
   2199  1.42   msaitoh 	ACPI_IORT_SMMU *smmu = (ACPI_IORT_SMMU *)node->NodeData;
   2200  1.42   msaitoh 	ACPI_IORT_SMMU_GSI *gsi;
   2201  1.42   msaitoh 	uint64_t *iarray;
   2202  1.42   msaitoh 	unsigned int i;
   2203  1.42   msaitoh 
   2204  1.42   msaitoh 	printf("\tBase Address=%016jx\n", (uintmax_t)smmu->BaseAddress);
   2205  1.42   msaitoh 	printf("\tSpan=%016jx\n", (uintmax_t)smmu->Span);
   2206  1.42   msaitoh 	printf("\tModel=");
   2207  1.42   msaitoh 	switch (smmu->Model) {
   2208  1.42   msaitoh 	case ACPI_IORT_SMMU_V1:
   2209  1.42   msaitoh 		printf("Generic SMMUv1\n");
   2210  1.42   msaitoh 		break;
   2211  1.42   msaitoh 	case ACPI_IORT_SMMU_V2:
   2212  1.42   msaitoh 		printf("Generic SMMUv2\n");
   2213  1.42   msaitoh 		break;
   2214  1.42   msaitoh 	case ACPI_IORT_SMMU_CORELINK_MMU400:
   2215  1.42   msaitoh 		printf("Arm Corelink MMU-400\n");
   2216  1.42   msaitoh 		break;
   2217  1.42   msaitoh 	case ACPI_IORT_SMMU_CORELINK_MMU500:
   2218  1.42   msaitoh 		printf("Arm Corelink MMU-500\n");
   2219  1.42   msaitoh 		break;
   2220  1.42   msaitoh 	case ACPI_IORT_SMMU_CORELINK_MMU401:
   2221  1.42   msaitoh 		printf("Arm Corelink MMU-401\n");
   2222  1.42   msaitoh 		break;
   2223  1.42   msaitoh 	case ACPI_IORT_SMMU_CAVIUM_THUNDERX:
   2224  1.42   msaitoh 		printf("Cavium ThunderX SMMUv2\n");
   2225  1.42   msaitoh 		break;
   2226  1.42   msaitoh 	default:
   2227  1.42   msaitoh 		printf("reserved (%u)\n", smmu->Model);
   2228  1.42   msaitoh 		break;
   2229  1.42   msaitoh 	}
   2230  1.42   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_IORT_SMMU_## flag, #flag)
   2231  1.42   msaitoh 	printf("\tFlags=");
   2232  1.42   msaitoh 	PRINTFLAG(smmu->Flags, DVM_SUPPORTED);
   2233  1.42   msaitoh 	PRINTFLAG(smmu->Flags, COHERENT_WALK);
   2234  1.42   msaitoh 	PRINTFLAG_END();
   2235  1.42   msaitoh #undef PRINTFLAG
   2236  1.42   msaitoh 
   2237  1.42   msaitoh 	gsi = (ACPI_IORT_SMMU_GSI *)((vaddr_t)node
   2238  1.42   msaitoh 	    + smmu->GlobalInterruptOffset);
   2239  1.42   msaitoh 	printf("\tNSgIrpt=%u\n", gsi->NSgIrpt);
   2240  1.42   msaitoh 	printf("\tNSgIrptFlags=");
   2241  1.42   msaitoh 	acpi_print_iort_smmuv1v2_intflags(gsi->NSgIrptFlags);
   2242  1.42   msaitoh 	printf("\tNSgCfgIrpt=%u\n", gsi->NSgCfgIrpt);
   2243  1.42   msaitoh 	printf("\tNSgCfgIrptFlags=");
   2244  1.42   msaitoh 	acpi_print_iort_smmuv1v2_intflags(gsi->NSgCfgIrptFlags);
   2245  1.42   msaitoh 
   2246  1.42   msaitoh 	if (smmu->ContextInterruptCount != 0) {
   2247  1.42   msaitoh 		iarray = (uint64_t *)((vaddr_t)node
   2248  1.42   msaitoh 		    + smmu->ContextInterruptOffset);
   2249  1.42   msaitoh 		printf("\tContext Interrupts={\n");
   2250  1.42   msaitoh 		for (i = 0; i < smmu->ContextInterruptCount; i++) {
   2251  1.42   msaitoh 			printf("\t\tGSIV=%u\n",
   2252  1.42   msaitoh 			    (uint32_t)(iarray[i] & 0xffffffff));
   2253  1.42   msaitoh 			printf("\t\tFlags=%u\n", (uint32_t)(iarray[i] >> 32));
   2254  1.42   msaitoh 		}
   2255  1.42   msaitoh 	}
   2256  1.42   msaitoh 	if (smmu->PmuInterruptCount != 0) {
   2257  1.42   msaitoh 		iarray = (uint64_t *)((vaddr_t)node
   2258  1.42   msaitoh 		    + smmu->PmuInterruptOffset);
   2259  1.42   msaitoh 		printf("\tPmu Interrupts={\n");
   2260  1.42   msaitoh 		for (i = 0; i < smmu->PmuInterruptCount; i++) {
   2261  1.42   msaitoh 			printf("\t\tGSIV=%u\n",
   2262  1.42   msaitoh 			    (uint32_t)(iarray[i] & 0xffffffff));
   2263  1.42   msaitoh 			printf("\t\tFlags=%u\n", (uint32_t)(iarray[i] >> 32));
   2264  1.42   msaitoh 		}
   2265  1.42   msaitoh 	}
   2266  1.42   msaitoh }
   2267  1.42   msaitoh 
   2268  1.42   msaitoh static void
   2269  1.42   msaitoh acpi_print_iort_smmuv3(ACPI_IORT_NODE *node)
   2270  1.42   msaitoh {
   2271  1.42   msaitoh 	ACPI_IORT_SMMU_V3 *smmu = (ACPI_IORT_SMMU_V3 *)node->NodeData;
   2272  1.42   msaitoh 	uint8_t httuo;
   2273  1.42   msaitoh 
   2274  1.42   msaitoh 	printf("\tBase Address=%016jx\n", (uintmax_t)smmu->BaseAddress);
   2275  1.42   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_IORT_SMMU_V3_## flag, \
   2276  1.42   msaitoh 	    #flag)
   2277  1.42   msaitoh 	httuo = __SHIFTOUT(smmu->Flags, ACPI_IORT_SMMU_V3_HTTU_OVERRIDE);
   2278  1.42   msaitoh 	printf("\tFlags={HTTU Override=%hhx", httuo);
   2279  1.42   msaitoh 	pf_sep = ',';
   2280  1.42   msaitoh 	PRINTFLAG(smmu->Flags, HTTU_OVERRIDE);
   2281  1.42   msaitoh 	PRINTFLAG(smmu->Flags, COHACC_OVERRIDE);
   2282  1.42   msaitoh 	PRINTFLAG(smmu->Flags, PXM_VALID);
   2283  1.42   msaitoh 	PRINTFLAG_END();
   2284  1.42   msaitoh #undef PRINTFLAG
   2285  1.42   msaitoh 	printf("\tVATOS Address=%016jx\n", (uintmax_t)smmu->VatosAddress);
   2286  1.42   msaitoh 	printf("\tModel=");
   2287  1.42   msaitoh 	switch (smmu->Model) {
   2288  1.42   msaitoh 	case ACPI_IORT_SMMU_V3_GENERIC:
   2289  1.42   msaitoh 		printf("Generic SMMUv3\n");
   2290  1.42   msaitoh 		break;
   2291  1.42   msaitoh 	case ACPI_IORT_SMMU_V3_HISILICON_HI161X:
   2292  1.42   msaitoh 		printf("HiSilicon Hi161x SMMU-v3\n");
   2293  1.42   msaitoh 		break;
   2294  1.42   msaitoh 	case ACPI_IORT_SMMU_V3_CAVIUM_CN99XX:
   2295  1.42   msaitoh 		printf("Cavium CN99xx SMMU-v3\n");
   2296  1.42   msaitoh 		break;
   2297  1.42   msaitoh 	default:
   2298  1.42   msaitoh 		printf("reserved (%u)\n", smmu->Model);
   2299  1.42   msaitoh 		break;
   2300  1.42   msaitoh 	}
   2301  1.42   msaitoh 
   2302  1.42   msaitoh 	printf("\tEvent GSIV=%u\n", smmu->EventGsiv);
   2303  1.42   msaitoh 	printf("\tPRI GSIV=%u\n", smmu->PriGsiv);
   2304  1.42   msaitoh 	printf("\tGERR GSIV=%u\n", smmu->GerrGsiv);
   2305  1.42   msaitoh 	printf("\tSync GSIV=%u\n", smmu->SyncGsiv);
   2306  1.42   msaitoh 	printf("\tProximity domain=%u\n", smmu->Pxm);
   2307  1.42   msaitoh 
   2308  1.52    andvar 	/* XXX should we print the referred contents? */
   2309  1.42   msaitoh 	printf("\tDevice ID mapping index=%u\n", smmu->IdMappingIndex);
   2310  1.42   msaitoh }
   2311  1.42   msaitoh 
   2312  1.42   msaitoh static void
   2313  1.42   msaitoh acpi_print_iort_node(ACPI_IORT_NODE *node)
   2314  1.42   msaitoh {
   2315  1.42   msaitoh 	ACPI_IORT_ID_MAPPING *mapping;
   2316  1.42   msaitoh 	uint32_t offset;
   2317  1.42   msaitoh 	int datasize;
   2318  1.42   msaitoh 	bool dodump = false;
   2319  1.42   msaitoh 	struct iort_node_list *list;
   2320  1.42   msaitoh 	unsigned int i;
   2321  1.42   msaitoh 
   2322  1.42   msaitoh 	printf("\tLength=%hu\n", node->Length);
   2323  1.42   msaitoh 	printf("\tRevision=%hhu\n", node->Revision);
   2324  1.42   msaitoh 	printf("\tType=");
   2325  1.42   msaitoh 
   2326  1.42   msaitoh 	datasize = node->MappingOffset - offsetof(ACPI_IORT_NODE, NodeData);
   2327  1.42   msaitoh 	if (datasize != 0)
   2328  1.42   msaitoh 		dodump = true;
   2329  1.42   msaitoh 
   2330  1.42   msaitoh 	for (list = iort_node_list; list->gname != NULL; list++) {
   2331  1.42   msaitoh 		if (node->Type == list->Type) {
   2332  1.42   msaitoh 			printf("%s\n", list->gname);
   2333  1.42   msaitoh 			if (dodump)
   2334  1.42   msaitoh 				(*list->func)(node);
   2335  1.42   msaitoh 			break;
   2336  1.42   msaitoh 		}
   2337  1.42   msaitoh 	}
   2338  1.42   msaitoh 	if (list->gname == NULL)
   2339  1.42   msaitoh 		printf("reserved (0x%hhx)\n", node->Type);
   2340  1.42   msaitoh 
   2341  1.42   msaitoh 	printf("\tMappingCount=%u\n", node->MappingCount);
   2342  1.42   msaitoh 	if (node->MappingCount == 0)
   2343  1.42   msaitoh 		return;
   2344  1.42   msaitoh 
   2345  1.42   msaitoh 	offset = node->MappingOffset;
   2346  1.42   msaitoh 	printf("\tMapping offset=%u\n", offset);
   2347  1.42   msaitoh 	for (i = 0; i < node->MappingCount; i++) {
   2348  1.42   msaitoh 		mapping = (ACPI_IORT_ID_MAPPING *)((vaddr_t)node + offset);
   2349  1.42   msaitoh 		printf("\tMapping={\n");
   2350  1.42   msaitoh 		printf("\t\tInput base=%u\n", mapping->InputBase);
   2351  1.42   msaitoh 		printf("\t\tCount=%u\n", mapping->IdCount);
   2352  1.42   msaitoh 		printf("\t\tOutput base=%u\n", mapping->OutputBase);
   2353  1.42   msaitoh 		printf("\t\tOutput reference offset=%u\n",
   2354  1.42   msaitoh 		    mapping->OutputReference);
   2355  1.42   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_IORT_ID_## flag, #flag)
   2356  1.42   msaitoh 		printf("\t\tFlags=");
   2357  1.42   msaitoh 		PRINTFLAG(mapping->Flags, SINGLE_MAPPING);
   2358  1.42   msaitoh 		PRINTFLAG_END();
   2359  1.42   msaitoh #undef PRINTFLAG
   2360  1.42   msaitoh 		printf("\t}\n");
   2361  1.42   msaitoh 		offset += sizeof(ACPI_IORT_ID_MAPPING);
   2362  1.42   msaitoh 	}
   2363  1.42   msaitoh }
   2364  1.42   msaitoh 
   2365  1.42   msaitoh static void
   2366  1.42   msaitoh acpi_handle_iort(ACPI_TABLE_HEADER *sdp)
   2367  1.42   msaitoh {
   2368  1.42   msaitoh 	ACPI_TABLE_IORT *iort;
   2369  1.42   msaitoh 	ACPI_IORT_NODE *node;
   2370  1.42   msaitoh 	unsigned int i;
   2371  1.42   msaitoh 
   2372  1.42   msaitoh 	printf(BEGIN_COMMENT);
   2373  1.42   msaitoh 	acpi_print_sdt(sdp);
   2374  1.42   msaitoh 	iort = (ACPI_TABLE_IORT *)sdp;
   2375  1.42   msaitoh 	printf("\tIORT Nodes=%u\n", iort->NodeCount);
   2376  1.42   msaitoh 	printf("\tNode offset=%u\n", iort->NodeOffset);
   2377  1.42   msaitoh 
   2378  1.42   msaitoh 	node = (ACPI_IORT_NODE *)((vaddr_t)iort + iort->NodeOffset);
   2379  1.42   msaitoh 	for (i = 0; i < iort->NodeCount; i++) {
   2380  1.42   msaitoh 		printf("\n");
   2381  1.42   msaitoh 		acpi_print_iort_node(node);
   2382  1.42   msaitoh 
   2383  1.42   msaitoh 		/* Next */
   2384  1.42   msaitoh 		node = (ACPI_IORT_NODE *)((vaddr_t)node + node->Length);
   2385  1.42   msaitoh 	}
   2386  1.42   msaitoh 
   2387  1.42   msaitoh 	printf(END_COMMENT);
   2388  1.42   msaitoh }
   2389  1.42   msaitoh 
   2390   1.5    cegger static void
   2391  1.30   msaitoh acpi_print_native_lpit(ACPI_LPIT_NATIVE *nl)
   2392  1.30   msaitoh {
   2393  1.30   msaitoh 	printf("\tEntryTrigger=");
   2394  1.30   msaitoh 	acpi_print_gas(&nl->EntryTrigger);
   2395  1.44   msaitoh 	printf("\n\tResidency=%u\n", nl->Residency);
   2396  1.30   msaitoh 	printf("\tLatency=%u\n", nl->Latency);
   2397  1.30   msaitoh 	if (nl->Header.Flags & ACPI_LPIT_NO_COUNTER)
   2398  1.30   msaitoh 		printf("\tResidencyCounter=Not Present");
   2399  1.30   msaitoh 	else {
   2400  1.30   msaitoh 		printf("\tResidencyCounter=");
   2401  1.30   msaitoh 		acpi_print_gas(&nl->ResidencyCounter);
   2402  1.44   msaitoh 		printf("\n");
   2403  1.30   msaitoh 	}
   2404  1.30   msaitoh 	if (nl->CounterFrequency)
   2405  1.30   msaitoh 		printf("\tCounterFrequency=%ju\n", nl->CounterFrequency);
   2406  1.30   msaitoh 	else
   2407  1.30   msaitoh 		printf("\tCounterFrequency=TSC\n");
   2408  1.30   msaitoh }
   2409  1.30   msaitoh 
   2410  1.30   msaitoh static void
   2411  1.30   msaitoh acpi_print_lpit(ACPI_LPIT_HEADER *lpit)
   2412  1.30   msaitoh {
   2413  1.30   msaitoh 	if (lpit->Type == ACPI_LPIT_TYPE_NATIVE_CSTATE)
   2414  1.30   msaitoh 		printf("\tType=ACPI_LPIT_TYPE_NATIVE_CSTATE\n");
   2415  1.30   msaitoh 	else
   2416  1.30   msaitoh 		warnx("unknown LPIT type %u", lpit->Type);
   2417  1.30   msaitoh 
   2418  1.30   msaitoh 	printf("\tLength=%u\n", lpit->Length);
   2419  1.30   msaitoh 	printf("\tUniqueId=0x%04x\n", lpit->UniqueId);
   2420  1.30   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_LPIT_## flag, #flag)
   2421  1.30   msaitoh 	printf("\tFlags=");
   2422  1.30   msaitoh 	PRINTFLAG(lpit->Flags, STATE_DISABLED);
   2423  1.30   msaitoh 	PRINTFLAG_END();
   2424  1.30   msaitoh #undef PRINTFLAG
   2425  1.30   msaitoh 
   2426  1.30   msaitoh 	if (lpit->Type == ACPI_LPIT_TYPE_NATIVE_CSTATE)
   2427  1.51    rillig 		acpi_print_native_lpit((ACPI_LPIT_NATIVE *)lpit);
   2428  1.30   msaitoh }
   2429  1.30   msaitoh 
   2430  1.30   msaitoh static void
   2431  1.30   msaitoh acpi_walk_lpit(ACPI_TABLE_HEADER *table, void *first,
   2432  1.30   msaitoh     void (*action)(ACPI_LPIT_HEADER *))
   2433  1.30   msaitoh {
   2434  1.30   msaitoh 	ACPI_LPIT_HEADER *subtable;
   2435  1.30   msaitoh 	char *end;
   2436  1.30   msaitoh 
   2437  1.30   msaitoh 	subtable = first;
   2438  1.30   msaitoh 	end = (char *)table + table->Length;
   2439  1.30   msaitoh 	while ((char *)subtable < end) {
   2440  1.30   msaitoh 		printf("\n");
   2441  1.30   msaitoh 		if (subtable->Length < sizeof(ACPI_LPIT_HEADER)) {
   2442  1.30   msaitoh 			warnx("invalid subtable length %u", subtable->Length);
   2443  1.30   msaitoh 			return;
   2444  1.30   msaitoh 		}
   2445  1.30   msaitoh 		action(subtable);
   2446  1.30   msaitoh 		subtable = (ACPI_LPIT_HEADER *)((char *)subtable +
   2447  1.30   msaitoh 		    subtable->Length);
   2448  1.30   msaitoh 	}
   2449  1.30   msaitoh }
   2450  1.30   msaitoh 
   2451  1.30   msaitoh static void
   2452  1.30   msaitoh acpi_handle_lpit(ACPI_TABLE_HEADER *sdp)
   2453  1.30   msaitoh {
   2454  1.30   msaitoh 	ACPI_TABLE_LPIT *lpit;
   2455  1.30   msaitoh 
   2456  1.30   msaitoh 	printf(BEGIN_COMMENT);
   2457  1.30   msaitoh 	acpi_print_sdt(sdp);
   2458  1.30   msaitoh 	lpit = (ACPI_TABLE_LPIT *)sdp;
   2459  1.30   msaitoh 	acpi_walk_lpit(sdp, (lpit + 1), acpi_print_lpit);
   2460  1.30   msaitoh 
   2461  1.30   msaitoh 	printf(END_COMMENT);
   2462  1.30   msaitoh }
   2463  1.30   msaitoh 
   2464  1.30   msaitoh static void
   2465   1.5    cegger acpi_handle_msct(ACPI_TABLE_HEADER *sdp)
   2466   1.5    cegger {
   2467   1.5    cegger 	ACPI_TABLE_MSCT *msct;
   2468   1.5    cegger 	ACPI_MSCT_PROXIMITY *msctentry;
   2469   1.5    cegger 	uint32_t pos;
   2470   1.5    cegger 
   2471   1.5    cegger 	printf(BEGIN_COMMENT);
   2472   1.5    cegger 	acpi_print_sdt(sdp);
   2473   1.5    cegger 	msct = (ACPI_TABLE_MSCT *)sdp;
   2474   1.5    cegger 
   2475   1.5    cegger 	printf("\tProximity Offset=0x%x\n", msct->ProximityOffset);
   2476   1.5    cegger 	printf("\tMax Proximity Domains=%d\n", msct->MaxProximityDomains);
   2477   1.5    cegger 	printf("\tMax Clock Domains=%d\n", msct->MaxClockDomains);
   2478   1.5    cegger 	printf("\tMax Physical Address=0x%"PRIx64"\n", msct->MaxAddress);
   2479   1.5    cegger 
   2480   1.5    cegger 	pos = msct->ProximityOffset;
   2481   1.5    cegger 	while (pos < msct->Header.Length) {
   2482   1.5    cegger 		msctentry = (ACPI_MSCT_PROXIMITY *)((char *)msct + pos);
   2483   1.5    cegger 		pos += msctentry->Length;
   2484   1.5    cegger 
   2485   1.5    cegger 		printf("\n");
   2486   1.5    cegger 		printf("\tRevision=%d\n", msctentry->Revision);
   2487   1.5    cegger 		printf("\tLength=%d\n", msctentry->Length);
   2488   1.5    cegger 		printf("\tRange Start=%d\n", msctentry->RangeStart);
   2489   1.5    cegger 		printf("\tRange End=%d\n", msctentry->RangeEnd);
   2490   1.5    cegger 		printf("\tProcessor Capacity=%d\n",
   2491   1.5    cegger 		    msctentry->ProcessorCapacity);
   2492   1.5    cegger 		printf("\tMemory Capacity=0x%"PRIx64" byte\n",
   2493   1.5    cegger 		    msctentry->MemoryCapacity);
   2494   1.5    cegger 	}
   2495   1.1  christos 
   2496   1.5    cegger 	printf(END_COMMENT);
   2497   1.5    cegger }
   2498   1.1  christos 
   2499   1.5    cegger static void
   2500   1.5    cegger acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp)
   2501   1.5    cegger {
   2502   1.5    cegger 	ACPI_TABLE_ECDT *ecdt;
   2503   1.1  christos 
   2504   1.5    cegger 	printf(BEGIN_COMMENT);
   2505   1.5    cegger 	acpi_print_sdt(sdp);
   2506   1.5    cegger 	ecdt = (ACPI_TABLE_ECDT *)sdp;
   2507   1.5    cegger 	printf("\tEC_CONTROL=");
   2508   1.5    cegger 	acpi_print_gas(&ecdt->Control);
   2509   1.5    cegger 	printf("\n\tEC_DATA=");
   2510   1.5    cegger 	acpi_print_gas(&ecdt->Data);
   2511   1.5    cegger 	printf("\n\tUID=%#x, ", ecdt->Uid);
   2512   1.5    cegger 	printf("GPE_BIT=%#x\n", ecdt->Gpe);
   2513   1.5    cegger 	printf("\tEC_ID=%s\n", ecdt->Id);
   2514   1.5    cegger 	printf(END_COMMENT);
   2515   1.5    cegger }
   2516   1.1  christos 
   2517   1.5    cegger static void
   2518   1.5    cegger acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp)
   2519   1.5    cegger {
   2520   1.5    cegger 	ACPI_TABLE_MCFG *mcfg;
   2521   1.5    cegger 	ACPI_MCFG_ALLOCATION *alloc;
   2522   1.5    cegger 	u_int i, entries;
   2523   1.1  christos 
   2524   1.5    cegger 	printf(BEGIN_COMMENT);
   2525   1.5    cegger 	acpi_print_sdt(sdp);
   2526   1.5    cegger 	mcfg = (ACPI_TABLE_MCFG *)sdp;
   2527   1.5    cegger 	entries = (sdp->Length - sizeof(ACPI_TABLE_MCFG)) /
   2528   1.5    cegger 	    sizeof(ACPI_MCFG_ALLOCATION);
   2529   1.5    cegger 	alloc = (ACPI_MCFG_ALLOCATION *)(mcfg + 1);
   2530   1.5    cegger 	for (i = 0; i < entries; i++, alloc++) {
   2531   1.5    cegger 		printf("\n");
   2532  1.16   msaitoh 		printf("\tBase Address=0x%016jx\n", (uintmax_t)alloc->Address);
   2533   1.5    cegger 		printf("\tSegment Group=0x%04x\n", alloc->PciSegment);
   2534   1.5    cegger 		printf("\tStart Bus=%d\n", alloc->StartBusNumber);
   2535   1.5    cegger 		printf("\tEnd Bus=%d\n", alloc->EndBusNumber);
   2536   1.5    cegger 	}
   2537   1.5    cegger 	printf(END_COMMENT);
   2538   1.5    cegger }
   2539   1.1  christos 
   2540   1.1  christos static void
   2541  1.48  jmcneill acpi_print_pcct_subspace(ACPI_PCCT_SUBSPACE *subspace)
   2542  1.48  jmcneill {
   2543  1.48  jmcneill 	printf("\tType=Generic Subspace\n");
   2544  1.48  jmcneill 	printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
   2545  1.48  jmcneill 	printf("\tLength=%jd\n", subspace->Length);
   2546  1.48  jmcneill 	printf("\tDoorbell Address=");
   2547  1.48  jmcneill 	acpi_print_gas(&subspace->DoorbellRegister);
   2548  1.48  jmcneill 	printf("\n");
   2549  1.48  jmcneill 	printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
   2550  1.48  jmcneill 	printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
   2551  1.48  jmcneill 	printf("\tLatency=%u us\n", subspace->Latency);
   2552  1.48  jmcneill 	printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
   2553  1.48  jmcneill 	printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
   2554  1.48  jmcneill }
   2555  1.48  jmcneill 
   2556  1.48  jmcneill static void
   2557  1.48  jmcneill acpi_print_pcct_hw_reduced(ACPI_PCCT_HW_REDUCED *subspace)
   2558  1.48  jmcneill {
   2559  1.48  jmcneill 	printf("\tType=HW-reduced Subspace\n");
   2560  1.48  jmcneill 	printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
   2561  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
   2562  1.48  jmcneill 		printf(", Edge triggered");
   2563  1.48  jmcneill 	} else {
   2564  1.48  jmcneill 		printf(", Level triggered");
   2565  1.48  jmcneill 	}
   2566  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
   2567  1.48  jmcneill 		printf(", Active low");
   2568  1.48  jmcneill 	} else {
   2569  1.48  jmcneill 		printf(", Active high");
   2570  1.48  jmcneill 	}
   2571  1.48  jmcneill 	printf("\n");
   2572  1.48  jmcneill 	printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
   2573  1.48  jmcneill 	printf("\tLength=%jd\n", subspace->Length);
   2574  1.48  jmcneill 	printf("\tDoorbell Register=");
   2575  1.48  jmcneill 	acpi_print_gas(&subspace->DoorbellRegister);
   2576  1.48  jmcneill 	printf("\n");
   2577  1.48  jmcneill 	printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
   2578  1.48  jmcneill 	printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
   2579  1.48  jmcneill 	printf("\tLatency=%u us\n", subspace->Latency);
   2580  1.48  jmcneill 	printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
   2581  1.48  jmcneill 	printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
   2582  1.48  jmcneill }
   2583  1.48  jmcneill 
   2584  1.48  jmcneill static void
   2585  1.48  jmcneill acpi_print_pcct_hw_reduced_type2(ACPI_PCCT_HW_REDUCED_TYPE2 *subspace)
   2586  1.48  jmcneill {
   2587  1.48  jmcneill 	printf("\tType=HW-reduced Subspace Type 2\n");
   2588  1.48  jmcneill 	printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
   2589  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
   2590  1.48  jmcneill 		printf(", Edge triggered");
   2591  1.48  jmcneill 	} else {
   2592  1.48  jmcneill 		printf(", Level triggered");
   2593  1.48  jmcneill 	}
   2594  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
   2595  1.48  jmcneill 		printf(", Active low");
   2596  1.48  jmcneill 	} else {
   2597  1.48  jmcneill 		printf(", Active high");
   2598  1.48  jmcneill 	}
   2599  1.48  jmcneill 	printf("\n");
   2600  1.48  jmcneill 	printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
   2601  1.48  jmcneill 	printf("\tLength=%jd\n", subspace->Length);
   2602  1.48  jmcneill 	printf("\tDoorbell Register=");
   2603  1.48  jmcneill 	acpi_print_gas(&subspace->DoorbellRegister);
   2604  1.48  jmcneill 	printf("\n");
   2605  1.48  jmcneill 	printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
   2606  1.48  jmcneill 	printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
   2607  1.48  jmcneill 	printf("\tLatency=%u us\n", subspace->Latency);
   2608  1.48  jmcneill 	printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
   2609  1.48  jmcneill 	printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
   2610  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Register=");
   2611  1.48  jmcneill 	acpi_print_gas(&subspace->PlatformAckRegister);
   2612  1.48  jmcneill 	printf("\n");
   2613  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Preserve=0x%016jx\n", subspace->AckPreserveMask);
   2614  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Write=0x%016jx\n", subspace->AckWriteMask);
   2615  1.48  jmcneill }
   2616  1.48  jmcneill 
   2617  1.48  jmcneill static void
   2618  1.48  jmcneill acpi_print_pcct_ext_pcc_master(ACPI_PCCT_EXT_PCC_MASTER *subspace)
   2619  1.48  jmcneill {
   2620  1.48  jmcneill 	printf("\tType=Extended PCC Master Subspace\n");
   2621  1.48  jmcneill 	printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
   2622  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
   2623  1.48  jmcneill 		printf(", Edge triggered");
   2624  1.48  jmcneill 	} else {
   2625  1.48  jmcneill 		printf(", Level triggered");
   2626  1.48  jmcneill 	}
   2627  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
   2628  1.48  jmcneill 		printf(", Active low");
   2629  1.48  jmcneill 	} else {
   2630  1.48  jmcneill 		printf(", Active high");
   2631  1.48  jmcneill 	}
   2632  1.48  jmcneill 	printf("\n");
   2633  1.48  jmcneill 	printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
   2634  1.48  jmcneill 	printf("\tLength=%d\n", subspace->Length);
   2635  1.48  jmcneill 	printf("\tDoorbell Register=");
   2636  1.48  jmcneill 	acpi_print_gas(&subspace->DoorbellRegister);
   2637  1.48  jmcneill 	printf("\n");
   2638  1.48  jmcneill 	printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
   2639  1.48  jmcneill 	printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
   2640  1.48  jmcneill 	printf("\tLatency=%u us\n", subspace->Latency);
   2641  1.48  jmcneill 	printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
   2642  1.48  jmcneill 	printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
   2643  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Register=");
   2644  1.48  jmcneill 	acpi_print_gas(&subspace->PlatformAckRegister);
   2645  1.48  jmcneill 	printf("\n");
   2646  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Preserve=0x%016jx\n", subspace->AckPreserveMask);
   2647  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Set=0x%016jx\n", subspace->AckSetMask);
   2648  1.48  jmcneill 	printf("\tCommand Complete Register=");
   2649  1.48  jmcneill 	acpi_print_gas(&subspace->CmdCompleteRegister);
   2650  1.48  jmcneill 	printf("\n");
   2651  1.48  jmcneill 	printf("\tCommand Complete Mask=0x%016jx\n", subspace->CmdCompleteMask);
   2652  1.48  jmcneill 	printf("\tCommand Update Register=");
   2653  1.48  jmcneill 	acpi_print_gas(&subspace->CmdUpdateRegister);
   2654  1.48  jmcneill 	printf("\n");
   2655  1.48  jmcneill 	printf("\tCommand Update Preserve Mask=0x%016jx\n", subspace->CmdUpdatePreserveMask);
   2656  1.49  jmcneill 	printf("\tCommand Update Set Mask=0x%016jx\n", subspace->CmdUpdateSetMask);
   2657  1.48  jmcneill 	printf("\tError Status Register=");
   2658  1.48  jmcneill 	acpi_print_gas(&subspace->ErrorStatusRegister);
   2659  1.48  jmcneill 	printf("\n");
   2660  1.48  jmcneill 	printf("\tError Status Mask=0x%016jx\n", subspace->ErrorStatusMask);
   2661  1.48  jmcneill }
   2662  1.48  jmcneill 
   2663  1.48  jmcneill static void
   2664  1.48  jmcneill acpi_print_pcct_ext_pcc_slave(ACPI_PCCT_EXT_PCC_SLAVE *subspace)
   2665  1.48  jmcneill {
   2666  1.48  jmcneill 	printf("\tType=Extended PCC Slave Subspace\n");
   2667  1.48  jmcneill 	printf("\tPlatform Interrupt=%u", subspace->PlatformInterrupt);
   2668  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_POLARITY) {
   2669  1.48  jmcneill 		printf(", Edge triggered");
   2670  1.48  jmcneill 	} else {
   2671  1.48  jmcneill 		printf(", Level triggered");
   2672  1.48  jmcneill 	}
   2673  1.48  jmcneill 	if (subspace->Flags & ACPI_PCCT_INTERRUPT_MODE) {
   2674  1.48  jmcneill 		printf(", Active low");
   2675  1.48  jmcneill 	} else {
   2676  1.48  jmcneill 		printf(", Active high");
   2677  1.48  jmcneill 	}
   2678  1.48  jmcneill 	printf("\n");
   2679  1.48  jmcneill 	printf("\tBase Address=0x%016jx\n", subspace->BaseAddress);
   2680  1.48  jmcneill 	printf("\tLength=%d\n", subspace->Length);
   2681  1.48  jmcneill 	printf("\tDoorbell Register=");
   2682  1.48  jmcneill 	acpi_print_gas(&subspace->DoorbellRegister);
   2683  1.48  jmcneill 	printf("\n");
   2684  1.48  jmcneill 	printf("\tDoorbell Preserve=0x%016jx\n", subspace->PreserveMask);
   2685  1.48  jmcneill 	printf("\tDoorbell Write=0x%016jx\n", subspace->WriteMask);
   2686  1.48  jmcneill 	printf("\tLatency=%u us\n", subspace->Latency);
   2687  1.48  jmcneill 	printf("\tMax Access Rate=%u\n", subspace->MaxAccessRate);
   2688  1.48  jmcneill 	printf("\tMin Turnaround Time=%u us\n", subspace->MinTurnaroundTime);
   2689  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Register=");
   2690  1.48  jmcneill 	acpi_print_gas(&subspace->PlatformAckRegister);
   2691  1.48  jmcneill 	printf("\n");
   2692  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Preserve=0x%016jx\n", subspace->AckPreserveMask);
   2693  1.48  jmcneill 	printf("\tPlatform Interrupt Ack Set=0x%016jx\n", subspace->AckSetMask);
   2694  1.48  jmcneill 	printf("\tCommand Complete Register=");
   2695  1.48  jmcneill 	acpi_print_gas(&subspace->CmdCompleteRegister);
   2696  1.48  jmcneill 	printf("\n");
   2697  1.48  jmcneill 	printf("\tCommand Complete Mask=0x%016jx\n", subspace->CmdCompleteMask);
   2698  1.48  jmcneill 	printf("\tCommand Update Register=");
   2699  1.48  jmcneill 	acpi_print_gas(&subspace->CmdUpdateRegister);
   2700  1.48  jmcneill 	printf("\n");
   2701  1.48  jmcneill 	printf("\tCommand Update Preserve Mask=0x%016jx\n", subspace->CmdUpdatePreserveMask);
   2702  1.49  jmcneill 	printf("\tCommand Update Set Mask=0x%016jx\n", subspace->CmdUpdateSetMask);
   2703  1.48  jmcneill 	printf("\tError Status Register=");
   2704  1.48  jmcneill 	acpi_print_gas(&subspace->ErrorStatusRegister);
   2705  1.48  jmcneill 	printf("\n");
   2706  1.48  jmcneill 	printf("\tError Status Mask=0x%016jx\n", subspace->ErrorStatusMask);
   2707  1.48  jmcneill }
   2708  1.48  jmcneill 
   2709  1.48  jmcneill static void
   2710  1.48  jmcneill acpi_print_pcct(ACPI_SUBTABLE_HEADER *hdr)
   2711  1.48  jmcneill {
   2712  1.48  jmcneill 	switch (hdr->Type) {
   2713  1.48  jmcneill 	case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
   2714  1.48  jmcneill 		acpi_print_pcct_subspace((ACPI_PCCT_SUBSPACE *)hdr);
   2715  1.48  jmcneill 		break;
   2716  1.48  jmcneill 	case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
   2717  1.48  jmcneill 		acpi_print_pcct_hw_reduced((ACPI_PCCT_HW_REDUCED *)hdr);
   2718  1.48  jmcneill 		break;
   2719  1.48  jmcneill 	case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
   2720  1.48  jmcneill 		acpi_print_pcct_hw_reduced_type2((ACPI_PCCT_HW_REDUCED_TYPE2 *)hdr);
   2721  1.48  jmcneill 		break;
   2722  1.48  jmcneill 	case ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE:
   2723  1.48  jmcneill 		acpi_print_pcct_ext_pcc_master((ACPI_PCCT_EXT_PCC_MASTER *)hdr);
   2724  1.48  jmcneill 		break;
   2725  1.48  jmcneill 	case ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE:
   2726  1.48  jmcneill 		acpi_print_pcct_ext_pcc_slave((ACPI_PCCT_EXT_PCC_SLAVE *)hdr);
   2727  1.48  jmcneill 		break;
   2728  1.48  jmcneill 	default:
   2729  1.48  jmcneill 		printf("\tUnknown structure"
   2730  1.48  jmcneill 		    "(type = %hhu, length = %hhu)\n",
   2731  1.48  jmcneill 		    hdr->Type, hdr->Length);
   2732  1.48  jmcneill 		break;
   2733  1.48  jmcneill 	}
   2734  1.48  jmcneill }
   2735  1.48  jmcneill 
   2736  1.48  jmcneill static void
   2737  1.48  jmcneill acpi_handle_pcct(ACPI_TABLE_HEADER *sdp)
   2738  1.48  jmcneill {
   2739  1.48  jmcneill 	ACPI_TABLE_PCCT *pcct;
   2740  1.48  jmcneill 
   2741  1.48  jmcneill 	printf(BEGIN_COMMENT);
   2742  1.48  jmcneill 	acpi_print_sdt(sdp);
   2743  1.48  jmcneill 
   2744  1.48  jmcneill 	pcct = (ACPI_TABLE_PCCT *)sdp;
   2745  1.48  jmcneill #define PRINTFLAG(var, flag)	printflag((var), ACPI_PCCT_## flag, #flag)
   2746  1.48  jmcneill 	printf("\tFlags=");
   2747  1.48  jmcneill 	PRINTFLAG(pcct->Flags, DOORBELL);
   2748  1.48  jmcneill 	PRINTFLAG_END();
   2749  1.48  jmcneill #undef PRINTFLAG
   2750  1.48  jmcneill 
   2751  1.48  jmcneill 	acpi_walk_subtables(sdp, (pcct + 1), acpi_print_pcct);
   2752  1.48  jmcneill 
   2753  1.48  jmcneill 	printf(END_COMMENT);
   2754  1.48  jmcneill }
   2755  1.48  jmcneill 
   2756  1.48  jmcneill static void
   2757  1.35   msaitoh acpi_print_pptt_processor(ACPI_PPTT_PROCESSOR *processor)
   2758  1.35   msaitoh {
   2759  1.35   msaitoh 	uint32_t *private;
   2760  1.35   msaitoh 	unsigned int i;
   2761  1.35   msaitoh 
   2762  1.35   msaitoh 	printf("\tType=processor\n");
   2763  1.35   msaitoh 	printf("\tLength=%d\n", processor->Header.Length);
   2764  1.35   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_PPTT_## flag, #flag)
   2765  1.35   msaitoh 
   2766  1.35   msaitoh 	printf("\tFlags=");
   2767  1.35   msaitoh 	PRINTFLAG(processor->Flags, PHYSICAL_PACKAGE);
   2768  1.35   msaitoh 	PRINTFLAG(processor->Flags, ACPI_PROCESSOR_ID_VALID);
   2769  1.35   msaitoh 	PRINTFLAG_END();
   2770  1.35   msaitoh 
   2771  1.35   msaitoh #undef PRINTFLAG
   2772  1.35   msaitoh 	printf("\tParent=%08x\n", processor->Parent);
   2773  1.35   msaitoh 	printf("\tACPI Processor ID=0x%08x\n", processor->AcpiProcessorId);
   2774  1.35   msaitoh 	printf("\tprivate resources=%d\n", processor->NumberOfPrivResources);
   2775  1.35   msaitoh 
   2776  1.35   msaitoh 	private = (uint32_t *)(processor + 1);
   2777  1.35   msaitoh 	for (i = 0; i < processor->NumberOfPrivResources; i++)
   2778  1.35   msaitoh 		printf("\tprivate resources%d=%08x\n", i, private[i]);
   2779  1.35   msaitoh }
   2780  1.35   msaitoh 
   2781  1.35   msaitoh static void
   2782  1.35   msaitoh acpi_print_pptt_cache(ACPI_PPTT_CACHE *cache)
   2783  1.35   msaitoh {
   2784  1.35   msaitoh 
   2785  1.35   msaitoh 	printf("\tType=cache\n");
   2786  1.35   msaitoh 	printf("\tLength=%d\n", cache->Header.Length);
   2787  1.35   msaitoh 
   2788  1.35   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_PPTT_## flag, #flag)
   2789  1.35   msaitoh 	printf("\tFlags=");
   2790  1.35   msaitoh 	PRINTFLAG(cache->Flags, SIZE_PROPERTY_VALID);
   2791  1.35   msaitoh 	PRINTFLAG(cache->Flags, NUMBER_OF_SETS_VALID);
   2792  1.35   msaitoh 	PRINTFLAG(cache->Flags, ASSOCIATIVITY_VALID);
   2793  1.35   msaitoh 	PRINTFLAG(cache->Flags, ALLOCATION_TYPE_VALID);
   2794  1.35   msaitoh 	PRINTFLAG(cache->Flags, CACHE_TYPE_VALID);
   2795  1.35   msaitoh 	PRINTFLAG(cache->Flags, WRITE_POLICY_VALID);
   2796  1.35   msaitoh 	PRINTFLAG(cache->Flags, LINE_SIZE_VALID);
   2797  1.35   msaitoh 	PRINTFLAG_END();
   2798  1.35   msaitoh #undef PRINTFLAG
   2799  1.35   msaitoh 
   2800  1.35   msaitoh 	printf("\tNextLevel=0x%08x\n", cache->NextLevelOfCache);
   2801  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
   2802  1.35   msaitoh 		printf("\tSize=%d\n", cache->Size);
   2803  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
   2804  1.35   msaitoh 		printf("\tSets=%d\n", cache->NumberOfSets);
   2805  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
   2806  1.35   msaitoh 		printf("\tAssociativity=%d\n", cache->Associativity);
   2807  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_ALLOCATION_TYPE_VALID) {
   2808  1.35   msaitoh 		printf("\tAllocation type=");
   2809  1.38   msaitoh 		switch (cache->Attributes & ACPI_PPTT_MASK_ALLOCATION_TYPE) {
   2810  1.35   msaitoh 		case ACPI_PPTT_CACHE_READ_ALLOCATE:
   2811  1.35   msaitoh 			printf("Read allocate\n");
   2812  1.35   msaitoh 			break;
   2813  1.35   msaitoh 		case ACPI_PPTT_CACHE_WRITE_ALLOCATE:
   2814  1.35   msaitoh 			printf("Write allocate\n");
   2815  1.35   msaitoh 			break;
   2816  1.35   msaitoh 		case ACPI_PPTT_CACHE_RW_ALLOCATE:
   2817  1.35   msaitoh 		case ACPI_PPTT_CACHE_RW_ALLOCATE_ALT:
   2818  1.35   msaitoh 			printf("Read and Write allocate\n");
   2819  1.35   msaitoh 			break;
   2820  1.35   msaitoh 		}
   2821  1.35   msaitoh 	}
   2822  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_CACHE_TYPE_VALID) {
   2823  1.35   msaitoh 		printf("\tCache type=");
   2824  1.38   msaitoh 		switch (cache->Attributes & ACPI_PPTT_MASK_CACHE_TYPE) {
   2825  1.35   msaitoh 		case ACPI_PPTT_CACHE_TYPE_DATA:
   2826  1.35   msaitoh 			printf("Data\n");
   2827  1.35   msaitoh 			break;
   2828  1.35   msaitoh 		case ACPI_PPTT_CACHE_TYPE_INSTR:
   2829  1.35   msaitoh 			printf("Instruction\n");
   2830  1.35   msaitoh 			break;
   2831  1.35   msaitoh 		case ACPI_PPTT_CACHE_TYPE_UNIFIED:
   2832  1.35   msaitoh 		case ACPI_PPTT_CACHE_TYPE_UNIFIED_ALT:
   2833  1.35   msaitoh 			printf("Unified\n");
   2834  1.35   msaitoh 			break;
   2835  1.35   msaitoh 		}
   2836  1.35   msaitoh 	}
   2837  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_WRITE_POLICY_VALID)
   2838  1.35   msaitoh 		printf("\tWrite Policy=Write %s \n",
   2839  1.35   msaitoh 		    (cache->Attributes & ACPI_PPTT_MASK_WRITE_POLICY) ?
   2840  1.35   msaitoh 		    "through" : "back");
   2841  1.35   msaitoh 
   2842  1.35   msaitoh 	if (cache->Flags & ACPI_PPTT_LINE_SIZE_VALID)
   2843  1.35   msaitoh 		printf("\tLine size=%d\n", cache->LineSize);
   2844  1.35   msaitoh }
   2845  1.35   msaitoh 
   2846  1.35   msaitoh static void
   2847  1.35   msaitoh acpi_print_pptt_id(ACPI_PPTT_ID *id)
   2848  1.35   msaitoh {
   2849  1.35   msaitoh 
   2850  1.35   msaitoh 	printf("\tType=id\n");
   2851  1.35   msaitoh 	printf("\tLength=%d\n", id->Header.Length);
   2852  1.35   msaitoh 
   2853  1.35   msaitoh 	printf("\tVENDOR_ID=");
   2854  1.35   msaitoh 	acpi_print_string((char *)&id->VendorId, 4);
   2855  1.35   msaitoh 	printf("\n");
   2856  1.35   msaitoh 
   2857  1.35   msaitoh 	printf("\tLEVEL_1_ID=%016" PRIx64 "\n", id->Level1Id);
   2858  1.35   msaitoh 	printf("\tLEVEL_2_ID=%016" PRIx64 "\n", id->Level2Id);
   2859  1.35   msaitoh 	printf("\tMajor=%hu", id->MajorRev);
   2860  1.35   msaitoh 	printf("\tMinor=%hu", id->MinorRev);
   2861  1.35   msaitoh 	printf("\tSpin=%hu", id->SpinRev);
   2862  1.35   msaitoh }
   2863  1.35   msaitoh 
   2864  1.35   msaitoh static void
   2865  1.35   msaitoh acpi_print_pptt(ACPI_SUBTABLE_HEADER *hdr)
   2866  1.35   msaitoh {
   2867  1.35   msaitoh 	switch (hdr->Type) {
   2868  1.35   msaitoh 	case ACPI_PPTT_TYPE_PROCESSOR:
   2869  1.35   msaitoh 		acpi_print_pptt_processor((ACPI_PPTT_PROCESSOR *)hdr);
   2870  1.35   msaitoh 		break;
   2871  1.35   msaitoh 	case ACPI_PPTT_TYPE_CACHE:
   2872  1.35   msaitoh 		acpi_print_pptt_cache((ACPI_PPTT_CACHE *)hdr);
   2873  1.35   msaitoh 		break;
   2874  1.35   msaitoh 	case ACPI_PPTT_TYPE_ID:
   2875  1.35   msaitoh 		acpi_print_pptt_id((ACPI_PPTT_ID *)hdr);
   2876  1.35   msaitoh 		break;
   2877  1.35   msaitoh 	default:
   2878  1.35   msaitoh 		printf("\tUnknown structure"
   2879  1.35   msaitoh 		    "(type = %hhu, length = %hhu)\n",
   2880  1.35   msaitoh 		    hdr->Type, hdr->Length);
   2881  1.35   msaitoh 		break;
   2882  1.35   msaitoh 	}
   2883  1.35   msaitoh }
   2884  1.35   msaitoh 
   2885  1.35   msaitoh static void
   2886  1.35   msaitoh acpi_handle_pptt(ACPI_TABLE_HEADER *sdp)
   2887  1.35   msaitoh {
   2888  1.35   msaitoh 	ACPI_TABLE_PPTT *pptt;
   2889  1.35   msaitoh 
   2890  1.35   msaitoh 	printf(BEGIN_COMMENT);
   2891  1.35   msaitoh 	acpi_print_sdt(sdp);
   2892  1.35   msaitoh 
   2893  1.35   msaitoh 	pptt = (ACPI_TABLE_PPTT *)sdp;
   2894  1.35   msaitoh 	acpi_walk_subtables(sdp, (pptt + 1), acpi_print_pptt);
   2895  1.35   msaitoh 
   2896  1.35   msaitoh 	printf(END_COMMENT);
   2897  1.35   msaitoh }
   2898  1.35   msaitoh 
   2899  1.35   msaitoh static void
   2900   1.5    cegger acpi_handle_sbst(ACPI_TABLE_HEADER *sdp)
   2901   1.1  christos {
   2902   1.5    cegger 	ACPI_TABLE_SBST *sbst;
   2903   1.5    cegger 
   2904   1.5    cegger 	printf(BEGIN_COMMENT);
   2905   1.5    cegger 	acpi_print_sdt(sdp);
   2906   1.5    cegger 	sbst = (ACPI_TABLE_SBST *)sdp;
   2907   1.5    cegger 
   2908   1.5    cegger 	printf("\tWarning Level=%d mWh\n", sbst->WarningLevel);
   2909   1.5    cegger 	printf("\tLow Level=%d mWh\n", sbst->LowLevel);
   2910   1.5    cegger 	printf("\tCritical Level=%d mWh\n", sbst->CriticalLevel);
   2911   1.1  christos 
   2912   1.5    cegger 	printf(END_COMMENT);
   2913   1.1  christos }
   2914   1.1  christos 
   2915   1.1  christos static void
   2916   1.5    cegger acpi_handle_slit(ACPI_TABLE_HEADER *sdp)
   2917   1.1  christos {
   2918   1.5    cegger 	ACPI_TABLE_SLIT *slit;
   2919   1.5    cegger 	u_int idx;
   2920   1.5    cegger 	uint64_t cnt;
   2921   1.5    cegger 
   2922   1.5    cegger 	printf(BEGIN_COMMENT);
   2923   1.5    cegger 	acpi_print_sdt(sdp);
   2924   1.5    cegger 	slit = (ACPI_TABLE_SLIT *)sdp;
   2925   1.1  christos 
   2926   1.5    cegger 	cnt = slit->LocalityCount * slit->LocalityCount;
   2927  1.16   msaitoh 	printf("\tLocalityCount=%ju\n", (uintmax_t)slit->LocalityCount);
   2928   1.5    cegger 	printf("\tEntry=\n\t");
   2929   1.5    cegger 	for (idx = 0; idx < cnt; idx++) {
   2930   1.5    cegger 		printf("%u ", slit->Entry[idx]);
   2931   1.5    cegger 		if ((idx % slit->LocalityCount) == (slit->LocalityCount - 1)) {
   2932   1.5    cegger 			printf("\n");
   2933   1.5    cegger 			if (idx < cnt - 1)
   2934   1.5    cegger 				printf("\t");
   2935   1.5    cegger 		}
   2936   1.5    cegger 	}
   2937   1.1  christos 
   2938   1.5    cegger 	printf(END_COMMENT);
   2939   1.1  christos }
   2940   1.1  christos 
   2941   1.1  christos static void
   2942   1.5    cegger acpi_handle_spcr(ACPI_TABLE_HEADER *sdp)
   2943   1.1  christos {
   2944   1.5    cegger 	ACPI_TABLE_SPCR *spcr;
   2945   1.5    cegger 
   2946   1.5    cegger 	printf(BEGIN_COMMENT);
   2947   1.5    cegger 	acpi_print_sdt(sdp);
   2948   1.5    cegger 	spcr = (ACPI_TABLE_SPCR *)sdp;
   2949   1.5    cegger 
   2950  1.34   msaitoh 	printf("\n\tInterface Type=");
   2951  1.34   msaitoh 	switch (sdp->Revision) {
   2952  1.34   msaitoh 	case 1:
   2953  1.34   msaitoh 		printf("full 16550%s\n",
   2954  1.34   msaitoh 		    (spcr->InterfaceType == 1) ?
   2955  1.34   msaitoh 		    "(must also accept writing FCR register)" : "");
   2956  1.34   msaitoh 		break;
   2957  1.34   msaitoh 	case 2:
   2958  1.34   msaitoh 		acpi_print_dbg2_serial_subtype(spcr->InterfaceType);
   2959  1.34   msaitoh 		break;
   2960  1.34   msaitoh 	default:
   2961  1.34   msaitoh 		printf("unknown Revision\n");
   2962  1.34   msaitoh 		break;
   2963  1.34   msaitoh 	}
   2964  1.34   msaitoh 
   2965   1.5    cegger 	printf("\tSerial Port=");
   2966   1.5    cegger 	acpi_print_gas(&spcr->SerialPort);
   2967   1.5    cegger 	printf("\n\tInterrupt Type={");
   2968   1.5    cegger 	if (spcr->InterruptType & 0x1) {
   2969   1.5    cegger 		printf("\n\t\tdual-8259 IRQ=");
   2970   1.5    cegger 		switch (spcr->PcInterrupt) {
   2971   1.5    cegger 		case 2 ... 7:
   2972   1.5    cegger 		case 9 ... 12:
   2973   1.5    cegger 		case 14 ... 15:
   2974   1.5    cegger 			printf("%d", spcr->PcInterrupt);
   2975   1.5    cegger 			break;
   2976   1.5    cegger 		default:
   2977   1.5    cegger 			printf("%d (invalid entry)", spcr->PcInterrupt);
   2978   1.5    cegger 			break;
   2979   1.5    cegger 		}
   2980   1.5    cegger 	}
   2981   1.5    cegger 	if (spcr->InterruptType & 0x2) {
   2982   1.5    cegger 		printf("\n\t\tIO APIC={ GSI=%d }", spcr->Interrupt);
   2983   1.5    cegger 	}
   2984   1.5    cegger 	if (spcr->InterruptType & 0x4) {
   2985   1.5    cegger 		printf("\n\t\tIO SAPIC={ GSI=%d }", spcr->Interrupt);
   2986   1.5    cegger 	}
   2987  1.34   msaitoh 	if (spcr->InterruptType & 0x8) {
   2988  1.34   msaitoh 		printf("\n\t\tARMH GIC={ GSI=%d }", spcr->Interrupt);
   2989  1.34   msaitoh 	}
   2990   1.5    cegger 	printf("\n\t}\n");
   2991   1.5    cegger 
   2992   1.5    cegger 	printf("\tBaud Rate=");
   2993   1.5    cegger 	switch (spcr->BaudRate) {
   2994   1.5    cegger 	case 3:
   2995   1.5    cegger 		printf("9600");
   2996   1.5    cegger 		break;
   2997   1.5    cegger 	case 4:
   2998   1.5    cegger 		printf("19200");
   2999   1.5    cegger 		break;
   3000   1.5    cegger 	case 6:
   3001   1.5    cegger 		printf("57600");
   3002   1.5    cegger 		break;
   3003   1.5    cegger 	case 7:
   3004   1.5    cegger 		printf("115200");
   3005   1.5    cegger 		break;
   3006   1.5    cegger 	default:
   3007   1.5    cegger 		printf("unknown speed index %d", spcr->BaudRate);
   3008   1.5    cegger 		break;
   3009   1.5    cegger 	}
   3010   1.5    cegger 	printf("\n\tParity={");
   3011   1.5    cegger 	switch (spcr->Parity) {
   3012   1.5    cegger 	case 0:
   3013   1.5    cegger 		printf("OFF");
   3014   1.5    cegger 		break;
   3015   1.5    cegger 	default:
   3016   1.5    cegger 		printf("ON");
   3017   1.5    cegger 		break;
   3018   1.5    cegger 	}
   3019   1.5    cegger 	printf("}\n");
   3020   1.5    cegger 
   3021   1.5    cegger 	printf("\tStop Bits={");
   3022   1.5    cegger 	switch (spcr->StopBits) {
   3023   1.5    cegger 	case 1:
   3024   1.5    cegger 		printf("ON");
   3025   1.5    cegger 		break;
   3026   1.5    cegger 	default:
   3027   1.5    cegger 		printf("OFF");
   3028   1.5    cegger 		break;
   3029   1.5    cegger 	}
   3030   1.5    cegger 	printf("}\n");
   3031   1.1  christos 
   3032   1.5    cegger 	printf("\tFlow Control={");
   3033   1.5    cegger 	if (spcr->FlowControl & 0x1)
   3034   1.5    cegger 		printf("DCD, ");
   3035   1.5    cegger 	if (spcr->FlowControl & 0x2)
   3036   1.5    cegger 		printf("RTS/CTS hardware, ");
   3037   1.5    cegger 	if (spcr->FlowControl & 0x4)
   3038   1.5    cegger 		printf("XON/XOFF software");
   3039   1.5    cegger 	printf("}\n");
   3040   1.1  christos 
   3041   1.5    cegger 	printf("\tTerminal=");
   3042   1.5    cegger 	switch (spcr->TerminalType) {
   3043   1.5    cegger 	case 0:
   3044   1.5    cegger 		printf("VT100");
   3045   1.5    cegger 		break;
   3046   1.5    cegger 	case 1:
   3047   1.5    cegger 		printf("VT100+");
   3048   1.5    cegger 		break;
   3049   1.5    cegger 	case 2:
   3050   1.5    cegger 		printf("VT-UTF8");
   3051   1.5    cegger 		break;
   3052   1.5    cegger 	case 3:
   3053   1.5    cegger 		printf("ANSI");
   3054   1.5    cegger 		break;
   3055   1.5    cegger 	default:
   3056   1.5    cegger 		printf("unknown type %d", spcr->TerminalType);
   3057   1.5    cegger 		break;
   3058   1.1  christos 	}
   3059   1.5    cegger 	printf("\n");
   3060   1.5    cegger 
   3061   1.5    cegger 	acpi_print_pci(spcr->PciVendorId, spcr->PciDeviceId,
   3062   1.5    cegger 	    spcr->PciSegment, spcr->PciBus, spcr->PciDevice, spcr->PciFunction);
   3063   1.5    cegger 
   3064   1.5    cegger 	printf("\tPCI Flags={");
   3065   1.5    cegger 	if (spcr->PciFlags & ACPI_SPCR_DO_NOT_DISABLE)
   3066   1.5    cegger 		printf("DONOT_DISABLE");
   3067   1.5    cegger 	printf("}\n");
   3068   1.5    cegger 
   3069   1.5    cegger 	printf(END_COMMENT);
   3070   1.5    cegger }
   3071   1.5    cegger 
   3072   1.5    cegger static void
   3073  1.22   msaitoh acpi_handle_spmi(ACPI_TABLE_HEADER *sdp)
   3074  1.22   msaitoh {
   3075  1.22   msaitoh 	ACPI_TABLE_SPMI *spmi;
   3076  1.22   msaitoh 
   3077  1.22   msaitoh 	printf(BEGIN_COMMENT);
   3078  1.22   msaitoh 	acpi_print_sdt(sdp);
   3079  1.22   msaitoh 	spmi = (ACPI_TABLE_SPMI *)sdp;
   3080  1.22   msaitoh 
   3081  1.22   msaitoh 	printf("\tInterface Type=");
   3082  1.22   msaitoh 	switch (spmi->InterfaceType) {
   3083  1.22   msaitoh 	case ACPI_SPMI_KEYBOARD:
   3084  1.22   msaitoh 		printf("Keyboard Controller Stype (KCS)");
   3085  1.22   msaitoh 		break;
   3086  1.22   msaitoh 	case ACPI_SPMI_SMI:
   3087  1.22   msaitoh 		printf("Server Management Interface Chip (SMIC)");
   3088  1.22   msaitoh 		break;
   3089  1.22   msaitoh 	case ACPI_SPMI_BLOCK_TRANSFER:
   3090  1.22   msaitoh 		printf("Block Transfer (BT)");
   3091  1.22   msaitoh 		break;
   3092  1.22   msaitoh 	case ACPI_SPMI_SMBUS:
   3093  1.22   msaitoh 		printf("SMBus System Interface (SSIF)");
   3094  1.22   msaitoh 		break;
   3095  1.22   msaitoh 	default:
   3096  1.22   msaitoh 		printf("Reserved(%d)", spmi->InterfaceType);
   3097  1.22   msaitoh 		break;
   3098  1.22   msaitoh 	}
   3099  1.32   msaitoh 	printf("\n\tSpecRevision=%d.%d", spmi->SpecRevision >> 8,
   3100  1.22   msaitoh 		spmi->SpecRevision & 0xff);
   3101  1.22   msaitoh 
   3102  1.22   msaitoh 	printf("\n\tInterrupt Type={");
   3103  1.22   msaitoh 	if (spmi->InterruptType & 0x1) {
   3104  1.22   msaitoh 		printf("\n\t\tSCI triggered GPE=%d", spmi->GpeNumber);
   3105  1.22   msaitoh 	}
   3106  1.22   msaitoh 	if (spmi->InterruptType & 0x2) {
   3107  1.22   msaitoh 		printf("\n\t\tIO APIC/SAPIC={ GSI=%d }", spmi->Interrupt);
   3108  1.22   msaitoh 	}
   3109  1.22   msaitoh 	printf("\n\t}\n");
   3110  1.22   msaitoh 
   3111  1.22   msaitoh 	printf("\tBase Address=");
   3112  1.22   msaitoh 	acpi_print_gas(&spmi->IpmiRegister);
   3113  1.22   msaitoh 	printf("\n");
   3114  1.22   msaitoh 
   3115  1.22   msaitoh 	if ((spmi->PciDeviceFlag & 0x01) != 0)
   3116  1.22   msaitoh 		acpi_print_pci_sbdf(spmi->PciSegment, spmi->PciBus,
   3117  1.22   msaitoh 		    spmi->PciDevice, spmi->PciFunction);
   3118  1.22   msaitoh 
   3119  1.22   msaitoh 	printf(END_COMMENT);
   3120  1.22   msaitoh }
   3121  1.22   msaitoh 
   3122  1.22   msaitoh static void
   3123  1.27   msaitoh acpi_print_srat_cpu(uint8_t type, uint32_t apic_id, uint32_t proximity_domain,
   3124  1.27   msaitoh     uint32_t flags, uint32_t clockdomain, uint8_t sapic_eid)
   3125   1.5    cegger {
   3126   1.5    cegger 
   3127   1.5    cegger 	printf("\tFlags={");
   3128   1.5    cegger 	if (flags & ACPI_SRAT_CPU_ENABLED)
   3129   1.5    cegger 		printf("ENABLED");
   3130   1.5    cegger 	else
   3131   1.5    cegger 		printf("DISABLED");
   3132   1.5    cegger 	printf("}\n");
   3133  1.27   msaitoh 	printf("\t%s ID=%d\n",
   3134  1.27   msaitoh 	    (type == ACPI_SRAT_TYPE_GIC_ITS_AFFINITY) ? "ITS" : "APIC",
   3135  1.27   msaitoh 	    apic_id);
   3136  1.27   msaitoh 	if (type == ACPI_SRAT_TYPE_CPU_AFFINITY)
   3137  1.27   msaitoh 		printf("\tSAPIC EID=%d\n", sapic_eid);
   3138   1.5    cegger 	printf("\tProximity Domain=%d\n", proximity_domain);
   3139  1.27   msaitoh 	if (type != ACPI_SRAT_TYPE_GIC_ITS_AFFINITY)
   3140  1.27   msaitoh 		printf("\tClock Domain=%d\n", clockdomain);
   3141   1.5    cegger }
   3142   1.5    cegger 
   3143   1.5    cegger static void
   3144   1.5    cegger acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp)
   3145   1.5    cegger {
   3146   1.5    cegger 
   3147   1.5    cegger 	printf("\tFlags={");
   3148   1.5    cegger 	if (mp->Flags & ACPI_SRAT_MEM_ENABLED)
   3149   1.5    cegger 		printf("ENABLED");
   3150   1.5    cegger 	else
   3151   1.5    cegger 		printf("DISABLED");
   3152   1.5    cegger 	if (mp->Flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)
   3153   1.5    cegger 		printf(",HOT_PLUGGABLE");
   3154   1.5    cegger 	if (mp->Flags & ACPI_SRAT_MEM_NON_VOLATILE)
   3155   1.5    cegger 		printf(",NON_VOLATILE");
   3156   1.5    cegger 	printf("}\n");
   3157   1.5    cegger 	printf("\tBase Address=0x%016jx\n", (uintmax_t)mp->BaseAddress);
   3158   1.5    cegger 	printf("\tLength=0x%016jx\n", (uintmax_t)mp->Length);
   3159   1.5    cegger 	printf("\tProximity Domain=%d\n", mp->ProximityDomain);
   3160   1.1  christos }
   3161   1.1  christos 
   3162  1.16   msaitoh static const char *srat_types[] = {
   3163  1.16   msaitoh     [ACPI_SRAT_TYPE_CPU_AFFINITY] = "CPU",
   3164  1.16   msaitoh     [ACPI_SRAT_TYPE_MEMORY_AFFINITY] = "Memory",
   3165  1.16   msaitoh     [ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY] = "X2APIC",
   3166  1.16   msaitoh     [ACPI_SRAT_TYPE_GICC_AFFINITY] = "GICC",
   3167  1.27   msaitoh     [ACPI_SRAT_TYPE_GIC_ITS_AFFINITY] = "GIC ITS",
   3168  1.16   msaitoh };
   3169   1.5    cegger 
   3170   1.1  christos static void
   3171   1.5    cegger acpi_print_srat(ACPI_SUBTABLE_HEADER *srat)
   3172   1.1  christos {
   3173   1.5    cegger 	ACPI_SRAT_CPU_AFFINITY *cpu;
   3174   1.5    cegger 	ACPI_SRAT_X2APIC_CPU_AFFINITY *x2apic;
   3175  1.27   msaitoh 	ACPI_SRAT_GICC_AFFINITY *gicc;
   3176  1.27   msaitoh 	ACPI_SRAT_GIC_ITS_AFFINITY *gici;
   3177   1.5    cegger 
   3178  1.16   msaitoh 	if (srat->Type < __arraycount(srat_types))
   3179   1.5    cegger 		printf("\tType=%s\n", srat_types[srat->Type]);
   3180   1.5    cegger 	else
   3181   1.5    cegger 		printf("\tType=%d (unknown)\n", srat->Type);
   3182   1.5    cegger 	switch (srat->Type) {
   3183   1.5    cegger 	case ACPI_SRAT_TYPE_CPU_AFFINITY:
   3184   1.5    cegger 		cpu = (ACPI_SRAT_CPU_AFFINITY *)srat;
   3185  1.27   msaitoh 		acpi_print_srat_cpu(srat->Type, cpu->ApicId,
   3186   1.5    cegger 		    cpu->ProximityDomainHi[2] << 24 |
   3187   1.5    cegger 		    cpu->ProximityDomainHi[1] << 16 |
   3188   1.5    cegger 		    cpu->ProximityDomainHi[0] << 0 |
   3189   1.5    cegger 		    cpu->ProximityDomainLo,
   3190  1.27   msaitoh 		    cpu->Flags, cpu->ClockDomain, cpu->LocalSapicEid);
   3191   1.5    cegger 		break;
   3192   1.5    cegger 	case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   3193   1.5    cegger 		acpi_print_srat_memory((ACPI_SRAT_MEM_AFFINITY *)srat);
   3194   1.5    cegger 		break;
   3195   1.5    cegger 	case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   3196   1.5    cegger 		x2apic = (ACPI_SRAT_X2APIC_CPU_AFFINITY *)srat;
   3197  1.27   msaitoh 		acpi_print_srat_cpu(srat->Type, x2apic->ApicId,
   3198  1.27   msaitoh 		    x2apic->ProximityDomain,
   3199  1.27   msaitoh 		    x2apic->Flags, x2apic->ClockDomain, 0 /* dummy */);
   3200   1.5    cegger 		break;
   3201  1.16   msaitoh 	case ACPI_SRAT_TYPE_GICC_AFFINITY:
   3202  1.27   msaitoh 		gicc = (ACPI_SRAT_GICC_AFFINITY *)srat;
   3203  1.27   msaitoh 		acpi_print_srat_cpu(srat->Type, gicc->AcpiProcessorUid,
   3204  1.27   msaitoh 		    gicc->ProximityDomain,
   3205  1.27   msaitoh 		    gicc->Flags, gicc->ClockDomain, 0 /* dummy */);
   3206  1.27   msaitoh 		break;
   3207  1.27   msaitoh 	case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
   3208  1.27   msaitoh 		gici = (ACPI_SRAT_GIC_ITS_AFFINITY *)srat;
   3209  1.27   msaitoh 		acpi_print_srat_cpu(srat->Type, gici->ItsId,
   3210  1.27   msaitoh 		    gici->ProximityDomain,
   3211  1.27   msaitoh 		    0 /* dummy */, 0 /* dummy */, 0 /* dummy */);
   3212  1.16   msaitoh 		break;
   3213   1.5    cegger 	}
   3214   1.5    cegger }
   3215   1.1  christos 
   3216   1.5    cegger static void
   3217   1.5    cegger acpi_handle_srat(ACPI_TABLE_HEADER *sdp)
   3218   1.5    cegger {
   3219   1.5    cegger 	ACPI_TABLE_SRAT *srat;
   3220   1.1  christos 
   3221   1.5    cegger 	printf(BEGIN_COMMENT);
   3222   1.5    cegger 	acpi_print_sdt(sdp);
   3223   1.5    cegger 	srat = (ACPI_TABLE_SRAT *)sdp;
   3224   1.5    cegger 	printf("\tTable Revision=%d\n", srat->TableRevision);
   3225   1.5    cegger 	acpi_walk_subtables(sdp, (srat + 1), acpi_print_srat);
   3226   1.5    cegger 	printf(END_COMMENT);
   3227   1.1  christos }
   3228   1.1  christos 
   3229  1.19   msaitoh static const char *nfit_types[] = {
   3230  1.19   msaitoh     [ACPI_NFIT_TYPE_SYSTEM_ADDRESS] = "System Address",
   3231  1.19   msaitoh     [ACPI_NFIT_TYPE_MEMORY_MAP] = "Memory Map",
   3232  1.19   msaitoh     [ACPI_NFIT_TYPE_INTERLEAVE] = "Interleave",
   3233  1.19   msaitoh     [ACPI_NFIT_TYPE_SMBIOS] = "SMBIOS",
   3234  1.19   msaitoh     [ACPI_NFIT_TYPE_CONTROL_REGION] = "Control Region",
   3235  1.19   msaitoh     [ACPI_NFIT_TYPE_DATA_REGION] = "Data Region",
   3236  1.19   msaitoh     [ACPI_NFIT_TYPE_FLUSH_ADDRESS] = "Flush Address"
   3237  1.19   msaitoh };
   3238  1.19   msaitoh 
   3239  1.19   msaitoh 
   3240  1.19   msaitoh static void
   3241  1.19   msaitoh acpi_print_nfit(ACPI_NFIT_HEADER *nfit)
   3242  1.19   msaitoh {
   3243  1.19   msaitoh 	char *uuidstr;
   3244  1.19   msaitoh 	uint32_t status;
   3245  1.19   msaitoh 
   3246  1.19   msaitoh 	ACPI_NFIT_SYSTEM_ADDRESS *sysaddr;
   3247  1.19   msaitoh 	ACPI_NFIT_MEMORY_MAP *mmap;
   3248  1.19   msaitoh 	ACPI_NFIT_INTERLEAVE *ileave;
   3249  1.19   msaitoh 	ACPI_NFIT_SMBIOS *smbios __unused;
   3250  1.19   msaitoh 	ACPI_NFIT_CONTROL_REGION *ctlreg;
   3251  1.19   msaitoh 	ACPI_NFIT_DATA_REGION *datareg;
   3252  1.19   msaitoh 	ACPI_NFIT_FLUSH_ADDRESS *fladdr;
   3253  1.19   msaitoh 
   3254  1.19   msaitoh 	if (nfit->Type < __arraycount(nfit_types))
   3255  1.19   msaitoh 		printf("\tType=%s\n", nfit_types[nfit->Type]);
   3256  1.19   msaitoh 	else
   3257  1.19   msaitoh 		printf("\tType=%u (unknown)\n", nfit->Type);
   3258  1.19   msaitoh 	switch (nfit->Type) {
   3259  1.19   msaitoh 	case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
   3260  1.19   msaitoh 		sysaddr = (ACPI_NFIT_SYSTEM_ADDRESS *)nfit;
   3261  1.19   msaitoh 		printf("\tRangeIndex=%u\n", (u_int)sysaddr->RangeIndex);
   3262  1.19   msaitoh 		printf("\tProximityDomain=%u\n",
   3263  1.19   msaitoh 		    (u_int)sysaddr->ProximityDomain);
   3264  1.19   msaitoh 		uuid_to_string((uuid_t *)(sysaddr->RangeGuid),
   3265  1.19   msaitoh 		    &uuidstr, &status);
   3266  1.19   msaitoh 		if (status != uuid_s_ok)
   3267  1.19   msaitoh 			errx(1, "uuid_to_string: status=%u", status);
   3268  1.19   msaitoh 		printf("\tRangeGuid=%s\n", uuidstr);
   3269  1.19   msaitoh 		free(uuidstr);
   3270  1.19   msaitoh 		printf("\tAddress=0x%016jx\n", (uintmax_t)sysaddr->Address);
   3271  1.19   msaitoh 		printf("\tLength=0x%016jx\n", (uintmax_t)sysaddr->Length);
   3272  1.19   msaitoh 		printf("\tMemoryMapping=0x%016jx\n",
   3273  1.19   msaitoh 		    (uintmax_t)sysaddr->MemoryMapping);
   3274  1.19   msaitoh 
   3275  1.19   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_NFIT_## flag, #flag)
   3276  1.19   msaitoh 
   3277  1.19   msaitoh 		printf("\tFlags=");
   3278  1.19   msaitoh 		PRINTFLAG(sysaddr->Flags, ADD_ONLINE_ONLY);
   3279  1.19   msaitoh 		PRINTFLAG(sysaddr->Flags, PROXIMITY_VALID);
   3280  1.19   msaitoh 		PRINTFLAG_END();
   3281  1.19   msaitoh 
   3282  1.19   msaitoh #undef PRINTFLAG
   3283  1.19   msaitoh 
   3284  1.19   msaitoh 		break;
   3285  1.19   msaitoh 	case ACPI_NFIT_TYPE_MEMORY_MAP:
   3286  1.19   msaitoh 		mmap = (ACPI_NFIT_MEMORY_MAP *)nfit;
   3287  1.19   msaitoh 		printf("\tDeviceHandle=%u\n", (u_int)mmap->DeviceHandle);
   3288  1.19   msaitoh 		printf("\tPhysicalId=%u\n", (u_int)mmap->PhysicalId);
   3289  1.19   msaitoh 		printf("\tRegionId=%u\n", (u_int)mmap->RegionId);
   3290  1.19   msaitoh 		printf("\tRangeIndex=%u\n", (u_int)mmap->RangeIndex);
   3291  1.19   msaitoh 		printf("\tRegionIndex=%u\n", (u_int)mmap->RegionIndex);
   3292  1.19   msaitoh 		printf("\tRegionSize=0x%016jx\n", (uintmax_t)mmap->RegionSize);
   3293  1.19   msaitoh 		printf("\tRegionOffset=0x%016jx\n",
   3294  1.19   msaitoh 		    (uintmax_t)mmap->RegionOffset);
   3295  1.19   msaitoh 		printf("\tAddress=0x%016jx\n", (uintmax_t)mmap->Address);
   3296  1.19   msaitoh 		printf("\tInterleaveIndex=%u\n", (u_int)mmap->InterleaveIndex);
   3297  1.19   msaitoh 		printf("\tInterleaveWays=%u\n", (u_int)mmap->InterleaveWays);
   3298  1.19   msaitoh 
   3299  1.19   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_NFIT_MEM_## flag, #flag)
   3300  1.19   msaitoh 
   3301  1.19   msaitoh 		printf("\tFlags=");
   3302  1.19   msaitoh 		PRINTFLAG(mmap->Flags, SAVE_FAILED);
   3303  1.19   msaitoh 		PRINTFLAG(mmap->Flags, RESTORE_FAILED);
   3304  1.19   msaitoh 		PRINTFLAG(mmap->Flags, FLUSH_FAILED);
   3305  1.19   msaitoh 		PRINTFLAG(mmap->Flags, NOT_ARMED);
   3306  1.19   msaitoh 		PRINTFLAG(mmap->Flags, HEALTH_OBSERVED);
   3307  1.19   msaitoh 		PRINTFLAG(mmap->Flags, HEALTH_ENABLED);
   3308  1.19   msaitoh 		PRINTFLAG(mmap->Flags, MAP_FAILED);
   3309  1.19   msaitoh 		PRINTFLAG_END();
   3310  1.19   msaitoh 
   3311  1.19   msaitoh #undef PRINTFLAG
   3312  1.19   msaitoh 
   3313  1.19   msaitoh 		break;
   3314  1.19   msaitoh 	case ACPI_NFIT_TYPE_INTERLEAVE:
   3315  1.19   msaitoh 		ileave = (ACPI_NFIT_INTERLEAVE *)nfit;
   3316  1.19   msaitoh 		printf("\tInterleaveIndex=%u\n",
   3317  1.19   msaitoh 		    (u_int)ileave->InterleaveIndex);
   3318  1.19   msaitoh 		printf("\tLineCount=%u\n", (u_int)ileave->LineCount);
   3319  1.19   msaitoh 		printf("\tLineSize=%u\n", (u_int)ileave->LineSize);
   3320  1.19   msaitoh 		/* XXX ileave->LineOffset[i] output is not supported */
   3321  1.19   msaitoh 		break;
   3322  1.19   msaitoh 	case ACPI_NFIT_TYPE_SMBIOS:
   3323  1.19   msaitoh 		smbios = (ACPI_NFIT_SMBIOS *)nfit;
   3324  1.19   msaitoh 		/* XXX smbios->Data[x] output is not supported */
   3325  1.19   msaitoh 		break;
   3326  1.19   msaitoh 	case ACPI_NFIT_TYPE_CONTROL_REGION:
   3327  1.19   msaitoh 		ctlreg = (ACPI_NFIT_CONTROL_REGION *)nfit;
   3328  1.19   msaitoh 		printf("\tRegionIndex=%u\n", (u_int)ctlreg->RegionIndex);
   3329  1.19   msaitoh 		printf("\tVendorId=0x%04x\n", (u_int)ctlreg->VendorId);
   3330  1.19   msaitoh 		printf("\tDeviceId=0x%04x\n", (u_int)ctlreg->DeviceId);
   3331  1.19   msaitoh 		printf("\tRevisionId=%u\n", (u_int)ctlreg->RevisionId);
   3332  1.19   msaitoh 		printf("\tSubsystemVendorId=0x%04x\n",
   3333  1.19   msaitoh 		    (u_int)ctlreg->SubsystemVendorId);
   3334  1.19   msaitoh 		printf("\tSubsystemDeviceId=0x%04x\n",
   3335  1.19   msaitoh 		    (u_int)ctlreg->SubsystemDeviceId);
   3336  1.19   msaitoh 		printf("\tSubsystemRevisionId=%u\n",
   3337  1.19   msaitoh 		    (u_int)ctlreg->SubsystemRevisionId);
   3338  1.20   msaitoh 		printf("\tValidFields=%02x\n", (u_int)ctlreg->ValidFields);
   3339  1.19   msaitoh 		printf("\tManufacturingLocation=%u\n",
   3340  1.19   msaitoh 		    (u_int)ctlreg->ManufacturingLocation);
   3341  1.19   msaitoh 		printf("\tManufacturingDate=%u\n",
   3342  1.19   msaitoh 		    (u_int)ctlreg->ManufacturingDate);
   3343  1.19   msaitoh 		printf("\tSerialNumber=%u\n",
   3344  1.19   msaitoh 		    (u_int)ctlreg->SerialNumber);
   3345  1.19   msaitoh 		printf("\tCode=0x%04x\n", (u_int)ctlreg->Code);
   3346  1.19   msaitoh 		printf("\tWindows=%u\n", (u_int)ctlreg->Windows);
   3347  1.19   msaitoh 		printf("\tWindowSize=0x%016jx\n",
   3348  1.19   msaitoh 		    (uintmax_t)ctlreg->WindowSize);
   3349  1.19   msaitoh 		printf("\tCommandOffset=0x%016jx\n",
   3350  1.19   msaitoh 		    (uintmax_t)ctlreg->CommandOffset);
   3351  1.19   msaitoh 		printf("\tCommandSize=0x%016jx\n",
   3352  1.19   msaitoh 		    (uintmax_t)ctlreg->CommandSize);
   3353  1.19   msaitoh 		printf("\tStatusOffset=0x%016jx\n",
   3354  1.19   msaitoh 		    (uintmax_t)ctlreg->StatusOffset);
   3355  1.19   msaitoh 		printf("\tStatusSize=0x%016jx\n",
   3356  1.19   msaitoh 		    (uintmax_t)ctlreg->StatusSize);
   3357  1.19   msaitoh 
   3358  1.19   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_NFIT_## flag, #flag)
   3359  1.19   msaitoh 
   3360  1.19   msaitoh 		printf("\tFlags=");
   3361  1.20   msaitoh 		PRINTFLAG(ctlreg->Flags, CONTROL_BUFFERED);
   3362  1.19   msaitoh 		PRINTFLAG_END();
   3363  1.19   msaitoh 
   3364  1.19   msaitoh #undef PRINTFLAG
   3365  1.19   msaitoh 
   3366  1.19   msaitoh 		break;
   3367  1.19   msaitoh 	case ACPI_NFIT_TYPE_DATA_REGION:
   3368  1.19   msaitoh 		datareg = (ACPI_NFIT_DATA_REGION *)nfit;
   3369  1.19   msaitoh 		printf("\tRegionIndex=%u\n", (u_int)datareg->RegionIndex);
   3370  1.19   msaitoh 		printf("\tWindows=%u\n", (u_int)datareg->Windows);
   3371  1.19   msaitoh 		printf("\tOffset=0x%016jx\n", (uintmax_t)datareg->Offset);
   3372  1.19   msaitoh 		printf("\tSize=0x%016jx\n", (uintmax_t)datareg->Size);
   3373  1.19   msaitoh 		printf("\tCapacity=0x%016jx\n", (uintmax_t)datareg->Capacity);
   3374  1.19   msaitoh 		printf("\tStartAddress=0x%016jx\n",
   3375  1.19   msaitoh 		    (uintmax_t)datareg->StartAddress);
   3376  1.19   msaitoh 		break;
   3377  1.19   msaitoh 	case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
   3378  1.19   msaitoh 		fladdr = (ACPI_NFIT_FLUSH_ADDRESS *)nfit;
   3379  1.19   msaitoh 		printf("\tDeviceHandle=%u\n", (u_int)fladdr->DeviceHandle);
   3380  1.19   msaitoh 		printf("\tHintCount=%u\n", (u_int)fladdr->HintCount);
   3381  1.19   msaitoh 		/* XXX fladdr->HintAddress[i] output is not supported */
   3382  1.19   msaitoh 		break;
   3383  1.19   msaitoh 	}
   3384  1.19   msaitoh }
   3385  1.19   msaitoh 
   3386  1.19   msaitoh static void
   3387  1.19   msaitoh acpi_handle_nfit(ACPI_TABLE_HEADER *sdp)
   3388  1.19   msaitoh {
   3389  1.19   msaitoh 	ACPI_TABLE_NFIT *nfit;
   3390  1.19   msaitoh 
   3391  1.19   msaitoh 	printf(BEGIN_COMMENT);
   3392  1.19   msaitoh 	acpi_print_sdt(sdp);
   3393  1.19   msaitoh 	nfit = (ACPI_TABLE_NFIT *)sdp;
   3394  1.19   msaitoh 	acpi_walk_nfit(sdp, (nfit + 1), acpi_print_nfit);
   3395  1.19   msaitoh 	printf(END_COMMENT);
   3396  1.19   msaitoh }
   3397  1.19   msaitoh 
   3398  1.16   msaitoh static char *
   3399  1.16   msaitoh acpi_tcpa_evname(struct TCPAevent *event)
   3400  1.16   msaitoh {
   3401  1.16   msaitoh 	struct TCPApc_event *pc_event;
   3402  1.16   msaitoh 	char *eventname = NULL;
   3403  1.16   msaitoh 
   3404  1.16   msaitoh 	pc_event = (struct TCPApc_event *)(event + 1);
   3405  1.16   msaitoh 
   3406  1.27   msaitoh 	switch (event->event_type) {
   3407  1.16   msaitoh 	case PREBOOT:
   3408  1.16   msaitoh 	case POST_CODE:
   3409  1.16   msaitoh 	case UNUSED:
   3410  1.16   msaitoh 	case NO_ACTION:
   3411  1.16   msaitoh 	case SEPARATOR:
   3412  1.16   msaitoh 	case SCRTM_CONTENTS:
   3413  1.16   msaitoh 	case SCRTM_VERSION:
   3414  1.16   msaitoh 	case CPU_MICROCODE:
   3415  1.16   msaitoh 	case PLATFORM_CONFIG_FLAGS:
   3416  1.16   msaitoh 	case TABLE_OF_DEVICES:
   3417  1.16   msaitoh 	case COMPACT_HASH:
   3418  1.16   msaitoh 	case IPL:
   3419  1.16   msaitoh 	case IPL_PARTITION_DATA:
   3420  1.16   msaitoh 	case NONHOST_CODE:
   3421  1.16   msaitoh 	case NONHOST_CONFIG:
   3422  1.16   msaitoh 	case NONHOST_INFO:
   3423  1.16   msaitoh 		asprintf(&eventname, "%s",
   3424  1.16   msaitoh 		    tcpa_event_type_strings[event->event_type]);
   3425  1.16   msaitoh 		break;
   3426  1.16   msaitoh 
   3427  1.16   msaitoh 	case ACTION:
   3428  1.16   msaitoh 		eventname = calloc(event->event_size + 1, sizeof(char));
   3429  1.16   msaitoh 		memcpy(eventname, pc_event, event->event_size);
   3430  1.16   msaitoh 		break;
   3431  1.16   msaitoh 
   3432  1.16   msaitoh 	case EVENT_TAG:
   3433  1.16   msaitoh 		switch (pc_event->event_id) {
   3434  1.16   msaitoh 		case SMBIOS:
   3435  1.16   msaitoh 		case BIS_CERT:
   3436  1.16   msaitoh 		case CMOS:
   3437  1.16   msaitoh 		case NVRAM:
   3438  1.16   msaitoh 		case OPTION_ROM_EXEC:
   3439  1.16   msaitoh 		case OPTION_ROM_CONFIG:
   3440  1.16   msaitoh 		case S_CRTM_VERSION:
   3441  1.16   msaitoh 		case POST_BIOS_ROM:
   3442  1.16   msaitoh 		case ESCD:
   3443  1.16   msaitoh 		case OPTION_ROM_MICROCODE:
   3444  1.16   msaitoh 		case S_CRTM_CONTENTS:
   3445  1.16   msaitoh 		case POST_CONTENTS:
   3446  1.16   msaitoh 			asprintf(&eventname, "%s",
   3447  1.16   msaitoh 			    TCPA_pcclient_strings[pc_event->event_id]);
   3448  1.16   msaitoh 			break;
   3449  1.16   msaitoh 
   3450  1.16   msaitoh 		default:
   3451  1.16   msaitoh 			asprintf(&eventname, "<unknown tag 0x%02x>",
   3452  1.16   msaitoh 			    pc_event->event_id);
   3453  1.16   msaitoh 			break;
   3454  1.16   msaitoh 		}
   3455  1.16   msaitoh 		break;
   3456  1.16   msaitoh 
   3457  1.16   msaitoh 	default:
   3458  1.16   msaitoh 		asprintf(&eventname, "<unknown 0x%02x>", event->event_type);
   3459  1.16   msaitoh 		break;
   3460  1.16   msaitoh 	}
   3461  1.16   msaitoh 
   3462  1.16   msaitoh 	return eventname;
   3463  1.16   msaitoh }
   3464  1.16   msaitoh 
   3465  1.16   msaitoh static void
   3466  1.16   msaitoh acpi_print_tcpa(struct TCPAevent *event)
   3467  1.16   msaitoh {
   3468  1.16   msaitoh 	int i;
   3469  1.16   msaitoh 	char *eventname;
   3470  1.16   msaitoh 
   3471  1.16   msaitoh 	eventname = acpi_tcpa_evname(event);
   3472  1.16   msaitoh 
   3473  1.16   msaitoh 	printf("\t%d", event->pcr_index);
   3474  1.16   msaitoh 	printf(" 0x");
   3475  1.16   msaitoh 	for (i = 0; i < 20; i++)
   3476  1.16   msaitoh 		printf("%02x", event->pcr_value[i]);
   3477  1.16   msaitoh 	printf(" [%s]\n", eventname ? eventname : "<unknown>");
   3478  1.16   msaitoh 
   3479  1.16   msaitoh 	free(eventname);
   3480  1.16   msaitoh }
   3481  1.16   msaitoh 
   3482   1.1  christos static void
   3483   1.5    cegger acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp)
   3484   1.1  christos {
   3485  1.16   msaitoh 	struct TCPAbody *tcpa;
   3486  1.16   msaitoh 	struct TCPAevent *event;
   3487  1.16   msaitoh 	uintmax_t len, paddr;
   3488  1.16   msaitoh 	unsigned char *vaddr = NULL;
   3489  1.16   msaitoh 	unsigned char *vend = NULL;
   3490   1.5    cegger 
   3491   1.5    cegger 	printf(BEGIN_COMMENT);
   3492   1.5    cegger 	acpi_print_sdt(sdp);
   3493  1.16   msaitoh 	tcpa = (struct TCPAbody *) sdp;
   3494  1.16   msaitoh 
   3495  1.16   msaitoh 	switch (tcpa->platform_class) {
   3496  1.16   msaitoh 	case ACPI_TCPA_BIOS_CLIENT:
   3497  1.16   msaitoh 		len = tcpa->client.log_max_len;
   3498  1.16   msaitoh 		paddr = tcpa->client.log_start_addr;
   3499  1.13  christos 		break;
   3500  1.13  christos 
   3501  1.16   msaitoh 	case ACPI_TCPA_BIOS_SERVER:
   3502  1.16   msaitoh 		len = tcpa->server.log_max_len;
   3503  1.16   msaitoh 		paddr = tcpa->server.log_start_addr;
   3504  1.13  christos 		break;
   3505  1.13  christos 
   3506  1.13  christos 	default:
   3507  1.16   msaitoh 		printf("XXX");
   3508  1.16   msaitoh 		printf(END_COMMENT);
   3509  1.16   msaitoh 		return;
   3510  1.16   msaitoh 	}
   3511  1.16   msaitoh 	printf("\tClass %u Base Address 0x%jx Length %ju\n\n",
   3512  1.16   msaitoh 	    tcpa->platform_class, paddr, len);
   3513  1.16   msaitoh 
   3514  1.16   msaitoh 	if (len == 0) {
   3515  1.16   msaitoh 		printf("\tEmpty TCPA table\n");
   3516  1.16   msaitoh 		printf(END_COMMENT);
   3517  1.16   msaitoh 		return;
   3518  1.16   msaitoh 	}
   3519  1.27   msaitoh 	if (sdp->Revision == 1) {
   3520  1.16   msaitoh 		printf("\tOLD TCPA spec log found. Dumping not supported.\n");
   3521  1.16   msaitoh 		printf(END_COMMENT);
   3522  1.16   msaitoh 		return;
   3523  1.16   msaitoh 	}
   3524  1.16   msaitoh 
   3525  1.16   msaitoh 	vaddr = (unsigned char *)acpi_map_physical(paddr, len);
   3526  1.16   msaitoh 	vend = vaddr + len;
   3527  1.16   msaitoh 
   3528  1.16   msaitoh 	while (vaddr != NULL) {
   3529  1.16   msaitoh 		if ((vaddr + sizeof(struct TCPAevent) >= vend)||
   3530  1.16   msaitoh 		    (vaddr + sizeof(struct TCPAevent) < vaddr))
   3531  1.16   msaitoh 			break;
   3532  1.16   msaitoh 		event = (struct TCPAevent *)(void *)vaddr;
   3533  1.16   msaitoh 		if (vaddr + event->event_size >= vend)
   3534  1.16   msaitoh 			break;
   3535  1.16   msaitoh 		if (vaddr + event->event_size < vaddr)
   3536  1.16   msaitoh 			break;
   3537  1.16   msaitoh 		if (event->event_type == 0 && event->event_size == 0)
   3538  1.16   msaitoh 			break;
   3539  1.16   msaitoh #if 0
   3540  1.16   msaitoh 		{
   3541  1.16   msaitoh 		unsigned int i, j, k;
   3542  1.16   msaitoh 
   3543  1.16   msaitoh 		printf("\n\tsize %d\n\t\t%p ", event->event_size, vaddr);
   3544  1.16   msaitoh 		for (j = 0, i = 0; i <
   3545  1.16   msaitoh 		    sizeof(struct TCPAevent) + event->event_size; i++) {
   3546  1.16   msaitoh 			printf("%02x ", vaddr[i]);
   3547  1.16   msaitoh 			if ((i+1) % 8 == 0) {
   3548  1.16   msaitoh 				for (k = 0; k < 8; k++)
   3549  1.16   msaitoh 					printf("%c", isprint(vaddr[j+k]) ?
   3550  1.16   msaitoh 					    vaddr[j+k] : '.');
   3551  1.16   msaitoh 				printf("\n\t\t%p ", &vaddr[i + 1]);
   3552  1.16   msaitoh 				j = i + 1;
   3553  1.16   msaitoh 			}
   3554  1.16   msaitoh 		}
   3555  1.16   msaitoh 		printf("\n"); }
   3556  1.16   msaitoh #endif
   3557  1.16   msaitoh 		acpi_print_tcpa(event);
   3558  1.16   msaitoh 
   3559  1.16   msaitoh 		vaddr += sizeof(struct TCPAevent) + event->event_size;
   3560  1.16   msaitoh 	}
   3561  1.16   msaitoh 
   3562  1.16   msaitoh 	printf(END_COMMENT);
   3563  1.16   msaitoh }
   3564  1.16   msaitoh 
   3565  1.46      maxv static void
   3566  1.46      maxv acpi_handle_tpm2(ACPI_TABLE_HEADER *sdp)
   3567  1.46      maxv {
   3568  1.46      maxv 	ACPI_TABLE_TPM2 *tpm2;
   3569  1.46      maxv 	const char *class;
   3570  1.46      maxv 
   3571  1.46      maxv 	printf(BEGIN_COMMENT);
   3572  1.46      maxv 
   3573  1.46      maxv 	acpi_print_sdt(sdp);
   3574  1.46      maxv 	tpm2 = (ACPI_TABLE_TPM2 *)sdp;
   3575  1.46      maxv 
   3576  1.46      maxv 	if (tpm2->PlatformClass == 0) {
   3577  1.46      maxv 		class = "Client";
   3578  1.46      maxv 	} else if (tpm2->PlatformClass == 1) {
   3579  1.46      maxv 		class = "Server";
   3580  1.46      maxv 	} else {
   3581  1.46      maxv 		class = "Unknown";
   3582  1.46      maxv 	}
   3583  1.46      maxv 	printf("\tClass=%s (%u)\n", class, tpm2->PlatformClass);
   3584  1.46      maxv 	printf("\tControl Address=0x%"PRIx64"\n", tpm2->ControlAddress);
   3585  1.46      maxv 	printf("\tStart Method=%u\n", tpm2->StartMethod);
   3586  1.46      maxv 
   3587  1.46      maxv 	printf(END_COMMENT);
   3588  1.46      maxv }
   3589  1.46      maxv 
   3590  1.16   msaitoh static const char *
   3591  1.16   msaitoh devscope_type2str(int type)
   3592  1.16   msaitoh {
   3593  1.16   msaitoh 	static char typebuf[16];
   3594  1.16   msaitoh 
   3595  1.16   msaitoh 	switch (type) {
   3596  1.16   msaitoh 	case 1:
   3597  1.16   msaitoh 		return ("PCI Endpoint Device");
   3598  1.16   msaitoh 	case 2:
   3599  1.16   msaitoh 		return ("PCI Sub-Hierarchy");
   3600  1.16   msaitoh 	case 3:
   3601  1.16   msaitoh 		return ("IOAPIC");
   3602  1.16   msaitoh 	case 4:
   3603  1.16   msaitoh 		return ("HPET");
   3604  1.31   msaitoh 	case 5:
   3605  1.31   msaitoh 		return ("ACPI Name space");
   3606  1.16   msaitoh 	default:
   3607  1.16   msaitoh 		snprintf(typebuf, sizeof(typebuf), "%d", type);
   3608  1.16   msaitoh 		return (typebuf);
   3609  1.16   msaitoh 	}
   3610  1.16   msaitoh }
   3611  1.16   msaitoh 
   3612  1.16   msaitoh static int
   3613  1.16   msaitoh acpi_handle_dmar_devscope(void *addr, int remaining)
   3614  1.16   msaitoh {
   3615  1.16   msaitoh 	char sep;
   3616  1.16   msaitoh 	int pathlen;
   3617  1.16   msaitoh 	ACPI_DMAR_PCI_PATH *path, *pathend;
   3618  1.16   msaitoh 	ACPI_DMAR_DEVICE_SCOPE *devscope = addr;
   3619  1.16   msaitoh 
   3620  1.16   msaitoh 	if (remaining < (int)sizeof(ACPI_DMAR_DEVICE_SCOPE))
   3621  1.16   msaitoh 		return (-1);
   3622  1.16   msaitoh 
   3623  1.16   msaitoh 	if (remaining < devscope->Length)
   3624  1.16   msaitoh 		return (-1);
   3625  1.16   msaitoh 
   3626  1.16   msaitoh 	printf("\n");
   3627  1.16   msaitoh 	printf("\t\tType=%s\n", devscope_type2str(devscope->EntryType));
   3628  1.16   msaitoh 	printf("\t\tLength=%d\n", devscope->Length);
   3629  1.16   msaitoh 	printf("\t\tEnumerationId=%d\n", devscope->EnumerationId);
   3630  1.16   msaitoh 	printf("\t\tStartBusNumber=%d\n", devscope->Bus);
   3631  1.16   msaitoh 
   3632  1.16   msaitoh 	path = (ACPI_DMAR_PCI_PATH *)(devscope + 1);
   3633  1.16   msaitoh 	pathlen = devscope->Length - sizeof(ACPI_DMAR_DEVICE_SCOPE);
   3634  1.16   msaitoh 	pathend = path + pathlen / sizeof(ACPI_DMAR_PCI_PATH);
   3635  1.16   msaitoh 	if (path < pathend) {
   3636  1.16   msaitoh 		sep = '{';
   3637  1.16   msaitoh 		printf("\t\tPath=");
   3638  1.16   msaitoh 		do {
   3639  1.16   msaitoh 			printf("%c%d:%d", sep, path->Device, path->Function);
   3640  1.16   msaitoh 			sep=',';
   3641  1.16   msaitoh 			path++;
   3642  1.16   msaitoh 		} while (path < pathend);
   3643  1.16   msaitoh 		printf("}\n");
   3644  1.16   msaitoh 	}
   3645  1.16   msaitoh 
   3646  1.16   msaitoh 	return (devscope->Length);
   3647  1.16   msaitoh }
   3648  1.16   msaitoh 
   3649  1.16   msaitoh static void
   3650  1.16   msaitoh acpi_handle_dmar_drhd(ACPI_DMAR_HARDWARE_UNIT *drhd)
   3651  1.16   msaitoh {
   3652  1.16   msaitoh 	char *cp;
   3653  1.16   msaitoh 	int remaining, consumed;
   3654  1.16   msaitoh 
   3655  1.16   msaitoh 	printf("\n");
   3656  1.16   msaitoh 	printf("\tType=DRHD\n");
   3657  1.16   msaitoh 	printf("\tLength=%d\n", drhd->Header.Length);
   3658  1.16   msaitoh 
   3659  1.16   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_DMAR_## flag, #flag)
   3660  1.16   msaitoh 
   3661  1.16   msaitoh 	printf("\tFlags=");
   3662  1.16   msaitoh 	PRINTFLAG(drhd->Flags, INCLUDE_ALL);
   3663  1.16   msaitoh 	PRINTFLAG_END();
   3664  1.16   msaitoh 
   3665  1.16   msaitoh #undef PRINTFLAG
   3666  1.16   msaitoh 
   3667  1.16   msaitoh 	printf("\tSegment=%d\n", drhd->Segment);
   3668  1.16   msaitoh 	printf("\tAddress=0x%016jx\n", (uintmax_t)drhd->Address);
   3669  1.16   msaitoh 
   3670  1.16   msaitoh 	remaining = drhd->Header.Length - sizeof(ACPI_DMAR_HARDWARE_UNIT);
   3671  1.16   msaitoh 	if (remaining > 0)
   3672  1.16   msaitoh 		printf("\tDevice Scope:");
   3673  1.16   msaitoh 	while (remaining > 0) {
   3674  1.16   msaitoh 		cp = (char *)drhd + drhd->Header.Length - remaining;
   3675  1.16   msaitoh 		consumed = acpi_handle_dmar_devscope(cp, remaining);
   3676  1.16   msaitoh 		if (consumed <= 0)
   3677  1.16   msaitoh 			break;
   3678  1.16   msaitoh 		else
   3679  1.16   msaitoh 			remaining -= consumed;
   3680  1.16   msaitoh 	}
   3681  1.16   msaitoh }
   3682  1.16   msaitoh 
   3683  1.16   msaitoh static void
   3684  1.16   msaitoh acpi_handle_dmar_rmrr(ACPI_DMAR_RESERVED_MEMORY *rmrr)
   3685  1.16   msaitoh {
   3686  1.16   msaitoh 	char *cp;
   3687  1.16   msaitoh 	int remaining, consumed;
   3688  1.16   msaitoh 
   3689  1.16   msaitoh 	printf("\n");
   3690  1.16   msaitoh 	printf("\tType=RMRR\n");
   3691  1.16   msaitoh 	printf("\tLength=%d\n", rmrr->Header.Length);
   3692  1.16   msaitoh 	printf("\tSegment=%d\n", rmrr->Segment);
   3693  1.16   msaitoh 	printf("\tBaseAddress=0x%016jx\n", (uintmax_t)rmrr->BaseAddress);
   3694  1.16   msaitoh 	printf("\tLimitAddress=0x%016jx\n", (uintmax_t)rmrr->EndAddress);
   3695  1.16   msaitoh 
   3696  1.16   msaitoh 	remaining = rmrr->Header.Length - sizeof(ACPI_DMAR_RESERVED_MEMORY);
   3697  1.16   msaitoh 	if (remaining > 0)
   3698  1.16   msaitoh 		printf("\tDevice Scope:");
   3699  1.16   msaitoh 	while (remaining > 0) {
   3700  1.16   msaitoh 		cp = (char *)rmrr + rmrr->Header.Length - remaining;
   3701  1.16   msaitoh 		consumed = acpi_handle_dmar_devscope(cp, remaining);
   3702  1.16   msaitoh 		if (consumed <= 0)
   3703  1.16   msaitoh 			break;
   3704  1.16   msaitoh 		else
   3705  1.16   msaitoh 			remaining -= consumed;
   3706  1.16   msaitoh 	}
   3707  1.16   msaitoh }
   3708  1.16   msaitoh 
   3709  1.16   msaitoh static void
   3710  1.16   msaitoh acpi_handle_dmar_atsr(ACPI_DMAR_ATSR *atsr)
   3711  1.16   msaitoh {
   3712  1.16   msaitoh 	char *cp;
   3713  1.16   msaitoh 	int remaining, consumed;
   3714  1.16   msaitoh 
   3715  1.16   msaitoh 	printf("\n");
   3716  1.16   msaitoh 	printf("\tType=ATSR\n");
   3717  1.16   msaitoh 	printf("\tLength=%d\n", atsr->Header.Length);
   3718  1.16   msaitoh 
   3719  1.16   msaitoh #define	PRINTFLAG(var, flag)	printflag((var), ACPI_DMAR_## flag, #flag)
   3720  1.16   msaitoh 
   3721  1.16   msaitoh 	printf("\tFlags=");
   3722  1.16   msaitoh 	PRINTFLAG(atsr->Flags, ALL_PORTS);
   3723  1.16   msaitoh 	PRINTFLAG_END();
   3724  1.16   msaitoh 
   3725  1.16   msaitoh #undef PRINTFLAG
   3726  1.16   msaitoh 
   3727  1.16   msaitoh 	printf("\tSegment=%d\n", atsr->Segment);
   3728  1.16   msaitoh 
   3729  1.16   msaitoh 	remaining = atsr->Header.Length - sizeof(ACPI_DMAR_ATSR);
   3730  1.16   msaitoh 	if (remaining > 0)
   3731  1.16   msaitoh 		printf("\tDevice Scope:");
   3732  1.16   msaitoh 	while (remaining > 0) {
   3733  1.16   msaitoh 		cp = (char *)atsr + atsr->Header.Length - remaining;
   3734  1.16   msaitoh 		consumed = acpi_handle_dmar_devscope(cp, remaining);
   3735  1.16   msaitoh 		if (consumed <= 0)
   3736  1.16   msaitoh 			break;
   3737  1.16   msaitoh 		else
   3738  1.16   msaitoh 			remaining -= consumed;
   3739  1.16   msaitoh 	}
   3740  1.16   msaitoh }
   3741  1.16   msaitoh 
   3742  1.16   msaitoh static void
   3743  1.16   msaitoh acpi_handle_dmar_rhsa(ACPI_DMAR_RHSA *rhsa)
   3744  1.16   msaitoh {
   3745  1.16   msaitoh 
   3746  1.16   msaitoh 	printf("\n");
   3747  1.16   msaitoh 	printf("\tType=RHSA\n");
   3748  1.16   msaitoh 	printf("\tLength=%d\n", rhsa->Header.Length);
   3749  1.16   msaitoh 	printf("\tBaseAddress=0x%016jx\n", (uintmax_t)rhsa->BaseAddress);
   3750  1.16   msaitoh 	printf("\tProximityDomain=0x%08x\n", rhsa->ProximityDomain);
   3751  1.16   msaitoh }
   3752  1.16   msaitoh 
   3753  1.31   msaitoh static void
   3754  1.31   msaitoh acpi_handle_dmar_andd(ACPI_DMAR_ANDD *andd)
   3755  1.31   msaitoh {
   3756  1.31   msaitoh 
   3757  1.31   msaitoh 	printf("\n");
   3758  1.31   msaitoh 	printf("\tType=ANDD\n");
   3759  1.31   msaitoh 	printf("\tLength=%d\n", andd->Header.Length);
   3760  1.31   msaitoh 	printf("\tDeviceNumber=%d\n", andd->DeviceNumber);
   3761  1.31   msaitoh 	printf("\tDeviceName=0x%s\n", andd->DeviceName);
   3762  1.31   msaitoh }
   3763  1.31   msaitoh 
   3764  1.16   msaitoh static int
   3765  1.16   msaitoh acpi_handle_dmar_remapping_structure(void *addr, int remaining)
   3766  1.16   msaitoh {
   3767  1.16   msaitoh 	ACPI_DMAR_HEADER *hdr = addr;
   3768  1.16   msaitoh 
   3769  1.16   msaitoh 	if (remaining < (int)sizeof(ACPI_DMAR_HEADER))
   3770  1.16   msaitoh 		return (-1);
   3771  1.16   msaitoh 
   3772  1.16   msaitoh 	if (remaining < hdr->Length)
   3773  1.16   msaitoh 		return (-1);
   3774  1.16   msaitoh 
   3775  1.16   msaitoh 	switch (hdr->Type) {
   3776  1.16   msaitoh 	case ACPI_DMAR_TYPE_HARDWARE_UNIT:
   3777  1.16   msaitoh 		acpi_handle_dmar_drhd(addr);
   3778  1.16   msaitoh 		break;
   3779  1.16   msaitoh 	case ACPI_DMAR_TYPE_RESERVED_MEMORY:
   3780  1.16   msaitoh 		acpi_handle_dmar_rmrr(addr);
   3781  1.16   msaitoh 		break;
   3782  1.16   msaitoh 	case ACPI_DMAR_TYPE_ROOT_ATS:
   3783  1.16   msaitoh 		acpi_handle_dmar_atsr(addr);
   3784  1.16   msaitoh 		break;
   3785  1.16   msaitoh 	case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
   3786  1.16   msaitoh 		acpi_handle_dmar_rhsa(addr);
   3787  1.16   msaitoh 		break;
   3788  1.31   msaitoh 	case ACPI_DMAR_TYPE_NAMESPACE:
   3789  1.31   msaitoh 		acpi_handle_dmar_andd(addr);
   3790  1.31   msaitoh 		break;
   3791  1.16   msaitoh 	default:
   3792  1.16   msaitoh 		printf("\n");
   3793  1.16   msaitoh 		printf("\tType=%d\n", hdr->Type);
   3794  1.16   msaitoh 		printf("\tLength=%d\n", hdr->Length);
   3795  1.13  christos 		break;
   3796  1.13  christos 	}
   3797  1.16   msaitoh 	return (hdr->Length);
   3798  1.16   msaitoh }
   3799  1.16   msaitoh 
   3800  1.16   msaitoh #ifndef ACPI_DMAR_X2APIC_OPT_OUT
   3801  1.16   msaitoh #define	ACPI_DMAR_X2APIC_OPT_OUT	(0x2)
   3802  1.16   msaitoh #endif
   3803  1.16   msaitoh 
   3804  1.16   msaitoh static void
   3805  1.16   msaitoh acpi_handle_dmar(ACPI_TABLE_HEADER *sdp)
   3806  1.16   msaitoh {
   3807  1.16   msaitoh 	char *cp;
   3808  1.16   msaitoh 	int remaining, consumed;
   3809  1.16   msaitoh 	ACPI_TABLE_DMAR *dmar;
   3810  1.16   msaitoh 
   3811  1.16   msaitoh 	printf(BEGIN_COMMENT);
   3812  1.16   msaitoh 	acpi_print_sdt(sdp);
   3813  1.16   msaitoh 	dmar = (ACPI_TABLE_DMAR *)sdp;
   3814  1.16   msaitoh 	printf("\tHost Address Width=%d\n", dmar->Width + 1);
   3815  1.16   msaitoh 
   3816  1.16   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_DMAR_## flag, #flag)
   3817  1.16   msaitoh 
   3818  1.16   msaitoh 	printf("\tFlags=");
   3819  1.16   msaitoh 	PRINTFLAG(dmar->Flags, INTR_REMAP);
   3820  1.16   msaitoh 	PRINTFLAG(dmar->Flags, X2APIC_OPT_OUT);
   3821  1.31   msaitoh 	PRINTFLAG(dmar->Flags, X2APIC_MODE);
   3822  1.16   msaitoh 	PRINTFLAG_END();
   3823  1.16   msaitoh 
   3824  1.16   msaitoh #undef PRINTFLAG
   3825  1.16   msaitoh 
   3826  1.16   msaitoh 	remaining = sdp->Length - sizeof(ACPI_TABLE_DMAR);
   3827  1.16   msaitoh 	while (remaining > 0) {
   3828  1.16   msaitoh 		cp = (char *)sdp + sdp->Length - remaining;
   3829  1.16   msaitoh 		consumed = acpi_handle_dmar_remapping_structure(cp, remaining);
   3830  1.16   msaitoh 		if (consumed <= 0)
   3831  1.16   msaitoh 			break;
   3832  1.16   msaitoh 		else
   3833  1.16   msaitoh 			remaining -= consumed;
   3834  1.16   msaitoh 	}
   3835   1.1  christos 
   3836  1.12  christos 	printf(END_COMMENT);
   3837   1.1  christos }
   3838   1.1  christos 
   3839   1.1  christos static void
   3840  1.22   msaitoh acpi_handle_uefi(ACPI_TABLE_HEADER *sdp)
   3841  1.22   msaitoh {
   3842  1.22   msaitoh 	ACPI_TABLE_UEFI *uefi;
   3843  1.22   msaitoh 	char *uuidstr;
   3844  1.22   msaitoh 	uint32_t status;
   3845  1.22   msaitoh 
   3846  1.22   msaitoh 	printf(BEGIN_COMMENT);
   3847  1.22   msaitoh 	acpi_print_sdt(sdp);
   3848  1.22   msaitoh 	uefi = (ACPI_TABLE_UEFI *)sdp;
   3849  1.22   msaitoh 
   3850  1.22   msaitoh 	uuid_to_string((uuid_t *)(uefi->Identifier),
   3851  1.22   msaitoh 	    &uuidstr, &status);
   3852  1.22   msaitoh 	if (status != uuid_s_ok)
   3853  1.22   msaitoh 		errx(1, "uuid_to_string: status=%u", status);
   3854  1.22   msaitoh 	printf("\tUUID=%s\n", uuidstr);
   3855  1.22   msaitoh 	free(uuidstr);
   3856  1.22   msaitoh 
   3857  1.22   msaitoh 	printf("\tDataOffset=%04hx\n", uefi->DataOffset);
   3858  1.22   msaitoh 	/* XXX need write */
   3859  1.22   msaitoh 
   3860  1.22   msaitoh 	printf(END_COMMENT);
   3861  1.22   msaitoh }
   3862  1.22   msaitoh 
   3863  1.22   msaitoh static void
   3864   1.5    cegger acpi_handle_waet(ACPI_TABLE_HEADER *sdp)
   3865   1.1  christos {
   3866   1.5    cegger 	ACPI_TABLE_WAET *waet;
   3867   1.5    cegger 
   3868   1.5    cegger 	printf(BEGIN_COMMENT);
   3869   1.5    cegger 	acpi_print_sdt(sdp);
   3870   1.5    cegger 	waet = (ACPI_TABLE_WAET *)sdp;
   3871   1.1  christos 
   3872   1.5    cegger 	printf("\tRTC Timer={");
   3873   1.5    cegger 	if (waet->Flags & ACPI_WAET_RTC_NO_ACK)
   3874   1.5    cegger 		printf("No ACK required");
   3875   1.5    cegger 	else
   3876   1.5    cegger 		printf("default behaviour");
   3877   1.5    cegger 	printf("}\n");
   3878   1.5    cegger 	printf("\t ACPI PM Timer={");
   3879   1.5    cegger 	if (waet->Flags & ACPI_WAET_TIMER_ONE_READ)
   3880   1.5    cegger 		printf("One Read sufficient");
   3881   1.5    cegger 	else
   3882   1.5    cegger 		printf("default behaviour");
   3883   1.5    cegger 	printf("}\n");
   3884   1.3     joerg 
   3885   1.5    cegger 	printf(END_COMMENT);
   3886   1.1  christos }
   3887   1.1  christos 
   3888   1.5    cegger static void
   3889   1.5    cegger acpi_print_wdat_action(ACPI_WHEA_HEADER *whea)
   3890   1.5    cegger {
   3891   1.5    cegger 	printf("\tACTION={");
   3892   1.5    cegger 	switch (whea->Action) {
   3893   1.5    cegger 	case ACPI_WDAT_RESET:
   3894   1.5    cegger 		printf("RESET");
   3895   1.5    cegger 		break;
   3896   1.5    cegger 	case ACPI_WDAT_GET_CURRENT_COUNTDOWN:
   3897   1.5    cegger 		printf("GET_CURRENT_COUNTDOWN");
   3898   1.5    cegger 		break;
   3899   1.5    cegger 	case ACPI_WDAT_GET_COUNTDOWN:
   3900   1.5    cegger 		printf("GET_COUNTDOWN");
   3901   1.5    cegger 		break;
   3902   1.5    cegger 	case ACPI_WDAT_SET_COUNTDOWN:
   3903   1.5    cegger 		printf("SET_COUNTDOWN");
   3904   1.5    cegger 		break;
   3905   1.5    cegger 	case ACPI_WDAT_GET_RUNNING_STATE:
   3906   1.5    cegger 		printf("GET_RUNNING_STATE");
   3907   1.5    cegger 		break;
   3908   1.5    cegger 	case ACPI_WDAT_SET_RUNNING_STATE:
   3909   1.5    cegger 		printf("SET_RUNNING_STATE");
   3910   1.5    cegger 		break;
   3911   1.5    cegger 	case ACPI_WDAT_GET_STOPPED_STATE:
   3912   1.5    cegger 		printf("GET_STOPPED_STATE");
   3913   1.5    cegger 		break;
   3914   1.5    cegger 	case ACPI_WDAT_SET_STOPPED_STATE:
   3915   1.5    cegger 		printf("SET_STOPPED_STATE");
   3916   1.5    cegger 		break;
   3917   1.5    cegger 	case ACPI_WDAT_GET_REBOOT:
   3918   1.5    cegger 		printf("GET_REBOOT");
   3919   1.5    cegger 		break;
   3920   1.5    cegger 	case ACPI_WDAT_SET_REBOOT:
   3921   1.5    cegger 		printf("SET_REBOOT");
   3922   1.5    cegger 		break;
   3923   1.5    cegger 	case ACPI_WDAT_GET_SHUTDOWN:
   3924   1.5    cegger 		printf("GET_SHUTDOWN");
   3925   1.5    cegger 		break;
   3926   1.5    cegger 	case ACPI_WDAT_SET_SHUTDOWN:
   3927   1.5    cegger 		printf("SET_SHUTDOWN");
   3928   1.5    cegger 		break;
   3929   1.5    cegger 	case ACPI_WDAT_GET_STATUS:
   3930   1.5    cegger 		printf("GET_STATUS");
   3931   1.5    cegger 		break;
   3932   1.5    cegger 	case ACPI_WDAT_SET_STATUS:
   3933   1.5    cegger 		printf("SET_STATUS");
   3934   1.5    cegger 		break;
   3935   1.5    cegger 	case ACPI_WDAT_ACTION_RESERVED:
   3936   1.5    cegger 		printf("ACTION_RESERVED");
   3937   1.5    cegger 		break;
   3938   1.5    cegger 	default:
   3939   1.5    cegger 		printf("%d", whea->Action);
   3940   1.5    cegger 		break;
   3941   1.5    cegger 	}
   3942   1.5    cegger 	printf("}\n");
   3943   1.5    cegger }
   3944   1.1  christos 
   3945   1.5    cegger static void
   3946   1.5    cegger acpi_print_wdat_instruction(ACPI_WHEA_HEADER *whea)
   3947   1.1  christos {
   3948   1.5    cegger 	uint32_t ins;
   3949   1.5    cegger 
   3950   1.5    cegger 	ins = whea->Instruction & ~ACPI_WDAT_PRESERVE_REGISTER;
   3951   1.5    cegger 
   3952   1.5    cegger 	printf("\tINSTRUCTION={");
   3953   1.5    cegger 	switch (ins) {
   3954   1.5    cegger 	case ACPI_WDAT_READ_VALUE:
   3955   1.5    cegger 		printf("READ_VALUE");
   3956   1.5    cegger 		break;
   3957   1.5    cegger 	case ACPI_WDAT_READ_COUNTDOWN:
   3958   1.5    cegger 		printf("READ_COUNTDOWN");
   3959   1.5    cegger 		break;
   3960   1.5    cegger 	case ACPI_WDAT_WRITE_VALUE:
   3961   1.5    cegger 		printf("WRITE_VALUE");
   3962   1.5    cegger 		break;
   3963   1.5    cegger 	case ACPI_WDAT_WRITE_COUNTDOWN:
   3964   1.5    cegger 		printf("WRITE_COUNTDOWN");
   3965   1.5    cegger 		break;
   3966   1.5    cegger 	case ACPI_WDAT_INSTRUCTION_RESERVED:
   3967   1.5    cegger 		printf("INSTRUCTION_RESERVED");
   3968   1.5    cegger 		break;
   3969   1.5    cegger 	default:
   3970   1.5    cegger 		printf("%d", ins);
   3971   1.5    cegger 		break;
   3972   1.5    cegger 	}
   3973   1.5    cegger 
   3974   1.5    cegger 	if (whea->Instruction & ACPI_WDAT_PRESERVE_REGISTER)
   3975  1.25   msaitoh 		printf(", Preserve Register");
   3976   1.5    cegger 
   3977   1.5    cegger 	printf("}\n");
   3978   1.5    cegger }
   3979   1.1  christos 
   3980   1.5    cegger static void
   3981   1.5    cegger acpi_handle_wdat(ACPI_TABLE_HEADER *sdp)
   3982   1.5    cegger {
   3983   1.5    cegger 	ACPI_TABLE_WDAT *wdat;
   3984   1.5    cegger 	ACPI_WHEA_HEADER *whea;
   3985  1.23   msaitoh 	ACPI_WDAT_ENTRY *wdat_pos;
   3986   1.5    cegger 	u_int i;
   3987   1.1  christos 
   3988   1.5    cegger 	printf(BEGIN_COMMENT);
   3989   1.5    cegger 	acpi_print_sdt(sdp);
   3990   1.5    cegger 	wdat = (ACPI_TABLE_WDAT *)sdp;
   3991   1.1  christos 
   3992   1.5    cegger 	printf("\tHeader Length=%d\n", wdat->HeaderLength);
   3993   1.1  christos 
   3994  1.22   msaitoh 	acpi_print_pci_sbdf(wdat->PciSegment, wdat->PciBus, wdat->PciDevice,
   3995   1.5    cegger 	    wdat->PciFunction);
   3996   1.5    cegger 	printf("\n\tTimer Counter Period=%d msec\n", wdat->TimerPeriod);
   3997   1.5    cegger 	printf("\tTimer Maximum Counter Value=%d\n", wdat->MaxCount);
   3998  1.27   msaitoh 	printf("\tTimer Minimum Counter Value=%d\n", wdat->MinCount);
   3999   1.5    cegger 
   4000   1.5    cegger 	printf("\tFlags={");
   4001   1.5    cegger 	if (wdat->Flags & ACPI_WDAT_ENABLED)
   4002   1.5    cegger 		printf("ENABLED");
   4003   1.5    cegger 	if (wdat->Flags & ACPI_WDAT_STOPPED)
   4004   1.5    cegger 		printf(", STOPPED");
   4005   1.5    cegger 	printf("}\n");
   4006   1.1  christos 
   4007  1.23   msaitoh 	wdat_pos = (ACPI_WDAT_ENTRY *)((char *)wdat + sizeof(ACPI_TABLE_WDAT));
   4008   1.1  christos 
   4009   1.5    cegger 	for (i = 0; i < wdat->Entries; i++) {
   4010   1.5    cegger 		whea = (ACPI_WHEA_HEADER *)wdat_pos;
   4011   1.5    cegger 		acpi_print_whea(whea,
   4012   1.5    cegger 		    acpi_print_wdat_action, acpi_print_wdat_instruction,
   4013   1.5    cegger 		    NULL);
   4014  1.23   msaitoh 		wdat_pos++;
   4015   1.5    cegger 	}
   4016   1.5    cegger 	printf(END_COMMENT);
   4017   1.1  christos }
   4018   1.5    cegger 
   4019   1.5    cegger static void
   4020  1.22   msaitoh acpi_handle_wddt(ACPI_TABLE_HEADER *sdp)
   4021  1.22   msaitoh {
   4022  1.22   msaitoh 	ACPI_TABLE_WDDT *wddt;
   4023  1.22   msaitoh 
   4024  1.22   msaitoh 	printf(BEGIN_COMMENT);
   4025  1.22   msaitoh 	acpi_print_sdt(sdp);
   4026  1.22   msaitoh 	wddt = (ACPI_TABLE_WDDT *)sdp;
   4027  1.22   msaitoh 
   4028  1.22   msaitoh 	printf("\tSpecVersion=%04hx\n", wddt->SpecVersion);
   4029  1.22   msaitoh 	printf("\tTableVersion=%04hx\n", wddt->TableVersion);
   4030  1.22   msaitoh 	printf("\tPciVendorID=%04hx\n", wddt->PciVendorId);
   4031  1.22   msaitoh 	printf("\tAddress=");
   4032  1.22   msaitoh 	acpi_print_gas(&wddt->Address);
   4033  1.22   msaitoh 	printf("\n\tTimer Maximum Counter Value=%d\n", wddt->MaxCount);
   4034  1.27   msaitoh 	printf("\tTimer Minimum Counter Value=%d\n", wddt->MinCount);
   4035  1.22   msaitoh 	printf("\tTimer Counter Period=%d\n", wddt->Period);
   4036  1.22   msaitoh 
   4037  1.22   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_WDDT_## flag, #flag)
   4038  1.22   msaitoh 
   4039  1.22   msaitoh 	printf("\tStatus=");
   4040  1.22   msaitoh 	PRINTFLAG(wddt->Status, AVAILABLE);
   4041  1.22   msaitoh 	PRINTFLAG(wddt->Status, ACTIVE);
   4042  1.22   msaitoh 	PRINTFLAG(wddt->Status, TCO_OS_OWNED);
   4043  1.22   msaitoh 	PRINTFLAG(wddt->Status, USER_RESET);
   4044  1.22   msaitoh 	PRINTFLAG(wddt->Status, WDT_RESET);
   4045  1.22   msaitoh 	PRINTFLAG(wddt->Status, POWER_FAIL);
   4046  1.22   msaitoh 	PRINTFLAG(wddt->Status, UNKNOWN_RESET);
   4047  1.22   msaitoh 	PRINTFLAG_END();
   4048  1.22   msaitoh 
   4049  1.22   msaitoh 	printf("\tCapability=");
   4050  1.22   msaitoh 	PRINTFLAG(wddt->Capability, AUTO_RESET);
   4051  1.22   msaitoh 	PRINTFLAG(wddt->Capability, ALERT_SUPPORT);
   4052  1.22   msaitoh 	PRINTFLAG_END();
   4053  1.22   msaitoh 
   4054  1.22   msaitoh #undef PRINTFLAG
   4055  1.22   msaitoh 
   4056  1.22   msaitoh 	printf(END_COMMENT);
   4057  1.22   msaitoh }
   4058  1.22   msaitoh 
   4059  1.22   msaitoh static void
   4060   1.5    cegger acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp)
   4061   1.1  christos {
   4062   1.5    cegger 	ACPI_TABLE_WDRT *wdrt;
   4063   1.1  christos 
   4064   1.1  christos 	printf(BEGIN_COMMENT);
   4065   1.5    cegger 	acpi_print_sdt(sdp);
   4066   1.5    cegger 	wdrt = (ACPI_TABLE_WDRT *)sdp;
   4067   1.5    cegger 
   4068   1.5    cegger 	printf("\tControl Register=");
   4069   1.5    cegger 	acpi_print_gas(&wdrt->ControlRegister);
   4070  1.44   msaitoh 	printf("\n\tCount Register=");
   4071   1.5    cegger 	acpi_print_gas(&wdrt->CountRegister);
   4072  1.44   msaitoh 	printf("\n");
   4073   1.5    cegger 	acpi_print_pci(wdrt->PciVendorId, wdrt->PciDeviceId,
   4074   1.5    cegger 	    wdrt->PciSegment, wdrt->PciBus, wdrt->PciDevice, wdrt->PciFunction);
   4075   1.5    cegger 
   4076   1.5    cegger 	/* Value must be >= 511 and < 65535 */
   4077   1.5    cegger 	printf("\tMaxCount=%d", wdrt->MaxCount);
   4078   1.5    cegger 	if (wdrt->MaxCount < 511)
   4079   1.5    cegger 		printf(" (Out of Range. Valid range: 511 <= maxcount < 65535)");
   4080   1.5    cegger 	printf("\n");
   4081   1.5    cegger 
   4082   1.5    cegger 	printf("\tUnit={");
   4083   1.5    cegger 	switch (wdrt->Units) {
   4084   1.5    cegger 	case 0:
   4085   1.5    cegger 		printf("1 seconds/count");
   4086   1.5    cegger 		break;
   4087   1.5    cegger 	case 1:
   4088   1.5    cegger 		printf("100 milliseconds/count");
   4089   1.5    cegger 		break;
   4090   1.5    cegger 	case 2:
   4091   1.5    cegger 		printf("10 milliseconds/count");
   4092   1.5    cegger 		break;
   4093   1.5    cegger 	default:
   4094   1.5    cegger 		printf("%d", wdrt->Units);
   4095   1.5    cegger 		break;
   4096   1.5    cegger 	}
   4097   1.5    cegger 	printf("}\n");
   4098   1.5    cegger 
   4099   1.5    cegger 	printf(END_COMMENT);
   4100   1.5    cegger }
   4101   1.5    cegger 
   4102   1.5    cegger static void
   4103   1.5    cegger acpi_print_sdt(ACPI_TABLE_HEADER *sdp)
   4104   1.5    cegger {
   4105   1.5    cegger 	printf("  ");
   4106  1.45    dogcow 	acpi_print_string(sdp->Signature, ACPI_NAMESEG_SIZE);
   4107   1.8  jmcneill 	printf(": Length=%d, Revision=%d, Checksum=%d",
   4108   1.5    cegger 	       sdp->Length, sdp->Revision, sdp->Checksum);
   4109   1.8  jmcneill 	if (acpi_checksum(sdp, sdp->Length))
   4110   1.8  jmcneill 		printf(" (Incorrect)");
   4111   1.8  jmcneill 	printf(",\n\tOEMID=");
   4112   1.5    cegger 	acpi_print_string(sdp->OemId, ACPI_OEM_ID_SIZE);
   4113   1.1  christos 	printf(", OEM Table ID=");
   4114   1.5    cegger 	acpi_print_string(sdp->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
   4115   1.5    cegger 	printf(", OEM Revision=0x%x,\n", sdp->OemRevision);
   4116   1.1  christos 	printf("\tCreator ID=");
   4117  1.45    dogcow 	acpi_print_string(sdp->AslCompilerId, ACPI_NAMESEG_SIZE);
   4118   1.5    cegger 	printf(", Creator Revision=0x%x\n", sdp->AslCompilerRevision);
   4119   1.1  christos }
   4120   1.1  christos 
   4121  1.39   msaitoh void
   4122  1.39   msaitoh acpi_print_tabs(unsigned int n)
   4123  1.39   msaitoh {
   4124  1.39   msaitoh 
   4125  1.39   msaitoh 	while (n-- > 0)
   4126  1.39   msaitoh 		printf("\t");
   4127  1.39   msaitoh }
   4128  1.39   msaitoh 
   4129   1.5    cegger static void
   4130  1.39   msaitoh acpi_dump_bytes(uint8_t *p, uint32_t len, unsigned int ntabs)
   4131   1.7  jmcneill {
   4132   1.7  jmcneill 	unsigned int i;
   4133   1.7  jmcneill 
   4134  1.39   msaitoh 	acpi_print_tabs(ntabs);
   4135  1.39   msaitoh 	printf("Data={");
   4136  1.39   msaitoh 	for (i = 0; i < len; i++) {
   4137   1.7  jmcneill 		if (cflag) {
   4138  1.39   msaitoh 			if (i % 64 == 0) {
   4139  1.39   msaitoh 				printf("\n");
   4140  1.39   msaitoh 				acpi_print_tabs(ntabs);
   4141  1.39   msaitoh 				printf(" ");
   4142  1.39   msaitoh 			}else if (i % 16 == 0)
   4143   1.7  jmcneill 				printf(" ");
   4144   1.7  jmcneill 			printf("%c", (p[i] >= ' ' && p[i] <= '~') ? p[i] : '.');
   4145   1.7  jmcneill 		} else {
   4146  1.39   msaitoh 			if (i % 16 == 0) {
   4147  1.39   msaitoh 				printf("\n");
   4148  1.39   msaitoh 				acpi_print_tabs(ntabs + 1);
   4149  1.39   msaitoh 			} else if (i % 8 == 0)
   4150   1.7  jmcneill 				printf("   ");
   4151   1.7  jmcneill 			printf(" %02x", p[i]);
   4152   1.7  jmcneill 		}
   4153   1.7  jmcneill 	}
   4154  1.39   msaitoh 	printf("\n");
   4155  1.39   msaitoh 	acpi_print_tabs(ntabs);
   4156  1.39   msaitoh 	printf("}\n");
   4157  1.39   msaitoh }
   4158  1.39   msaitoh 
   4159  1.39   msaitoh /* Dump data which has ACPI_TABLE_HEADER */
   4160  1.39   msaitoh static void
   4161  1.39   msaitoh acpi_dump_table(ACPI_TABLE_HEADER *sdp)
   4162  1.39   msaitoh {
   4163  1.39   msaitoh 
   4164  1.39   msaitoh 	acpi_dump_bytes((uint8_t *)sdp, sdp->Length, 1);
   4165   1.7  jmcneill }
   4166   1.7  jmcneill 
   4167   1.7  jmcneill static void
   4168   1.5    cegger acpi_print_rsdt(ACPI_TABLE_HEADER *rsdp)
   4169   1.1  christos {
   4170   1.5    cegger 	ACPI_TABLE_RSDT *rsdt;
   4171   1.5    cegger 	ACPI_TABLE_XSDT *xsdt;
   4172   1.1  christos 	int	i, entries;
   4173   1.1  christos 
   4174   1.5    cegger 	rsdt = (ACPI_TABLE_RSDT *)rsdp;
   4175   1.5    cegger 	xsdt = (ACPI_TABLE_XSDT *)rsdp;
   4176   1.5    cegger 	printf(BEGIN_COMMENT);
   4177   1.1  christos 	acpi_print_sdt(rsdp);
   4178   1.5    cegger 	entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
   4179   1.1  christos 	printf("\tEntries={ ");
   4180   1.1  christos 	for (i = 0; i < entries; i++) {
   4181   1.1  christos 		if (i > 0)
   4182   1.1  christos 			printf(", ");
   4183  1.16   msaitoh 		if (addr_size == 4)
   4184  1.16   msaitoh 			printf("0x%08x", le32toh(rsdt->TableOffsetEntry[i]));
   4185  1.16   msaitoh 		else
   4186  1.16   msaitoh 			printf("0x%016jx",
   4187  1.16   msaitoh 			    (uintmax_t)le64toh(xsdt->TableOffsetEntry[i]));
   4188   1.1  christos 	}
   4189   1.1  christos 	printf(" }\n");
   4190   1.1  christos 	printf(END_COMMENT);
   4191   1.1  christos }
   4192   1.1  christos 
   4193   1.5    cegger static const char *acpi_pm_profiles[] = {
   4194   1.5    cegger 	"Unspecified", "Desktop", "Mobile", "Workstation",
   4195  1.21   msaitoh 	"Enterprise Server", "SOHO Server", "Appliance PC",
   4196  1.21   msaitoh 	"Performance Server", "Tablet"
   4197   1.5    cegger };
   4198   1.5    cegger 
   4199   1.5    cegger static void
   4200   1.5    cegger acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
   4201   1.1  christos {
   4202   1.5    cegger 	ACPI_TABLE_FADT *fadt;
   4203   1.5    cegger 	const char *pm;
   4204   1.1  christos 
   4205   1.5    cegger 	fadt = (ACPI_TABLE_FADT *)sdp;
   4206   1.1  christos 	printf(BEGIN_COMMENT);
   4207   1.5    cegger 	acpi_print_sdt(sdp);
   4208   1.5    cegger 	printf(" \tFACS=0x%x, DSDT=0x%x\n", fadt->Facs,
   4209   1.5    cegger 	       fadt->Dsdt);
   4210  1.21   msaitoh 	/* XXX ACPI 2.0 eliminated this */
   4211   1.5    cegger 	printf("\tINT_MODEL=%s\n", fadt->Model ? "APIC" : "PIC");
   4212   1.5    cegger 	if (fadt->PreferredProfile >= sizeof(acpi_pm_profiles) / sizeof(char *))
   4213   1.5    cegger 		pm = "Reserved";
   4214   1.5    cegger 	else
   4215   1.5    cegger 		pm = acpi_pm_profiles[fadt->PreferredProfile];
   4216   1.5    cegger 	printf("\tPreferred_PM_Profile=%s (%d)\n", pm, fadt->PreferredProfile);
   4217   1.5    cegger 	printf("\tSCI_INT=%d\n", fadt->SciInterrupt);
   4218   1.5    cegger 	printf("\tSMI_CMD=0x%x, ", fadt->SmiCommand);
   4219   1.5    cegger 	printf("ACPI_ENABLE=0x%x, ", fadt->AcpiEnable);
   4220   1.5    cegger 	printf("ACPI_DISABLE=0x%x, ", fadt->AcpiDisable);
   4221   1.5    cegger 	printf("S4BIOS_REQ=0x%x\n", fadt->S4BiosRequest);
   4222   1.5    cegger 	printf("\tPSTATE_CNT=0x%x\n", fadt->PstateControl);
   4223   1.5    cegger 	printf("\tPM1a_EVT_BLK=0x%x-0x%x\n",
   4224   1.5    cegger 	       fadt->Pm1aEventBlock,
   4225   1.5    cegger 	       fadt->Pm1aEventBlock + fadt->Pm1EventLength - 1);
   4226   1.5    cegger 	if (fadt->Pm1bEventBlock != 0)
   4227   1.1  christos 		printf("\tPM1b_EVT_BLK=0x%x-0x%x\n",
   4228   1.5    cegger 		       fadt->Pm1bEventBlock,
   4229   1.5    cegger 		       fadt->Pm1bEventBlock + fadt->Pm1EventLength - 1);
   4230   1.5    cegger 	printf("\tPM1a_CNT_BLK=0x%x-0x%x\n",
   4231   1.5    cegger 	       fadt->Pm1aControlBlock,
   4232   1.5    cegger 	       fadt->Pm1aControlBlock + fadt->Pm1ControlLength - 1);
   4233   1.5    cegger 	if (fadt->Pm1bControlBlock != 0)
   4234   1.1  christos 		printf("\tPM1b_CNT_BLK=0x%x-0x%x\n",
   4235   1.5    cegger 		       fadt->Pm1bControlBlock,
   4236   1.5    cegger 		       fadt->Pm1bControlBlock + fadt->Pm1ControlLength - 1);
   4237   1.5    cegger 	if (fadt->Pm2ControlBlock != 0)
   4238   1.1  christos 		printf("\tPM2_CNT_BLK=0x%x-0x%x\n",
   4239   1.5    cegger 		       fadt->Pm2ControlBlock,
   4240   1.5    cegger 		       fadt->Pm2ControlBlock + fadt->Pm2ControlLength - 1);
   4241  1.36   msaitoh 	if (fadt->PmTimerBlock != 0)
   4242  1.36   msaitoh 		printf("\tPM_TMR_BLK=0x%x-0x%x\n",
   4243  1.36   msaitoh 		    fadt->PmTimerBlock,
   4244  1.36   msaitoh 		    fadt->PmTimerBlock + fadt->PmTimerLength - 1);
   4245   1.5    cegger 	if (fadt->Gpe0Block != 0)
   4246   1.5    cegger 		printf("\tGPE0_BLK=0x%x-0x%x\n",
   4247   1.5    cegger 		       fadt->Gpe0Block,
   4248   1.5    cegger 		       fadt->Gpe0Block + fadt->Gpe0BlockLength - 1);
   4249   1.5    cegger 	if (fadt->Gpe1Block != 0)
   4250   1.5    cegger 		printf("\tGPE1_BLK=0x%x-0x%x, GPE1_BASE=%d\n",
   4251   1.5    cegger 		       fadt->Gpe1Block,
   4252   1.5    cegger 		       fadt->Gpe1Block + fadt->Gpe1BlockLength - 1,
   4253   1.5    cegger 		       fadt->Gpe1Base);
   4254   1.5    cegger 	if (fadt->CstControl != 0)
   4255   1.5    cegger 		printf("\tCST_CNT=0x%x\n", fadt->CstControl);
   4256   1.5    cegger 	printf("\tP_LVL2_LAT=%d us, P_LVL3_LAT=%d us\n",
   4257   1.5    cegger 	       fadt->C2Latency, fadt->C3Latency);
   4258   1.1  christos 	printf("\tFLUSH_SIZE=%d, FLUSH_STRIDE=%d\n",
   4259   1.5    cegger 	       fadt->FlushSize, fadt->FlushStride);
   4260   1.1  christos 	printf("\tDUTY_OFFSET=%d, DUTY_WIDTH=%d\n",
   4261   1.5    cegger 	       fadt->DutyOffset, fadt->DutyWidth);
   4262   1.1  christos 	printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n",
   4263   1.5    cegger 	       fadt->DayAlarm, fadt->MonthAlarm, fadt->Century);
   4264   1.1  christos 
   4265  1.16   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_FADT_## flag, #flag)
   4266   1.1  christos 
   4267   1.5    cegger 	printf("\tIAPC_BOOT_ARCH=");
   4268   1.5    cegger 	PRINTFLAG(fadt->BootFlags, LEGACY_DEVICES);
   4269   1.5    cegger 	PRINTFLAG(fadt->BootFlags, 8042);
   4270   1.5    cegger 	PRINTFLAG(fadt->BootFlags, NO_VGA);
   4271   1.5    cegger 	PRINTFLAG(fadt->BootFlags, NO_MSI);
   4272   1.5    cegger 	PRINTFLAG(fadt->BootFlags, NO_ASPM);
   4273  1.16   msaitoh 	PRINTFLAG(fadt->BootFlags, NO_CMOS_RTC);
   4274  1.16   msaitoh 	PRINTFLAG_END();
   4275   1.5    cegger 
   4276   1.5    cegger 	printf("\tFlags=");
   4277   1.5    cegger 	PRINTFLAG(fadt->Flags, WBINVD);
   4278   1.5    cegger 	PRINTFLAG(fadt->Flags, WBINVD_FLUSH);
   4279   1.5    cegger 	PRINTFLAG(fadt->Flags, C1_SUPPORTED);
   4280   1.5    cegger 	PRINTFLAG(fadt->Flags, C2_MP_SUPPORTED);
   4281   1.5    cegger 	PRINTFLAG(fadt->Flags, POWER_BUTTON);
   4282   1.5    cegger 	PRINTFLAG(fadt->Flags, SLEEP_BUTTON);
   4283   1.5    cegger 	PRINTFLAG(fadt->Flags, FIXED_RTC);
   4284   1.5    cegger 	PRINTFLAG(fadt->Flags, S4_RTC_WAKE);
   4285   1.5    cegger 	PRINTFLAG(fadt->Flags, 32BIT_TIMER);
   4286   1.5    cegger 	PRINTFLAG(fadt->Flags, DOCKING_SUPPORTED);
   4287   1.5    cegger 	PRINTFLAG(fadt->Flags, RESET_REGISTER);
   4288   1.5    cegger 	PRINTFLAG(fadt->Flags, SEALED_CASE);
   4289   1.5    cegger 	PRINTFLAG(fadt->Flags, HEADLESS);
   4290   1.5    cegger 	PRINTFLAG(fadt->Flags, SLEEP_TYPE);
   4291   1.5    cegger 	PRINTFLAG(fadt->Flags, PCI_EXPRESS_WAKE);
   4292   1.5    cegger 	PRINTFLAG(fadt->Flags, PLATFORM_CLOCK);
   4293   1.5    cegger 	PRINTFLAG(fadt->Flags, S4_RTC_VALID);
   4294   1.5    cegger 	PRINTFLAG(fadt->Flags, REMOTE_POWER_ON);
   4295   1.5    cegger 	PRINTFLAG(fadt->Flags, APIC_CLUSTER);
   4296   1.5    cegger 	PRINTFLAG(fadt->Flags, APIC_PHYSICAL);
   4297  1.16   msaitoh 	PRINTFLAG(fadt->Flags, HW_REDUCED);
   4298  1.16   msaitoh 	PRINTFLAG(fadt->Flags, LOW_POWER_S0);
   4299  1.16   msaitoh 	PRINTFLAG_END();
   4300   1.1  christos 
   4301  1.21   msaitoh 	if (sdp->Length < ACPI_FADT_V2_SIZE)
   4302  1.21   msaitoh 		goto out;
   4303   1.1  christos 
   4304   1.5    cegger 	if (fadt->Flags & ACPI_FADT_RESET_REGISTER) {
   4305   1.5    cegger 		printf("\tRESET_REG=");
   4306   1.5    cegger 		acpi_print_gas(&fadt->ResetRegister);
   4307   1.5    cegger 		printf(", RESET_VALUE=%#x\n", fadt->ResetValue);
   4308   1.5    cegger 	}
   4309  1.21   msaitoh 
   4310  1.21   msaitoh 	printf("\tArmBootFlags=");
   4311  1.21   msaitoh 	PRINTFLAG(fadt->ArmBootFlags, PSCI_COMPLIANT);
   4312  1.21   msaitoh 	PRINTFLAG(fadt->ArmBootFlags, PSCI_USE_HVC);
   4313  1.21   msaitoh 	PRINTFLAG_END();
   4314  1.21   msaitoh 
   4315  1.21   msaitoh #undef PRINTFLAG
   4316  1.21   msaitoh 
   4317  1.21   msaitoh 	printf("\tMinorRevision=%u\n", fadt->MinorRevision);
   4318  1.21   msaitoh 
   4319  1.21   msaitoh 	if (sdp->Length < ACPI_FADT_V3_SIZE)
   4320  1.21   msaitoh 		goto out;
   4321  1.21   msaitoh 
   4322  1.21   msaitoh 	printf("\tX_FACS=0x%016jx, ", (uintmax_t)fadt->XFacs);
   4323  1.21   msaitoh 	printf("X_DSDT=0x%016jx\n", (uintmax_t)fadt->XDsdt);
   4324  1.21   msaitoh 	printf("\tX_PM1a_EVT_BLK=");
   4325  1.21   msaitoh 	acpi_print_gas(&fadt->XPm1aEventBlock);
   4326  1.21   msaitoh 	if (fadt->XPm1bEventBlock.Address != 0) {
   4327  1.21   msaitoh 		printf("\n\tX_PM1b_EVT_BLK=");
   4328  1.21   msaitoh 		acpi_print_gas(&fadt->XPm1bEventBlock);
   4329  1.21   msaitoh 	}
   4330  1.21   msaitoh 	printf("\n\tX_PM1a_CNT_BLK=");
   4331  1.21   msaitoh 	acpi_print_gas(&fadt->XPm1aControlBlock);
   4332  1.21   msaitoh 	if (fadt->XPm1bControlBlock.Address != 0) {
   4333  1.21   msaitoh 		printf("\n\tX_PM1b_CNT_BLK=");
   4334  1.21   msaitoh 		acpi_print_gas(&fadt->XPm1bControlBlock);
   4335  1.21   msaitoh 	}
   4336  1.21   msaitoh 	if (fadt->XPm2ControlBlock.Address != 0) {
   4337  1.21   msaitoh 		printf("\n\tX_PM2_CNT_BLK=");
   4338  1.21   msaitoh 		acpi_print_gas(&fadt->XPm2ControlBlock);
   4339  1.21   msaitoh 	}
   4340  1.37   msaitoh 	if (fadt->XPmTimerBlock.Address != 0) {
   4341  1.37   msaitoh 		printf("\n\tX_PM_TMR_BLK=");
   4342  1.37   msaitoh 		acpi_print_gas(&fadt->XPmTimerBlock);
   4343  1.37   msaitoh 	}
   4344  1.21   msaitoh 	if (fadt->XGpe0Block.Address != 0) {
   4345  1.21   msaitoh 		printf("\n\tX_GPE0_BLK=");
   4346  1.21   msaitoh 		acpi_print_gas(&fadt->XGpe0Block);
   4347  1.21   msaitoh 	}
   4348  1.21   msaitoh 	if (fadt->XGpe1Block.Address != 0) {
   4349  1.21   msaitoh 		printf("\n\tX_GPE1_BLK=");
   4350  1.21   msaitoh 		acpi_print_gas(&fadt->XGpe1Block);
   4351  1.21   msaitoh 	}
   4352  1.21   msaitoh 	printf("\n");
   4353  1.21   msaitoh 
   4354  1.21   msaitoh 	if (sdp->Length < ACPI_FADT_V5_SIZE)
   4355  1.21   msaitoh 		goto out;
   4356  1.21   msaitoh 
   4357  1.21   msaitoh 	if (fadt->SleepControl.Address != 0) {
   4358  1.21   msaitoh 		printf("\tSleepControl=");
   4359  1.21   msaitoh 		acpi_print_gas(&fadt->SleepControl);
   4360  1.21   msaitoh 		printf("\n");
   4361  1.21   msaitoh 	}
   4362  1.21   msaitoh 	if (fadt->SleepStatus.Address != 0) {
   4363  1.21   msaitoh 		printf("\n\tSleepStatus=");
   4364  1.21   msaitoh 		acpi_print_gas(&fadt->SleepStatus);
   4365   1.5    cegger 		printf("\n");
   4366   1.5    cegger 	}
   4367   1.5    cegger 
   4368  1.21   msaitoh 	if (sdp->Length < ACPI_FADT_V6_SIZE)
   4369  1.21   msaitoh 		goto out;
   4370  1.21   msaitoh 
   4371  1.21   msaitoh 	printf("\tHypervisorId=0x%016"PRIx64"\n", fadt->HypervisorId);
   4372  1.21   msaitoh 
   4373  1.21   msaitoh out:
   4374   1.1  christos 	printf(END_COMMENT);
   4375   1.1  christos }
   4376   1.1  christos 
   4377   1.5    cegger static void
   4378   1.5    cegger acpi_print_facs(ACPI_TABLE_FACS *facs)
   4379   1.1  christos {
   4380   1.5    cegger 	printf(BEGIN_COMMENT);
   4381   1.5    cegger 	printf("  FACS:\tLength=%u, ", facs->Length);
   4382   1.5    cegger 	printf("HwSig=0x%08x, ", facs->HardwareSignature);
   4383   1.5    cegger 	printf("Firm_Wake_Vec=0x%08x\n", facs->FirmwareWakingVector);
   4384   1.5    cegger 
   4385  1.21   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_GLOCK_## flag, #flag)
   4386  1.21   msaitoh 
   4387   1.5    cegger 	printf("\tGlobal_Lock=");
   4388  1.21   msaitoh 	PRINTFLAG(facs->GlobalLock, PENDING);
   4389  1.21   msaitoh 	PRINTFLAG(facs->GlobalLock, OWNED);
   4390  1.21   msaitoh 	PRINTFLAG_END();
   4391  1.21   msaitoh 
   4392  1.21   msaitoh #undef PRINTFLAG
   4393  1.21   msaitoh 
   4394  1.21   msaitoh #define PRINTFLAG(var, flag)	printflag((var), ACPI_FACS_## flag, #flag)
   4395   1.5    cegger 
   4396   1.5    cegger 	printf("\tFlags=");
   4397  1.21   msaitoh 	PRINTFLAG(facs->Flags, S4_BIOS_PRESENT);
   4398  1.21   msaitoh 	PRINTFLAG(facs->Flags, 64BIT_WAKE);
   4399  1.21   msaitoh 	PRINTFLAG_END();
   4400  1.21   msaitoh 
   4401  1.21   msaitoh #undef PRINTFLAG
   4402   1.5    cegger 
   4403  1.16   msaitoh 	if (facs->XFirmwareWakingVector != 0)
   4404  1.16   msaitoh 		printf("\tX_Firm_Wake_Vec=%016jx\n",
   4405  1.16   msaitoh 		    (uintmax_t)facs->XFirmwareWakingVector);
   4406   1.5    cegger 	printf("\tVersion=%u\n", facs->Version);
   4407   1.5    cegger 
   4408  1.21   msaitoh 	printf("\tOspmFlags={");
   4409  1.21   msaitoh 	if (facs->OspmFlags & ACPI_FACS_64BIT_ENVIRONMENT)
   4410  1.21   msaitoh 		printf("64BIT_WAKE");
   4411  1.21   msaitoh 	printf("}\n");
   4412  1.21   msaitoh 
   4413   1.5    cegger 	printf(END_COMMENT);
   4414   1.5    cegger }
   4415   1.1  christos 
   4416   1.5    cegger static void
   4417   1.5    cegger acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp)
   4418   1.5    cegger {
   4419   1.5    cegger 	printf(BEGIN_COMMENT);
   4420   1.1  christos 	acpi_print_sdt(dsdp);
   4421   1.5    cegger 	printf(END_COMMENT);
   4422   1.1  christos }
   4423   1.1  christos 
   4424   1.1  christos int
   4425   1.1  christos acpi_checksum(void *p, size_t length)
   4426   1.1  christos {
   4427   1.5    cegger 	uint8_t *bp;
   4428   1.5    cegger 	uint8_t sum;
   4429   1.1  christos 
   4430   1.1  christos 	bp = p;
   4431   1.1  christos 	sum = 0;
   4432   1.1  christos 	while (length--)
   4433   1.1  christos 		sum += *bp++;
   4434   1.1  christos 
   4435   1.1  christos 	return (sum);
   4436   1.1  christos }
   4437   1.1  christos 
   4438   1.5    cegger static ACPI_TABLE_HEADER *
   4439   1.1  christos acpi_map_sdt(vm_offset_t pa)
   4440   1.1  christos {
   4441   1.5    cegger 	ACPI_TABLE_HEADER *sp;
   4442   1.1  christos 
   4443   1.5    cegger 	sp = acpi_map_physical(pa, sizeof(ACPI_TABLE_HEADER));
   4444   1.5    cegger 	sp = acpi_map_physical(pa, sp->Length);
   4445   1.1  christos 	return (sp);
   4446   1.1  christos }
   4447   1.1  christos 
   4448   1.5    cegger static void
   4449   1.5    cegger acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp)
   4450   1.1  christos {
   4451   1.1  christos 	printf(BEGIN_COMMENT);
   4452   1.5    cegger 	printf("  RSD PTR: OEM=");
   4453   1.5    cegger 	acpi_print_string(rp->OemId, ACPI_OEM_ID_SIZE);
   4454   1.5    cegger 	printf(", ACPI_Rev=%s (%d)\n", rp->Revision < 2 ? "1.0x" : "2.0x",
   4455   1.5    cegger 	       rp->Revision);
   4456   1.5    cegger 	if (rp->Revision < 2) {
   4457   1.5    cegger 		printf("\tRSDT=0x%08x, cksum=%u\n", rp->RsdtPhysicalAddress,
   4458   1.5    cegger 		    rp->Checksum);
   4459   1.5    cegger 	} else {
   4460  1.16   msaitoh 		printf("\tXSDT=0x%016jx, length=%u, cksum=%u\n",
   4461  1.16   msaitoh 		    (uintmax_t)rp->XsdtPhysicalAddress, rp->Length,
   4462   1.5    cegger 		    rp->ExtendedChecksum);
   4463   1.5    cegger 	}
   4464   1.1  christos 	printf(END_COMMENT);
   4465   1.1  christos }
   4466   1.1  christos 
   4467   1.5    cegger static void
   4468   1.5    cegger acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
   4469   1.1  christos {
   4470   1.5    cegger 	ACPI_TABLE_HEADER *sdp;
   4471   1.5    cegger 	ACPI_TABLE_RSDT *rsdt;
   4472   1.5    cegger 	ACPI_TABLE_XSDT *xsdt;
   4473  1.15  christos 	vm_offset_t addr = 0;
   4474   1.5    cegger 	int entries, i;
   4475   1.1  christos 
   4476   1.1  christos 	acpi_print_rsdt(rsdp);
   4477   1.5    cegger 	rsdt = (ACPI_TABLE_RSDT *)rsdp;
   4478   1.5    cegger 	xsdt = (ACPI_TABLE_XSDT *)rsdp;
   4479   1.5    cegger 	entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
   4480   1.1  christos 	for (i = 0; i < entries; i++) {
   4481  1.16   msaitoh 		if (addr_size == 4)
   4482   1.5    cegger 			addr = le32toh(rsdt->TableOffsetEntry[i]);
   4483  1.16   msaitoh 		else
   4484   1.5    cegger 			addr = le64toh(xsdt->TableOffsetEntry[i]);
   4485  1.16   msaitoh 		if (addr == 0)
   4486  1.16   msaitoh 			continue;
   4487   1.5    cegger 		sdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
   4488   1.5    cegger 		if (acpi_checksum(sdp, sdp->Length)) {
   4489   1.5    cegger 			warnx("RSDT entry %d (sig %.4s) is corrupt", i,
   4490   1.5    cegger 			    sdp->Signature);
   4491   1.8  jmcneill 			if (sflag)
   4492   1.8  jmcneill 				continue;
   4493   1.4  drochner 		}
   4494   1.5    cegger 		if (!memcmp(sdp->Signature, ACPI_SIG_FADT, 4))
   4495   1.5    cegger 			acpi_handle_fadt(sdp);
   4496   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_BERT, 4))
   4497   1.5    cegger 			acpi_handle_bert(sdp);
   4498  1.40   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_BGRT, 4))
   4499  1.40   msaitoh 			acpi_handle_bgrt(sdp);
   4500   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_BOOT, 4))
   4501   1.5    cegger 			acpi_handle_boot(sdp);
   4502   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_CPEP, 4))
   4503   1.5    cegger 			acpi_handle_cpep(sdp);
   4504  1.39   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_CSRT, 4))
   4505  1.39   msaitoh 			acpi_handle_csrt(sdp);
   4506   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_DBGP, 4))
   4507   1.5    cegger 			acpi_handle_dbgp(sdp);
   4508  1.22   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_DBG2, 4))
   4509  1.22   msaitoh 			acpi_handle_dbg2(sdp);
   4510  1.16   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_DMAR, 4))
   4511  1.16   msaitoh 			acpi_handle_dmar(sdp);
   4512   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_EINJ, 4))
   4513   1.5    cegger 			acpi_handle_einj(sdp);
   4514   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_ERST, 4))
   4515   1.5    cegger 			acpi_handle_erst(sdp);
   4516  1.35   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_GTDT, 4))
   4517  1.35   msaitoh 			acpi_handle_gtdt(sdp);
   4518   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_MADT, 4))
   4519   1.5    cegger 			acpi_handle_madt(sdp);
   4520   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_MSCT, 4))
   4521   1.5    cegger 			acpi_handle_msct(sdp);
   4522   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_HEST, 4))
   4523   1.5    cegger 			acpi_handle_hest(sdp);
   4524   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_HPET, 4))
   4525   1.5    cegger 			acpi_handle_hpet(sdp);
   4526  1.42   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_IORT, 4))
   4527  1.42   msaitoh 			acpi_handle_iort(sdp);
   4528   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_ECDT, 4))
   4529   1.5    cegger 			acpi_handle_ecdt(sdp);
   4530  1.30   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_LPIT, 4))
   4531  1.30   msaitoh 			acpi_handle_lpit(sdp);
   4532   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_MCFG, 4))
   4533   1.5    cegger 			acpi_handle_mcfg(sdp);
   4534  1.48  jmcneill 		else if (!memcmp(sdp->Signature, ACPI_SIG_PCCT, 4))
   4535  1.48  jmcneill 			acpi_handle_pcct(sdp);
   4536  1.35   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_PPTT, 4))
   4537  1.35   msaitoh 			acpi_handle_pptt(sdp);
   4538   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SBST, 4))
   4539   1.5    cegger 			acpi_handle_sbst(sdp);
   4540   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SLIT, 4))
   4541   1.5    cegger 			acpi_handle_slit(sdp);
   4542   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SPCR, 4))
   4543   1.5    cegger 			acpi_handle_spcr(sdp);
   4544  1.22   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_SPMI, 4))
   4545  1.22   msaitoh 			acpi_handle_spmi(sdp);
   4546   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SRAT, 4))
   4547   1.5    cegger 			acpi_handle_srat(sdp);
   4548   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4))
   4549   1.5    cegger 			acpi_handle_tcpa(sdp);
   4550  1.46      maxv 		else if (!memcmp(sdp->Signature, ACPI_SIG_TPM2, 4))
   4551  1.46      maxv 			acpi_handle_tpm2(sdp);
   4552  1.19   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_NFIT, 4))
   4553  1.19   msaitoh 			acpi_handle_nfit(sdp);
   4554  1.22   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_UEFI, 4))
   4555  1.22   msaitoh 			acpi_handle_uefi(sdp);
   4556   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_WAET, 4))
   4557   1.5    cegger 			acpi_handle_waet(sdp);
   4558   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_WDAT, 4))
   4559   1.5    cegger 			acpi_handle_wdat(sdp);
   4560  1.22   msaitoh 		else if (!memcmp(sdp->Signature, ACPI_SIG_WDDT, 4))
   4561  1.22   msaitoh 			acpi_handle_wddt(sdp);
   4562   1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_WDRT, 4))
   4563   1.5    cegger 			acpi_handle_wdrt(sdp);
   4564   1.5    cegger 		else {
   4565   1.5    cegger 			printf(BEGIN_COMMENT);
   4566   1.1  christos 			acpi_print_sdt(sdp);
   4567  1.39   msaitoh 			printf("\n");
   4568  1.39   msaitoh 			acpi_dump_table(sdp);
   4569   1.5    cegger 			printf(END_COMMENT);
   4570   1.1  christos 		}
   4571   1.1  christos 	}
   4572   1.1  christos }
   4573   1.1  christos 
   4574   1.5    cegger ACPI_TABLE_HEADER *
   4575   1.5    cegger sdt_load_devmem(void)
   4576   1.5    cegger {
   4577   1.5    cegger 	ACPI_TABLE_RSDP *rp;
   4578   1.5    cegger 	ACPI_TABLE_HEADER *rsdp;
   4579   1.1  christos 
   4580   1.5    cegger 	rp = acpi_find_rsd_ptr();
   4581   1.5    cegger 	if (!rp)
   4582   1.5    cegger 		errx(EXIT_FAILURE, "Can't find ACPI information");
   4583   1.5    cegger 
   4584   1.5    cegger 	if (tflag)
   4585   1.5    cegger 		acpi_print_rsd_ptr(rp);
   4586   1.5    cegger 	if (rp->Revision < 2) {
   4587   1.5    cegger 		rsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(rp->RsdtPhysicalAddress);
   4588   1.5    cegger 		if (memcmp(rsdp->Signature, "RSDT", 4) != 0 ||
   4589   1.5    cegger 		    acpi_checksum(rsdp, rsdp->Length) != 0)
   4590   1.5    cegger 			errx(EXIT_FAILURE, "RSDT is corrupted");
   4591   1.5    cegger 		addr_size = sizeof(uint32_t);
   4592   1.5    cegger 	} else {
   4593   1.5    cegger 		rsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(rp->XsdtPhysicalAddress);
   4594   1.5    cegger 		if (memcmp(rsdp->Signature, "XSDT", 4) != 0 ||
   4595   1.5    cegger 		    acpi_checksum(rsdp, rsdp->Length) != 0)
   4596   1.5    cegger 			errx(EXIT_FAILURE, "XSDT is corrupted");
   4597   1.5    cegger 		addr_size = sizeof(uint64_t);
   4598   1.5    cegger 	}
   4599   1.5    cegger 	return (rsdp);
   4600   1.1  christos }
   4601   1.1  christos 
   4602   1.5    cegger /* Write the DSDT to a file, concatenating any SSDTs (if present). */
   4603   1.5    cegger static int
   4604   1.5    cegger write_dsdt(int fd, ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdt)
   4605   1.5    cegger {
   4606   1.5    cegger 	ACPI_TABLE_HEADER sdt;
   4607   1.5    cegger 	ACPI_TABLE_HEADER *ssdt;
   4608   1.5    cegger 	uint8_t sum;
   4609   1.5    cegger 
   4610   1.5    cegger 	/* Create a new checksum to account for the DSDT and any SSDTs. */
   4611   1.5    cegger 	sdt = *dsdt;
   4612   1.5    cegger 	if (rsdt != NULL) {
   4613   1.5    cegger 		sdt.Checksum = 0;
   4614   1.5    cegger 		sum = acpi_checksum(dsdt + 1, dsdt->Length -
   4615   1.5    cegger 		    sizeof(ACPI_TABLE_HEADER));
   4616   1.5    cegger 		ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, NULL);
   4617   1.5    cegger 		while (ssdt != NULL) {
   4618   1.5    cegger 			sdt.Length += ssdt->Length - sizeof(ACPI_TABLE_HEADER);
   4619   1.5    cegger 			sum += acpi_checksum(ssdt + 1,
   4620   1.5    cegger 			    ssdt->Length - sizeof(ACPI_TABLE_HEADER));
   4621   1.5    cegger 			ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, ssdt);
   4622   1.5    cegger 		}
   4623   1.5    cegger 		sum += acpi_checksum(&sdt, sizeof(ACPI_TABLE_HEADER));
   4624   1.5    cegger 		sdt.Checksum -= sum;
   4625   1.5    cegger 	}
   4626   1.5    cegger 
   4627   1.5    cegger 	/* Write out the DSDT header and body. */
   4628   1.5    cegger 	write(fd, &sdt, sizeof(ACPI_TABLE_HEADER));
   4629   1.5    cegger 	write(fd, dsdt + 1, dsdt->Length - sizeof(ACPI_TABLE_HEADER));
   4630   1.5    cegger 
   4631   1.5    cegger 	/* Write out any SSDTs (if present.) */
   4632   1.5    cegger 	if (rsdt != NULL) {
   4633  1.50     skrll 		ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, NULL);
   4634   1.5    cegger 		while (ssdt != NULL) {
   4635   1.5    cegger 			write(fd, ssdt + 1, ssdt->Length -
   4636   1.5    cegger 			    sizeof(ACPI_TABLE_HEADER));
   4637  1.50     skrll 			ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, ssdt);
   4638   1.5    cegger 		}
   4639   1.5    cegger 	}
   4640   1.1  christos 	return (0);
   4641   1.1  christos }
   4642   1.1  christos 
   4643   1.5    cegger void
   4644   1.5    cegger dsdt_save_file(char *outfile, ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
   4645   1.1  christos {
   4646   1.5    cegger 	int	fd;
   4647   1.5    cegger 	mode_t	mode;
   4648   1.5    cegger 
   4649   1.5    cegger 	assert(outfile != NULL);
   4650   1.5    cegger 	mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
   4651   1.5    cegger 	fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
   4652   1.5    cegger 	if (fd == -1) {
   4653   1.5    cegger 		perror("dsdt_save_file");
   4654   1.5    cegger 		return;
   4655   1.5    cegger 	}
   4656   1.5    cegger 	write_dsdt(fd, rsdt, dsdp);
   4657   1.5    cegger 	close(fd);
   4658   1.1  christos }
   4659   1.1  christos 
   4660   1.5    cegger void
   4661   1.5    cegger aml_disassemble(ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
   4662   1.1  christos {
   4663  1.16   msaitoh 	char buf[MAXPATHLEN], tmpstr[MAXPATHLEN], wrkdir[MAXPATHLEN];
   4664  1.16   msaitoh 	const char *iname = "/acpdump.din";
   4665  1.16   msaitoh 	const char *oname = "/acpdump.dsl";
   4666   1.5    cegger 	const char *tmpdir;
   4667   1.5    cegger 	FILE *fp;
   4668   1.5    cegger 	size_t len;
   4669  1.16   msaitoh 	int fd, status;
   4670  1.16   msaitoh 	pid_t pid;
   4671   1.5    cegger 
   4672   1.5    cegger 	if (rsdt == NULL)
   4673   1.5    cegger 		errx(EXIT_FAILURE, "aml_disassemble: invalid rsdt");
   4674   1.5    cegger 	if (dsdp == NULL)
   4675   1.5    cegger 		errx(EXIT_FAILURE, "aml_disassemble: invalid dsdp");
   4676   1.5    cegger 
   4677   1.5    cegger 	tmpdir = getenv("TMPDIR");
   4678   1.5    cegger 	if (tmpdir == NULL)
   4679   1.5    cegger 		tmpdir = _PATH_TMP;
   4680  1.16   msaitoh 	if (realpath(tmpdir, buf) == NULL) {
   4681  1.16   msaitoh 		perror("realpath tmp dir");
   4682   1.5    cegger 		return;
   4683   1.5    cegger 	}
   4684  1.16   msaitoh 	len = sizeof(wrkdir) - strlen(iname);
   4685  1.16   msaitoh 	if ((size_t)snprintf(wrkdir, len, "%s/acpidump.XXXXXX", buf) > len-1 ) {
   4686  1.16   msaitoh 		fprintf(stderr, "$TMPDIR too long\n");
   4687  1.16   msaitoh 		return;
   4688  1.16   msaitoh 	}
   4689  1.16   msaitoh 	if  (mkdtemp(wrkdir) == NULL) {
   4690  1.16   msaitoh 		perror("mkdtemp tmp working dir");
   4691  1.16   msaitoh 		return;
   4692  1.16   msaitoh 	}
   4693  1.16   msaitoh 	len = (size_t)snprintf(tmpstr, sizeof(tmpstr), "%s%s", wrkdir, iname);
   4694  1.16   msaitoh 	assert(len <= sizeof(tmpstr) - 1);
   4695  1.16   msaitoh 	fd = open(tmpstr, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
   4696   1.5    cegger 	if (fd < 0) {
   4697   1.5    cegger 		perror("iasl tmp file");
   4698   1.5    cegger 		return;
   4699   1.5    cegger 	}
   4700   1.5    cegger 	write_dsdt(fd, rsdt, dsdp);
   4701   1.5    cegger 	close(fd);
   4702   1.5    cegger 
   4703   1.5    cegger 	/* Run iasl -d on the temp file */
   4704  1.16   msaitoh 	if ((pid = fork()) == 0) {
   4705   1.5    cegger 		close(STDOUT_FILENO);
   4706   1.5    cegger 		if (vflag == 0)
   4707   1.5    cegger 			close(STDERR_FILENO);
   4708   1.5    cegger 		execl("/usr/bin/iasl", "iasl", "-d", tmpstr, NULL);
   4709   1.5    cegger 		err(EXIT_FAILURE, "exec");
   4710   1.5    cegger 	}
   4711  1.16   msaitoh 	if (pid > 0)
   4712  1.16   msaitoh 		wait(&status);
   4713  1.16   msaitoh 	if (unlink(tmpstr) < 0) {
   4714  1.16   msaitoh 		perror("unlink");
   4715  1.16   msaitoh 		goto out;
   4716  1.16   msaitoh 	}
   4717  1.16   msaitoh 	if (pid < 0) {
   4718  1.16   msaitoh 		perror("fork");
   4719  1.16   msaitoh 		goto out;
   4720  1.16   msaitoh 	}
   4721  1.16   msaitoh 	if (status != 0) {
   4722  1.56   msaitoh 		fprintf(stderr, "iasl exit status = %d\n", status);
   4723  1.16   msaitoh 	}
   4724   1.1  christos 
   4725   1.5    cegger 	/* Dump iasl's output to stdout */
   4726  1.16   msaitoh 	len = (size_t)snprintf(tmpstr, sizeof(tmpstr), "%s%s", wrkdir, oname);
   4727  1.16   msaitoh 	assert(len <= sizeof(tmpstr) - 1);
   4728   1.5    cegger 	fp = fopen(tmpstr, "r");
   4729  1.16   msaitoh 	if (unlink(tmpstr) < 0) {
   4730  1.16   msaitoh 		perror("unlink");
   4731  1.16   msaitoh 		goto out;
   4732  1.16   msaitoh 	}
   4733   1.5    cegger 	if (fp == NULL) {
   4734   1.5    cegger 		perror("iasl tmp file (read)");
   4735  1.16   msaitoh 		goto out;
   4736   1.5    cegger 	}
   4737   1.5    cegger 	while ((len = fread(buf, 1, sizeof(buf), fp)) > 0)
   4738   1.5    cegger 		fwrite(buf, 1, len, stdout);
   4739   1.5    cegger 	fclose(fp);
   4740  1.16   msaitoh 
   4741  1.16   msaitoh     out:
   4742  1.16   msaitoh 	if (rmdir(wrkdir) < 0)
   4743  1.16   msaitoh 		perror("rmdir");
   4744   1.1  christos }
   4745   1.1  christos 
   4746   1.5    cegger void
   4747   1.5    cegger sdt_print_all(ACPI_TABLE_HEADER *rsdp)
   4748   1.1  christos {
   4749   1.5    cegger 	acpi_handle_rsdt(rsdp);
   4750   1.1  christos }
   4751   1.1  christos 
   4752   1.5    cegger /* Fetch a table matching the given signature via the RSDT. */
   4753   1.5    cegger ACPI_TABLE_HEADER *
   4754   1.5    cegger sdt_from_rsdt(ACPI_TABLE_HEADER *rsdp, const char *sig, ACPI_TABLE_HEADER *last)
   4755   1.1  christos {
   4756   1.5    cegger 	ACPI_TABLE_HEADER *sdt;
   4757   1.5    cegger 	ACPI_TABLE_RSDT *rsdt;
   4758   1.5    cegger 	ACPI_TABLE_XSDT *xsdt;
   4759  1.15  christos 	vm_offset_t addr = 0;
   4760   1.5    cegger 	int entries, i;
   4761   1.1  christos 
   4762   1.5    cegger 	rsdt = (ACPI_TABLE_RSDT *)rsdp;
   4763   1.5    cegger 	xsdt = (ACPI_TABLE_XSDT *)rsdp;
   4764   1.5    cegger 	entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
   4765   1.5    cegger 	for (i = 0; i < entries; i++) {
   4766  1.16   msaitoh 		if (addr_size == 4)
   4767   1.5    cegger 			addr = le32toh(rsdt->TableOffsetEntry[i]);
   4768  1.16   msaitoh 		else
   4769   1.5    cegger 			addr = le64toh(xsdt->TableOffsetEntry[i]);
   4770  1.16   msaitoh 		if (addr == 0)
   4771  1.16   msaitoh 			continue;
   4772   1.5    cegger 		sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
   4773   1.5    cegger 		if (last != NULL) {
   4774   1.5    cegger 			if (sdt == last)
   4775   1.5    cegger 				last = NULL;
   4776   1.5    cegger 			continue;
   4777   1.5    cegger 		}
   4778   1.5    cegger 		if (memcmp(sdt->Signature, sig, strlen(sig)))
   4779   1.5    cegger 			continue;
   4780   1.5    cegger 		if (acpi_checksum(sdt, sdt->Length))
   4781   1.5    cegger 			errx(EXIT_FAILURE, "RSDT entry %d is corrupt", i);
   4782   1.5    cegger 		return (sdt);
   4783   1.5    cegger 	}
   4784   1.1  christos 
   4785   1.5    cegger 	return (NULL);
   4786   1.1  christos }
   4787   1.1  christos 
   4788   1.5    cegger ACPI_TABLE_HEADER *
   4789   1.5    cegger dsdt_from_fadt(ACPI_TABLE_FADT *fadt)
   4790   1.1  christos {
   4791   1.5    cegger 	ACPI_TABLE_HEADER	*sdt;
   4792   1.1  christos 
   4793   1.5    cegger 	/* Use the DSDT address if it is version 1, otherwise use XDSDT. */
   4794  1.18   msaitoh 	sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(
   4795  1.18   msaitoh 		acpi_select_address(fadt->Dsdt, fadt->XDsdt));
   4796   1.5    cegger 	if (acpi_checksum(sdt, sdt->Length))
   4797  1.10  christos 		errx(EXIT_FAILURE, "DSDT is corrupt");
   4798   1.5    cegger 	return (sdt);
   4799   1.1  christos }
   4800