1 /* 2 * Copyright (C) 2013, Intel Corporation 3 * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com> 4 * 5 * SPDX-License-Identifier: Intel 6 */ 7 8 #ifndef __FSP_SUPPORT_H__ 9 #define __FSP_SUPPORT_H__ 10 11 #include "fsp_types.h" 12 #include "fsp_fv.h" 13 #include "fsp_ffs.h" 14 #include "fsp_api.h" 15 #include "fsp_hob.h" 16 #include "fsp_platform.h" 17 #include "fsp_infoheader.h" 18 #include "fsp_bootmode.h" 19 #include <asm/arch/fsp/fsp_vpd.h> 20 21 struct shared_data { 22 struct fsp_header *fsp_hdr; 23 u32 stack_top; 24 struct upd_region fsp_upd; 25 }; 26 27 #define FSP_LOWMEM_BASE 0x100000UL 28 #define FSP_HIGHMEM_BASE 0x100000000ULL 29 #define UPD_TERMINATOR 0x55AA 30 31 32 /** 33 * FSP Continuation assembly helper routine 34 * 35 * This routine jumps to the C version of FSP continuation function 36 */ 37 void asm_continuation(void); 38 39 /** 40 * FSP initialization complete 41 * 42 * This is the function that indicates FSP initialization is complete and jumps 43 * back to the bootloader with HOB list pointer as the parameter. 44 * 45 * @hob_list: HOB list pointer 46 */ 47 void fsp_init_done(void *hob_list); 48 49 /** 50 * FSP Continuation function 51 * 52 * @status: Always 0 53 * @hob_list: HOB list pointer 54 * 55 * @retval: Never returns 56 */ 57 void fsp_continue(u32 status, void *hob_list); 58 59 /** 60 * Find FSP header offset in FSP image 61 * 62 * @retval: the offset of FSP header. If signature is invalid, returns 0. 63 */ 64 struct fsp_header *find_fsp_header(void); 65 66 /** 67 * FSP initialization wrapper function. 68 * 69 * @stack_top: bootloader stack top address 70 * @boot_mode: boot mode defined in fsp_bootmode.h 71 * @nvs_buf: Non-volatile memory buffer pointer 72 */ 73 void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf); 74 75 /** 76 * FSP notification wrapper function 77 * 78 * @fsp_hdr: Pointer to FSP information header 79 * @phase: FSP initialization phase defined in enum fsp_phase 80 * 81 * @retval: compatible status code with EFI_STATUS defined in PI spec 82 */ 83 u32 fsp_notify(struct fsp_header *fsp_hdr, u32 phase); 84 85 /** 86 * This function retrieves the top of usable low memory. 87 * 88 * @hob_list: A HOB list pointer. 89 * 90 * @retval: Usable low memory top. 91 */ 92 u32 fsp_get_usable_lowmem_top(const void *hob_list); 93 94 /** 95 * This function retrieves the top of usable high memory. 96 * 97 * @hob_list: A HOB list pointer. 98 * 99 * @retval: Usable high memory top. 100 */ 101 u64 fsp_get_usable_highmem_top(const void *hob_list); 102 103 /** 104 * This function retrieves a special reserved memory region. 105 * 106 * @hob_list: A HOB list pointer. 107 * @len: A pointer to the GUID HOB data buffer length. 108 * If the GUID HOB is located, the length will be updated. 109 * @guid: A pointer to the owner guild. 110 * 111 * @retval: Reserved region start address. 112 * 0 if this region does not exist. 113 */ 114 u64 fsp_get_reserved_mem_from_guid(const void *hob_list, 115 u64 *len, struct efi_guid *guid); 116 117 /** 118 * This function retrieves the FSP reserved normal memory. 119 * 120 * @hob_list: A HOB list pointer. 121 * @len: A pointer to the FSP reserved memory length buffer. 122 * If the GUID HOB is located, the length will be updated. 123 * @retval: FSP reserved memory base 124 * 0 if this region does not exist. 125 */ 126 u32 fsp_get_fsp_reserved_mem(const void *hob_list, u32 *len); 127 128 /** 129 * This function retrieves the TSEG reserved normal memory. 130 * 131 * @hob_list: A HOB list pointer. 132 * @len: A pointer to the TSEG reserved memory length buffer. 133 * If the GUID HOB is located, the length will be updated. 134 * 135 * @retval NULL: Failed to find the TSEG reserved memory. 136 * @retval others: TSEG reserved memory base. 137 */ 138 u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len); 139 140 /** 141 * Returns the next instance of a HOB type from the starting HOB. 142 * 143 * @type: HOB type to search 144 * @hob_list: A pointer to the HOB list 145 * 146 * @retval: A HOB object with matching type; Otherwise NULL. 147 */ 148 const struct hob_header *fsp_get_next_hob(uint type, const void *hob_list); 149 150 /** 151 * Returns the next instance of the matched GUID HOB from the starting HOB. 152 * 153 * @guid: GUID to search 154 * @hob_list: A pointer to the HOB list 155 * 156 * @retval: A HOB object with matching GUID; Otherwise NULL. 157 */ 158 const struct hob_header *fsp_get_next_guid_hob(const struct efi_guid *guid, 159 const void *hob_list); 160 161 /** 162 * This function retrieves a GUID HOB data buffer and size. 163 * 164 * @hob_list: A HOB list pointer. 165 * @len: A pointer to the GUID HOB data buffer length. 166 * If the GUID HOB is located, the length will be updated. 167 * @guid A pointer to HOB GUID. 168 * 169 * @retval NULL: Failed to find the GUID HOB. 170 * @retval others: GUID HOB data buffer pointer. 171 */ 172 void *fsp_get_guid_hob_data(const void *hob_list, u32 *len, 173 struct efi_guid *guid); 174 175 /** 176 * This function retrieves FSP Non-volatile Storage HOB buffer and size. 177 * 178 * @hob_list: A HOB list pointer. 179 * @len: A pointer to the NVS data buffer length. 180 * If the HOB is located, the length will be updated. 181 * 182 * @retval NULL: Failed to find the NVS HOB. 183 * @retval others: FSP NVS data buffer pointer. 184 */ 185 void *fsp_get_nvs_data(const void *hob_list, u32 *len); 186 187 /** 188 * This function retrieves Bootloader temporary stack buffer and size. 189 * 190 * @hob_list: A HOB list pointer. 191 * @len: A pointer to the bootloader temporary stack length. 192 * If the HOB is located, the length will be updated. 193 * 194 * @retval NULL: Failed to find the bootloader temporary stack HOB. 195 * @retval others: Bootloader temporary stackbuffer pointer. 196 */ 197 void *fsp_get_bootloader_tmp_mem(const void *hob_list, u32 *len); 198 199 /** 200 * This function overrides the default configurations in the UPD data region. 201 * 202 * @fsp_upd: A pointer to the upd_region data strcture 203 * 204 * @return: None 205 */ 206 void update_fsp_upd(struct upd_region *fsp_upd); 207 208 /** 209 * fsp_init_phase_pci() - Tell the FSP that we have completed PCI init 210 * 211 * @return 0 if OK, -EPERM if the FSP gave an error. 212 */ 213 int fsp_init_phase_pci(void); 214 215 #endif 216