Remove whitespace.
[coreboot.git] / src / cpu / via / car / cache_as_ram.inc
index ba0fadfec5ccc90fadba4f3ef99551edf423ac4c..90e6d2b88f6aee660ae375d87060e794038824d2 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
-#define CacheSize CONFIG_DCACHE_RAM_SIZE
-#define CacheBase CONFIG_DCACHE_RAM_BASE
-
-
+#include <cpu/x86/stack.h>
 #include <cpu/x86/mtrr.h>
+#include <console/post_codes.h>
 
-       /* Save the BIST result */
+#define CacheSize              CONFIG_DCACHE_RAM_SIZE
+#define CacheBase              CONFIG_DCACHE_RAM_BASE
+
+       /* Save the BIST result. */
        movl    %eax, %ebp
 
 CacheAsRam:
 
-       /* disable cache */
+       /* Disable cache. */
        movl    %cr0, %eax
-       orl     $(0x1<<30),%eax
-       movl    %eax,%cr0
+       orl     $(1 << 30), %eax
+       movl    %eax, %cr0
        invd
 
-       /* Set the default memory type and enable fixed and variable MTRRs */
+       /* Set the default memory type and enable fixed and variable MTRRs. */
        movl    $MTRRdefType_MSR, %ecx
        xorl    %edx, %edx
-       /* Enable Variable and Fixed MTRRs */
-       movl    $0x00000c00, %eax
+       movl    $(MTRRdefTypeEn | MTRRdefTypeFixEn), %eax
        wrmsr
 
-       /* Clear all MTRRs */
+       /* Clear all MTRRs. */
        xorl    %edx, %edx
-       movl    $fixed_mtrr_msr, %esi
+       movl    $all_mtrr_msrs, %esi
 
 clear_fixed_var_mtrr:
        lodsl   (%esi), %eax
@@ -63,74 +63,118 @@ clear_fixed_var_mtrr:
        wrmsr
 
        jmp     clear_fixed_var_mtrr
+
+all_mtrr_msrs:
+       /* fixed MTRR MSRs */
+       .long   MTRRfix64K_00000_MSR
+       .long   MTRRfix16K_80000_MSR
+       .long   MTRRfix16K_A0000_MSR
+       .long   MTRRfix4K_C0000_MSR
+       .long   MTRRfix4K_C8000_MSR
+       .long   MTRRfix4K_D0000_MSR
+       .long   MTRRfix4K_D8000_MSR
+       .long   MTRRfix4K_E0000_MSR
+       .long   MTRRfix4K_E8000_MSR
+       .long   MTRRfix4K_F0000_MSR
+       .long   MTRRfix4K_F8000_MSR
+
+       /* var MTRR MSRs */
+       .long   MTRRphysBase_MSR(0)
+       .long   MTRRphysMask_MSR(0)
+       .long   MTRRphysBase_MSR(1)
+       .long   MTRRphysMask_MSR(1)
+       .long   MTRRphysBase_MSR(2)
+       .long   MTRRphysMask_MSR(2)
+       .long   MTRRphysBase_MSR(3)
+       .long   MTRRphysMask_MSR(3)
+       .long   MTRRphysBase_MSR(4)
+       .long   MTRRphysMask_MSR(4)
+       .long   MTRRphysBase_MSR(5)
+       .long   MTRRphysMask_MSR(5)
+       .long   MTRRphysBase_MSR(6)
+       .long   MTRRphysMask_MSR(6)
+       .long   MTRRphysBase_MSR(7)
+       .long   MTRRphysMask_MSR(7)
+
+       .long   0x000 /* NULL, end of table */
+
 clear_fixed_var_mtrr_out:
-       /* MTRRPhysBase */
-       movl    $0x200, %ecx
+       movl    $MTRRphysBase_MSR(0), %ecx
        xorl    %edx, %edx
-       movl    $(CacheBase|MTRR_TYPE_WRBACK),%eax
+       movl    $(CacheBase | MTRR_TYPE_WRBACK), %eax
        wrmsr
 
-       /* MTRRPhysMask */
-       movl    $0x201, %ecx
+       movl    $MTRRphysMask_MSR(0), %ecx
        /* This assumes we never access addresses above 2^36 in CAR. */
