blob: 17e0a69cd8942684672df86d892c3d78494992bf [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
Kyösti Mälkki7522a8f2020-11-20 16:47:38 +020017.section .init, "ax", @progbits
18
Frans Hendriks4e0ec592019-06-06 10:07:17 +020019.global bootblock_pre_c_entry
20bootblock_pre_c_entry:
Lee Leahyb5ad8272015-04-20 15:29:16 -070021 /*
Kyösti Mälkkiee2e9362018-12-28 16:06:45 +020022 * Per FSP1.1 specs, following registers are preserved:
23 * EBX, EDI, ESI, EBP, MM0, MM1
24 *
25 * Shift values to release MM2.
Arthur Heymans59b65422019-05-23 15:24:30 +020026 * mm0 -> ebx: BIST value
Kyösti Mälkkiee2e9362018-12-28 16:06:45 +020027 * mm1 -> mm0: low 32-bits of TSC value
28 * mm2 -> mm1: high 32-bits of TSC value
Lee Leahyb5ad8272015-04-20 15:29:16 -070029 */
Arthur Heymans59b65422019-05-23 15:24:30 +020030 movd %mm0, %ebx
Kyösti Mälkkiee2e9362018-12-28 16:06:45 +020031 movd %mm1, %eax
32 movd %eax, %mm0
33 movd %mm2, %eax
34 movd %eax, %mm1
35
Lee Leahy3dad4892015-05-05 11:14:02 -070036cache_as_ram:
lilacious40cb3fe2023-06-21 23:24:14 +020037 post_code(POSTCODE_BOOTBLOCK_CAR)
Lee Leahy3dad4892015-05-05 11:14:02 -070038
Arthur Heymans8256ca02019-10-21 18:47:46 +020039 /* Cache the rom and update the microcode */
40cache_rom:
41 /* Disable cache */
42 movl %cr0, %eax
43 orl $CR0_CacheDisable, %eax
44 movl %eax, %cr0
45
46 movl $MTRR_PHYS_BASE(1), %ecx
47 xorl %edx, %edx
48 movl $(CACHE_ROM_BASE | MTRR_TYPE_WRPROT), %eax
49 wrmsr
50
51 movl $MTRR_PHYS_MASK(1), %ecx
52 rdmsr
53 movl $(~(CACHE_ROM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
54 wrmsr
55
56 /* Enable cache */
57 movl %cr0, %eax
58 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
59 invd
60 movl %eax, %cr0
61
62 /* Enable MTRR. */
63 movl $MTRR_DEF_TYPE_MSR, %ecx
64 rdmsr
65 orl $MTRR_DEF_TYPE_EN, %eax
66 wrmsr
67
68 /* The Google FSP release for Braswell has broken microcode update
69 code and FSP needs the installed microcode revision to be non zero.
70 It is better to have coreboot do it instead of relying on a fragile
71 blob. */
72update_microcode:
73 /* put the return address in %esp */
74 movl $end_microcode_update, %esp
75 jmp update_bsp_microcode
76end_microcode_update:
77
Lee Leahyb5ad8272015-04-20 15:29:16 -070078 /*
Lee Leahy3dad4892015-05-05 11:14:02 -070079 * Find the FSP binary in cbfs.
80 * Make a fake stack that has the return value back to this code.
81 */
Lee Leahyb5ad8272015-04-20 15:29:16 -070082 lea fake_fsp_stack, %esp
83 jmp find_fsp
Lee Leahy3dad4892015-05-05 11:14:02 -070084find_fsp_ret:
85 /* Save the FSP location */
Lee Leahyb5ad8272015-04-20 15:29:16 -070086 mov %eax, %ebp
87
88 /*
89 * Only when a valid FSP binary is found at CONFIG_FSP_LOC is
90 * the returned FSP_INFO_HEADER structure address above the base
91 * address of FSP binary specified by the CONFIG_FSP_LOC value.
92 * All of the error values are in the 0x8xxxxxxx range which are
93 * below the CONFIG_FSP_LOC value.
94 */
95 cmp $CONFIG_FSP_LOC, %eax
96 jbe halt1
Lee Leahy3dad4892015-05-05 11:14:02 -070097
lilacious40cb3fe2023-06-21 23:24:14 +020098 post_code(POSTCODE_FSP_TEMP_RAM_INIT)
Lee Leahy3dad4892015-05-05 11:14:02 -070099
100 /* Calculate entry into FSP */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700101 mov 0x30(%ebp), %eax /* Load TempRamInitEntry */
102 add 0x1c(%ebp), %eax /* add in the offset for FSP */
Lee Leahy3dad4892015-05-05 11:14:02 -0700103
104 /*
105 * Pass early init variables on a fake stack (no memory yet)
106 * as well as the return location
107 */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700108 lea CAR_init_stack, %esp
Lee Leahy3dad4892015-05-05 11:14:02 -0700109
110 /*
Lee Leahyb5ad8272015-04-20 15:29:16 -0700111 * BIST value is zero
112 * eax: TempRamInitApi address
Arthur Heymans59b65422019-05-23 15:24:30 +0200113 * ebx: BIST value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700114 * ebp: FSP_INFO_HEADER address
Lee Leahyb5ad8272015-04-20 15:29:16 -0700115 * esi: Not used
116 * mm0: low 32-bits of TSC value
117 * mm1: high 32-bits of TSC value
Lee Leahy3dad4892015-05-05 11:14:02 -0700118 */
Lee Leahy3dad4892015-05-05 11:14:02 -0700119
Lee Leahyb5ad8272015-04-20 15:29:16 -0700120 /* call FSP binary to setup temporary stack */
121 jmp *%eax
122
123CAR_init_done:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700124
125 /*
126 * ebp: FSP_INFO_HEADER address
Arthur Heymans59b65422019-05-23 15:24:30 +0200127 * ebx: BIST value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700128 * ecx: Temp RAM base
129 * edx: Temp RAM top
Lee Leahyb5ad8272015-04-20 15:29:16 -0700130 * mm0: low 32-bits of TSC value
131 * mm1: high 32-bits of TSC value
132 */
133
134 cmp $0, %eax
135 jne halt2
136
Frans Hendriks7590c372020-11-20 11:24:54 +0100137 /* Setup bootblock stack */
Frans Hendriks7ba970a2020-11-19 08:10:47 +0100138 movl $_ecar_stack, %esp
Lee Leahyb5ad8272015-04-20 15:29:16 -0700139
Lee Leahyb5ad8272015-04-20 15:29:16 -0700140 /*
141 * ebp: FSP_INFO_HEADER address
Arthur Heymans59b65422019-05-23 15:24:30 +0200142 * ebx: BIST value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700143 * ecx: Temp RAM base
144 * edx: Temp RAM top
145 * esp: Top of stack in temp RAM
146 * mm0: low 32-bits of TSC value
147 * mm1: high 32-bits of TSC value
Lee Leahyb5ad8272015-04-20 15:29:16 -0700148 */
149
Frans Hendriksc022a792020-11-20 10:52:39 +0100150 /*
151 * temp_memory_start/end reside in the .bss section, which gets cleared
152 * below. Save the FSP return value to the stack before writing those
153 * variables.
154 */
155 push %ecx
156 push %edx
157
Frans Hendriks335eb122020-11-19 15:45:43 +0100158 /* clear .bss section */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700159 cld
Frans Hendriks335eb122020-11-19 15:45:43 +0100160 xor %eax, %eax
161 movl $(_ebss), %ecx
162 movl $(_bss), %edi
163 sub %edi, %ecx
Lee Leahyb5ad8272015-04-20 15:29:16 -0700164 shrl $2, %ecx
Lee Leahyb5ad8272015-04-20 15:29:16 -0700165 rep stosl
166
Frans Hendriksc022a792020-11-20 10:52:39 +0100167 pop %edx
168 movl %edx, temp_memory_end
169 pop %ecx
170 movl %ecx, temp_memory_start
171
Arthur Heymans59b65422019-05-23 15:24:30 +0200172 /* Need to align stack to 16 bytes at call instruction. Account for
173 the pushes below. */
174 andl $0xfffffff0, %esp
Frans Hendriks4e0ec592019-06-06 10:07:17 +0200175 subl $8, %esp
Arthur Heymans59b65422019-05-23 15:24:30 +0200176
Frans Hendriks4e0ec592019-06-06 10:07:17 +0200177 /* Push initial timestamp on the stack */
Arthur Heymans59b65422019-05-23 15:24:30 +0200178 movd %mm1, %eax
179 pushl %eax /* tsc[63:32] */
180 movd %mm0, %eax
181 pushl %eax /* tsc[31:0] */
182
Lee Leahy3dad4892015-05-05 11:14:02 -0700183before_romstage:
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
lilacious40cb3fe2023-06-21 23:24:14 +0200225 post_code(POSTCODE_DEAD_CODE)
Lee Leahy3dad4892015-05-05 11:14:02 -0700226#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: