[U-Boot] [PATCH v1 1/3] blackfin: Enable early print via the generic serial API.
Sonic Zhang
sonic.adi at gmail.com
Mon May 13 08:01:29 CEST 2013
Hi Mike,
On Mon, May 13, 2013 at 12:42 PM, Mike Frysinger <vapier at gentoo.org> wrote:
> On Monday 13 May 2013 00:20:15 Sonic Zhang wrote:
>> Remove blackfin specific implementation of the generic serial API when
>> early print macro is defined.
>>
>> In BFIN_BOOT_BYPASS mode, don't call generic serial_puts, because
>> early print in bypass mode is running before code binary is relocated
>> to the link address.
>
> the link address of the function doesn't matter. all Blackfin func calls are
> pcrel based, not absolute address calls. i specifically crafted all of this
> early serial code so that this does work regardless of the address where the
> code happens to be executing.
>
When you developed the bfin serial driver, the generic serial API
serial_puts() is implemented in bfin serial driver directly. No such
link address issue.
void serial_putc(const char c)
{
uart_putc(UART_BASE, c);
}
void serial_puts(const char *s)
{
while (*s)
serial_putc(*s++);
}
While in latest generic serial.c, serial_puts() calls uart_puts()
function in bfin serial via a pointer to the default serial_device
structure, which contains the link address in DRAM, other than a
relative jump.
void serial_puts(const char *s)
{
get_current()->puts(s);
}
This has nothing to do with the patch " blackfin: Correct early serial
mess output in BYPASS boot mode.".
07f572c8 <_get_current>:
7f572c8: 67 01 [--SP] = RETS;
7f572ca: 58 a0 R0 = [P3 + 0x4];
7f572cc: a6 6f SP += -0xc; /* (-12) */
7f572ce: 00 48 CC = !BITTST (R0, 0x0); /* bit 0 */
7f572d0: 08 18 IF CC JUMP 0x7f572e0 <_get_current+0x18>;
7f572d2: 4a e1 f8 07 P2.H = 0x7f8; /* (2040)
P2=0x7f8e77c <_serial_devices> */
7f572d6: 0a e1 80 e7 P2.L = 0xe780; /* (-6272)
P2=0x7f8e780 <_serial_current> */
7f572da: 10 91 R0 = [P2];
7f572dc: 00 0c CC = R0 == 0x0;
7f572de: 0b 14 IF !CC JUMP 0x7f572f4 <_get_current+0x2c> (BP);
> 7f572e0: 00 e3 02 02 CALL 0x7f576e4 <_default_serial_console>;
> 7f572e4: 00 0c CC = R0 == 0x0;
7f572e6: 07 14 IF !CC JUMP 0x7f572f4 <_get_current+0x2c> (BP);
7f572e8: 40 e1 f7 07 R0.H = 0x7f7; /* (2039)
R0=0x7f7e764(133687140) */
7f572ec: 00 e1 cc 03 R0.L = 0x3cc; /* (972)
R0=0x7f703cc(133628876) */
7f572f0: 00 e3 8e 3e CALL 0x7f5f00c <_panic>;
7f572f4: 66 6c SP += 0xc; /* ( 12) */
7f572f6: 27 01 RETS = [SP++];
7f572f8: 10 00 RTS;
...
07f572fc <_serial_puts>:
7f572fc: 78 05 [--SP] = (R7:7);
7f572fe: 67 01 [--SP] = RETS;
7f57300: 38 30 R7 = R0;
7f57302: a6 6f SP += -0xc; /* (-12) */
7f57304: ff e3 e2 ff CALL 0x7f572c8 <_get_current>;
> 7f57308: 10 32 P2 = R0;
7f5730a: 66 6c SP += 0xc; /* ( 12) */
7f5730c: 27 01 RETS = [SP++];
7f5730e: 07 30 R0 = R7;
7f57310: 38 05 (R7:7) = [SP++];
7f57312: 92 ae P2 = [P2 + 0x28];
> 7f57314: 52 00 JUMP (P2);
Regards,
Sonic
> what doesn't work is if you try to use the early serial console with
> CONFIG_SYS_BFIN_UART (which allows all the serial devices to be selected on
> the fly). but the header file specifically handles that:
> #ifndef CONFIG_DEBUG_EARLY_SERIAL
> # define CONFIG_SYS_BFIN_UART
> #endif
>
> i guess the problem is that this commit is wrong:
>
> commit 820edc18b5aefa8c82d420f6cba3e13b5631f9b8
> Author: Sonic Zhang <sonic.zhang at analog.com>
> Date: Fri Nov 30 17:39:32 2012 +0800
>
> blackfin: Correct early serial mess output in BYPASS boot mode.
>
> it shouldn't be messing with the addresses there
> -mike
More information about the U-Boot
mailing list