-       movl    $0x0000000f,%edx
-       movl    $(~(CacheSize-1)|0x800),%eax
+       movl    $0x0000000f, %edx
+       movl    $(~(CacheSize - 1) | MTRRphysMaskValid), %eax
        wrmsr
 
-       /* enable write base caching so we can do execute in place
-        * on the flash rom.
+       /*
+        * Enable write base caching so we can do execute in place (XIP)
+        * on the flash ROM.
         */
-       /* MTRRPhysBase */
-       movl    $0x202, %ecx
+       movl    $MTRRphysBase_MSR(1), %ecx
        xorl    %edx, %edx
-#if defined(CONFIG_TINY_BOOTBLOCK) && CONFIG_TINY_BOOTBLOCK
-#define REAL_XIP_ROM_BASE AUTO_XIP_ROM_BASE
-#else
-#define REAL_XIP_ROM_BASE CONFIG_XIP_ROM_BASE
-#endif
-       movl    $REAL_XIP_ROM_BASE, %eax
-       orl     $MTRR_TYPE_WRBACK, %eax
+       /*
+        * IMPORTANT: The following calculation _must_ be done at runtime. See
+        * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html
+        */
+       movl    $copy_and_run, %eax
+       andl    $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax
+       orl     $MTRR_TYPE_WRBACK, %eax
        wrmsr
 
-       /* MTRRPhysMask */
-       movl    $0x203, %ecx
+       movl    $MTRRphysMask_MSR(1), %ecx
        movl    $0x0000000f, %edx
