1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2019, Broadcom 4 */ 5 6 #include <config.h> 7 #include <drivers/bcm_sotp.h> 8 #include <io.h> 9 #include <kernel/misc.h> 10 #include <kernel/pseudo_ta.h> 11 12 #define SOTP_SERVICE_UUID \ 13 {0x6272636D, 0x2018, 0x1101, \ 14 {0x42, 0x43, 0x4D, 0x5F, 0x53, 0x4F, 0x54, 0x50} } 15 16 enum pta_bcm_sotp_cmd { 17 PTA_BCM_SOTP_CMD_READ = 0, 18 PTA_BCM_SOTP_CMD_WRITE, 19 }; 20 21 #define SOTP_TA_NAME "pta_bcm_sotp.ta" 22 23 static bool sotp_access_disabled; 24 25 /** 26 * close_session() - Print a debug message when closing a session and set the 27 * driver to disallow any more pta sessions to connect. 28 * @pSessionContext Unused. 29 */ 30 static void close_session(void *pSessionContext __unused) 31 { 32 DMSG("close entry point for \"%s\"", SOTP_TA_NAME); 33 if (IS_ENABLED(CFG_BCM_SOTP_SINGLE_SESSION)) 34 sotp_access_disabled = true; 35 } 36 37 static TEE_Result pta_sotp_read(uint32_t param_types, 38 TEE_Param params[TEE_NUM_PARAMS]) 39 { 40 uint64_t sotp_row_value = 0; 41 uint32_t val = 0; 42 uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 43 TEE_PARAM_TYPE_VALUE_OUTPUT, 44 TEE_PARAM_TYPE_NONE, 45 TEE_PARAM_TYPE_NONE); 46 if (exp_param_types != param_types) { 47 EMSG("Invalid Param types"); 48 return TEE_ERROR_BAD_PARAMETERS; 49 } 50 51 val = params[0].value.a; 52 53 bcm_iproc_sotp_mem_read(val, true, &sotp_row_value); 54 reg_pair_from_64(sotp_row_value, ¶ms[1].value.a, 55 ¶ms[1].value.b); 56 57 return TEE_SUCCESS; 58 } 59 60 static TEE_Result pta_sotp_write(uint32_t param_types __unused, 61 TEE_Param params[TEE_NUM_PARAMS] __unused) 62 { 63 /* Nothing as of now */ 64 return TEE_ERROR_NOT_IMPLEMENTED; 65 } 66 67 static TEE_Result invoke_command(void *session_context __unused, 68 uint32_t cmd_id, 69 uint32_t param_types, 70 TEE_Param params[TEE_NUM_PARAMS]) 71 { 72 TEE_Result res = TEE_SUCCESS; 73 74 DMSG("command entry point[%d] for \"%s\"", cmd_id, SOTP_TA_NAME); 75 76 if (IS_ENABLED(CFG_BCM_SOTP_SINGLE_SESSION) && sotp_access_disabled) { 77 DMSG("bcm sotp pta access disabled"); 78 return TEE_ERROR_ACCESS_DENIED; 79 } 80 81 switch (cmd_id) { 82 case PTA_BCM_SOTP_CMD_READ: 83 res = pta_sotp_read(param_types, params); 84 break; 85 case PTA_BCM_SOTP_CMD_WRITE: 86 res = pta_sotp_write(param_types, params); 87 break; 88 default: 89 EMSG("cmd %d Not supported %s", cmd_id, SOTP_TA_NAME); 90 res = TEE_ERROR_NOT_SUPPORTED; 91 break; 92 } 93 94 return res; 95 } 96 97 pseudo_ta_register(.uuid = SOTP_SERVICE_UUID, 98 .name = SOTP_TA_NAME, 99 .flags = PTA_DEFAULT_FLAGS, 100 .close_session_entry_point = close_session, 101 .invoke_command_entry_point = invoke_command); 102