blob: f2d29aa4a8c1951e766afb34ff6a679059842d51 [file] [log] [blame]
Angel Pons8a3453f2020-04-02 23:48:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Lee Leahy3dad4892015-05-05 11:14:02 -07002
Arthur Heymans8256ca02019-10-21 18:47:46 +02003#include <cpu/x86/mtrr.h>
4#include <cpu/x86/cache.h>
Frans Hendriks4e0ec592019-06-06 10:07:17 +02005#include <cpu/x86/post_code.h>
6
Lee Leahyb5ad8272015-04-20 15:29:16 -07007/*
8 * Replacement for cache_as_ram.inc when using the FSP binary. This code
9 * locates the FSP binary, initializes the cache as RAM and performs the
10 * first stage of initialization. Next this code switches the stack from
11 * the cache to RAM and then disables the cache as RAM. Finally this code
12 * performs the final stage of initialization.
13 */
14
Frans Hendriks4e0ec592019-06-06 10:07:17 +020015#define LHLT_DELAY 0x50000 /* I/O delay between post codes on failure */
16
17.global bootblock_pre_c_entry
18bootblock_pre_c_entry:
Lee Leahyb5ad8272015-04-20 15:29:16 -070019 /*
Kyösti Mälkkiee2e9362018-12-28 16:06:45 +020020 * Per FSP1.1 specs, following registers are preserved:
21 * EBX, EDI, ESI, EBP, MM0, MM1
22 *
23 * Shift values to release MM2.
Arthur Heymans59b65422019-05-23 15:24:30 +020024 * mm0 -> ebx: BIST value
Kyösti Mälkkiee2e9362018-12-28 16:06:45 +020025 * mm1 -> mm0: low 32-bits of TSC value
26 * mm2 -> mm1: high 32-bits of TSC value
Lee Leahyb5ad8272015-04-20 15:29:16 -070027 */
Arthur Heymans59b65422019-05-23 15:24:30 +020028 movd %mm0, %ebx
Kyösti Mälkkiee2e9362018-12-28 16:06:45 +020029 movd %mm1, %eax
30 movd %eax, %mm0
31 movd %mm2, %eax
32 movd %eax, %mm1
33
Lee Leahy3dad4892015-05-05 11:14:02 -070034cache_as_ram:
35 post_code(0x20)
36
Arthur Heymans8256ca02019-10-21 18:47:46 +020037 /* Cache the rom and update the microcode */
38cache_rom:
39 /* Disable cache */
40 movl %cr0, %eax
41 orl $CR0_CacheDisable, %eax
42 movl %eax, %cr0
43
44 movl $MTRR_PHYS_BASE(1), %ecx
45 xorl %edx, %edx
46 movl $(CACHE_ROM_BASE | MTRR_TYPE_WRPROT), %eax
47 wrmsr
48
49 movl $MTRR_PHYS_MASK(1), %ecx
50 rdmsr
51 movl $(~(CACHE_ROM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
52 wrmsr
53
54 /* Enable cache */
55 movl %cr0, %eax
56 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
57 invd
58 movl %eax, %cr0
59
60 /* Enable MTRR. */
61 movl $MTRR_DEF_TYPE_MSR, %ecx
62 rdmsr
63 orl $MTRR_DEF_TYPE_EN, %eax
64 wrmsr
65
66 /* The Google FSP release for Braswell has broken microcode update
67 code and FSP needs the installed microcode revision to be non zero.
68 It is better to have coreboot do it instead of relying on a fragile
69 blob. */
70update_microcode:
71 /* put the return address in %esp */
72 movl $end_microcode_update, %esp
73 jmp update_bsp_microcode
74end_microcode_update:
75
Lee Leahyb5ad8272015-04-20 15:29:16 -070076 /*
Lee Leahy3dad4892015-05-05 11:14:02 -070077 * Find the FSP binary in cbfs.
78 * Make a fake stack that has the return value back to this code.
79 */
Lee Leahyb5ad8272015-04-20 15:29:16 -070080 lea fake_fsp_stack, %esp
81 jmp find_fsp
Lee Leahy3dad4892015-05-05 11:14:02 -070082find_fsp_ret:
83 /* Save the FSP location */
Lee Leahyb5ad8272015-04-20 15:29:16 -070084 mov %eax, %ebp
85
86 /*
87 * Only when a valid FSP binary is found at CONFIG_FSP_LOC is
88 * the returned FSP_INFO_HEADER structure address above the base
89 * address of FSP binary specified by the CONFIG_FSP_LOC value.
90 * All of the error values are in the 0x8xxxxxxx range which are
91 * below the CONFIG_FSP_LOC value.
92 */
93 cmp $CONFIG_FSP_LOC, %eax
94 jbe halt1
Lee Leahy3dad4892015-05-05 11:14:02 -070095
Duncan Lauriefb509832015-11-22 14:53:57 -080096 post_code(POST_FSP_TEMP_RAM_INIT)
Lee Leahy3dad4892015-05-05 11:14:02 -070097
98 /* Calculate entry into FSP */
Lee Leahyb5ad8272015-04-20 15:29:16 -070099 mov 0x30(%ebp), %eax /* Load TempRamInitEntry */
100 add 0x1c(%ebp), %eax /* add in the offset for FSP */
Lee Leahy3dad4892015-05-05 11:14:02 -0700101
102 /*
103 * Pass early init variables on a fake stack (no memory yet)
104 * as well as the return location
105 */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700106 lea CAR_init_stack, %esp
Lee Leahy3dad4892015-05-05 11:14:02 -0700107
108 /*
Lee Leahyb5ad8272015-04-20 15:29:16 -0700109 * BIST value is zero
110 * eax: TempRamInitApi address
Arthur Heymans59b65422019-05-23 15:24:30 +0200111 * ebx: BIST value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700112 * ebp: FSP_INFO_HEADER address
Lee Leahyb5ad8272015-04-20 15:29:16 -0700113 * esi: Not used
114 * mm0: low 32-bits of TSC value
115 * mm1: high 32-bits of TSC value
Lee Leahy3dad4892015-05-05 11:14:02 -0700116 */
Lee Leahy3dad4892015-05-05 11:14:02 -0700117
Lee Leahyb5ad8272015-04-20 15:29:16 -0700118 /* call FSP binary to setup temporary stack */
119 jmp *%eax
120
121CAR_init_done:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700122
123 /*
124 * ebp: FSP_INFO_HEADER address
Arthur Heymans59b65422019-05-23 15:24:30 +0200125 * ebx: BIST value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700126 * ecx: Temp RAM base
127 * edx: Temp RAM top
Lee Leahyb5ad8272015-04-20 15:29:16 -0700128 * mm0: low 32-bits of TSC value
129 * mm1: high 32-bits of TSC value
130 */
131
132 cmp $0, %eax
133 jne halt2
134
135 /* Setup bootloader stack */
Frans Hendriks7ba970a2020-11-19 08:10:47 +0100136 movl $_ecar_stack, %esp
Lee Leahyb5ad8272015-04-20 15:29:16 -0700137
Lee Leahyb5ad8272015-04-20 15:29:16 -0700138 /*
139 * ebp: FSP_INFO_HEADER address
Arthur Heymans59b65422019-05-23 15:24:30 +0200140 * ebx: BIST value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700141 * ecx: Temp RAM base
142 * edx: Temp RAM top
143 * esp: Top of stack in temp RAM
144 * mm0: low 32-bits of TSC value
145 * mm1: high 32-bits of TSC value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700146 */
147
Frans Hendriksc022a792020-11-20 10:52:39 +0100148 /*
149 * temp_memory_start/end reside in the .bss section, which gets cleared
150 * below. Save the FSP return value to the stack before writing those
151 * variables.
152 */
153 push %ecx
154 push %edx
155
Frans Hendriks335eb122020-11-19 15:45:43 +0100156 /* clear .bss section */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700157 cld
Frans Hendriks335eb122020-11-19 15:45:43 +0100158 xor %eax, %eax
159 movl $(_ebss), %ecx
160 movl $(_bss), %edi
161 sub %edi, %ecx
Lee Leahyb5ad8272015-04-20 15:29:16 -0700162 shrl $2, %ecx
Lee Leahyb5ad8272015-04-20 15:29:16 -0700163 rep stosl
164
Frans Hendriksc022a792020-11-20 10:52:39 +0100165 pop %edx
166 movl %edx, temp_memory_end
167 pop %ecx
168 movl %ecx, temp_memory_start
169
Arthur Heymans59b65422019-05-23 15:24:30 +0200170 /* Need to align stack to 16 bytes at call instruction. Account for
171 the pushes below. */
172 andl $0xfffffff0, %esp
Frans Hendriks4e0ec592019-06-06 10:07:17 +0200173 subl $8, %esp
Arthur Heymans59b65422019-05-23 15:24:30 +0200174
Frans Hendriks4e0ec592019-06-06 10:07:17 +0200175 /* Push initial timestamp on the stack */
Arthur Heymans59b65422019-05-23 15:24:30 +0200176 movd %mm1, %eax
177 pushl %eax /* tsc[63:32] */
178 movd %mm0, %eax
179 pushl %eax /* tsc[31:0] */
180
Lee Leahy3dad4892015-05-05 11:14:02 -0700181before_romstage:
Subrata Banikfbdc7192016-01-19 19:19:15 +0530182 post_code(0x2A)
Lee Leahy3dad4892015-05-05 11:14:02 -0700183
Frans Hendriks4e0ec592019-06-06 10:07:17 +0200184 /* Call bootblock_c_entry(uint64_t base_timestamp) */
185 call bootblock_c_entry
Lee Leahy3dad4892015-05-05 11:14:02 -0700186
Frans Hendriks4e0ec592019-06-06 10:07:17 +0200187 /* Never reached */
Lee Leahy3dad4892015-05-05 11:14:02 -0700188
189halt1:
190 /*
Lee Leahyb5ad8272015-04-20 15:29:16 -0700191 * Failures for postcode 0xBA - failed in fsp_fih_early_find()
Lee Leahy3dad4892015-05-05 11:14:02 -0700192 *
193 * Values are:
194 * 0x01 - FV signature, "_FVH" not present
195 * 0x02 - FFS GUID not present
196 * 0x03 - FSP INFO Header not found
Frans Hendriks683e77e2019-04-29 13:29:36 +0200197 * 0x04 - ImageBase does not equal CONFIG_FSP_LOC - Is the FSP rebased
198 * to a different location, or does it need to be?
Lee Leahy3dad4892015-05-05 11:14:02 -0700199 * 0x05 - FSP INFO Header signature "FSPH" not found
200 * 0x06 - FSP Image ID is not the expected ID.
201 */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700202 movb $0xBA, %ah
203 jmp .Lhlt
Lee Leahy3dad4892015-05-05 11:14:02 -0700204
205halt2:
206 /*
207 * Failures for postcode 0xBB - failed in the FSP:
208 *
209 * 0x00 - FSP_SUCCESS: Temp RAM was initialized successfully.
210 * 0x02 - FSP_INVALID_PARAMETER: Input parameters are invalid.
Lee Leahy3dad4892015-05-05 11:14:02 -0700211 * 0x03 - FSP_UNSUPPORTED: The FSP calling conditions were not met.
212 * 0x07 - FSP_DEVICE_ERROR: Temp RAM initialization failed
Frans Hendriks683e77e2019-04-29 13:29:36 +0200213 * 0x0E - FSP_NOT_FOUND: No valid microcode was found in the microcode
214 * region.
Lee Leahy3dad4892015-05-05 11:14:02 -0700215 * 0x14 - FSP_ALREADY_STARTED: Temp RAM initialization has been invoked
216 */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700217 movb $0xBB, %ah
218 jmp .Lhlt
219
Lee Leahy3dad4892015-05-05 11:14:02 -0700220.Lhlt:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700221 xchg %al, %ah
Julius Wernercd49cce2019-03-05 16:53:33 -0800222#if CONFIG(POST_IO)
Lee Leahyb5ad8272015-04-20 15:29:16 -0700223 outb %al, $CONFIG_POST_IO_PORT
Lee Leahy3dad4892015-05-05 11:14:02 -0700224#else
225 post_code(POST_DEAD_CODE)
226#endif
Lee Leahyb5ad8272015-04-20 15:29:16 -0700227 movl $LHLT_DELAY, %ecx
Lee Leahy3dad4892015-05-05 11:14:02 -0700228.Lhlt_Delay:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700229 outb %al, $0xED
230 loop .Lhlt_Delay
231 jmp .Lhlt
Lee Leahy3dad4892015-05-05 11:14:02 -0700232
233/*
234 * esp is set to this location so that the call into and return from the FSP
235 * in find_fsp will work.
236 */
237 .align 4
238fake_fsp_stack:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700239 .long find_fsp_ret
Lee Leahya8874922015-08-26 14:58:29 -0700240 .long CONFIG_FSP_LOC /* FSP base address */
Lee Leahy3dad4892015-05-05 11:14:02 -0700241
242CAR_init_params:
Arthur Heymans12440ce2019-10-23 11:30:22 +0200243 .long fake_microcode /* Microcode Location */
244 .long fake_microcode_end - fake_microcode /* Microcode Length */
Aaron Durbin2524be42015-10-29 10:43:21 -0500245 .long 0xFFFFFFFF - CONFIG_ROM_SIZE + 1 /* Firmware Location */
Frans Hendriks683e77e2019-04-29 13:29:36 +0200246 .long CONFIG_ROM_SIZE /* Firmware Length */
Lee Leahy3dad4892015-05-05 11:14:02 -0700247
248CAR_init_stack:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700249 .long CAR_init_done
250 .long CAR_init_params
Arthur Heymans12440ce2019-10-23 11:30:22 +0200251
252 /* coreboot updates microcode itself. FSP still needs a pointer
253 to something that looks like microcode, so provide it with fake
254 microcode. */
255fake_microcode:
256fake_microcode_header_start:
257 .long 1 /* Header Version */
258 .long 1 /* Microcode revision */
259 .long 0x10232019 /* Date: Time of writing 23-10-2019 */
260 .long 0x00010ff0 /* Sig: (non existing) Family: 0xf, Model: 0x1f, stepping: 0 */
261 .long 0 /* Checksum: not checked by FSP, so won't care */
262 .long 1 /* Loader Revision */
263 .long 1 /* Processor Flags */
264 .long fake_microcode_end - fake_microcode_header_end /* Data Size */
265 .long fake_microcode_end - fake_microcode /* Total Size */
266 .space 12 /* Reserved */
267fake_microcode_header_end:
268 .space 0x10 /* 16 bytes of empty data */
269fake_microcode_end: