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/pci_ops.h>
13 #include <arch/ioapic.h>
14 #include <acpi/acpi.h>
15 #include <cpu/x86/smm.h>
16 #include <acpi/acpigen.h>
17 #include "chip.h"
18 #include "i82801ix.h"
23 
24 #define NMI_OFF 0
25 
27 
28 static void i82801ix_enable_apic(struct device *dev)
29 {
30  /* Enable IOAPIC. Keep APIC Range Select at zero. */
31  RCBA8(0x31ff) = 0x03;
32  /* We have to read 0x31ff back if bit0 changed. */
33  RCBA8(0x31ff);
34 
35  /* Lock maximum redirection entries (MRE), R/WO register. */
37 
38  setup_ioapic(VIO_APIC_VADDR, 2); /* ICH7 code uses id 2. */
39 }
40 
41 static void i82801ix_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 }
47 
48 /* PIRQ[n]_ROUT[3:0] - PIRQ Routing Control
49  * 0x00 - 0000 = Reserved
50  * 0x01 - 0001 = Reserved
51  * 0x02 - 0010 = Reserved
52  * 0x03 - 0011 = IRQ3
53  * 0x04 - 0100 = IRQ4
54  * 0x05 - 0101 = IRQ5
55  * 0x06 - 0110 = IRQ6
56  * 0x07 - 0111 = IRQ7
57  * 0x08 - 1000 = Reserved
58  * 0x09 - 1001 = IRQ9
59  * 0x0A - 1010 = IRQ10
60  * 0x0B - 1011 = IRQ11
61  * 0x0C - 1100 = IRQ12
62  * 0x0D - 1101 = Reserved
63  * 0x0E - 1110 = IRQ14
64  * 0x0F - 1111 = IRQ15
65  * PIRQ[n]_ROUT[7] - PIRQ Routing Control
66  * 0x80 - The PIRQ is not routed.
67  */
68 
69 static void i82801ix_pirq_init(struct device *dev)
70 {
71  struct device *irq_dev;
72  /* Get the chip configuration */
73  config_t *config = dev->chip_info;
74 
75  pci_write_config8(dev, D31F0_PIRQA_ROUT, config->pirqa_routing);
76  pci_write_config8(dev, D31F0_PIRQB_ROUT, config->pirqb_routing);
77  pci_write_config8(dev, D31F0_PIRQC_ROUT, config->pirqc_routing);
78  pci_write_config8(dev, D31F0_PIRQD_ROUT, config->pirqd_routing);
79 
80  pci_write_config8(dev, D31F0_PIRQE_ROUT, config->pirqe_routing);
81  pci_write_config8(dev, D31F0_PIRQF_ROUT, config->pirqf_routing);
82  pci_write_config8(dev, D31F0_PIRQG_ROUT, config->pirqg_routing);
83  pci_write_config8(dev, D31F0_PIRQH_ROUT, config->pirqh_routing);
84 
85  /* Eric Biederman once said we should let the OS do this.
86  * I am not so sure anymore he was right.
87  */
88 
89  for (irq_dev = all_devices; irq_dev; irq_dev = irq_dev->next) {
90  u8 int_pin = 0, int_line = 0;
91 
92  if (!irq_dev->enabled || irq_dev->path.type != DEVICE_PATH_PCI)
93  continue;
94 
95  int_pin = pci_read_config8(irq_dev, PCI_INTERRUPT_PIN);
96 
97  switch (int_pin) {
98  case 1: /* INTA# */ int_line = config->pirqa_routing; break;
99  case 2: /* INTB# */ int_line = config->pirqb_routing; break;
100  case 3: /* INTC# */ int_line = config->pirqc_routing; break;
101  case 4: /* INTD# */ int_line = config->pirqd_routing; break;
102  }
103 
104  if (!int_line)
105  continue;
106 
107  pci_write_config8(irq_dev, PCI_INTERRUPT_LINE, int_line);
108  }
109 }
110 
111 static void i82801ix_gpi_routing(struct device *dev)
112 {
113  /* Get the chip configuration */
114  config_t *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, D31F0_GPIO_ROUT, reg32);
138 }
139 
140 static void i82801ix_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  config_t *config = dev->chip_info;
148 
149  /* BIOS must program... */
150  pci_or_config32(dev, 0xac, (1 << 30) | (3 << 8));
151 
152  /* Which state do we want to goto after g3 (power restored)?
153  * 0 == S0 Full On
154  * 1 == S5 Soft Off
155  *
156  * If the option is not existent (Laptops), use MAINBOARD_POWER_ON.
157  */
158  const unsigned int pwr_on = get_uint_option("power_on_after_fail", MAINBOARD_POWER_ON);
159 
160  reg8 = pci_read_config8(dev, D31F0_GEN_PMCON_3);
161  reg8 &= 0xfe;
162  switch (pwr_on) {
163  case MAINBOARD_POWER_OFF:
164  reg8 |= 1;
165  state = "off";
166  break;
167  case MAINBOARD_POWER_ON:
168  reg8 &= ~1;
169  state = "on";
170  break;
172  reg8 &= ~1;
173  state = "state keep";
174  break;
175  default:
176  state = "undefined";
177  }
178 
179  reg8 |= (3 << 4); /* avoid #S4 assertions */
180  reg8 &= ~(1 << 3); /* minimum assertion is 1 to 2 RTCCLK */
181 
183  printk(BIOS_INFO, "Set power %s after power failure.\n", state);
184 
185  /* Set up NMI on errors. */
186  reg8 = inb(0x61);
187  reg8 &= 0x0f; /* Higher Nibble must be 0 */
188  reg8 &= ~(1 << 3); /* IOCHK# NMI Enable */
189  // reg8 &= ~(1 << 2); /* PCI SERR# Enable */
190  reg8 |= (1 << 2); /* PCI SERR# Disable for now */
191  outb(reg8, 0x61);
192 
193  reg8 = inb(0x74); /* Read from 0x74 as 0x70 is write only. */
194  const unsigned int nmi_option = get_uint_option("nmi", NMI_OFF);
195  if (nmi_option) {
196  printk(BIOS_INFO, "NMI sources enabled.\n");
197  reg8 &= ~(1 << 7); /* Set NMI. */
198  } else {
199  printk(BIOS_INFO, "NMI sources disabled.\n");
200  reg8 |= (1 << 7); /* Can't mask NMI from PCI-E and NMI_NOW */
201  }
202  outb(reg8, 0x70);
203 
204  /* Enable CPU_SLP# and Intel Speedstep, set SMI# rate down */
205  reg16 = pci_read_config16(dev, D31F0_GEN_PMCON_1);
206  reg16 &= ~(3 << 0); // SMI# rate 1 minute
207  reg16 |= (1 << 2); // CLKRUN_EN - Mobile/Ultra only
208  reg16 |= (1 << 3); // Speedstep Enable - Mobile/Ultra only
209  reg16 |= (1 << 5); // CPUSLP_EN Desktop only
210 
211  if (config->c4onc3_enable)
212  reg16 |= (1 << 7);
213 
214  // another laptop wants this?
215  // reg16 &= ~(1 << 10); // BIOS_PCI_EXP_EN - Desktop/Mobile only
216  reg16 |= (1 << 10); // BIOS_PCI_EXP_EN - Desktop/Mobile only
217  if (CONFIG(DEBUG_PERIODIC_SMI))
218  reg16 |= (3 << 0); // Periodic SMI every 8s
219  if (config->c5_enable)
220  reg16 |= (1 << 11); /* Enable C5, C6 and PMSYNC# */
222 
223  /* Set exit timings for C5/C6. */
224  if (config->c5_enable) {
226  reg8 &= ~((7 << 3) | (7 << 0));
227  if (config->c6_enable)
228  reg8 |= (5 << 3) | (3 << 0); /* 38-44us PMSYNC# to STPCLK#,
229  95-102us DPRSTP# to STP_CPU# */
230  else
231  reg8 |= (0 << 3) | (1 << 0); /* 16-17us PMSYNC# to STPCLK#,
232  34-40us DPRSTP# to STP_CPU# */
234  }
235 
236  // Set the board's GPI routing.
238 
239  pmbase = pci_read_config16(dev, 0x40) & 0xfffe;
240 
241  outl(config->gpe0_en, pmbase + 0x28);
242  outw(config->alt_gp_smi_en, pmbase + 0x38);
243 
244  /* Set up power management block and determine sleep mode */
245  reg16 = inw(pmbase + 0x00); /* PM1_STS */
246  outw(reg16, pmbase + 0x00); /* Clear status bits. At least bit11 (power
247  button override) must be cleared or SCI
248  will be constantly fired and OSPM must
249  not know about it (ACPI spec says to
250  ignore the bit). */
251 
252  /* Set duty cycle for hardware throttling (defaults to 0x0: 50%). */
253  reg32 = inl(pmbase + 0x10);
254  reg32 &= ~(7 << 5);
255  reg32 |= (config->throttle_duty & 7) << 5;
256  outl(reg32, pmbase + 0x10);
257 }
258 
259 static void i82801ix_configure_cstates(struct device *dev)
260 {
261  // Enable Popup & Popdown
262  pci_or_config8(dev, D31F0_CxSTATE_CNF, (1 << 4) | (1 << 3) | (1 << 2));
263 
264  // Set Deeper Sleep configuration to recommended values
265  // Deeper Sleep to Stop CPU: 34-40us
266  // Deeper Sleep to Sleep: 15us
267  pci_update_config8(dev, D31F0_C4TIMING_CNT, ~0x0f, (2 << 2) | (2 << 0));
268 
269  /* We could enable slow-C4 exit here, if someone needs it? */
270 }
271 
272 static void i82801ix_rtc_init(struct device *dev)
273 {
274  u8 reg8;
275  int rtc_failed;
276 
277  reg8 = pci_read_config8(dev, D31F0_GEN_PMCON_3);
278  rtc_failed = reg8 & RTC_BATTERY_DEAD;
279  if (rtc_failed) {
280  reg8 &= ~RTC_BATTERY_DEAD;
282  }
283  printk(BIOS_DEBUG, "rtc_failed = 0x%x\n", rtc_failed);
284 
286 }
287 
288 static void enable_hpet(void)
289 {
290  u32 reg32;
291 
292  /* Move HPET to default address 0xfed00000 and enable it */
293  reg32 = RCBA32(RCBA_HPTC);
294  reg32 |= (1 << 7); // HPET Address Enable
295  reg32 &= ~(3 << 0);
296  RCBA32(RCBA_HPTC) = reg32;
297 }
298 
299 static void enable_clock_gating(void)
300 {
301  u32 reg32;
302 
303  /* Enable DMI dynamic clock gating. */
304  RCBA32(RCBA_DMIC) |= 3;
305 
306  /* Enable Clock Gating for most devices. */
307  reg32 = RCBA32(RCBA_CG);
308  reg32 |= (1 << 31); /* LPC dynamic clock gating */
309  /* USB UHCI dynamic clock gating: */
310  reg32 |= (1 << 29) | (1 << 28);
311  /* SATA dynamic clock gating [0-3]: */
312  reg32 |= (1 << 27) | (1 << 26) | (1 << 25) | (1 << 24);
313  reg32 |= (1 << 23); /* LAN static clock gating (if LAN disabled) */
314  reg32 |= (1 << 22); /* HD audio dynamic clock gating */
315  reg32 &= ~(1 << 21); /* No HD audio static clock gating */
316  reg32 &= ~(1 << 20); /* No USB EHCI static clock gating */
317  reg32 |= (1 << 19); /* USB EHCI dynamic clock gating */
318  /* More SATA dynamic clock gating [4-5]: */
319  reg32 |= (1 << 18) | (1 << 17);
320  reg32 |= (1 << 16); /* PCI dynamic clock gating */
321  /* PCIe, DMI dynamic clock gating: */
322  reg32 |= (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1);
323  reg32 |= (1 << 0); /* PCIe root port static clock gating */
324  RCBA32(RCBA_CG) = reg32;
325 
326  /* Enable SPI dynamic clock gating. */
327  RCBA32(0x38c0) |= 7;
328 }
329 
330 static void i82801ix_set_acpi_mode(struct device *dev)
331 {
332  if (!acpi_is_wakeup_s3()) {
334  } else {
336  }
337 }
338 
339 static void lpc_init(struct device *dev)
340 {
341  printk(BIOS_DEBUG, "i82801ix: %s\n", __func__);
342 
343  /* IO APIC initialization. */
345 
347 
348  /* Setup the PIRQ. */
349  i82801ix_pirq_init(dev);
350 
351  /* Setup power options. */
353 
354  /* Configure Cx state registers */
355  if (LPC_IS_MOBILE(dev))
357 
358  /* Initialize the real time clock. */
359  i82801ix_rtc_init(dev);
360 
361  /* Initialize ISA DMA. */
362  isa_dma_init();
363 
364  /* Initialize the High Precision Event Timers, if present. */
365  enable_hpet();
366 
367  /* Initialize Clock Gating */
369 
370  setup_i8259();
371 
372  /* The OS should do this? */
373  /* Interrupt 9 should be level triggered (SCI) */
375 
377 
378  /* Don't allow evil boot loaders, kernels, or
379  * userspace applications to deceive us:
380  */
381  if (CONFIG(SMM_LEGACY_ASEG))
382  aseg_smm_lock();
383 }
384 
385 static void i82801ix_lpc_read_resources(struct device *dev)
386 {
387  /*
388  * I/O Resources
389  *
390  * 0x0000 - 0x000f....ISA DMA
391  * 0x0010 - 0x001f....ISA DMA aliases
392  * 0x0020 ~ 0x003d....PIC
393  * 0x002e - 0x002f....Maybe Super I/O
394  * 0x0040 - 0x0043....Timer
395  * 0x004e - 0x004f....Maybe Super I/O
396  * 0x0050 - 0x0053....Timer aliases
397  * 0x0061.............NMI_SC
398  * 0x0070.............NMI_EN (readable in alternative access mode)
399  * 0x0070 - 0x0077....RTC
400  * 0x0080 - 0x008f....ISA DMA
401  * 0x0090 ~ 0x009f....ISA DMA aliases
402  * 0x0092.............Fast A20 and Init
403  * 0x00a0 ~ 0x00bd....PIC
404  * 0x00b2 - 0x00b3....APM
405  * 0x00c0 ~ 0x00de....ISA DMA
406  * 0x00c1 ~ 0x00df....ISA DMA aliases
407  * 0x00f0.............Coprocessor Error
408  * (0x0400-0x041f)....SMBus (CONFIG_FIXED_SMBUS_IO_BASE, during raminit)
409  * 0x04d0 - 0x04d1....PIC
410  * 0x0500 - 0x057f....PM (DEFAULT_PMBASE)
411  * 0x0580 - 0x05bf....SB GPIO (DEFAULT_GPIOBASE)
412  * 0x05c0 - 0x05ff....SB GPIO cont. (mobile only)
413  * 0x0cf8 - 0x0cff....PCI
414  * 0x0cf9.............Reset Control
415  */
416 
417  struct resource *res;
418 
419  /* Get the normal PCI resources of this device. */
421 
422  /* Add an extra subtractive resource for both memory and I/O. */
423  res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
424  res->base = 0;
425  res->size = 0x1000;
428 
429  res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
430  res->base = 0xff800000;
431  res->size = 0x00800000; /* 8 MB for flash */
434 
435  res = new_resource(dev, 3); /* IOAPIC */
436  res->base = IO_APIC_ADDR;
437  res->size = 0x00001000;
439 }
440 
441 static const char *lpc_acpi_name(const struct device *dev)
442 {
443  return "LPCB";
444 }
445 
446 static void southbridge_fill_ssdt(const struct device *device)
447 {
448  struct device *dev = pcidev_on_root(0x1f, 0);
449  config_t *chip = dev->chip_info;
450 
451  intel_acpi_pcie_hotplug_generator(chip->pcie_hotplug_map, 8);
453 }
454 
455 static struct device_operations device_ops = {
457  .set_resources = pci_dev_set_resources,
458  .enable_resources = pci_dev_enable_resources,
459  .write_acpi_tables = acpi_write_hpet,
460  .acpi_fill_ssdt = southbridge_fill_ssdt,
461  .acpi_name = lpc_acpi_name,
462  .init = lpc_init,
463  .scan_bus = scan_static_bus,
464  .ops_pci = &pci_dev_ops_pci,
465 };
466 
467 static const unsigned short pci_device_ids[] = {
468  PCI_DID_INTEL_82801IH_LPC, /* ICH9DH */
469  PCI_DID_INTEL_82801IO_LPC, /* ICH9DO */
470  PCI_DID_INTEL_82801IR_LPC, /* ICH9R */
471  PCI_DID_INTEL_82801IEM_LPC, /* ICH9M-E */
472  PCI_DID_INTEL_82801IB_LPC, /* ICH9 */
473  PCI_DID_INTEL_82801IBM_LPC, /* ICH9M */
474  0
475 };
476 
477 static const struct pci_driver ich9_lpc __pci_driver = {
478  .ops = &device_ops,
479  .vendor = PCI_VID_INTEL,
480  .devices = pci_device_ids,
481 };
unsigned long acpi_write_hpet(const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
Definition: acpi.c:1141
static int acpi_is_wakeup_s3(void)
Definition: acpi.h:9
#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 MAINBOARD_POWER_ON
Definition: pm.h:94
#define MAINBOARD_POWER_OFF
Definition: pm.h:93
#define MAINBOARD_POWER_KEEP
Definition: pm.h:95
#define printk(level,...)
Definition: stdlib.h:16
u8 inb(u16 port)
void outb(u8 val, u16 port)
u16 inw(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
@ 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
void aseg_smm_lock(void)
Definition: smi.c:315
#define D31F0_PIRQD_ROUT
Definition: i82801ix.h:47
#define RCBA_HPTC
Definition: i82801ix.h:117
#define D31F0_PIRQH_ROUT
Definition: i82801ix.h:52
#define RCBA_CG
Definition: i82801ix.h:121
#define D31F0_PIRQA_ROUT
Definition: i82801ix.h:44
#define LPC_IS_MOBILE(dev)
Definition: i82801ix.h:159
#define D31F0_C4TIMING_CNT
Definition: i82801ix.h:71
#define D31F0_PIRQB_ROUT
Definition: i82801ix.h:45
#define D31F0_PIRQG_ROUT
Definition: i82801ix.h:51
#define D31F0_CxSTATE_CNF
Definition: i82801ix.h:70
#define D31F0_SERIRQ_CNTL
Definition: i82801ix.h:48
#define D31F0_PIRQE_ROUT
Definition: i82801ix.h:49
#define D31F0_C5_EXIT_TIMING
Definition: i82801ix.h:69
#define D31F0_PIRQC_ROUT
Definition: i82801ix.h:46
#define D31F0_PIRQF_ROUT
Definition: i82801ix.h:50
#define RCBA_DMIC
Definition: i82801ix.h:110
#define APM_CNT_ACPI_DISABLE
Definition: smm.h:21
#define APM_CNT_ACPI_ENABLE
Definition: smm.h:22
static __always_inline void pci_or_config32(const struct device *dev, u16 reg, u32 ormask)
Definition: pci_ops.h:191
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline void pci_update_config8(const struct device *dev, u16 reg, u8 mask, u8 or)
Definition: pci_ops.h:88
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline void pci_or_config8(const struct device *dev, u16 reg, u8 ormask)
Definition: pci_ops.h:169
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 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_82801IBM_LPC
Definition: pci_ids.h:2661
#define PCI_DID_INTEL_82801IEM_LPC
Definition: pci_ids.h:2660
#define PCI_DID_INTEL_82801IB_LPC
Definition: pci_ids.h:2627
#define PCI_DID_INTEL_82801IO_LPC
Definition: pci_ids.h:2658
#define PCI_DID_INTEL_82801IR_LPC
Definition: pci_ids.h:2659
#define PCI_DID_INTEL_82801IH_LPC
Definition: pci_ids.h:2657
#define PCI_VID_INTEL
Definition: pci_ids.h:2157
void intel_acpi_pcie_hotplug_generator(u8 *hotplug_map, int port_number)
Definition: pciehp.c:11
#define D31F0_GPIO_ROUT
Definition: pmutil.h:23
#define D31F0_GEN_PMCON_1
Definition: pmutil.h:9
#define D31F0_GEN_PMCON_3
Definition: pmutil.h:12
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
static int rtc_failed(uint32_t gen_pmcon_b)
Definition: pmutil.c:169
#define RCBA8(x)
Definition: rcba.h:12
#define RCBA32(x)
Definition: rcba.h:14
static u16 pmbase
Definition: smi.c:27
static void enable_hpet(void)
Definition: lpc.c:288
static void i82801ix_enable_serial_irqs(struct device *dev)
Definition: lpc.c:41
static const char * lpc_acpi_name(const struct device *dev)
Definition: lpc.c:441
static void enable_clock_gating(void)
Definition: lpc.c:299
static struct device_operations device_ops
Definition: lpc.c:455
static void i82801ix_power_options(struct device *dev)
Definition: lpc.c:140
static void southbridge_fill_ssdt(const struct device *device)
Definition: lpc.c:446
static void i82801ix_lpc_read_resources(struct device *dev)
Definition: lpc.c:385
static void lpc_init(struct device *dev)
Definition: lpc.c:339
static const unsigned short pci_device_ids[]
Definition: lpc.c:467
static void i82801ix_enable_apic(struct device *dev)
Definition: lpc.c:28
static const struct pci_driver ich9_lpc __pci_driver
Definition: lpc.c:477
static void i82801ix_gpi_routing(struct device *dev)
Definition: lpc.c:111
#define NMI_OFF
Definition: lpc.c:24
static void i82801ix_rtc_init(struct device *dev)
Definition: lpc.c:272
static void i82801ix_pirq_init(struct device *dev)
Definition: lpc.c:69
static void i82801ix_set_acpi_mode(struct device *dev)
Definition: lpc.c:330
static void i82801ix_configure_cstates(struct device *dev)
Definition: lpc.c:259
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