xref: /rk3399_ARM-atf/plat/mediatek/drivers/apusys/mt8196/apusys_security_ctrl_perm_plat.c (revision 999503d285475f8920111f3fd760312ddf1d5b5b)
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