Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 1 | /* |
Stefan Reinauer | 7e61e45 | 2008-01-18 10:35:56 +0000 | [diff] [blame] | 2 | * This file is part of the coreboot project. |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 3 | * |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 4 | * Copyright (C) 2000, 2007 Ronald G. Minnich <rminnich@gmail.com> |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 5 | * Copyright (C) 2005 Eswar Nallusamy, LANL |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 6 | * Copyright (C) 2005 Tyan (written by Yinghai Lu for Tyan) |
| 7 | * Copyright (C) 2007-2010 coresystems GmbH |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 8 | * Copyright (C) 2007 Carl-Daniel Hailfinger |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 9 | * |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License as published by |
| 12 | * the Free Software Foundation; version 2 of the License. |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 13 | * |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 14 | * This program is distributed in the hope that it will be useful, |
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | * GNU General Public License for more details. |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 18 | * |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 19 | * You should have received a copy of the GNU General Public License |
| 20 | * along with this program; if not, write to the Free Software |
| 21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 22 | */ |
| 23 | |
Stefan Reinauer | e08c29e | 2010-04-25 21:43:29 +0000 | [diff] [blame] | 24 | #include <cpu/x86/stack.h> |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 25 | #include <cpu/x86/mtrr.h> |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 26 | #include <cpu/x86/lapic_def.h> |
Alexandru Gagniuc | 5005bb06 | 2011-04-11 20:17:22 +0000 | [diff] [blame] | 27 | #include <cpu/x86/post_code.h> |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 28 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 29 | #define CacheSize CONFIG_DCACHE_RAM_SIZE |
| 30 | #define CacheBase (0xd0000 - CacheSize) |
| 31 | |
Stefan Reinauer | 7b0500c | 2011-01-19 06:54:42 +0000 | [diff] [blame] | 32 | /* Save the BIST result. */ |
| 33 | movl %eax, %ebp |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 34 | |
| 35 | CacheAsRam: |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 36 | /* Check whether the processor has HT capability. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 37 | movl $01, %eax |
| 38 | cpuid |
| 39 | btl $28, %edx |
| 40 | jnc NotHtProcessor |
| 41 | bswapl %ebx |
| 42 | cmpb $01, %bh |
| 43 | jbe NotHtProcessor |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 44 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 45 | /* |
| 46 | * It is a HT processor. Send SIPI to the other logical processor |
| 47 | * within this processor so that the CAR related common system |
| 48 | * registers are programmed accordingly. |
| 49 | */ |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 50 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 51 | /* |
| 52 | * Use some register that is common to both logical processors |
| 53 | * as semaphore. Refer Appendix B, Vol.3. |
| 54 | */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 55 | xorl %eax, %eax |
| 56 | xorl %edx, %edx |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 57 | movl $MTRRfix64K_00000_MSR, %ecx |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 58 | wrmsr |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 59 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 60 | /* |
| 61 | * Figure out the logical AP's APIC ID; the following logic will |
| 62 | * work only for processors with 2 threads. |
| 63 | * Refer to Vol 3. Table 7-1 for details about this logic. |
| 64 | */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 65 | movl $0xFEE00020, %esi |
| 66 | movl (%esi), %ebx |
| 67 | andl $0xFF000000, %ebx |
| 68 | bswapl %ebx |
| 69 | btl $0, %ebx |
| 70 | jnc LogicalAP0 |
| 71 | andb $0xFE, %bl |
| 72 | jmp Send_SIPI |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 73 | LogicalAP0: |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 74 | orb $0x01, %bl |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 75 | Send_SIPI: |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 76 | bswapl %ebx /* EBX - logical AP's APIC ID. */ |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 77 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 78 | /* |
| 79 | * Fill up the IPI command registers in the Local APIC mapped to |
| 80 | * default address and issue SIPI to the other logical processor |
| 81 | * within this processor die. |
| 82 | */ |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 83 | Retry_SIPI: |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 84 | movl %ebx, %eax |
| 85 | movl $0xFEE00310, %esi |
| 86 | movl %eax, (%esi) |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 87 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 88 | /* SIPI vector - F900:0000 */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 89 | movl $0x000006F9, %eax |
| 90 | movl $0xFEE00300, %esi |
| 91 | movl %eax, (%esi) |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 92 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 93 | movl $0x30, %ecx |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 94 | SIPI_Delay: |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 95 | pause |
| 96 | decl %ecx |
| 97 | jnz SIPI_Delay |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 98 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 99 | movl (%esi), %eax |
| 100 | andl $0x00001000, %eax |
| 101 | jnz Retry_SIPI |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 102 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 103 | /* Wait for the Logical AP to complete initialization. */ |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 104 | LogicalAP_SIPINotdone: |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 105 | movl $MTRRfix64K_00000_MSR, %ecx |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 106 | rdmsr |
| 107 | orl %eax, %eax |
| 108 | jz LogicalAP_SIPINotdone |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 109 | |
| 110 | NotHtProcessor: |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 111 | /* Set the default memory type and enable fixed and variable MTRRs. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 112 | movl $MTRRdefType_MSR, %ecx |
| 113 | xorl %edx, %edx |
Uwe Hermann | 66d1687 | 2010-10-01 07:27:51 +0000 | [diff] [blame] | 114 | movl $(MTRRdefTypeEn | MTRRdefTypeFixEn), %eax |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 115 | wrmsr |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 116 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 117 | /* Clear all MTRRs. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 118 | xorl %edx, %edx |
Warren Turkal | 4ffde94 | 2010-10-12 06:13:40 +0000 | [diff] [blame] | 119 | movl $all_mtrr_msrs, %esi |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 120 | |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 121 | clear_fixed_var_mtrr: |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 122 | lodsl (%esi), %eax |
| 123 | testl %eax, %eax |
| 124 | jz clear_fixed_var_mtrr_out |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 125 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 126 | movl %eax, %ecx |
| 127 | xorl %eax, %eax |
| 128 | wrmsr |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 129 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 130 | jmp clear_fixed_var_mtrr |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 131 | |
Warren Turkal | 4ffde94 | 2010-10-12 06:13:40 +0000 | [diff] [blame] | 132 | all_mtrr_msrs: |
| 133 | /* fixed MTRR MSRs */ |
| 134 | .long MTRRfix64K_00000_MSR |
| 135 | .long MTRRfix16K_80000_MSR |
| 136 | .long MTRRfix16K_A0000_MSR |
| 137 | .long MTRRfix4K_C0000_MSR |
| 138 | .long MTRRfix4K_C8000_MSR |
| 139 | .long MTRRfix4K_D0000_MSR |
| 140 | .long MTRRfix4K_D8000_MSR |
| 141 | .long MTRRfix4K_E0000_MSR |
| 142 | .long MTRRfix4K_E8000_MSR |
| 143 | .long MTRRfix4K_F0000_MSR |
| 144 | .long MTRRfix4K_F8000_MSR |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 145 | |
Warren Turkal | 4ffde94 | 2010-10-12 06:13:40 +0000 | [diff] [blame] | 146 | /* var MTRR MSRs */ |
| 147 | .long MTRRphysBase_MSR(0) |
| 148 | .long MTRRphysMask_MSR(0) |
| 149 | .long MTRRphysBase_MSR(1) |
| 150 | .long MTRRphysMask_MSR(1) |
| 151 | .long MTRRphysBase_MSR(2) |
| 152 | .long MTRRphysMask_MSR(2) |
| 153 | .long MTRRphysBase_MSR(3) |
| 154 | .long MTRRphysMask_MSR(3) |
| 155 | .long MTRRphysBase_MSR(4) |
| 156 | .long MTRRphysMask_MSR(4) |
| 157 | .long MTRRphysBase_MSR(5) |
| 158 | .long MTRRphysMask_MSR(5) |
| 159 | .long MTRRphysBase_MSR(6) |
| 160 | .long MTRRphysMask_MSR(6) |
| 161 | .long MTRRphysBase_MSR(7) |
| 162 | .long MTRRphysMask_MSR(7) |
| 163 | |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 164 | .long 0x000 /* NULL, end of table */ |
| 165 | |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 166 | clear_fixed_var_mtrr_out: |
| 167 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 168 | /* |
| 169 | * 0x06 is the WB IO type for a given 4k segment. |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 170 | * segs is the number of 4k segments in the area of the particular |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 171 | * register we want to use for CAR. |
| 172 | * reg is the register where the IO type should be stored. |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 173 | */ |
| 174 | .macro extractmask segs, reg |
| 175 | .if \segs <= 0 |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 176 | /* |
| 177 | * The xorl here is superfluous because at the point of first execution |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 178 | * of this macro, %eax and %edx are cleared. Later invocations of this |
| 179 | * macro will have a monotonically increasing segs parameter. |
| 180 | */ |
| 181 | xorl \reg, \reg |
| 182 | .elseif \segs == 1 |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 183 | movl $0x06000000, \reg /* WB IO type */ |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 184 | .elseif \segs == 2 |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 185 | movl $0x06060000, \reg /* WB IO type */ |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 186 | .elseif \segs == 3 |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 187 | movl $0x06060600, \reg /* WB IO type */ |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 188 | .elseif \segs >= 4 |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 189 | movl $0x06060606, \reg /* WB IO type */ |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 190 | .endif |
| 191 | .endm |
| 192 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 193 | /* |
Uwe Hermann | 66d1687 | 2010-10-01 07:27:51 +0000 | [diff] [blame] | 194 | * carsize is the cache size in bytes we want to use for CAR. |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 195 | * windowoffset is the 32k-aligned window into CAR size. |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 196 | */ |
| 197 | .macro simplemask carsize, windowoffset |
Carl-Daniel Hailfinger | 4afb7fb | 2008-04-04 15:02:45 +0000 | [diff] [blame] | 198 | .set gas_bug_workaround,(((\carsize - \windowoffset) / 0x1000) - 4) |
| 199 | extractmask gas_bug_workaround, %eax |
| 200 | .set gas_bug_workaround,(((\carsize - \windowoffset) / 0x1000)) |
| 201 | extractmask gas_bug_workaround, %edx |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 202 | /* |
| 203 | * Without the gas bug workaround, the entire macro would consist |
| 204 | * only of the two lines below: |
| 205 | * extractmask (((\carsize - \windowoffset) / 0x1000) - 4), %eax |
| 206 | * extractmask (((\carsize - \windowoffset) / 0x1000)), %edx |
| 207 | */ |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 208 | .endm |
| 209 | |
| 210 | #if CacheSize > 0x10000 |
| 211 | #error Invalid CAR size, must be at most 64k. |
| 212 | #endif |
| 213 | #if CacheSize < 0x1000 |
| 214 | #error Invalid CAR size, must be at least 4k. This is a processor limitation. |
| 215 | #endif |
| 216 | #if (CacheSize & (0x1000 - 1)) |
| 217 | #error Invalid CAR size, is not a multiple of 4k. This is a processor limitation. |
| 218 | #endif |
| 219 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 220 | #if CacheSize > 0x8000 |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 221 | /* Enable caching for 32K-64K using fixed MTRR. */ |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 222 | movl $MTRRfix4K_C0000_MSR, %ecx |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 223 | simplemask CacheSize, 0x8000 |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 224 | wrmsr |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 225 | #endif |
| 226 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 227 | /* Enable caching for 0-32K using fixed MTRR. */ |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 228 | movl $MTRRfix4K_C8000_MSR, %ecx |
Carl-Daniel Hailfinger | 4d1aa0a | 2008-01-08 17:06:38 +0000 | [diff] [blame] | 229 | simplemask CacheSize, 0 |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 230 | wrmsr |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 231 | |
Stefan Reinauer | 0867062 | 2009-06-30 15:17:49 +0000 | [diff] [blame] | 232 | #if defined(CONFIG_XIP_ROM_SIZE) && defined(CONFIG_XIP_ROM_BASE) |
Uwe Hermann | 1d36d6d | 2010-09-30 21:22:40 +0000 | [diff] [blame] | 233 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 234 | /* |
| 235 | * Enable write base caching so we can do execute in place (XIP) |
| 236 | * on the flash ROM. |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 237 | */ |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 238 | movl $MTRRphysBase_MSR(1), %ecx |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 239 | xorl %edx, %edx |
Uwe Hermann | 36455aa | 2010-10-02 20:51:29 +0000 | [diff] [blame] | 240 | /* |
Patrick Georgi | 1da1046 | 2011-10-28 20:28:03 +0200 | [diff] [blame] | 241 | * IMPORTANT: The following calculation _must_ be done at runtime. See |
Uwe Hermann | 36455aa | 2010-10-02 20:51:29 +0000 | [diff] [blame] | 242 | * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html |
| 243 | */ |
Patrick Georgi | 1da1046 | 2011-10-28 20:28:03 +0200 | [diff] [blame] | 244 | movl copy_and_run, %eax |
| 245 | andl $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax |
Myles Watson | c7e982b | 2010-10-01 15:16:20 +0000 | [diff] [blame] | 246 | orl $MTRR_TYPE_WRBACK, %eax |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 247 | wrmsr |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 248 | |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 249 | movl $MTRRphysMask_MSR(1), %ecx |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 250 | movl $0x0000000f, %edx |
Stefan Reinauer | 139e6f9 | 2011-04-14 20:06:30 +0000 | [diff] [blame] | 251 | movl $(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 252 | wrmsr |
Stefan Reinauer | 0867062 | 2009-06-30 15:17:49 +0000 | [diff] [blame] | 253 | #endif /* CONFIG_XIP_ROM_SIZE && CONFIG_XIP_ROM_BASE */ |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 254 | |
Stefan Reinauer | 7b0500c | 2011-01-19 06:54:42 +0000 | [diff] [blame] | 255 | /* Enable cache. */ |
| 256 | movl %cr0, %eax |
| 257 | andl $(~((1 << 30) | (1 << 29))), %eax |
| 258 | movl %eax, %cr0 |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 259 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 260 | /* Read the range with lodsl. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 261 | movl $CacheBase, %esi |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 262 | cld |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 263 | movl $(CacheSize >> 2), %ecx |
| 264 | rep lodsl |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 265 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 266 | /* Clear the range. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 267 | movl $CacheBase, %edi |
| 268 | movl $(CacheSize >> 2), %ecx |
| 269 | xorl %eax, %eax |
| 270 | rep stosl |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 271 | |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 272 | #if 0 |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 273 | /* Check the cache as ram. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 274 | movl $CacheBase, %esi |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 275 | movl $(CacheSize >> 2), %ecx |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 276 | .xin1: |
| 277 | movl %esi, %eax |
| 278 | movl %eax, (%esi) |
| 279 | decl %ecx |
| 280 | je .xout1 |
| 281 | add $4, %esi |
| 282 | jmp .xin1 |
| 283 | .xout1: |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 284 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 285 | movl $CacheBase, %esi |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 286 | // movl $(CacheSize >> 2), %ecx |
| 287 | movl $4, %ecx |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 288 | .xin1x: |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 289 | movl %esi, %eax |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 290 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 291 | movl $0x4000, %edx |
| 292 | movb %ah, %al |
| 293 | .testx1: |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 294 | outb %al, $0x80 |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 295 | decl %edx |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 296 | jnz .testx1 |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 297 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 298 | movl (%esi), %eax |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 299 | cmpb 0xff, %al |
| 300 | je .xin2 /* Don't show. */ |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 301 | |
| 302 | movl $0x4000, %edx |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 303 | .testx2: |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 304 | outb %al, $0x80 |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 305 | decl %edx |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 306 | jnz .testx2 |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 307 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 308 | .xin2: |
| 309 | decl %ecx |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 310 | je .xout1x |
| 311 | add $4, %esi |
| 312 | jmp .xin1x |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 313 | .xout1x: |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 314 | #endif |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 315 | |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 316 | movl $(CacheBase + CacheSize - 4), %eax |
| 317 | movl %eax, %esp |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 318 | lout: |
Stefan Reinauer | 7b0500c | 2011-01-19 06:54:42 +0000 | [diff] [blame] | 319 | /* Restore the BIST result. */ |
| 320 | movl %ebp, %eax |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 321 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 322 | /* We need to set EBP? No need. */ |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 323 | movl %esp, %ebp |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 324 | pushl %eax /* BIST */ |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 325 | call main |
arch import user (historical) | 6ca7636 | 2005-07-06 17:17:25 +0000 | [diff] [blame] | 326 | |
Uwe Hermann | 66d1687 | 2010-10-01 07:27:51 +0000 | [diff] [blame] | 327 | /* We don't need CAR from now on. */ |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 328 | |
Stefan Reinauer | 7b0500c | 2011-01-19 06:54:42 +0000 | [diff] [blame] | 329 | /* Disable cache. */ |
| 330 | movl %cr0, %eax |
| 331 | orl $(1 << 30), %eax |
| 332 | movl %eax, %cr0 |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 333 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 334 | /* Clear sth. */ |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 335 | movl $MTRRfix4K_C8000_MSR, %ecx |
| 336 | xorl %edx, %edx |
| 337 | xorl %eax, %eax |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 338 | wrmsr |
arch import user (historical) | fb07bf4 | 2005-07-06 18:17:43 +0000 | [diff] [blame] | 339 | |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 340 | #if CONFIG_DCACHE_RAM_SIZE > 0x8000 |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 341 | movl $MTRRfix4K_C0000_MSR, %ecx |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 342 | wrmsr |
| 343 | #endif |
| 344 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 345 | /* |
| 346 | * Set the default memory type and disable fixed |
| 347 | * and enable variable MTRRs. |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 348 | */ |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 349 | movl $MTRRdefType_MSR, %ecx |
| 350 | xorl %edx, %edx |
Stefan Reinauer | 139e6f9 | 2011-04-14 20:06:30 +0000 | [diff] [blame] | 351 | movl $MTRRdefTypeEn, %eax /* Enable variable and disable fixed MTRRs. */ |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 352 | wrmsr |
| 353 | |
Stefan Reinauer | 7b0500c | 2011-01-19 06:54:42 +0000 | [diff] [blame] | 354 | /* Enable cache. */ |
| 355 | movl %cr0, %eax |
| 356 | andl $(~((1 << 30) | (1 << 29))), %eax |
| 357 | movl %eax, %cr0 |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 358 | |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 359 | /* Clear boot_complete flag. */ |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 360 | xorl %ebp, %ebp |
| 361 | __main: |
Alexandru Gagniuc | 5005bb06 | 2011-04-11 20:17:22 +0000 | [diff] [blame] | 362 | post_code(POST_PREPARE_RAMSTAGE) |
Uwe Hermann | 4292684 | 2010-09-30 23:15:36 +0000 | [diff] [blame] | 363 | cld /* Clear direction flag. */ |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 364 | |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 365 | movl %ebp, %esi |
| 366 | |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 367 | movl $ROMSTAGE_STACK, %esp |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 368 | movl %esp, %ebp |
Stefan Reinauer | 3058491 | 2010-08-14 20:38:17 +0000 | [diff] [blame] | 369 | pushl %esi |
| 370 | call copy_and_run |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 371 | |
Stefan Reinauer | 14e2277 | 2010-04-27 06:56:47 +0000 | [diff] [blame] | 372 | .Lhlt: |
Alexandru Gagniuc | 5005bb06 | 2011-04-11 20:17:22 +0000 | [diff] [blame] | 373 | post_code(POST_DEAD_CODE) |
Myles Watson | 707fad0 | 2009-10-23 18:22:27 +0000 | [diff] [blame] | 374 | hlt |
Stefan Reinauer | ccdd20a | 2010-04-14 07:47:07 +0000 | [diff] [blame] | 375 | jmp .Lhlt |
| 376 | |