xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h (revision c3e08fa050aa3e8eb31fbd76f4d1e28c00ffe0b4)
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*c3e08fa0SJoseph Chen #define SIP_AMP_CFG			0x82000022
315f048e57SJoseph Chen 
3216a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_INIT		0x00
3316a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE	0x01
3416a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE	0x02
3516a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_SET_AT_SR	0x03
3616a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_GET_BW		0x04
3716a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE	0x05
3816a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ	0x06
3916a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM	0x07
4016a92a42STang Yun ping #define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION	0x08
4116a92a42STang Yun ping 
425f048e57SJoseph Chen /* Rockchip Sip version */
435f048e57SJoseph Chen #define SIP_IMPLEMENT_V1                (1)
445f048e57SJoseph Chen #define SIP_IMPLEMENT_V2                (2)
455f048e57SJoseph Chen 
465f048e57SJoseph Chen /* Error return code */
475f048e57SJoseph Chen #define IS_SIP_ERROR(x)			(!!(x))
485f048e57SJoseph Chen 
495f048e57SJoseph Chen #define SIP_RET_SUCCESS			0
505f048e57SJoseph Chen #define SIP_RET_SMC_UNKNOWN		-1
515f048e57SJoseph Chen #define SIP_RET_NOT_SUPPORTED		-2
525f048e57SJoseph Chen #define SIP_RET_INVALID_PARAMS		-3
535f048e57SJoseph Chen #define SIP_RET_INVALID_ADDRESS		-4
545f048e57SJoseph Chen #define SIP_RET_DENIED			-5
555f048e57SJoseph Chen 
565f048e57SJoseph Chen /* SIP_ACCESS_REG: read or write */
575f048e57SJoseph Chen #define SECURE_REG_RD			0x0
585f048e57SJoseph Chen #define SECURE_REG_WR			0x1
595f048e57SJoseph Chen 
60*c3e08fa0SJoseph Chen /* SIP_AMP_CFG */
61*c3e08fa0SJoseph Chen #define AMP_PE_STATE			0x0
62*c3e08fa0SJoseph Chen 
635f048e57SJoseph Chen /* Share mem page types */
645f048e57SJoseph Chen typedef enum {
655f048e57SJoseph Chen 	SHARE_PAGE_TYPE_INVALID = 0,
665f048e57SJoseph Chen 	SHARE_PAGE_TYPE_UARTDBG,
675f048e57SJoseph Chen 	SHARE_PAGE_TYPE_DDR,
685f048e57SJoseph Chen 	SHARE_PAGE_TYPE_MAX,
695f048e57SJoseph Chen } share_page_type_t;
705f048e57SJoseph Chen 
71ac374906SJoseph Chen /*
72ac374906SJoseph Chen  * sip_smc_set_suspend_mode() - Set U-Boot system suspend state before trap to trust.
73ac374906SJoseph Chen  *
74ac374906SJoseph Chen  * see kernel-4.4: drivers/soc/rockchip/rockchip_pm_config.c
75ac374906SJoseph Chen  */
76f270a3f8SJoseph Chen int sip_smc_set_suspend_mode(unsigned long ctrl,
77f270a3f8SJoseph Chen 			     unsigned long config1,
78f270a3f8SJoseph Chen 			     unsigned long config2);
795f048e57SJoseph Chen 
80ac374906SJoseph Chen /*
81*c3e08fa0SJoseph Chen  * sip_smc_amp_cfg() - config AMP
82*c3e08fa0SJoseph Chen  */
83*c3e08fa0SJoseph Chen int sip_smc_amp_cfg(unsigned long func, unsigned long arg0, unsigned long arg1);
84*c3e08fa0SJoseph Chen 
85*c3e08fa0SJoseph Chen /*
86ac374906SJoseph Chen  * sip_smc_dram() - Set dram configure for trust.
87ac374906SJoseph Chen  *
88ac374906SJoseph Chen  * see: ./drivers/ram/rockchip/rockchip_dmc.c
89ac374906SJoseph Chen  */
905f048e57SJoseph Chen struct arm_smccc_res sip_smc_dram(unsigned long arg0,
915f048e57SJoseph Chen 				  unsigned long arg1,
925f048e57SJoseph Chen 				  unsigned long arg2);
935f048e57SJoseph Chen 
94ac374906SJoseph Chen /*
95ac374906SJoseph Chen  * sip_smc_request_share_mem() - Request share memory from trust.
96ac374906SJoseph Chen  *
97ac374906SJoseph Chen  * @page_num:	page numbers
98ac374906SJoseph Chen  * @page_type:  page type, see: share_page_type_t
99ac374906SJoseph Chen  *
100ac374906SJoseph Chen  * @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
101ac374906SJoseph Chen  *  share memory base address), otherwise failed.
102ac374906SJoseph Chen  */
1035f048e57SJoseph Chen struct arm_smccc_res sip_smc_request_share_mem(unsigned long page_num,
1045f048e57SJoseph Chen 					       share_page_type_t page_type);
1055f048e57SJoseph Chen 
106ac374906SJoseph Chen /*
107ac374906SJoseph Chen  * sip_smc_secure_reg_read() - Read secure info(ddr/register...) from trust.
108ac374906SJoseph Chen  *
109ac374906SJoseph Chen  * @addr_phy:	address to read
110ac374906SJoseph Chen  *
111ac374906SJoseph Chen  * @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
112ac374906SJoseph Chen  *  valid data), otherwise failed.
113ac374906SJoseph Chen  */
114ac374906SJoseph Chen struct arm_smccc_res sip_smc_secure_reg_read(unsigned long addr_phy);
115ac374906SJoseph Chen 
116ac374906SJoseph Chen /*
117ac374906SJoseph Chen  * sip_smc_secure_reg_write() - Write data to trust secure info(ddr/register...).
118ac374906SJoseph Chen  *
119ac374906SJoseph Chen  * @addr_phy:	address to write
120ac374906SJoseph Chen  * @val:	value to write
121ac374906SJoseph Chen  *
122ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
123ac374906SJoseph Chen  */
124ac374906SJoseph Chen int sip_smc_secure_reg_write(unsigned long addr_phy, unsigned long val);
125ac374906SJoseph Chen 
126ac374906SJoseph Chen /*
127ac374906SJoseph Chen  * sip_smc_set_sip_version() - Set sip version to trust.
128ac374906SJoseph Chen  *
129ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
130ac374906SJoseph Chen  */
1315f048e57SJoseph Chen int sip_smc_set_sip_version(unsigned long version);
132ac374906SJoseph Chen 
133ac374906SJoseph Chen /*
134ac374906SJoseph Chen  * sip_smc_get_sip_version() - Get sip version to trust.
135ac374906SJoseph Chen  *
136ac374906SJoseph Chen  * @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
137ac374906SJoseph Chen  *  sip version), otherwise failed.
138ac374906SJoseph Chen  */
1395f048e57SJoseph Chen struct arm_smccc_res sip_smc_get_sip_version(void);
140ac374906SJoseph Chen 
141ac374906SJoseph Chen /*
142ac374906SJoseph Chen  * psci_cpu_on() - Standard ARM PSCI cpu on call.
143ac374906SJoseph Chen  *
144ac374906SJoseph Chen  * @cpuid:		cpu id
145ac374906SJoseph Chen  * @entry_point:	boot entry point
146ac374906SJoseph Chen  *
147ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
148ac374906SJoseph Chen  */
149e2bc9ab6SLin Huang int psci_cpu_on(unsigned long cpuid, unsigned long entry_point);
1505f048e57SJoseph Chen 
151164b2a33SJoseph Chen #ifdef CONFIG_ARM_CPU_SUSPEND
152ac374906SJoseph Chen /*
153ac374906SJoseph Chen  * psci_system_suspend() - Standard ARM PSCI system suspend call.
154ac374906SJoseph Chen  *
155ac374906SJoseph Chen  * @unused:		unused now, always 0 recommend
156ac374906SJoseph Chen  *
157ac374906SJoseph Chen  * @return 0 on success, otherwise failed.
158ac374906SJoseph Chen  */
159ac374906SJoseph Chen int psci_system_suspend(unsigned long unused);
160164b2a33SJoseph Chen #endif
161ac374906SJoseph Chen 
162f270a3f8SJoseph Chen #endif
163