]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - usr.sbin/acpi/acpidump/acpidump.h
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / usr.sbin / acpi / acpidump / acpidump.h
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  *      $FreeBSD$
28  */
29
30 #ifndef _ACPIDUMP_H_
31 #define _ACPIDUMP_H_
32
33 /* Generic Address structure */
34 struct ACPIgas {
35         u_int8_t        address_space_id;
36 #define ACPI_GAS_MEMORY         0
37 #define ACPI_GAS_IO             1
38 #define ACPI_GAS_PCI            2
39 #define ACPI_GAS_EMBEDDED       3
40 #define ACPI_GAS_SMBUS          4
41 #define ACPI_GAS_FIXED          0x7f
42         u_int8_t        bit_width;
43         u_int8_t        bit_offset;
44         u_int8_t        _reserved;
45         u_int64_t       address;
46 } __packed;
47
48 /* Root System Description Pointer */
49 struct ACPIrsdp {
50         u_char          signature[8];
51         u_char          sum;
52         u_char          oem[6];
53         u_char          revision;
54         u_int32_t       rsdt_addr;
55         u_int32_t       length;
56         u_int64_t       xsdt_addr;
57         u_char          xsum;
58         u_char          _reserved_[3];
59 } __packed;
60
61 /* System Description Table */
62 struct ACPIsdt {
63         u_char          signature[4];
64         u_int32_t       len;
65         u_char          rev;
66         u_char          check;
67         u_char          oemid[6];
68         u_char          oemtblid[8];
69         u_int32_t       oemrev;
70         u_char          creator[4];
71         u_int32_t       crerev;
72 #define SIZEOF_SDT_HDR 36       /* struct size except body */
73         u_int32_t       body[1];/* This member should be casted */
74 } __packed;
75
76 /* Fixed ACPI Description Table (body) */
77 struct FADTbody {
78         u_int32_t       facs_ptr;
79         u_int32_t       dsdt_ptr;
80         u_int8_t        int_model;
81 #define ACPI_FADT_INTMODEL_PIC  0       /* Standard PC-AT PIC */
82 #define ACPI_FADT_INTMODEL_APIC 1       /* Multiple APIC */
83         u_int8_t        pm_profile;
84         u_int16_t       sci_int;
85         u_int32_t       smi_cmd;
86         u_int8_t        acpi_enable;
87         u_int8_t        acpi_disable;
88         u_int8_t        s4biosreq;
89         u_int8_t        pstate_cnt;
90         u_int32_t       pm1a_evt_blk;
91         u_int32_t       pm1b_evt_blk;
92         u_int32_t       pm1a_cnt_blk;
93         u_int32_t       pm1b_cnt_blk;
94         u_int32_t       pm2_cnt_blk;
95         u_int32_t       pm_tmr_blk;
96         u_int32_t       gpe0_blk;
97         u_int32_t       gpe1_blk;
98         u_int8_t        pm1_evt_len;
99         u_int8_t        pm1_cnt_len;
100         u_int8_t        pm2_cnt_len;
101         u_int8_t        pm_tmr_len;
102         u_int8_t        gpe0_len;
103         u_int8_t        gpe1_len;
104         u_int8_t        gpe1_base;
105         u_int8_t        cst_cnt;
106         u_int16_t       p_lvl2_lat;
107         u_int16_t       p_lvl3_lat;
108         u_int16_t       flush_size;
109         u_int16_t       flush_stride;
110         u_int8_t        duty_off;
111         u_int8_t        duty_width;
112         u_int8_t        day_alrm;
113         u_int8_t        mon_alrm;
114         u_int8_t        century;
115         u_int16_t       iapc_boot_arch;
116 #define FADT_FLAG_LEGACY_DEV    1       /* System has legacy devices */
117 #define FADT_FLAG_8042          2       /* 8042 keyboard controller */
118         u_char          reserved4[1];
119         u_int32_t       flags;
120 #define FADT_FLAG_WBINVD        1       /* WBINVD is correctly supported */
121 #define FADT_FLAG_WBINVD_FLUSH  2       /* WBINVD flushes caches */
122 #define FADT_FLAG_PROC_C1       4       /* C1 power state supported */
123 #define FADT_FLAG_P_LVL2_UP     8       /* C2 power state works on SMP */
124 #define FADT_FLAG_PWR_BUTTON    16      /* Power button uses control method */
125 #define FADT_FLAG_SLP_BUTTON    32      /* Sleep button uses control method */
126 #define FADT_FLAG_FIX_RTC       64      /* RTC wakeup not supported */
127 #define FADT_FLAG_RTC_S4        128     /* RTC can wakeup from S4 state */
128 #define FADT_FLAG_TMR_VAL_EXT   256     /* TMR_VAL is 32bit */
129 #define FADT_FLAG_DCK_CAP       512     /* Can support docking */
130 #define FADT_FLAG_RESET_REG     1024    /* Supports RESET_REG */
131 #define FADT_FLAG_SEALED_CASE   2048    /* Case cannot be opened */
132 #define FADT_FLAG_HEADLESS      4096    /* No monitor */
133 #define FADT_FLAG_CPU_SW_SLP    8192    /* Supports CPU software sleep */
134         struct ACPIgas  reset_reg;
135         u_int8_t        reset_value;
136         u_int8_t        reserved5[3];
137         u_int64_t       x_facs_ptr;
138         u_int64_t       x_dsdt_ptr;
139         struct ACPIgas  x_pm1a_evt_blk;
140         struct ACPIgas  x_pm1b_evt_blk;
141         struct ACPIgas  x_pm1a_cnt_blk;
142         struct ACPIgas  x_pm1b_cnt_blk;
143         struct ACPIgas  x_pm2_cnt_blk;
144         struct ACPIgas  x_pm_tmr_blk;
145         struct ACPIgas  x_gpe0_blk;
146         struct ACPIgas  x_gpe1_blk;
147 } __packed;
148
149 /* Firmware ACPI Control Structure */
150 struct FACSbody {
151         u_char          signature[4];
152         u_int32_t       len;
153         u_int32_t       hw_sig;
154         /*
155          * NOTE This should be filled with physical address below 1MB!!
156          * sigh....
157          */
158         u_int32_t       firm_wake_vec;
159         u_int32_t       global_lock;
160 #define FACS_FLAG_LOCK_PENDING  1       /* 5.2.6.1 Global Lock */
161 #define FACS_FLAG_LOCK_OWNED    2
162         u_int32_t       flags;
163 #define FACS_FLAG_S4BIOS_F      1       /* Supports S4BIOS_SEQ */
164         u_int64_t       x_firm_wake_vec;
165         u_int8_t        version;
166         char            reserved[31];
167 } __packed;
168
169 struct MADT_local_apic {
170         u_char          cpu_id;
171         u_char          apic_id;
172         u_int32_t       flags;
173 #define ACPI_MADT_APIC_LOCAL_FLAG_ENABLED       1
174 } __packed;
175
176 struct MADT_io_apic {
177         u_char          apic_id;
178         u_char          reserved;
179         u_int32_t       apic_addr;
180         u_int32_t       int_base;
181 } __packed;
182
183 struct MADT_int_override {
184         u_char          bus;
185         u_char          source;
186         u_int32_t       intr;
187         u_int16_t       mps_flags;
188 #define MPS_INT_FLAG_POLARITY_MASK      0x3
189 #define MPS_INT_FLAG_POLARITY_CONFORM   0x0
190 #define MPS_INT_FLAG_POLARITY_HIGH      0x1
191 #define MPS_INT_FLAG_POLARITY_LOW       0x3
192 #define MPS_INT_FLAG_TRIGGER_MASK       0xc
193 #define MPS_INT_FLAG_TRIGGER_CONFORM    0x0
194 #define MPS_INT_FLAG_TRIGGER_EDGE       0x4
195 #define MPS_INT_FLAG_TRIGGER_LEVEL      0xc
196 } __packed;
197
198 struct MADT_nmi {
199         u_int16_t       mps_flags;
200         u_int32_t       intr;
201 } __packed;
202
203 struct MADT_local_nmi {
204         u_char          cpu_id;
205         u_int16_t       mps_flags;
206         u_char          lintpin;
207 } __packed;
208
209 struct MADT_local_apic_override {
210         u_char          reserved[2];
211         u_int64_t       apic_addr;
212 } __packed;
213
214 struct MADT_io_sapic {
215         u_char          apic_id;
216         u_char          reserved;
217         u_int32_t       int_base;
218         u_int64_t       apic_addr;
219 } __packed;
220
221 struct MADT_local_sapic {
222         u_char          cpu_id;
223         u_char          apic_id;
224         u_char          apic_eid;
225         u_char          reserved[3];
226         u_int32_t       flags;
227 } __packed;
228
229 struct MADT_int_src {
230         u_int16_t       mps_flags;
231         u_char          type;
232 #define ACPI_MADT_APIC_INT_SOURCE_PMI   1
233 #define ACPI_MADT_APIC_INT_SOURCE_INIT  2
234 #define ACPI_MADT_APIC_INT_SOURCE_CPEI  3       /* Corrected Platform Error */
235         u_char          cpu_id;
236         u_char          cpu_eid;
237         u_char          sapic_vector;
238         u_int32_t       intr;
239         u_char          reserved[4];
240 } __packed;
241
242 struct MADT_APIC {
243         u_char          type;
244 #define ACPI_MADT_APIC_TYPE_LOCAL_APIC  0
245 #define ACPI_MADT_APIC_TYPE_IO_APIC     1
246 #define ACPI_MADT_APIC_TYPE_INT_OVERRIDE 2
247 #define ACPI_MADT_APIC_TYPE_NMI         3
248 #define ACPI_MADT_APIC_TYPE_LOCAL_NMI   4
249 #define ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE 5
250 #define ACPI_MADT_APIC_TYPE_IO_SAPIC    6
251 #define ACPI_MADT_APIC_TYPE_LOCAL_SAPIC 7
252 #define ACPI_MADT_APIC_TYPE_INT_SRC     8
253         u_char          len;
254         union {
255                 struct MADT_local_apic local_apic;
256                 struct MADT_io_apic io_apic;
257                 struct MADT_int_override int_override;
258                 struct MADT_nmi nmi;
259                 struct MADT_local_nmi local_nmi;
260                 struct MADT_local_apic_override local_apic_override;
261                 struct MADT_io_sapic io_sapic;
262                 struct MADT_local_sapic local_sapic;
263                 struct MADT_int_src int_src;
264         } body;
265 } __packed;
266
267 struct MADTbody {
268         u_int32_t       lapic_addr;
269         u_int32_t       flags;
270 #define ACPI_APIC_FLAG_PCAT_COMPAT 1    /* System has dual-8259 setup. */
271         u_char          body[1];
272 } __packed;
273
274 struct HPETbody {
275         u_int32_t       block_hwrev:8,
276                         block_comparitors:5,
277                         block_counter_size:1,
278                         :1,
279                         block_legacy_capable:1,
280                         block_pcivendor:16;
281         struct ACPIgas  genaddr;
282         u_int8_t        hpet_number;
283         u_int16_t       clock_tick __packed;
284 } __packed;
285
286 /* Embedded Controller Description Table */
287 struct ECDTbody {
288         struct ACPIgas  ec_control;     /* Control register */
289         struct ACPIgas  ec_data;        /* Data register */
290         uint32_t        uid;            /* Same value as _UID in namespace */
291         uint8_t         gpe_bit;        /* GPE bit for the EC */
292         u_char          ec_id[1];       /* Variable length name string */
293 } __packed;
294
295 /* Memory Mapped PCI config space base allocation structure */
296 struct MCFGbody {
297         uint8_t         rsvd[8];
298         struct {
299                 uint64_t        baseaddr;       /* Base Address */
300                 uint16_t        seg_grp;        /* Segment group number */
301                 uint8_t         start;          /* Starting bus number */
302                 uint8_t         end;            /* Ending bus number */
303                 uint8_t         rsvd[4];        /* Reserved */
304         } s[1] __packed;
305 } __packed;
306
307 /*
308  * Addresses to scan on ia32 for the RSD PTR.  According to section 5.2.2
309  * of the ACPI spec, we only consider two regions for the base address:
310  * 1. EBDA (1 KB area addressed to by 16 bit pointer at 0x40E)
311  * 2. High memory (0xE0000 - 0xFFFFF)
312  */
313 #define RSDP_EBDA_PTR   0x40E
314 #define RSDP_EBDA_SIZE  0x400
315 #define RSDP_HI_START   0xE0000
316 #define RSDP_HI_SIZE    0x20000
317
318 /* Find and map the RSD PTR structure and return it for parsing */
319 struct ACPIsdt  *sdt_load_devmem(void);
320
321 /*
322  * Load the DSDT from a previous save file.  Note that other tables are
323  * not saved (i.e. FADT)
324  */
325 struct ACPIsdt  *dsdt_load_file(char *);
326
327 /* Save the DSDT to a file */
328 void             dsdt_save_file(char *, struct ACPIsdt *, struct ACPIsdt *);
329
330 /* Print out as many fixed tables as possible, given the RSD PTR */
331 void             sdt_print_all(struct ACPIsdt *);
332
333 /* Disassemble the AML in the DSDT */
334 void             aml_disassemble(struct ACPIsdt *, struct ACPIsdt *);
335
336 /* Routines for accessing tables in physical memory */
337 struct ACPIrsdp *acpi_find_rsd_ptr(void);
338 void            *acpi_map_physical(vm_offset_t, size_t);
339 struct ACPIsdt  *sdt_from_rsdt(struct ACPIsdt *, const char *,
340     struct ACPIsdt *);
341 struct ACPIsdt  *dsdt_from_fadt(struct FADTbody *);
342 int              acpi_checksum(void *, size_t);
343
344 /* Command line flags */
345 extern int      dflag;
346 extern int      tflag;
347 extern int      vflag;
348
349 #endif  /* !_ACPIDUMP_H_ */