1 /*- 2 * Copyright (c) 1999 Doug Rabson 3 * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $Id: acpidump.h,v 1.3 2000/08/09 14:47:52 iwasaki Exp $ 28 * $FreeBSD$ 29 */ 30 31 #ifndef _ACPIDUMP_H_ 32 #define _ACPIDUMP_H_ 33 34 /* Generic Address structure */ 35 struct ACPIgas { 36 u_int8_t address_space_id; 37 #define ACPI_GAS_MEMORY 0 38 #define ACPI_GAS_IO 1 39 #define ACPI_GAS_PCI 2 40 #define ACPI_GAS_EMBEDDED 3 41 #define ACPI_GAS_SMBUS 4 42 #define ACPI_GAS_FIXED 0x7f 43 u_int8_t register_bit_width; 44 u_int8_t register_bit_offset; 45 u_int8_t res; 46 u_int64_t address; 47 } __packed; 48 49 /* Root System Description Pointer */ 50 struct ACPIrsdp { 51 u_char signature[8]; 52 u_char sum; 53 u_char oem[6]; 54 u_char revision; 55 u_int32_t rsdt_addr; 56 u_int32_t length; 57 u_int64_t xsdt_addr; 58 u_char xsum; 59 u_char _reserved_[3]; 60 } __packed; 61 62 /* System Description Table */ 63 struct ACPIsdt { 64 u_char signature[4]; 65 u_int32_t len; 66 u_char rev; 67 u_char check; 68 u_char oemid[6]; 69 u_char oemtblid[8]; 70 u_int32_t oemrev; 71 u_char creator[4]; 72 u_int32_t crerev; 73 #define SIZEOF_SDT_HDR 36 /* struct size except body */ 74 u_int32_t body[1];/* This member should be casted */ 75 } __packed; 76 77 /* Fixed ACPI Description Table (body) */ 78 struct FACPbody { 79 u_int32_t facs_ptr; 80 u_int32_t dsdt_ptr; 81 u_int8_t int_model; 82 #define ACPI_FACP_INTMODEL_PIC 0 /* Standard PC-AT PIC */ 83 #define ACPI_FACP_INTMODEL_APIC 1 /* Multiple APIC */ 84 u_char reserved1; 85 u_int16_t sci_int; 86 u_int32_t smi_cmd; 87 u_int8_t acpi_enable; 88 u_int8_t acpi_disable; 89 u_int8_t s4biosreq; 90 u_int8_t reserved2; 91 u_int32_t pm1a_evt_blk; 92 u_int32_t pm1b_evt_blk; 93 u_int32_t pm1a_cnt_blk; 94 u_int32_t pm1b_cnt_blk; 95 u_int32_t pm2_cnt_blk; 96 u_int32_t pm_tmr_blk; 97 u_int32_t gpe0_blk; 98 u_int32_t gpe1_blk; 99 u_int8_t pm1_evt_len; 100 u_int8_t pm1_cnt_len; 101 u_int8_t pm2_cnt_len; 102 u_int8_t pm_tmr_len; 103 u_int8_t gpe0_len; 104 u_int8_t gpe1_len; 105 u_int8_t gpe1_base; 106 u_int8_t reserved3; 107 u_int16_t p_lvl2_lat; 108 u_int16_t p_lvl3_lat; 109 u_int16_t flush_size; 110 u_int16_t flush_stride; 111 u_int8_t duty_off; 112 u_int8_t duty_width; 113 u_int8_t day_alrm; 114 u_int8_t mon_alrm; 115 u_int8_t century; 116 u_int16_t iapc_boot_arch; 117 u_char reserved4[1]; 118 u_int32_t flags; 119 #define ACPI_FACP_FLAG_WBINVD 1 /* WBINVD is correctly supported */ 120 #define ACPI_FACP_FLAG_WBINVD_FLUSH 2 /* WBINVD flushes caches */ 121 #define ACPI_FACP_FLAG_PROC_C1 4 /* C1 power state supported */ 122 #define ACPI_FACP_FLAG_P_LVL2_UP 8 /* C2 power state works on SMP */ 123 #define ACPI_FACP_FLAG_PWR_BUTTON 16 /* Power button uses control method */ 124 #define ACPI_FACP_FLAG_SLP_BUTTON 32 /* Sleep button uses control method */ 125 #define ACPI_FACP_FLAG_FIX_RTC 64 /* RTC wakeup not supported */ 126 #define ACPI_FACP_FLAG_RTC_S4 128 /* RTC can wakeup from S4 state */ 127 #define ACPI_FACP_FLAG_TMR_VAL_EXT 256 /* TMR_VAL is 32bit */ 128 #define ACPI_FACP_FLAG_DCK_CAP 512 /* Can support docking */ 129 struct ACPIgas reset_reg; 130 u_int8_t reset_value; 131 u_int8_t reserved5[3]; 132 u_int64_t x_firmware_ctrl; 133 u_int64_t x_dsdt; 134 struct ACPIgas x_pm1a_evt_blk; 135 struct ACPIgas x_pm1b_evt_blk; 136 struct ACPIgas x_pm1a_cnt_blk; 137 struct ACPIgas x_pm1b_cnt_blk; 138 struct ACPIgas x_pm2_cnt_blk; 139 struct ACPIgas x_pm_tmr_blk; 140 struct ACPIgas x_gpe0_blk; 141 struct ACPIgas x_gpe1_blk; 142 } __packed; 143 144 /* Firmware ACPI Control Structure */ 145 struct FACS { 146 u_char signature[4]; 147 u_int32_t len; 148 u_char hard_sig[4]; 149 /* 150 * NOTE This should be filled with physical address below 1MB!! 151 * sigh.... 152 */ 153 u_int32_t firm_wake_vec; 154 u_int32_t g_lock; /* bit field */ 155 /* 5.2.6.1 Global Lock */ 156 #define ACPI_GLOBAL_LOCK_PENDING 1 157 #define ACPI_GLOBAL_LOCK_OWNED 2 158 u_int32_t flags; /* bit field */ 159 #define ACPI_FACS_FLAG_S4BIOS_F 1 /* Supports S4BIOS_SEQ */ 160 char reserved[40]; 161 } __packed; 162 163 struct MADT_local_apic { 164 u_char cpu_id; 165 u_char apic_id; 166 u_int32_t flags; 167 #define ACPI_MADT_APIC_LOCAL_FLAG_ENABLED 1 168 } __packed; 169 170 struct MADT_io_apic { 171 u_char apic_id; 172 u_char reserved; 173 u_int32_t apic_addr; 174 u_int32_t int_base; 175 } __packed; 176 177 struct MADT_int_override { 178 u_char bus; 179 u_char source; 180 u_int32_t intr; 181 u_int16_t mps_flags; 182 #define MPS_INT_FLAG_POLARITY_MASK 0x3 183 #define MPS_INT_FLAG_POLARITY_CONFORM 0x0 184 #define MPS_INT_FLAG_POLARITY_HIGH 0x1 185 #define MPS_INT_FLAG_POLARITY_LOW 0x3 186 #define MPS_INT_FLAG_TRIGGER_MASK 0xc 187 #define MPS_INT_FLAG_TRIGGER_CONFORM 0x0 188 #define MPS_INT_FLAG_TRIGGER_EDGE 0x4 189 #define MPS_INT_FLAG_TRIGGER_LEVEL 0xc 190 } __packed; 191 192 struct MADT_nmi { 193 u_int16_t mps_flags; 194 u_int32_t intr; 195 } __packed; 196 197 struct MADT_local_nmi { 198 u_char cpu_id; 199 u_int16_t mps_flags; 200 u_char lintpin; 201 } __packed; 202 203 struct MADT_local_apic_override { 204 u_char reserved[2]; 205 u_int64_t apic_addr; 206 } __packed; 207 208 struct MADT_io_sapic { 209 u_char apic_id; 210 u_char reserved; 211 u_int32_t int_base; 212 u_int64_t apic_addr; 213 } __packed; 214 215 struct MADT_local_sapic { 216 u_char cpu_id; 217 u_char apic_id; 218 u_char apic_eid; 219 u_char reserved[3]; 220 u_int32_t flags; 221 } __packed; 222 223 struct MADT_int_src { 224 u_int16_t mps_flags; 225 u_char type; 226 #define ACPI_MADT_APIC_INT_SOURCE_PMI 1 227 #define ACPI_MADT_APIC_INT_SOURCE_INIT 2 228 #define ACPI_MADT_APIC_INT_SOURCE_CPEI 3 /* Corrected Platform Error */ 229 u_char cpu_id; 230 u_char cpu_eid; 231 u_char sapic_vector; 232 u_int32_t intr; 233 u_char reserved[4]; 234 } __packed; 235 236 struct MADT_APIC { 237 u_char type; 238 #define ACPI_MADT_APIC_TYPE_LOCAL_APIC 0 239 #define ACPI_MADT_APIC_TYPE_IO_APIC 1 240 #define ACPI_MADT_APIC_TYPE_INT_OVERRIDE 2 241 #define ACPI_MADT_APIC_TYPE_NMI 3 242 #define ACPI_MADT_APIC_TYPE_LOCAL_NMI 4 243 #define ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE 5 244 #define ACPI_MADT_APIC_TYPE_IO_SAPIC 6 245 #define ACPI_MADT_APIC_TYPE_LOCAL_SAPIC 7 246 #define ACPI_MADT_APIC_TYPE_INT_SRC 8 247 u_char len; 248 union { 249 struct MADT_local_apic local_apic; 250 struct MADT_io_apic io_apic; 251 struct MADT_int_override int_override; 252 struct MADT_nmi nmi; 253 struct MADT_local_nmi local_nmi; 254 struct MADT_local_apic_override local_apic_override; 255 struct MADT_io_sapic io_sapic; 256 struct MADT_local_sapic local_sapic; 257 struct MADT_int_src int_src; 258 } body; 259 } __packed; 260 261 struct MADTbody { 262 u_int32_t lapic_addr; 263 u_int32_t flags; 264 #define ACPI_APIC_FLAG_PCAT_COMPAT 1 /* Syetem has dual-8259 setup. */ 265 u_char body[1]; 266 } __packed; 267 268 void *acpi_map_physical(vm_offset_t, size_t); 269 struct ACPIrsdp *acpi_find_rsd_ptr(void); 270 int acpi_checksum(void *, size_t); 271 struct ACPIsdt *acpi_map_sdt(vm_offset_t); 272 void acpi_print_rsd_ptr(struct ACPIrsdp *); 273 void acpi_print_sdt(struct ACPIsdt *); 274 void acpi_print_rsdt(struct ACPIsdt *); 275 void acpi_print_facp(struct FACPbody *); 276 void acpi_print_dsdt(struct ACPIsdt *); 277 278 void asl_dump_termobj(u_int8_t **, int); 279 void asl_dump_objectlist(u_int8_t **, u_int8_t *, int); 280 281 void aml_dump(struct ACPIsdt *); 282 283 void acpi_handle_rsdt(struct ACPIsdt *); 284 void acpi_load_dsdt(char *, u_int8_t **, u_int8_t **); 285 void acpi_dump_dsdt(u_int8_t *, u_int8_t *); 286 extern char *aml_dumpfile; 287 extern struct ACPIsdt dsdt_header; 288 extern int rflag; 289 290 #endif /* !_ACPIDUMP_H_ */ 291