blob: 6583b649a1bc9c986919435f23814916fcc94465 [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Andrey Petrovb37fd672016-03-01 16:25:38 -08002
3#ifndef _FSP2_0_UTIL_H_
4#define _FSP2_0_UTIL_H_
5
6#include <boot/coreboot_tables.h>
Julius Werner8205ce62021-03-10 17:25:01 -08007#include <cbfs.h>
Aaron Durbina413e5e2016-07-17 23:06:03 -05008#include <commonlib/region.h>
Lee Leahy672df162016-07-24 18:21:13 -07009#include <arch/cpu.h>
Andrey Petrov901e43c2016-06-22 19:22:30 -070010#include <fsp/api.h>
Andrey Petrovb37fd672016-03-01 16:25:38 -080011#include <fsp/info_header.h>
Andrey Petrovb37fd672016-03-01 16:25:38 -080012#include <memrange.h>
Aaron Durbina85febc2020-05-15 15:09:10 -060013#include <program_loading.h>
Elyes HAOUASbd1683d2019-05-15 21:05:37 +020014#include <types.h>
Andrey Petrovb37fd672016-03-01 16:25:38 -080015
Johnny Linb8899ef2020-05-28 14:04:58 +080016#define FSP_VER_LEN 30
17
Lee Leahy672df162016-07-24 18:21:13 -070018struct hob_header {
19 uint16_t type;
20 uint16_t length;
Stefan Reinauer6a001132017-07-13 02:20:27 +020021} __packed;
Lee Leahy672df162016-07-24 18:21:13 -070022
23struct fsp_notify_params {
24 enum fsp_notify_phase phase;
25};
26
Subrata Banik33d9c4a2020-05-26 18:26:54 +053027enum fsp_multi_phase_action {
28 GET_NUMBER_OF_PHASES = 0,
29 EXECUTE_PHASE = 1
30};
31
32struct fsp_multi_phase_params {
33 enum fsp_multi_phase_action multi_phase_action;
34 uint32_t phase_index;
35 void *multi_phase_param_ptr;
36};
37
Lee Leahyac3b0a62016-07-27 07:40:25 -070038struct hob_resource {
39 uint8_t owner_guid[16];
40 uint32_t type;
41 uint32_t attribute_type;
42 uint64_t addr;
43 uint64_t length;
Stefan Reinauer6a001132017-07-13 02:20:27 +020044} __packed;
Lee Leahyac3b0a62016-07-27 07:40:25 -070045
Johnny Lin5b47d772020-11-13 17:21:25 +080046union fsp_revision {
47 uint32_t val;
48 struct {
49 uint8_t bld_num;
50 uint8_t revision;
51 uint8_t minor;
52 uint8_t major;
53 } rev;
54};
55
Subrata Banik491728f2018-01-22 16:30:56 +053056#if CONFIG_UDK_VERSION < CONFIG_UDK_2017_VERSION
Lee Leahy5a9ca4d2016-09-28 17:15:00 -070057enum resource_type {
58 EFI_RESOURCE_SYSTEM_MEMORY = 0,
59 EFI_RESOURCE_MEMORY_MAPPED_IO = 1,
60 EFI_RESOURCE_IO = 2,
61 EFI_RESOURCE_FIRMWARE_DEVICE = 3,
62 EFI_RESOURCE_MEMORY_MAPPED_IO_PORT = 4,
63 EFI_RESOURCE_MEMORY_RESERVED = 5,
64 EFI_RESOURCE_IO_RESERVED = 6,
65 EFI_RESOURCE_MAX_MEMORY_TYPE = 7,
66};
Subrata Banik491728f2018-01-22 16:30:56 +053067#endif
Lee Leahy5a9ca4d2016-09-28 17:15:00 -070068
Lee Leahyac3b0a62016-07-27 07:40:25 -070069enum hob_type {
70 HOB_TYPE_HANDOFF = 0x0001,
71 HOB_TYPE_MEMORY_ALLOCATION = 0x0002,
72 HOB_TYPE_RESOURCE_DESCRIPTOR = 0x0003,
73 HOB_TYPE_GUID_EXTENSION = 0x0004,
74 HOB_TYPE_FV = 0x0005,
75 HOB_TYPE_CPU = 0x0006,
76 HOB_TYPE_MEMORY_POOL = 0x0007,
77 HOB_TYPE_FV2 = 0x0009,
78 HOB_TYPE_LOAD_PEIM_UNUSED = 0x000A,
79 HOB_TYPE_UCAPSULE = 0x000B,
80 HOB_TYPE_UNUSED = 0xFFFE,
81 HOB_TYPE_END_OF_HOB_LIST = 0xFFFF,
82};
83
Lee Leahy52d0c682016-08-01 15:47:42 -070084extern const uint8_t fsp_bootloader_tolum_guid[16];
Lee Leahyac3b0a62016-07-27 07:40:25 -070085extern const uint8_t fsp_nv_storage_guid[16];
86extern const uint8_t fsp_reserved_memory_guid[16];
87
Andrey Petrovb37fd672016-03-01 16:25:38 -080088const void *fsp_get_hob_list(void);
Lee Leahyac3b0a62016-07-27 07:40:25 -070089void *fsp_get_hob_list_ptr(void);
90const void *fsp_find_extension_hob_by_guid(const uint8_t *guid, size_t *size);
Hannah Williams3503b3f2016-03-04 12:14:52 -080091const void *fsp_find_nv_storage_data(size_t *size);
Lee Leahy52d0c682016-08-01 15:47:42 -070092int fsp_find_range_hob(struct range_entry *re, const uint8_t guid[16]);
Subrata Banik73b67dc2018-01-23 16:31:03 +053093void fsp_display_fvi_version_hob(void);
Michael Niewöhnerbc1dbb32019-10-24 22:58:25 +020094void fsp_find_reserved_memory(struct range_entry *re);
Lee Leahyac3b0a62016-07-27 07:40:25 -070095const struct hob_resource *fsp_hob_header_to_resource(
96 const struct hob_header *hob);
97const struct hob_header *fsp_next_hob(const struct hob_header *parent);
98bool fsp_guid_compare(const uint8_t guid1[16], const uint8_t guid2[16]);
Michael Niewöhnerbc1dbb32019-10-24 22:58:25 +020099void fsp_find_bootloader_tolum(struct range_entry *re);
Johnny Linb8899ef2020-05-28 14:04:58 +0800100void fsp_get_version(char *buf);
Felix Held88995982021-01-28 22:43:52 +0100101/* fsp_verify_upd_header_signature calls die() on signature mismatch */
102void fsp_verify_upd_header_signature(uint64_t upd_signature, uint64_t expected_signature);
Johnny Linb8899ef2020-05-28 14:04:58 +0800103void lb_string_platform_blob_version(struct lb_header *header);
Arthur Heymans5a663342020-10-28 14:03:14 +0100104void report_fspt_output(void);
Johnny Lin5b47d772020-11-13 17:21:25 +0800105void soc_validate_fsp_version(const struct fsp_header *hdr);
Andrey Petrovb37fd672016-03-01 16:25:38 -0800106
Aaron Durbina413e5e2016-07-17 23:06:03 -0500107/* Fill in header and validate sanity of component within region device. */
108enum cb_err fsp_validate_component(struct fsp_header *hdr,
109 const struct region_device *rdev);
110
Aaron Durbina85febc2020-05-15 15:09:10 -0600111struct fsp_load_descriptor {
112 /* fsp_prog object will have region_device initialized to final
113 * load location in memory. */
114 struct prog fsp_prog;
Julius Werner8205ce62021-03-10 17:25:01 -0800115 /* CBFS allocator to place loaded FSP. NULL to map flash directly. */
116 cbfs_allocator_t alloc;
Aaron Durbinecbfa992020-05-15 17:01:58 -0600117 /* Optional argument to be utilized by get_destination() callback. */
118 void *arg;
Aaron Durbina85febc2020-05-15 15:09:10 -0600119};
120
121/* Load the FSP component described by fsp_load_descriptor from cbfs. The FSP
122 * header object will be validated and filled in on successful load. */
123enum cb_err fsp_load_component(struct fsp_load_descriptor *fspld, struct fsp_header *hdr);
124
Andrey Petrov3a94a3b2016-07-18 00:15:41 -0700125/*
126 * Handle FSP reboot request status. Chipset/soc is expected to provide
127 * chipset_handle_reset() that deals with reset type codes specific to given
128 * SoC. If the requested status is not a reboot status or unhandled, this
129 * function does nothing.
130 */
Brandon Breitensteinc31ba0e2016-07-27 17:34:45 -0700131void fsp_handle_reset(uint32_t status);
Andrey Petrov3a94a3b2016-07-18 00:15:41 -0700132
133/* SoC/chipset must provide this to handle platform-specific reset codes */
Brandon Breitensteinc31ba0e2016-07-27 17:34:45 -0700134void chipset_handle_reset(uint32_t status);
Andrey Petrov901e43c2016-06-22 19:22:30 -0700135
Brenton Dong0a5971c2016-10-18 11:35:15 -0700136typedef asmlinkage uint32_t (*temp_ram_exit_fn)(void *param);
Brandon Breitensteinc31ba0e2016-07-27 17:34:45 -0700137typedef asmlinkage uint32_t (*fsp_memory_init_fn)
Lee Leahy672df162016-07-24 18:21:13 -0700138 (void *raminit_upd, void **hob_list);
Brandon Breitensteinc31ba0e2016-07-27 17:34:45 -0700139typedef asmlinkage uint32_t (*fsp_silicon_init_fn)(void *silicon_upd);
Subrata Banik33d9c4a2020-05-26 18:26:54 +0530140typedef asmlinkage uint32_t (*fsp_multi_phase_si_init_fn)(struct fsp_multi_phase_params *);
Brandon Breitensteinc31ba0e2016-07-27 17:34:45 -0700141typedef asmlinkage uint32_t (*fsp_notify_fn)(struct fsp_notify_params *);
Lee Leahy672df162016-07-24 18:21:13 -0700142#include <fsp/debug.h>
143
Andrey Petrovb37fd672016-03-01 16:25:38 -0800144#endif /* _FSP2_0_UTIL_H_ */