David Hendricks ([email protected]) just uploaded a new patch set to 
gerrit, which you can find at http://review.coreboot.org/2156

-gerrit

commit 01f61beacd52b15d9dd7c7dcf69cf4c396b8a7f4
Author: David Hendricks <[email protected]>
Date:   Tue Jan 15 21:37:52 2013 -0800

    WIP: add UART support in bootblock for exynos5250
    
    ** do not submit **
    
    This is a very rough hack to get basic UART support in the bootblock
    for exynos5250. It is basically just a bunch of copy+pasted portions
    from other portions of the code. A few magic offsets had to be
    adjusted too, or so I thought...
    
    Change-Id: I4aae023ebf9335fac88bcb5ae49cb99c15f6c29e
    Signed-off-by: David Hendricks <[email protected]>
---
 src/mainboard/google/snow/bootblock.c | 39 +++++++++++++----------------------
 1 file changed, 14 insertions(+), 25 deletions(-)

diff --git a/src/mainboard/google/snow/bootblock.c 
b/src/mainboard/google/snow/bootblock.c
index 6716d05..3a600d7 100644
--- a/src/mainboard/google/snow/bootblock.c
+++ b/src/mainboard/google/snow/bootblock.c
@@ -732,7 +732,7 @@ static void exynos5_uart_tx_byte(unsigned char data)
        writeb(data, &uart->utxh);
 }
 
-extern void puts(const char *s);
+void puts(const char *s);
 void puts(const char *s)
 {
        int n = 0;
@@ -1852,6 +1852,13 @@ static void clock_init(void)
 #define is_digit isdigit
 #define isxdigit(c)    (((c) >= '0' && (c) <= '9') || ((c) >= 'a' && (c) <= 
'f') || ((c) >= 'A' && (c) <= 'F'))
 
+void __div0 (void);
+void __div0 (void)
+{
+       puts("divide by zero detected");
+       while(1) ;
+}
+
 static int skip_atoi(const char **s)
 {
        int i=0;
@@ -1870,8 +1877,6 @@ static int number(void (*tx_byte)(unsigned char byte),
        int i;
        int count = 0;
 
-       puts("number: entered");
-       puts("number: checkpoint 1");
        if (type & LARGE)
                digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        if (type & LEFT)
@@ -1880,7 +1885,6 @@ static int number(void (*tx_byte)(unsigned char byte),
                return 0;
        c = (type & ZEROPAD) ? '0' : ' ';
        sign = 0;
-       puts("number: checkpoint 2");
        if (type & SIGN) {
                if ((signed long long)num < 0) {
                        sign = '-';
@@ -1894,7 +1898,6 @@ static int number(void (*tx_byte)(unsigned char byte),
                        size--;
                }
        }
-       puts("number: checkpoint 3");
        if (type & SPECIAL) {
                if (base == 16)
                        size -= 2;
@@ -1902,20 +1905,17 @@ static int number(void (*tx_byte)(unsigned char byte),
                        size--;
        }
        i = 0;
-       puts("number: checkpoint 4");
        if (num == 0) {
-               puts("number: checkpoint 4a");
                tmp[i++]='0';
-               puts("number: checkpoint 4b");
        } else while (num != 0) {
-               puts("number: checkpoint 4c");
-               tmp[i++] = digits[do_div(num,base)];
-               puts("number: checkpoint 4d");
+               /* FIXME: do_div was broken */
+//             tmp[i++] = digits[do_div(num,base)];
+               tmp[i++] = digits[num & 0xf];
+               num = num >> 4;
        }
        if (i > precision)
                precision = i;
        size -= precision;
-       puts("number: checkpoint 5");
        if (!(type&(ZEROPAD+LEFT)))
                while(size-->0)
                        tx_byte(' '), count++;
@@ -1938,7 +1938,6 @@ static int number(void (*tx_byte)(unsigned char byte),
                tx_byte(tmp[i]), count++;
        while (size-- > 0)
                tx_byte(' '), count++;
-       puts("number: returning");
        return count;
 }
 
@@ -1990,7 +1989,6 @@ repeat:
                        }
                }
 
-               puts("vtxprintf: checkpoint 1\n");
                /* get the precision */
                precision = -1;
                if (*fmt == '.') {
@@ -2020,7 +2018,6 @@ repeat:
                /* default base */
                base = 10;
 
-               puts("vtxprintf: checkpoint 2\n");
                switch (*fmt) {
                case 'c':
                        if (!(flags & LEFT))
@@ -2070,7 +2067,6 @@ repeat:
                        }
                        continue;
 
-               puts("vtxprintf: checkpoint 3\n");
                case '%':
                        tx_byte('%'), count++;
                        continue;
@@ -2100,7 +2096,6 @@ repeat:
                                --fmt;
                        continue;
                }
-               puts("vtxprintf: checkpoint 4\n");
                if (qualifier == 'L') {
                        num = va_arg(args, unsigned long long);
                } else if (qualifier == 'l') {
@@ -2116,9 +2111,7 @@ repeat:
                } else {
                        num = va_arg(args, unsigned int);
                }
-               puts("vtxprintf: checkpoint 5\n");
                count += number(tx_byte, num, base, field_width, precision, 
flags);
-               puts("vtxprintf: checkpoint 6\n");
        }
        return count;
 }
@@ -2138,18 +2131,14 @@ int do_printk(int msg_level, const char *fmt, ...)
 void bootblock_mainboard_init(void);
 void bootblock_mainboard_init(void)
 {
-//     uint32_t test = 0xdeadbeef;
        /* FIXME: we should not need UART in bootblock, this is only
           done for testing purposes */
        i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
        power_init();
        clock_init();
        do_serial();
-       puts("checkpoint 1");
-       printk(BIOS_INFO, "%x\n", test);
-       /* FIXME: printk doens't work with numbers due to division issues... */
-//     printk(BIOS_INFO, "%d\n", 0xdeadbeef);
-       puts("checkpoint 2");
+//     printk(BIOS_INFO, "num: %x\n", 0xdeadbeef);
+//     printk(BIOS_INFO, "pointer: %p\n", (void *)0xdeadbeef);
 
        /* Copy romstage data from SPI ROM to SRAM */
        /* FIXME: test with something benign, then fix the offsets once

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to