blob: 744c92bd7036aec883e0086d813bc498414a0f03 [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>
Kyösti Mälkkicd7a70f2019-08-17 20:51:08 +03008#include <arch/romstage.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +01009#include <northbridge/intel/gm45/gm45.h>
10#include <southbridge/intel/i82801ix/i82801ix.h>
11#include <southbridge/intel/common/gpio.h>
Patrick Rudolphad0b4822019-04-13 16:56:23 +020012#include <southbridge/intel/common/pmclib.h>
Angel Ponse1a616c2020-06-21 17:02:43 +020013#include <southbridge/intel/common/pmutil.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
Arthur Heymans3b0eb602019-01-31 22:47:09 +010044 /* First, run everything needed for console output. */
45 i82801ix_early_init();
46 setup_pch_gpios(&mainboard_gpio_map);
47
Arthur Heymans3b0eb602019-01-31 22:47:09 +010048 reg16 = pci_read_config16(LPC_DEV, D31F0_GEN_PMCON_3);
49 pci_write_config16(LPC_DEV, D31F0_GEN_PMCON_3, reg16);
Angel Pons3f1f8ef2021-03-27 13:52:43 +010050 if ((mchbar_read16(SSKPD_MCHBAR) == 0xcafe) && !(reg16 & (1 << 9))) {
Arthur Heymans3b0eb602019-01-31 22:47:09 +010051 printk(BIOS_DEBUG, "soft reset detected, rebooting properly\n");
52 gm45_early_reset();
53 }
54
55 /* ASPM related setting, set early by original BIOS. */
Angel Pons3f1f8ef2021-03-27 13:52:43 +010056 dmibar_clrbits16(0x204, 3 << 10);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010057
58 /* Check for S3 resume. */
Patrick Rudolphad0b4822019-04-13 16:56:23 +020059 s3resume = southbridge_detect_s3_resume();
Arthur Heymans3b0eb602019-01-31 22:47:09 +010060
61 /* RAM initialization */
62 enter_raminit_or_reset();
63 memset(&sysinfo, 0, sizeof(sysinfo));
64 get_mb_spd_addrmap(sysinfo.spd_map);
65 const struct device *dev;
66 dev = pcidev_on_root(2, 0);
67 if (dev)
68 sysinfo.enable_igd = dev->enabled;
69 dev = pcidev_on_root(1, 0);
70 if (dev)
71 sysinfo.enable_peg = dev->enabled;
72 get_gmch_info(&sysinfo);
73
74 mb_pre_raminit_setup(&sysinfo);
75
76 raminit(&sysinfo, s3resume);
77
78 mb_post_raminit_setup();
79
Arthur Heymans3b0eb602019-01-31 22:47:09 +010080 /* Disable D4F0 (unknown signal controller). */
Angel Ponsb0535832020-06-08 11:46:58 +020081 pci_and_config32(MCH_DEV, D0F0_DEVEN, ~0x4000);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010082
83 init_pm(&sysinfo, 0);
84
85 i82801ix_dmi_setup();
86 gm45_late_init(sysinfo.stepping);
87 i82801ix_dmi_poll_vc1();
88
Angel Pons3f1f8ef2021-03-27 13:52:43 +010089 mchbar_write16(SSKPD_MCHBAR, 0xcafe);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010090
91 init_iommu();
92
93 cbmem_initted = !cbmem_recovery(s3resume);
94
95 romstage_handoff_init(cbmem_initted && s3resume);
96
97 printk(BIOS_SPEW, "exit main()\n");
98}