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