| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 1 | /* | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 2 |  * (C) Copyright 2007 | 
 | 3 |  * Texas Instruments | 
 | 4 |  * Karthik Dasu <karthik-dp@ti.com> | 
 | 5 |  * | 
 | 6 |  * (C) Copyright 2004 | 
 | 7 |  * Texas Instruments, <www.ti.com> | 
 | 8 |  * Richard Woodruff <r-woodruff2@ti.com> | 
 | 9 |  * | 
 | 10 |  * This program is free software; you can redistribute it and/or | 
 | 11 |  * modify it under the terms of the GNU General Public License as | 
 | 12 |  * published by the Free Software Foundation; either version 2 of | 
 | 13 |  * the License, or (at your option) any later version. | 
 | 14 |  * | 
 | 15 |  * This program is distributed in the hope that it will be useful, | 
 | 16 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 17 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR /PURPOSE.  See the | 
 | 18 |  * GNU General Public License for more details. | 
 | 19 |  * | 
 | 20 |  * You should have received a copy of the GNU General Public License | 
 | 21 |  * along with this program; if not, write to the Free Software | 
 | 22 |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
 | 23 |  * MA 02111-1307 USA | 
 | 24 |  */ | 
 | 25 | #include <linux/linkage.h> | 
 | 26 | #include <asm/assembler.h> | 
| Jean Pihet | b4b36fd | 2010-12-18 16:44:42 +0100 | [diff] [blame] | 27 | #include <plat/sram.h> | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 28 | #include <mach/io.h> | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 29 |  | 
| Paul Walmsley | 59fb659 | 2010-12-21 15:30:55 -0700 | [diff] [blame] | 30 | #include "cm2xxx_3xxx.h" | 
 | 31 | #include "prm2xxx_3xxx.h" | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 32 | #include "sdrc.h" | 
| Paul Walmsley | 4814ced | 2010-10-08 11:40:20 -0600 | [diff] [blame] | 33 | #include "control.h" | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 34 |  | 
| Jean Pihet | fe360e1 | 2010-12-18 16:44:43 +0100 | [diff] [blame] | 35 | /* | 
 | 36 |  * Registers access definitions | 
 | 37 |  */ | 
 | 38 | #define SDRC_SCRATCHPAD_SEM_OFFS	0xc | 
 | 39 | #define SDRC_SCRATCHPAD_SEM_V	OMAP343X_SCRATCHPAD_REGADDR\ | 
 | 40 | 					(SDRC_SCRATCHPAD_SEM_OFFS) | 
 | 41 | #define PM_PREPWSTST_CORE_P	OMAP3430_PRM_BASE + CORE_MOD +\ | 
 | 42 | 					OMAP3430_PM_PREPWSTST | 
| Abhijit Pagare | 3790300 | 2010-01-26 20:12:51 -0700 | [diff] [blame] | 43 | #define PM_PWSTCTRL_MPU_P	OMAP3430_PRM_BASE + MPU_MOD + OMAP2_PM_PWSTCTRL | 
| Peter 'p2' De Schrijver | 89139dc | 2009-01-16 18:53:48 +0200 | [diff] [blame] | 44 | #define CM_IDLEST1_CORE_V	OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1) | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 45 | #define CM_IDLEST_CKGEN_V	OMAP34XX_CM_REGADDR(PLL_MOD, CM_IDLEST) | 
| Jean Pihet | fe360e1 | 2010-12-18 16:44:43 +0100 | [diff] [blame] | 46 | #define SRAM_BASE_P		OMAP3_SRAM_PA | 
 | 47 | #define CONTROL_STAT		OMAP343X_CTRL_BASE + OMAP343X_CONTROL_STATUS | 
 | 48 | #define CONTROL_MEM_RTA_CTRL	(OMAP343X_CTRL_BASE +\ | 
 | 49 | 					OMAP36XX_CONTROL_MEM_RTA_CTRL) | 
 | 50 |  | 
 | 51 | /* Move this as correct place is available */ | 
 | 52 | #define SCRATCHPAD_MEM_OFFS	0x310 | 
 | 53 | #define SCRATCHPAD_BASE_P	(OMAP343X_CTRL_BASE +\ | 
 | 54 | 					OMAP343X_CONTROL_MEM_WKUP +\ | 
 | 55 | 					SCRATCHPAD_MEM_OFFS) | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 56 | #define SDRC_POWER_V		OMAP34XX_SDRC_REGADDR(SDRC_POWER) | 
| Tero Kristo | 0795a75 | 2008-10-13 17:58:50 +0300 | [diff] [blame] | 57 | #define SDRC_SYSCONFIG_P	(OMAP343X_SDRC_BASE + SDRC_SYSCONFIG) | 
 | 58 | #define SDRC_MR_0_P		(OMAP343X_SDRC_BASE + SDRC_MR_0) | 
 | 59 | #define SDRC_EMR2_0_P		(OMAP343X_SDRC_BASE + SDRC_EMR2_0) | 
 | 60 | #define SDRC_MANUAL_0_P		(OMAP343X_SDRC_BASE + SDRC_MANUAL_0) | 
 | 61 | #define SDRC_MR_1_P		(OMAP343X_SDRC_BASE + SDRC_MR_1) | 
 | 62 | #define SDRC_EMR2_1_P		(OMAP343X_SDRC_BASE + SDRC_EMR2_1) | 
 | 63 | #define SDRC_MANUAL_1_P		(OMAP343X_SDRC_BASE + SDRC_MANUAL_1) | 
| Peter 'p2' De Schrijver | 89139dc | 2009-01-16 18:53:48 +0200 | [diff] [blame] | 64 | #define SDRC_DLLA_STATUS_V	OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS) | 
 | 65 | #define SDRC_DLLA_CTRL_V	OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL) | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 66 |  | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 67 | /* | 
 | 68 |  * This file needs be built unconditionally as ARM to interoperate correctly | 
 | 69 |  * with non-Thumb-2-capable firmware. | 
 | 70 |  */ | 
 | 71 | 	.arm | 
| Rajendra Nayak | a89b6f0 | 2009-05-28 18:13:06 +0530 | [diff] [blame] | 72 |  | 
| Jean Pihet | d3cdfd2 | 2010-12-18 16:44:41 +0100 | [diff] [blame] | 73 | /* | 
 | 74 |  * API functions | 
 | 75 |  */ | 
