Chromium Code Reviews| 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..8d72bc349c327c2a57288c280a8d4b3bb506dbd4 |
| --- /dev/null |
| +++ b/arch/arm/cpu/arm_cortexa9/tegra2/warmboot_avp.S |
| @@ -0,0 +1,428 @@ |
| +/* |
| + * (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 |
| + */ |
| + |
| +#define ASSEMBLY_SOURCE_FILE 1 |
| + |
| +#include "asm/arch/nvbl_assembly.h" |
| +#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 */ |
| + |
| + TEXT |
| + ALIGN 4 |
| + |
|
Tom Warren
2010/11/12 00:12:40
This code is very ugly - it looks like we're using
yelin
2010/11/15 23:21:21
Done.
|
| +/* ------------------------------------------------------ |
| + * 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. |
| + * ------------------------------------------------------------------------------- |
| + */ |
| + |
| + EXPORT wb_start |
| +wb_start LABEL |
| + |
| + DCD 0, 0, 0, 0 |
| + DCD 0, 0, 0, 0 |
| + DCD 0, 0, 0, 0 |
| + DCD 0, 0, 0, 0 |
| + |
| +start LABEL |
| + |
| + 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 LABEL |
| + 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 LABEL |
| + 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 LABEL |
| + 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 LABEL |
| + |
| + 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 LABEL |
| + |
| + 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 LABEL |
| + |
| + 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 |
| + |
| + EXPORT wb_end |
| +wb_end LABEL |
| + |
| + END |
| + |