blob: 2e4d9c8074aa6a4b4f76594f39441c09b4e4ac54 [file] [log] [blame]
Angel Ponsf23ae0b2020-04-02 23:48:12 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Arthur Heymans7a8205b2018-06-03 10:29:07 +02002
Martin Rothc87ab012022-11-20 19:32:51 -07003#include <cpu/intel/post_codes.h>
Arthur Heymans7a8205b2018-06-03 10:29:07 +02004#include <cpu/x86/mtrr.h>
5#include <cpu/x86/cache.h>
6#include <cpu/x86/post_code.h>
Arthur Heymans3edf8402021-07-05 21:18:50 +02007#include <cpu/x86/64bit/entry64.inc>
Arthur Heymans7a8205b2018-06-03 10:29:07 +02008
Kyösti Mälkki7522a8f2020-11-20 16:47:38 +02009.section .init
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +020010.global bootblock_pre_c_entry
11
Patrick Rudolphc439e072020-09-28 22:31:06 +020012#include <cpu/intel/car/cache_as_ram_symbols.inc>
13
Arthur Heymans7a8205b2018-06-03 10:29:07 +020014.code32
15_cache_as_ram_setup:
16
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +020017bootblock_pre_c_entry:
Arthur Heymans7a8205b2018-06-03 10:29:07 +020018
19cache_as_ram:
lilacious40cb3fe2023-06-21 23:24:14 +020020 post_code(POSTCODE_BOOTBLOCK_CAR)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020021
22 /* Send INIT IPI to all excluding ourself. */
23 movl $0x000C4500, %eax
24 movl $0xFEE00300, %esi
25 movl %eax, (%esi)
26
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020027 /* All CPUs need to be in Wait for SIPI state */
28wait_for_sipi:
29 movl (%esi), %eax
30 bt $12, %eax
31 jc wait_for_sipi
32
Yuchen He1e67adb2023-07-25 21:28:36 +020033 post_code(POSTCODE_SOC_CLEAR_FIXED_MTRRS)
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020034
35 /* Clear/disable fixed MTRRs */
Arthur Heymans2834d982022-11-08 15:06:42 +010036 mov $fixed_mtrr_list, %ebx
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020037 xor %eax, %eax
38 xor %edx, %edx
39
40clear_fixed_mtrr:
Arthur Heymans2834d982022-11-08 15:06:42 +010041 movzwl (%ebx), %ecx
Arthur Heymans7a8205b2018-06-03 10:29:07 +020042 wrmsr
Arthur Heymans2834d982022-11-08 15:06:42 +010043 add $2, %ebx
44 cmp $fixed_mtrr_list_end, %ebx
45 jl clear_fixed_mtrr
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020046
Elyes HAOUAS02820ca2018-09-30 07:44:39 +020047 /* Figure out how many MTRRs we have, and clear them out */
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020048 mov $MTRR_CAP_MSR, %ecx
49 rdmsr
50 movzb %al, %ebx /* Number of variable MTRRs */
51 mov $MTRR_PHYS_BASE(0), %ecx
52 xor %eax, %eax
53 xor %edx, %edx
54
55clear_var_mtrr:
56 wrmsr
57 inc %ecx
58 wrmsr
59 inc %ecx
60 dec %ebx
61 jnz clear_var_mtrr
Arthur Heymans7a8205b2018-06-03 10:29:07 +020062
Yuchen He1e67adb2023-07-25 21:28:36 +020063 post_code(POSTCODE_SOC_SET_DEF_MTRR_TYPE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020064 /* Configure the default memory type to uncacheable. */
65 movl $MTRR_DEF_TYPE_MSR, %ecx
66 rdmsr
67 andl $(~0x00000cff), %eax
68 wrmsr
69
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020070 /* Determine CPU_ADDR_BITS and load PHYSMASK high word to %edx. */
71 movl $0x80000008, %eax
72 cpuid
73 movb %al, %cl
74 sub $32, %cl
75 movl $1, %edx
76 shl %cl, %edx
77 subl $1, %edx
78
79 /* Preload high word of address mask (in %edx) for Variable
80 MTRRs 0 and 1. */
81addrsize_set_high:
82 xorl %eax, %eax
83 movl $MTRR_PHYS_MASK(0), %ecx
84 wrmsr
85 movl $MTRR_PHYS_MASK(1), %ecx
86 wrmsr
87
Yuchen He1e67adb2023-07-25 21:28:36 +020088 post_code(POSTCODE_SOC_SET_MTRR_BASE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020089 /* Set Cache-as-RAM base address. */
90 movl $(MTRR_PHYS_BASE(0)), %ecx
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +020091 movl $_car_mtrr_start, %eax
92 orl $MTRR_TYPE_WRBACK, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +020093 xorl %edx, %edx
94 wrmsr
95
Yuchen He1e67adb2023-07-25 21:28:36 +020096 post_code(POSTCODE_SOC_SET_MTRR_MASK)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020097 /* Set Cache-as-RAM mask. */
98 movl $(MTRR_PHYS_MASK(0)), %ecx
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020099 rdmsr
Patrick Rudolphc439e072020-09-28 22:31:06 +0200100 movl car_mtrr_mask, %eax
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200101 orl $MTRR_PHYS_MASK_VALID, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200102 wrmsr
103
Yuchen He1e67adb2023-07-25 21:28:36 +0200104 post_code(POSTCODE_SOC_ENABLE_MTRRS)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200105
106 /* Enable MTRR. */
107 movl $MTRR_DEF_TYPE_MSR, %ecx
108 rdmsr
109 orl $MTRR_DEF_TYPE_EN, %eax
110 wrmsr
111
112 /* Enable L2 cache. */
113 movl $0x11e, %ecx
114 rdmsr
115 orl $(1 << 8), %eax
116 wrmsr
117
118 /* Enable cache (CR0.CD = 0, CR0.NW = 0). */
119 movl %cr0, %eax
120 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
121 invd
122 movl %eax, %cr0
123
124 /* Clear the cache memory region. This will also fill up the cache. */
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200125 cld
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200126 xorl %eax, %eax
Patrick Rudolphc439e072020-09-28 22:31:06 +0200127 movl car_mtrr_start, %edi
128 movl car_mtrr_size, %ecx
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200129 shr $2, %ecx
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200130 rep stosl
131
Yuchen He1e67adb2023-07-25 21:28:36 +0200132 post_code(POSTCODE_SOC_DISABLE_CACHE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200133 /* Enable Cache-as-RAM mode by disabling cache. */
134 movl %cr0, %eax
135 orl $CR0_CacheDisable, %eax
136 movl %eax, %cr0
137
138 /* Enable cache for our code in Flash because we do XIP here */
139 movl $MTRR_PHYS_BASE(1), %ecx
140 xorl %edx, %edx
Kyösti Mälkkice9f4222018-06-25 18:53:36 +0300141 movl $_program, %eax
Patrick Rudolphc439e072020-09-28 22:31:06 +0200142 andl xip_mtrr_mask, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200143 orl $MTRR_TYPE_WRPROT, %eax
144 wrmsr
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200145 movl $MTRR_PHYS_MASK(1), %ecx
Arthur Heymans3aa9adb2018-06-03 11:02:54 +0200146 rdmsr
Patrick Rudolphc439e072020-09-28 22:31:06 +0200147 movl xip_mtrr_mask, %eax
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200148 orl $MTRR_PHYS_MASK_VALID, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200149 wrmsr
150
Yuchen He1e67adb2023-07-25 21:28:36 +0200151 post_code(POSTCODE_SOC_ENABLE_CACHE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200152 /* Enable cache. */
153 movl %cr0, %eax
154 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
155 movl %eax, %cr0
156
157 /* Setup the stack. */
Arthur Heymansdf9cdcf2019-11-09 06:50:20 +0100158 mov $_ecar_stack, %esp
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200159
160 /* Need to align stack to 16 bytes at call instruction. Account for
161 the pushes below. */
Arthur Heymans348b79f2018-06-03 17:14:19 +0200162 andl $0xfffffff0, %esp
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200163 subl $4, %esp
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200164
Patrick Rudolphc439e072020-09-28 22:31:06 +0200165#if ENV_X86_64
Arthur Heymans3edf8402021-07-05 21:18:50 +0200166 setup_longmode $(CONFIG_ARCH_X86_64_PGTBL_LOC)
Patrick Rudolphc439e072020-09-28 22:31:06 +0200167
168 movd %mm2, %rdi
169 shlq $32, %rdi
170 movd %mm1, %rsi
171 or %rsi, %rdi
172 movd %mm0, %rsi
173#else
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200174 /* push TSC and BIST to stack */
175 movd %mm0, %eax
Elyes HAOUAS87930b32019-01-16 12:41:57 +0100176 pushl %eax /* BIST */
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200177 movd %mm2, %eax
178 pushl %eax /* tsc[63:32] */
179 movd %mm1, %eax
Elyes HAOUAS87930b32019-01-16 12:41:57 +0100180 pushl %eax /* tsc[31:0] */
Patrick Rudolphc439e072020-09-28 22:31:06 +0200181#endif
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200182
Jeremy Compostellab7832de2023-08-30 15:42:09 -0700183 /* Copy .data section content to Cache-As-Ram */
184#include <cpu/x86/copy_data_section.inc>
185
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200186before_c_entry:
Yuchen He1e67adb2023-07-25 21:28:36 +0200187 post_code(POSTCODE_BOOTBLOCK_BEFORE_C_ENTRY)
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200188 call bootblock_c_entry_bist
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200189
190 /* Should never see this postcode */
lilacious40cb3fe2023-06-21 23:24:14 +0200191 post_code(POSTCODE_DEAD_CODE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200192
193.Lhlt:
194 hlt
195 jmp .Lhlt
196
Arthur Heymans3aa9adb2018-06-03 11:02:54 +0200197fixed_mtrr_list:
198 .word MTRR_FIX_64K_00000
199 .word MTRR_FIX_16K_80000
200 .word MTRR_FIX_16K_A0000
201 .word MTRR_FIX_4K_C0000
202 .word MTRR_FIX_4K_C8000
203 .word MTRR_FIX_4K_D0000
204 .word MTRR_FIX_4K_D8000
205 .word MTRR_FIX_4K_E0000
206 .word MTRR_FIX_4K_E8000
207 .word MTRR_FIX_4K_F0000
208 .word MTRR_FIX_4K_F8000
Arthur Heymans2834d982022-11-08 15:06:42 +0100209fixed_mtrr_list_end:
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200210
211_cache_as_ram_setup_end: