[U-Boot] [PATCH] Add 'sf update' command to do smart SPI flash update

Simon Glass sjg at chromium.org
Fri Aug 19 21:12:40 CEST 2011


On Fri, Aug 19, 2011 at 12:57 PM, Mike Frysinger <vapier at gentoo.org> wrote:
> On Friday, August 19, 2011 14:25:46 Simon Glass wrote:
>> On Fri, Aug 19, 2011 at 12:19 PM, Mike Frysinger wrote:
>> > On Friday, August 19, 2011 14:07:16 Simon Glass wrote:
>> >> On Fri, Aug 19, 2011 at 9:14 AM, Mike Frysinger wrote:
>> >> > On Friday, August 19, 2011 09:47:04 Simon Glass wrote:
>> >> >> +static int spi_flash_update(struct spi_flash *flash, u32 offset,
>> >> >> +             size_t len, const char *buf)
>> >> >> +{
>> >> >> +     const char *oper;
>> >> >
>> >> > i wonder if there'd be any code size difference if we had:
>> >> >        static const char * const opers[] = {
>> >> >                "malloc",
>> >> >                "read",
>> >> >                ...
>> >> >        };
>> >> >        const char *oper;
>> >> >        ...
>> >> >                oper = 0;
>> >> >        ...
>> >> >                ++oper;
>> >> >        ...
>> >> >                ++oper;
>> >> >        ...
>> >> >        printf("...%s...", ..., opers[oper]);
>> >> >
>> >> > i hope it'd be slightly smaller as you would be loading up a small int
>> >> > in the for loop and not an entire pointer ...
>> >>
>> >> It's exactly the same code/data size on ARM, but perhaps smaller on a
>> >> different architecture. I like that approach anyway so will change it.
>> >
>> > i know on Blackfin at least, doing something like:
>> >        i = 0;
>> > will expand into a 16bit insn:
>> >        R0 = 0;
>> > and the follow up:
>> >        ++i;
>> > will be another 16bit insn:
>> >        R0 += 1;
>> >
>> > while something like:
>> >        void *foo = "foo";
>> > will expand into two 32bit insns:
>> >        P0.L = _some_label_for_string;
>> >        P0.H = _some_label_for_string;
>> > and since there will be no known relationship between the diff strings at
>> > the C -> asm stage (since string placement is done by the linker), each
>> > string load will be a sep pointer load.
>> >
>> > i imagine that the normal ARM insn set sucks at this kind of code
>> > density, but i'd think their reworks (like thumb and friends) would be
>> > much better.
>>
>> Well it's just a literal pool access on ARM, so a single instruction
>> on both ARM and Thumb. Not sure how else the compiler would do it...
>
> i'm not as well versed in ARM lingo as you to understand what "literal pool
> access" means ...
> -mike
>
Hi Mike,

:-) It's just a pool of literals, basically in this case a list of
string pointers, placed close to the PC address so that you can easily
access them with a PC-relative load. It's not an ARM think though -
lots of CPUs use them. The alternative is to encode the full address
in the instruction, so I suppose it's this:

ldr r0, fred    (which turns into ldr r0, [pc, #offset of fred])

fred:
   DCD 0x12345678


instead of:

mov r0, #0x12345678

Regards,
Simon


More information about the U-Boot mailing list