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