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