U-Boot upstreaming

Cédric Le Goater clg at kaod.org
Mon Nov 7 16:13:23 AEDT 2016


On 11/04/2016 06:46 PM, Maxim Sloyko wrote:
> 
> 
> On Fri, Nov 4, 2016 at 8:54 AM, Cédric Le Goater <clg at kaod.org <mailto:clg at kaod.org>> wrote:
> 
>     Hello !
> 
>     On 11/03/2016 09:44 PM, Maxim Sloyko wrote:
>     > Hi Cedric,
>     >
>     > My manager (Rick Alther) mentioned that you were working on some
>     > minimal "upstreamable" commit for Aspeed in U-Boot. How far were
>     > you able to get?
> 
>     Please check :
> 
>       https://github.com/openbmc/u-boot/wiki <https://github.com/openbmc/u-boot/wiki>
> 
>     This is where we track the ugly details and here is my tree :
> 
>        https://github.com/legoater/u-boot/commits/v2016.11-aspeed-openbmc <https://github.com/legoater/u-boot/commits/v2016.11-aspeed-openbmc>
> 
>     Patch one is the "minimum" we have been working on with Joel these
>     last 6 months to :
> 
>      * make it compatible with upstream
>      * extract all exoticisms
>      * extract funky drivers
>      * isolate ugly hacks
> 
>     I think we are at a point where we need to rewrite bits of lowlevel_init
>     or move them later on in the code. This big asm routines does :
> 
>      * LPC patching for ast2300 (we can kill that)
>      * uart init (if SDRAM calibration is done, easy we can keep)
>      * SDRAM calibration (we could use static calibration values instead)
>      * SDRAM size calculation (may be we can move that in a C part)
>      * video clock setting (one reg setting)
>      * JTAG master (one reg setting)
>      * RMII/RGMII clock setting (one reg setting)
>      * GPIO massive reset (not sure if this is useful, should ask Andrew)
>      * SPI Calibration (I have done in C so we can move)
> 
> 
> Yes, I looked at it too and it does not look like any of that has any 
> business being in lowlevel_init, let alone being implemented in asm.

I agree that the biggest part goes to dram_init and the rest can be 
moved in different areas.

> Did you try moving this whole function further down the init sequence? 

I don't think there are any early inits needed in this file.

I have moved all the relevant code to C routines. lowlevel_init 
is now empty, resets, inits are done in C, console is OK. For DRAM 
calibration, which is the hairy part, I tried to use pre-calculated 
values from an another system but the sequence is not good enough 
and so the DRAM controller has issues.

Here is my dev v2016.11-rc3 branch for you to see :

	https://github.com/legoater/u-boot/commits/v2016.11-aspeed-openbmc-sdmc

and the DRAM part :

	https://github.com/legoater/u-boot/commit/b3fb9523e1f37a7057d5b3bee3122ef7a78dafb4

beware, it can brick your system. Mine has died a couple of time 
when accessing RAM. But it is a good base to start rewriting the 
DRAM calibration.

Cheers,

C. 

> board_early_init_f might be a good candidate. It might cause problems 
> because it does not restore registers properly, but should be an easy fix --
> at this point we would already have stack setup for us (need to be configured 
> via CONFIG_SYS_INIT_SP_ADDR to point to the top of SRAM) and even have a
>  basic malloc (need to be configured). This would make calling into C 
> somewhat easier. 
>  
> 
> 
>     > This is also what I was thinking of doing, so we should be able to join forces on this.
>     >
>     > I talked to Simon Glass recently (he's an active contributor to mainline U-Boot)
>     > and basically that's the path that he also recommended -- just getting minimal amount
>     > of code in, that can just boot to a prompt. He also said that DRAM driver would have
>     > to be part of it.
> 
>     yes. See my comments above.
> 
>     > So, the way I see it, there are two big chunks of work here:
>     >  1. Setting up the whole structure. This would include actually adding a board, minimum
>     > amount of supporting code, debug serial console init,
> 
>     yes. that is patch one above, in which we still need to cleanup
>     stuff in the .S part.
> 
>     >  2. DDR3/DDR4 driver. This is the biggest part of what we have in platform.S now. A lot
>     > of work, but relatively straightforward, just rewrite ~1.5k lines of assembly in C.
> 
>     I am not sure this is feasible, AFAIK, you can not call C. I might
>     be wrong.
> 
> 
> You can. I tried it and it works. We just need stack (see above). Even if moving the whole lowlevel_init further down will prove too hard, we can at least call
> 
> mov sp, =TOP_OF_SRAM
> 
> at top of lowlevel_init. after this you can write (and call into) pretty complicated C functions. This is what I've tried in my early experiments.
>  
> 
> 
>     > Personally, I don't have preference on who does what, as long as we don't step on each
>     > other's toes. It would probably be easier for me to take (1), because I can easily talk
>     > to two people who are in our time zone and have a lot of mainline U-Boot experience.
>     >
>     > Thoughts?
> 
>     you could send patches on top of my tree to cleanup what ever
>     part you want in lowlevel_init. when lowlevel_init reaches a
>     minimum acceptable level, with a full patchset working on top
>     of it, I think we can send for review. Then, we will work on
>     the next details :
> 
>      * extra settings
>      * spi/nor driver
>      * ftgmac100 extensions for Aspeed
>      * NCSI support
>      * DTS support
>      * etc.
> 
>     There is also a massive hack on the ast2500 mmu disablement in
>     the core part of u-boot that I don't understand. So we could
>     try to fix now or ask help when the patchset is sent.
> 
> 
>     Cheers,
> 
>     C.
> 
> 
> 
> 
> -- 
> *M*axim *S*loyko



More information about the openbmc mailing list