2025-05-10 21:58:58 +08:00

228 lines
6.3 KiB
C

/*
* (C) Copyright 2017 Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __ROCKCHIP_SMCCC_H__
#define __ROCKCHIP_SMCCC_H__
#include <linux/arm-smccc.h>
/* Rockchip platform SiP call ID */
#define SIP_ATF_VERSION 0x82000001
#define SIP_ACCESS_REG 0x82000002
#define SIP_SUSPEND_MODE 0x82000003
#define SIP_PENDING_CPUS 0x82000004
#define SIP_UARTDBG_CFG 0x82000005
#define SIP_UARTDBG_CFG64 0xc2000005
#define SIP_MCU_EL3FIQ_CFG 0x82000006
#define SIP_ACCESS_CHIP_STATE64 0xc2000006
#define SIP_SECURE_MEM_CONFIG 0x82000007
#define SIP_ACCESS_CHIP_EXTRA_STATE64 0xc2000007
#define SIP_DRAM_CONFIG 0x82000008
#define SIP_SHARE_MEM 0x82000009
#define SIP_SIP_VERSION 0x8200000a
#define SIP_REMOTECTL_CFG 0x8200000b
#define SIP_VPU_RESET 0x8200000c
#define SIP_SOC_BUS_DIV 0x8200000d
#define SIP_LAST_LOG 0x8200000e
#define SIP_AMP_CFG 0x82000022
#define SIP_HDCP_CONFIG 0x82000025
#define SIP_MCU_CFG 0x82000028
#define ROCKCHIP_SIP_CONFIG_DRAM_INIT 0x00
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE 0x01
#define ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE 0x02
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_AT_SR 0x03
#define ROCKCHIP_SIP_CONFIG_DRAM_GET_BW 0x04
#define ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE 0x05
#define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ 0x06
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM 0x07
#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION 0x08
#define ROCKCHIP_SIP_CONFIG_DRAM_POST_SET_RATE 0x09
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_NOC_RL 0x0a
#define ROCKCHIP_SIP_CONFIG_DRAM_DEBUG 0x0b
#define ROCKCHIP_SIP_CONFIG_DRAM_MCU_START 0x0c
#define ROCKCHIP_SIP_CONFIG_DRAM_ECC 0x0d
#define ROCKCHIP_SIP_CONFIG_DRAM_GET_FREQ_INFO 0x0e
#define ROCKCHIP_SIP_CONFIG_DRAM_FSP_INIT 0x0f
/* RK_SIP_MCU_CFG child configs, MCU ID */
#define ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID 0x00
#define ROCKCHIP_SIP_CONFIG_BUSMCU_1_ID 0x01
#define ROCKCHIP_SIP_CONFIG_PMUMCU_0_ID 0x10
#define ROCKCHIP_SIP_CONFIG_DDRMCU_0_ID 0x20
#define ROCKCHIP_SIP_CONFIG_NPUMCU_0_ID 0x30
/* RK_SIP_MCU_CFG child configs */
#define ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR 0x01
#define ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR 0x02
#define ROCKCHIP_SIP_CONFIG_MCU_SRAM_START_ADDR 0x03
#define ROCKCHIP_SIP_CONFIG_MCU_EXSRAM_START_ADDR 0x04
/* Rockchip Sip version */
#define SIP_IMPLEMENT_V1 (1)
#define SIP_IMPLEMENT_V2 (2)
/* Error return code */
#define IS_SIP_ERROR(x) (!!(x))
#define SIP_RET_SUCCESS 0
#define SIP_RET_SMC_UNKNOWN -1
#define SIP_RET_NOT_SUPPORTED -2
#define SIP_RET_INVALID_PARAMS -3
#define SIP_RET_INVALID_ADDRESS -4
#define SIP_RET_DENIED -5
/* SIP_ACCESS_REG: read or write */
#define SECURE_REG_RD 0x0
#define SECURE_REG_WR 0x1
/* SIP_AMP_CFG */
#define AMP_PE_STATE 0x0
#define AMP_BOOT_ARG01 0x1
#define AMP_BOOT_ARG23 0x2
/* Share mem page types */
typedef enum {
SHARE_PAGE_TYPE_INVALID = 0,
SHARE_PAGE_TYPE_UARTDBG,
SHARE_PAGE_TYPE_DDR,
SHARE_PAGE_TYPE_DDRDBG,
SHARE_PAGE_TYPE_DDRECC,
SHARE_PAGE_TYPE_DDRFSP,
SHARE_PAGE_TYPE_DDR_ADDRMAP,
SHARE_PAGE_TYPE_LAST_LOG,
SHARE_PAGE_TYPE_HDCP,
SHARE_PAGE_TYPE_MAX,
} share_page_type_t;
/* hdcp config func */
typedef enum {
HDCP_FUNC_STORAGE_ENCRYPT = 1,
HDCP_FUNC_KEY_DECRYPT,
HDCP_FUNC_KEY_LOAD,
HDCP_FUNC_ENCRYPT_MODE
} sip_hdcp_func_t;
/*
* sip_smc_set_suspend_mode() - Set U-Boot system suspend state before trap to trust.
*
* see kernel-4.4: drivers/soc/rockchip/rockchip_pm_config.c
*/
int sip_smc_set_suspend_mode(unsigned long ctrl,
unsigned long config1,
unsigned long config2);
int sip_smc_remotectl_config(unsigned long func, unsigned long data);
/*
* sip_smc_amp_cfg() - config AMP
*/
int sip_smc_amp_cfg(unsigned long func, unsigned long arg0, unsigned long arg1,
unsigned long arg2);
/*
* sip_smc_dram() - Set dram configure for trust.
*
* see: ./drivers/ram/rockchip/rockchip_dmc.c
*/
struct arm_smccc_res sip_smc_dram(unsigned long arg0,
unsigned long arg1,
unsigned long arg2);
/*
* sip_smc_request_share_mem() - Request share memory from trust.
*
* @page_num: page numbers
* @page_type: page type, see: share_page_type_t
*
* @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
* share memory base address), otherwise failed.
*/
struct arm_smccc_res sip_smc_request_share_mem(unsigned long page_num,
share_page_type_t page_type);
/*
* sip_smc_secure_reg_read() - Read secure info(ddr/register...) from trust.
*
* @addr_phy: address to read
*
* @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
* valid data), otherwise failed.
*/
struct arm_smccc_res sip_smc_secure_reg_read(unsigned long addr_phy);
/*
* sip_smc_secure_reg_write() - Write data to trust secure info(ddr/register...).
*
* @addr_phy: address to write
* @val: value to write
*
* @return 0 on success, otherwise failed.
*/
int sip_smc_secure_reg_write(unsigned long addr_phy, unsigned long val);
/*
* sip_smc_set_sip_version() - Set sip version to trust.
*
* @return 0 on success, otherwise failed.
*/
int sip_smc_set_sip_version(unsigned long version);
/*
* sip_smc_get_sip_version() - Get sip version to trust.
*
* @return arm_smccc_res structure, res.a0 equals 0 on success(res.a1 contains
* sip version), otherwise failed.
*/
struct arm_smccc_res sip_smc_get_sip_version(void);
/*
* sip_smc_hdcp_config() - handle hdcp.
*
* @return 0 on success, otherwise failed.
*/
int sip_smc_hdcp_config(unsigned long func,
unsigned long arg1, unsigned long arg2);
/*
* sip_smc_mcu_config() - handle mcu.
*
* @return 0 on success, otherwise failed.
*/
int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2);
/*
* psci_cpu_on() - Standard ARM PSCI cpu on call.
*
* @cpuid: cpu id
* @entry_point: boot entry point
*
* @return 0 on success, otherwise failed.
*/
int psci_cpu_on(unsigned long cpuid, unsigned long entry_point);
/*
* psci_cpu_off() - Standard ARM PSCI cpu off call.
*
* @state: dummy, set 0 by default.
*
* @return 0 on success, otherwise failed.
*/
int psci_cpu_off(uint32_t state);
#ifdef CONFIG_ARM_CPU_SUSPEND
/*
* psci_system_suspend() - Standard ARM PSCI system suspend call.
*
* @unused: unused now, always 0 recommend
*
* @return 0 on success, otherwise failed.
*/
int psci_system_suspend(unsigned long unused);
#endif
#endif