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 #define CACHE_AS_RAM_SIZE CONFIG_DCACHE_RAM_SIZE
22 #define CACHE_AS_RAM_BASE CONFIG_DCACHE_RAM_BASE
24 #include <cpu/x86/mtrr.h>
25 #include <cpu/amd/mtrr.h>
27 /* Save the BIST result */
33 /* Send INIT IPI to all excluding ourself */
34 movl $0x000C4500, %eax
35 movl $0xFEE00300, %esi
38 /* Disable prefetchers */
41 orl $((1 << 9) | (1 << 19)), %eax
42 orl $((1 << 5) | (1 << 7)), %edx
45 /* Zero out all Fixed Range and Variable Range MTRRs */
46 movl $mtrr_table, %esi
47 movl $( (mtrr_table_end - mtrr_table) / 2), %edi
58 /* Configure the default memory type to uncacheable */
59 movl $MTRRdefType_MSR, %ecx
61 andl $(~0x00000cff), %eax
64 /* Set cache as ram base address */
65 movl $(MTRRphysBase_MSR(0)), %ecx
66 movl $(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax
70 /* Set cache as ram mask */
71 movl $(MTRRphysMask_MSR(0)), %ecx
72 movl $(~((CACHE_AS_RAM_SIZE-1)) | (1 << 11)), %eax
73 movl $0x0000000f, %edx
77 movl $MTRRdefType_MSR, %ecx
88 /* CR0.CD = 0, CR0.NW = 0 */
90 andl $( ~( (1 << 30) | (1 << 29) ) ), %eax
94 /* Clear the cache memory reagion */
95 movl $CACHE_AS_RAM_BASE, %esi
97 movl $(CACHE_AS_RAM_SIZE / 4), %ecx
98 //movl $0x23322332, %eax
102 /* Enable Cache As RAM mode by disabling cache */
107 #if defined(CONFIG_XIP_ROM_SIZE) && defined(CONFIG_XIP_ROM_BASE)
108 /* Enable cache for our code in Flash because we do XIP here */
109 movl $MTRRphysBase_MSR(1), %ecx
111 #if defined(CONFIG_TINY_BOOTBLOCK) && CONFIG_TINY_BOOTBLOCK
112 #define REAL_XIP_ROM_BASE AUTO_XIP_ROM_BASE
114 #define REAL_XIP_ROM_BASE CONFIG_XIP_ROM_BASE
116 movl $REAL_XIP_ROM_BASE, %eax
117 orl $MTRR_TYPE_WRBACK, %eax
120 movl $MTRRphysMask_MSR(1), %ecx
121 movl $0x0000000f, %edx
122 movl $(~(CONFIG_XIP_ROM_SIZE - 1) | 0x800), %eax
124 #endif /* CONFIG_XIP_ROM_SIZE && CONFIG_XIP_ROM_BASE */
128 andl $( ~( (1 << 30) | (1 << 29) ) ), %eax
131 /* Set up stack pointer */
132 #if defined(CONFIG_USBDEBUG_DIRECT) && (CONFIG_USBDEBUG_DIRECT == 1)
133 /* leave some space for the struct ehci_debug_info */
134 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4 - 128), %eax
136 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4), %eax
140 /* Restore the BIST result */
147 /* Call romstage.c main function */
162 movl $MTRRdefType_MSR, %ecx
164 andl $(~(1 << 11)), %eax
173 movl $MTRRphysBase_MSR(0), %ecx
175 movl $MTRRphysMask_MSR(0), %ecx
177 movl $MTRRphysBase_MSR(1), %ecx
179 movl $MTRRphysMask_MSR(1), %ecx
185 #undef CLEAR_FIRST_1M_RAM
186 #ifdef CLEAR_FIRST_1M_RAM
188 /* Enable Write Combining and Speculative Reads for the first 1MB */
189 movl $MTRRphysBase_MSR(0), %ecx
190 movl $(0x00000000 | MTRR_TYPE_WRCOMB), %eax
193 movl $MTRRphysMask_MSR(0), %ecx
194 movl $(~(1024*1024 -1) | (1 << 11)), %eax
195 movl $0x0000000f, %edx // 36bit address space
202 andl $~( (1 << 30) | (1 << 29) ), %eax
207 #ifdef CLEAR_FIRST_1M_RAM
209 /* Clear first 1MB of RAM */
210 movl $0x00000000, %edi
213 movl $((1024*1024) / 4), %ecx
226 /* Enable Write Back and Speculative Reads for the first 1MB */
227 movl $MTRRphysBase_MSR(0), %ecx
228 movl $(0x00000000 | MTRR_TYPE_WRBACK), %eax
231 movl $MTRRphysMask_MSR(0), %ecx
232 movl $(~(1024*1024 -1) | (1 << 11)), %eax
233 movl $0x0000000f, %edx // 36bit address space
238 /* And Enable Cache again after setting MTRRs */
240 andl $~( (1 << 30) | (1 << 29) ), %eax
246 movl $MTRRdefType_MSR, %ecx
253 /* Enable prefetchers */
256 andl $~((1 << 9) | (1 << 19)), %eax
257 andl $~((1 << 5) | (1 << 7)), %edx
260 /* Invalidate the cache again */
265 /* clear boot_complete flag */
269 cld /* clear direction flag */
273 /* For now: use CONFIG_RAMBASE + 1MB - 64K (counting downwards) as stack. This
274 * makes sure that we stay completely within the 1M-64K of memory that we
275 * preserve for suspend/resume.
278 #ifndef HIGH_MEMORY_SAVE
279 #warning Need a central place for HIGH_MEMORY_SAVE
280 #define HIGH_MEMORY_SAVE ( (1024 - 64) * 1024 )
282 movl $(CONFIG_RAMBASE + HIGH_MEMORY_SAVE), %esp
294 .word 0x250, 0x258, 0x259
295 .word 0x268, 0x269, 0x26A
296 .word 0x26B, 0x26C, 0x26D
299 .word 0x200, 0x201, 0x202, 0x203
300 .word 0x204, 0x205, 0x206, 0x207
301 .word 0x208, 0x209, 0x20A, 0x20B
302 .word 0x20C, 0x20D, 0x20E, 0x20F