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