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