coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
lpc.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <console/console.h>
4 #include <device/device.h>
5 #include <device/pci.h>
6 #include <device/pci_ids.h>
7 #include <option.h>
8 #include <pc80/mc146818rtc.h>
9 #include <pc80/isa-dma.h>
10 #include <pc80/i8259.h>
11 #include <arch/io.h>
12 #include <device/mmio.h>
13 #include <device/pci_ops.h>
14 #include <arch/ioapic.h>
15 #include <acpi/acpi.h>
16 #include <elog.h>
17 #include <acpi/acpigen.h>
18 #include <cpu/x86/smm.h>
19 #include "chip.h"
20 #include "pch.h"
25 
26 #define NMI_OFF 0
27 
28 /**
29  * Set miscellaneous static southbridge features.
30  *
31  * @param dev PCI device with I/O APIC control registers
32  */
33 static void pch_enable_ioapic(struct device *dev)
34 {
35  /* affirm full set of redirection table entries ("write once") */
37 
39 }
40 
41 static void pch_enable_serial_irqs(struct device *dev)
42 {
43  /* Set packet length and toggle silent mode bit for one frame. */
45  (1 << 7) | (1 << 6) | ((21 - 17) << 2) | (0 << 0));
46 #if !CONFIG(SERIRQ_CONTINUOUS_MODE)
48  (1 << 7) | (0 << 6) | ((21 - 17) << 2) | (0 << 0));
49 #endif
50 }
51 
52 /* PIRQ[n]_ROUT[3:0] - PIRQ Routing Control
53  * 0x00 - 0000 = Reserved
54  * 0x01 - 0001 = Reserved
55  * 0x02 - 0010 = Reserved
56  * 0x03 - 0011 = IRQ3
57  * 0x04 - 0100 = IRQ4
58  * 0x05 - 0101 = IRQ5
59  * 0x06 - 0110 = IRQ6
60  * 0x07 - 0111 = IRQ7
61  * 0x08 - 1000 = Reserved
62  * 0x09 - 1001 = IRQ9
63  * 0x0A - 1010 = IRQ10
64  * 0x0B - 1011 = IRQ11
65  * 0x0C - 1100 = IRQ12
66  * 0x0D - 1101 = Reserved
67  * 0x0E - 1110 = IRQ14
68  * 0x0F - 1111 = IRQ15
69  * PIRQ[n]_ROUT[7] - PIRQ Routing Control
70  * 0x80 - The PIRQ is not routed.
71  */
72 
73 static void pch_pirq_init(struct device *dev)
74 {
75  struct device *irq_dev;
76  /*
77  * Interrupt 11 is not used by legacy devices and so can always be used for
78  * PCI interrupts. Full legacy IRQ routing is complicated and hard to
79  * get right. Fortunately all modern OS use MSI and so it's not that big of
80  * an issue anyway. Still we have to provide a reasonable default. Using
81  * interrupt 11 for it everywhere is a working default. ACPI-aware OS can
82  * move it to any interrupt and others will just leave them at default.
83  */
84  const u8 pirq_routing = 11;
85 
86  pci_write_config8(dev, PIRQA_ROUT, pirq_routing);
87  pci_write_config8(dev, PIRQB_ROUT, pirq_routing);
88  pci_write_config8(dev, PIRQC_ROUT, pirq_routing);
89  pci_write_config8(dev, PIRQD_ROUT, pirq_routing);
90 
91  pci_write_config8(dev, PIRQE_ROUT, pirq_routing);
92  pci_write_config8(dev, PIRQF_ROUT, pirq_routing);
93  pci_write_config8(dev, PIRQG_ROUT, pirq_routing);
94  pci_write_config8(dev, PIRQH_ROUT, pirq_routing);
95 
96  for (irq_dev = all_devices; irq_dev; irq_dev = irq_dev->next) {
97  u8 int_pin=0;
98 
99  if (!irq_dev->enabled || irq_dev->path.type != DEVICE_PATH_PCI)
100  continue;
101 
102  int_pin = pci_read_config8(irq_dev, PCI_INTERRUPT_PIN);
103 
104  if (int_pin == 0)
105  continue;
106 
107  pci_write_config8(irq_dev, PCI_INTERRUPT_LINE, pirq_routing);
108  }
109 }
110 
111 static void pch_gpi_routing(struct device *dev)
112 {
113  /* Get the chip configuration */
114  const struct southbridge_intel_ibexpeak_config *config = dev->chip_info;
115  u32 reg32 = 0;
116 
117  /* An array would be much nicer here, or some
118  * other method of doing this.
119  */
120  reg32 |= (config->gpi0_routing & 0x03) << 0;
121  reg32 |= (config->gpi1_routing & 0x03) << 2;
122  reg32 |= (config->gpi2_routing & 0x03) << 4;
123  reg32 |= (config->gpi3_routing & 0x03) << 6;
124  reg32 |= (config->gpi4_routing & 0x03) << 8;
125  reg32 |= (config->gpi5_routing & 0x03) << 10;
126  reg32 |= (config->gpi6_routing & 0x03) << 12;
127  reg32 |= (config->gpi7_routing & 0x03) << 14;
128  reg32 |= (config->gpi8_routing & 0x03) << 16;
129  reg32 |= (config->gpi9_routing & 0x03) << 18;
130  reg32 |= (config->gpi10_routing & 0x03) << 20;
131  reg32 |= (config->gpi11_routing & 0x03) << 22;
132  reg32 |= (config->gpi12_routing & 0x03) << 24;
133  reg32 |= (config->gpi13_routing & 0x03) << 26;
134  reg32 |= (config->gpi14_routing & 0x03) << 28;
135  reg32 |= (config->gpi15_routing & 0x03) << 30;
136 
137  pci_write_config32(dev, GPIO_ROUT, reg32);
138 }
139 
140 static void pch_power_options(struct device *dev)
141 {
142  u8 reg8;
143  u16 reg16, pmbase;
144  u32 reg32;
145  const char *state;
146  /* Get the chip configuration */
147  const struct southbridge_intel_ibexpeak_config *config = dev->chip_info;
148 
149  /* Which state do we want to goto after g3 (power restored)?
150  * 0 == S0 Full On
151  * 1 == S5 Soft Off
152  *
153  * If the option is not existent (Laptops), use Kconfig setting.
154  */
155  const unsigned int pwr_on = get_uint_option("power_on_after_fail",
156  CONFIG_MAINBOARD_POWER_FAILURE_STATE);
157 
158  reg16 = pci_read_config16(dev, GEN_PMCON_3);
159  reg16 &= 0xfffe;
160  switch (pwr_on) {
161  case MAINBOARD_POWER_OFF:
162  reg16 |= 1;
163  state = "off";
164  break;
165  case MAINBOARD_POWER_ON:
166  reg16 &= ~1;
167  state = "on";
168  break;
170  reg16 &= ~1;
171  state = "state keep";
172  break;
173  default:
174  state = "undefined";
175  }
176 
177  reg16 &= ~(3 << 4); /* SLP_S4# Assertion Stretch 4s */
178  reg16 |= (1 << 3); /* SLP_S4# Assertion Stretch Enable */
179 
180  reg16 &= ~(1 << 10);
181  reg16 |= (1 << 11); /* SLP_S3# Min Assertion Width 50ms */
182 
183  reg16 |= (1 << 12); /* Disable SLP stretch after SUS well */
184 
185  pci_write_config16(dev, GEN_PMCON_3, reg16);
186  printk(BIOS_INFO, "Set power %s after power failure.\n", state);
187 
188  /* Set up NMI on errors. */
189  reg8 = inb(0x61);
190  reg8 &= 0x0f; /* Higher Nibble must be 0 */
191  reg8 &= ~(1 << 3); /* IOCHK# NMI Enable */
192  // reg8 &= ~(1 << 2); /* PCI SERR# Enable */
193  reg8 |= (1 << 2); /* PCI SERR# Disable for now */
194  outb(reg8, 0x61);
195 
196  reg8 = inb(0x70);
197  const unsigned int nmi_option = get_uint_option("nmi", NMI_OFF);
198  if (nmi_option) {
199  printk(BIOS_INFO, "NMI sources enabled.\n");
200  reg8 &= ~(1 << 7); /* Set NMI. */
201  } else {
202  printk(BIOS_INFO, "NMI sources disabled.\n");
203  reg8 |= (1 << 7); /* Can't mask NMI from PCI-E and NMI_NOW */
204  }
205  outb(reg8, 0x70);
206 
207  /* Enable CPU_SLP# and Intel Speedstep, set SMI# rate down */
208  reg16 = pci_read_config16(dev, GEN_PMCON_1);
209  reg16 &= ~(3 << 0); // SMI# rate 1 minute
210  reg16 &= ~(1 << 10); // Disable BIOS_PCI_EXP_EN for native PME
211  if (CONFIG(DEBUG_PERIODIC_SMI))
212  reg16 |= (3 << 0); // Periodic SMI every 8s
213  pci_write_config16(dev, GEN_PMCON_1, reg16);
214 
215  // Set the board's GPI routing.
216  pch_gpi_routing(dev);
217 
218  pmbase = pci_read_config16(dev, 0x40) & 0xfffe;
219 
220  outl(config->gpe0_en, pmbase + GPE0_EN);
221  outw(config->alt_gp_smi_en, pmbase + ALT_GP_SMI_EN);
222 
223  /* Set up power management block and determine sleep mode */
224  reg32 = inl(pmbase + 0x04); // PM1_CNT
225  reg32 &= ~(7 << 10); // SLP_TYP
226  reg32 |= (1 << 0); // SCI_EN
227  outl(reg32, pmbase + 0x04);
228 
229  /* Clear magic status bits to prevent unexpected wake */
230  reg32 = RCBA32(PRSTS);
231  reg32 |= (1 << 5) | (1 << 4) | (1 << 0);
232  RCBA32(PRSTS) = reg32;
233 
234  /* FIXME: Does this even exist? */
235  reg32 = RCBA32(0x3f02);
236  reg32 &= ~0xf;
237  RCBA32(0x3f02) = reg32;
238 }
239 
240 static void pch_rtc_init(struct device *dev)
241 {
242  u8 reg8;
243  int rtc_failed;
244 
245  reg8 = pci_read_config8(dev, GEN_PMCON_3);
246  rtc_failed = reg8 & RTC_BATTERY_DEAD;
247  if (rtc_failed) {
248  reg8 &= ~RTC_BATTERY_DEAD;
249  pci_write_config8(dev, GEN_PMCON_3, reg8);
251  }
252  printk(BIOS_DEBUG, "rtc_failed = 0x%x\n", rtc_failed);
253 
255 }
256 
257 static void mobile5_pm_init(struct device *dev)
258 {
259  int i;
260 
261  printk(BIOS_DEBUG, "Mobile 5 PM init\n");
262  pci_write_config8(dev, 0xa9, 0x47);
263 
264  RCBA32(0x1d44) = 0x00000000;
265  (void)RCBA32(0x1d44);
266  RCBA32(0x1d48) = 0x00030000;
267  (void)RCBA32(0x1d48);
268  RCBA32(0x1e80) = 0x000c0801;
269  (void)RCBA32(0x1e80);
270  RCBA32(0x1e84) = 0x000200f0;
271  (void)RCBA32(0x1e84);
272 
273  const u32 rcba2010[] = {
274  /* 2010: */ 0x00188200, 0x14000016, 0xbc4abcb5, 0x00000000,
275  /* 2020: */ 0xf0c9605b, 0x13683040, 0x04c8f16e, 0x09e90170
276  };
277  for (i = 0; i < ARRAY_SIZE(rcba2010); i++) {
278  RCBA32(0x2010 + 4 * i) = rcba2010[i];
279  RCBA32(0x2010 + 4 * i);
280  }
281 
282  RCBA32(0x2100) = 0x00000000;
283  (void)RCBA32(0x2100);
284  RCBA32(0x2104) = 0x00000757;
285  (void)RCBA32(0x2104);
286  RCBA32(0x2108) = 0x00170001;
287  (void)RCBA32(0x2108);
288 
289  RCBA32(0x211c) = 0x00000000;
290  (void)RCBA32(0x211c);
291  RCBA32(0x2120) = 0x00010000;
292  (void)RCBA32(0x2120);
293 
294  RCBA32(0x21fc) = 0x00000000;
295  (void)RCBA32(0x21fc);
296  RCBA32(0x2200) = 0x20000044;
297  (void)RCBA32(0x2200);
298  RCBA32(0x2204) = 0x00000001;
299  (void)RCBA32(0x2204);
300  RCBA32(0x2208) = 0x00003457;
301  (void)RCBA32(0x2208);
302 
303  const u32 rcba2210[] = {
304  /* 2210 */ 0x00000000, 0x00000001, 0xa0fff210, 0x0000df00,
305  /* 2220 */ 0x00e30880, 0x00000070, 0x00004000, 0x00000000,
306  /* 2230 */ 0x00e30880, 0x00000070, 0x00004000, 0x00000000,
307  /* 2240 */ 0x00002301, 0x36000000, 0x00010107, 0x00160000,
308  /* 2250 */ 0x00001b01, 0x36000000, 0x00010107, 0x00160000,
309  /* 2260 */ 0x00000601, 0x16000000, 0x00010107, 0x00160000,
310  /* 2270 */ 0x00001c01, 0x16000000, 0x00010107, 0x00160000
311  };
312 
313  for (i = 0; i < ARRAY_SIZE(rcba2210); i++) {
314  RCBA32(0x2210 + 4 * i) = rcba2210[i];
315  RCBA32(0x2210 + 4 * i);
316  }
317 
318  const u32 rcba2300[] = {
319  /* 2300: */ 0x00000000, 0x40000000, 0x4646827b, 0x6e803131,
320  /* 2310: */ 0x32c77887, 0x00077733, 0x00007447, 0x00000040,
321  /* 2320: */ 0xcccc0cfc, 0x0fbb0fff
322  };
323 
324  for (i = 0; i < ARRAY_SIZE(rcba2300); i++) {
325  RCBA32(0x2300 + 4 * i) = rcba2300[i];
326  RCBA32(0x2300 + 4 * i);
327  }
328 
329  RCBA32(0x37fc) = 0x00000000;
330  (void)RCBA32(0x37fc);
331  RCBA32(0x3dfc) = 0x00000000;
332  (void)RCBA32(0x3dfc);
333  RCBA32(0x3e7c) = 0xffffffff;
334  (void)RCBA32(0x3e7c);
335  RCBA32(0x3efc) = 0x00000000;
336  (void)RCBA32(0x3efc);
337  RCBA32(0x3f00) = 0x0000010b;
338  (void)RCBA32(0x3f00);
339 }
340 
341 static void enable_hpet(void)
342 {
343  u32 reg32;
344 
345  /* Move HPET to default address 0xfed00000 and enable it */
346  reg32 = RCBA32(HPTC);
347  reg32 |= (1 << 7); // HPET Address Enable
348  reg32 &= ~(3 << 0);
349  RCBA32(HPTC) = reg32;
350  RCBA32(HPTC); /* Read back for it to work */
351 
352  write32((u32 *)0xfed00010, read32((u32 *)0xfed00010) | 1);
353 }
354 
355 static void enable_clock_gating(struct device *dev)
356 {
357  u32 reg32;
358  u16 reg16;
359 
360  RCBA32_AND_OR(0x2234, ~0UL, 0xf);
361 
362  reg16 = pci_read_config16(dev, GEN_PMCON_1);
363  reg16 |= (1 << 2) | (1 << 11);
364  pci_write_config16(dev, GEN_PMCON_1, reg16);
365 
366  reg32 = RCBA32(CG);
367  reg32 |= (1 << 31);
368  reg32 |= (1 << 29) | (1 << 28);
369  reg32 |= (1 << 27) | (1 << 26) | (1 << 25) | (1 << 24);
370  reg32 |= (1 << 16);
371  reg32 |= (1 << 17);
372  reg32 |= (1 << 18);
373  reg32 |= (1 << 22);
374  reg32 |= (1 << 23);
375  reg32 &= ~(1 << 20);
376  reg32 |= (1 << 19);
377  reg32 |= (1 << 0);
378  reg32 |= (0xf << 1);
379  RCBA32(CG) = reg32;
380 
381  RCBA32_OR(0x38c0, 0x7);
382  RCBA32_OR(0x36d4, 0x6680c004);
383  RCBA32_OR(0x3564, 0x3);
384 }
385 
386 static void pch_set_acpi_mode(void)
387 {
388  if (!acpi_is_wakeup_s3()) {
390  }
391 }
392 
393 static void pch_fixups(struct device *dev)
394 {
395  /*
396  * Enable DMI ASPM in the PCH
397  */
398  RCBA32_AND_OR(0x2304, ~(1 << 10), 0);
399  RCBA32_OR(0x21a4, (1 << 11)|(1 << 10));
400  RCBA32_OR(0x21a8, 0x3);
401 }
402 
403 static void lpc_init(struct device *dev)
404 {
405  printk(BIOS_DEBUG, "pch: %s\n", __func__);
406 
407  /* IO APIC initialization. */
408  pch_enable_ioapic(dev);
409 
411 
412  /* Setup the PIRQ. */
413  pch_pirq_init(dev);
414 
415  /* Setup power options. */
416  pch_power_options(dev);
417 
418  /* Initialize power management */
419  mobile5_pm_init(dev);
420 
421  /* Initialize the real time clock. */
422  pch_rtc_init(dev);
423 
424  /* Initialize ISA DMA. */
425  isa_dma_init();
426 
427  /* Initialize the High Precision Event Timers, if present. */
428  enable_hpet();
429 
430  /* Initialize Clock Gating */
431  enable_clock_gating(dev);
432 
433  setup_i8259();
434 
435  /* The OS should do this? */
436  /* Interrupt 9 should be level triggered (SCI) */
438 
440 
441  pch_fixups(dev);
442 }
443 
444 static void pch_lpc_read_resources(struct device *dev)
445 {
446  struct resource *res;
447  const struct southbridge_intel_ibexpeak_config *config = dev->chip_info;
448  u8 io_index = 0;
449 
450  /* Get the normal PCI resources of this device. */
452 
453  /* Add an extra subtractive resource for both memory and I/O. */
454  res = new_resource(dev, IOINDEX_SUBTRACTIVE(io_index++, 0));
455  res->base = 0;
456  res->size = 0x1000;
459 
460  res = new_resource(dev, IOINDEX_SUBTRACTIVE(io_index++, 0));
461  res->base = 0xff800000;
462  res->size = 0x00800000; /* 8 MB for flash */
465 
466  res = new_resource(dev, 3); /* IOAPIC */
467  res->base = IO_APIC_ADDR;
468  res->size = 0x00001000;
470 
471  /* Set PCH IO decode ranges if required.*/
472  if ((config->gen1_dec & 0xFFFC) > 0x1000) {
473  res = new_resource(dev, IOINDEX_SUBTRACTIVE(io_index++, 0));
474  res->base = config->gen1_dec & 0xFFFC;
475  res->size = (config->gen1_dec >> 16) & 0xFC;
478  }
479 
480  if ((config->gen2_dec & 0xFFFC) > 0x1000) {
481  res = new_resource(dev, IOINDEX_SUBTRACTIVE(io_index++, 0));
482  res->base = config->gen2_dec & 0xFFFC;
483  res->size = (config->gen2_dec >> 16) & 0xFC;
486  }
487 
488  if ((config->gen3_dec & 0xFFFC) > 0x1000) {
489  res = new_resource(dev, IOINDEX_SUBTRACTIVE(io_index++, 0));
490  res->base = config->gen3_dec & 0xFFFC;
491  res->size = (config->gen3_dec >> 16) & 0xFC;
494  }
495 
496  if ((config->gen4_dec & 0xFFFC) > 0x1000) {
497  res = new_resource(dev, IOINDEX_SUBTRACTIVE(io_index++, 0));
498  res->base = config->gen4_dec & 0xFFFC;
499  res->size = (config->gen4_dec >> 16) & 0xFC;
502  }
503 }
504 
505 static void pch_lpc_enable(struct device *dev)
506 {
507  /* Enable PCH Display Port */
508  RCBA16(DISPBDF) = 0x0010;
510 
511  pch_enable(dev);
512 }
513 
514 static const char *lpc_acpi_name(const struct device *dev)
515 {
516  return "LPCB";
517 }
518 
519 static void southbridge_fill_ssdt(const struct device *device)
520 {
521  struct device *dev = pcidev_on_root(0x1f, 0);
522  struct southbridge_intel_ibexpeak_config *chip = dev->chip_info;
523 
524  intel_acpi_pcie_hotplug_generator(chip->pcie_hotplug_map, 8);
526 }
527 
528 static void lpc_final(struct device *dev)
529 {
531 
532  /* Call SMM finalize() handlers before resume */
533  if (CONFIG(INTEL_CHIPSET_LOCKDOWN) ||
534  acpi_is_wakeup_s3()) {
536  }
537 }
538 
539 static struct device_operations device_ops = {
541  .set_resources = pci_dev_set_resources,
542  .enable_resources = pci_dev_enable_resources,
543  .acpi_fill_ssdt = southbridge_fill_ssdt,
544  .acpi_name = lpc_acpi_name,
545  .write_acpi_tables = acpi_write_hpet,
546  .init = lpc_init,
547  .final = lpc_final,
548  .enable = pch_lpc_enable,
549  .scan_bus = scan_static_bus,
550  .ops_pci = &pci_dev_ops_pci,
551 };
552 
553 static const unsigned short pci_device_ids[] = {
566  0
567 };
568 
569 static const struct pci_driver pch_lpc __pci_driver = {
570  .ops = &device_ops,
571  .vendor = PCI_VID_INTEL,
572  .devices = pci_device_ids,
573 };
unsigned long acpi_write_hpet(const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
Definition: acpi.c:1141
#define GPE0_EN(x)
Definition: pm.h:99
static int acpi_is_wakeup_s3(void)
Definition: acpi.h:9
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define VIO_APIC_VADDR
Definition: ioapic.h:7
#define IO_APIC_ADDR
Definition: ioapic.h:6
void setup_ioapic(void *ioapic_base, u8 ioapic_id)
Definition: ioapic.c:160
void ioapic_lock_max_vectors(void *ioapic_base)
Definition: ioapic.c:65
#define GPIO_ROUT
Definition: pm.h:96
#define MAINBOARD_POWER_ON
Definition: pm.h:94
#define MAINBOARD_POWER_OFF
Definition: pm.h:93
#define MAINBOARD_POWER_KEEP
Definition: pm.h:95
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define ELOG_TYPE_RTC_RESET
Definition: elog.h:139
#define printk(level,...)
Definition: stdlib.h:16
u8 inb(u16 port)
void outb(u8 val, u16 port)
u32 inl(u16 port)
void outl(u32 val, u16 port)
void outw(u16 val, u16 port)
DEVTREE_CONST struct device *DEVTREE_CONST all_devices
Linked list of ALL devices.
Definition: device_const.c:13
DEVTREE_CONST struct device * pcidev_on_root(uint8_t dev, uint8_t fn)
Definition: device_const.c:260
struct resource * new_resource(struct device *dev, unsigned int index)
See if a resource structure already exists for a given index and if not allocate one.
Definition: device_util.c:346
int elog_add_event(u8 event_type)
Definition: elog.c:863
@ CONFIG
Definition: dsi_common.h:201
static struct tpm_chip chip
Definition: tis.c:17
void setup_i8259(void)
Definition: i8259.c:46
void i8259_configure_irq_trigger(int int_num, int is_level_triggered)
Configure IRQ triggering in the i8259 compatible Interrupt Controller.
Definition: i8259.c:99
#define APM_CNT_ACPI_DISABLE
Definition: smm.h:21
#define APM_CNT_FINALIZE
Definition: smm.h:24
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline u8 pci_read_config8(const struct device *dev, u16 reg)
Definition: pci_ops.h:46
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
static __always_inline void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Definition: pci_ops.h:64
#define PRSTS
Definition: pmc.h:77
#define RTC_BATTERY_DEAD
Definition: pmc.h:61
void isa_dma_init(void)
Definition: isa-dma.c:35
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
enum board_config config
Definition: memory.c:448
void cmos_init(bool invalid)
Definition: mc146818rtc.c:156
state
Definition: raminit.c:1787
unsigned int get_uint_option(const char *name, const unsigned int fallback)
Definition: option.c:116
@ DEVICE_PATH_PCI
Definition: path.h:9
#define PCI_INTERRUPT_PIN
Definition: pci_def.h:95
#define PCI_INTERRUPT_LINE
Definition: pci_def.h:94
void pci_dev_enable_resources(struct device *dev)
Definition: pci_device.c:721
void pci_dev_read_resources(struct device *dev)
Definition: pci_device.c:534
struct pci_operations pci_dev_ops_pci
Default device operation for PCI devices.
Definition: pci_device.c:911
void pci_dev_set_resources(struct device *dev)
Definition: pci_device.c:691
#define PCI_DID_INTEL_IBEXPEAK_LPC_3400
Definition: pci_ids.h:2804
#define PCI_DID_INTEL_IBEXPEAK_LPC_H57
Definition: pci_ids.h:2799
#define PCI_DID_INTEL_IBEXPEAK_LPC_Q57
Definition: pci_ids.h:2801
#define PCI_DID_INTEL_IBEXPEAK_LPC_P55
Definition: pci_ids.h:2795
#define PCI_DID_INTEL_IBEXPEAK_LPC_HM55
Definition: pci_ids.h:2800
#define PCI_DID_INTEL_IBEXPEAK_LPC_HM57
Definition: pci_ids.h:2802
#define PCI_DID_INTEL_IBEXPEAK_LPC_PM55
Definition: pci_ids.h:2796
#define PCI_DID_INTEL_IBEXPEAK_LPC_QM57
Definition: pci_ids.h:2798
#define PCI_DID_INTEL_IBEXPEAK_LPC_3450
Definition: pci_ids.h:2806
#define PCI_DID_INTEL_IBEXPEAK_LPC_QS57
Definition: pci_ids.h:2803
#define PCI_VID_INTEL
Definition: pci_ids.h:2157
#define PCI_DID_INTEL_IBEXPEAK_LPC_H55
Definition: pci_ids.h:2797
#define PCI_DID_INTEL_IBEXPEAK_LPC_3420
Definition: pci_ids.h:2805
void intel_acpi_pcie_hotplug_generator(u8 *hotplug_map, int port_number)
Definition: pciehp.c:11
void intel_acpi_gen_def_acpi_pirq(const struct device *lpc)
Definition: rcba_pirq.c:46
#define IORESOURCE_MEM
Definition: resource.h:10
#define IORESOURCE_SUBTRACTIVE
Definition: resource.h:24
#define IORESOURCE_ASSIGNED
Definition: resource.h:34
#define IORESOURCE_IO
Definition: resource.h:9
#define IOINDEX_SUBTRACTIVE(IDX, LINK)
Definition: resource.h:57
#define IORESOURCE_FIXED
Definition: resource.h:36
void scan_static_bus(struct device *bus)
Definition: root_device.c:89
int apm_control(u8 cmd)
Definition: smi_trigger.c:31
#define SERIRQ_CNTL
Definition: espi.h:21
static int rtc_failed(uint32_t gen_pmcon_b)
Definition: pmutil.c:169
#define PIRQE_ROUT
Definition: lpc.h:30
#define PIRQG_ROUT
Definition: lpc.h:32
#define GEN_PMCON_3
Definition: lpc.h:63
#define PIRQB_ROUT
Definition: lpc.h:27
#define GEN_PMCON_1
Definition: lpc.h:56
#define PIRQD_ROUT
Definition: lpc.h:29
#define PIRQC_ROUT
Definition: lpc.h:28
#define PIRQH_ROUT
Definition: lpc.h:33
#define PIRQA_ROUT
Definition: lpc.h:26
#define PIRQF_ROUT
Definition: lpc.h:31
#define CG
Definition: rcba.h:129
#define PCH_ENABLE_DBDF
Definition: rcba.h:150
#define FD2
Definition: rcba.h:128
#define HPTC
Definition: rcba.h:121
#define DISPBDF
Definition: rcba.h:127
void pch_enable(struct device *dev)
Definition: pch.c:404
#define ALT_GP_SMI_EN
Definition: pch.h:461
#define RCBA32_OR(x, or)
Definition: rcba.h:22
#define RCBA32_AND_OR(x, and, or)
Definition: rcba.h:21
#define RCBA16(x)
Definition: rcba.h:13
#define RCBA32(x)
Definition: rcba.h:14
void spi_finalize_ops(void)
Definition: spi.c:1039
static u16 pmbase
Definition: smi.c:27
static void enable_hpet(void)
Definition: lpc.c:341
static void pch_power_options(struct device *dev)
Definition: lpc.c:140
static void lpc_final(struct device *dev)
Definition: lpc.c:528
static const char * lpc_acpi_name(const struct device *dev)
Definition: lpc.c:514
static struct device_operations device_ops
Definition: lpc.c:539
static void pch_lpc_read_resources(struct device *dev)
Definition: lpc.c:444
static void southbridge_fill_ssdt(const struct device *device)
Definition: lpc.c:519
static void pch_enable_serial_irqs(struct device *dev)
Definition: lpc.c:41
static void enable_clock_gating(struct device *dev)
Definition: lpc.c:355
static void pch_rtc_init(struct device *dev)
Definition: lpc.c:240
static void pch_set_acpi_mode(void)
Definition: lpc.c:386
static void lpc_init(struct device *dev)
Definition: lpc.c:403
static const struct pci_driver pch_lpc __pci_driver
Definition: lpc.c:569
static const unsigned short pci_device_ids[]
Definition: lpc.c:553
static void pch_lpc_enable(struct device *dev)
Definition: lpc.c:505
static void pch_enable_ioapic(struct device *dev)
Set miscellaneous static southbridge features.
Definition: lpc.c:33
static void pch_pirq_init(struct device *dev)
Definition: lpc.c:73
static void pch_fixups(struct device *dev)
Definition: lpc.c:393
static void mobile5_pm_init(struct device *dev)
Definition: lpc.c:257
#define NMI_OFF
Definition: lpc.c:26
static void pch_gpi_routing(struct device *dev)
Definition: lpc.c:111
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
void(* read_resources)(struct device *dev)
Definition: device.h:39
enum device_path_type type
Definition: path.h:114
Definition: device.h:107
struct device_path path
Definition: device.h:115
DEVTREE_CONST struct device * next
Definition: device.h:113
DEVTREE_CONST void * chip_info
Definition: device.h:164
unsigned int enabled
Definition: device.h:122
unsigned long flags
Definition: resource.h:49
resource_t base
Definition: resource.h:45
resource_t size
Definition: resource.h:46
typedef void(X86APIP X86EMU_intrFuncs)(int num)