blob: 316b703271cfc2fc7e68e0fa609d185f12014e5b [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>
7
Kyösti Mälkki7522a8f2020-11-20 16:47:38 +02008.section .init
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +02009.global bootblock_pre_c_entry
10
Patrick Rudolphc439e072020-09-28 22:31:06 +020011#include <cpu/intel/car/cache_as_ram_symbols.inc>
12
Arthur Heymans7a8205b2018-06-03 10:29:07 +020013.code32
14_cache_as_ram_setup:
15
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +020016bootblock_pre_c_entry:
Arthur Heymans7a8205b2018-06-03 10:29:07 +020017
18cache_as_ram:
lilacious40cb3fe2023-06-21 23:24:14 +020019 post_code(POSTCODE_BOOTBLOCK_CAR)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020020
21 /* Send INIT IPI to all excluding ourself. */
22 movl $0x000C4500, %eax
23 movl $0xFEE00300, %esi
24 movl %eax, (%esi)
25
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020026 /* All CPUs need to be in Wait for SIPI state */
27wait_for_sipi:
28 movl (%esi), %eax
29 bt $12, %eax
30 jc wait_for_sipi
31
Martin Rothc87ab012022-11-20 19:32:51 -070032 post_code(POST_SOC_CLEAR_FIXED_MTRRS)
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020033
34 /* Clear/disable fixed MTRRs */
Arthur Heymans2834d982022-11-08 15:06:42 +010035 mov $fixed_mtrr_list, %ebx
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020036 xor %eax, %eax
37 xor %edx, %edx
38
39clear_fixed_mtrr:
Arthur Heymans2834d982022-11-08 15:06:42 +010040 movzwl (%ebx), %ecx
Arthur Heymans7a8205b2018-06-03 10:29:07 +020041 wrmsr
Arthur Heymans2834d982022-11-08 15:06:42 +010042 add $2, %ebx
43 cmp $fixed_mtrr_list_end, %ebx
44 jl clear_fixed_mtrr
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020045
Elyes HAOUAS02820ca2018-09-30 07:44:39 +020046 /* Figure out how many MTRRs we have, and clear them out */
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020047 mov $MTRR_CAP_MSR, %ecx
48 rdmsr
49 movzb %al, %ebx /* Number of variable MTRRs */
50 mov $MTRR_PHYS_BASE(0), %ecx
51 xor %eax, %eax
52 xor %edx, %edx
53
54clear_var_mtrr:
55 wrmsr
56 inc %ecx
57 wrmsr
58 inc %ecx
59 dec %ebx
60 jnz clear_var_mtrr
Arthur Heymans7a8205b2018-06-03 10:29:07 +020061
Martin Rothc87ab012022-11-20 19:32:51 -070062 post_code(POST_SOC_SET_DEF_MTRR_TYPE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020063 /* Configure the default memory type to uncacheable. */
64 movl $MTRR_DEF_TYPE_MSR, %ecx
65 rdmsr
66 andl $(~0x00000cff), %eax
67 wrmsr
68
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020069 /* Determine CPU_ADDR_BITS and load PHYSMASK high word to %edx. */
70 movl $0x80000008, %eax
71 cpuid
72 movb %al, %cl
73 sub $32, %cl
74 movl $1, %edx
75 shl %cl, %edx
76 subl $1, %edx
77
78 /* Preload high word of address mask (in %edx) for Variable
79 MTRRs 0 and 1. */
80addrsize_set_high:
81 xorl %eax, %eax
82 movl $MTRR_PHYS_MASK(0), %ecx
83 wrmsr
84 movl $MTRR_PHYS_MASK(1), %ecx
85 wrmsr
86
Martin Rothc87ab012022-11-20 19:32:51 -070087 post_code(POST_SOC_SET_MTRR_BASE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020088 /* Set Cache-as-RAM base address. */
89 movl $(MTRR_PHYS_BASE(0)), %ecx
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +020090 movl $_car_mtrr_start, %eax
91 orl $MTRR_TYPE_WRBACK, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +020092 xorl %edx, %edx
93 wrmsr
94
Martin Rothc87ab012022-11-20 19:32:51 -070095 post_code(POST_SOC_SET_MTRR_MASK)
Arthur Heymans7a8205b2018-06-03 10:29:07 +020096 /* Set Cache-as-RAM mask. */
97 movl $(MTRR_PHYS_MASK(0)), %ecx
Arthur Heymans3aa9adb2018-06-03 11:02:54 +020098 rdmsr
Patrick Rudolphc439e072020-09-28 22:31:06 +020099 movl car_mtrr_mask, %eax
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200100 orl $MTRR_PHYS_MASK_VALID, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200101 wrmsr
102
Martin Rothc87ab012022-11-20 19:32:51 -0700103 post_code(POST_SOC_ENABLE_MTRRS)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200104
105 /* Enable MTRR. */
106 movl $MTRR_DEF_TYPE_MSR, %ecx
107 rdmsr
108 orl $MTRR_DEF_TYPE_EN, %eax
109 wrmsr
110
111 /* Enable L2 cache. */
112 movl $0x11e, %ecx
113 rdmsr
114 orl $(1 << 8), %eax
115 wrmsr
116
117 /* Enable cache (CR0.CD = 0, CR0.NW = 0). */
118 movl %cr0, %eax
119 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
120 invd
121 movl %eax, %cr0
122
123 /* Clear the cache memory region. This will also fill up the cache. */
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200124 cld
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200125 xorl %eax, %eax
Patrick Rudolphc439e072020-09-28 22:31:06 +0200126 movl car_mtrr_start, %edi
127 movl car_mtrr_size, %ecx
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200128 shr $2, %ecx
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200129 rep stosl
130
Martin Rothc87ab012022-11-20 19:32:51 -0700131 post_code(POST_SOC_DISABLE_CACHE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200132 /* Enable Cache-as-RAM mode by disabling cache. */
133 movl %cr0, %eax
134 orl $CR0_CacheDisable, %eax
135 movl %eax, %cr0
136
137 /* Enable cache for our code in Flash because we do XIP here */
138 movl $MTRR_PHYS_BASE(1), %ecx
139 xorl %edx, %edx
Kyösti Mälkkice9f4222018-06-25 18:53:36 +0300140 movl $_program, %eax
Patrick Rudolphc439e072020-09-28 22:31:06 +0200141 andl xip_mtrr_mask, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200142 orl $MTRR_TYPE_WRPROT, %eax
143 wrmsr
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200144 movl $MTRR_PHYS_MASK(1), %ecx
Arthur Heymans3aa9adb2018-06-03 11:02:54 +0200145 rdmsr
Patrick Rudolphc439e072020-09-28 22:31:06 +0200146 movl xip_mtrr_mask, %eax
Kyösti Mälkkidc6bb6c2019-11-08 00:08:55 +0200147 orl $MTRR_PHYS_MASK_VALID, %eax
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200148 wrmsr
149
Martin Rothc87ab012022-11-20 19:32:51 -0700150 post_code(POST_SOC_ENABLE_CACHE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200151 /* Enable cache. */
152 movl %cr0, %eax
153 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
154 movl %eax, %cr0
155
156 /* Setup the stack. */
Arthur Heymansdf9cdcf2019-11-09 06:50:20 +0100157 mov $_ecar_stack, %esp
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200158
159 /* Need to align stack to 16 bytes at call instruction. Account for
160 the pushes below. */
Arthur Heymans348b79f2018-06-03 17:14:19 +0200161 andl $0xfffffff0, %esp
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200162 subl $4, %esp
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200163
Patrick Rudolphc439e072020-09-28 22:31:06 +0200164#if ENV_X86_64
165
166 #include <cpu/x86/64bit/entry64.inc>
167
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
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200183before_c_entry:
Martin Rothc87ab012022-11-20 19:32:51 -0700184 post_code(POST_BOOTBLOCK_BEFORE_C_ENTRY)
Kyösti Mälkkic641f7e2018-12-28 16:54:54 +0200185 call bootblock_c_entry_bist
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200186
187 /* Should never see this postcode */
lilacious40cb3fe2023-06-21 23:24:14 +0200188 post_code(POSTCODE_DEAD_CODE)
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200189
190.Lhlt:
191 hlt
192 jmp .Lhlt
193
Arthur Heymans3aa9adb2018-06-03 11:02:54 +0200194fixed_mtrr_list:
195 .word MTRR_FIX_64K_00000
196 .word MTRR_FIX_16K_80000
197 .word MTRR_FIX_16K_A0000
198 .word MTRR_FIX_4K_C0000
199 .word MTRR_FIX_4K_C8000
200 .word MTRR_FIX_4K_D0000
201 .word MTRR_FIX_4K_D8000
202 .word MTRR_FIX_4K_E0000
203 .word MTRR_FIX_4K_E8000
204 .word MTRR_FIX_4K_F0000
205 .word MTRR_FIX_4K_F8000
Arthur Heymans2834d982022-11-08 15:06:42 +0100206fixed_mtrr_list_end:
Arthur Heymans7a8205b2018-06-03 10:29:07 +0200207
208_cache_as_ram_setup_end: