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: Siarhei Siamashka <siarhei.siamashka@gmail.com>
This commit is contained in:
parent
9e7f3a3a93
commit
b4d32f0711
Binary file not shown.
21
fel-sdboot.c
21
fel-sdboot.c
@ -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)();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user