2 * This file is part of the coreboot project.
4 * Copyright (C) 2000,2007 Ronald G. Minnich <rminnich@gmail.com>
5 * Copyright (C) 2007-2008 coresystems GmbH
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #include <cpu/x86/mtrr.h>
22 #include <cpu/x86/cache.h>
23 #include <cpu/x86/post_code.h>
25 #define CPU_PHYSMASK_HI (1 << (CONFIG_CPU_ADDR_BITS - 32) - 1)
27 #define CACHE_AS_RAM_SIZE CONFIG_DCACHE_RAM_SIZE
28 #define CACHE_AS_RAM_BASE CONFIG_DCACHE_RAM_BASE
30 /* Save the BIST result. */
36 /* Send INIT IPI to all excluding ourself. */
37 movl $0x000C4500, %eax
38 movl $0xFEE00300, %esi
41 /* Zero out all fixed range and variable range MTRRs. */
42 movl $mtrr_table, %esi
43 movl $((mtrr_table_end - mtrr_table) / 2), %edi
54 /* Configure the default memory type to uncacheable. */
55 movl $MTRRdefType_MSR, %ecx
57 andl $(~0x00000cff), %eax
60 /* Set Cache-as-RAM base address. */
61 movl $(MTRRphysBase_MSR(0)), %ecx
62 movl $(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax
66 /* Set Cache-as-RAM mask. */
67 movl $(MTRRphysMask_MSR(0)), %ecx
68 movl $(~(CACHE_AS_RAM_SIZE - 1) | MTRRphysMaskValid), %eax
69 movl $CPU_PHYSMASK_HI, %edx
73 movl $MTRRdefType_MSR, %ecx
75 orl $MTRRdefTypeEn, %eax
78 /* Enable L2 cache. */
84 /* Enable cache (CR0.CD = 0, CR0.NW = 0). */
86 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
90 /* Clear the cache memory reagion. */
91 movl $CACHE_AS_RAM_BASE, %esi
93 movl $(CACHE_AS_RAM_SIZE / 4), %ecx
94 // movl $0x23322332, %eax
98 /* Enable Cache-as-RAM mode by disabling cache. */
100 orl $CR0_CacheDisable, %eax
103 #if CONFIG_XIP_ROM_SIZE
104 /* Enable cache for our code in Flash because we do XIP here */
105 movl $MTRRphysBase_MSR(1), %ecx
108 * IMPORTANT: The following calculation _must_ be done at runtime. See
109 * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html
111 movl $copy_and_run, %eax
112 andl $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax
113 orl $MTRR_TYPE_WRBACK, %eax
116 movl $MTRRphysMask_MSR(1), %ecx
117 movl $CPU_PHYSMASK_HI, %edx
118 movl $(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax
120 #endif /* CONFIG_XIP_ROM_SIZE */
124 andl $(~(CR0_CacheDisable | CR0_NoWriteThrough)), %eax
127 /* Set up the stack pointer. */
128 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4), %eax
131 /* Restore the BIST result. */
138 /* Call romstage.c main function. */
147 orl $CR0_CacheDisable, %eax
153 movl $MTRRdefType_MSR, %ecx
155 andl $(~MTRRdefTypeEn), %eax
166 andl $~(CR0_CacheDisable | CR0_NoWriteThrough), %eax
173 orl $CR0_CacheDisable, %eax
178 /* Enable Write Back and Speculative Reads for low RAM. */
179 movl $MTRRphysBase_MSR(0), %ecx
180 movl $(0x00000000 | MTRR_TYPE_WRBACK), %eax
183 movl $MTRRphysMask_MSR(0), %ecx
184 movl $(~(CONFIG_RAMTOP - 1) | MTRRphysMaskValid), %eax
185 movl $CPU_PHYSMASK_HI, %edx
189 /* Enable caching and Speculative Reads for Flash ROM device. */
190 movl $MTRRphysBase_MSR(1), %ecx
191 movl $(CACHE_ROM_BASE | MTRR_TYPE_WRPROT), %eax
194 movl $MTRRphysMask_MSR(1), %ecx
195 movl $(~(CACHE_ROM_SIZE - 1) | MTRRphysMaskValid), %eax
196 movl $CPU_PHYSMASK_HI, %edx
202 /* And enable cache again after setting MTRRs. */
204 andl $~(CR0_CacheDisable | CR0_NoWriteThrough), %eax
210 movl $MTRRdefType_MSR, %ecx
212 orl $MTRRdefTypeEn, %eax
217 /* Invalidate the cache again. */
223 post_code(POST_PREPARE_RAMSTAGE)
224 cld /* Clear direction flag. */
226 movl $CONFIG_RAMTOP, %esp
231 post_code(POST_DEAD_CODE)
237 .word 0x250, 0x258, 0x259
238 .word 0x268, 0x269, 0x26A
239 .word 0x26B, 0x26C, 0x26D
242 .word 0x200, 0x201, 0x202, 0x203
243 .word 0x204, 0x205, 0x206, 0x207
244 .word 0x208, 0x209, 0x20A, 0x20B
245 .word 0x20C, 0x20D, 0x20E, 0x20F