I am seeing an issue where some of our iMX6D boards are failing to boot from a Power-on-Reset (POR). The failure rate for affected boards is between 3% and 10% of the POR.
The system is booting from eMMC and I changed U-Boot to use the Boot Rom Plug-in IVT which allows writing to the UART from the plug-in entry (plugin_start):
plugin_start:
push {r0-r4, lr}
/* UART Output */
// enable clock
ldr r0, =0x020c407c
ldr r1, =0xffffffff
str r1, [r0, #0]
// Setup PAD and MUX
ldr r0, =0x020e0000
ldr r1, =0x0001b0b1
str r1, [r0, #0x650]
str r1, [r0, #0x654]
ldr r1, =0x00000003
str r1, [r0, #0x280]
str r1, [r0, #0x284]
// Setup UART
ldr r0, =0x02020000
ldr r1, =0x00000000
str r1, [r0, #0x80]
str r1, [r0, #0x84]
ldr r1, =0x00004025
str r1, [r0, #0x84]
ldr r1, =0x00000004
str r1, [r0, #0x88]
ldr r1, =0x00008000
str r1, [r0, #0x8c]
ldr r1, =0x00000a00
str r1, [r0, #0x90]
ldr r1, =0x0000000f
str r1, [r0, #0xa4]
ldr r1, =0x00004025
str r1, [r0, #0x84]
ldr r1, =0x0000015b
str r1, [r0, #0xa8]
ldr r1, =0x00000001
str r1, [r0, #0x80]
// Send ROM->UBOOT
ldr r1, ='R'
str r1, [r0, #0x40]
ldr r1, ='O'
str r1, [r0, #0x40]
ldr r1, ='M'
str r1, [r0, #0x40]
ldr r1, ='-'
str r1, [r0, #0x40]
ldr r1, ='>'
str r1, [r0, #0x40]
ldr r1, ='P'
str r1, [r0, #0x40]
ldr r1, ='L'
str r1, [r0, #0x40]
ldr r1, ='U'
str r1, [r0, #0x40]
ldr r1, ='G'
str r1, [r0, #0x40]
ldr r1, ='I'
str r1, [r0, #0x40]
ldr r1, ='N'
str r1, [r0, #0x40]
ldr r1, ='\r'
str r1, [r0, #0x40]
ldr r1, ='\n'
str r1, [r0, #0x40]
// Setup DDR and clocks
imx6_ddr_setting
imx6_clock_gating
imx6_qos_setting
I do not see this output when the system fails, so it appears that the iMX6 either didn't boot or was unable to fetch data from the eMMC and never transfers control to the U-Boot plugin.
When the failure occurs, there is no USB serial loader on the USB port. Power rails are all good and the 32.768 kHz and 24 MHz clocks are running.
I didn't find any known errata that matches this issue and I don't have access to the memory bus to check the eMMC.