diff --git a/drivers/firmware/rockchip_sip.c b/drivers/firmware/rockchip_sip.c index 186011fe6463..99f3d2c182d7 100644 --- a/drivers/firmware/rockchip_sip.c +++ b/drivers/firmware/rockchip_sip.c @@ -627,6 +627,16 @@ int sip_hdcpkey_init(u32 hdcp_id) } EXPORT_SYMBOL_GPL(sip_hdcpkey_init); +int sip_smc_mcu_config(unsigned long mcu_id, + unsigned long func, + unsigned long arg2) +{ + struct arm_smccc_res res; + + res = __invoke_sip_fn_smc(SIP_MCU_CFG, mcu_id, func, arg2); + return res.a0; +} +EXPORT_SYMBOL_GPL(sip_smc_mcu_config); /******************************************************************************/ #ifdef CONFIG_ARM static __init int sip_firmware_init(void) diff --git a/include/linux/rockchip/rockchip_sip.h b/include/linux/rockchip/rockchip_sip.h index a0ff5c7ed710..4d78084b9960 100644 --- a/include/linux/rockchip/rockchip_sip.h +++ b/include/linux/rockchip/rockchip_sip.h @@ -56,6 +56,7 @@ #define SIP_HDCP_CONFIG 0x82000025 #define SIP_WDT_CFG 0x82000026 #define SIP_HDMIRX_CFG 0x82000027 +#define SIP_MCU_CFG 0x82000028 #define TRUSTED_OS_HDCPKEY_INIT 0xB7000003 @@ -118,6 +119,28 @@ /* wakeup state */ #define REMOTECTL_PWRKEY_WAKEUP 0xdeadbeaf +/* SIP_MCU_CFG child configs, MCU ID */ +enum { + RK_BUS_MCU, + RK_PMU_MCU, + RK_DDR_MCU, + RK_NPU_MCU, +}; + +#define RK_SIP_MCU_ID(type, id) ((type) << 8 | id) + +#define RK_SIP_CFG_BUSMCU_0_ID RK_SIP_MCU_ID(RK_BUS_MCU, 0) +#define RK_SIP_CFG_BUSMCU_1_ID RK_SIP_MCU_ID(RK_BUS_MCU, 1) +#define RK_SIP_CFG_PMUMCU_0_ID RK_SIP_MCU_ID(RK_PMU_MCU, 0) +#define RK_SIP_CFG_DDRMCU_0_ID RK_SIP_MCU_ID(RK_DDR_MCU, 0) +#define RK_SIP_CFG_NPUMCU_0_ID RK_SIP_MCU_ID(RK_NPU_MCU, 0) + +/* SIP_MCU_CFG child configs */ +#define CONFIG_MCU_CODE_START_ADDR 0x01 +#define CONFIG_MCU_EXPERI_START_ADDR 0x02 +#define CONFIG_MCU_SRAM_START_ADDR 0x03 +#define CONFIG_MCU_EXSRAM_START_ADDR 0x04 + struct dram_addrmap_info { u64 ch_mask[2]; u64 bk_mask[4]; @@ -251,6 +274,7 @@ int sip_fiq_control(u32 sub_func, u32 irq, unsigned long data); int sip_wdt_config(u32 sub_func, u32 arg1, u32 arg2, u32 arg3); int sip_hdmirx_config(u32 sub_func, u32 arg1, u32 arg2, u32 arg3); int sip_hdcpkey_init(u32 hdcp_id); +int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2); #else static inline struct arm_smccc_res sip_smc_get_atf_version(void) { @@ -407,6 +431,13 @@ static inline int sip_hdcpkey_init(u32 hdcp_id) { return 0; } + +static inline int sip_smc_mcu_config(unsigned long mcu_id, + unsigned long func, + unsigned long arg2) +{ + return SIP_RET_NOT_SUPPORTED; +} #endif /* 32-bit OP-TEE context, never change order of members! */