xref: /optee_os/core/include/drivers/versal_puf.h (revision 107905a9985f155551b775361c3d593119d79e82)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (C) 2022 Foundries.io Ltd
4  * Jorge Ramirez-Ortiz <jorge@foundries.io>
5  */
6 
7 #ifndef __DRIVERS_VERSAL_PUF_H
8 #define __DRIVERS_VERSAL_PUF_H
9 
10 #include <platform_config.h>
11 #include <tee_api_types.h>
12 #include <types_ext.h>
13 #include <util.h>
14 
15 #define VERSAL_PUF_REGISTRATION			0x0
16 #define VERSAL_PUF_REGEN_ON_DEMAND		0x1
17 #define VERSAL_PUF_REGEN_ID_ONLY		0x2
18 #if defined(PLATFORM_FLAVOR_net)
19 #define VERSAL_PUF_SHUTTER_VALUE		0x01000080
20 #define VERSAL_PUF_RO_SWAP_VALUE		0x0
21 #else
22 #define VERSAL_PUF_SHUTTER_VALUE		0x81000100
23 #endif
24 #define VERSAL_PUF_GLBL_VAR_FLTR_OPTION		1
25 #define VERSAL_PUF_READ_FROM_RAM		0
26 #define VERSAL_PUF_READ_FROM_EFUSE_CACHE	1
27 #define VERSAL_PUF_4K_PUF_SYN_LEN_IN_WORDS	140
28 
29 #define VERSAL_PUF_EFUSE_SYN_WORDS		127
30 #define VERSAL_PUF_SYNDROME_WORDS		350
31 #define VERSAL_PUF_ID_WORDS			8
32 #define VERSAL_PUF_HASH_LEN			4
33 #define VERSAL_PUF_AUX_LEN			4
34 
35 struct versal_puf_data {
36 	uint32_t syndrome_data[VERSAL_PUF_SYNDROME_WORDS];
37 	uint32_t chash;
38 	uint32_t aux;
39 	uint32_t puf_id[VERSAL_PUF_ID_WORDS];
40 	uint32_t efuse_syn_data[VERSAL_PUF_EFUSE_SYN_WORDS];
41 };
42 
43 struct versal_puf_cfg {
44 	uint8_t puf_operation;
45 	uint8_t global_var_filter;
46 	uint8_t read_option;
47 	uint32_t shutter_value;
48 #if defined(PLATFORM_FLAVOR_net)
49 	uint32_t ro_swap_value;
50 #endif
51 };
52 
53 struct versal_puf_data_req {
54 	uint8_t puf_operation;
55 	uint8_t global_var_filter;
56 	uint8_t read_option;
57 	uint32_t shutter_value;
58 	uint64_t syndrome_data_addr;
59 	uint64_t hash_addr;
60 	uint64_t aux_addr;
61 	uint64_t puf_id_addr;
62 	uint64_t syndrome_addr;
63 	uint64_t efuse_syn_data_addr;
64 #if defined(PLATFORM_FLAVOR_net)
65 	uint32_t ro_swap_value;
66 	uint8_t pad[4];
67 #else
68 	uint8_t pad[8];
69 #endif
70 };
71 
72 enum versal_puf_api {
73 	VERSAL_PUF_API_FEATURES = 0U,
74 	VERSAL_PUF_REGISTER,
75 	VERSAL_PUF_REGENERATE,
76 	VERSAL_PUF_CLEAR_ID,
77 };
78 
79 #define __aligned_puf	__aligned(CACHELINE_LEN)
80 
81 TEE_Result versal_puf_regenerate(struct versal_puf_data *buf,
82 				 struct versal_puf_cfg *cfg);
83 TEE_Result versal_puf_register(struct versal_puf_data *buf,
84 			       struct versal_puf_cfg *cfg);
85 TEE_Result versal_puf_check_api(enum versal_puf_api id);
86 TEE_Result versal_puf_clear_id(void);
87 
88 #endif /* __DRIVERS_VERSAL_PUF_H */
89