| /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ |
| /* |
| * Copyright (c) 2018 Microsemi Corporation |
| */ |
| |
| #include <asm/asm.h> |
| #include <asm/regdef.h> |
| |
| .set noreorder |
| .extern vcoreiii_tlb_init |
| .extern vcoreiii_ddr_init |
| #ifdef CONFIG_SOC_LUTON |
| .extern pll_init |
| #endif |
| |
| LEAF(lowlevel_init) |
| /* |
| * As we have no stack yet, we can assume the restricted |
| * luxury of the sX-registers without saving them |
| */ |
| |
| /* Modify ra/s0 such we return to physical NOR location */ |
| li t0, 0x0fffffff |
| li t1, CONFIG_TEXT_BASE |
| and s0, ra, t0 |
| add s0, s0, t1 |
| |
| jal vcoreiii_tlb_init |
| nop |
| |
| #ifdef CONFIG_SOC_LUTON |
| jal pll_init |
| nop |
| #endif |
| |
| /* Initialize DDR controller to enable stack/gd/heap */ |
| 0: |
| jal vcoreiii_ddr_init |
| nop |
| bnez v0, 0b /* Retry on error */ |
| nop |
| |
| jr s0 |
| nop |
| END(lowlevel_init) |