xref: /rk3399_ARM-atf/plat/mediatek/drivers/dp/mt_dp.c (revision d150b6296e6960f2548b265b8b23e6cdb502d3b7)
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