xref: /rk3399_ARM-atf/services/std_svc/drtm/drtm_main.c (revision d54792bd93f76b943bf0559c8373b898e0e3b93c)
1 /*
2  * Copyright (c) 2022 Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier:    BSD-3-Clause
5  *
6  * DRTM service
7  *
8  * Authors:
9  *	Lucian Paul-Trifu <lucian.paultrifu@gmail.com>
10  *	Brian Nezvadovitz <brinez@microsoft.com> 2021-02-01
11  */
12 
13 #include <stdint.h>
14 
15 #include <arch.h>
16 #include <arch_helpers.h>
17 #include <common/debug.h>
18 #include <common/runtime_svc.h>
19 #include <drivers/auth/crypto_mod.h>
20 #include "drtm_main.h"
21 #include <services/drtm_svc.h>
22 
23 /* This value is used by the SMC to advertise the boot PE */
24 static uint64_t boot_pe_aff_value;
25 
26 int drtm_setup(void)
27 {
28 	bool rc;
29 
30 	INFO("DRTM service setup\n");
31 
32 	boot_pe_aff_value = read_mpidr_el1() & MPIDR_AFFINITY_MASK;
33 
34 	rc = drtm_dma_prot_init();
35 	if (rc) {
36 		return INTERNAL_ERROR;
37 	}
38 
39 	/*
40 	 * initialise the platform supported crypto module that will
41 	 * be used by the DRTM-service to calculate hash of DRTM-
42 	 * implementation specific components
43 	 */
44 	crypto_mod_init();
45 
46 	return 0;
47 }
48 
49 uint64_t drtm_smc_handler(uint32_t smc_fid,
50 			  uint64_t x1,
51 			  uint64_t x2,
52 			  uint64_t x3,
53 			  uint64_t x4,
54 			  void *cookie,
55 			  void *handle,
56 			  uint64_t flags)
57 {
58 	/* Check that the SMC call is from the Normal World. */
59 	if (!is_caller_non_secure(flags)) {
60 		SMC_RET1(handle, NOT_SUPPORTED);
61 	}
62 
63 	switch (smc_fid) {
64 	case ARM_DRTM_SVC_VERSION:
65 		INFO("DRTM service handler: version\n");
66 		/* Return the version of current implementation */
67 		SMC_RET1(handle, ARM_DRTM_VERSION);
68 		break;	/* not reached */
69 
70 	case ARM_DRTM_SVC_FEATURES:
71 		if (((x1 >> ARM_DRTM_FUNC_SHIFT) & ARM_DRTM_FUNC_MASK) ==
72 		    ARM_DRTM_FUNC_ID) {
73 			/* Dispatch function-based queries. */
74 			switch (x1 & FUNCID_MASK) {
75 			case ARM_DRTM_SVC_VERSION:
76 				SMC_RET1(handle, SUCCESS);
77 				break;	/* not reached */
78 
79 			case ARM_DRTM_SVC_FEATURES:
80 				SMC_RET1(handle, SUCCESS);
81 				break;	/* not reached */
82 
83 			case ARM_DRTM_SVC_UNPROTECT_MEM:
84 				SMC_RET1(handle, SUCCESS);
85 				break;	/* not reached */
86 
87 			case ARM_DRTM_SVC_DYNAMIC_LAUNCH:
88 				SMC_RET1(handle, SUCCESS);
89 				break;	/* not reached */
90 
91 			case ARM_DRTM_SVC_CLOSE_LOCALITY:
92 				WARN("ARM_DRTM_SVC_CLOSE_LOCALITY feature %s",
93 				     "is not supported\n");
94 				SMC_RET1(handle, NOT_SUPPORTED);
95 				break;	/* not reached */
96 
97 			case ARM_DRTM_SVC_GET_ERROR:
98 				SMC_RET1(handle, SUCCESS);
99 				break;	/* not reached */
100 
101 			case ARM_DRTM_SVC_SET_ERROR:
102 				SMC_RET1(handle, SUCCESS);
103 				break;	/* not reached */
104 
105 			case ARM_DRTM_SVC_SET_TCB_HASH:
106 				WARN("ARM_DRTM_SVC_TCB_HASH feature %s",
107 				     "is not supported\n");
108 				SMC_RET1(handle, NOT_SUPPORTED);
109 				break;	/* not reached */
110 
111 			case ARM_DRTM_SVC_LOCK_TCB_HASH:
112 				WARN("ARM_DRTM_SVC_LOCK_TCB_HASH feature %s",
113 				     "is not supported\n");
114 				SMC_RET1(handle, NOT_SUPPORTED);
115 				break;	/* not reached */
116 
117 			default:
118 				ERROR("Unknown DRTM service function\n");
119 				SMC_RET1(handle, NOT_SUPPORTED);
120 				break;	/* not reached */
121 			}
122 		}
123 
124 	case ARM_DRTM_SVC_UNPROTECT_MEM:
125 		INFO("DRTM service handler: unprotect mem\n");
126 		SMC_RET1(handle, SMC_OK);
127 		break;	/* not reached */
128 
129 	case ARM_DRTM_SVC_DYNAMIC_LAUNCH:
130 		INFO("DRTM service handler: dynamic launch\n");
131 		SMC_RET1(handle, SMC_OK);
132 		break;	/* not reached */
133 
134 	case ARM_DRTM_SVC_CLOSE_LOCALITY:
135 		WARN("DRTM service handler: close locality %s\n",
136 		     "is not supported");
137 		SMC_RET1(handle, NOT_SUPPORTED);
138 		break;	/* not reached */
139 
140 	case ARM_DRTM_SVC_GET_ERROR:
141 		INFO("DRTM service handler: get error\n");
142 		SMC_RET2(handle, SMC_OK, 0);
143 		break;	/* not reached */
144 
145 	case ARM_DRTM_SVC_SET_ERROR:
146 		INFO("DRTM service handler: set error\n");
147 		SMC_RET1(handle, SMC_OK);
148 		break;	/* not reached */
149 
150 	case ARM_DRTM_SVC_SET_TCB_HASH:
151 		WARN("DRTM service handler: set TCB hash %s\n",
152 		     "is not supported");
153 		SMC_RET1(handle, NOT_SUPPORTED);
154 		break;  /* not reached */
155 
156 	case ARM_DRTM_SVC_LOCK_TCB_HASH:
157 		WARN("DRTM service handler: lock TCB hash %s\n",
158 		     "is not supported");
159 		SMC_RET1(handle, NOT_SUPPORTED);
160 		break;  /* not reached */
161 
162 	default:
163 		ERROR("Unknown DRTM service function: 0x%x\n", smc_fid);
164 		SMC_RET1(handle, SMC_UNK);
165 		break;	/* not reached */
166 	}
167 
168 	/* not reached */
169 	SMC_RET1(handle, SMC_UNK);
170 }
171