[U-Boot] [RFC PATCH 0/3] ARM: imx: mx6: Add plugin support for SPL

Tim Harvey tharvey at gateworks.com
Wed Jan 18 19:49:52 CET 2017


On Wed, Jan 18, 2017 at 9:05 AM, Eric Nelson <eric at nelint.com> wrote:
> Hi Tim,
>
> On 01/17/2017 06:27 PM, Tim Harvey wrote:
>> On Tue, Nov 1, 2016 at 7:06 PM, Eric Nelson <eric at nelint.com> wrote:
>>> I forgot to mention in the cover letter for the previous patch set
>>> that because the mx6memcal board has no implementation of storage
>>> (it only supports a serial console and DDR), I haven't tested the
>>> resulting U-Boot, which has very little besides "mtest" included.
>>>
>>> I'm hoping to use this code base (mx6memcal) as a straw man for
>>> loading both SPL (as a plugin) and U-Boot through the serial download
>>> path as we've previously discussed in at least [1], [2] and [3].
>>>
>>> Now that Peng's patch to imximage has been applied, we can start
>>> to look at the implementation details, and I hope this patch set
>>> can help move us toward an implementation.
>>>
>>> The gist of what's needed to allow SPL to be loaded as a plugin
>>> and avoid the need for removable storage or a full (non-SPL)
>>> U-Boot is shown in patch 2.
>>>
>>> That is, we need something akin to setjmp/longjmp to:
>>> 1. to save the early state of the machine before SPL configures
>>>    the DDR controller, and
>>> 2. a routine that we can call to return to the boot ROM
>>>
>>> To address #1, there's a clear precedent in the support for a
>>> save_boot_params() routine and patch 2 adds one that simply
>>> saves the working register set. Examining the registers used
>>> by the ROM code shows that r0-r9 plus sp and lr are sufficient.
>>>
>>> Experimentally, I've found that the boot ROM stack is initialized
>>> to 0x91ffb4 and that the stack pointer is at 0x91febc (248 bytes)
>>> on all of the machines I've tested against (MX6Q, MX6DL, MX6S and
>>> MX6SL), so we can save the stack just by moving the SPL stack
>>> (patch #1).
>>>
>>> We'll also need to determine where the decision to return to the
>>> boot ROM occurs (i.e. when we call routine #2).
>>>
>>> The obvious place for use during development is right after
>>> DDR initialization if loaded through the serial downloader,
>>> but it might also be useful to invoke the serial loader as
>>> a last resort instead of the current call to hang().
>>>
>>> Patch 3 adds a config file which will allow a build of
>>> u-boot.imx with SPL as a plugin followed by u-boot.bin as
>>> the primary payload. It highlights the issue of only having
>>> a single IMX_CONFIG variable so it breaks the build of a
>>> stand-alone SPL. Rather, it doesn't break the build, but
>>> produces SPL that is effectively the same as u-boot.imx.
>>>
>>> This leaves only the question of what the return_to_rom code
>>> should look like, and I'm a bit stumped. The ROM API isn't
>>> documented in any document I have.
>>>
>>> In Troy's original patch ([4]), he calls a routine that he
>>> names HAB_RVT_LOAD_DATA. On i.MX Community ([5]), I found
>>> a reference to a plugin_download() routine and I'm not
>>> sure where that came from. The Community post suggests
>>> that it's used in EBOOT.
>>>
>>> I tried a simplistic copy of the tail end of plugin start
>>> from [6] that calls pu_irom_hwcnfg_setup() and then returns
>>> to ROM without success. I'm not certain that this was the
>>> right approach and am hoping for some guidance.
>>>
>>> References:
>>> [1] - http://lists.denx.de/pipermail/u-boot/2015-June/thread.html#215606
>>> [2] - http://lists.denx.de/pipermail/u-boot/2016-September/thread.html#266303
>>> [3] - http://lists.denx.de/pipermail/u-boot/2015-May/thread.html#215573
>>> [4] - http://patchwork.ozlabs.org/patch/186054/
>>> [5] - http://community.nxp.com/thread/303794
>>> [6] - http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/include/asm/arch-mx6/mx6_plugin.S
>>>
>>> Eric Nelson (3):
>>>   ARM: mx6: preserve Boot ROM stack in SPL
>>>   ARM: mx6: ddr: add plugin-utils placeholder
>>>   ARM: imx: mx6memcal: allow build of combined SPL+U-Boot
>>>
>>>  arch/arm/cpu/armv7/mx6/Makefile         |  2 +-
>>>  arch/arm/cpu/armv7/mx6/ddr.c            |  4 ++++
>>>  arch/arm/cpu/armv7/mx6/plugin-utils.S   | 24 ++++++++++++++++++++++++
>>>  arch/arm/imx-common/spl-plus-u-boot.cfg |  4 ++++
>>>  arch/arm/include/asm/arch-mx6/mx6-ddr.h | 19 +++++++++++++++++++
>>>  configs/mx6memcal_defconfig             |  2 +-
>>>  include/configs/imx6_spl.h              |  2 +-
>>>  7 files changed, 54 insertions(+), 3 deletions(-)
>>>  create mode 100644 arch/arm/cpu/armv7/mx6/plugin-utils.S
>>>  create mode 100644 arch/arm/imx-common/spl-plus-u-boot.cfg
>>>
>>> --
>>> 2.7.4
>>>
>>
>> Hi Eric,
>>
>> I'm interested loading U-Boot from the OTG serial downloader and this
>> looks like a good approach. Thanks for continuing to plug away at
>> this!
>>
>
> NP. It seems like the easy route if we can figure out the details of
> the ROM API calls.
>
> I was hoping to get some feedback from Peng or Troy, but it seems
> that they're also overloaded.
>
>> If I understand correctly the approach here is to use the plugin
>> support such that the boot ROM will execute the SPL as a plugin which
>> then returns and jumps to U-boot?
>>
>
> That's the idea. Both SB_LOADER and imx_usb support this, so the
> key is figuring out how to return to the Boot ROM.
>
>> I've applied your mx6memcal series to master and support for one of
>> the Gateworks boards I'm working with and can boot that SPL (23KB)
>> fine (so I've got the UART and configured correctly at least). When I
>> adapt that to use spl-plus-u-boot.cfg on top of this patch series the
>> resulting SPL (85KB) image doens't appear to boot (nothing over the
>> serial console) but I'm thinking I'm doing something wrong as
>> imx_usb_loader seems like its not loading it fully or loading it too
>> quickly. Do I need patches to imx_usb_loader or am I doing something
>> obvious wrong here?
>>
>
> I need to re-visit this. My recollection is that the SPL portion should
> load and run, but the return-to-ROM portion will fail.

ok - I thought you had it fully working, but it does sound like you at
least got further than I'm getting (you saw the SPL boot at least) so
let me know what you find when you re-visit it.

>
> My next thought is to use JTAG to trace things through the return to
> BOOT ROM and use an image from the Freescale fork as a working
> example.
>
>> Incidentally, did anyone ever proof out the other discussed method
>> where an SPL is built with zmodem and allows loading u-boot.img over
>> that?
>>
> Yeah.
>
> Stefano had that working, though I had some issues getting
> microcom working. I had to stop and restart microcom and initiate
> the upload.

Stefano,

Did you document the 'IMX6 SPL to U-Boot over serial' setup anywhere,
or can you talk me through what you did?

Thanks,

Tim


More information about the U-Boot mailing list