1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2019 Google LLC
4 * Written by Simon Glass <sjg@chromium.org>
11 #include <acpi/acpi_s3.h>
12 #include <asm/arch/cpu.h>
13 #include <asm/fsp/fsp_support.h>
14 #include <asm/fsp2/fsp_api.h>
15 #include <asm/fsp2/fsp_internal.h>
16 #include <linux/sizes.h>
22 if (!ll_boot_init()) {
23 /* Use a small and safe amount of 1GB */
28 if (spl_phase() == PHASE_SPL) {
29 #ifdef CONFIG_HAVE_ACPI_RESUME
30 bool s3wake = gd->arch.prev_sleep_state == ACPI_S3;
35 ret = fsp_memory_init(s3wake,
36 IS_ENABLED(CONFIG_APL_BOOT_FROM_FAST_SPI_FLASH));
38 debug("Memory init failed (err=%x)\n", ret);
42 /* The FSP has already set up DRAM, so grab the info we need */
43 ret = fsp_scan_for_ram_size();
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);
59 #if CONFIG_IS_ENABLED(HANDOFF)
60 struct spl_handoff *ho = gd->spl_handoff;
63 debug("No SPL handoff found\n");
66 gd->ram_size = ho->ram_size;
67 handoff_load_dram_banks(ho);
69 ret = arch_fsps_preinit();
71 return log_msg_ret("fsp_s_preinit", ret);
77 ulong board_get_usable_ram_top(ulong total_size)
82 #if CONFIG_IS_ENABLED(HANDOFF)
83 struct spl_handoff *ho = gd->spl_handoff;
85 return ho->arch.usable_ram_top;