[U-Boot] [PATCH] ftsmc020: enhance for features and asm support.

Wolfgang Denk wd at denx.de
Thu Mar 31 11:02:21 CEST 2011


Dear Macpaul Lin,

Please keep the mailing list on Cc: (re-added)

In message <AANLkTinYJhoGrA7ZAVUQxwByrkWNqomCBFWiJG_+3+0e at mail.gmail.com> you wrote:
> 
> > I repeat again: I consider this manual unrolling of the nested structs
> > a Bad Thing.  You should have separate offsets for each of the nested
> > structs.
> 
> The above code is really a rework for a nested structs.
> The origin code looks like,
>  Moreover, the structure of ftsmc020 was nested like
>  struct ftsmc020 {
>          struct {
>                  unsigned int    cr;     /* 0x00, 0x08, 0x10, 0x18 */
>                  unsigned int    tpr;    /* 0x04, 0x0c, 0x14, 0x1c */
>          } bank[4];
>          unsigned int    pad[8]; /* 0x20 - 0x3c */
>          unsigned int    ssr;    /* 0x40 */
>  }
> 
> After rewrote it becomes
>  struct ftsmc020 {
>          unsigned int bank0_cr;
>          unsigned int bank0_tpr;
>          unsigned int bank1_cr;
>          unsigned int bank1_tpr;
>          unsigned int bank2_cr;
>          unsigned int bank2_tpr;
>          unsigned int bank3_cr;
>          unsigned int bank3_tpr;
>          unsigned int pad[8];
>          unsigned int ssr;
>  }
> 
> Did I misunderstand what you exactly meant?

Yes, indeed. Unnesting means to move the inner struct declaration
outside, like that:

struct ftsmc020_bank {
	unsigned int    cr;
	unsigned int    tpr;
};

struct ftsmc020 {
	struct ftsmc020_bank bank[4];
	unsigned int    pad[8];
	unsigned int    ssr;
};

> > Again: if you need larger numbers of such entries you are doing
> > something fundamentally wrong.  Reconsider your coding style.  What
> > exactly enforces you to use assembly?

> This is because writing assembly code (lowlevel_init) is really a
> necessity for setting the timing
> and power outpur correctly to these registers (SMC, SDMC, PMU).

What exactly prevents you from writing the very same code in C?

> It is required to give a correct setting to PMU and SMC to make the
> onboard DRAM works correctly
> before the code is loaded from ROM to DRAM and then set up stack for C
> environemnt.

We take care to provide global data and an initial stack very, very
early in the initialization sequence.  You canuse C code long before
you can access the system RAM.

> Hence assembly code to setting SMC and PMU in lowlevel_init is a necessity

I seriously doubt that.  Just because many boards are writen that way
does not mean that's how it must be done - actualy many just copied
existing bad examples without thinking.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
The man on tops walks a lonely street;  the  "chain"  of  command  is
often a noose.


More information about the U-Boot mailing list