Commit b4d32f07 authored by Siarhei Siamashka's avatar Siarhei Siamashka
Browse files

fel-sdboot.sunxi: Add support for A64 and A80

This small bootable stub, which just passes control to the
FEL code in the BROM, needs to be adjusted to also support
Allwinner A64 and Allwinner A80 because the BROM is located
at a different address there.

The SD card boot has a very low priority on Allwinner A64, but
it at least has a higher priority than the SPI NOR Flash:

    https://linux-sunxi.org/BROM#A64



So this patch may help to simplify the FEL mode activation on
devices, which are booting their firmware from the SPI NOR Flash.

Changes in v2:
 - Use SCTLR.V to detect the exception vectors location as
   suggested by Jens Kuske.
 - Add a padding of 32 NOP instructions in the beginning as
   a workaround for some strange failures.
Signed-off-by: default avatarSiarhei Siamashka <siarhei.siamashka@gmail.com>
parent 9e7f3a3a
No preview for this file type
......@@ -36,5 +36,24 @@ dd if=fel-boot.sunxi of=/dev/sdX bs=1024 seek=8
void _start(void)
{
((void (*)(void))0xffff0020)();
unsigned int sctlr;
/*
* FEL mode fails to activate in an unpredictable way without
* this NOP padding. Minor changes in the code, such as checking
* the PC register (PC >= 0x10000) instead of SCTLR.V or doing
* jump instead of call to the FEL handler in the BROM sometimes
* break on A64 and sometimes break on A10/A13/A20. Trying to
* add DSB & ISB instructions and/or invalidating caches and
* BTB do not seem to make any difference. Only adding a bunch
* of NOP instructions in the beginning helps.
*/
asm volatile(".rept 32 \n nop \n .endr");
asm volatile("mrc p15, 0, %0, c1, c0, 0" : "=r" (sctlr));
if (sctlr & (1 << 13)) /* SCTLR.V */
((void (*)(void))0xffff0020)();
else
((void (*)(void))0x00000020)();
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment