1 /* SPDX-License-Identifier: Intel */
2 /*
3  * Copyright (C) 2015-2016 Intel Corp.
4  * (Written by Alexandru Gagniuc <alexandrux.gagniuc@intel.com> for Intel Corp.)
5  * Mostly taken from coreboot
6  */
7 
8 #ifndef __ASM_FSP_INTERNAL_H
9 #define __ASM_FSP_INTERNAL_H
10 
11 struct binman_entry;
12 struct fsp_header;
13 struct fspm_upd;
14 struct fsps_upd;
15 
16 enum fsp_type_t {
17 	FSP_M,
18 	FSP_S,
19 };
20 
21 int fsp_get_header(ulong offset, ulong size, bool use_spi_flash,
22 		   struct fsp_header **fspp);
23 
24 /**
25  * fsp_locate_fsp() - Locate an FSP component
26  *
27  * This finds an FSP component by various methods. It is not as general-purpose
28  * as it looks, since it expects FSP-M to be requested in SPL (only), and FSP-S
29  * to be requested in U-Boot proper.
30  *
31  * @type: Component to locate
32  * @entry: Returns location of component
33  * @use_spi_flash: true to read using the Fast SPI driver, false to use
34  *	memory-mapped SPI flash
35  * @devp: Returns northbridge device
36  * @hdrp: Returns FSP header
37  * @rom_offsetp: If non-NULL, returns the offset to add to any image position to
38  *	find the memory-mapped location of that position. For example, for ROM
39  *	position 0x1000, it will be mapped into 0x1000 + *rom_offsetp.
40  */
41 int fsp_locate_fsp(enum fsp_type_t type, struct binman_entry *entry,
42 		   bool use_spi_flash, struct udevice **devp,
43 		   struct fsp_header **hdrp, ulong *rom_offsetp);
44 
45 /**
46  * arch_fsps_preinit() - Perform init needed before calling FSP-S
47  *
48  * This allows use of probed drivers and PCI so is a convenient place to do any
49  * init that is needed before FSP-S is called. After this, U-Boot relocates and
50  * calls arch_fsp_init_r() before PCI is probed, and that function is not
51  * allowed to probe PCI before calling FSP-S.
52  */
53 int arch_fsps_preinit(void);
54 
55 /**
56  * fspm_update_config() - Set up the config structure for FSP-M
57  *
58  * @dev: Hostbridge device containing config
59  * @upd: Config data to fill in
60  * @return 0 if OK, -ENOENT if OK but no MRC-cache data was found, other -ve on
61  *	error
62  */
63 int fspm_update_config(struct udevice *dev, struct fspm_upd *upd);
64 
65 /**
66  * fspm_done() - Indicate that memory init is complete
67  *
68  * This allows the board to do whatever post-init it needs before things
69  * continue.
70  *
71  * @dev: Hostbridge device
72  * @return 0 if OK, -ve on error
73  */
74 int fspm_done(struct udevice *dev);
75 
76 /**
77  * fsps_update_config() - Set up the config structure for FSP-S
78  *
79  * @dev: Hostbridge device containing config
80  * @rom_offset: Value to add to convert from ROM offset to memory-mapped address
81  * @upd: Config data to fill in
82  * @return 0 if OK, -ve on error
83  */
84 int fsps_update_config(struct udevice *dev, ulong rom_offset,
85 		       struct fsps_upd *upd);
86 
87 /**
88  * prepare_mrc_cache() - Read the MRC cache into the product-data struct
89  *
90  * This looks for cached Memory-reference code (MRC) data and stores it into
91  * @upd for use by the FSP-M binary.
92  *
93  * @return 0 if OK, -ENOENT if no data (whereupon the caller can continue and
94  *	expect a slower boot), other -ve value on other error
95  */
96 int prepare_mrc_cache(struct fspm_upd *upd);
97 
98 #endif
99