1 /*
2  * Copyright (c) 2004, Intel Corporation.
3  * Copyright (c) 2006, Keir Fraser, XenSource Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published
7  * by the Free Software Foundation; version 2.1 only. with the special
8  * exception on linking described in file LICENSE.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  */
15 
16 #include "acpi2_0.h"
17 #include "../config.h"
18 
19 /*
20  * Firmware ACPI Control Structure (FACS).
21  */
22 
23 struct acpi_20_facs Facs = {
24     .signature = ACPI_2_0_FACS_SIGNATURE,
25     .length    = sizeof(struct acpi_20_facs),
26     .version   = ACPI_2_0_FACS_VERSION
27 };
28 
29 
30 /*
31  * Fixed ACPI Description Table (FADT).
32  */
33 
34 /*
35  * These values must match register definitions in struct hvm_hw_acpi
36  * (in xen/include/public/arch-x86/hvm/save.h).
37  */
38 #define ACPI_PM1A_EVT_BLK_BIT_WIDTH         0x20
39 #define ACPI_PM1A_EVT_BLK_BIT_OFFSET        0x00
40 #define ACPI_PM1A_CNT_BLK_BIT_WIDTH         0x10
41 #define ACPI_PM1A_CNT_BLK_BIT_OFFSET        0x00
42 #define ACPI_PM_TMR_BLK_BIT_WIDTH           0x20
43 #define ACPI_PM_TMR_BLK_BIT_OFFSET          0x00
44 
45 struct acpi_fadt Fadt = {
46     .header = {
47         .signature    = ACPI_FADT_SIGNATURE,
48         .oem_id       = ACPI_OEM_ID,
49         .oem_table_id = ACPI_OEM_TABLE_ID,
50         .oem_revision = ACPI_OEM_REVISION,
51         .creator_id   = ACPI_CREATOR_ID,
52         .creator_revision = ACPI_CREATOR_REVISION
53     },
54 
55     .sci_int = 9,
56 
57     .pm1a_evt_blk = ACPI_PM1A_EVT_BLK_ADDRESS_V1,
58     .pm1a_cnt_blk = ACPI_PM1A_CNT_BLK_ADDRESS_V1,
59     .pm_tmr_blk = ACPI_PM_TMR_BLK_ADDRESS_V1,
60     .gpe0_blk = ACPI_GPE0_BLK_ADDRESS_V1,
61     .pm1_evt_len = ACPI_PM1A_EVT_BLK_BIT_WIDTH / 8,
62     .pm1_cnt_len = ACPI_PM1A_CNT_BLK_BIT_WIDTH / 8,
63     .pm_tmr_len = ACPI_PM_TMR_BLK_BIT_WIDTH / 8,
64     .gpe0_blk_len = ACPI_GPE0_BLK_LEN_V1,
65 
66     .p_lvl2_lat = 0x0fff, /* >100,  means we do not support C2 state */
67     .p_lvl3_lat = 0x0fff, /* >1000, means we do not support C3 state */
68     .flags = (ACPI_PROC_C1 |
69               ACPI_WBINVD |
70               ACPI_FIX_RTC | ACPI_TMR_VAL_EXT |
71               ACPI_USE_PLATFORM_CLOCK),
72 
73     .reset_reg = {
74         .address_space_id    = ACPI_SYSTEM_IO,
75         .register_bit_width  = 8, /* *must* be 8 */
76         .register_bit_offset = 0, /* *must* be 0 */
77         .address             = 0xcf9
78     },
79     .reset_value = 6,
80 
81     .x_pm1a_evt_blk = {
82         .address_space_id    = ACPI_SYSTEM_IO,
83         .register_bit_width  = ACPI_PM1A_EVT_BLK_BIT_WIDTH,
84         .register_bit_offset = ACPI_PM1A_EVT_BLK_BIT_OFFSET,
85         .address             = ACPI_PM1A_EVT_BLK_ADDRESS_V1,
86     },
87 
88     .x_pm1a_cnt_blk = {
89         .address_space_id    = ACPI_SYSTEM_IO,
90         .register_bit_width  = ACPI_PM1A_CNT_BLK_BIT_WIDTH,
91         .register_bit_offset = ACPI_PM1A_CNT_BLK_BIT_OFFSET,
92         .address             = ACPI_PM1A_CNT_BLK_ADDRESS_V1,
93     },
94 
95     .x_pm_tmr_blk = {
96         .address_space_id    = ACPI_SYSTEM_IO,
97         .register_bit_width  = ACPI_PM_TMR_BLK_BIT_WIDTH,
98         .register_bit_offset = ACPI_PM_TMR_BLK_BIT_OFFSET,
99         .address             = ACPI_PM_TMR_BLK_ADDRESS_V1,
100     }
101 };
102 
103 struct acpi_20_rsdt Rsdt = {
104     .header = {
105         .signature    = ACPI_2_0_RSDT_SIGNATURE,
106         .length       = sizeof(struct acpi_header),
107         .revision     = ACPI_2_0_RSDT_REVISION,
108         .oem_id       = ACPI_OEM_ID,
109         .oem_table_id = ACPI_OEM_TABLE_ID,
110         .oem_revision = ACPI_OEM_REVISION,
111         .creator_id   = ACPI_CREATOR_ID,
112         .creator_revision = ACPI_CREATOR_REVISION
113     }
114 };
115 
116 struct acpi_20_xsdt Xsdt = {
117     .header = {
118         .signature    = ACPI_2_0_XSDT_SIGNATURE,
119         .length       = sizeof(struct acpi_header),
120         .revision     = ACPI_2_0_XSDT_REVISION,
121         .oem_id       = ACPI_OEM_ID,
122         .oem_table_id = ACPI_OEM_TABLE_ID,
123         .oem_revision = ACPI_OEM_REVISION,
124         .creator_id   = ACPI_CREATOR_ID,
125         .creator_revision = ACPI_CREATOR_REVISION
126     }
127 };
128 
129 
130 struct acpi_20_rsdp Rsdp = {
131     .signature = ACPI_2_0_RSDP_SIGNATURE,
132     .oem_id    = ACPI_OEM_ID,
133     .revision  = ACPI_2_0_RSDP_REVISION,
134     .length    = sizeof(struct acpi_20_rsdp)
135 };
136 
137 #define ACPI_WAET_RTC_NO_ACK        (1<<0) /* RTC requires no int acknowledge */
138 #define ACPI_WAET_TIMER_ONE_READ    (1<<1) /* PM timer requires only one read */
139 
140 /*
141  * The state of the RTC flag getting passed to the guest must be in
142  * sync with the mode selection in the hypervisor RTC emulation code.
143  */
144 #define ACPI_WAET_FLAGS (ACPI_WAET_RTC_NO_ACK | \
145                          ACPI_WAET_TIMER_ONE_READ)
146 
147 struct acpi_20_waet Waet = {
148     .header = {
149         .signature    = ACPI_2_0_WAET_SIGNATURE,
150         .length       = sizeof(struct acpi_20_waet),
151         .revision     = ACPI_2_0_WAET_REVISION,
152         .oem_id       = ACPI_OEM_ID,
153         .oem_table_id = ACPI_OEM_TABLE_ID,
154         .oem_revision = ACPI_OEM_REVISION,
155         .creator_id   = ACPI_CREATOR_ID,
156         .creator_revision = ACPI_CREATOR_REVISION
157     },
158     .flags = ACPI_WAET_FLAGS
159 };
160 
161 /*
162  * Local variables:
163  * mode: C
164  * c-file-style: "BSD"
165  * c-basic-offset: 4
166  * tab-width: 4
167  * indent-tabs-mode: nil
168  * End:
169  */
170