/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include #include #include #include "ironlake.h" #include #include #include #include #include #include #include #include /* Platform has no romstage entry point under mainboard directory, * so this one is named with prefix mainboard. */ void mainboard_romstage_entry(void) { u32 reg32; int s3resume = 0; u8 spd_addrmap[4] = {}; enable_lapic(); /* TODO, make this configurable */ ironlake_early_initialization(IRONLAKE_MOBILE); early_pch_init(); s3resume = southbridge_detect_s3_resume(); if (s3resume) { u8 reg8 = pci_read_config8(PCI_DEV(0, 0x1f, 0), 0xa2); if (!(reg8 & 0x20)) { s3resume = 0; printk(BIOS_DEBUG, "Bad resume from S3 detected.\n"); } } early_thermal_init(); timestamp_add_now(TS_BEFORE_INITRAM); chipset_init(s3resume); mainboard_pre_raminit(); mainboard_get_spd_map(spd_addrmap); raminit(s3resume, spd_addrmap); timestamp_add_now(TS_AFTER_INITRAM); intel_early_me_status(); if (s3resume) { /* Clear SLP_TYPE. This will break stage2 but * we care for that when we get there. */ reg32 = inl(DEFAULT_PMBASE + 0x04); outl(reg32 & ~(7 << 10), DEFAULT_PMBASE + 0x04); } romstage_handoff_init(s3resume); }