blob: 210d3566c73d71aa3a64002002b7cbab737f9c2a [file] [log] [blame]
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +02001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2000,2007 Ronald G. Minnich <rminnich@gmail.com>
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +02005 * Copyright (C) 2005 Tyan (written by Yinghai Lu for Tyan)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +02006 * Copyright (C) 2007-2008 coresystems GmbH
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +02007 * Copyright (C) 2012 Kyösti Mälkki <kyosti.malkki@gmail.com>
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +02008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2 of the License.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020017 */
18
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020019#include <cpu/x86/mtrr.h>
Patrick Georgi05e740f2012-03-31 12:52:21 +020020#include <cpu/x86/cache.h>
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020021#include <cpu/x86/post_code.h>
Kyösti Mälkkif9d1a422012-02-28 01:45:44 +020022#include <cpu/x86/lapic_def.h>
23
24/* Macro to access Local APIC registers at default base. */
25#define LAPIC(x) $(LAPIC_DEFAULT_BASE | LAPIC_ ## x)
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +020026#define START_IPI_VECTOR ((CONFIG_AP_SIPI_VECTOR >> 12) & 0xff)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020027
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020028#define CACHE_AS_RAM_SIZE CONFIG_DCACHE_RAM_SIZE
29#define CACHE_AS_RAM_BASE CONFIG_DCACHE_RAM_BASE
30
31 /* Save the BIST result. */
32 movl %eax, %ebp
33
34cache_as_ram:
35 post_code(0x20)
36
Kyösti Mälkkia860c682012-02-28 02:06:45 +020037 movl $LAPIC_BASE_MSR, %ecx
38 rdmsr
39 andl $LAPIC_BASE_MSR_BOOTSTRAP_PROCESSOR, %eax
40 jz ap_init
41
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +020042 /* Zero out all fixed range and variable range MTRRs.
Kyösti Mälkkia860c682012-02-28 02:06:45 +020043 * For hyper-threaded CPUs these are shared.
44 */
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020045 movl $mtrr_table, %esi
Stefan Reinauer4a45ec42015-07-07 00:54:05 +020046 movl $((mtrr_table_end - mtrr_table) >> 1), %edi
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020047 xorl %eax, %eax
48 xorl %edx, %edx
49clear_mtrrs:
50 movw (%esi), %bx
51 movzx %bx, %ecx
52 wrmsr
53 add $2, %esi
54 dec %edi
55 jnz clear_mtrrs
56
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +020057 post_code(0x21)
58
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020059 /* Configure the default memory type to uncacheable. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070060 movl $MTRR_DEF_TYPE_MSR, %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +020061 rdmsr
62 andl $(~0x00000cff), %eax
63 wrmsr
64
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +020065 post_code(0x22)
66
Kyösti Mälkkia860c682012-02-28 02:06:45 +020067 /* Determine CPU_ADDR_BITS and load PHYSMASK high
68 * word to %edx.
69 */
70 movl $0x80000000, %eax
71 cpuid
72 cmpl $0x80000008, %eax
73 jc addrsize_no_MSR
74 movl $0x80000008, %eax
75 cpuid
76 movb %al, %cl
77 sub $32, %cl
78 movl $1, %edx
79 shl %cl, %edx
80 subl $1, %edx
81 jmp addrsize_set_high
82addrsize_no_MSR:
83 movl $1, %eax
84 cpuid
85 andl $(1<<6 | 1<<17), %edx /* PAE or PSE36 */
86 jz addrsize_set_high
87 movl $0x0f, %edx
88
89 /* Preload high word of address mask (in %edx) for Variable
Elyes HAOUASd6e96862016-08-21 10:12:15 +020090 * MTRRs 0 and 1 and enable local APIC at default base.
Kyösti Mälkkia860c682012-02-28 02:06:45 +020091 */
92addrsize_set_high:
93 xorl %eax, %eax
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070094 movl $MTRR_PHYS_MASK(0), %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +020095 wrmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -070096 movl $MTRR_PHYS_MASK(1), %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +020097 wrmsr
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +020098 movl $LAPIC_BASE_MSR, %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +020099 not %edx
100 movl %edx, %ebx
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200101 rdmsr
Kyösti Mälkkia860c682012-02-28 02:06:45 +0200102 andl %ebx, %edx
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200103 andl $(~LAPIC_BASE_MSR_ADDR_MASK), %eax
104 orl $(LAPIC_DEFAULT_BASE | LAPIC_BASE_MSR_ENABLE), %eax
105 wrmsr
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200106
107bsp_init:
108
109 post_code(0x23)
110
111 /* Send INIT IPI to all excluding ourself. */
112 movl LAPIC(ICR), %edi
113 movl $(LAPIC_DEST_ALLBUT | LAPIC_INT_ASSERT | LAPIC_DM_INIT), %eax
1141: movl %eax, (%edi)
115 movl $0x30, %ecx
1162: pause
117 dec %ecx
118 jnz 2b
119 movl (%edi), %ecx
120 andl $LAPIC_ICR_BUSY, %ecx
121 jnz 1b
122
123 post_code(0x24)
Patrick Georgi819c7d42012-03-31 13:08:12 +0200124
Kyösti Mälkkidf0fbc72012-07-04 12:02:58 +0300125 movl $1, %eax
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200126 cpuid
127 btl $28, %edx
128 jnc sipi_complete
129 bswapl %ebx
Kyösti Mälkkidf0fbc72012-07-04 12:02:58 +0300130 movzx %bh, %edi
131 cmpb $1, %bh
132 jbe sipi_complete /* only one LAPIC ID in package */
133
134 movl $0, %eax
135 cpuid
136 movb $1, %bl
137 cmpl $4, %eax
138 jb cores_counted
139 movl $4, %eax
140 movl $0, %ecx
141 cpuid
142 shr $26, %eax
143 movb %al, %bl
144 inc %bl
145
146cores_counted:
147 movl %edi, %eax
148 divb %bl
149 cmpb $1, %al
150 jbe sipi_complete /* only LAPIC ID of a core */
151
152 /* For a hyper-threading processor, cache must not be disabled
153 * on an AP on the same physical package with the BSP.
154 */
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200155
156hyper_threading_cpu:
157
158 /* delay 10 ms */
159 movl $10000, %ecx
1601: inb $0x80, %al
161 dec %ecx
162 jnz 1b
163
164 post_code(0x25)
165
166 /* Send Start IPI to all excluding ourself. */
167 movl LAPIC(ICR), %edi
168 movl $(LAPIC_DEST_ALLBUT | LAPIC_DM_STARTUP | START_IPI_VECTOR), %eax
1691: movl %eax, (%edi)
170 movl $0x30, %ecx
1712: pause
172 dec %ecx
173 jnz 2b
174 movl (%edi), %ecx
175 andl $LAPIC_ICR_BUSY, %ecx
176 jnz 1b
177
178 /* delay 250 us */
179 movl $250, %ecx
1801: inb $0x80, %al
181 dec %ecx
182 jnz 1b
183
184 post_code(0x26)
185
186 /* Wait for sibling CPU to start. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -07001871: movl $(MTRR_PHYS_BASE(0)), %ecx
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200188 rdmsr
189 andl %eax, %eax
190 jnz sipi_complete
191
192 movl $0x30, %ecx
1932: pause
194 dec %ecx
195 jnz 2b
196 jmp 1b
197
198
199ap_init:
200 post_code(0x27)
201
202 /* Do not disable cache (so BSP can enable it). */
Elyes HAOUAS2765a892016-09-01 19:44:56 +0200203 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200204 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200205 movl %eax, %cr0
206
207 post_code(0x28)
208
209 /* MTRR registers are shared between HT siblings. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700210 movl $(MTRR_PHYS_BASE(0)), %ecx
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200211 movl $(1<<12), %eax
212 xorl %edx, %edx
213 wrmsr
214
215 post_code(0x29)
216
217ap_halt:
218 cli
2191: hlt
Kyösti Mälkkidf0fbc72012-07-04 12:02:58 +0300220 jmp 1b
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200221
222
223
224sipi_complete:
225
226 post_code(0x2a)
227
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200228 /* Set Cache-as-RAM base address. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700229 movl $(MTRR_PHYS_BASE(0)), %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200230 movl $(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax
231 xorl %edx, %edx
232 wrmsr
233
234 /* Set Cache-as-RAM mask. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700235 movl $(MTRR_PHYS_MASK(0)), %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +0200236 rdmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700237 movl $(~(CACHE_AS_RAM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200238 wrmsr
239
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300240 post_code(0x2b)
241
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200242 /* Enable MTRR. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700243 movl $MTRR_DEF_TYPE_MSR, %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200244 rdmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700245 orl $MTRR_DEF_TYPE_EN, %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200246 wrmsr
247
Kyösti Mälkki05d6ffb2012-02-16 23:12:04 +0200248 /* Enable L2 cache Write-Back (WBINVD and FLUSH#).
249 *
250 * MSR is set when DisplayFamily_DisplayModel is one of:
251 * 06_0x, 06_17, 06_1C
252 *
253 * Description says this bit enables use of WBINVD and FLUSH#.
254 * Should this be set only after the system bus and/or memory
255 * controller can successfully handle write cycles?
256 */
257
258#define EAX_FAMILY(a) (a << 8) /* for family <= 0fH */
259#define EAX_MODEL(a) (((a & 0xf0) << 12) | ((a & 0xf) << 4))
260
261 movl $1, %eax
262 cpuid
263 movl %eax, %ebx
264 andl $EAX_FAMILY(0x0f), %eax
265 cmpl $EAX_FAMILY(0x06), %eax
266 jne no_msr_11e
267 movl %ebx, %eax
268 andl $EAX_MODEL(0xff), %eax
269 cmpl $EAX_MODEL(0x17), %eax
270 je has_msr_11e
271 cmpl $EAX_MODEL(0x1c), %eax
272 je has_msr_11e
273 andl $EAX_MODEL(0xf0), %eax
274 cmpl $EAX_MODEL(0x00), %eax
275 jne no_msr_11e
276has_msr_11e:
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200277 movl $0x11e, %ecx
278 rdmsr
279 orl $(1 << 8), %eax
280 wrmsr
Kyösti Mälkki05d6ffb2012-02-16 23:12:04 +0200281no_msr_11e:
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200282
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200283 post_code(0x2c)
284
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200285 /* Enable cache (CR0.CD = 0, CR0.NW = 0). */
Kyösti Mälkkif9d1a422012-02-28 01:45:44 +0200286 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200287 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200288 invd
289 movl %eax, %cr0
290
Kyösti Mälkkieb61ea82016-07-20 12:50:20 +0300291 /* Clear the cache memory region. This will also fill up the cache. */
Kyösti Mälkkif9d1a422012-02-28 01:45:44 +0200292 cld
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200293 xorl %eax, %eax
Kyösti Mälkkif9d1a422012-02-28 01:45:44 +0200294 movl $CACHE_AS_RAM_BASE, %edi
Stefan Reinauer4a45ec42015-07-07 00:54:05 +0200295 movl $(CACHE_AS_RAM_SIZE >> 2), %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200296 rep stosl
297
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300298 post_code(0x2d)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200299 /* Enable Cache-as-RAM mode by disabling cache. */
300 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200301 orl $CR0_CacheDisable, %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200302 movl %eax, %cr0
303
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200304 /* Enable cache for our code in Flash because we do XIP here */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700305 movl $MTRR_PHYS_BASE(1), %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200306 xorl %edx, %edx
307 /*
308 * IMPORTANT: The following calculation _must_ be done at runtime. See
309 * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html
310 */
311 movl $copy_and_run, %eax
312 andl $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax
Kyösti Mälkkidc4820b2016-07-21 19:51:01 +0300313 orl $MTRR_TYPE_WRPROT, %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200314 wrmsr
315
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700316 movl $MTRR_PHYS_MASK(1), %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +0200317 rdmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700318 movl $(~(CONFIG_XIP_ROM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200319 wrmsr
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200320
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300321 post_code(0x2e)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200322 /* Enable cache. */
323 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200324 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200325 movl %eax, %cr0
326
Kyösti Mälkki39915bc2016-11-08 12:13:15 +0200327 /* Setup the stack. */
328 movl $(CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE), %eax
329 movl %eax, %esp
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200330
331 /* Restore the BIST result. */
332 movl %ebp, %eax
333 movl %esp, %ebp
334 pushl %eax
335
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300336before_romstage:
Kyösti Mälkki0078ceb2012-02-28 02:02:27 +0200337 post_code(0x2f)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200338 /* Call romstage.c main function. */
Kyösti Mälkki408d3922016-06-17 10:43:48 +0300339 call romstage_main
340
341 /* Save return value from romstage_main. It contains the stack to use
Kyösti Mälkkib4f827d2016-06-21 06:59:30 +0300342 * after cache-as-ram is torn down.
343 */
Kyösti Mälkki39915bc2016-11-08 12:13:15 +0200344 movl %eax, %esp
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200345
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200346 post_code(0x30)
347
348 /* Disable cache. */
349 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200350 orl $CR0_CacheDisable, %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200351 movl %eax, %cr0
352
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300353 post_code(0x31)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200354
355 /* Disable MTRR. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700356 movl $MTRR_DEF_TYPE_MSR, %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200357 rdmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700358 andl $(~MTRR_DEF_TYPE_EN), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200359 wrmsr
360
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300361 post_code(0x32)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200362
363 invd
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200364
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300365 post_code(0x33)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200366
367 /* Enable cache. */
368 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200369 andl $~(CR0_CacheDisable | CR0_NoWriteThrough), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200370 movl %eax, %cr0
371
Kyösti Mälkki8a2f1672016-07-20 13:29:59 +0300372 post_code(0x36)
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200373
374 /* Disable cache. */
375 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200376 orl $CR0_CacheDisable, %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200377 movl %eax, %cr0
378
379 post_code(0x38)
380
Kyösti Mälkkif9d1a422012-02-28 01:45:44 +0200381 /* Enable Write Back and Speculative Reads for low RAM. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700382 movl $MTRR_PHYS_BASE(0), %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200383 movl $(0x00000000 | MTRR_TYPE_WRBACK), %eax
384 xorl %edx, %edx
385 wrmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700386 movl $MTRR_PHYS_MASK(0), %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +0200387 rdmsr
Kyösti Mälkki65cc5262016-06-19 20:38:41 +0300388 movl $(~(CACHE_TMP_RAMTOP - 1) | MTRR_PHYS_MASK_VALID), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200389 wrmsr
390
Kyösti Mälkki107f72e2014-01-06 11:06:26 +0200391#if CACHE_ROM_SIZE
Kyösti Mälkki325b92f2012-02-28 00:24:15 +0200392 /* Enable caching and Speculative Reads for Flash ROM device. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700393 movl $MTRR_PHYS_BASE(1), %ecx
Kyösti Mälkki325b92f2012-02-28 00:24:15 +0200394 movl $(CACHE_ROM_BASE | MTRR_TYPE_WRPROT), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200395 xorl %edx, %edx
396 wrmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700397 movl $MTRR_PHYS_MASK(1), %ecx
Kyösti Mälkkia860c682012-02-28 02:06:45 +0200398 rdmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700399 movl $(~(CACHE_ROM_SIZE - 1) | MTRR_PHYS_MASK_VALID), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200400 wrmsr
Kyösti Mälkki5458b9d2012-06-30 11:41:08 +0300401#endif
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200402
403 post_code(0x39)
404
405 /* And enable cache again after setting MTRRs. */
406 movl %cr0, %eax
Patrick Georgi05e740f2012-03-31 12:52:21 +0200407 andl $~(CR0_CacheDisable | CR0_NoWriteThrough), %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200408 movl %eax, %cr0
409
410 post_code(0x3a)
411
412 /* Enable MTRR. */
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700413 movl $MTRR_DEF_TYPE_MSR, %ecx
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200414 rdmsr
Alexandru Gagniuc86091f92015-09-30 20:23:09 -0700415 orl $MTRR_DEF_TYPE_EN, %eax
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200416 wrmsr
417
418 post_code(0x3b)
419
420 /* Invalidate the cache again. */
421 invd
422
423 post_code(0x3c)
424
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200425__main:
426 post_code(POST_PREPARE_RAMSTAGE)
427 cld /* Clear direction flag. */
Kyösti Mälkki39915bc2016-11-08 12:13:15 +0200428 call romstage_after_car
Kyösti Mälkki5a660ca2012-02-28 00:15:30 +0200429
430.Lhlt:
431 post_code(POST_DEAD_CODE)
432 hlt
433 jmp .Lhlt
434
435mtrr_table:
436 /* Fixed MTRRs */
437 .word 0x250, 0x258, 0x259
438 .word 0x268, 0x269, 0x26A
439 .word 0x26B, 0x26C, 0x26D
440 .word 0x26E, 0x26F
441 /* Variable MTRRs */
442 .word 0x200, 0x201, 0x202, 0x203
443 .word 0x204, 0x205, 0x206, 0x207
444 .word 0x208, 0x209, 0x20A, 0x20B
445 .word 0x20C, 0x20D, 0x20E, 0x20F
446mtrr_table_end: