mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ARM: OMAP2+: Fix SRAM virt to phys translation for save_secure_ram_context
With the CMA changes from Joonsoo Kim <iamjoonsoo.kim@lge.com>, it was noticed that n900 stopped booting. After investigating it turned out that n900 save_secure_ram_context does some whacky virtual to physical address translation for the SRAM data address. As we now only have minimal parts of omap3 idle code copied to SRAM, running save_secure_ram_context() in SRAM is not needed. It only gets called on PM init. And it seems there's no need to ever call this from SRAM idle code. So let's just keep save_secure_ram_context() in DDR, and pass it the physical address of the parameters. We can do everything else in omap-secure.c like we already do for other secure code. And since we don't have any documentation, I still have no clue what the values for 0, 1 and 1 for the parameters might be. If somebody has figured it out, please do send a patch to add some comments. Debugged-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
		
							parent
							
								
									4fbd8d194f
								
							
						
					
					
						commit
						d09220a887
					
				
					 5 changed files with 31 additions and 35 deletions
				
			
		| 
						 | 
					@ -73,6 +73,25 @@ phys_addr_t omap_secure_ram_mempool_base(void)
 | 
				
			||||||
	return omap_secure_memblock_base;
 | 
						return omap_secure_memblock_base;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					u32 omap3_save_secure_ram(void __iomem *addr, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 ret;
 | 
				
			||||||
 | 
						u32 param[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (size != OMAP3_SAVE_SECURE_RAM_SZ)
 | 
				
			||||||
 | 
							return OMAP3_SAVE_SECURE_RAM_SZ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						param[0] = 4;		/* Number of arguments */
 | 
				
			||||||
 | 
						param[1] = __pa(addr);	/* Physical address for saving */
 | 
				
			||||||
 | 
						param[2] = 0;
 | 
				
			||||||
 | 
						param[3] = 1;
 | 
				
			||||||
 | 
						param[4] = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = save_secure_ram_context(__pa(param));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * rx51_secure_dispatcher: Routine to dispatch secure PPA API calls
 | 
					 * rx51_secure_dispatcher: Routine to dispatch secure PPA API calls
 | 
				
			||||||
 * @idx: The PPA API index
 | 
					 * @idx: The PPA API index
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,8 @@
 | 
				
			||||||
/* Maximum Secure memory storage size */
 | 
					/* Maximum Secure memory storage size */
 | 
				
			||||||
#define OMAP_SECURE_RAM_STORAGE	(88 * SZ_1K)
 | 
					#define OMAP_SECURE_RAM_STORAGE	(88 * SZ_1K)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OMAP3_SAVE_SECURE_RAM_SZ	0x803F
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Secure low power HAL API index */
 | 
					/* Secure low power HAL API index */
 | 
				
			||||||
#define OMAP4_HAL_SAVESECURERAM_INDEX	0x1a
 | 
					#define OMAP4_HAL_SAVESECURERAM_INDEX	0x1a
 | 
				
			||||||
#define OMAP4_HAL_SAVEHW_INDEX		0x1b
 | 
					#define OMAP4_HAL_SAVEHW_INDEX		0x1b
 | 
				
			||||||
| 
						 | 
					@ -65,6 +67,8 @@ extern u32 omap_smc2(u32 id, u32 falg, u32 pargs);
 | 
				
			||||||
extern u32 omap_smc3(u32 id, u32 process, u32 flag, u32 pargs);
 | 
					extern u32 omap_smc3(u32 id, u32 process, u32 flag, u32 pargs);
 | 
				
			||||||
extern phys_addr_t omap_secure_ram_mempool_base(void);
 | 
					extern phys_addr_t omap_secure_ram_mempool_base(void);
 | 
				
			||||||
extern int omap_secure_ram_reserve_memblock(void);
 | 
					extern int omap_secure_ram_reserve_memblock(void);
 | 
				
			||||||
 | 
					extern u32 save_secure_ram_context(u32 args_pa);
 | 
				
			||||||
 | 
					extern u32 omap3_save_secure_ram(void __iomem *save_regs, int size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
 | 
					extern u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
 | 
				
			||||||
				  u32 arg1, u32 arg2, u32 arg3, u32 arg4);
 | 
									  u32 arg1, u32 arg2, u32 arg3, u32 arg4);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,10 +81,6 @@ extern unsigned int omap3_do_wfi_sz;
 | 
				
			||||||
/* ... and its pointer from SRAM after copy */
 | 
					/* ... and its pointer from SRAM after copy */
 | 
				
			||||||
extern void (*omap3_do_wfi_sram)(void);
 | 
					extern void (*omap3_do_wfi_sram)(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* save_secure_ram_context function pointer and size, for copy to SRAM */
 | 
					 | 
				
			||||||
extern int save_secure_ram_context(u32 *addr);
 | 
					 | 
				
			||||||
extern unsigned int save_secure_ram_context_sz;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern void omap3_save_scratchpad_contents(void);
 | 
					extern void omap3_save_scratchpad_contents(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PM_RTA_ERRATUM_i608		(1 << 0)
 | 
					#define PM_RTA_ERRATUM_i608		(1 << 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,7 @@
 | 
				
			||||||
#include "prm3xxx.h"
 | 
					#include "prm3xxx.h"
 | 
				
			||||||
#include "pm.h"
 | 
					#include "pm.h"
 | 
				
			||||||
#include "sdrc.h"
 | 
					#include "sdrc.h"
 | 
				
			||||||
 | 
					#include "omap-secure.h"
 | 
				
			||||||
#include "sram.h"
 | 
					#include "sram.h"
 | 
				
			||||||
#include "control.h"
 | 
					#include "control.h"
 | 
				
			||||||
#include "vc.h"
 | 
					#include "vc.h"
 | 
				
			||||||
| 
						 | 
					@ -66,7 +67,6 @@ struct power_state {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static LIST_HEAD(pwrst_list);
 | 
					static LIST_HEAD(pwrst_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int (*_omap_save_secure_sram)(u32 *addr);
 | 
					 | 
				
			||||||
void (*omap3_do_wfi_sram)(void);
 | 
					void (*omap3_do_wfi_sram)(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct powerdomain *mpu_pwrdm, *neon_pwrdm;
 | 
					static struct powerdomain *mpu_pwrdm, *neon_pwrdm;
 | 
				
			||||||
| 
						 | 
					@ -121,8 +121,8 @@ static void omap3_save_secure_ram_context(void)
 | 
				
			||||||
		 * will hang the system.
 | 
							 * will hang the system.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
 | 
							pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
 | 
				
			||||||
		ret = _omap_save_secure_sram((u32 *)(unsigned long)
 | 
							ret = omap3_save_secure_ram(omap3_secure_ram_storage,
 | 
				
			||||||
				__pa(omap3_secure_ram_storage));
 | 
										    OMAP3_SAVE_SECURE_RAM_SZ);
 | 
				
			||||||
		pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state);
 | 
							pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state);
 | 
				
			||||||
		/* Following is for error tracking, it should not happen */
 | 
							/* Following is for error tracking, it should not happen */
 | 
				
			||||||
		if (ret) {
 | 
							if (ret) {
 | 
				
			||||||
| 
						 | 
					@ -434,15 +434,10 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * The minimum set of functions is pushed to SRAM for execution:
 | 
					 * The minimum set of functions is pushed to SRAM for execution:
 | 
				
			||||||
 * - omap3_do_wfi for erratum i581 WA,
 | 
					 * - omap3_do_wfi for erratum i581 WA,
 | 
				
			||||||
 * - save_secure_ram_context for security extensions.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void omap_push_sram_idle(void)
 | 
					void omap_push_sram_idle(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	omap3_do_wfi_sram = omap_sram_push(omap3_do_wfi, omap3_do_wfi_sz);
 | 
						omap3_do_wfi_sram = omap_sram_push(omap3_do_wfi, omap3_do_wfi_sz);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (omap_type() != OMAP2_DEVICE_TYPE_GP)
 | 
					 | 
				
			||||||
		_omap_save_secure_sram = omap_sram_push(save_secure_ram_context,
 | 
					 | 
				
			||||||
				save_secure_ram_context_sz);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init pm_errata_configure(void)
 | 
					static void __init pm_errata_configure(void)
 | 
				
			||||||
| 
						 | 
					@ -553,7 +548,7 @@ int __init omap3_pm_init(void)
 | 
				
			||||||
	clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
 | 
						clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
 | 
				
			||||||
	if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
 | 
						if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
 | 
				
			||||||
		omap3_secure_ram_storage =
 | 
							omap3_secure_ram_storage =
 | 
				
			||||||
			kmalloc(0x803F, GFP_KERNEL);
 | 
								kmalloc(OMAP3_SAVE_SECURE_RAM_SZ, GFP_KERNEL);
 | 
				
			||||||
		if (!omap3_secure_ram_storage)
 | 
							if (!omap3_secure_ram_storage)
 | 
				
			||||||
			pr_err("Memory allocation failed when allocating for secure sram context\n");
 | 
								pr_err("Memory allocation failed when allocating for secure sram context\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,20 +93,13 @@ ENTRY(enable_omap3630_toggle_l2_on_restore)
 | 
				
			||||||
ENDPROC(enable_omap3630_toggle_l2_on_restore)
 | 
					ENDPROC(enable_omap3630_toggle_l2_on_restore)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Function to call rom code to save secure ram context. This gets
 | 
					 * Function to call rom code to save secure ram context.
 | 
				
			||||||
 * relocated to SRAM, so it can be all in .data section. Otherwise
 | 
					 *
 | 
				
			||||||
 * we need to initialize api_params separately.
 | 
					 * r0 = physical address of the parameters
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	.data
 | 
					 | 
				
			||||||
	.align	3
 | 
					 | 
				
			||||||
ENTRY(save_secure_ram_context)
 | 
					ENTRY(save_secure_ram_context)
 | 
				
			||||||
	stmfd	sp!, {r4 - r11, lr}	@ save registers on stack
 | 
						stmfd	sp!, {r4 - r11, lr}	@ save registers on stack
 | 
				
			||||||
	adr	r3, api_params		@ r3 points to parameters
 | 
						mov	r3, r0			@ physical address of parameters
 | 
				
			||||||
	str	r0, [r3,#0x4]		@ r0 has sdram address
 | 
					 | 
				
			||||||
	ldr	r12, high_mask
 | 
					 | 
				
			||||||
	and	r3, r3, r12
 | 
					 | 
				
			||||||
	ldr	r12, sram_phy_addr_mask
 | 
					 | 
				
			||||||
	orr	r3, r3, r12
 | 
					 | 
				
			||||||
	mov	r0, #25			@ set service ID for PPA
 | 
						mov	r0, #25			@ set service ID for PPA
 | 
				
			||||||
	mov	r12, r0			@ copy secure service ID in r12
 | 
						mov	r12, r0			@ copy secure service ID in r12
 | 
				
			||||||
	mov	r1, #0			@ set task id for ROM code in r1
 | 
						mov	r1, #0			@ set task id for ROM code in r1
 | 
				
			||||||
| 
						 | 
					@ -120,18 +113,7 @@ ENTRY(save_secure_ram_context)
 | 
				
			||||||
	nop
 | 
						nop
 | 
				
			||||||
	nop
 | 
						nop
 | 
				
			||||||
	ldmfd	sp!, {r4 - r11, pc}
 | 
						ldmfd	sp!, {r4 - r11, pc}
 | 
				
			||||||
	.align
 | 
					 | 
				
			||||||
sram_phy_addr_mask:
 | 
					 | 
				
			||||||
	.word	SRAM_BASE_P
 | 
					 | 
				
			||||||
high_mask:
 | 
					 | 
				
			||||||
	.word	0xffff
 | 
					 | 
				
			||||||
api_params:
 | 
					 | 
				
			||||||
	.word	0x4, 0x0, 0x0, 0x1, 0x1
 | 
					 | 
				
			||||||
ENDPROC(save_secure_ram_context)
 | 
					ENDPROC(save_secure_ram_context)
 | 
				
			||||||
ENTRY(save_secure_ram_context_sz)
 | 
					 | 
				
			||||||
	.word	. - save_secure_ram_context
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.text
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * ======================
 | 
					 * ======================
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue