blob: 22aaee62d888fc0d9429b8b0ab9fd18460d43f79 [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>
Angel Ponse1a616c2020-06-21 17:02:43 +020014#include <southbridge/intel/common/pmutil.h>
Elyes HAOUASa1e22b82019-03-18 22:49:36 +010015#include <string.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +010016
17#define LPC_DEV PCI_DEV(0, 0x1f, 0)
18#define MCH_DEV PCI_DEV(0, 0, 0)
19
20void __weak mb_setup_superio(void)
21{
22}
23
24void __weak mb_pre_raminit_setup(sysinfo_t *sysinfo)
25{
26}
27
28void __weak mb_post_raminit_setup(void)
29{
30}
31
32/* Platform has no romstage entry point under mainboard directory,
33 * so this one is named with prefix mainboard.
34 */
Kyösti Mälkki157b1892019-08-16 14:02:25 +030035void mainboard_romstage_entry(void)
Arthur Heymans3b0eb602019-01-31 22:47:09 +010036{
37 sysinfo_t sysinfo;
38 int s3resume = 0;
39 int cbmem_initted;
40 u16 reg16;
41
42 /* basic northbridge setup, including MMCONF BAR */
43 gm45_early_init();
44
Kyösti Mälkki157b1892019-08-16 14:02:25 +030045 enable_lapic();
Arthur Heymans3b0eb602019-01-31 22:47:09 +010046
47 /* First, run everything needed for console output. */
48 i82801ix_early_init();
49 setup_pch_gpios(&mainboard_gpio_map);
50
Arthur Heymans3b0eb602019-01-31 22:47:09 +010051 reg16 = pci_read_config16(LPC_DEV, D31F0_GEN_PMCON_3);
52 pci_write_config16(LPC_DEV, D31F0_GEN_PMCON_3, reg16);
53 if ((MCHBAR16(SSKPD_MCHBAR) == 0xCAFE) && !(reg16 & (1 << 9))) {
54 printk(BIOS_DEBUG, "soft reset detected, rebooting properly\n");
55 gm45_early_reset();
56 }
57
58 /* ASPM related setting, set early by original BIOS. */
59 DMIBAR16(0x204) &= ~(3 << 10);
60
61 /* Check for S3 resume. */
Patrick Rudolphad0b4822019-04-13 16:56:23 +020062 s3resume = southbridge_detect_s3_resume();
Arthur Heymans3b0eb602019-01-31 22:47:09 +010063
64 /* RAM initialization */
65 enter_raminit_or_reset();
66 memset(&sysinfo, 0, sizeof(sysinfo));
67 get_mb_spd_addrmap(sysinfo.spd_map);
68 const struct device *dev;
69 dev = pcidev_on_root(2, 0);
70 if (dev)
71 sysinfo.enable_igd = dev->enabled;
72 dev = pcidev_on_root(1, 0);
73 if (dev)
74 sysinfo.enable_peg = dev->enabled;
75 get_gmch_info(&sysinfo);
76
77 mb_pre_raminit_setup(&sysinfo);
78
79 raminit(&sysinfo, s3resume);
80
81 mb_post_raminit_setup();
82
Arthur Heymans3b0eb602019-01-31 22:47:09 +010083 /* Disable D4F0 (unknown signal controller). */
Angel Ponsb0535832020-06-08 11:46:58 +020084 pci_and_config32(MCH_DEV, D0F0_DEVEN, ~0x4000);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010085
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}