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 /* Zero out all Fixed Range and Variable Range MTRRs */
40 movl $mtrr_table, %esi
41 movl $( (mtrr_table_end - mtrr_table) / 2), %edi
52 /* Configure the default memory type to uncacheable */
53 movl $MTRRdefType_MSR, %ecx
55 andl $(~0x00000cff), %eax
58 /* Set cache as ram base address */
59 movl $(MTRRphysBase_MSR(0)), %ecx
60 movl $(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax
64 /* Set cache as ram mask */
65 movl $(MTRRphysMask_MSR(0)), %ecx
66 movl $(~((CACHE_AS_RAM_SIZE-1)) | (1 << 11)), %eax
67 movl $0x0000000f, %edx
71 movl $MTRRdefType_MSR, %ecx
82 /* CR0.CD = 0, CR0.NW = 0 */
84 andl $( ~( (1 << 30) | (1 << 29) ) ), %eax
88 /* Clear the cache memory reagion */
89 movl $CACHE_AS_RAM_BASE, %esi
91 movl $(CACHE_AS_RAM_SIZE / 4), %ecx
92 //movl $0x23322332, %eax
96 /* Enable Cache As RAM mode by disabling cache */
101 #if defined(CONFIG_XIP_ROM_SIZE) && defined(CONFIG_XIP_ROM_BASE)
102 /* Enable cache for our code in Flash because we do XIP here */
103 movl $MTRRphysBase_MSR(1), %ecx
105 #if defined(CONFIG_TINY_BOOTBLOCK) && CONFIG_TINY_BOOTBLOCK
106 #define REAL_XIP_ROM_BASE AUTO_XIP_ROM_BASE
108 #define REAL_XIP_ROM_BASE CONFIG_XIP_ROM_BASE
110 movl $REAL_XIP_ROM_BASE, %eax
111 orl $MTRR_TYPE_WRBACK, %eax
114 movl $MTRRphysMask_MSR(1), %ecx
115 movl $0x0000000f, %edx
116 movl $(~(CONFIG_XIP_ROM_SIZE - 1) | 0x800), %eax
118 #endif /* CONFIG_XIP_ROM_SIZE && CONFIG_XIP_ROM_BASE */
122 andl $( ~( (1 << 30) | (1 << 29) ) ), %eax
125 /* Set up stack pointer */
126 #if defined(CONFIG_USBDEBUG_DIRECT) && (CONFIG_USBDEBUG_DIRECT == 1)
127 /* leave some space for the struct ehci_debug_info */
128 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4 - 128), %eax
130 movl $(CACHE_AS_RAM_BASE + CACHE_AS_RAM_SIZE - 4), %eax
134 /* Restore the BIST result */
141 /* Call romstage.c main function */
156 movl $MTRRdefType_MSR, %ecx
158 andl $(~(1 << 11)), %eax
167 movl $MTRRphysBase_MSR(0), %ecx
169 movl $MTRRphysMask_MSR(0), %ecx
171 movl $MTRRphysBase_MSR(1), %ecx
173 movl $MTRRphysMask_MSR(1), %ecx
179 #undef CLEAR_FIRST_1M_RAM
180 #ifdef CLEAR_FIRST_1M_RAM
182 /* Enable Write Combining and Speculative Reads for the first 1MB */
183 movl $MTRRphysBase_MSR(0), %ecx
184 movl $(0x00000000 | MTRR_TYPE_WRCOMB), %eax
187 movl $MTRRphysMask_MSR(0), %ecx
188 movl $(~(1024*1024 -1) | (1 << 11)), %eax
189 movl $0x0000000f, %edx // 36bit address space
196 andl $~( (1 << 30) | (1 << 29) ), %eax
201 #ifdef CLEAR_FIRST_1M_RAM
203 /* Clear first 1MB of RAM */
204 movl $0x00000000, %edi
207 movl $((1024*1024) / 4), %ecx
220 /* Enable Write Back and Speculative Reads for the first 1MB */
221 movl $MTRRphysBase_MSR(0), %ecx
222 movl $(0x00000000 | MTRR_TYPE_WRBACK), %eax
225 movl $MTRRphysMask_MSR(0), %ecx
226 movl $(~(1024*1024 -1) | (1 << 11)), %eax
227 movl $0x0000000f, %edx // 36bit address space
232 /* And Enable Cache again after setting MTRRs */
234 andl $~( (1 << 30) | (1 << 29) ), %eax
240 movl $MTRRdefType_MSR, %ecx
247 /* Invalidate the cache again */
252 /* clear boot_complete flag */
256 cld /* clear direction flag */
260 movl $ROMSTAGE_STACK, %esp
272 .word 0x250, 0x258, 0x259
273 .word 0x268, 0x269, 0x26A
274 .word 0x26B, 0x26C, 0x26D
277 .word 0x200, 0x201, 0x202, 0x203
278 .word 0x204, 0x205, 0x206, 0x207
279 .word 0x208, 0x209, 0x20A, 0x20B
280 .word 0x20C, 0x20D, 0x20E, 0x20F