-       movl    $(~(CONFIG_XIP_ROM_SIZE - 1) | 0x800), %eax
+       movl    $(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax
        wrmsr
 
+       /* Set the default memory type and enable fixed and variable MTRRs. */
+       /* TODO: Or also enable fixed MTRRs? Bug in the code? */
        movl    $MTRRdefType_MSR, %ecx
        xorl    %edx, %edx
-       /* Enable Variable and Fixed MTRRs */
-       movl    $0x00000800, %eax
+       movl    $(MTRRdefTypeEn), %eax
        wrmsr
 
+       /* Enable cache. */
        movl    %cr0, %eax
-       andl    $0x9fffffff, %eax
+       andl    $(~((1 << 30) | (1 << 29))), %eax
        movl    %eax, %cr0
 
-       /* Read the range with lodsl*/
+       /* Read the range with lodsl*/
        cld
        movl    $CacheBase, %esi
        movl    %esi, %edi
-       movl    $(CacheSize>>2), %ecx
+       movl    $(CacheSize >> 2), %ecx
        rep     lodsl
 
        movl    $CacheBase, %esi
        movl    %esi, %edi
        movl    $(CacheSize >> 2), %ecx
 
-       /* 0x5c5c5c5c is a memory test pattern.
-        * TODO: Check if everything works with the zero pattern as well. */
-       /*xorl  %eax, %eax*/
-       xorl    $0x5c5c5c5c,%eax
+       /*
+        * 0x5c5c5c5c is a memory test pattern.
+        * TODO: Check if everything works with the zero pattern as well.
+        */
+       /* xorl %eax, %eax */
+       xorl    $0x5c5c5c5c, %eax
        rep     stosl
 
-       movl    CONFIG_XIP_ROM_BASE, %esi
+#ifdef CARTEST
+       /*
+        * IMPORTANT: The following calculation _must_ be done at runtime. See
+        * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html
+        */
+       movl    $copy_and_run, %esi
+       andl    $(~(CONFIG_XIP_ROM_SIZE - 1)), %ei
        movl    %esi, %edi
-       movl    $(CONFIG_XIP_ROM_SIZE>>2), %ecx
+       movl    $(CONFIG_XIP_ROM_SIZE >> 2), %ecx
        rep     lodsl
+#endif
 
-       /* The key point of this CAR code is C7 cache does not turn into
+       /*
+        * The key point of this CAR code is C7 cache does not turn into
         * "no fill" mode, which is not compatible with general CAR code.
         */
 
@@ -138,42 +182,102 @@ clear_fixed_var_mtrr_out:
        movl    %eax, %esp
 
 #ifdef CARTEST
-testok:        movb $0x40,%al
-       outb %al, $0x80
+testok:
+       post_code(0x40)
        xorl    %edx, %edx
        xorl    %eax, %eax
-       movl    $0x5c5c,%edx
-       pushl %edx
-       pushl %edx
-       pushl %edx
-       pushl %edx
-       pushl %edx
+       movl    $0x5c5c, %edx
+       pushl   %edx
+       pushl   %edx
+       pushl   %edx
+       pushl   %edx
+       pushl   %edx
        popl    %esi
        popl    %esi
        popl    %eax
        popl    %eax
        popl    %eax
-       cmpl %edx,%eax
-       jne stackerr
+       cmpl    %edx, %eax
+       jne     stackerr
 #endif
 
-       /* Restore the BIST result */
+       /* Restore the BIST result. */
        movl    %ebp, %eax
 
-       /* We need to set ebp ? No need */
+       /* We need to set EBP? No need. */
        movl    %esp, %ebp
-       pushl   %eax  /* bist */
-       call    stage1_main
-       /* We will not go back */
-
-fixed_mtrr_msr:
-       .long   0x250, 0x258, 0x259
-       .long   0x268, 0x269, 0x26A
-       .long   0x26B, 0x26C, 0x26D
-       .long   0x26E, 0x26F
-var_mtrr_msr:
-       .long   0x200, 0x201, 0x202, 0x203
-       .long   0x204, 0x205, 0x206, 0x207
-       .long   0x208, 0x209, 0x20A, 0x20B
-       .long   0x20C, 0x20D, 0x20E, 0x20F
-       .long   0x000 /* NULL, end of table */
+       pushl   %eax    /* BIST */
+       call    main
+
+       /*
+        * TODO: Backup stack in CACHE_AS_RAM into MMX and SSE and after we
+        *       get STACK up, we restore that. It is only needed if we
+        *       want to go back.
+        */
+
+       /* We don't need CAR from now on. */
+
+       /* Disable cache. */
+       movl    %cr0, %eax
+       orl     $(1 << 30), %eax
+       movl    %eax, %cr0
+
+       /* Set the default memory type and enable variable MTRRs. */
+       /* TODO: Or also enable fixed MTRRs? Bug in the code? */
+       movl    $MTRRdefType_MSR, %ecx
+       xorl    %edx, %edx
+       movl    $(MTRRdefTypeEn), %eax
+       wrmsr
+
+       /* Enable caching for CONFIG_RAMBASE..CONFIG_RAMTOP. */
+       movl    $MTRRphysBase_MSR(0), %ecx
+       xorl    %edx, %edx
+       movl    $(CONFIG_RAMBASE | MTRR_TYPE_WRBACK), %eax
+       wrmsr
+
+       movl    $MTRRphysMask_MSR(0), %ecx
+       movl    $0x0000000f, %edx       /* AMD 40 bit 0xff */
+       movl    $(~(CONFIG_RAMTOP - CONFIG_RAMBASE - 1) | MTRRphysMaskValid), %eax
+       wrmsr
+
+       /* Cache XIP_ROM area to speedup coreboot code. */
+       movl    $MTRRphysBase_MSR(1), %ecx
+       xorl    %edx, %edx
+       /*
+        * IMPORTANT: The following calculation _must_ be done at runtime. See
+        * http://www.coreboot.org/pipermail/coreboot/2010-October/060855.html
+        */
+       movl    $copy_and_run, %eax
+       andl    $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax
+       orl     $MTRR_TYPE_WRBACK, %eax
+       wrmsr
+
+       movl    $MTRRphysMask_MSR(1), %ecx
+       xorl    %edx, %edx
+       movl    $(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax
+       wrmsr
+
+       /* Enable cache. */
+       movl    %cr0, %eax
+       andl    $(~((1 << 30) | (1 << 29))), %eax
+       movl    %eax, %cr0
+       invd
+
+       /* Clear boot_complete flag. */
+       xorl    %ebp, %ebp
+__main:
+       post_code(POST_PREPARE_RAMSTAGE)
+       cld                     /* Clear direction flag. */
+
+       movl    %ebp, %esi
+
+       movl    $ROMSTAGE_STACK, %esp
+       movl    %esp, %ebp
+       pushl   %esi
+       call    copy_and_run
+
+.Lhlt:
+       post_code(POST_DEAD_CODE)
+       hlt
+       jmp     .Lhlt
+