x86: Split sc520 memory sizing versus reporting
authorGraeme Russ <graeme.russ@gmail.com>
Fri, 23 Apr 2010 14:05:41 +0000 (00:05 +1000)
committerWolfgang Denk <wd@denx.de>
Wed, 5 May 2010 22:14:44 +0000 (00:14 +0200)
This patch allows the low-level assembler boot-strap to obtain the RAM
size without calling the destructive 'sizer' routine. This allows
boot-strapping from a U-Boot image loaded in RAM

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
arch/i386/cpu/sc520/sc520_asm.S
arch/i386/cpu/start.S

index 135f7b4f30891b6a869b99cf3ceb6332ffc1e09d..947e12bbbc88a59810d40efab9c264d18b0cd1cc 100644 (file)
@@ -498,47 +498,21 @@ bad_ram:
 
 dram_done:
 
-       /* readback DRCBENDADR and return the number
-        * of available ram bytes in %eax */
-
-       movl    $DRCBENDADR, %edi        /* DRAM ending address register  */
-
-bank0: movl    (%edi), %eax
-       movl    %eax, %ecx
-       andl    $0x00000080, %ecx
-       jz      bank1
-       andl    $0x0000007f, %eax
-       shll    $22, %eax
-       movl    %eax, %ebx
-
-bank1: movl    (%edi), %eax
-       movl    %eax, %ecx
-       andl    $0x00008000, %ecx
-       jz      bank2
-       andl    $0x00007f00, %eax
-       shll    $14, %eax
-       movl    %eax, %ebx
-
-bank2: movl    (%edi), %eax
-       movl    %eax, %ecx
-       andl    $0x00800000, %ecx
-       jz      bank3
-       andl    $0x007f0000, %eax
-       shll    $6, %eax
-       movl    %eax, %ebx
+#if CONFIG_SYS_SDRAM_ECC_ENABLE
+       /*
+        * We are in the middle of an existing 'call' - Need to store the
+        * existing return address before making another 'call'
+        */
+       movl    %ebp, %ebx
 
-bank3: movl    (%edi), %eax
-       movl    %eax, %ecx
-       andl    $0x80000000, %ecx
-       jz      done
-       andl    $0x7f000000, %eax
-       shrl    $2, %eax
-       movl    %eax, %ebx
+       /* Get the memory size */
+       movl    $init_ecc, %ebp
+       jmpl    get_mem_size
 
-done:
-       movl    %ebx, %eax
+init_ecc:
+       /* Restore the orignal return address */
+       movl    %ebx, %ebp
 
-#if CONFIG_SYS_SDRAM_ECC_ENABLE
        /* A nominal memory test: just a byte at each address line */
        movl    %eax, %ecx
        shrl    $0x1, %ecx
@@ -575,6 +549,50 @@ set_ecc:
        mov     $0x05, %al
        movb    %al, (%edi)
 #endif
+
 out:
+       jmp     *%ebp
+
+/*
+ * Read and decode the sc520 DRCBENDADR MMCR and return the number of
+ * available ram bytes in %eax
+ */
+.globl get_mem_size
+get_mem_size:
+       movl    $DRCBENDADR, %edi        /* DRAM ending address register  */
+
+bank0: movl    (%edi), %eax
+       movl    %eax, %ecx
+       andl    $0x00000080, %ecx
+       jz      bank1
+       andl    $0x0000007f, %eax
+       shll    $22, %eax
+       movl    %eax, %ebx
+
+bank1: movl    (%edi), %eax
+       movl    %eax, %ecx
+       andl    $0x00008000, %ecx
+       jz      bank2
+       andl    $0x00007f00, %eax
+       shll    $14, %eax
+       movl    %eax, %ebx
+
+bank2: movl    (%edi), %eax
+       movl    %eax, %ecx
+       andl    $0x00800000, %ecx
+       jz      bank3
+       andl    $0x007f0000, %eax
+       shll    $6, %eax
+       movl    %eax, %ebx
+
+bank3: movl    (%edi), %eax
+       movl    %eax, %ecx
+       andl    $0x80000000, %ecx
+       jz      done
+       andl    $0x7f000000, %eax
+       shrl    $2, %eax
+       movl    %eax, %ebx
+
+done:
        movl    %ebx, %eax
        jmp     *%ebp
index 25d32e658e60206915ff33573386eb4bdb0548e2..1980f1a7b7800405816a5e5c3be00499eb8b628b 100644 (file)
@@ -63,6 +63,11 @@ early_board_init_ret:
        jmp     mem_init
 mem_init_ret:
 
+       /* fetch memory size (into %eax) */
+       mov     $get_mem_size_ret, %ebp
+       jmp     get_mem_size
+get_mem_size_ret:
+
        /* Check we have enough memory for stack */
        movl    $CONFIG_SYS_STACK_SIZE, %ecx
        cmpl    %ecx, %eax