]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
191c008a | 2 | /* |
bfa95c53 | 3 | * Copyright (C) 2014 Google, Inc |
ed800961 | 4 | * Copyright (C) 2015 Bin Meng <bmeng.cn@gmail.com> |
191c008a SG |
5 | */ |
6 | ||
bfa95c53 BM |
7 | #ifndef _ASM_MRCCACHE_H |
8 | #define _ASM_MRCCACHE_H | |
191c008a | 9 | |
112629c5 | 10 | #define MRC_DATA_ALIGN 0x100 |
bfa95c53 BM |
11 | #define MRC_DATA_SIGNATURE (('M' << 0) | ('R' << 8) | \ |
12 | ('C' << 16) | ('D'<<24)) | |
191c008a | 13 | |
ed800961 BM |
14 | #define MRC_DATA_HEADER_SIZE 32 |
15 | ||
bfa95c53 | 16 | struct __packed mrc_data_container { |
191c008a SG |
17 | u32 signature; /* "MRCD" */ |
18 | u32 data_size; /* Size of the 'data' field */ | |
19 | u32 checksum; /* IP style checksum */ | |
20 | u32 reserved; /* For header alignment */ | |
21 | u8 data[0]; /* Variable size, platform/run time dependent */ | |
22 | }; | |
23 | ||
4b9f6a66 BM |
24 | struct mrc_region { |
25 | u32 base; | |
26 | u32 offset; | |
27 | u32 length; | |
28 | }; | |
29 | ||
515e8174 SG |
30 | /* Types of MRC data */ |
31 | enum mrc_type_t { | |
32 | MRC_TYPE_NORMAL, | |
0a0b09b4 | 33 | MRC_TYPE_VAR, |
515e8174 SG |
34 | |
35 | MRC_TYPE_COUNT, | |
36 | }; | |
37 | ||
ba457562 | 38 | struct udevice; |
191c008a SG |
39 | |
40 | /** | |
41 | * mrccache_find_current() - find the latest MRC cache record | |
42 | * | |
43 | * This searches the MRC cache region looking for the latest record to use | |
44 | * for setting up SDRAM | |
45 | * | |
bfa95c53 | 46 | * @entry: Position and size of MRC cache in SPI flash |
191c008a SG |
47 | * @return pointer to latest record, or NULL if none |
48 | */ | |
4b9f6a66 | 49 | struct mrc_data_container *mrccache_find_current(struct mrc_region *entry); |
191c008a | 50 | |
ed800961 BM |
51 | /** |
52 | * mrccache_reserve() - reserve MRC data on the stack | |
53 | * | |
54 | * This copies MRC data pointed by gd->arch.mrc_output to a new place on the | |
55 | * stack with length gd->arch.mrc_output_len, and updates gd->arch.mrc_output | |
56 | * to point to the new place once the migration is done. | |
57 | * | |
58 | * This routine should be called by reserve_arch() before U-Boot is relocated | |
59 | * when MRC cache is enabled. | |
60 | * | |
61 | * @return 0 always | |
62 | */ | |
63 | int mrccache_reserve(void); | |
64 | ||
65 | /** | |
66 | * mrccache_get_region() - get MRC region on the SPI flash | |
67 | * | |
68 | * This gets MRC region whose offset and size are described in the device tree | |
70c3c911 SG |
69 | * as a subnode to the SPI flash. This tries to find the SPI flash device |
70 | * (without probing it), falling back to looking for the devicetree node if | |
71 | * driver model is not inited or the SPI flash is not found. | |
ed800961 | 72 | * |
515e8174 | 73 | * @type: Type of MRC data to use |
70c3c911 | 74 | * @devp: Returns pointer to the SPI flash device, if found |
ed800961 BM |
75 | * @entry: Position and size of MRC cache in SPI flash |
76 | * @return 0 if success, -ENOENT if SPI flash node does not exist in the | |
77 | * device tree, -EPERM if MRC region subnode does not exist in the device | |
78 | * tree, -EINVAL if MRC region properties format is incorrect, other error | |
79 | * if SPI flash probe failed. | |
80 | */ | |
515e8174 SG |
81 | int mrccache_get_region(enum mrc_type_t type, struct udevice **devp, |
82 | struct mrc_region *entry); | |
ed800961 BM |
83 | |
84 | /** | |
85 | * mrccache_save() - save MRC data to the SPI flash | |
86 | * | |
87 | * This saves MRC data stored previously by gd->arch.mrc_output to a proper | |
88 | * place within the MRC region on the SPI flash. | |
89 | * | |
90 | * @return 0 if saved to SPI flash successfully, other error if failed | |
91 | */ | |
92 | int mrccache_save(void); | |
93 | ||
9a67994e SG |
94 | /** |
95 | * mrccache_spl_save() - Save to the MRC region from SPL | |
96 | * | |
97 | * When SPL is used to set up the memory controller we want to save the MRC | |
98 | * data in SPL to avoid needing to pass it up to U-Boot proper to save. This | |
99 | * function handles that. | |
100 | * | |
101 | * @return 0 if saved to SPI flash successfully, other error if failed | |
102 | */ | |
103 | int mrccache_spl_save(void); | |
104 | ||
bfa95c53 | 105 | #endif /* _ASM_MRCCACHE_H */ |