| Rajendra Nayak | a89b6f0 | 2009-05-28 18:13:06 +0530 | [diff] [blame] | 76 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 77 | /* | 
 | 78 |  * The "get_*restore_pointer" functions are used to provide a | 
 | 79 |  * physical restore address where the ROM code jumps while waking | 
 | 80 |  * up from MPU OFF/OSWR state. | 
 | 81 |  * The restore pointer is stored into the scratchpad. | 
 | 82 |  */ | 
 | 83 |  | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 84 | 	.text | 
 | 85 | /* Function call to get the restore pointer for resume from OFF */ | 
 | 86 | ENTRY(get_restore_pointer) | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 87 | 	stmfd	sp!, {lr}	@ save registers on stack | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 88 | 	adr	r0, restore | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 89 | 	ldmfd	sp!, {pc}	@ restore regs and return | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 90 | ENDPROC(get_restore_pointer) | 
 | 91 | 	.align | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 92 | ENTRY(get_restore_pointer_sz) | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 93 | 	.word	. - get_restore_pointer | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 94 |  | 
| Nishanth Menon | 458e999 | 2010-12-20 14:05:06 -0600 | [diff] [blame] | 95 | 	.text | 
 | 96 | /* Function call to get the restore pointer for 3630 resume from OFF */ | 
 | 97 | ENTRY(get_omap3630_restore_pointer) | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 98 | 	stmfd	sp!, {lr}	@ save registers on stack | 
| Nishanth Menon | 458e999 | 2010-12-20 14:05:06 -0600 | [diff] [blame] | 99 | 	adr	r0, restore_3630 | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 100 | 	ldmfd	sp!, {pc}	@ restore regs and return | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 101 | ENDPROC(get_omap3630_restore_pointer) | 
 | 102 | 	.align | 
| Nishanth Menon | 458e999 | 2010-12-20 14:05:06 -0600 | [diff] [blame] | 103 | ENTRY(get_omap3630_restore_pointer_sz) | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 104 | 	.word	. - get_omap3630_restore_pointer | 
| Tero Kristo | 0795a75 | 2008-10-13 17:58:50 +0300 | [diff] [blame] | 105 |  | 
 | 106 | 	.text | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 107 | /* Function call to get the restore pointer for ES3 to resume from OFF */ | 
 | 108 | ENTRY(get_es3_restore_pointer) | 
 | 109 | 	stmfd	sp!, {lr}	@ save registers on stack | 
 | 110 | 	adr	r0, restore_es3 | 
 | 111 | 	ldmfd	sp!, {pc}	@ restore regs and return | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 112 | ENDPROC(get_es3_restore_pointer) | 
 | 113 | 	.align | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 114 | ENTRY(get_es3_restore_pointer_sz) | 
 | 115 | 	.word	. - get_es3_restore_pointer | 
 | 116 |  | 
 | 117 | 	.text | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 118 | /* | 
 | 119 |  * L2 cache needs to be toggled for stable OFF mode functionality on 3630. | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 120 |  * This function sets up a flag that will allow for this toggling to take | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 121 |  * place on 3630. Hopefully some version in the future may not need this. | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 122 |  */ | 
 | 123 | ENTRY(enable_omap3630_toggle_l2_on_restore) | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 124 | 	stmfd	sp!, {lr}	@ save registers on stack | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 125 | 	/* Setup so that we will disable and enable l2 */ | 
 | 126 | 	mov	r1, #0x1 | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 127 | 	adrl	r2, l2dis_3630	@ may be too distant for plain adr | 
 | 128 | 	str	r1, [r2] | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 129 | 	ldmfd	sp!, {pc}	@ restore regs and return | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 130 | ENDPROC(enable_omap3630_toggle_l2_on_restore) | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 131 |  | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 132 | 	.text | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 133 | /* Function to call rom code to save secure ram context */ | 
