blob: 1e5f3d36565146a5b636c0145ed88877db8b2ece [file] [log] [blame]
Aaron Durbin3d0071b2013-01-18 14:32:50 -06001/*
2 * This file is part of the coreboot project.
3 *
Patrick Georgi5b2a2d02018-09-26 20:46:04 +02004 * Copyright (C) 2012 Google LLC
Aaron Durbin3d0071b2013-01-18 14:32:50 -06005 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Aaron Durbin3d0071b2013-01-18 14:32:50 -060014 */
15
16#include <stdint.h>
Aaron Durbin7492ec12013-02-08 22:18:04 -060017#include <string.h>
Aaron Durbin3d0071b2013-01-18 14:32:50 -060018#include <console/console.h>
Aaron Durbina2671612013-02-06 21:41:01 -060019#include <arch/cpu.h>
Patrick Rudolph45022ae2018-10-01 19:17:11 +020020#include <cf9_reset.h>
Aaron Durbina2671612013-02-06 21:41:01 -060021#include <cpu/x86/bist.h>
22#include <cpu/x86/msr.h>
Aaron Durbin38d94232013-02-07 00:03:33 -060023#include <cpu/x86/mtrr.h>
Patrick Georgibd79c5e2014-11-28 22:35:36 +010024#include <halt.h>
Aaron Durbina2671612013-02-06 21:41:01 -060025#include <lib.h>
26#include <timestamp.h>
Aaron Durbina2671612013-02-06 21:41:01 -060027#include <device/pci_def.h>
28#include <cpu/x86/lapic.h>
Kyösti Mälkki465eff62016-06-15 06:07:55 +030029#include <cbmem.h>
Kyösti Mälkki65e8f642016-06-27 11:27:56 +030030#include <program_loading.h>
Aaron Durbinbf396ff2013-02-11 21:50:35 -060031#include <romstage_handoff.h>
Aaron Durbina2671612013-02-06 21:41:01 -060032#include <vendorcode/google/chromeos/chromeos.h>
Julius Wernercd49cce2019-03-05 16:53:33 -080033#if CONFIG(EC_GOOGLE_CHROMEEC)
Duncan Laurie7cced0d2013-06-04 10:03:34 -070034#include <ec/google/chromeec/ec.h>
35#endif
Elyes HAOUAS65bb5432018-07-03 14:59:50 +020036#include <northbridge/intel/haswell/haswell.h>
37#include <northbridge/intel/haswell/raminit.h>
38#include <southbridge/intel/lynxpoint/pch.h>
39#include <southbridge/intel/lynxpoint/me.h>
Arthur Heymansfaa5f982018-06-04 19:34:59 +020040#include <cpu/intel/romstage.h>
Elyes HAOUAS65bb5432018-07-03 14:59:50 +020041#include "haswell.h"
Aaron Durbina2671612013-02-06 21:41:01 -060042
Arthur Heymans88af0f32018-06-03 12:37:54 +020043#define ROMSTAGE_RAM_STACK_SIZE 0x5000
Aaron Durbin3d0071b2013-01-18 14:32:50 -060044
Arthur Heymans88af0f32018-06-03 12:37:54 +020045/* platform_enter_postcar() determines the stack to use after
46 * cache-as-ram is torn down as well as the MTRR settings to use,
47 * and continues execution in postcar stage. */
Arthur Heymansfaa5f982018-06-04 19:34:59 +020048void platform_enter_postcar(void)
Aaron Durbin38d94232013-02-07 00:03:33 -060049{
Arthur Heymans88af0f32018-06-03 12:37:54 +020050 struct postcar_frame pcf;
51 uintptr_t top_of_ram;
Aaron Durbin38d94232013-02-07 00:03:33 -060052
Arthur Heymans88af0f32018-06-03 12:37:54 +020053 if (postcar_frame_init(&pcf, ROMSTAGE_RAM_STACK_SIZE))
54 die("Unable to initialize postcar frame.\n");
Aaron Durbin38d94232013-02-07 00:03:33 -060055 /* Cache the ROM as WP just below 4GiB. */
Nico Huber4c7eee22019-02-10 19:35:41 +010056 postcar_frame_add_romcache(&pcf, MTRR_TYPE_WRPROT);
Aaron Durbin38d94232013-02-07 00:03:33 -060057
Kyösti Mälkki65cc5262016-06-19 20:38:41 +030058 /* Cache RAM as WB from 0 -> CACHE_TMP_RAMTOP. */
Arthur Heymans88af0f32018-06-03 12:37:54 +020059 postcar_frame_add_mtrr(&pcf, 0, CACHE_TMP_RAMTOP, MTRR_TYPE_WRBACK);
Aaron Durbin38d94232013-02-07 00:03:33 -060060
Arthur Heymans88af0f32018-06-03 12:37:54 +020061 /* Cache at least 8 MiB below the top of ram, and at most 8 MiB
62 * above top of the ram. This satisfies MTRR alignment requirement
63 * with different TSEG size configurations.
64 */
65 top_of_ram = ALIGN_DOWN((uintptr_t)cbmem_top(), 8*MiB);
66 postcar_frame_add_mtrr(&pcf, top_of_ram - 8*MiB, 16*MiB,
67 MTRR_TYPE_WRBACK);
Aaron Durbin67481ddc2013-02-15 15:08:37 -060068
Arthur Heymans88af0f32018-06-03 12:37:54 +020069 run_postcar_phase(&pcf);
Aaron Durbin38d94232013-02-07 00:03:33 -060070}
71
Aaron Durbina2671612013-02-06 21:41:01 -060072void romstage_common(const struct romstage_params *params)
73{
Aaron Durbinbf396ff2013-02-11 21:50:35 -060074 int boot_mode;
Aaron Durbina2671612013-02-06 21:41:01 -060075 int wake_from_s3;
Aaron Durbina2671612013-02-06 21:41:01 -060076
Aaron Durbina2671612013-02-06 21:41:01 -060077 if (params->bist == 0)
78 enable_lapic();
79
80 wake_from_s3 = early_pch_init(params->gpio_map, params->rcba_config);
81
82 /* Halt if there was a built in self test failure */
83 report_bist_failure(params->bist);
84
85 /* Perform some early chipset initialization required
86 * before RAM initialization can work
87 */
88 haswell_early_initialization(HASWELL_MOBILE);
89 printk(BIOS_DEBUG, "Back from haswell_early_initialization()\n");
90
91 if (wake_from_s3) {
Julius Wernercd49cce2019-03-05 16:53:33 -080092#if CONFIG(HAVE_ACPI_RESUME)
Aaron Durbina2671612013-02-06 21:41:01 -060093 printk(BIOS_DEBUG, "Resume from S3 detected.\n");
Aaron Durbina2671612013-02-06 21:41:01 -060094#else
95 printk(BIOS_DEBUG, "Resume from S3 detected, but disabled.\n");
Aaron Durbinbf396ff2013-02-11 21:50:35 -060096 wake_from_s3 = 0;
Aaron Durbina2671612013-02-06 21:41:01 -060097#endif
98 }
99
Aaron Durbinbf396ff2013-02-11 21:50:35 -0600100 /* There are hard coded assumptions of 2 meaning s3 wake. Normalize
101 * the users of the 2 literal here based off wake_from_s3. */
102 boot_mode = wake_from_s3 ? 2 : 0;
103
Aaron Durbina2671612013-02-06 21:41:01 -0600104 /* Prepare USB controller early in S3 resume */
Aaron Durbinbf396ff2013-02-11 21:50:35 -0600105 if (wake_from_s3)
Aaron Durbina2671612013-02-06 21:41:01 -0600106 enable_usb_bar();
107
108 post_code(0x3a);
109 params->pei_data->boot_mode = boot_mode;
Kyösti Mälkki3d45c402013-09-07 20:26:36 +0300110
111 timestamp_add_now(TS_BEFORE_INITRAM);
Aaron Durbina2671612013-02-06 21:41:01 -0600112
113 report_platform_info();
114
Aaron Durbinc7633f42013-06-13 17:29:36 -0700115 if (params->copy_spd != NULL)
116 params->copy_spd(params->pei_data);
117
Aaron Durbina2671612013-02-06 21:41:01 -0600118 sdram_initialize(params->pei_data);
119
Kyösti Mälkki3d45c402013-09-07 20:26:36 +0300120 timestamp_add_now(TS_AFTER_INITRAM);
121
Aaron Durbina2671612013-02-06 21:41:01 -0600122 post_code(0x3b);
123
124 intel_early_me_status();
125
126 quick_ram_check();
127 post_code(0x3e);
128
Aaron Durbinc0cbd6e2013-03-13 13:51:20 -0500129 if (!wake_from_s3) {
130 cbmem_initialize_empty();
131 /* Save data returned from MRC on non-S3 resumes. */
Aaron Durbin2ad1dba2013-02-07 00:51:18 -0600132 save_mrc_data(params->pei_data);
Aaron Durbin42e68562015-06-09 13:55:51 -0500133 } else if (cbmem_initialize()) {
Julius Wernercd49cce2019-03-05 16:53:33 -0800134 #if CONFIG(HAVE_ACPI_RESUME)
Aaron Durbin42e68562015-06-09 13:55:51 -0500135 /* Failed S3 resume, reset to come up cleanly */
Patrick Rudolph45022ae2018-10-01 19:17:11 +0200136 system_reset();
Aaron Durbin42e68562015-06-09 13:55:51 -0500137 #endif
Aaron Durbina2671612013-02-06 21:41:01 -0600138 }
Aaron Durbinbf396ff2013-02-11 21:50:35 -0600139
Tristan Corrick334be322018-12-17 22:10:21 +1300140 haswell_unhide_peg();
141
Matt DeVillier5aaa8ce2016-09-02 13:29:17 -0500142 setup_sdram_meminfo(params->pei_data);
143
Aaron Durbin77e13992016-11-29 17:43:04 -0600144 romstage_handoff_init(wake_from_s3);
Aaron Durbinbf396ff2013-02-11 21:50:35 -0600145
Aaron Durbina2671612013-02-06 21:41:01 -0600146 post_code(0x3f);
Aaron Durbina2671612013-02-06 21:41:01 -0600147}