blob: 6969ee3a7ffa5db5bcf29aec5f17ca222321f878 [file] [log] [blame]
developer65014b82015-04-13 14:47:57 +08001/*
2 * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
developereee29802016-05-11 18:45:20 +080030#include <crypt.h>
developer73b982f2016-05-11 18:04:09 +080031#include <debug.h>
developer65014b82015-04-13 14:47:57 +080032#include <mmio.h>
33#include <mtk_sip_svc.h>
developerb8925a22015-11-16 14:38:40 +080034#include <mtcmos.h>
developer73b982f2016-05-11 18:04:09 +080035#include <plat_sip_calls.h>
36#include <runtime_svc.h>
developer65014b82015-04-13 14:47:57 +080037
38/* Authorized secure register list */
39enum {
40 SREG_HDMI_COLOR_EN = 0x14000904
41};
42
43static const uint32_t authorized_sreg[] = {
44 SREG_HDMI_COLOR_EN
45};
46
47#define authorized_sreg_cnt \
48 (sizeof(authorized_sreg) / sizeof(authorized_sreg[0]))
49
50uint64_t mt_sip_set_authorized_sreg(uint32_t sreg, uint32_t val)
51{
52 uint64_t i;
53
54 for (i = 0; i < authorized_sreg_cnt; i++) {
55 if (authorized_sreg[i] == sreg) {
56 mmio_write_32(sreg, val);
57 return MTK_SIP_E_SUCCESS;
58 }
59 }
60
61 return MTK_SIP_E_INVALID_PARAM;
62}
developerb8925a22015-11-16 14:38:40 +080063
developer73b982f2016-05-11 18:04:09 +080064static uint64_t mt_sip_pwr_on_mtcmos(uint32_t val)
developerb8925a22015-11-16 14:38:40 +080065{
66 uint32_t ret;
67
68 ret = mtcmos_non_cpu_ctrl(1, val);
69 if (ret)
70 return MTK_SIP_E_INVALID_PARAM;
71 else
72 return MTK_SIP_E_SUCCESS;
73}
74
developer73b982f2016-05-11 18:04:09 +080075static uint64_t mt_sip_pwr_off_mtcmos(uint32_t val)
developerb8925a22015-11-16 14:38:40 +080076{
77 uint32_t ret;
78
79 ret = mtcmos_non_cpu_ctrl(0, val);
80 if (ret)
81 return MTK_SIP_E_INVALID_PARAM;
82 else
83 return MTK_SIP_E_SUCCESS;
84}
85
developer73b982f2016-05-11 18:04:09 +080086static uint64_t mt_sip_pwr_mtcmos_support(void)
developerb8925a22015-11-16 14:38:40 +080087{
88 return MTK_SIP_E_SUCCESS;
89}
developer73b982f2016-05-11 18:04:09 +080090
91uint64_t mediatek_plat_sip_handler(uint32_t smc_fid,
92 uint64_t x1,
93 uint64_t x2,
94 uint64_t x3,
95 uint64_t x4,
96 void *cookie,
97 void *handle,
98 uint64_t flags)
99{
100 uint64_t ret;
101
102 switch (smc_fid) {
103 case MTK_SIP_PWR_ON_MTCMOS:
104 ret = mt_sip_pwr_on_mtcmos((uint32_t)x1);
105 SMC_RET1(handle, ret);
106
107 case MTK_SIP_PWR_OFF_MTCMOS:
108 ret = mt_sip_pwr_off_mtcmos((uint32_t)x1);
109 SMC_RET1(handle, ret);
110
111 case MTK_SIP_PWR_MTCMOS_SUPPORT:
112 ret = mt_sip_pwr_mtcmos_support();
113 SMC_RET1(handle, ret);
114
developereee29802016-05-11 18:45:20 +0800115 case MTK_SIP_SET_HDCP_KEY_EX:
116 ret = crypt_set_hdcp_key_ex(x1, x2, x3);
117 SMC_RET1(handle, ret);
118
119 case MTK_SIP_SET_HDCP_KEY_NUM:
120 ret = crypt_set_hdcp_key_num((uint32_t)x1);
121 SMC_RET1(handle, ret);
122
123 case MTK_SIP_CLR_HDCP_KEY:
124 ret = crypt_clear_hdcp_key();
125 SMC_RET1(handle, ret);
126
developer73b982f2016-05-11 18:04:09 +0800127 default:
128 ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
129 break;
130 }
131
132 SMC_RET1(handle, SMC_UNK);
133}