blob: 84ea7d153c83870c325cd69fe335326ab1078d85 [file] [log] [blame]
Aaron Durbine6af4be2015-09-24 12:26:31 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright 2015 Google Inc.
5 *
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 Durbine6af4be2015-09-24 12:26:31 -050014 */
15
Arthur Heymans8a1b94c2019-05-25 09:47:01 +020016#include <arch/symbols.h>
Kyösti Mälkki8f23b5d2019-06-30 21:00:07 +030017#include <cbmem.h>
Aaron Durbine6af4be2015-09-24 12:26:31 -050018#include <console/console.h>
Elyes HAOUAS2195f7a2019-06-21 07:20:12 +020019#include <commonlib/helpers.h>
Arthur Heymans56e2d7d2019-05-23 15:07:49 +020020#include <cpu/intel/romstage.h>
Nico Huberd67edca2018-11-13 19:28:07 +010021#include <cpu/x86/mtrr.h>
Aaron Durbine6af4be2015-09-24 12:26:31 -050022#include <fsp/car.h>
Aaron Durbin909c5122015-09-29 17:41:30 -050023#include <fsp/util.h>
Arthur Heymansbe291e82019-01-06 07:35:11 +010024#include <fsp/memmap.h>
Aaron Durbin6d720f32015-12-08 17:00:23 -060025#include <program_loading.h>
Aaron Durbine6af4be2015-09-24 12:26:31 -050026#include <timestamp.h>
27
Arthur Heymansbe291e82019-01-06 07:35:11 +010028#define ROMSTAGE_RAM_STACK_SIZE 0x5000
Aaron Durbin909c5122015-09-29 17:41:30 -050029
Arthur Heymansbe291e82019-01-06 07:35:11 +010030/* platform_enter_postcar() determines the stack to use after
31 * cache-as-ram is torn down as well as the MTRR settings to use,
32 * and continues execution in postcar stage. */
Arthur Heymans56e2d7d2019-05-23 15:07:49 +020033void platform_enter_postcar(void)
Aaron Durbin909c5122015-09-29 17:41:30 -050034{
Arthur Heymansbe291e82019-01-06 07:35:11 +010035 struct postcar_frame pcf;
Kyösti Mälkki8f23b5d2019-06-30 21:00:07 +030036 uintptr_t top_of_ram;
Arthur Heymansbe291e82019-01-06 07:35:11 +010037
38 if (postcar_frame_init(&pcf, ROMSTAGE_RAM_STACK_SIZE))
39 die("Unable to initialize postcar frame.\n");
40 /* Cache the ROM as WP just below 4GiB. */
41 postcar_frame_add_mtrr(&pcf, CACHE_ROM_BASE, CACHE_ROM_SIZE,
42 MTRR_TYPE_WRPROT);
43
44 /* Cache RAM as WB from 0 -> CACHE_TMP_RAMTOP. */
45 postcar_frame_add_mtrr(&pcf, 0, CACHE_TMP_RAMTOP, MTRR_TYPE_WRBACK);
46
Kyösti Mälkki8f23b5d2019-06-30 21:00:07 +030047 /* Cache at least 8 MiB below the top of ram, and at most 8 MiB
48 * above top of the ram. This satisfies MTRR alignment requirement
49 * with different TSEG size configurations. */
50 top_of_ram = ALIGN_DOWN((uintptr_t)cbmem_top(), 8*MiB);
51 postcar_frame_add_mtrr(&pcf, top_of_ram - 8*MiB, 16*MiB, MTRR_TYPE_WRBACK);
Arthur Heymansbe291e82019-01-06 07:35:11 +010052
53 run_postcar_phase(&pcf);
Aaron Durbin909c5122015-09-29 17:41:30 -050054}
55
Arthur Heymans59b65422019-05-23 15:24:30 +020056/* This is the romstage entry called from cpu/intel/car/romstage.c */
Arthur Heymans56e2d7d2019-05-23 15:07:49 +020057void mainboard_romstage_entry(unsigned long bist)
Aaron Durbin909c5122015-09-29 17:41:30 -050058{
59 /* Need to locate the current FSP_INFO_HEADER. The cache-as-ram
60 * is still enabled. We can directly access work buffer here. */
Aaron Durbin7e7a4df2015-12-08 14:34:35 -060061 struct prog fsp = PROG_INIT(PROG_REFCODE, "fsp.bin");
Aaron Durbin909c5122015-09-29 17:41:30 -050062
Jacob Garberf7f90f72019-05-28 15:37:37 -060063 if (prog_locate(&fsp))
64 die_with_post_code(POST_INVALID_CBFS, "Unable to locate fsp.bin");
65
66 /* This leaks a mapping which this code assumes is benign as
67 * the flash is memory mapped CPU's address space. */
68 FSP_INFO_HEADER *fih = find_fsp((uintptr_t)rdev_mmap_full(prog_rdev(&fsp)));
Aaron Durbin909c5122015-09-29 17:41:30 -050069
John Zhaod3a73282019-05-31 09:58:49 -070070 if (!fih)
71 die("Invalid FSP header\n");
72
Arthur Heymansbe291e82019-01-06 07:35:11 +010073 cache_as_ram_stage_main(fih);
Aaron Durbine6af4be2015-09-24 12:26:31 -050074}