summaryrefslogtreecommitdiff
path: root/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S
diff options
context:
space:
mode:
Diffstat (limited to 'hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S')
-rw-r--r--hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S460
1 files changed, 460 insertions, 0 deletions
diff --git a/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S
new file mode 100644
index 00000000..b2cb2688
--- /dev/null
+++ b/hifi/xaf/hifi-dpf/ipc/xt-shmem/hikey/reset.S
@@ -0,0 +1,460 @@
+/*******************************************************************************
+* Copyright (C) 2018 Cadence Design Systems, Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to use this Software with Cadence processor cores only and
+* not with any other processors and platforms, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************************************************/
+/******************************************************************************
+ reset.S
+ reset vector for BALONGV7R1 architechure,Any problem pls refer
+ to the Xtensa Microprocessor Programmer's Guide.
+******************************************************************************/
+
+#include <xtensa/coreasm.h>
+#include <xtensa/simcall.h>
+#include "reset.h"
+
+ .begin literal_prefix .ResetVector
+ .section .ResetVector.text, "ax"
+ .global _ResetVector
+ .align 4
+
+_ResetVector:
+ j _Reset
+
+ .end literal_prefix
+
+ /*****************************************************************************
+ Reset
+ *****************************************************************************/
+ .begin literal_prefix .Reset
+ .section .Reset.text, "ax"
+ .global _Reset
+ .align 4
+
+_Reset:
+ /* clear all of interrupts*/
+ movi a0, 0
+ wsr a0, INTENABLE
+
+ wsr a0, IBREAKA_0
+ wsr a0, IBREAKA_1
+ wsr a0, DBREAKA_0
+ wsr a0, DBREAKA_1
+ wsr a0, DBREAKC_0
+ wsr a0, DBREAKC_1
+ wsr a0, IBREAKENABLE
+
+ /* ICOUNT,ICOUNTLEVEL,ICOUNTexception clear ICOUNT and ICOUNTLEVEL*/
+ wsr a0, ICOUNT
+ wsr a0, ICOUNTLEVEL
+ isync
+
+ /*debug disable XCHAL_DEBUGLEVEL*/
+ rsil a1, XCHAL_DEBUGLEVEL - 1
+
+// write windowbase and windowstart, then do rsync.
+// reload a0 with 0, because registers may have moved after
+// writing windowbase/windowstart.
+ wsr a0, CCOUNT
+ /* init register windows*/
+ wsr a0, WINDOWBASE
+ rsync
+ movi a1, 1
+ wsr a1, WINDOWSTART
+
+ ssai 0
+
+ /*Level-1 init EXCSAVE_1 level-1 interrupt*/
+ wsr a0, EXCSAVE_1
+ wsr a0, EPC_1
+ wsr a0, EXCCAUSE
+
+ /*Level-2 init EXCSAVE_1 level-2 interrupt*/
+ wsr a0, EPC_2
+ wsr a0, EPS_2
+ wsr a0, EXCSAVE_2
+
+ /*Level-3 init EXCSAVE_1 level-3 interrupt*/
+ wsr a0, EPC_3
+ wsr a0, EPS_3
+ wsr a0, EXCSAVE_3
+
+ /*Level-4 init EXCSAVE_1 level-4 interrupt*/
+ wsr a0, EPC_4
+ wsr a0, EPS_4
+ wsr a0, EXCSAVE_4
+
+ /*Level-5(DEBUG) init EXCSAVE_1 level-5 interrupt*/
+ wsr a0, EPC_5
+ wsr a0, EPS_5
+ wsr a0, EXCSAVE_5
+
+ /*NMI init EXCSAVE_1 level-6(NMI) interrupt */
+ wsr a0, EPC_6
+ wsr a0, EPS_6
+ wsr a0, EXCSAVE_6
+
+
+ /*0/1/2 init timer 0&1 */
+ wsr a0, CCOMPARE_0
+ wsr a0, CCOMPARE_1
+ //wsr a0, CCOMPARE_2 //hifi3 CCOMPARE_0 CCOMPARE_1
+
+ /* clear all of */
+ movi a2, XCHAL_INTTYPE_MASK_EXTERN_EDGE | XCHAL_INTTYPE_MASK_SOFTWARE
+ wsr a2, INTCLEAR
+
+ wsr a0, BR
+
+ /* disable coprocessor */
+ /*wsr a0, CPENABLE*/
+
+ movi a2, XCHAL_DEBUGLEVEL - 1
+ wsr a2, PS
+ rsync
+
+
+ /*icache init icache */
+#if (XCHAL_ICACHE_SIZE != 0)
+ #if (XCHAL_ICACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_ICACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_ICACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_ICACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+ /*icache unlock icache */
+ #if (XCHAL_ICACHE_LINESIZE == 128)
+ movi a3, 0
+ loop a2, .L0
+ iiu a3, 0
+ iiu a3, XCHAL_ICACHE_LINESIZE
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*2
+
+ iiu a3, 0
+ iiu a3, XCHAL_ICACHE_LINESIZE
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*2
+.L0:
+
+ #else
+ movi a3, 0
+ loop a2, .L0
+ iiu a3, 0
+ iiu a3, XCHAL_ICACHE_LINESIZE
+ iiu a3, XCHAL_ICACHE_LINESIZE*2
+ iiu a3, XCHAL_ICACHE_LINESIZE*3
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*4
+.L0:
+ #endif
+
+
+ #if (XCHAL_ICACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_ICACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_ICACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_ICACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+ /*icache disable icache */
+ movi a3, 0
+ loop a2, .L1
+ iii a3, 0
+ iii a3, XCHAL_ICACHE_LINESIZE
+ iii a3, XCHAL_ICACHE_LINESIZE*2
+ iii a3, XCHAL_ICACHE_LINESIZE*3
+ addi a3, a3, XCHAL_ICACHE_LINESIZE*4
+.L1:
+ isync
+#endif
+
+
+
+
+ /*dcache init dcache */
+#if (XCHAL_DCACHE_SIZE != 0)
+ #if (XCHAL_DCACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_DCACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_DCACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_DCACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+ /*dcache unlock dcache */
+ #if (XCHAL_DCACHE_LINESIZE == 128)
+ movi a3, 0
+ loop a2, .L2
+ diu a3, 0
+ diu a3, XCHAL_DCACHE_LINESIZE
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*2
+
+ diu a3, 0
+ diu a3, XCHAL_DCACHE_LINESIZE
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*2
+.L2:
+
+ #else
+ movi a3, 0
+ loop a2, .L2
+ diu a3, 0
+ diu a3, XCHAL_DCACHE_LINESIZE
+ diu a3, XCHAL_DCACHE_LINESIZE*2
+ diu a3, XCHAL_DCACHE_LINESIZE*3
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*4
+.L2:
+ #endif
+ #if (XCHAL_DCACHE_SIZE == 8192) //212GP and 330HiFi
+ movi a2, 64
+ #elif (XCHAL_DCACHE_SIZE == 16384) //232L and 570T
+ movi a2, 128
+ #elif (XCHAL_DCACHE_SIZE == 32768) //BALONGV7R1
+ movi a2, 256
+ #elif (XCHAL_DCACHE_SIZE == 65536) //CHICAGO HIFI
+ movi a2, 256
+ #endif
+
+
+ /*dcache disable dcache */
+ movi a3, 0
+ loop a2, .L3
+ dii a3, 0
+ dii a3, XCHAL_DCACHE_LINESIZE
+ dii a3, XCHAL_DCACHE_LINESIZE*2
+ dii a3, XCHAL_DCACHE_LINESIZE*3
+ addi a3, a3, XCHAL_DCACHE_LINESIZE*4
+.L3:
+ dsync
+#endif
+
+ /*
+ 0x00000000-0x1fffffff : caches off(bypass)
+ 0x20000000-0x3fffffff : caches off(bypass)
+ 0x40000000-0x5fffffff : caches off(bypass)
+ 0x60000000-0x7fffffff : caches off(bypass)
+ 0x80000000-0x9fffffff : caches off(bypass)
+ 0xa0000000-0xbfffffff : caches off(bypass)
+ 0xc0000000-0xdfffffff : caches on,0x00000000-0x1fffffff
+ 0xe0000000-0xffffffff : caches off(bypass),:0xe0000000~0xefffffff 0x20000000~0x2fffffff
+ */
+ /* config the memory access right */
+ movi a3, 0x00000000 /*0x00000000-0x1fffffff*/
+ set_access_mode PIF_BYPASS /*can not access*/
+
+ movi a3, 0x20000000 /*0x20000000-0x3fffffff*/
+ set_access_mode PIF_BYPASS
+
+ movi a3, 0x40000000 /*0x40000000-0x5fffffff*/
+#if (XCHAL_DCACHE_LINESIZE == 128)
+ set_access_mode PIF_BYPASS
+#else
+ set_access_mode PIF_BYPASS
+#endif
+
+ movi a3, 0x60000000 /*0x60000000-0x7fffffff*/
+ set_access_mode PIF_BYPASS
+
+ movi a3, 0x80000000 /*0x80000000-0x9fffffff*/
+ #if (XCHAL_DCACHE_LINESIZE == 128)
+ set_access_mode PIF_BYPASS
+ #else
+ set_access_mode PIF_BYPASS
+ #endif
+
+ movi a3, 0xa0000000 /*0xa0000000-0xbfffffff*/
+ set_access_mode PIF_BYPASS
+
+ movi a3, 0xc0000000 /*0xc0000000-0xdfffffff*/
+ set_access_mode PIF_CACHED_WBA /*PIF_CACHED*/
+
+ movi a3, 0xe0000000 /*0xe0000000-0xffffffff*/
+ set_access_mode PIF_BYPASS
+
+ /* 0x40000000 0xe0000000, 0x50000000 0xf0000000,*/
+ /*movi a2, 0x40000000 //vpn
+ movi a3, 0xe0000000 //ppn
+ movi a5, 0xE0000000 // tlb mask, upper 3 bits
+ and a4, a3, a5 // upper 3 bits of PPN area
+ and a7, a2, a5 // upper 3 bits of VPN area
+
+ ritlb1 a5, a7 // get current PPN+AM of segment for I
+ rdtlb1 a6, a7 // get current PPN+AM of segment for D
+ extui a5, a5, 0, 4 // keep only AM for I
+ extui a6, a6, 0, 4 // keep only AM for D
+ add a2, a4, a5 // combine new PPN with orig AM for I
+ add a3, a4, a6 // combine new PPN with orig AM for D
+ witlb a2, a7 // write new tlb mapping for I
+ wdtlb a3, a7 // write new tlb mapping for D
+ */
+ isync
+ dsync
+
+ /*
+ prepare the environment of run C code
+ */
+ movi sp, __stack
+
+ movi a2, PS_WOE_MASK | PS_PROGSTACK_MASK
+ wsr a2, PS
+ rsync
+
+ movi a8, _bss_start
+ movi a10, _bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone:
+
+ movi a8, _ulpp_bss_start
+ movi a10, _ulpp_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone1
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone1:
+
+#ifdef HIFI_DTS_V3
+ movi a8, _dtsv3_bss_start
+ movi a10, _dtsv3_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone2
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone2:
+#endif
+
+#ifdef HIFI_DTS_V4
+ movi a8, _dtsv4_bss_start
+ movi a10, _dtsv4_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone3
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone3:
+#endif
+
+#ifdef HIFI_VLP
+ movi a8, _efr_fr_hr_vlpd_bss_start
+ movi a10, _efr_fr_hr_vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone4
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone4:
+
+ movi a8, _amr_vlpd_bss_start
+ movi a10, _amr_vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone5
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone5:
+
+ movi a8, _vlpd_bss_start
+ movi a10, _vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone6
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone6:
+
+ movi a8, _amrwb_vlpd_bss_start
+ movi a10, _amrwb_vlpd_bss_end
+ sub a11, a10, a8
+ srli a11, a11, 2
+
+ movi a9, 0
+ loopnez a11, zerodone7
+ s32i a9, a8, 0
+ addi a8, a8, 4
+zerodone7:
+#endif
+
+callmain:
+
+// Do NOT modify a1 here, it is the stack pointer.
+// Use another register instead (a3?)
+// Not sure why the NOPs are present.
+#movi a1, 0xdeadbeef
+ movi a1, 0xe8073000
+ movi a2, 0xe8075e10 /*HIFI_RESERVE1_LOCATION*/
+ s32i a1, a2, 0
+
+ movi a0, 0
+ movi a6, 0 /* clear argc*/
+ movi a7, 0 /* clear argv*/
+ movi a8, 0 /* clear envp*/
+ movi a4, main
+ nop
+ nop
+ callx4 a4
+
+reset_exit:
+ movi a2, SYS_exit
+// Where does it go from here ? execution will fall through into
+// whatever happens to follow. Either halt here or jump to some
+// specific code.
+
+ .end literal_prefix
+
+#ifdef VOS_VENUS_TEST_STUB
+ .text
+ .global sim_call
+ .type sim_call,@function
+ .align 4
+sim_call:
+ entry sp, 64
+ addi a4, a3,-3
+ movi a3, g_auwVosTestMessageBuf
+ movi a2, SYS_log_msg
+ simcall
+ retw
+
+#endif
+
+