Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 1 | // SPDX-License-Identifier: Intel |
| 2 | /* |
| 3 | * Copyright (C) 2015-2016 Intel Corp. |
| 4 | * (Written by Andrey Petrov <andrey.petrov@intel.com> for Intel Corp.) |
| 5 | * |
| 6 | * Mostly taken from coreboot fsp2_0/silicon_init.c |
| 7 | */ |
| 8 | |
| 9 | #define LOG_CATEGORY UCLASS_NORTHBRIDGE |
| 10 | |
| 11 | #include <common.h> |
| 12 | #include <binman.h> |
Simon Glass | 1ea9789 | 2020-05-10 11:40:00 -0600 | [diff] [blame] | 13 | #include <bootstage.h> |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 14 | #include <dm.h> |
Simon Glass | 0f2af88 | 2020-05-10 11:40:05 -0600 | [diff] [blame] | 15 | #include <log.h> |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 16 | #include <asm/arch/fsp/fsp_configs.h> |
| 17 | #include <asm/arch/fsp/fsp_s_upd.h> |
| 18 | #include <asm/fsp/fsp_infoheader.h> |
| 19 | #include <asm/fsp2/fsp_internal.h> |
| 20 | |
| 21 | int fsp_silicon_init(bool s3wake, bool use_spi_flash) |
| 22 | { |
| 23 | struct fsps_upd upd, *fsp_upd; |
| 24 | fsp_silicon_init_func func; |
| 25 | struct fsp_header *hdr; |
| 26 | struct binman_entry entry; |
| 27 | struct udevice *dev; |
| 28 | ulong rom_offset = 0; |
Simon Glass | ec7c2b6 | 2020-09-22 12:45:37 -0600 | [diff] [blame] | 29 | u32 init_addr; |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 30 | int ret; |
| 31 | |
Simon Glass | ec7c2b6 | 2020-09-22 12:45:37 -0600 | [diff] [blame] | 32 | log_debug("Locating FSP\n"); |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 33 | ret = fsp_locate_fsp(FSP_S, &entry, use_spi_flash, &dev, &hdr, |
| 34 | &rom_offset); |
| 35 | if (ret) |
| 36 | return log_msg_ret("locate FSP", ret); |
Simon Glass | 5e40c05 | 2020-07-07 21:32:25 -0600 | [diff] [blame] | 37 | binman_set_rom_offset(rom_offset); |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 38 | gd->arch.fsp_s_hdr = hdr; |
| 39 | |
| 40 | /* Copy over the default config */ |
| 41 | fsp_upd = (struct fsps_upd *)(hdr->img_base + hdr->cfg_region_off); |
| 42 | if (fsp_upd->header.signature != FSPS_UPD_SIGNATURE) |
| 43 | return log_msg_ret("Bad UPD signature", -EPERM); |
| 44 | memcpy(&upd, fsp_upd, sizeof(upd)); |
| 45 | |
| 46 | ret = fsps_update_config(dev, rom_offset, &upd); |
| 47 | if (ret) |
| 48 | return log_msg_ret("Could not setup config", ret); |
Simon Glass | ec7c2b6 | 2020-09-22 12:45:37 -0600 | [diff] [blame] | 49 | log_debug("Silicon init @ %x...", init_addr); |
Simon Glass | ea6a609 | 2020-05-10 11:39:59 -0600 | [diff] [blame] | 50 | bootstage_start(BOOTSTAGE_ID_ACCUM_FSP_S, "fsp-s"); |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 51 | func = (fsp_silicon_init_func)(hdr->img_base + hdr->fsp_silicon_init); |
| 52 | ret = func(&upd); |
Simon Glass | ea6a609 | 2020-05-10 11:39:59 -0600 | [diff] [blame] | 53 | bootstage_accum(BOOTSTAGE_ID_ACCUM_FSP_S); |
Simon Glass | 466c785 | 2019-12-06 21:42:18 -0700 | [diff] [blame] | 54 | if (ret) |
| 55 | return log_msg_ret("Silicon init fail\n", ret); |
| 56 | log_debug("done\n"); |
| 57 | |
| 58 | return 0; |
| 59 | } |