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/stack.h>
25 #include <cpu/x86/mtrr.h>
26 #include <cpu/amd/mtrr.h>
28 /* Save the BIST result */
34 /* Send INIT IPI to all excluding ourself */
35 movl $0x000C4500, %eax
36 movl $0xFEE00300, %esi
39 /* Disable prefetchers */
42 orl $((1 << 9) | (1 << 19)), %eax
43 orl $((1 << 5) | (1 << 7)), %edx
46 /* Zero out all Fixed Range and Variable Range MTRRs */
47 movl $mtrr_table, %esi
48 movl $( (mtrr_table_end - mtrr_table) / 2), %edi
59 /* Configure the default memory type to uncacheable */
60 movl $MTRRdefType_MSR, %ecx
62 andl $(~0x00000cff), %eax
65 /* Set cache as ram base address */
66 movl $(MTRRphysBase_MSR(0)), %ecx
67 movl $(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax
71 /* Set cache as ram mask */
72 movl $(MTRRphysMask_MSR(0)), %ecx
73 movl $(~((CACHE_AS_RAM_SIZE-1)) | (1 << 11)), %eax
74 movl $0x0000000f, %edx
78 movl $MTRRdefType_MSR, %ecx
89 /* CR0.CD = 0, CR0.NW = 0 */
91 andl $( ~( (1 << 30) | (1 << 29) ) ), %eax
95 /* Clear the cache memory reagion */
96 movl $CACHE_AS_RAM_BASE, %esi
98 movl $(CACHE_AS_RAM_SIZE / 4), %ecx
99 //movl $0x23322332, %eax
103 /* Enable Cache As RAM mode by disabling cache */
108 #if defined(CONFIG_XIP_ROM_SIZE) && defined(CONFIG_XIP_ROM_BASE)
109 /* Enable cache for our code in Flash because we do XIP here */
110 movl $MTRRphysBase_MSR(1), %ecx
112 #if defined(CONFIG_TINY_BOOTBLOCK) && CONFIG_TINY_BOOTBLOCK
113 #define REAL_XIP_ROM_BASE AUTO_XIP_ROM_BASE
115 #define REAL_XIP_ROM_BASE CONFIG_XIP_ROM_BASE
117 movl $REAL_XIP_ROM_BASE, %eax
118 orl $MTRR_TYPE_WRBACK, %eax
121 movl $MTRRphysMask_MSR(1), %ecx
122 movl $0x0000000f, %edx
123 movl $(~(CONFIG_XIP_ROM_SIZE - 1) | 0x800), %eax
125 #endif /* CONFIG_XIP_ROM_SIZE && CONFIG_XIP_ROM_BASE */
129 andl $( ~( (1 << 30) | (1 << 29) ) ), %eax
132 /* Set up stack pointer */
133 #if defined(CONFIG_USBDEBUG_DIRECT) && (CONFIG_USBDEBUG_DIRECT == 1)
134 /* leave some space for the struct ehci_debug_info */
135 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4 - 128), %eax
137 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4), %eax
141 /* Restore the BIST result */
148 /* Call romstage.c main function */
163 movl $MTRRdefType_MSR, %ecx
165 andl $(~(1 << 11)), %eax
174 movl $MTRRphysBase_MSR(0), %ecx
176 movl $MTRRphysMask_MSR(0), %ecx
178 movl $MTRRphysBase_MSR(1), %ecx
180 movl $MTRRphysMask_MSR(1), %ecx
186 #undef CLEAR_FIRST_1M_RAM
187 #ifdef CLEAR_FIRST_1M_RAM
189 /* Enable Write Combining and Speculative Reads for the first 1MB */
190 movl $MTRRphysBase_MSR(0), %ecx
191 movl $(0x00000000 | MTRR_TYPE_WRCOMB), %eax
194 movl $MTRRphysMask_MSR(0), %ecx
195 movl $(~(1024*1024 -1) | (1 << 11)), %eax
196 movl $0x0000000f, %edx // 36bit address space
203 andl $~( (1 << 30) | (1 << 29) ), %eax
208 #ifdef CLEAR_FIRST_1M_RAM
210 /* Clear first 1MB of RAM */
211 movl $0x00000000, %edi
214 movl $((1024*1024) / 4), %ecx
227 /* Enable Write Back and Speculative Reads for the first 1MB */
228 movl $MTRRphysBase_MSR(0), %ecx
229 movl $(0x00000000 | MTRR_TYPE_WRBACK), %eax
232 movl $MTRRphysMask_MSR(0), %ecx
233 movl $(~(1024*1024 -1) | (1 << 11)), %eax
234 movl $0x0000000f, %edx // 36bit address space
239 /* And Enable Cache again after setting MTRRs */
241 andl $~( (1 << 30) | (1 << 29) ), %eax
247 movl $MTRRdefType_MSR, %ecx
254 /* Enable prefetchers */
257 andl $~((1 << 9) | (1 << 19)), %eax
258 andl $~((1 << 5) | (1 << 7)), %edx
261 /* Invalidate the cache again */
266 /* clear boot_complete flag */
270 cld /* clear direction flag */
274 movl $ROMSTAGE_STACK, %esp
286 .word 0x250, 0x258, 0x259
287 .word 0x268, 0x269, 0x26A
288 .word 0x26B, 0x26C, 0x26D
291 .word 0x200, 0x201, 0x202, 0x203
292 .word 0x204, 0x205, 0x206, 0x207
293 .word 0x208, 0x209, 0x20A, 0x20B
294 .word 0x20C, 0x20D, 0x20E, 0x20F