blob: bc17618b034dcd2ff912a6c0c30a718c2b82f972 [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>
Kyösti Mälkkicd7a70f2019-08-17 20:51:08 +03007#include <arch/romstage.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +01008#include <northbridge/intel/gm45/gm45.h>
9#include <southbridge/intel/i82801ix/i82801ix.h>
10#include <southbridge/intel/common/gpio.h>
Patrick Rudolphad0b4822019-04-13 16:56:23 +020011#include <southbridge/intel/common/pmclib.h>
Angel Ponse1a616c2020-06-21 17:02:43 +020012#include <southbridge/intel/common/pmutil.h>
Elyes HAOUASa1e22b82019-03-18 22:49:36 +010013#include <string.h>
Arthur Heymans3b0eb602019-01-31 22:47:09 +010014
15#define LPC_DEV PCI_DEV(0, 0x1f, 0)
16#define MCH_DEV PCI_DEV(0, 0, 0)
17
18void __weak mb_setup_superio(void)
19{
20}
21
22void __weak mb_pre_raminit_setup(sysinfo_t *sysinfo)
23{
24}
25
26void __weak mb_post_raminit_setup(void)
27{
28}
29
30/* Platform has no romstage entry point under mainboard directory,
31 * so this one is named with prefix mainboard.
32 */
Kyösti Mälkki157b1892019-08-16 14:02:25 +030033void mainboard_romstage_entry(void)
Arthur Heymans3b0eb602019-01-31 22:47:09 +010034{
35 sysinfo_t sysinfo;
36 int s3resume = 0;
37 int cbmem_initted;
38 u16 reg16;
39
40 /* basic northbridge setup, including MMCONF BAR */
41 gm45_early_init();
42
Arthur Heymans3b0eb602019-01-31 22:47:09 +010043 /* First, run everything needed for console output. */
44 i82801ix_early_init();
45 setup_pch_gpios(&mainboard_gpio_map);
46
Arthur Heymans3b0eb602019-01-31 22:47:09 +010047 reg16 = pci_read_config16(LPC_DEV, D31F0_GEN_PMCON_3);
48 pci_write_config16(LPC_DEV, D31F0_GEN_PMCON_3, reg16);
Angel Pons3f1f8ef2021-03-27 13:52:43 +010049 if ((mchbar_read16(SSKPD_MCHBAR) == 0xcafe) && !(reg16 & (1 << 9))) {
Arthur Heymans3b0eb602019-01-31 22:47:09 +010050 printk(BIOS_DEBUG, "soft reset detected, rebooting properly\n");
51 gm45_early_reset();
52 }
53
54 /* ASPM related setting, set early by original BIOS. */
Angel Pons3f1f8ef2021-03-27 13:52:43 +010055 dmibar_clrbits16(0x204, 3 << 10);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010056
57 /* Check for S3 resume. */
Patrick Rudolphad0b4822019-04-13 16:56:23 +020058 s3resume = southbridge_detect_s3_resume();
Arthur Heymans3b0eb602019-01-31 22:47:09 +010059
60 /* RAM initialization */
61 enter_raminit_or_reset();
62 memset(&sysinfo, 0, sizeof(sysinfo));
63 get_mb_spd_addrmap(sysinfo.spd_map);
64 const struct device *dev;
65 dev = pcidev_on_root(2, 0);
66 if (dev)
67 sysinfo.enable_igd = dev->enabled;
68 dev = pcidev_on_root(1, 0);
69 if (dev)
70 sysinfo.enable_peg = dev->enabled;
71 get_gmch_info(&sysinfo);
72
73 mb_pre_raminit_setup(&sysinfo);
74
75 raminit(&sysinfo, s3resume);
76
Arthur Heymans3b0eb602019-01-31 22:47:09 +010077 /* Disable D4F0 (unknown signal controller). */
Angel Ponsb0535832020-06-08 11:46:58 +020078 pci_and_config32(MCH_DEV, D0F0_DEVEN, ~0x4000);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010079
80 init_pm(&sysinfo, 0);
81
82 i82801ix_dmi_setup();
83 gm45_late_init(sysinfo.stepping);
84 i82801ix_dmi_poll_vc1();
85
Angel Pons3f1f8ef2021-03-27 13:52:43 +010086 mchbar_write16(SSKPD_MCHBAR, 0xcafe);
Arthur Heymans3b0eb602019-01-31 22:47:09 +010087
88 init_iommu();
89
90 cbmem_initted = !cbmem_recovery(s3resume);
91
Angel Pons7d3e1612024-04-12 17:02:24 +020092 setup_sdram_meminfo(&sysinfo);
93
Angel Pons8b5aacc2024-04-16 17:33:58 +020094 mb_post_raminit_setup();
95
Arthur Heymans3b0eb602019-01-31 22:47:09 +010096 romstage_handoff_init(cbmem_initted && s3resume);
97
98 printk(BIOS_SPEW, "exit main()\n");
99}