1 /*
2 * Copyright (c) 2024, MediaTek Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <errno.h>
8
9 #include <common/debug.h>
10 #include <lib/mmio.h>
11
12 #include "apusys_security_ctrl_perm.h"
13 #include "apusys_security_ctrl_perm_plat.h"
14
15 #define SEC_CTRL_APU_SEC_CON_BASE (0x190F5000)
16 #define SEC_CTRL_RV_DOMAIN_OFS (0x60)
17 #define SEC_CTRL_RV_NS_OFS (0x64)
18 #define SEC_CTRL_RV_DOMAIN_SHF (4)
19 #define SEC_CTRL_RV_NS_SHF (1)
20
21 #define SEC_LEVEL_NORMAL_DOMAIN (7)
22 #define SEC_LEVEL_NORMAL_NS (1)
23 #define SEC_LEVEL_SAPU_DOMAIN (5)
24 #define SEC_LEVEL_SAPU_NS (1)
25 #define SEC_LEVEL_AOV_DOMAIN (14)
26 #define SEC_LEVEL_AOV_NS (1)
27 #define SEC_LEVEL_UP_SECURE_DOMAIN (5)
28 #define SEC_LEVEL_UP_SECURE_NS (0)
29 #define SEC_LEVEL_MVPU_SECURE_DOMAIN (7)
30 #define SEC_LEVEL_MVPU_SECURE_NS (0)
31 #define SEC_LEVEL_MDLA_SECURE_DOMAIN (14)
32 #define SEC_LEVEL_MDLA_SECURE_NS (0)
33 #define DOMAIN(SEC_LVL) SEC_LEVEL_##SEC_LVL##_DOMAIN
34 #define NS(SEC_LVL) SEC_LEVEL_##SEC_LVL##_NS
35
sec_get_dns(enum apusys_dev_type dev_type,enum apusys_sec_level sec_level,uint8_t * domain,uint8_t * ns)36 int sec_get_dns(enum apusys_dev_type dev_type, enum apusys_sec_level sec_level,
37 uint8_t *domain, uint8_t *ns)
38 {
39 if ((dev_type < 0) || (dev_type >= APUSYS_DEVICE_NUM)) {
40 ERROR("invalid dev type %d\n", dev_type);
41 return -EINVAL;
42 }
43
44 if ((sec_level < 0) || (sec_level >= SEC_LEVEL_NUM)) {
45 ERROR("invalid sec_level %d\n", sec_level);
46 return -EINVAL;
47 }
48
49 switch (sec_level) {
50 case SEC_LEVEL_NORMAL:
51 *domain = DOMAIN(NORMAL);
52 *ns = NS(NORMAL);
53 break;
54 case SEC_LEVEL_SECURE:
55 switch (dev_type) {
56 case APUSYS_DEVICE_MVPU:
57 *domain = DOMAIN(MVPU_SECURE);
58 *ns = NS(MVPU_SECURE);
59 break;
60 case APUSYS_DEVICE_MDLA:
61 *domain = DOMAIN(MDLA_SECURE);
62 *ns = NS(MDLA_SECURE);
63 break;
64 case APUSYS_DEVICE_UP:
65 *domain = DOMAIN(UP_SECURE);
66 *ns = NS(UP_SECURE);
67 break;
68 default:
69 ERROR("invalid dev type %d\n", dev_type);
70 return -EINVAL;
71 };
72 break;
73 case SEC_LEVEL_SAPU:
74 *domain = DOMAIN(SAPU);
75 *ns = NS(SAPU);
76 break;
77 case SEC_LEVEL_AOV:
78 *domain = DOMAIN(AOV);
79 *ns = NS(AOV);
80 break;
81 default:
82 ERROR("invalid sec_level %d\n", sec_level);
83 return -EINVAL;
84 };
85
86 return 0;
87 }
88
sec_set_rv_dns(void)89 int sec_set_rv_dns(void)
90 {
91 uint8_t normal_domain;
92 uint8_t normal_ns;
93 uint8_t sec_domain;
94 uint8_t sec_ns;
95 int ret;
96
97 ret = sec_get_dns(APUSYS_DEVICE_UP, SEC_LEVEL_SECURE, &sec_domain, &sec_ns);
98 if (ret) {
99 ERROR("%s failed.\n", __func__);
100 return ret;
101 }
102
103 ret = sec_get_dns(APUSYS_DEVICE_UP, SEC_LEVEL_NORMAL, &normal_domain, &normal_ns);
104 if (ret) {
105 ERROR("%s failed.\n", __func__);
106 return ret;
107 }
108
109 mmio_write_32(SEC_CTRL_APU_SEC_CON_BASE + SEC_CTRL_RV_DOMAIN_OFS,
110 (sec_domain << SEC_CTRL_RV_DOMAIN_SHF) | normal_domain);
111 mmio_write_32(SEC_CTRL_APU_SEC_CON_BASE + SEC_CTRL_RV_NS_OFS,
112 (sec_ns << SEC_CTRL_RV_NS_SHF) | normal_ns);
113
114 return 0;
115 }
116