On Tue, Oct 19, 1999, Francois Desloges <[EMAIL PROTECTED]> wrote:

>Definitely :-) 
>But I now doubt that it has anything to do with the NIC card.
>I'm trying to get some feedback from the Russel's BIOS I've downloaded
in Bank
>#3 of my EBSA-285 with a JTAG utility from Intel (binary only :-().
>
>Built as an 1.05 ELF bios with
>TEXTADDR       = 0x410c00c0
>and -DDEBUG tailed to the definiton of CFLAGS in the Makefile

I use TEXTADDR  = 0x41000080

(the AIF header is 128 bytes)

>The POST test from ARM, downloaded in any of the banks with the same JTAG
>utility, works perfectly. And generate fabulous printf on the terminal.
>
>With the BIOS, we don't even get at the point where we can read the first
>>printf("EBSA285 Linux BIOS v"VERSION" (c) 1998-1999 Russell King
>>([EMAIL PROTECTED])\n\n");
>in start_main.
>Not even the little custom printf we've added on the first line of start_main
>get outputed to terminal.
>
>Sometimes, the bios resulting from mkaif bios.elf is smaller than bios.elf
>itself, sometimes it is bigger.  Without any pods on the EBSA to plug a logic
>analyser on, I wonder how we can understand what is happening...

It's possible that there is a bug in the ELF version of mkaif since I
made it ;)
I'll try to upload the version I use here (I beleive it's the same as the
one in Russel's 1.05 version, but I'm not sure I didn't change anything
so I'll double check, ping me if you don't hear from me by Friday).

One thing you can do for debugging is to add some serial output in the
assembly entry code (crt0.S). I had to make some changes to the RAM
detection code for it to work on my board, but I can't tell now if the
failure of Russel code was due to a change in the 285, or tue a HW bug we
had with RAM which was fixed in our latest prototype.

Anyway, here's my version of the code (the beginning of crt0.S, I didn't
copy the whole file, all the rest didn't change). Notice the debugging
serial output (yes, I know, I could have used strings ;)

#include "bios/linkage.h"
#include "bios/config.h"

#define CSR_BASE        0x42000000
#define SDRAM_TIMING    0x10c
#define SDRAM_ADDR_SZ0  0x110
#define SDRAM_ADDR_SZ1  0x114
#define SDRAM_ADDR_SZ2  0x118
#define SDRAM_ADDR_SZ3  0x11c

#define SDRAM_BASE      0x40000000
#define SDRAM_NRARRAYS  4
#define SDRAM_ARRAYOFF  0x00004000
#define FLUSH_BASE      SDRAM_BASE

#define XBUS_CYCLE      0x148
#define XBUS_STROBE     0x14C
#define SA_CONTROL      0x13C

#define UARTDR          0x160

#define BAUD_RATE_DIVISOR       19/*40*/

#define MAX_AREA_SIZE   32768

#define SDRAM_BURST_LEN         2       /* Burst size is 4 */
#define SDRAM_BURST_TYPE        0       /* Linear burst */
#define SDRAM_CAS_LAT           2       /* CAS latency (2 or 3 supported) */
#define SDRAM_RASTOCAS_LAT      2       /* RAS-to-CAS latency (2 or 3 supported) */
#define SDRAM_MODE                      ((SDRAM_BURST_LEN<<2)|(SDRAM_BURST_TYPE<<5)| \
                                                         (SDRAM_CAS_LAT<<6))


/* Init values for XBus */
#if 0
#define INIT_XBUS_CYCLE         0x000016DB /* 0001-011 0-11 01-1 011 */
#define INIT_XBUS_STROBE        0xfcfcfcfc /* fc: __-- (1100) */        
#else
#define INIT_XBUS_CYCLE         0x00003FFF /* 0011-111 1-11 11-1 111 */
#define INIT_XBUS_STROBE        0xe3e3e3e3 /* fc: --___-- (1110 0011) */
#endif
#define XCS_2                           0x40000000
#define XCS_1                           0x20000000
#define XCS_0                           0x10000000
#define XBUS_INIT                       (XCS_2 | XCS_1 | XCS_0)
#define SA_CTL_INIT                     (XBUS_INIT | ROM_SETUP)
#define ROM_TIMING                      0x0fff0000
#define ROM_SETUP                       0x00000000 /* Everything 16 cycles */

#define XBUS_0_BASE                     0x40010000
#define XBUS_1_BASE                     0x40011000
#define XBUS_2_BASE                     0x40012000


        .text

@ Entry
        .globl  _entry
