blob: c9f6402e6a4c730ae0e813106b0d0c2a7f3eb920 [file] [log] [blame]
Simon Glass466c7852019-12-06 21:42:18 -07001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright 2019 Google LLC
4 * Written by Simon Glass <sjg@chromium.org>
5 */
6
7#include <common.h>
Simon Glass466c7852019-12-06 21:42:18 -07008#include <handoff.h>
Simon Glass97589732020-05-10 11:40:02 -06009#include <init.h>
Simon Glass0f2af882020-05-10 11:40:05 -060010#include <log.h>
Simon Glass466c7852019-12-06 21:42:18 -070011#include <spl.h>
Simon Glass50461092020-04-08 16:57:35 -060012#include <acpi/acpi_s3.h>
Simon Glass466c7852019-12-06 21:42:18 -070013#include <asm/arch/cpu.h>
14#include <asm/fsp/fsp_support.h>
15#include <asm/fsp2/fsp_api.h>
16#include <asm/fsp2/fsp_internal.h>
Simon Glassd89c4a32020-04-26 09:12:53 -060017#include <linux/sizes.h>
Simon Glass466c7852019-12-06 21:42:18 -070018
19int dram_init(void)
20{
21 int ret;
22
Simon Glassd89c4a32020-04-26 09:12:53 -060023 if (!ll_boot_init()) {
24 /* Use a small and safe amount of 1GB */
25 gd->ram_size = SZ_1G;
26
27 return 0;
28 }
Simon Glass466c7852019-12-06 21:42:18 -070029 if (spl_phase() == PHASE_SPL) {
Simon Glass466c7852019-12-06 21:42:18 -070030 bool s3wake = false;
Simon Glasse6ad2022020-07-09 18:43:16 -060031
32 s3wake = IS_ENABLED(CONFIG_HAVE_ACPI_RESUME) &&
33 gd->arch.prev_sleep_state == ACPI_S3;
Simon Glass466c7852019-12-06 21:42:18 -070034
35 ret = fsp_memory_init(s3wake,
36 IS_ENABLED(CONFIG_APL_BOOT_FROM_FAST_SPI_FLASH));
37 if (ret) {
38 debug("Memory init failed (err=%x)\n", ret);
39 return ret;
40 }
41
42 /* The FSP has already set up DRAM, so grab the info we need */
43 ret = fsp_scan_for_ram_size();
44 if (ret)
45 return ret;
46
47#ifdef CONFIG_ENABLE_MRC_CACHE
48 gd->arch.mrc[MRC_TYPE_NORMAL].buf =
49 fsp_get_nvs_data(gd->arch.hob_list,
50 &gd->arch.mrc[MRC_TYPE_NORMAL].len);
51 gd->arch.mrc[MRC_TYPE_VAR].buf =
52 fsp_get_var_nvs_data(gd->arch.hob_list,
53 &gd->arch.mrc[MRC_TYPE_VAR].len);
54 log_debug("normal %x, var %x\n",
55 gd->arch.mrc[MRC_TYPE_NORMAL].len,
56 gd->arch.mrc[MRC_TYPE_VAR].len);
57#endif
58 } else {
59#if CONFIG_IS_ENABLED(HANDOFF)
60 struct spl_handoff *ho = gd->spl_handoff;
61
62 if (!ho) {
63 debug("No SPL handoff found\n");
64 return -ESTRPIPE;
65 }
66 gd->ram_size = ho->ram_size;
67 handoff_load_dram_banks(ho);
68#endif
69 ret = arch_fsps_preinit();
70 if (ret)
71 return log_msg_ret("fsp_s_preinit", ret);
72 }
73
74 return 0;
75}
76
77ulong board_get_usable_ram_top(ulong total_size)
78{
Simon Glassd89c4a32020-04-26 09:12:53 -060079 if (!ll_boot_init())
80 return gd->ram_size;
81
Simon Glass466c7852019-12-06 21:42:18 -070082#if CONFIG_IS_ENABLED(HANDOFF)
83 struct spl_handoff *ho = gd->spl_handoff;
84
85 return ho->arch.usable_ram_top;
86#endif
87
88 return gd->ram_top;
89}