1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu #include <common/runtime_svc.h> 9*91f16700Schasinglulu #include <lib/mmio.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <crypt.h> 12*91f16700Schasinglulu #include <mtcmos.h> 13*91f16700Schasinglulu #include <mtk_sip_svc.h> 14*91f16700Schasinglulu #include <plat_sip_calls.h> 15*91f16700Schasinglulu #include <wdt.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu /* Authorized secure register list */ 18*91f16700Schasinglulu enum { 19*91f16700Schasinglulu SREG_HDMI_COLOR_EN = 0x14000904 20*91f16700Schasinglulu }; 21*91f16700Schasinglulu 22*91f16700Schasinglulu static const uint32_t authorized_sreg[] = { 23*91f16700Schasinglulu SREG_HDMI_COLOR_EN 24*91f16700Schasinglulu }; 25*91f16700Schasinglulu 26*91f16700Schasinglulu #define authorized_sreg_cnt \ 27*91f16700Schasinglulu (sizeof(authorized_sreg) / sizeof(authorized_sreg[0])) 28*91f16700Schasinglulu 29*91f16700Schasinglulu uint64_t mt_sip_set_authorized_sreg(uint32_t sreg, uint32_t val) 30*91f16700Schasinglulu { 31*91f16700Schasinglulu uint64_t i; 32*91f16700Schasinglulu 33*91f16700Schasinglulu for (i = 0; i < authorized_sreg_cnt; i++) { 34*91f16700Schasinglulu if (authorized_sreg[i] == sreg) { 35*91f16700Schasinglulu mmio_write_32(sreg, val); 36*91f16700Schasinglulu return MTK_SIP_E_SUCCESS; 37*91f16700Schasinglulu } 38*91f16700Schasinglulu } 39*91f16700Schasinglulu 40*91f16700Schasinglulu return MTK_SIP_E_INVALID_PARAM; 41*91f16700Schasinglulu } 42*91f16700Schasinglulu 43*91f16700Schasinglulu static uint64_t mt_sip_pwr_on_mtcmos(uint32_t val) 44*91f16700Schasinglulu { 45*91f16700Schasinglulu uint32_t ret; 46*91f16700Schasinglulu 47*91f16700Schasinglulu ret = mtcmos_non_cpu_ctrl(1, val); 48*91f16700Schasinglulu if (ret) 49*91f16700Schasinglulu return MTK_SIP_E_INVALID_PARAM; 50*91f16700Schasinglulu else 51*91f16700Schasinglulu return MTK_SIP_E_SUCCESS; 52*91f16700Schasinglulu } 53*91f16700Schasinglulu 54*91f16700Schasinglulu static uint64_t mt_sip_pwr_off_mtcmos(uint32_t val) 55*91f16700Schasinglulu { 56*91f16700Schasinglulu uint32_t ret; 57*91f16700Schasinglulu 58*91f16700Schasinglulu ret = mtcmos_non_cpu_ctrl(0, val); 59*91f16700Schasinglulu if (ret) 60*91f16700Schasinglulu return MTK_SIP_E_INVALID_PARAM; 61*91f16700Schasinglulu else 62*91f16700Schasinglulu return MTK_SIP_E_SUCCESS; 63*91f16700Schasinglulu } 64*91f16700Schasinglulu 65*91f16700Schasinglulu static uint64_t mt_sip_pwr_mtcmos_support(void) 66*91f16700Schasinglulu { 67*91f16700Schasinglulu return MTK_SIP_E_SUCCESS; 68*91f16700Schasinglulu } 69*91f16700Schasinglulu 70*91f16700Schasinglulu uint64_t mediatek_plat_sip_handler(uint32_t smc_fid, 71*91f16700Schasinglulu uint64_t x1, 72*91f16700Schasinglulu uint64_t x2, 73*91f16700Schasinglulu uint64_t x3, 74*91f16700Schasinglulu uint64_t x4, 75*91f16700Schasinglulu void *cookie, 76*91f16700Schasinglulu void *handle, 77*91f16700Schasinglulu uint64_t flags) 78*91f16700Schasinglulu { 79*91f16700Schasinglulu uint64_t ret; 80*91f16700Schasinglulu 81*91f16700Schasinglulu switch (smc_fid) { 82*91f16700Schasinglulu case MTK_SIP_PWR_ON_MTCMOS: 83*91f16700Schasinglulu ret = mt_sip_pwr_on_mtcmos((uint32_t)x1); 84*91f16700Schasinglulu SMC_RET1(handle, ret); 85*91f16700Schasinglulu 86*91f16700Schasinglulu case MTK_SIP_PWR_OFF_MTCMOS: 87*91f16700Schasinglulu ret = mt_sip_pwr_off_mtcmos((uint32_t)x1); 88*91f16700Schasinglulu SMC_RET1(handle, ret); 89*91f16700Schasinglulu 90*91f16700Schasinglulu case MTK_SIP_PWR_MTCMOS_SUPPORT: 91*91f16700Schasinglulu ret = mt_sip_pwr_mtcmos_support(); 92*91f16700Schasinglulu SMC_RET1(handle, ret); 93*91f16700Schasinglulu 94*91f16700Schasinglulu case MTK_SIP_SET_HDCP_KEY_EX: 95*91f16700Schasinglulu ret = crypt_set_hdcp_key_ex(x1, x2, x3); 96*91f16700Schasinglulu SMC_RET1(handle, ret); 97*91f16700Schasinglulu 98*91f16700Schasinglulu case MTK_SIP_SET_HDCP_KEY_NUM: 99*91f16700Schasinglulu ret = crypt_set_hdcp_key_num((uint32_t)x1); 100*91f16700Schasinglulu SMC_RET1(handle, ret); 101*91f16700Schasinglulu 102*91f16700Schasinglulu case MTK_SIP_CLR_HDCP_KEY: 103*91f16700Schasinglulu ret = crypt_clear_hdcp_key(); 104*91f16700Schasinglulu SMC_RET1(handle, ret); 105*91f16700Schasinglulu 106*91f16700Schasinglulu case MTK_SIP_SMC_WATCHDOG: 107*91f16700Schasinglulu return wdt_smc_handler(x1, x2, handle); 108*91f16700Schasinglulu 109*91f16700Schasinglulu default: 110*91f16700Schasinglulu ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid); 111*91f16700Schasinglulu break; 112*91f16700Schasinglulu } 113*91f16700Schasinglulu 114*91f16700Schasinglulu SMC_RET1(handle, SMC_UNK); 115*91f16700Schasinglulu } 116