| Jean Pihet | b6338bd | 2011-02-02 16:38:06 +0100 | [diff] [blame] | 134 | 	.align	3 | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 135 | ENTRY(save_secure_ram_context) | 
 | 136 | 	stmfd	sp!, {r1-r12, lr}	@ save registers on stack | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 137 | 	adr	r3, api_params		@ r3 points to parameters | 
 | 138 | 	str	r0, [r3,#0x4]		@ r0 has sdram address | 
 | 139 | 	ldr	r12, high_mask | 
 | 140 | 	and	r3, r3, r12 | 
 | 141 | 	ldr	r12, sram_phy_addr_mask | 
 | 142 | 	orr	r3, r3, r12 | 
 | 143 | 	mov	r0, #25			@ set service ID for PPA | 
 | 144 | 	mov	r12, r0			@ copy secure service ID in r12 | 
 | 145 | 	mov	r1, #0			@ set task id for ROM code in r1 | 
| Kalle Jokiniemi | ba50ea7 | 2009-03-26 15:59:00 +0200 | [diff] [blame] | 146 | 	mov	r2, #4			@ set some flags in r2, r6 | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 147 | 	mov	r6, #0xff | 
| Santosh Shilimkar | 4444d71 | 2011-01-23 19:00:34 +0530 | [diff] [blame] | 148 | 	dsb				@ data write barrier | 
 | 149 | 	dmb				@ data memory barrier | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 150 | 	smc	#1			@ call SMI monitor (smi #1) | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 151 | 	nop | 
 | 152 | 	nop | 
 | 153 | 	nop | 
 | 154 | 	nop | 
 | 155 | 	ldmfd	sp!, {r1-r12, pc} | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 156 | 	.align | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 157 | sram_phy_addr_mask: | 
 | 158 | 	.word	SRAM_BASE_P | 
 | 159 | high_mask: | 
 | 160 | 	.word	0xffff | 
 | 161 | api_params: | 
 | 162 | 	.word	0x4, 0x0, 0x0, 0x1, 0x1 | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 163 | ENDPROC(save_secure_ram_context) | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 164 | ENTRY(save_secure_ram_context_sz) | 
 | 165 | 	.word	. - save_secure_ram_context | 
 | 166 |  | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 167 | /* | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 168 |  * ====================== | 
 | 169 |  * == Idle entry point == | 
 | 170 |  * ====================== | 
 | 171 |  */ | 
 | 172 |  | 
 | 173 | /* | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 174 |  * Forces OMAP into idle state | 
 | 175 |  * | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 176 |  * omap34xx_cpu_suspend() - This bit of code saves the CPU context if needed | 
 | 177 |  * and executes the WFI instruction. Calling WFI effectively changes the | 
 | 178 |  * power domains states to the desired target power states. | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 179 |  * | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 180 |  * | 
 | 181 |  * Notes: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 182 |  * - this code gets copied to internal SRAM at boot and after wake-up | 
 | 183 |  *   from OFF mode. The execution pointer in SRAM is _omap_sram_idle. | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 184 |  * - when the OMAP wakes up it continues at different execution points | 
 | 185 |  *   depending on the low power mode (non-OFF vs OFF modes), | 
 | 186 |  *   cf. 'Resume path for xxx mode' comments. | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 187 |  */ | 
| Jean Pihet | b6338bd | 2011-02-02 16:38:06 +0100 | [diff] [blame] | 188 | 	.align	3 | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 189 | ENTRY(omap34xx_cpu_suspend) | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 190 | 	stmfd	sp!, {r0-r12, lr}	@ save registers on stack | 
| Jean Pihet | d3cdfd2 | 2010-12-18 16:44:41 +0100 | [diff] [blame] | 191 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 192 | 	/* | 
| Santosh Shilimkar | c9749a3 | 2011-01-23 19:33:53 +0530 | [diff] [blame] | 193 | 	 * r0 contains CPU context save/restore pointer in sdram | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 194 | 	 * r1 contains information about saving context: | 
 | 195 | 	 *   0 - No context lost | 
 | 196 | 	 *   1 - Only L1 and logic lost | 
| Santosh Shilimkar | c9749a3 | 2011-01-23 19:33:53 +0530 | [diff] [blame] | 197 | 	 *   2 - Only L2 lost (Even L1 is retained we clean it along with L2) | 
 | 198 | 	 *   3 - Both L1 and L2 lost and logic lost | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 199 | 	 */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 200 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 201 | 	/* Directly jump to WFI is the context save is not required */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 202 | 	cmp	r1, #0x0 | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 203 | 	beq	omap3_do_wfi | 
 | 204 |  | 
 | 205 | 	/* Otherwise fall through to the save context code */ | 
 | 206 | save_context_wfi: | 
 | 207 | 	mov	r8, r0			@ Store SDRAM address in r8 | 
 | 208 | 	mrc	p15, 0, r5, c1, c0, 1	@ Read Auxiliary Control Register | 
 | 209 | 	mov	r4, #0x1		@ Number of parameters for restore call | 
 | 210 | 	stmia	r8!, {r4-r5}		@ Push parameters for restore call | 
 | 211 | 	mrc	p15, 1, r5, c9, c0, 2	@ Read L2 AUX ctrl register | 
 | 212 | 	stmia	r8!, {r4-r5}		@ Push parameters for restore call | 
 | 213 |  | 
 | 214 |         /* Check what that target sleep state is from r1 */ | 
 | 215 | 	cmp	r1, #0x2		@ Only L2 lost, no need to save context | 
 | 216 | 	beq	clean_caches | 
 | 217 |  | 
 | 218 | l1_logic_lost: | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 219 | 	mov	r4, sp			@ Store sp | 
 | 220 | 	mrs	r5, spsr		@ Store spsr | 
 | 221 | 	mov	r6, lr			@ Store lr | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 222 | 	stmia	r8!, {r4-r6} | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 223 |  | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 224 | 	mrc	p15, 0, r4, c1, c0, 2	@ Coprocessor access control register | 
 | 225 | 	mrc	p15, 0, r5, c2, c0, 0	@ TTBR0 | 
 | 226 | 	mrc	p15, 0, r6, c2, c0, 1	@ TTBR1 | 
 | 227 | 	mrc	p15, 0, r7, c2, c0, 2	@ TTBCR | 
 | 228 | 	stmia	r8!, {r4-r7} | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 229 |  | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 230 | 	mrc	p15, 0, r4, c3, c0, 0	@ Domain access Control Register | 
 | 231 | 	mrc	p15, 0, r5, c10, c2, 0	@ PRRR | 
 | 232 | 	mrc	p15, 0, r6, c10, c2, 1	@ NMRR | 
 | 233 | 	stmia	r8!,{r4-r6} | 
 | 234 |  | 
 | 235 | 	mrc	p15, 0, r4, c13, c0, 1	@ Context ID | 
 | 236 | 	mrc	p15, 0, r5, c13, c0, 2	@ User r/w thread and process ID | 
 | 237 | 	mrc	p15, 0, r6, c12, c0, 0	@ Secure or NS vector base address | 
 | 238 | 	mrs	r7, cpsr		@ Store current cpsr | 
 | 239 | 	stmia	r8!, {r4-r7} | 
 | 240 |  | 
 | 241 | 	mrc	p15, 0, r4, c1, c0, 0	@ save control register | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 242 | 	stmia	r8!, {r4} | 
 | 243 |  | 
 | 244 | clean_caches: | 
 | 245 | 	/* | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 246 | 	 * jump out to kernel flush routine | 
 | 247 | 	 *  - reuse that code is better | 
 | 248 | 	 *  - it executes in a cached space so is faster than refetch per-block | 
 | 249 | 	 *  - should be faster and will change with kernel | 
 | 250 | 	 *  - 'might' have to copy address, load and jump to it | 
| Santosh Shilimkar | 9062511 | 2011-01-23 22:51:09 +0530 | [diff] [blame] | 251 | 	 * Flush all data from the L1 data cache before disabling | 
 | 252 | 	 * SCTLR.C bit. | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 253 | 	 */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 254 | 	ldr	r1, kernel_flush | 
 | 255 | 	mov	lr, pc | 
 | 256 | 	bx	r1 | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 257 |  | 
| Santosh Shilimkar | 9062511 | 2011-01-23 22:51:09 +0530 | [diff] [blame] | 258 | 	/* | 
 | 259 | 	 * Clear the SCTLR.C bit to prevent further data cache | 
 | 260 | 	 * allocation. Clearing SCTLR.C would make all the data accesses | 
 | 261 | 	 * strongly ordered and would not hit the cache. | 
 | 262 | 	 */ | 
 | 263 | 	mrc	p15, 0, r0, c1, c0, 0 | 
 | 264 | 	bic	r0, r0, #(1 << 2)	@ Disable the C bit | 
 | 265 | 	mcr	p15, 0, r0, c1, c0, 0 | 
 | 266 | 	isb | 
 | 267 |  | 
 | 268 | 	/* | 
 | 269 | 	 * Invalidate L1 data cache. Even though only invalidate is | 
 | 270 | 	 * necessary exported flush API is used here. Doing clean | 
 | 271 | 	 * on already clean cache would be almost NOP. | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 272 | 	 */ | 
 | 273 | 	ldr	r1, kernel_flush | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 274 | 	blx	r1 | 
 | 275 | 	/* | 
 | 276 | 	 * The kernel doesn't interwork: v7_flush_dcache_all in particluar will | 
 | 277 | 	 * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled. | 
 | 278 | 	 * This sequence switches back to ARM.  Note that .align may insert a | 
 | 279 | 	 * nop: bx pc needs to be word-aligned in order to work. | 
 | 280 | 	 */ | 
 | 281 |  THUMB(	.thumb		) | 
 | 282 |  THUMB(	.align		) | 
 | 283 |  THUMB(	bx	pc	) | 
 | 284 |  THUMB(	nop		) | 
 | 285 | 	.arm | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 286 |  | 
 | 287 | omap3_do_wfi: | 
 | 288 | 	ldr	r4, sdrc_power		@ read the SDRC_POWER register | 
 | 289 | 	ldr	r5, [r4]		@ read the contents of SDRC_POWER | 
 | 290 | 	orr	r5, r5, #0x40		@ enable self refresh on idle req | 
 | 291 | 	str	r5, [r4]		@ write back to SDRC_POWER register | 
 | 292 |  | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 293 | 	/* Data memory barrier and Data sync barrier */ | 
| Santosh Shilimkar | 4444d71 | 2011-01-23 19:00:34 +0530 | [diff] [blame] | 294 | 	dsb | 
 | 295 | 	dmb | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 296 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 297 | /* | 
 | 298 |  * =================================== | 
 | 299 |  * == WFI instruction => Enter idle == | 
 | 300 |  * =================================== | 
 | 301 |  */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 302 | 	wfi				@ wait for interrupt | 
 | 303 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 304 | /* | 
 | 305 |  * =================================== | 
 | 306 |  * == Resume path for non-OFF modes == | 
 | 307 |  * =================================== | 
 | 308 |  */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 309 | 	nop | 
 | 310 | 	nop | 
 | 311 | 	nop | 
 | 312 | 	nop | 
 | 313 | 	nop | 
 | 314 | 	nop | 
 | 315 | 	nop | 
 | 316 | 	nop | 
 | 317 | 	nop | 
 | 318 | 	nop | 
| Peter 'p2' De Schrijver | 89139dc | 2009-01-16 18:53:48 +0200 | [diff] [blame] | 319 | 	bl wait_sdrc_ok | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 320 |  | 
| Santosh Shilimkar | 9062511 | 2011-01-23 22:51:09 +0530 | [diff] [blame] | 321 | 	mrc	p15, 0, r0, c1, c0, 0 | 
 | 322 | 	tst	r0, #(1 << 2)		@ Check C bit enabled? | 
 | 323 | 	orreq	r0, r0, #(1 << 2)	@ Enable the C bit if cleared | 
 | 324 | 	mcreq	p15, 0, r0, c1, c0, 0 | 
 | 325 | 	isb | 
 | 326 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 327 | /* | 
 | 328 |  * =================================== | 
 | 329 |  * == Exit point from non-OFF modes == | 
 | 330 |  * =================================== | 
 | 331 |  */ | 
 | 332 | 	ldmfd	sp!, {r0-r12, pc}	@ restore regs and return | 
 | 333 |  | 
 | 334 |  | 
 | 335 | /* | 
 | 336 |  * ============================== | 
 | 337 |  * == Resume path for OFF mode == | 
 | 338 |  * ============================== | 
 | 339 |  */ | 
 | 340 |  | 
 | 341 | /* | 
 | 342 |  * The restore_* functions are called by the ROM code | 
 | 343 |  *  when back from WFI in OFF mode. | 
 | 344 |  * Cf. the get_*restore_pointer functions. | 
 | 345 |  * | 
 | 346 |  *  restore_es3: applies to 34xx >= ES3.0 | 
 | 347 |  *  restore_3630: applies to 36xx | 
 | 348 |  *  restore: common code for 3xxx | 
 | 349 |  */ | 
| Tero Kristo | 0795a75 | 2008-10-13 17:58:50 +0300 | [diff] [blame] | 350 | restore_es3: | 
| Tero Kristo | 0795a75 | 2008-10-13 17:58:50 +0300 | [diff] [blame] | 351 | 	ldr	r5, pm_prepwstst_core_p | 
 | 352 | 	ldr	r4, [r5] | 
 | 353 | 	and	r4, r4, #0x3 | 
 | 354 | 	cmp	r4, #0x0	@ Check if previous power state of CORE is OFF | 
 | 355 | 	bne	restore | 
 | 356 | 	adr	r0, es3_sdrc_fix | 
 | 357 | 	ldr	r1, sram_base | 
 | 358 | 	ldr	r2, es3_sdrc_fix_sz | 
 | 359 | 	mov	r2, r2, ror #2 | 
 | 360 | copy_to_sram: | 
 | 361 | 	ldmia	r0!, {r3}	@ val = *src | 
 | 362 | 	stmia	r1!, {r3}	@ *dst = val | 
 | 363 | 	subs	r2, r2, #0x1	@ num_words-- | 
 | 364 | 	bne	copy_to_sram | 
 | 365 | 	ldr	r1, sram_base | 
 | 366 | 	blx	r1 | 
| Nishanth Menon | 458e999 | 2010-12-20 14:05:06 -0600 | [diff] [blame] | 367 | 	b	restore | 
 | 368 |  | 
 | 369 | restore_3630: | 
| Nishanth Menon | 458e999 | 2010-12-20 14:05:06 -0600 | [diff] [blame] | 370 | 	ldr	r1, pm_prepwstst_core_p | 
 | 371 | 	ldr	r2, [r1] | 
 | 372 | 	and	r2, r2, #0x3 | 
 | 373 | 	cmp	r2, #0x0	@ Check if previous power state of CORE is OFF | 
 | 374 | 	bne	restore | 
 | 375 | 	/* Disable RTA before giving control */ | 
 | 376 | 	ldr	r1, control_mem_rta | 
 | 377 | 	mov	r2, #OMAP36XX_RTA_DISABLE | 
 | 378 | 	str	r2, [r1] | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 379 |  | 
 | 380 | 	/* Fall through to common code for the remaining logic */ | 
 | 381 |  | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 382 | restore: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 383 | 	/* | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 384 | 	 * Check what was the reason for mpu reset and store the reason in r9: | 
 | 385 | 	 *  0 - No context lost | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 386 | 	 *  1 - Only L1 and logic lost | 
 | 387 | 	 *  2 - Only L2 lost - In this case, we wont be here | 
 | 388 | 	 *  3 - Both L1 and L2 lost | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 389 | 	 */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 390 | 	ldr	r1, pm_pwstctrl_mpu | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 391 | 	ldr	r2, [r1] | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 392 | 	and	r2, r2, #0x3 | 
 | 393 | 	cmp	r2, #0x0	@ Check if target power state was OFF or RET | 
 | 394 | 	moveq	r9, #0x3	@ MPU OFF => L1 and L2 lost | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 395 | 	movne	r9, #0x1	@ Only L1 and L2 lost => avoid L2 invalidation | 
 | 396 | 	bne	logic_l1_restore | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 397 |  | 
 | 398 | 	ldr	r0, l2dis_3630 | 
 | 399 | 	cmp	r0, #0x1	@ should we disable L2 on 3630? | 
 | 400 | 	bne	skipl2dis | 
 | 401 | 	mrc	p15, 0, r0, c1, c0, 1 | 
 | 402 | 	bic	r0, r0, #2	@ disable L2 cache | 
 | 403 | 	mcr	p15, 0, r0, c1, c0, 1 | 
 | 404 | skipl2dis: | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 405 | 	ldr	r0, control_stat | 
 | 406 | 	ldr	r1, [r0] | 
 | 407 | 	and	r1, #0x700 | 
 | 408 | 	cmp	r1, #0x300 | 
 | 409 | 	beq	l2_inv_gp | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 410 | 	mov	r0, #40			@ set service ID for PPA | 
 | 411 | 	mov	r12, r0			@ copy secure Service ID in r12 | 
 | 412 | 	mov	r1, #0			@ set task id for ROM code in r1 | 
 | 413 | 	mov	r2, #4			@ set some flags in r2, r6 | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 414 | 	mov	r6, #0xff | 
 | 415 | 	adr	r3, l2_inv_api_params	@ r3 points to dummy parameters | 
| Santosh Shilimkar | 4444d71 | 2011-01-23 19:00:34 +0530 | [diff] [blame] | 416 | 	dsb				@ data write barrier | 
 | 417 | 	dmb				@ data memory barrier | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 418 | 	smc	#1			@ call SMI monitor (smi #1) | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 419 | 	/* Write to Aux control register to set some bits */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 420 | 	mov	r0, #42			@ set service ID for PPA | 
 | 421 | 	mov	r12, r0			@ copy secure Service ID in r12 | 
 | 422 | 	mov	r1, #0			@ set task id for ROM code in r1 | 
 | 423 | 	mov	r2, #4			@ set some flags in r2, r6 | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 424 | 	mov	r6, #0xff | 
| Tero Kristo | a087cad | 2009-11-12 12:07:20 +0200 | [diff] [blame] | 425 | 	ldr	r4, scratchpad_base | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 426 | 	ldr	r3, [r4, #0xBC]		@ r3 points to parameters | 
| Santosh Shilimkar | 4444d71 | 2011-01-23 19:00:34 +0530 | [diff] [blame] | 427 | 	dsb				@ data write barrier | 
 | 428 | 	dmb				@ data memory barrier | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 429 | 	smc	#1			@ call SMI monitor (smi #1) | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 430 |  | 
| Tero Kristo | 79dcfdd | 2009-11-12 12:07:22 +0200 | [diff] [blame] | 431 | #ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE | 
 | 432 | 	/* Restore L2 aux control register */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 433 | 					@ set service ID for PPA | 
| Tero Kristo | 79dcfdd | 2009-11-12 12:07:22 +0200 | [diff] [blame] | 434 | 	mov	r0, #CONFIG_OMAP3_L2_AUX_SECURE_SERVICE_SET_ID | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 435 | 	mov	r12, r0			@ copy service ID in r12 | 
 | 436 | 	mov	r1, #0			@ set task ID for ROM code in r1 | 
 | 437 | 	mov	r2, #4			@ set some flags in r2, r6 | 
| Tero Kristo | 79dcfdd | 2009-11-12 12:07:22 +0200 | [diff] [blame] | 438 | 	mov	r6, #0xff | 
 | 439 | 	ldr	r4, scratchpad_base | 
 | 440 | 	ldr	r3, [r4, #0xBC] | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 441 | 	adds	r3, r3, #8		@ r3 points to parameters | 
| Santosh Shilimkar | 4444d71 | 2011-01-23 19:00:34 +0530 | [diff] [blame] | 442 | 	dsb				@ data write barrier | 
 | 443 | 	dmb				@ data memory barrier | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 444 | 	smc	#1			@ call SMI monitor (smi #1) | 
| Tero Kristo | 79dcfdd | 2009-11-12 12:07:22 +0200 | [diff] [blame] | 445 | #endif | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 446 | 	b	logic_l1_restore | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 447 |  | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 448 | 	.align | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 449 | l2_inv_api_params: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 450 | 	.word	0x1, 0x00 | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 451 | l2_inv_gp: | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 452 | 	/* Execute smi to invalidate L2 cache */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 453 | 	mov r12, #0x1			@ set up to invalidate L2 | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 454 | 	smc	#0			@ Call SMI monitor (smieq) | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 455 | 	/* Write to Aux control register to set some bits */ | 
| Tero Kristo | a087cad | 2009-11-12 12:07:20 +0200 | [diff] [blame] | 456 | 	ldr	r4, scratchpad_base | 
 | 457 | 	ldr	r3, [r4,#0xBC] | 
 | 458 | 	ldr	r0, [r3,#4] | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 459 | 	mov	r12, #0x3 | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 460 | 	smc	#0			@ Call SMI monitor (smieq) | 
| Tero Kristo | 79dcfdd | 2009-11-12 12:07:22 +0200 | [diff] [blame] | 461 | 	ldr	r4, scratchpad_base | 
 | 462 | 	ldr	r3, [r4,#0xBC] | 
 | 463 | 	ldr	r0, [r3,#12] | 
 | 464 | 	mov	r12, #0x2 | 
| Dave Martin | 76d5001 | 2011-03-04 15:33:55 +0000 | [diff] [blame] | 465 | 	smc	#0			@ Call SMI monitor (smieq) | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 466 | logic_l1_restore: | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 467 | 	ldr	r1, l2dis_3630 | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 468 | 	cmp	r1, #0x1		@ Test if L2 re-enable needed on 3630 | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 469 | 	bne	skipl2reen | 
 | 470 | 	mrc	p15, 0, r1, c1, c0, 1 | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 471 | 	orr	r1, r1, #2		@ re-enable L2 cache | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 472 | 	mcr	p15, 0, r1, c1, c0, 1 | 
 | 473 | skipl2reen: | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 474 | 	mov	r1, #0 | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 475 | 	/* | 
 | 476 | 	 * Invalidate all instruction caches to PoU | 
 | 477 | 	 * and flush branch target cache | 
 | 478 | 	 */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 479 | 	mcr	p15, 0, r1, c7, c5, 0 | 
 | 480 |  | 
 | 481 | 	ldr	r4, scratchpad_base | 
 | 482 | 	ldr	r3, [r4,#0xBC] | 
| Tero Kristo | 79dcfdd | 2009-11-12 12:07:22 +0200 | [diff] [blame] | 483 | 	adds	r3, r3, #16 | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 484 |  | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 485 | 	ldmia	r3!, {r4-r6} | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 486 | 	mov	sp, r4			@ Restore sp | 
 | 487 | 	msr	spsr_cxsf, r5		@ Restore spsr | 
 | 488 | 	mov	lr, r6			@ Restore lr | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 489 |  | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 490 | 	ldmia	r3!, {r4-r7} | 
 | 491 | 	mcr	p15, 0, r4, c1, c0, 2	@ Coprocessor access Control Register | 
 | 492 | 	mcr	p15, 0, r5, c2, c0, 0	@ TTBR0 | 
 | 493 | 	mcr	p15, 0, r6, c2, c0, 1	@ TTBR1 | 
 | 494 | 	mcr	p15, 0, r7, c2, c0, 2	@ TTBCR | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 495 |  | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 496 | 	ldmia	r3!,{r4-r6} | 
 | 497 | 	mcr	p15, 0, r4, c3, c0, 0	@ Domain access Control Register | 
 | 498 | 	mcr	p15, 0, r5, c10, c2, 0	@ PRRR | 
 | 499 | 	mcr	p15, 0, r6, c10, c2, 1	@ NMRR | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 500 |  | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 501 |  | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 502 | 	ldmia	r3!,{r4-r7} | 
| Santosh Shilimkar | 46f557c | 2011-01-23 21:37:03 +0530 | [diff] [blame] | 503 | 	mcr	p15, 0, r4, c13, c0, 1	@ Context ID | 
 | 504 | 	mcr	p15, 0, r5, c13, c0, 2	@ User r/w thread and process ID | 
 | 505 | 	mrc	p15, 0, r6, c12, c0, 0	@ Secure or NS vector base address | 
 | 506 | 	msr	cpsr, r7		@ store cpsr | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 507 |  | 
 | 508 | 	/* Enabling MMU here */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 509 | 	mrc	p15, 0, r7, c2, c0, 2 	@ Read TTBRControl | 
 | 510 | 	/* Extract N (0:2) bits and decide whether to use TTBR0 or TTBR1 */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 511 | 	and	r7, #0x7 | 
 | 512 | 	cmp	r7, #0x0 | 
 | 513 | 	beq	usettbr0 | 
 | 514 | ttbr_error: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 515 | 	/* | 
 | 516 | 	 * More work needs to be done to support N[0:2] value other than 0 | 
 | 517 | 	 * So looping here so that the error can be detected | 
 | 518 | 	 */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 519 | 	b	ttbr_error | 
 | 520 | usettbr0: | 
 | 521 | 	mrc	p15, 0, r2, c2, c0, 0 | 
 | 522 | 	ldr	r5, ttbrbit_mask | 
 | 523 | 	and	r2, r5 | 
 | 524 | 	mov	r4, pc | 
 | 525 | 	ldr	r5, table_index_mask | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 526 | 	and	r4, r5			@ r4 = 31 to 20 bits of pc | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 527 | 	/* Extract the value to be written to table entry */ | 
 | 528 | 	ldr	r1, table_entry | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 529 | 	/* r1 has the value to be written to table entry*/ | 
 | 530 | 	add	r1, r1, r4 | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 531 | 	/* Getting the address of table entry to modify */ | 
 | 532 | 	lsr	r4, #18 | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 533 | 	/* r2 has the location which needs to be modified */ | 
 | 534 | 	add	r2, r4 | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 535 | 	/* Storing previous entry of location being modified */ | 
 | 536 | 	ldr	r5, scratchpad_base | 
 | 537 | 	ldr	r4, [r2] | 
 | 538 | 	str	r4, [r5, #0xC0] | 
 | 539 | 	/* Modify the table entry */ | 
 | 540 | 	str	r1, [r2] | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 541 | 	/* | 
 | 542 | 	 * Storing address of entry being modified | 
 | 543 | 	 * - will be restored after enabling MMU | 
 | 544 | 	 */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 545 | 	ldr	r5, scratchpad_base | 
 | 546 | 	str	r2, [r5, #0xC4] | 
 | 547 |  | 
 | 548 | 	mov	r0, #0 | 
 | 549 | 	mcr	p15, 0, r0, c7, c5, 4	@ Flush prefetch buffer | 
 | 550 | 	mcr	p15, 0, r0, c7, c5, 6	@ Invalidate branch predictor array | 
 | 551 | 	mcr	p15, 0, r0, c8, c5, 0	@ Invalidate instruction TLB | 
 | 552 | 	mcr	p15, 0, r0, c8, c6, 0	@ Invalidate data TLB | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 553 | 	/* | 
 | 554 | 	 * Restore control register. This enables the MMU. | 
 | 555 | 	 * The caches and prediction are not enabled here, they | 
 | 556 | 	 * will be enabled after restoring the MMU table entry. | 
 | 557 | 	 */ | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 558 | 	ldmia	r3!, {r4} | 
 | 559 | 	/* Store previous value of control register in scratchpad */ | 
 | 560 | 	str	r4, [r5, #0xC8] | 
 | 561 | 	ldr	r2, cache_pred_disable_mask | 
 | 562 | 	and	r4, r2 | 
 | 563 | 	mcr	p15, 0, r4, c1, c0, 0 | 
| Santosh Shilimkar | 8409d57 | 2011-01-23 16:04:39 +0530 | [diff] [blame] | 564 | 	dsb | 
 | 565 | 	isb | 
 | 566 | 	ldr     r0, =restoremmu_on | 
 | 567 | 	bx      r0 | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 568 |  | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 569 | /* | 
 | 570 |  * ============================== | 
 | 571 |  * == Exit point from OFF mode == | 
 | 572 |  * ============================== | 
 | 573 |  */ | 
| Santosh Shilimkar | 8409d57 | 2011-01-23 16:04:39 +0530 | [diff] [blame] | 574 | restoremmu_on: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 575 | 	ldmfd	sp!, {r0-r12, pc}	@ restore regs and return | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 576 |  | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 577 |  | 
 | 578 | /* | 
 | 579 |  * Internal functions | 
 | 580 |  */ | 
 | 581 |  | 
| Jean Pihet | 8352129 | 2010-12-18 16:44:46 +0100 | [diff] [blame] | 582 | /* This function implements the erratum ID i443 WA, applies to 34xx >= ES3.0 */ | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 583 | 	.text | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 584 | 	.align	3 | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 585 | ENTRY(es3_sdrc_fix) | 
 | 586 | 	ldr	r4, sdrc_syscfg		@ get config addr | 
 | 587 | 	ldr	r5, [r4]		@ get value | 
 | 588 | 	tst	r5, #0x100		@ is part access blocked | 
 | 589 | 	it	eq | 
 | 590 | 	biceq	r5, r5, #0x100		@ clear bit if set | 
 | 591 | 	str	r5, [r4]		@ write back change | 
 | 592 | 	ldr	r4, sdrc_mr_0		@ get config addr | 
 | 593 | 	ldr	r5, [r4]		@ get value | 
 | 594 | 	str	r5, [r4]		@ write back change | 
 | 595 | 	ldr	r4, sdrc_emr2_0		@ get config addr | 
 | 596 | 	ldr	r5, [r4]		@ get value | 
 | 597 | 	str	r5, [r4]		@ write back change | 
 | 598 | 	ldr	r4, sdrc_manual_0	@ get config addr | 
 | 599 | 	mov	r5, #0x2		@ autorefresh command | 
 | 600 | 	str	r5, [r4]		@ kick off refreshes | 
 | 601 | 	ldr	r4, sdrc_mr_1		@ get config addr | 
 | 602 | 	ldr	r5, [r4]		@ get value | 
 | 603 | 	str	r5, [r4]		@ write back change | 
 | 604 | 	ldr	r4, sdrc_emr2_1		@ get config addr | 
 | 605 | 	ldr	r5, [r4]		@ get value | 
 | 606 | 	str	r5, [r4]		@ write back change | 
 | 607 | 	ldr	r4, sdrc_manual_1	@ get config addr | 
 | 608 | 	mov	r5, #0x2		@ autorefresh command | 
 | 609 | 	str	r5, [r4]		@ kick off refreshes | 
 | 610 | 	bx	lr | 
 | 611 |  | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 612 | 	.align | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 613 | sdrc_syscfg: | 
 | 614 | 	.word	SDRC_SYSCONFIG_P | 
 | 615 | sdrc_mr_0: | 
 | 616 | 	.word	SDRC_MR_0_P | 
 | 617 | sdrc_emr2_0: | 
 | 618 | 	.word	SDRC_EMR2_0_P | 
 | 619 | sdrc_manual_0: | 
 | 620 | 	.word	SDRC_MANUAL_0_P | 
 | 621 | sdrc_mr_1: | 
 | 622 | 	.word	SDRC_MR_1_P | 
 | 623 | sdrc_emr2_1: | 
 | 624 | 	.word	SDRC_EMR2_1_P | 
 | 625 | sdrc_manual_1: | 
 | 626 | 	.word	SDRC_MANUAL_1_P | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 627 | ENDPROC(es3_sdrc_fix) | 
| Jean Pihet | 1e81bc0 | 2010-12-18 16:44:44 +0100 | [diff] [blame] | 628 | ENTRY(es3_sdrc_fix_sz) | 
 | 629 | 	.word	. - es3_sdrc_fix | 
 | 630 |  | 
| Jean Pihet | 8352129 | 2010-12-18 16:44:46 +0100 | [diff] [blame] | 631 | /* | 
 | 632 |  * This function implements the erratum ID i581 WA: | 
 | 633 |  *  SDRC state restore before accessing the SDRAM | 
 | 634 |  * | 
 | 635 |  * Only used at return from non-OFF mode. For OFF | 
 | 636 |  * mode the ROM code configures the SDRC and | 
 | 637 |  * the DPLL before calling the restore code directly | 
 | 638 |  * from DDR. | 
 | 639 |  */ | 
 | 640 |  | 
| Peter 'p2' De Schrijver | 89139dc | 2009-01-16 18:53:48 +0200 | [diff] [blame] | 641 | /* Make sure SDRC accesses are ok */ | 
 | 642 | wait_sdrc_ok: | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 643 |  | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 644 | /* DPLL3 must be locked before accessing the SDRC. Maybe the HW ensures this */ | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 645 | 	ldr	r4, cm_idlest_ckgen | 
 | 646 | wait_dpll3_lock: | 
 | 647 | 	ldr	r5, [r4] | 
 | 648 | 	tst	r5, #1 | 
 | 649 | 	beq	wait_dpll3_lock | 
 | 650 |  | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 651 | 	ldr	r4, cm_idlest1_core | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 652 | wait_sdrc_ready: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 653 | 	ldr	r5, [r4] | 
 | 654 | 	tst	r5, #0x2 | 
 | 655 | 	bne	wait_sdrc_ready | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 656 | 	/* allow DLL powerdown upon hw idle req */ | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 657 | 	ldr	r4, sdrc_power | 
 | 658 | 	ldr	r5, [r4] | 
 | 659 | 	bic	r5, r5, #0x40 | 
 | 660 | 	str	r5, [r4] | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 661 |  | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 662 | /* | 
 | 663 |  * PC-relative stores lead to undefined behaviour in Thumb-2: use a r7 as a | 
 | 664 |  * base instead. | 
 | 665 |  * Be careful not to clobber r7 when maintaing this code. | 
 | 666 |  */ | 
 | 667 |  | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 668 | is_dll_in_lock_mode: | 
 | 669 | 	/* Is dll in lock mode? */ | 
 | 670 | 	ldr	r4, sdrc_dlla_ctrl | 
 | 671 | 	ldr	r5, [r4] | 
 | 672 | 	tst	r5, #0x4 | 
 | 673 | 	bxne	lr			@ Return if locked | 
 | 674 | 	/* wait till dll locks */ | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 675 | 	adr	r7, kick_counter | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 676 | wait_dll_lock_timed: | 
 | 677 | 	ldr	r4, wait_dll_lock_counter | 
 | 678 | 	add	r4, r4, #1 | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 679 | 	str	r4, [r7, #wait_dll_lock_counter - kick_counter] | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 680 | 	ldr	r4, sdrc_dlla_status | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 681 | 	/* Wait 20uS for lock */ | 
 | 682 | 	mov	r6, #8 | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 683 | wait_dll_lock: | 
 | 684 | 	subs	r6, r6, #0x1 | 
 | 685 | 	beq	kick_dll | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 686 | 	ldr	r5, [r4] | 
 | 687 | 	and	r5, r5, #0x4 | 
 | 688 | 	cmp	r5, #0x4 | 
 | 689 | 	bne	wait_dll_lock | 
 | 690 | 	bx	lr			@ Return when locked | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 691 |  | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 692 | 	/* disable/reenable DLL if not locked */ | 
 | 693 | kick_dll: | 
 | 694 | 	ldr	r4, sdrc_dlla_ctrl | 
 | 695 | 	ldr	r5, [r4] | 
 | 696 | 	mov	r6, r5 | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 697 | 	bic	r6, #(1<<3)		@ disable dll | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 698 | 	str	r6, [r4] | 
 | 699 | 	dsb | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 700 | 	orr	r6, r6, #(1<<3)		@ enable dll | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 701 | 	str	r6, [r4] | 
 | 702 | 	dsb | 
 | 703 | 	ldr	r4, kick_counter | 
 | 704 | 	add	r4, r4, #1 | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 705 | 	str	r4, [r7]		@ kick_counter | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 706 | 	b	wait_dll_lock_timed | 
 | 707 |  | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 708 | 	.align | 
| Peter 'p2' De Schrijver | 89139dc | 2009-01-16 18:53:48 +0200 | [diff] [blame] | 709 | cm_idlest1_core: | 
 | 710 | 	.word	CM_IDLEST1_CORE_V | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 711 | cm_idlest_ckgen: | 
 | 712 | 	.word	CM_IDLEST_CKGEN_V | 
| Peter 'p2' De Schrijver | 89139dc | 2009-01-16 18:53:48 +0200 | [diff] [blame] | 713 | sdrc_dlla_status: | 
 | 714 | 	.word	SDRC_DLLA_STATUS_V | 
 | 715 | sdrc_dlla_ctrl: | 
 | 716 | 	.word	SDRC_DLLA_CTRL_V | 
| Tero Kristo | 0795a75 | 2008-10-13 17:58:50 +0300 | [diff] [blame] | 717 | pm_prepwstst_core_p: | 
 | 718 | 	.word	PM_PREPWSTST_CORE_P | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 719 | pm_pwstctrl_mpu: | 
 | 720 | 	.word	PM_PWSTCTRL_MPU_P | 
 | 721 | scratchpad_base: | 
 | 722 | 	.word	SCRATCHPAD_BASE_P | 
| Tero Kristo | 0795a75 | 2008-10-13 17:58:50 +0300 | [diff] [blame] | 723 | sram_base: | 
 | 724 | 	.word	SRAM_BASE_P + 0x8000 | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 725 | sdrc_power: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 726 | 	.word	SDRC_POWER_V | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 727 | ttbrbit_mask: | 
 | 728 | 	.word	0xFFFFC000 | 
 | 729 | table_index_mask: | 
 | 730 | 	.word	0xFFF00000 | 
 | 731 | table_entry: | 
 | 732 | 	.word	0x00000C02 | 
 | 733 | cache_pred_disable_mask: | 
 | 734 | 	.word	0xFFFFE7FB | 
| Tero Kristo | 27d59a4 | 2008-10-13 13:15:00 +0300 | [diff] [blame] | 735 | control_stat: | 
 | 736 | 	.word	CONTROL_STAT | 
| Nishanth Menon | 458e999 | 2010-12-20 14:05:06 -0600 | [diff] [blame] | 737 | control_mem_rta: | 
 | 738 | 	.word	CONTROL_MEM_RTA_CTRL | 
| Richard Woodruff | 0bd4053 | 2010-12-20 14:05:03 -0600 | [diff] [blame] | 739 | kernel_flush: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 740 | 	.word	v7_flush_dcache_all | 
| Peter 'p2' De Schrijver | c4236d2 | 2010-12-20 14:05:07 -0600 | [diff] [blame] | 741 | l2dis_3630: | 
| Jean Pihet | bb1c903 | 2010-12-18 16:49:57 +0100 | [diff] [blame] | 742 | 	.word	0 | 
| Peter 'p2' De Schrijver | 9d93b8a2 | 2010-12-20 14:05:04 -0600 | [diff] [blame] | 743 | 	/* | 
 | 744 | 	 * When exporting to userspace while the counters are in SRAM, | 
 | 745 | 	 * these 2 words need to be at the end to facilitate retrival! | 
 | 746 | 	 */ | 
 | 747 | kick_counter: | 
 | 748 | 	.word	0 | 
 | 749 | wait_dll_lock_counter: | 
 | 750 | 	.word	0 | 
| Dave Martin | dd31394 | 2011-03-04 15:33:57 +0000 | [diff] [blame] | 751 | ENDPROC(omap34xx_cpu_suspend) | 
| Jean Pihet | f7dfe3d | 2010-12-18 16:44:45 +0100 | [diff] [blame] | 752 |  | 
| Kevin Hilman | 8bd2294 | 2009-05-28 10:56:16 -0700 | [diff] [blame] | 753 | ENTRY(omap34xx_cpu_suspend_sz) | 
 | 754 | 	.word	. - omap34xx_cpu_suspend |