
On 2017-09-08 16:41, Eric Nelson wrote:
Hi Stefan,
On 09/08/2017 04:35 PM, Stefan Agner wrote:
From: Stefan Agner stefan.agner@toradex.com
The current mechanism using SCR/GPR registers work well when the serial downloader boot mode has been selected explicitly (either via boot mode pins or using bmode command). However, in case the system entered boot ROM due to unbootable primary boot devices (e.g. empty eMMC), the SPL fails to detect that it has been downloaded through serial loader and tries to continue booting from eMMC: Trying to boot from MMC1 mmc_load_image_raw_sector: mmc block read error SPL: failed to boot from all boot devices ### ERROR ### Please RESET the board ###
The only known way to reliably detect USB serial downloader is by checking the USB PHY receiver block power state...
Signed-off-by: Stefan Agner stefan.agner@toradex.com Acked-by: Marcel Ziswiler marcel.ziswiler@toradex.com Tested-by: Fabio Estevam fabio.estevam@nxp.com
Changes in v2:
Add comment that we infer boot ROM behavior from USB PHY state
arch/arm/mach-imx/spl.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/arch/arm/mach-imx/spl.c b/arch/arm/mach-imx/spl.c index 258578ac25..f3fec81de7 100644 --- a/arch/arm/mach-imx/spl.c +++ b/arch/arm/mach-imx/spl.c @@ -31,6 +31,18 @@ u32 spl_boot_device(void) if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */ return BOOT_DEVICE_BOARD;
- /*
* The above method does not detect that the boot ROM used
* serial downloader in case the boot ROM descided to use the
* serial downloader as a fall back (primary boot source failed).
*
Nit: should be "did not initialize" instead of "initialized".
Sorry, don't get that. Below I write "did not (yet) initialized"...
-- Stefan
Otherwise, this is a nice comment that describes the situation.
* Infer that the boot ROM used the USB serial downloader by
* checking whether the USB PHY is currently active... This
* assumes that SPL did not (yet) initialized the USB PHY...
*/
- if (is_usbphy_active())
return BOOT_DEVICE_BOARD;
- /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */ switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) { /* EIM: See 8.5.1, Table 8-9 */