Index: arch/arm/cpu/arm_cortexa9/tegra2/warmboot_avp.S |
diff --git a/arch/arm/cpu/arm_cortexa9/tegra2/warmboot_avp.S b/arch/arm/cpu/arm_cortexa9/tegra2/warmboot_avp.S |
new file mode 100755 |
index 0000000000000000000000000000000000000000..32723021e1b9e76f84c013fe411ccabb7d400aba |
--- /dev/null |
+++ b/arch/arm/cpu/arm_cortexa9/tegra2/warmboot_avp.S |
@@ -0,0 +1,425 @@ |
+/* |
+ * (C) Copyright 2010 |
+ * NVIDIA Corporation <www.nvidia.com> |
+ * |
+ * See file CREDITS for list of people who contributed to this |
+ * project. |
+ * |
+ * This program is free software; you can redistribute it and/or |
+ * modify it under the terms of the GNU General Public License as |
+ * published by the Free Software Foundation; either version 2 of |
+ * the License, or (at your option) any later version. |
+ * |
+ * This program is distributed in the hope that it will be useful, |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ * GNU General Public License for more details. |
+ * |
+ * You should have received a copy of the GNU General Public License |
+ * along with this program; if not, write to the Free Software |
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
+ * MA 02111-1307 USA |
+ */ |
+ |
+#include "asm/arch/nvbl_arm_cpsr.h" |
+#include "asm/arch/nvbl_memmap_nvap.h" |
+#include "asm/arch/tegra2.h" |
+#include "asm/arch/nv_drf_asm.h" |
+ |
+/* ----------------------------------- |
+ * Compile-time code options |
+ * ----------------------------------- |
+ */ |
+ |
+/* CPU Clock Source -- DO NOT CHOOSE PLL-X */ |
+#define CPU_CLOCK_SOURCE CLK_RST_CONTROLLER_CCLK_BURST_POLICY_0_CWAKEUP_IDLE_SOURCE_PLLP_OUT0 |
+ |
+/* Scratch map */ |
+#define APBDEV_PMC_SCRATCH_FOR_LP_EXIT_TIME_0 APBDEV_PMC_SCRATCH1_0 |
+ |
+/*Misc warmboot parameters */ |
+#define AP20_WB0_RUN_ADDRESS 0x40020000 |
+ |
+/*Apertures bases */ |
+#define CSITE_PA_BASE 0x70040000 /* Base address for arcsite.h registers */ |
+#define CLK_RST_PA_BASE 0x60006000 /* Base address for arclk_rst.h registers */ |
+#define EVP_PA_BASE 0x6000F000 /* Base address for arevp.h registers */ |
+#define FLOW_PA_BASE 0x60007000 /* Base address for arflow_ctlr.h registers */ |
+#define PMC_PA_BASE 0x7000E400 /* Base address for arapbpm.h registers */ |
+#define TIMERUS_PA_BASE 0x60005010 /* Base address for artimerus.h registers */ |
+#define PG_UP_PA_BASE 0x60000000 /* Base address for arpg.h registers */ |
+#define MISC_PA_BASE 0x70000000 /* Base address for arapb_misc.h registers */ |
+ |
+/* ----------------------------------- |
+ * Compile-time debug code enables |
+ * ----------------------------------- |
+ */ |
+ |
+#define DEBUG_DO_NOT_RESET_CORESIGHT 0 /* Set non-zero to skip resetting CoreSight */ |
+ |
+ .section .text |
+ .align 4 |
+ |
+/* ------------------------------------------------------ |
+ * Prototype: |
+ * void wb_start(void) |
+ * |
+ * Input: |
+ * |
+ * Output: |
+ * None |
+ * |
+ * Registers Used: |
+ * ALL |
+ * |
+ * Description: |
+ * This function restarts the CPU and then waits for the AVP driver to |
+ * tell it where to transfer control to finish restoration of the AVP state. |
+ * ------------------------------------------------------------------------------- |
+ */ |
+ |
+ .globl wb_start |
+wb_start: |
+ |
+ .word 0, 0, 0, 0 |
+ .word 0, 0, 0, 0 |
+ .word 0, 0, 0, 0 |
+ .word 0, 0, 0, 0 |
+ |
+start: |
+ |
+ ldr r0, =MISC_PA_BASE /* R0 = MISC PA base address */ |
+ ldr r1, =NV_DRF_DEF(APB_MISC_PP, CONFIG_CTL, JTAG, ENABLE) \ |
+ _OR_ NV_DRF_DEF(APB_MISC_PP, CONFIG_CTL, TBE, ENABLE) |
+ str r1, [r0, #NV_DRF_OFFSET(APB_MISC_PP, CONFIG_CTL)] |
+ |
+ /* ----------------------------------------------------------------- |
+ * Load up the base addresses for the register blocks. |
+ * ----------------------------------------------------------------- |
+ */ |
+ ldr r5, =PMC_PA_BASE /* R5 = PMC PA base address */ |
+ ldr r6, =FLOW_PA_BASE /* R6 = FLOW PA base address */ |
+ ldr r7, =TIMERUS_PA_BASE /* R7 = TIMERUS PA base address */ |
+ ldr r8, =CLK_RST_PA_BASE /* R8 = CLK PA base address */ |
+ ldr r9, =EVP_PA_BASE /* R9 = EVP PA base address */ |
+ ldr r10,=CSITE_PA_BASE /* R10 = CSITE base address */ |
+ |
+ /* ----------------------------------------------------------------- |
+ * Are we running where we're supposed to be? |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ ldr r0, =AP20_WB0_RUN_ADDRESS /* R0 = expected load address */ |
+ add r1, pc, #here-(.+8) /* R1 = &here */ |
+ |
+here: |
+ sub r1, r1, #(here-start) /* R1 = actual load address */ |
+ ldr r2, =PG_UP_PA_BASE /* R2 = PG PA base address */ |
+ ldr r3, [r2, #PG_UP_TAG_0] /* R3 = processor tag */ |
+ ldr r2, =PG_UP_TAG_0_PID_COP /* R2 = AVP processor tag */ |
+ cmp r0, r1 /* Addresses match? */ |
+ cmpeq r2, r3 /* Processor tags match? */ |
+ bne do_reset /* No -- reset the chip */ |
+ |
+ /* ----------------------------------------------------------------- |
+ * Get a snapshot of the Usec count. This is a good indicator of |
+ * the overhead of BOOTROM after a wake-up event. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ ldr r11, [r7, #TIMERUS_CNTR_1US_0] |
+ |
+ /* ================================================================== |
+ * BEGIN CPU COMPLEX INITIALIZATON |
+ * ================================================================== |
+ */ |
+ |
+#if !DEBUG_DO_NOT_RESET_CORESIGHT |
+ |
+ /* ---------------------------------------------------------------- |
+ * Assert CoreSight reset. |
+ * ---------------------------------------------------------------- |
+ */ |
+ |
+ mov r1, #NV_DRF_MASK(CLK_RST_CONTROLLER,RST_DEV_U_SET,SET_CSITE_RST) |
+ str r1, [r8, #CLK_RST_CONTROLLER_RST_DEV_U_SET_0] |
+ |
+#endif /*!DEBUG_DO_NOT_RESET_CORESIGHT */ |
+ |
+ /* Set the drive strength */ |
+ ldr r1, [r8, #CLK_RST_CONTROLLER_OSC_CTRL_0] |
+ ldr r3, =NV_DRF_MASK(CLK_RST_CONTROLLER, OSC_CTRL, XOFS) \ |
+ _OR_ NV_DRF_MASK(CLK_RST_CONTROLLER, OSC_CTRL, XOE) |
+ bic r1, r1, r3 |
+ ldr r3, =NV_DRF_NUM(CLK_RST_CONTROLLER, OSC_CTRL, XOFS, 0x4) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, OSC_CTRL, XOE, 0x1) |
+ orr r3, r1, r3 |
+ str r3, [r8, #CLK_RST_CONTROLLER_OSC_CTRL_0] |
+ |
+ /* ----------------------------------------------------------------- |
+ * Power up the CPU complex if necessary. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ ldr r3, [r5, #APBDEV_PMC_PWRGATE_STATUS_0] |
+ tst r3, #NV_DRF_MASK(APBDEV_PMC, PWRGATE_STATUS, CPU) |
+ |
+ ldreq r2, =NV_DRF_DEF(APBDEV_PMC, PWRGATE_TOGGLE, PARTID, CP) \ |
+ _OR_ NV_DRF_DEF(APBDEV_PMC, PWRGATE_TOGGLE, START, ENABLE) |
+ streq r2, [r5, #APBDEV_PMC_PWRGATE_TOGGLE_0] |
+ |
+is_cpu_on: |
+ ldr r3, [r5, #APBDEV_PMC_PWRGATE_STATUS_0] |
+ tst r3, #NV_DRF_MASK(APBDEV_PMC, PWRGATE_STATUS, CPU) |
+ beq is_cpu_on |
+ |
+ /* ----------------------------------------------------------------- |
+ * Remove the I/O clamps from the CPU power partition. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ mov r3, #NV_DRF_DEF(APBDEV_PMC, REMOVE_CLAMPING_CMD, CPU, ENABLE) |
+ str r3, [r5, #APBDEV_PMC_REMOVE_CLAMPING_CMD_0] |
+ |
+ ldr r3, =NV_DRF_NUM(FLOW_CTLR, HALT_COP_EVENTS, ZERO, 0x14) \ |
+ _OR_ NV_DRF_NUM(FLOW_CTLR, HALT_COP_EVENTS, MSEC, 1) \ |
+ _OR_ NV_DRF_NUM(FLOW_CTLR, HALT_COP_EVENTS, MODE, 2) |
+ str r3, [r6, #FLOW_CTLR_HALT_COP_EVENTS_0] |
+ |
+ /* ------------------------------------------------------------------ |
+ * Assert CPU complex reset. |
+ * ------------------------------------------------------------------ |
+ */ |
+ |
+ mov r1, #NV_DRF_MASK(CLK_RST_CONTROLLER,RST_DEV_L_SET,SET_CPU_RST) |
+ str r1, [r8, #CLK_RST_CONTROLLER_RST_DEV_L_SET_0] |
+ |
+ /* ------------------------------------------------------------------ |
+ * Hold both CPUs in reset. |
+ * ------------------------------------------------------------------ |
+ */ |
+ |
+ ldr r3, =NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_SET, SET_CPURESET1, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_SET, SET_DBGRESET1, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_SET, SET_DERESET1, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_SET, SET_CPURESET0, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_SET, SET_DBGRESET0, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_SET, SET_DERESET0, 1) |
+ str r3, [r8, #CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET_0] |
+ |
+ /* ------------------------------------------------------------------ |
+ * Halt CPU1 at the flow controller for uni-processor configurations. |
+ * ------------------------------------------------------------------ |
+ */ |
+ |
+ mov r3, #NV_DRF_DEF(FLOW_CTLR, HALT_CPU1_EVENTS, MODE, FLOW_MODE_STOP) |
+ str r3, [r6, #FLOW_CTLR_HALT_CPU1_EVENTS_0] |
+ |
+ /* ----------------------------------------------------------------- |
+ * Set the CPU reset vector. SCRATCH41 contains the physical |
+ * address of the CPU-side restoration code. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ ldr r3, [r5, #APBDEV_PMC_SCRATCH41_0] |
+ str r3, [r9, #EVP_CPU_RESET_VECTOR_0] |
+ |
+ /* ------------------------------------------------------------------ |
+ * Select CPU complex clock source. |
+ * ------------------------------------------------------------------ |
+ */ |
+ |
+ ldr r3, =(CPU_CLOCK_SOURCE _SHL_ NV_DRF_SHIFT(CLK_RST_CONTROLLER, CCLK_BURST_POLICY, CWAKEUP_FIQ_SOURCE)) \ |
+ _OR_ (CPU_CLOCK_SOURCE _SHL_ NV_DRF_SHIFT(CLK_RST_CONTROLLER, CCLK_BURST_POLICY, CWAKEUP_IRQ_SOURCE)) \ |
+ _OR_ (CPU_CLOCK_SOURCE _SHL_ NV_DRF_SHIFT(CLK_RST_CONTROLLER, CCLK_BURST_POLICY, CWAKEUP_RUN_SOURCE)) \ |
+ _OR_ (CPU_CLOCK_SOURCE _SHL_ NV_DRF_SHIFT(CLK_RST_CONTROLLER, CCLK_BURST_POLICY, CWAKEUP_IDLE_SOURCE)) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, CCLK_BURST_POLICY, CPU_STATE, RUN) |
+ str r3, [r8, #CLK_RST_CONTROLLER_CCLK_BURST_POLICY_0] |
+ |
+ /* ------------------------------------------------------------------ |
+ * Start the CPU0 clock and stop the CPU1 clock. |
+ * ------------------------------------------------------------------ |
+ */ |
+ |
+ ldr r3, =NV_DRF_DEF(CLK_RST_CONTROLLER, CLK_CPU_CMPLX, CPU_BRIDGE_CLKDIV, DEFAULT) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, CLK_CPU_CMPLX, CPU0_CLK_STP, 0) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, CLK_CPU_CMPLX, CPU1_CLK_STP, 1) |
+ str r3, [r8, #CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0] |
+ |
+ /* ------------------------------------------------------------------ |
+ * Enable the CPU complex clock. |
+ * ------------------------------------------------------------------ |
+ */ |
+ |
+ mov r3, #NV_DRF_MASK(CLK_RST_CONTROLLER,CLK_ENB_L_SET,SET_CLK_ENB_CPU) |
+ str r3, [r8, #CLK_RST_CONTROLLER_CLK_ENB_L_SET_0] |
+ |
+ /* ----------------------------------------------------------------- |
+ * Make sure the resets were held for at least 2 microseconds. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ add r3, r11, #2 |
+ |
+wait: |
+ ldr r2, [r7, #TIMERUS_CNTR_1US_0] |
+ cmp r2, r3 |
+ ble wait |
+ |
+#if !DEBUG_DO_NOT_RESET_CORESIGHT |
+ |
+ /* ----------------------------------------------------------------- |
+ * De-assert CoreSight reset. |
+ * NOTE: We're leaving the CoreSight clock on the oscillator for |
+ * now. It will be restored to its original clock source |
+ * when the CPU-side restoration code runs. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ mov r1, #NV_DRF_MASK(CLK_RST_CONTROLLER,RST_DEV_U_CLR,CLR_CSITE_RST) |
+ str r1, [r8, #CLK_RST_CONTROLLER_RST_DEV_U_CLR_0] |
+ |
+#endif /*!DEBUG_DO_NOT_RESET_CORESIGHT */ |
+ |
+ ldr r1, =0xC5ACCE55 /* R0 = CoreSight unlock value */ |
+ ldr r2, =CSITE_CPUDBG0_LAR_0 /* R1 = CPU0 lock offset */ |
+ ldr r3, =CSITE_CPUDBG1_LAR_0 /* R2 = CPU1 lock offset */ |
+ str r1, [r10, r2] /* Unlock CPU0 */ |
+ str r1, [r10, r3] /* Unlock CPU1 */ |
+ |
+ /* ----------------------------------------------------------------- |
+ * Sample the microsecond timestamp again. This is the time we must |
+ * use when returning from LP0 for PLL stabilization delays. |
+ * ---------------------------------------------------------------- |
+ */ |
+ |
+ ldr r11, [r7, #TIMERUS_CNTR_1US_0] |
+ str r11, [r5, #APBDEV_PMC_SCRATCH_FOR_LP_EXIT_TIME_0] |
+ |
+ /* ----------------------------------------------------------------- |
+ * Get the oscillator frequency. For 19.2 MHz, just use 19 to |
+ * make the calculations easier. |
+ * ----------------------------------------------------------------- |
+ */ |
+ |
+ ldr r4, [r7, #TIMERUS_USEC_CFG_0] |
+ and r4, r4, #NV_DRF_MASK(TIMERUS, USEC_CFG, USEC_DIVISOR) |
+ add r4, r4, #1 |
+ cmp r4, #26 |
+ MOVGT r4, #19 |
+ |
+ /* PLLX_BASE.PLLX_DIVM */ |
+ ldr r0, [r5, #APBDEV_PMC_SCRATCH3_0] |
+ and r2, r0, #APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVM_DEFAULT_MASK |
+ cmp r2, r4 |
+ moveq r4, #0 |
+ movne r4, #1 |
+ |
+ /* PLLX_BASE.PLLX_DIVN */ |
+ mov r0, r0, ASR #(APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVN_SHIFT - APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVM_SHIFT) |
+ ldr r3, =APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVN_DEFAULT_MASK |
+ and r1, r0, r3 |
+ orr r2, r2, r1, LSL #CLK_RST_CONTROLLER_PLLX_BASE_0_PLLX_DIVN_SHIFT |
+ mov r4, r1, LSL r4 |
+ |
+ /* PLLX_BASE.PLLX_DIVP */ |
+ mov r0, r0, ASR #(APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVP_SHIFT - APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVN_SHIFT) |
+ and r1, r0, #APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVP_DEFAULT_MASK |
+ orr r2, r2, r1, LSL #CLK_RST_CONTROLLER_PLLX_BASE_0_PLLX_DIVP_SHIFT |
+ mov r4, r4, ASR r1 |
+ |
+ /* PLLX_BASE.PLLX_BYPASS_ENABLE | PLLX_BASE.PLLX_ENABLE_DISABLE | PLLX_BASE.PLLX_REF_DIS_REF_ENABLE */ |
+ orr r2, r2, #NV_DRF_DEF(CLK_RST_CONTROLLER, PLLX_BASE, PLLX_BYPASS, ENABLE) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, PLLX_BASE, PLLX_ENABLE, DISABLE) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, PLLX_BASE, PLLX_REF_DIS, REF_ENABLE) |
+ |
+ /* PLLX_MISC_DCCON must be set for frequencies > 600 MHz. */ |
+ cmp r4, #600 |
+ movlt r3, #0 |
+ movge r3, #NV_DRF_DEF(CLK_RST_CONTROLLER,PLLX_MISC,PLLX_DCCON,DEFAULT) |
+ |
+ /* PLLX_MISC_LFCON */ |
+ mov r0, r0, ASR #(APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_MISC_LFCON_SHIFT - APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_BASE_PLLX_DIVP_SHIFT) |
+ and r1, r0, #APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_MISC_LFCON_DEFAULT_MASK |
+ orr r3, r3, r1, LSL #CLK_RST_CONTROLLER_PLLX_MISC_0_PLLX_LFCON_SHIFT |
+ |
+ /* PLLX_MISC_CPCON */ |
+ mov r0, r0, ASR #(APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_MISC_CPCON_SHIFT - APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_MISC_LFCON_SHIFT) |
+ and r1, r0, #APBDEV_PMC_SCRATCH3_0_CLK_RST_PLLX_MISC_LFCON_DEFAULT_MASK |
+ orr r3, r3, r1, LSL #CLK_RST_CONTROLLER_PLLX_MISC_0_PLLX_CPCON_SHIFT |
+ |
+ str r3, [r8, #CLK_RST_CONTROLLER_PLLX_MISC_0] |
+ str r2, [r8, #CLK_RST_CONTROLLER_PLLX_BASE_0] |
+ orr r2, r2, #NV_DRF_DEF(CLK_RST_CONTROLLER, PLLX_BASE, PLLX_ENABLE, ENABLE) |
+ str r2, [r8, #CLK_RST_CONTROLLER_PLLX_BASE_0] |
+ BIC r2, r2, #NV_DRF_DEF(CLK_RST_CONTROLLER, PLLX_BASE, PLLX_BYPASS, ENABLE) |
+ str r2, [r8, #CLK_RST_CONTROLLER_PLLX_BASE_0] |
+ |
+ mov r3, #0 |
+ str r3, [r6, #FLOW_CTLR_HALT_CPU_EVENTS_0] |
+ |
+ ldr r3, =NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_CLR, CLR_CPURESET0, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_CLR, CLR_DBGRESET0, 1) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, RST_CPU_CMPLX_CLR, CLR_DERESET0, 1) |
+ str r3, [r8, #CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR_0] |
+ |
+ ldr r1, = NV_DRF_DEF(CLK_RST_CONTROLLER, PLLM_OUT, PLLM_OUT1_RSTN, RESET_DISABLE) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, PLLM_OUT, PLLM_OUT1_CLKEN, ENABLE) \ |
+ _OR_ NV_DRF_NUM(CLK_RST_CONTROLLER, PLLM_OUT, PLLM_OUT1_RATIO, 0x8) |
+ str r1, [r8, #CLK_RST_CONTROLLER_PLLM_OUT_0] |
+ |
+ ldr r2, =NV_DRF_DEF(CLK_RST_CONTROLLER, SCLK_BURST_POLICY, SWAKEUP_FIQ_SOURCE, PLLM_OUT1) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, SCLK_BURST_POLICY, SWAKEUP_IRQ_SOURCE, PLLM_OUT1) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, SCLK_BURST_POLICY, SWAKEUP_RUN_SOURCE, PLLM_OUT1) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, SCLK_BURST_POLICY, SWAKEUP_IDLE_SOURCE, PLLM_OUT1) \ |
+ _OR_ NV_DRF_DEF(CLK_RST_CONTROLLER, SCLK_BURST_POLICY, SYS_STATE, IDLE) |
+ str r2, [r8, #CLK_RST_CONTROLLER_SCLK_BURST_POLICY_0] |
+ b avp_resume |
+ |
+ .ltorg |
+ .align 4 |
+ |
+avp_resume: |
+ |
+ mov r1, #NV_DRF_MASK(CLK_RST_CONTROLLER,RST_DEV_L_CLR,CLR_CPU_RST) |
+ str r1, [r8, #CLK_RST_CONTROLLER_RST_DEV_L_CLR_0] |
+ |
+avp_halt: |
+ |
+ mov r3, #NV_DRF_DEF(FLOW_CTLR, HALT_COP_EVENTS, MODE, FLOW_MODE_STOP) |
+ orr r3, r3, #NV_DRF_NUM(FLOW_CTLR, HALT_COP_EVENTS, JTAG, 1) |
+ str r3, [r6, #FLOW_CTLR_HALT_COP_EVENTS_0] |
+ b avp_halt |
+ |
+/* ------------------------------------------------------------------------------- |
+ * Prototype: |
+ * do_reset |
+ * |
+ * Input: |
+ * None |
+ * |
+ * Output: |
+ * None |
+ * |
+ * Registers Used: |
+ * All |
+ * |
+ * Description: |
+ * Execution comes here it something goes wrong. The chip is reset and a |
+ * cold boot is performed. |
+ * ------------------------------------------------------------------------------- |
+ */ |
+ |
+do_reset: |
+ |
+ mov r0, #NV_DRF_DEF(CLK_RST_CONTROLLER, RST_DEVICES_L, SWR_TRIG_SYS_RST, ENABLE) |
+ str r0, [r8, #CLK_RST_CONTROLLER_RST_DEVICES_L_0] |
+ b . |
+ |
+ .ltorg |
+ |
+ .globl wb_end |
+wb_end: |
+ |
+ .end |
+ |