_entry:
        bic     r11, lr, #3
        mrs     r0, cpsr
        bic     r0, r0, #0x1f
        orr     r0, r0, #0xd3
        msr     cpsr, r0
        ldr     sp, [r11, #8]

/*
 * switch the ROM memory map
 * so that we can access the SDRAM
 */

        ldr     pc, 1f
1:      .word   switch
switch:

        mov     r0, #0
        mcr     p15, 0, r0, c15, c1, 2  @ enable clock switching        
        mov     r0, #0
        mcr     p15, 0, r0, c7, c7, 0   @ flush all caches

        mrc     p15, 0, r0, c1, c0      @ Control reg
        bic     r0, r0, #0x0d           @ D-cache, wback & MMU off
        bic     r0, r0, #1 << 12        @ I-cache off
        mcr     p15, 0, r0, c1, c0      @ Control reg

#ifdef CONFIG_INIT_XBUS
        /* Init X-Bus */
        mov     r0, #CSR_BASE
        ldr     r1, =SA_CTL_INIT
        str     r1, [r0, #SA_CONTROL]

        ldr     r1, =INIT_XBUS_CYCLE
        str     r1, [r0, #XBUS_CYCLE]

        ldr     r1, =INIT_XBUS_STROBE
        str     r1, [r0, #XBUS_STROBE]
        
        /* Set leds to OFF */
        ldr     r0, =XBUS_1_BASE
        mov     r1, #0xff
        str     r1, [r0]
#endif

        /* Init serial */
        bl      ser_init

        mov     r0, #'H'
        bl      ser_printc
        mov     r0, #'E'
        bl      ser_printc
        mov     r0, #'L'
        bl      ser_printc
        mov     r0, #'L'
        bl      ser_printc
        mov     r0, #'O'
        bl      ser_printc
        mov     r0, #10
        bl      ser_printc

/*
 * Initialise SDRAM.  This copes with the SDRAM in any state -
 * it does a complete initialisation and allocation of all
 * banks.
 *
 * Turn off SDRAM refresh
 */
        mov     r0, #0
        mov     ip, #CSR_BASE
        str     r0, [ip, #SDRAM_TIMING]
/* 
 * Wait for any refresh cycles to complete
 */
        mov     r0, #64
1:      subs    r0, r0, #1
        bgt     1b
/*
 * All-banks precharge SDRAM arrays
 */
        mov     r0, #SDRAM_BASE
        mov     r1, #SDRAM_NRARRAYS
1:      ldr     r2, [r0]
        ldr     r2, [r0]
        add     r0, r0, #SDRAM_ARRAYOFF
        subs    r1, r1, #1
        bgt     1b
/*
 * Write mode registers
 */
        mov     r0, #SDRAM_BASE
        orr     r0, r0, #SDRAM_MODE/*#0x84*//*#0x88*/           @ Tcas
        mov     r1, #SDRAM_NRARRAYS
1:      str     r0, [r0]
        add     r0, r0, #SDRAM_ARRAYOFF
        subs    r1, r1, #1
        bgt     1b
/*
 * Turn on minimum SDRAM refresh
 */
        mov     r0, #0x00010000
        orr     r0, r0, #0x00000b00
        orr     r0, r0, #(0x00000005|(SDRAM_CAS_LAT<<6)|(SDRAM_RASTOCAS_LAT<<4))
        str     r0, [ip, #SDRAM_TIMING]
/*
 * Set size to maximum
 */
        mov     r1, #SDRAM_NRARRAYS
        add     r2, ip, #SDRAM_ADDR_SZ0
        mov     r0, #0x2f       /* We begin with mode 2 ! */
1:      str     r0, [r2], #4
        add     r0, r0, #64*1024*1024
        subs    r1, r1, #1
        bgt     1b
/*
 * Wait for banks to be refreshed
 */
        mov     r0, #10
        mov     r1, #0
1:      subs    r1, r1, #2
        bgt     1b
        subs    r0, r0, #1
        bgt     1b
/*
 * Set SDRAM refresh to normal
 */
        mov     r0, #0x001a0000
        orr     r0, r0, #0x00000b00
        orr     r0, r0, #0x000000a5
        str     r0, [ip, #SDRAM_TIMING]

        mov     r4, #0x00000000
1:      mov     r5, #0
/*
 * Detect RAM multiplexer settings
 */
        mov     r0, #10
        bl      ser_printc
        mov     r0, #'R'
        bl      ser_printc
        mov     r0, #'4'
        bl      ser_printc
        mov     r0, #':'
        bl      ser_printc
        mov     r0, r4
        bl      ser_printhex

        mov     r0, r4                  @ check for presence
        add     r1, r4, #64
        bl      testram
        bne     4f

        mov     r0, #'P'
        bl      ser_printc

        /* Check for mode 0 if aliased on 21 */
        mov     r0, r4                  @ check bit 21
        orr     r1, r0, #1 << 21
        bl      testram
        orreq   r5, r5, #8
        moveq r0, #'N'
        movne r0, #'A'
        bl ser_printc

        /* Check for mode 2 if !aliased on bit 23 */
        mov     r0, r4                  @ check bit 23
        orr     r1, r0, #1 << 23
        bl      testram
        orrne   r5, r5, #4
        moveq r0, #'N'
        movne r0, #'A'
        bl ser_printc

        /* Check for mode 4 if !aliased on bit 22 */
        mov     r0, r4                  @ check bit 22
        orr     r1, r0, #1 << 22
        bl      testram
        orrne   r5, r5, #2
        moveq r0, #'N'
        movne r0, #'A'
        bl ser_printc

        /* Now catch most mode 1 via bit 24 */
        mov     r0, r4                  @ check bit 24
        orr     r1, r0, #1 << 24
        bl      testram
        orrne   r5, r5, #1
        moveq r0, #'N'
        movne r0, #'A'
        bl ser_printc
        
        adr     r1, ram_modes           @ convert test -> mux
        ldrb    r6, [r1, r5]

        mov     r0, #'M'
        bl      ser_printc
        mov     r0, r6
        bl      ser_printhex

        orr     r6, r6, r4

        add     r0, ip, #SDRAM_ADDR_SZ0 @ set mux correctly
        orr     r5, r6, #7              @ leave size at 64MB
        str     r5, [r0, r4, lsr #24]
/*
 * Detect RAM array size
 */
        mov     r5, #1 << 20
        mov     r7, #0

2:      add     r0, r4, r5
        add     r1, r4, r5, lsr #1
        bl      testram
        bne     3f
        mov     r5, r5, lsl #1
        cmp     r7, #7
        addne   r7, r7, #1
        bne     2b

3:      orr     r5, r6, r7

        mov     r0, #'S'
        bl      ser_printc
        mov     r0, r7
        bl      ser_printhex

4:      add     r0, ip, #SDRAM_ADDR_SZ0
        str     r5, [r0, r4, lsr #24]   @ set array size
        add     r4, r4, #0x04000000
        teq     r4, #0x10000000
        bne     1b

        mov     r0, #10
        bl      ser_printc
/*
 * Allocate RAM addresses
 */
        mov     r3, #7                  @ start at largest size
        mov     r4, #0x00000000
1:      mov     r5, #SDRAM_NRARRAYS
        add     r2, ip, #SDRAM_ADDR_SZ0
2:      ldr     r0, [r2], #4            @ Read SDRAM size & addr
        and     r1, r0, #7
        teq     r1, r3
        bne     3f

        and     r0, r0, #127            @ Preserve size etc
        orr     r0, r0, r4              @ Add base address
        str     r0, [r2, #-4]           @ Write SDRAM size & addr

        mov     r0, #524288
        add     r4, r4, r0, lsl r1      @ Next address

3:      subs    r5, r5, #1
        bgt     2b
        subs    r3, r3, #1
        bgt     1b

        /* Print out detected amount of RAM */
        mov     r0, #'R'
        bl      ser_printc
        mov     r0, #'A'
        bl      ser_printc
        mov     r0, #'M'
        bl      ser_printc
        mov     r0, #':'
        bl      ser_printc
        mov     r0, r4
        bl      ser_printhex
        mov     r0, #10
        bl      ser_printc
        
        mrc     p15, 0, r0, c1, c0      @ Control reg
        bic     r0, r0, #0x0d           @ D-cache, wback & MMU off
        orr     r0, r0, #1 << 12        @ I-cache on
        mcr     p15, 0, r0, c1, c0      @ Control reg

        mov     r0, #'C'
        bl      ser_printc

        /* At this point, sp contains the size of the datas. Those
           are copied to RAM address 0x1000 */
        mov     r1, #0x1000
        ldr     r2, =SYMBOL_NAME(_etext)
1:      ldr     r0, [r2], #4
        str     r0, [r1], #4
        subs    sp, sp, #4
        bgt     1b

        mov     r0, #'D'
        bl      ser_printc

        /* BSS is initialized */
        mov     r0, #0
        ldr     r1, =SYMBOL_NAME(_bss_start)
        ldr     r2, =SYMBOL_NAME(_end)
1:      str     r0, [r1], #4
        cmp     r1, r2
        blt     1b
        
        mov     r0, #'B'
        bl      ser_printc

        /* Set stack to top of RAM -1Mb */
        sub     sp, r4, #1048576

        bl      vec_init

        ldr     r0, =SYMBOL_NAME(ram_size)
        str     r4, [r0]

        mov     r0, #'J'
        bl      ser_printc

        bl      SYMBOL_NAME(start_main)
l:      b       l

ram_modes:
        .byte   0x00
        .byte   0x00
        .byte   0x00
        .byte   0x00
        .byte   0x00
        .byte   0x00
        .byte   0x00
        .byte   0x00
        .byte   0x20
        .byte   0x20
        .byte   0x20
        .byte   0x20
        .byte   0x40
        .byte   0x40
        .byte   0x10
        .byte   0x30

        .align  4
        


unsubscribe: body of `unsubscribe linux-arm' to [EMAIL PROTECTED]

Reply via email to