1*d150b629SRex-BC Chen /* 2*d150b629SRex-BC Chen * Copyright (c) 2020-2022, MediaTek Inc. All rights reserved. 3*d150b629SRex-BC Chen * 4*d150b629SRex-BC Chen * SPDX-License-Identifier: BSD-3-Clause 5*d150b629SRex-BC Chen */ 6*d150b629SRex-BC Chen 7*d150b629SRex-BC Chen #include <inttypes.h> 8*d150b629SRex-BC Chen 9*d150b629SRex-BC Chen #include <common/debug.h> 10*d150b629SRex-BC Chen #include <lib/mmio.h> 11*d150b629SRex-BC Chen #include <mt_dp.h> 12*d150b629SRex-BC Chen #include <mtk_sip_svc.h> 13*d150b629SRex-BC Chen #include <platform_def.h> 14*d150b629SRex-BC Chen 15*d150b629SRex-BC Chen static uint32_t dp_write_sec_reg(uint32_t is_edp, uint32_t offset, 16*d150b629SRex-BC Chen uint32_t value, uint32_t mask) 17*d150b629SRex-BC Chen { 18*d150b629SRex-BC Chen uint32_t reg = (is_edp != 0U) ? eDP_SEC_BASE : DP_SEC_BASE; 19*d150b629SRex-BC Chen 20*d150b629SRex-BC Chen mmio_clrsetbits_32(reg + offset, mask, value); 21*d150b629SRex-BC Chen 22*d150b629SRex-BC Chen return mmio_read_32(reg + offset); 23*d150b629SRex-BC Chen } 24*d150b629SRex-BC Chen 25*d150b629SRex-BC Chen int32_t dp_secure_handler(uint64_t cmd, uint64_t para, uint32_t *val) 26*d150b629SRex-BC Chen { 27*d150b629SRex-BC Chen int32_t ret = 0L; 28*d150b629SRex-BC Chen uint32_t is_edp = 0UL; 29*d150b629SRex-BC Chen uint32_t regval = 0UL; 30*d150b629SRex-BC Chen uint32_t regmsk = 0UL; 31*d150b629SRex-BC Chen uint32_t fldmask = 0UL; 32*d150b629SRex-BC Chen 33*d150b629SRex-BC Chen if ((cmd > DP_ATF_CMD_COUNT) || (val == NULL)) { 34*d150b629SRex-BC Chen INFO("dp_secure_handler error cmd 0x%" PRIx64 "\n", cmd); 35*d150b629SRex-BC Chen return MTK_SIP_E_INVALID_PARAM; 36*d150b629SRex-BC Chen } 37*d150b629SRex-BC Chen 38*d150b629SRex-BC Chen switch (cmd) { 39*d150b629SRex-BC Chen case DP_ATF_DP_VIDEO_UNMUTE: 40*d150b629SRex-BC Chen INFO("[%s] DP_ATF_DP_VIDEO_UNMUTE\n", __func__); 41*d150b629SRex-BC Chen is_edp = DP_ATF_TYPE_DP; 42*d150b629SRex-BC Chen ret = MTK_SIP_E_SUCCESS; 43*d150b629SRex-BC Chen break; 44*d150b629SRex-BC Chen case DP_ATF_EDP_VIDEO_UNMUTE: 45*d150b629SRex-BC Chen INFO("[%s] DP_ATF_EDP_VIDEO_UNMUTE\n", __func__); 46*d150b629SRex-BC Chen is_edp = DP_ATF_TYPE_EDP; 47*d150b629SRex-BC Chen ret = MTK_SIP_E_SUCCESS; 48*d150b629SRex-BC Chen break; 49*d150b629SRex-BC Chen default: 50*d150b629SRex-BC Chen ret = MTK_SIP_E_INVALID_PARAM; 51*d150b629SRex-BC Chen break; 52*d150b629SRex-BC Chen } 53*d150b629SRex-BC Chen 54*d150b629SRex-BC Chen if (ret == MTK_SIP_E_SUCCESS) { 55*d150b629SRex-BC Chen regmsk = (VIDEO_MUTE_SEL_SECURE_FLDMASK | 56*d150b629SRex-BC Chen VIDEO_MUTE_SW_SECURE_FLDMASK); 57*d150b629SRex-BC Chen if (para > 0U) { 58*d150b629SRex-BC Chen fldmask = VIDEO_MUTE_SW_SECURE_FLDMASK; 59*d150b629SRex-BC Chen } else { 60*d150b629SRex-BC Chen fldmask = 0; 61*d150b629SRex-BC Chen } 62*d150b629SRex-BC Chen 63*d150b629SRex-BC Chen regval = (VIDEO_MUTE_SEL_SECURE_FLDMASK | fldmask); 64*d150b629SRex-BC Chen *val = dp_write_sec_reg(is_edp, DP_TX_SECURE_REG11, 65*d150b629SRex-BC Chen regval, regmsk); 66*d150b629SRex-BC Chen } 67*d150b629SRex-BC Chen 68*d150b629SRex-BC Chen return ret; 69*d150b629SRex-BC Chen } 70