mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-26 22:11:49 +01:00 
			
		
		
		
	Add the SMC code and operation for trace on errors. Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com> Acked-by: Patrice Chotard <patrice.chotard@st.com>
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
 | |
| /*
 | |
|  * Copyright (C) 2019, STMicroelectronics - All Rights Reserved
 | |
|  */
 | |
| 
 | |
| #ifndef __STM32MP1_SMC_H__
 | |
| #define __STM32MP1_SMC_H__
 | |
| 
 | |
| #include <linux/arm-smccc.h>
 | |
| 
 | |
| /*
 | |
|  * SMC function IDs for STM32 Service queries
 | |
|  * STM32 SMC services use the space between 0x82000000 and 0x8200FFFF
 | |
|  * like this is defined in SMC calling Convention by ARM
 | |
|  * for SiP (silicon Partner)
 | |
|  * http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
 | |
|  */
 | |
| #define STM32_SMC_VERSION		0x82000000
 | |
| 
 | |
| /* Secure Service access from Non-secure */
 | |
| #define STM32_SMC_BSEC			0x82001003
 | |
| 
 | |
| /* Service for BSEC */
 | |
| #define STM32_SMC_READ_SHADOW		0x01
 | |
| #define STM32_SMC_PROG_OTP		0x02
 | |
| #define STM32_SMC_WRITE_SHADOW		0x03
 | |
| #define STM32_SMC_READ_OTP		0x04
 | |
| #define STM32_SMC_READ_ALL		0x05
 | |
| #define STM32_SMC_WRITE_ALL		0x06
 | |
| #define STM32_SMC_WRLOCK_OTP		0x07
 | |
| 
 | |
| /* SMC error codes */
 | |
| #define STM32_SMC_OK			0x0
 | |
| #define STM32_SMC_NOT_SUPPORTED		-1
 | |
| #define STM32_SMC_FAILED		-2
 | |
| #define STM32_SMC_INVALID_PARAMS	-3
 | |
| 
 | |
| #define stm32_smc_exec(svc, op, data1, data2) \
 | |
| 	stm32_smc(svc, op, data1, data2, NULL)
 | |
| 
 | |
| #ifdef CONFIG_ARM_SMCCC
 | |
| static inline u32 stm32_smc(u32 svc, u8 op, u32 data1, u32 data2, u32 *result)
 | |
| {
 | |
| 	struct arm_smccc_res res;
 | |
| 
 | |
| 	arm_smccc_smc(svc, op, data1, data2, 0, 0, 0, 0, &res);
 | |
| 
 | |
| 	if (res.a0) {
 | |
| 		pr_err("%s: Failed to exec svc=%x op=%x in secure mode (err = %ld)\n",
 | |
| 		       __func__, svc, op, res.a0);
 | |
| 		return -EINVAL;
 | |
| 	}
 | |
| 	if (result)
 | |
| 		*result = (u32)res.a1;
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| #else
 | |
| static inline u32 stm32_smc(u32 svc, u8 op, u32 data1, u32 data2, u32 *result)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* __STM32MP1_SMC_H__ */
 |