xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h (revision a47be44dca4e168635e6f4dd8302a2cac0aa3495)
1f270a3f8SJoseph Chen /*
2f270a3f8SJoseph Chen  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3f270a3f8SJoseph Chen  *
4f270a3f8SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
5f270a3f8SJoseph Chen  */
6f270a3f8SJoseph Chen 
7f270a3f8SJoseph Chen #ifndef __ROCKCHIP_SMCCC_H__
8f270a3f8SJoseph Chen #define __ROCKCHIP_SMCCC_H__
9f270a3f8SJoseph Chen 
1094001eb0SJoseph Chen #include <linux/arm-smccc.h>
1194001eb0SJoseph Chen 
125f048e57SJoseph Chen /* Rockchip platform SiP call ID */
135f048e57SJoseph Chen #define SIP_ATF_VERSION			0x82000001
145f048e57SJoseph Chen #define SIP_ACCESS_REG			0x82000002
155f048e57SJoseph Chen #define SIP_SUSPEND_MODE		0x82000003
165f048e57SJoseph Chen #define SIP_PENDING_CPUS		0x82000004
175f048e57SJoseph Chen #define SIP_UARTDBG_CFG			0x82000005
185f048e57SJoseph Chen #define SIP_UARTDBG_CFG64		0xc2000005
195f048e57SJoseph Chen #define SIP_MCU_EL3FIQ_CFG		0x82000006
205f048e57SJoseph Chen #define SIP_ACCESS_CHIP_STATE64		0xc2000006
215f048e57SJoseph Chen #define SIP_SECURE_MEM_CONFIG		0x82000007
225f048e57SJoseph Chen #define SIP_ACCESS_CHIP_EXTRA_STATE64	0xc2000007
235f048e57SJoseph Chen #define SIP_DRAM_CONFIG			0x82000008
245f048e57SJoseph Chen #define SIP_SHARE_MEM			0x82000009
255f048e57SJoseph Chen #define SIP_SIP_VERSION			0x8200000a
265f048e57SJoseph Chen #define SIP_REMOTECTL_CFG		0x8200000b
275716d343SJoseph Chen #define SIP_VPU_RESET			0x8200000c
285716d343SJoseph Chen #define SIP_SOC_BUS_DIV			0x8200000d
295716d343SJoseph Chen #define SIP_LAST_LOG			0x8200000e
30*a47be44dSXiaoDong Huang #define SIP_ACCESS_MEM_OS_REG		0x8200000f
31c3e08fa0SJoseph Chen #define SIP_AMP_CFG			0x82000022
32b4fd97a6SJoseph Chen #define SIP_HDCP_CONFIG			0x82000025
33de205739Sshengfei Xu #define SIP_MCU_CFG			0x82000028
345f048e57SJoseph Chen 
3516a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_INIT		0x00
3616a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE	0x01
3716a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE	0x02
3816a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_SET_AT_SR	0x03
3916a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_GET_BW		0x04
4016a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE	0x05
4116a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ	0x06
4216a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM	0x07
4316a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION	0x08
447c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_POST_SET_RATE	0x09
457c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_SET_NOC_RL	0x0a
467c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_DEBUG		0x0b
477c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_MCU_START	0x0c
487c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_ECC		0x0d
497c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_GET_FREQ_INFO	0x0e
507c9f74b3SYouMin Chen #define ROCKCHIP_SIP_CONFIG_DRAM_FSP_INIT	0x0f
5116a92a42STang Yun ping 
52*a47be44dSXiaoDong Huang /* SIP_ACCESS_MEM_OS_REG child configs */
53*a47be44dSXiaoDong Huang enum {
54*a47be44dSXiaoDong Huang 	RK_MEM_OS_REG_READ = 0,
55*a47be44dSXiaoDong Huang 	RK_MEM_OS_REG_WRITE,
56*a47be44dSXiaoDong Huang };
57*a47be44dSXiaoDong Huang 
58de205739Sshengfei Xu /* RK_SIP_MCU_CFG child configs, MCU ID */
59de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID		0x00
60de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_BUSMCU_1_ID		0x01
61de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_PMUMCU_0_ID		0x10
62de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_DDRMCU_0_ID		0x20
63de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_NPUMCU_0_ID		0x30
64de205739Sshengfei Xu 
65de205739Sshengfei Xu /* RK_SIP_MCU_CFG child configs */
66de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR		0x01
67de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR	0x02
68de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_MCU_SRAM_START_ADDR		0x03
69de205739Sshengfei Xu #define ROCKCHIP_SIP_CONFIG_MCU_EXSRAM_START_ADDR	0x04
70de205739Sshengfei Xu 
715f048e57SJoseph Chen /* Rockchip Sip version */
725f048e57SJoseph Chen #define SIP_IMPLEMENT_V1                (1)
735f048e57SJoseph Chen #define SIP_IMPLEMENT_V2                (2)
745f048e57SJoseph Chen 
755f048e57SJoseph Chen /* Error return code */
765f048e57SJoseph Chen #define IS_SIP_ERROR(x)			(!!(x))
775f048e57SJoseph Chen 
785f048e57SJoseph Chen #define SIP_RET_SUCCESS			0
795f048e57SJoseph Chen #define SIP_RET_SMC_UNKNOWN		-1
805f048e57SJoseph Chen #define SIP_RET_NOT_SUPPORTED		-2
815f048e57SJoseph Chen #define SIP_RET_INVALID_PARAMS		-3
825f048e57SJoseph Chen #define SIP_RET_INVALID_ADDRESS		-4
835f048e57SJoseph Chen #define SIP_RET_DENIED			-5
845f048e57SJoseph Chen 
855f048e57SJoseph Chen /* SIP_ACCESS_REG: read or write */
865f048e57SJoseph Chen #define SECURE_REG_RD			0x0
875f048e57SJoseph Chen #define SECURE_REG_WR			0x1
885f048e57SJoseph Chen 
89c3e08fa0SJoseph Chen /* SIP_AMP_CFG */
90c3e08fa0SJoseph Chen #define AMP_PE_STATE			0x0
915a7f594fSJoseph Chen #define AMP_BOOT_ARG01			0x1
925a7f594fSJoseph Chen #define AMP_BOOT_ARG23			0x2
93c3e08fa0SJoseph Chen 
945f048e57SJoseph Chen /* Share mem page types */
955f048e57SJoseph Chen typedef enum {
965f048e57SJoseph Chen 	SHARE_PAGE_TYPE_INVALID = 0,
975f048e57SJoseph Chen 	SHARE_PAGE_TYPE_UARTDBG,
985f048e57SJoseph Chen 	SHARE_PAGE_TYPE_DDR,
997c9f74b3SYouMin Chen 	SHARE_PAGE_TYPE_DDRDBG,
1007c9f74b3SYouMin Chen 	SHARE_PAGE_TYPE_DDRECC,
1017c9f74b3SYouMin Chen 	SHARE_PAGE_TYPE_DDRFSP,
102b4fd97a6SJoseph Chen 	SHARE_PAGE_TYPE_DDR_ADDRMAP,
1037c9f74b3SYouMin Chen 	SHARE_PAGE_TYPE_LAST_LOG,
104b4fd97a6SJoseph Chen 	SHARE_PAGE_TYPE_HDCP,
105cdfefc99SXiaoDong Huang 	SHARE_PAGE_TYPE_SLEEP,
1065f048e57SJoseph Chen 	SHARE_PAGE_TYPE_MAX,
1075f048e57SJoseph Chen } share_page_type_t;
1085f048e57SJoseph Chen 
109b4fd97a6SJoseph Chen /* hdcp config func */
110b4fd97a6SJoseph Chen typedef enum {
111b4fd97a6SJoseph Chen 	HDCP_FUNC_STORAGE_ENCRYPT = 1,
112b4fd97a6SJoseph Chen 	HDCP_FUNC_KEY_DECRYPT,
113b4fd97a6SJoseph Chen 	HDCP_FUNC_KEY_LOAD,
114b4fd97a6SJoseph Chen 	HDCP_FUNC_ENCRYPT_MODE
115b4fd97a6SJoseph Chen } sip_hdcp_func_t;
116b4fd97a6SJoseph Chen 
117ac374906SJoseph Chen /*
118ac374906SJoseph Chen  * sip_smc_set_suspend_mode() - Set U-Boot system suspend state before trap to trust.
119ac374906SJoseph Chen  *
120ac374906SJoseph Chen  * see kernel-4.4: drivers/soc/rockchip/rockchip_pm_config.c
121ac374906SJoseph Chen  */
122f270a3f8SJoseph Chen int sip_smc_set_suspend_mode(unsigned long ctrl,
123f270a3f8SJoseph Chen 			     unsigned long config1,
124f270a3f8SJoseph Chen 			     unsigned long config2);
1255f048e57SJoseph Chen 
1266ea21705SWeixin Zhou int sip_smc_remotectl_config(unsigned long func, unsigned long data);
1276ea21705SWeixin Zhou 
128ac374906SJoseph Chen /*
129*a47be44dSXiaoDong Huang  * sip_smc_access_mem_os_reg() - access mem os reg
130*a47be44dSXiaoDong Huang  */
131*a47be44dSXiaoDong Huang int sip_smc_access_mem_os_reg(unsigned long func, unsigned long id,
132*a47be44dSXiaoDong Huang 			      unsigned long *val);
133*a47be44dSXiaoDong Huang 
134*a47be44dSXiaoDong Huang /*
135c3e08fa0SJoseph Chen  * sip_smc_amp_cfg() - config AMP
136c3e08fa0SJoseph Chen  */
1375a7f594fSJoseph Chen int sip_smc_amp_cfg(unsigned long func, unsigned long arg0, unsigned long arg1,
1385a7f594fSJoseph Chen 		    unsigned long arg2);
139c3e08fa0SJoseph Chen 
140c3e08fa0SJoseph Chen /*
141ac374906SJoseph Chen  * sip_smc_dram() - Set dram configure for trust.
142ac374906SJoseph Chen  *
143ac374906SJoseph Chen  * see: ./drivers/ram/rockchip/rockchip_dmc.c
144ac374906SJoseph Chen  */
1455f048e57SJoseph Chen struct arm_smccc_res sip_smc_dram(unsigned long arg0,
1465f048e57SJoseph Chen 				  unsigned long arg1,
1475f048e57SJoseph Chen 				  unsigned long arg2);
1485f048e57SJoseph Chen 
149ac374906SJoseph Chen /*
150ac374906SJoseph Chen  * sip_smc_request_share_mem() - Request share memory from trust.
151ac374906SJoseph Chen  *
152ac374906SJoseph Chen  * @page_num:	page numbers
153ac374906SJoseph Chen  * @page_type:  page type, see: share_page_type_t
154ac374906SJoseph Chen  *
155ac374906SJoseph Chen  * @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
156ac374906SJoseph Chen  *  share memory base address), otherwise failed.
157ac374906SJoseph Chen  */
1585f048e57SJoseph Chen struct arm_smccc_res sip_smc_request_share_mem(unsigned long page_num,
1595f048e57SJoseph Chen 					       share_page_type_t page_type);
1605f048e57SJoseph Chen 
161ac374906SJoseph Chen /*
162ac374906SJoseph Chen  * sip_smc_secure_reg_read() - Read secure info(ddr/register...) from trust.
163ac374906SJoseph Chen  *
164ac374906SJoseph Chen  * @addr_phy:	address to read
165ac374906SJoseph Chen  *
166ac374906SJoseph Chen  * @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
167ac374906SJoseph Chen  *  valid data), otherwise failed.
168ac374906SJoseph Chen  */
169ac374906SJoseph Chen struct arm_smccc_res sip_smc_secure_reg_read(unsigned long addr_phy);
170ac374906SJoseph Chen 
171ac374906SJoseph Chen /*
172ac374906SJoseph Chen  * sip_smc_secure_reg_write() - Write data to trust secure info(ddr/register...).
173ac374906SJoseph Chen  *
174ac374906SJoseph Chen  * @addr_phy:	address to write
175ac374906SJoseph Chen  * @val:	value to write
176ac374906SJoseph Chen  *
177ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
178ac374906SJoseph Chen  */
179ac374906SJoseph Chen int sip_smc_secure_reg_write(unsigned long addr_phy, unsigned long val);
180ac374906SJoseph Chen 
181ac374906SJoseph Chen /*
182ac374906SJoseph Chen  * sip_smc_set_sip_version() - Set sip version to trust.
183ac374906SJoseph Chen  *
184ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
185ac374906SJoseph Chen  */
1865f048e57SJoseph Chen int sip_smc_set_sip_version(unsigned long version);
187ac374906SJoseph Chen 
188ac374906SJoseph Chen /*
189ac374906SJoseph Chen  * sip_smc_get_sip_version() - Get sip version to trust.
190ac374906SJoseph Chen  *
191ac374906SJoseph Chen  * @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
192ac374906SJoseph Chen  *  sip version), otherwise failed.
193ac374906SJoseph Chen  */
1945f048e57SJoseph Chen struct arm_smccc_res sip_smc_get_sip_version(void);
195ac374906SJoseph Chen 
196ac374906SJoseph Chen /*
197b4fd97a6SJoseph Chen  * sip_smc_hdcp_config() - handle hdcp.
198b4fd97a6SJoseph Chen  *
199b4fd97a6SJoseph Chen  * @return  0 on success, otherwise failed.
200b4fd97a6SJoseph Chen  */
201b4fd97a6SJoseph Chen int sip_smc_hdcp_config(unsigned long func,
202b4fd97a6SJoseph Chen 			unsigned long arg1, unsigned long arg2);
203b4fd97a6SJoseph Chen 
204b4fd97a6SJoseph Chen /*
205de205739Sshengfei Xu  * sip_smc_mcu_config() - handle mcu.
206de205739Sshengfei Xu  *
207de205739Sshengfei Xu  * @return  0 on success, otherwise failed.
208de205739Sshengfei Xu  */
209de205739Sshengfei Xu int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2);
210de205739Sshengfei Xu 
211de205739Sshengfei Xu /*
212ac374906SJoseph Chen  * psci_cpu_on() - Standard ARM PSCI cpu on call.
213ac374906SJoseph Chen  *
214ac374906SJoseph Chen  * @cpuid:		cpu id
215ac374906SJoseph Chen  * @entry_point:	boot entry point
216ac374906SJoseph Chen  *
217ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
218ac374906SJoseph Chen  */
219e2bc9ab6SLin Huang int psci_cpu_on(unsigned long cpuid, unsigned long entry_point);
2205f048e57SJoseph Chen 
2212003c631SJoseph Chen /*
2222003c631SJoseph Chen  * psci_cpu_off() - Standard ARM PSCI cpu off call.
2232003c631SJoseph Chen  *
2242003c631SJoseph Chen  * @state:		dummy, set 0 by default.
2252003c631SJoseph Chen  *
2262003c631SJoseph Chen  * @return 0 on success, otherwise failed.
2272003c631SJoseph Chen  */
2282003c631SJoseph Chen int psci_cpu_off(uint32_t state);
2292003c631SJoseph Chen 
230164b2a33SJoseph Chen #ifdef CONFIG_ARM_CPU_SUSPEND
231ac374906SJoseph Chen /*
232ac374906SJoseph Chen  * psci_system_suspend() - Standard ARM PSCI system suspend call.
233ac374906SJoseph Chen  *
234ac374906SJoseph Chen  * @unused:		unused now, always 0 recommend
235ac374906SJoseph Chen  *
236ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
237ac374906SJoseph Chen  */
238ac374906SJoseph Chen int psci_system_suspend(unsigned long unused);
239164b2a33SJoseph Chen #endif
240ac374906SJoseph Chen 
241f270a3f8SJoseph Chen #endif
242