blob: f7998c926a65f00cbac8acf29d5bc60a395f982b [file] [log] [blame]
Angel Pons4b429832020-04-02 23:48:50 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Arthur Heymans3b0eb602019-01-31 22:47:09 +01002
3#include <cbmem.h>
4#include <romstage_handoff.h>
5#include <console/console.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02006#include <device/pci_ops.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07007#include <acpi/acpi.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +01008#include <cpu/x86/lapic.h>
Kyösti Mälkkicd7a70f2019-08-17 20:51:08 +03009#include <arch/romstage.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +010010#include <northbridge/intel/gm45/gm45.h>
11#include <southbridge/intel/i82801ix/i82801ix.h>
12#include <southbridge/intel/common/gpio.h>
Patrick Rudolphad0b4822019-04-13 16:56:23 +020013#include <southbridge/intel/common/pmclib.h>
Elyes HAOUASa1e22b82019-03-18 22:49:36 +010014#include <string.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +010015
16#define LPC_DEV PCI_DEV(0, 0x1f, 0)
17#define MCH_DEV PCI_DEV(0, 0, 0)
18
19void __weak mb_setup_superio(void)
20{
21}
22
23void __weak mb_pre_raminit_setup(sysinfo_t *sysinfo)
24{
25}
26
27void __weak mb_post_raminit_setup(void)
28{
29}
30
31/* Platform has no romstage entry point under mainboard directory,
32 * so this one is named with prefix mainboard.
33 */
Kyösti Mälkki157b1892019-08-16 14:02:25 +030034void mainboard_romstage_entry(void)
Arthur Heymans3b0eb602019-01-31 22:47:09 +010035{
36 sysinfo_t sysinfo;
37 int s3resume = 0;
38 int cbmem_initted;
39 u16 reg16;
40
41 /* basic northbridge setup, including MMCONF BAR */
42 gm45_early_init();
43
Kyösti Mälkki157b1892019-08-16 14:02:25 +030044 enable_lapic();
Arthur Heymans3b0eb602019-01-31 22:47:09 +010045
46 /* First, run everything needed for console output. */
47 i82801ix_early_init();
48 setup_pch_gpios(&mainboard_gpio_map);
49
Arthur Heymans3b0eb602019-01-31 22:47:09 +010050 reg16 = pci_read_config16(LPC_DEV, D31F0_GEN_PMCON_3);
51 pci_write_config16(LPC_DEV, D31F0_GEN_PMCON_3, reg16);
52 if ((MCHBAR16(SSKPD_MCHBAR) == 0xCAFE) && !(reg16 & (1 << 9))) {
53 printk(BIOS_DEBUG, "soft reset detected, rebooting properly\n");
54 gm45_early_reset();
55 }
56
57 /* ASPM related setting, set early by original BIOS. */
58 DMIBAR16(0x204) &= ~(3 << 10);
59
60 /* Check for S3 resume. */
Patrick Rudolphad0b4822019-04-13 16:56:23 +020061 s3resume = southbridge_detect_s3_resume();
Arthur Heymans3b0eb602019-01-31 22:47:09 +010062
63 /* RAM initialization */
64 enter_raminit_or_reset();
65 memset(&sysinfo, 0, sizeof(sysinfo));
66 get_mb_spd_addrmap(sysinfo.spd_map);
67 const struct device *dev;
68 dev = pcidev_on_root(2, 0);
69 if (dev)
70 sysinfo.enable_igd = dev->enabled;
71 dev = pcidev_on_root(1, 0);
72 if (dev)
73 sysinfo.enable_peg = dev->enabled;
74 get_gmch_info(&sysinfo);
75
76 mb_pre_raminit_setup(&sysinfo);
77
78 raminit(&sysinfo, s3resume);
79
80 mb_post_raminit_setup();
81
82 const u32 deven = pci_read_config32(MCH_DEV, D0F0_DEVEN);
83 /* Disable D4F0 (unknown signal controller). */
84 pci_write_config32(MCH_DEV, D0F0_DEVEN, deven & ~0x4000);
85
86 init_pm(&sysinfo, 0);
87
88 i82801ix_dmi_setup();
89 gm45_late_init(sysinfo.stepping);
90 i82801ix_dmi_poll_vc1();
91
92 MCHBAR16(SSKPD_MCHBAR) = 0xCAFE;
93
94 init_iommu();
95
96 cbmem_initted = !cbmem_recovery(s3resume);
97
98 romstage_handoff_init(cbmem_initted && s3resume);
99
100 printk(BIOS_SPEW, "exit main()\n");
101}