coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
conf_mode.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <arch/io.h>
4 #include <device/device.h>
5 #include <superio/conf_mode.h>
6 #include <acpi/acpigen.h>
7 
8 /* Common enter/exit implementations */
9 
10 void pnp_enter_conf_mode_55(struct device *dev)
11 {
12  outb(0x55, dev->path.pnp.port);
13 }
14 
16 {
17  outb(0x67, dev->path.pnp.port);
18  outb(0x67, dev->path.pnp.port);
19 }
20 
22 {
23  outb(0x77, dev->path.pnp.port);
24  outb(0x77, dev->path.pnp.port);
25 }
26 
28 {
29  outb(0x87, dev->path.pnp.port);
30  outb(0x87, dev->path.pnp.port);
31 }
32 
34 {
35  outb(0xa0, dev->path.pnp.port);
36  outb(0xa0, dev->path.pnp.port);
37 }
38 
40 {
41  outb(0xa5, dev->path.pnp.port);
42  outb(0xa5, dev->path.pnp.port);
43 }
44 
45 void pnp_exit_conf_mode_aa(struct device *dev)
46 {
47  outb(0xaa, dev->path.pnp.port);
48 }
49 
51 {
52  outb(0x87, dev->path.pnp.port);
53  outb(0x01, dev->path.pnp.port);
54  outb(0x55, dev->path.pnp.port);
55 
56  if (dev->path.pnp.port == 0x4e)
57  outb(0xaa, dev->path.pnp.port);
58  else
59  outb(0x55, dev->path.pnp.port);
60 }
61 
63 {
64  pnp_write_config(dev, 0x02, (1 << 1));
65 }
66 
67 /* Functions for ACPI */
68 #if CONFIG(HAVE_ACPI_TABLES)
69 static void pnp_ssdt_enter_conf_mode_55(struct device *dev, const char *idx, const char *data)
70 {
72  acpigen_write_byte(0x55);
74 }
75 
76 static void pnp_ssdt_enter_conf_mode_6767(struct device *dev, const char *idx, const char *data)
77 {
79  acpigen_write_byte(0x67);
81 
83  acpigen_write_byte(0x67);
85 }
86 
87 static void pnp_ssdt_enter_conf_mode_7777(struct device *dev, const char *idx, const char *data)
88 {
90  acpigen_write_byte(0x77);
92 
94  acpigen_write_byte(0x77);
96 }
97 
98 static void pnp_ssdt_enter_conf_mode_8787(struct device *dev, const char *idx, const char *data)
99 {
101  acpigen_write_byte(0x87);
103 
105  acpigen_write_byte(0x87);
107 }
108 
109 static void pnp_ssdt_enter_conf_mode_a0a0(struct device *dev, const char *idx, const char *data)
110 {
112  acpigen_write_byte(0xa0);
114 
116  acpigen_write_byte(0xa0);
118 
119 }
120 
121 static void pnp_ssdt_enter_conf_mode_a5a5(struct device *dev, const char *idx, const char *data)
122 {
124  acpigen_write_byte(0xa5);
126 
128  acpigen_write_byte(0xa5);
130 }
131 
132 static void pnp_ssdt_enter_conf_mode_870155aa(struct device *dev,
133  const char *idx, const char *data)
134 {
136  acpigen_write_byte(0x87);
138 
140  acpigen_write_byte(0x01);
142 
144  acpigen_write_byte(0x55);
146 
148  if (dev->path.pnp.port == 0x4e)
149  acpigen_write_byte(0xaa);
150  else
151  acpigen_write_byte(0x55);
153 }
154 
155 static void pnp_ssdt_exit_conf_mode_aa(struct device *dev, const char *idx, const char *data)
156 {
158  acpigen_write_byte(0xaa);
160 }
161 
162 static void pnp_ssdt_exit_conf_mode_0202(struct device *dev, const char *idx, const char *data)
163 {
164 
166  acpigen_write_byte(0x02);
168 
170  acpigen_write_byte(0x02);
172 }
173 #endif
174 
175 const struct pnp_mode_ops pnp_conf_mode_55_aa = {
177  .exit_conf_mode = pnp_exit_conf_mode_aa,
178 #if CONFIG(HAVE_ACPI_TABLES)
179  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_55,
180  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_aa,
181 #endif
182 };
183 
184 const struct pnp_mode_ops pnp_conf_mode_6767_aa = {
186  .exit_conf_mode = pnp_exit_conf_mode_aa,
187 #if CONFIG(HAVE_ACPI_TABLES)
188  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_6767,
189  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_aa,
190 #endif
191 };
192 
193 const struct pnp_mode_ops pnp_conf_mode_7777_aa = {
195  .exit_conf_mode = pnp_exit_conf_mode_aa,
196 #if CONFIG(HAVE_ACPI_TABLES)
197  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_7777,
198  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_aa,
199 #endif
200 };
201 
202 const struct pnp_mode_ops pnp_conf_mode_8787_aa = {
204  .exit_conf_mode = pnp_exit_conf_mode_aa,
205 #if CONFIG(HAVE_ACPI_TABLES)
206  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_8787,
207  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_aa,
208 #endif
209 };
210 
211 const struct pnp_mode_ops pnp_conf_mode_a0a0_aa = {
213  .exit_conf_mode = pnp_exit_conf_mode_aa,
214 #if CONFIG(HAVE_ACPI_TABLES)
215  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_a0a0,
216  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_aa,
217 #endif
218 };
219 
220 const struct pnp_mode_ops pnp_conf_mode_a5a5_aa = {
222  .exit_conf_mode = pnp_exit_conf_mode_aa,
223 #if CONFIG(HAVE_ACPI_TABLES)
224  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_a5a5,
225  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_aa,
226 #endif
227 };
228 
229 const struct pnp_mode_ops pnp_conf_mode_870155_aa = {
231  .exit_conf_mode = pnp_exit_conf_mode_0202,
232 #if CONFIG(HAVE_ACPI_TABLES)
233  .ssdt_enter_conf_mode = pnp_ssdt_enter_conf_mode_870155aa,
234  .ssdt_exit_conf_mode = pnp_ssdt_exit_conf_mode_0202,
235 #endif
236 };
void acpigen_emit_namestring(const char *namepath)
Definition: acpigen.c:275
void acpigen_write_store(void)
Definition: acpigen.c:1333
void acpigen_write_byte(unsigned int data)
Definition: acpigen.c:96
void pnp_enter_conf_mode_870155aa(struct device *dev)
Definition: conf_mode.c:50
void pnp_enter_conf_mode_8787(struct device *dev)
Definition: conf_mode.c:27
const struct pnp_mode_ops pnp_conf_mode_8787_aa
Definition: conf_mode.c:202
void pnp_enter_conf_mode_6767(struct device *dev)
Definition: conf_mode.c:15
const struct pnp_mode_ops pnp_conf_mode_a5a5_aa
Definition: conf_mode.c:220
const struct pnp_mode_ops pnp_conf_mode_6767_aa
Definition: conf_mode.c:184
void pnp_enter_conf_mode_55(struct device *dev)
Definition: conf_mode.c:10
const struct pnp_mode_ops pnp_conf_mode_55_aa
Definition: conf_mode.c:175
void pnp_enter_conf_mode_a0a0(struct device *dev)
Definition: conf_mode.c:33
const struct pnp_mode_ops pnp_conf_mode_870155_aa
Definition: conf_mode.c:229
void pnp_enter_conf_mode_7777(struct device *dev)
Definition: conf_mode.c:21
const struct pnp_mode_ops pnp_conf_mode_7777_aa
Definition: conf_mode.c:193
void pnp_exit_conf_mode_0202(struct device *dev)
Definition: conf_mode.c:62
void pnp_exit_conf_mode_aa(struct device *dev)
Definition: conf_mode.c:45
void pnp_enter_conf_mode_a5a5(struct device *dev)
Definition: conf_mode.c:39
const struct pnp_mode_ops pnp_conf_mode_a0a0_aa
Definition: conf_mode.c:211
void outb(u8 val, u16 port)
void pnp_write_config(struct device *dev, u8 reg, u8 value)
Definition: pnp_device.c:38
struct pnp_path pnp
Definition: path.h:117
Definition: device.h:107
struct device_path path
Definition: device.h:115
void(* enter_conf_mode)(struct device *dev)
Definition: pnp.h:74
unsigned int port
Definition: path.h:58