xref: /optee_os/core/pta/rockchip/rk_secure_boot.c (revision 2949576eb4b8e0eb7a6d9c97e38a30841f621b61)
1*2949576eSMichael Tretter // SPDX-License-Identifier: BSD-2-Clause
2*2949576eSMichael Tretter /*
3*2949576eSMichael Tretter  * Copyright (C) 2025, Pengutronix, Michael Tretter <entwicklung@pengutronix.de>
4*2949576eSMichael Tretter  */
5*2949576eSMichael Tretter 
6*2949576eSMichael Tretter #include <config.h>
7*2949576eSMichael Tretter #include <drivers/rockchip_otp.h>
8*2949576eSMichael Tretter #include <kernel/pseudo_ta.h>
9*2949576eSMichael Tretter #include <kernel/tee_misc.h>
10*2949576eSMichael Tretter #include <tee/uuid.h>
11*2949576eSMichael Tretter #include <utee_defines.h>
12*2949576eSMichael Tretter #include <stdio.h>
13*2949576eSMichael Tretter #include <string.h>
14*2949576eSMichael Tretter #include <platform_config.h>
15*2949576eSMichael Tretter 
16*2949576eSMichael Tretter #include <pta_rk_secure_boot.h>
17*2949576eSMichael Tretter 
18*2949576eSMichael Tretter #define PTA_NAME "rk_secure_boot.pta"
19*2949576eSMichael Tretter 
20*2949576eSMichael Tretter /*
21*2949576eSMichael Tretter  * The hash is stored in OTP in little endian. The PTA assumes that OP-TEE is
22*2949576eSMichael Tretter  * in little endian and may copy the hash from memory to OTP without ensuring
23*2949576eSMichael Tretter  * the byte order.
24*2949576eSMichael Tretter  */
25*2949576eSMichael Tretter static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__);
26*2949576eSMichael Tretter 
test_bit_mask(uint32_t value,uint32_t mask)27*2949576eSMichael Tretter static inline bool test_bit_mask(uint32_t value, uint32_t mask)
28*2949576eSMichael Tretter {
29*2949576eSMichael Tretter 	return (value & mask) == mask;
30*2949576eSMichael Tretter }
31*2949576eSMichael Tretter 
32*2949576eSMichael Tretter #define HASH_STRING_SIZE 88
33*2949576eSMichael Tretter static_assert(ROCKCHIP_OTP_RSA_HASH_SIZE == 8);
otp_to_string(uint32_t * otp,char * str,size_t str_size)34*2949576eSMichael Tretter static __maybe_unused char *otp_to_string(uint32_t *otp,
35*2949576eSMichael Tretter 					  char *str, size_t str_size)
36*2949576eSMichael Tretter {
37*2949576eSMichael Tretter 	snprintf(str, str_size,
38*2949576eSMichael Tretter 		 "0x%"PRIx32" 0x%"PRIx32" 0x%"PRIx32" 0x%"PRIx32
39*2949576eSMichael Tretter 		 " 0x%"PRIx32" 0x%"PRIx32" 0x%"PRIx32" 0x%"PRIx32,
40*2949576eSMichael Tretter 		 otp[0], otp[1], otp[2], otp[3],
41*2949576eSMichael Tretter 		 otp[4], otp[5], otp[6], otp[7]);
42*2949576eSMichael Tretter 
43*2949576eSMichael Tretter 	return str;
44*2949576eSMichael Tretter }
45*2949576eSMichael Tretter 
write_key_size(uint32_t key_size_bits)46*2949576eSMichael Tretter static TEE_Result write_key_size(uint32_t key_size_bits)
47*2949576eSMichael Tretter {
48*2949576eSMichael Tretter 	uint32_t idx = ROCKCHIP_OTP_SECURE_BOOT_STATUS_INDEX;
49*2949576eSMichael Tretter 	uint32_t sz = ROCKCHIP_OTP_SECURE_BOOT_STATUS_SIZE;
50*2949576eSMichael Tretter 	TEE_Result res = TEE_SUCCESS;
51*2949576eSMichael Tretter 	uint32_t status = 0;
52*2949576eSMichael Tretter 
53*2949576eSMichael Tretter 	IMSG("Setting key size to %"PRId32, key_size_bits);
54*2949576eSMichael Tretter 
55*2949576eSMichael Tretter 	switch (key_size_bits) {
56*2949576eSMichael Tretter 	case 4096:
57*2949576eSMichael Tretter 		status |= ROCKCHIP_OTP_SECURE_BOOT_STATUS_RSA4096;
58*2949576eSMichael Tretter 
59*2949576eSMichael Tretter 		res = rockchip_otp_write_secure(&status, idx, sz);
60*2949576eSMichael Tretter 		if (res)
61*2949576eSMichael Tretter 			return res;
62*2949576eSMichael Tretter 
63*2949576eSMichael Tretter 		res = rockchip_otp_read_secure(&status, idx, sz);
64*2949576eSMichael Tretter 		if (res)
65*2949576eSMichael Tretter 			return res;
66*2949576eSMichael Tretter 		if (!test_bit_mask(status,
67*2949576eSMichael Tretter 				   ROCKCHIP_OTP_SECURE_BOOT_STATUS_RSA4096))
68*2949576eSMichael Tretter 			return TEE_ERROR_GENERIC;
69*2949576eSMichael Tretter 		break;
70*2949576eSMichael Tretter 	case 2048:
71*2949576eSMichael Tretter 		/* Nothing to do */
72*2949576eSMichael Tretter 		break;
73*2949576eSMichael Tretter 	default:
74*2949576eSMichael Tretter 		res = TEE_ERROR_BAD_PARAMETERS;
75*2949576eSMichael Tretter 		break;
76*2949576eSMichael Tretter 	}
77*2949576eSMichael Tretter 
78*2949576eSMichael Tretter 	return res;
79*2949576eSMichael Tretter }
80*2949576eSMichael Tretter 
write_hash(uint32_t * hash,size_t size)81*2949576eSMichael Tretter static TEE_Result write_hash(uint32_t *hash, size_t size)
82*2949576eSMichael Tretter {
83*2949576eSMichael Tretter 	char __maybe_unused str[HASH_STRING_SIZE] = {};
84*2949576eSMichael Tretter 	uint32_t tmp[ROCKCHIP_OTP_RSA_HASH_SIZE] = {};
85*2949576eSMichael Tretter 	TEE_Result res = TEE_SUCCESS;
86*2949576eSMichael Tretter 
87*2949576eSMichael Tretter 	if (size != ROCKCHIP_OTP_RSA_HASH_SIZE)
88*2949576eSMichael Tretter 		return TEE_ERROR_GENERIC;
89*2949576eSMichael Tretter 
90*2949576eSMichael Tretter 	IMSG("Burning hash %s", otp_to_string(hash, str, sizeof(str)));
91*2949576eSMichael Tretter 
92*2949576eSMichael Tretter 	res = rockchip_otp_write_secure(hash,
93*2949576eSMichael Tretter 					ROCKCHIP_OTP_RSA_HASH_INDEX,
94*2949576eSMichael Tretter 					ROCKCHIP_OTP_RSA_HASH_SIZE);
95*2949576eSMichael Tretter 	if (res)
96*2949576eSMichael Tretter 		return res;
97*2949576eSMichael Tretter 
98*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(tmp,
99*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_INDEX,
100*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_SIZE);
101*2949576eSMichael Tretter 	if (res)
102*2949576eSMichael Tretter 		return res;
103*2949576eSMichael Tretter 	if (memcmp(tmp, hash, sizeof(tmp))) {
104*2949576eSMichael Tretter 		EMSG("Failed to burn hash. OTP is %s",
105*2949576eSMichael Tretter 		     otp_to_string(tmp, str, sizeof(str)));
106*2949576eSMichael Tretter 		return res;
107*2949576eSMichael Tretter 	}
108*2949576eSMichael Tretter 
109*2949576eSMichael Tretter 	return res;
110*2949576eSMichael Tretter }
111*2949576eSMichael Tretter 
get_info(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])112*2949576eSMichael Tretter static TEE_Result get_info(uint32_t param_types,
113*2949576eSMichael Tretter 			   TEE_Param params[TEE_NUM_PARAMS])
114*2949576eSMichael Tretter {
115*2949576eSMichael Tretter 	uint32_t hash[ROCKCHIP_OTP_RSA_HASH_SIZE] = {};
116*2949576eSMichael Tretter 	char __maybe_unused str[HASH_STRING_SIZE] = {};
117*2949576eSMichael Tretter 	struct pta_rk_secure_boot_info *info = NULL;
118*2949576eSMichael Tretter 	TEE_Result res = TEE_ERROR_GENERIC;
119*2949576eSMichael Tretter 	uint32_t status = 0;
120*2949576eSMichael Tretter 
121*2949576eSMichael Tretter 	if (param_types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_OUTPUT,
122*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE,
123*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE,
124*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE))
125*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
126*2949576eSMichael Tretter 
127*2949576eSMichael Tretter 	if (!IS_ALIGNED_WITH_TYPE(params[0].memref.buffer, typeof(*info)))
128*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
129*2949576eSMichael Tretter 
130*2949576eSMichael Tretter 	info = params[0].memref.buffer;
131*2949576eSMichael Tretter 	if (!info || params[0].memref.size != sizeof(*info))
132*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
133*2949576eSMichael Tretter 
134*2949576eSMichael Tretter 	memset(info, 0, sizeof(*info));
135*2949576eSMichael Tretter 
136*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(&status,
137*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_INDEX,
138*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_SIZE);
139*2949576eSMichael Tretter 	if (res)
140*2949576eSMichael Tretter 		return res;
141*2949576eSMichael Tretter 
142*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(hash,
143*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_INDEX,
144*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_SIZE);
145*2949576eSMichael Tretter 	if (res)
146*2949576eSMichael Tretter 		return res;
147*2949576eSMichael Tretter 
148*2949576eSMichael Tretter 	DMSG("Current hash: %s", otp_to_string(hash, str, sizeof(str)));
149*2949576eSMichael Tretter 
150*2949576eSMichael Tretter 	info->enabled = test_bit_mask(status,
151*2949576eSMichael Tretter 				      ROCKCHIP_OTP_SECURE_BOOT_STATUS_ENABLE);
152*2949576eSMichael Tretter 	info->simulation = IS_ENABLED(CFG_RK_SECURE_BOOT_SIMULATION);
153*2949576eSMichael Tretter 	memcpy(info->hash.value, hash, sizeof(info->hash.value));
154*2949576eSMichael Tretter 
155*2949576eSMichael Tretter 	return TEE_SUCCESS;
156*2949576eSMichael Tretter }
157*2949576eSMichael Tretter 
burn_hash(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])158*2949576eSMichael Tretter static TEE_Result burn_hash(uint32_t param_types,
159*2949576eSMichael Tretter 			    TEE_Param params[TEE_NUM_PARAMS])
160*2949576eSMichael Tretter {
161*2949576eSMichael Tretter 	uint32_t new_hash[ROCKCHIP_OTP_RSA_HASH_SIZE] = {};
162*2949576eSMichael Tretter 	uint32_t old_hash[ROCKCHIP_OTP_RSA_HASH_SIZE] = {};
163*2949576eSMichael Tretter 	char __maybe_unused str[HASH_STRING_SIZE] = {};
164*2949576eSMichael Tretter 	struct pta_rk_secure_boot_hash *hash = NULL;
165*2949576eSMichael Tretter 	TEE_Result res = TEE_SUCCESS;
166*2949576eSMichael Tretter 	uint32_t key_size_bits = 0;
167*2949576eSMichael Tretter 	uint32_t status = 0;
168*2949576eSMichael Tretter 	size_t hash_sz = 0;
169*2949576eSMichael Tretter 
170*2949576eSMichael Tretter 	if (param_types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
171*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_VALUE_INPUT,
172*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE,
173*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE))
174*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
175*2949576eSMichael Tretter 
176*2949576eSMichael Tretter 	hash = params[0].memref.buffer;
177*2949576eSMichael Tretter 	hash_sz = params[0].memref.size;
178*2949576eSMichael Tretter 	if (!hash || hash_sz != sizeof(*hash))
179*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
180*2949576eSMichael Tretter 	memcpy(new_hash, hash->value, sizeof(new_hash));
181*2949576eSMichael Tretter 
182*2949576eSMichael Tretter 	key_size_bits = params[1].value.a;
183*2949576eSMichael Tretter 	if (key_size_bits != 4096 && key_size_bits != 2048) {
184*2949576eSMichael Tretter 		EMSG("Invalid key size: %"PRId32, key_size_bits);
185*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
186*2949576eSMichael Tretter 	}
187*2949576eSMichael Tretter 
188*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(old_hash,
189*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_INDEX,
190*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_SIZE);
191*2949576eSMichael Tretter 	if (res)
192*2949576eSMichael Tretter 		return res;
193*2949576eSMichael Tretter 	if (memcmp(old_hash, new_hash, sizeof(new_hash))) {
194*2949576eSMichael Tretter 		EMSG("Refusing to burn hash %s",
195*2949576eSMichael Tretter 		     otp_to_string(new_hash, str, sizeof(str)));
196*2949576eSMichael Tretter 		EMSG("OTP hash is %s",
197*2949576eSMichael Tretter 		     otp_to_string(old_hash, str, sizeof(str)));
198*2949576eSMichael Tretter 		return res;
199*2949576eSMichael Tretter 	}
200*2949576eSMichael Tretter 
201*2949576eSMichael Tretter 	/*
202*2949576eSMichael Tretter 	 * Check if secure boot is already enabled after verifying the
203*2949576eSMichael Tretter 	 * parameters for reporting the correct error if the command would
204*2949576eSMichael Tretter 	 * result in the same state as the already fused board.
205*2949576eSMichael Tretter 	 */
206*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(&status,
207*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_INDEX,
208*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_SIZE);
209*2949576eSMichael Tretter 	if (res)
210*2949576eSMichael Tretter 		return res;
211*2949576eSMichael Tretter 	if (test_bit_mask(status, ROCKCHIP_OTP_SECURE_BOOT_STATUS_ENABLE)) {
212*2949576eSMichael Tretter 		DMSG("Secure boot already enabled");
213*2949576eSMichael Tretter 		return TEE_SUCCESS;
214*2949576eSMichael Tretter 	}
215*2949576eSMichael Tretter 
216*2949576eSMichael Tretter 	if (IS_ENABLED(CFG_RK_SECURE_BOOT_SIMULATION)) {
217*2949576eSMichael Tretter 		IMSG("Simulation mode: Skip burning hash %s, key size %"PRId32,
218*2949576eSMichael Tretter 		     otp_to_string(new_hash, str, sizeof(str)), key_size_bits);
219*2949576eSMichael Tretter 		return TEE_SUCCESS;
220*2949576eSMichael Tretter 	}
221*2949576eSMichael Tretter 
222*2949576eSMichael Tretter 	res = write_hash(new_hash, ARRAY_SIZE(new_hash));
223*2949576eSMichael Tretter 	if (res) {
224*2949576eSMichael Tretter 		EMSG("Failed to write hash");
225*2949576eSMichael Tretter 		return res;
226*2949576eSMichael Tretter 	}
227*2949576eSMichael Tretter 
228*2949576eSMichael Tretter 	res = write_key_size(key_size_bits);
229*2949576eSMichael Tretter 	if (res) {
230*2949576eSMichael Tretter 		EMSG("Failed to write key size");
231*2949576eSMichael Tretter 		return res;
232*2949576eSMichael Tretter 	}
233*2949576eSMichael Tretter 
234*2949576eSMichael Tretter 	return TEE_SUCCESS;
235*2949576eSMichael Tretter }
236*2949576eSMichael Tretter 
lockdown_device(uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS]__unused)237*2949576eSMichael Tretter static TEE_Result lockdown_device(uint32_t param_types,
238*2949576eSMichael Tretter 				  TEE_Param params[TEE_NUM_PARAMS] __unused)
239*2949576eSMichael Tretter {
240*2949576eSMichael Tretter 	uint32_t hash[ROCKCHIP_OTP_RSA_HASH_SIZE] = {};
241*2949576eSMichael Tretter 	uint32_t zero[ROCKCHIP_OTP_RSA_HASH_SIZE] = {};
242*2949576eSMichael Tretter 	TEE_Result res = TEE_ERROR_GENERIC;
243*2949576eSMichael Tretter 	uint32_t status = 0;
244*2949576eSMichael Tretter 
245*2949576eSMichael Tretter 	if (param_types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE,
246*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE,
247*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE,
248*2949576eSMichael Tretter 					   TEE_PARAM_TYPE_NONE))
249*2949576eSMichael Tretter 		return TEE_ERROR_BAD_PARAMETERS;
250*2949576eSMichael Tretter 
251*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(hash,
252*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_INDEX,
253*2949576eSMichael Tretter 				       ROCKCHIP_OTP_RSA_HASH_SIZE);
254*2949576eSMichael Tretter 	if (res)
255*2949576eSMichael Tretter 		return res;
256*2949576eSMichael Tretter 	if (!memcmp(zero, hash, sizeof(hash))) {
257*2949576eSMichael Tretter 		EMSG("OTP hash is all zeros. Refuse lockdown.");
258*2949576eSMichael Tretter 		return TEE_ERROR_GENERIC;
259*2949576eSMichael Tretter 	}
260*2949576eSMichael Tretter 
261*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(&status,
262*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_INDEX,
263*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_SIZE);
264*2949576eSMichael Tretter 	if (res)
265*2949576eSMichael Tretter 		return res;
266*2949576eSMichael Tretter 	if (test_bit_mask(status, ROCKCHIP_OTP_SECURE_BOOT_STATUS_ENABLE)) {
267*2949576eSMichael Tretter 		DMSG("Secure boot already enabled");
268*2949576eSMichael Tretter 		return TEE_SUCCESS;
269*2949576eSMichael Tretter 	}
270*2949576eSMichael Tretter 
271*2949576eSMichael Tretter 	status = ROCKCHIP_OTP_SECURE_BOOT_STATUS_ENABLE;
272*2949576eSMichael Tretter 
273*2949576eSMichael Tretter 	if (IS_ENABLED(CFG_RK_SECURE_BOOT_SIMULATION)) {
274*2949576eSMichael Tretter 		IMSG("Simulation mode: Skip writing status: %"PRIx32,
275*2949576eSMichael Tretter 		     status);
276*2949576eSMichael Tretter 		return TEE_SUCCESS;
277*2949576eSMichael Tretter 	}
278*2949576eSMichael Tretter 
279*2949576eSMichael Tretter 	IMSG("Writing secure boot status: %"PRIx32, status);
280*2949576eSMichael Tretter 	res = rockchip_otp_write_secure(&status,
281*2949576eSMichael Tretter 					ROCKCHIP_OTP_SECURE_BOOT_STATUS_INDEX,
282*2949576eSMichael Tretter 					ROCKCHIP_OTP_SECURE_BOOT_STATUS_SIZE);
283*2949576eSMichael Tretter 	if (res)
284*2949576eSMichael Tretter 		return res;
285*2949576eSMichael Tretter 
286*2949576eSMichael Tretter 	res = rockchip_otp_read_secure(&status,
287*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_INDEX,
288*2949576eSMichael Tretter 				       ROCKCHIP_OTP_SECURE_BOOT_STATUS_SIZE);
289*2949576eSMichael Tretter 	if (res)
290*2949576eSMichael Tretter 		return res;
291*2949576eSMichael Tretter 	if (test_bit_mask(status, ROCKCHIP_OTP_SECURE_BOOT_STATUS_ENABLE)) {
292*2949576eSMichael Tretter 		EMSG("Failed to write secure boot status");
293*2949576eSMichael Tretter 		return TEE_ERROR_GENERIC;
294*2949576eSMichael Tretter 	}
295*2949576eSMichael Tretter 
296*2949576eSMichael Tretter 	return TEE_SUCCESS;
297*2949576eSMichael Tretter }
298*2949576eSMichael Tretter 
invoke_command(void * sess_ctx __unused,uint32_t cmd_id,uint32_t param_types,TEE_Param params[TEE_NUM_PARAMS])299*2949576eSMichael Tretter static TEE_Result invoke_command(void *sess_ctx __unused, uint32_t cmd_id,
300*2949576eSMichael Tretter 				 uint32_t param_types,
301*2949576eSMichael Tretter 				 TEE_Param params[TEE_NUM_PARAMS])
302*2949576eSMichael Tretter {
303*2949576eSMichael Tretter 	TEE_Result res = TEE_ERROR_BAD_PARAMETERS;
304*2949576eSMichael Tretter 	TEE_Param bparams[TEE_NUM_PARAMS] = { };
305*2949576eSMichael Tretter 	TEE_Result res2 = TEE_ERROR_GENERIC;
306*2949576eSMichael Tretter 	TEE_Param *eparams = NULL;
307*2949576eSMichael Tretter 
308*2949576eSMichael Tretter 	res = to_bounce_params(param_types, params, bparams, &eparams);
309*2949576eSMichael Tretter 	if (res)
310*2949576eSMichael Tretter 		return res;
311*2949576eSMichael Tretter 
312*2949576eSMichael Tretter 	switch (cmd_id) {
313*2949576eSMichael Tretter 	case PTA_RK_SECURE_BOOT_GET_INFO:
314*2949576eSMichael Tretter 		res = get_info(param_types, eparams);
315*2949576eSMichael Tretter 		break;
316*2949576eSMichael Tretter 	case PTA_RK_SECURE_BOOT_BURN_HASH:
317*2949576eSMichael Tretter 		res = burn_hash(param_types, eparams);
318*2949576eSMichael Tretter 		break;
319*2949576eSMichael Tretter 	case PTA_RK_SECURE_BOOT_LOCKDOWN_DEVICE:
320*2949576eSMichael Tretter 		res = lockdown_device(param_types, eparams);
321*2949576eSMichael Tretter 		break;
322*2949576eSMichael Tretter 	default:
323*2949576eSMichael Tretter 		break;
324*2949576eSMichael Tretter 	}
325*2949576eSMichael Tretter 
326*2949576eSMichael Tretter 	res2 = from_bounce_params(param_types, params, bparams, eparams);
327*2949576eSMichael Tretter 	if (!res && res2)
328*2949576eSMichael Tretter 		res = res2;
329*2949576eSMichael Tretter 
330*2949576eSMichael Tretter 	return res;
331*2949576eSMichael Tretter }
332*2949576eSMichael Tretter 
333*2949576eSMichael Tretter pseudo_ta_register(.uuid = PTA_RK_SECURE_BOOT_UUID,
334*2949576eSMichael Tretter 		   .name = PTA_NAME,
335*2949576eSMichael Tretter 		   .flags = PTA_DEFAULT_FLAGS,
336*2949576eSMichael Tretter 		   .invoke_command_entry_point = invoke_command);
337