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