1*25781fd4SRahul Gupta // SPDX-License-Identifier: BSD-2-Clause 2*25781fd4SRahul Gupta /* 3*25781fd4SRahul Gupta * Copyright (c) 2019, Broadcom 4*25781fd4SRahul Gupta */ 5*25781fd4SRahul Gupta 6*25781fd4SRahul Gupta #include <drivers/bcm_sotp.h> 7*25781fd4SRahul Gupta #include <io.h> 8*25781fd4SRahul Gupta #include <kernel/misc.h> 9*25781fd4SRahul Gupta #include <kernel/pseudo_ta.h> 10*25781fd4SRahul Gupta 11*25781fd4SRahul Gupta #define SOTP_SERVICE_UUID \ 12*25781fd4SRahul Gupta {0x6272636D, 0x2018, 0x1101, \ 13*25781fd4SRahul Gupta {0x42, 0x43, 0x4D, 0x5F, 0x53, 0x4F, 0x54, 0x50} } 14*25781fd4SRahul Gupta 15*25781fd4SRahul Gupta enum pta_bcm_sotp_cmd { 16*25781fd4SRahul Gupta PTA_BCM_SOTP_CMD_READ = 0, 17*25781fd4SRahul Gupta PTA_BCM_SOTP_CMD_WRITE, 18*25781fd4SRahul Gupta }; 19*25781fd4SRahul Gupta 20*25781fd4SRahul Gupta #define SOTP_TA_NAME "pta_bcm_sotp.ta" 21*25781fd4SRahul Gupta 22*25781fd4SRahul Gupta static TEE_Result pta_sotp_read(uint32_t param_types, 23*25781fd4SRahul Gupta TEE_Param params[TEE_NUM_PARAMS]) 24*25781fd4SRahul Gupta { 25*25781fd4SRahul Gupta uint64_t sotp_row_value = 0; 26*25781fd4SRahul Gupta uint32_t val = 0; 27*25781fd4SRahul Gupta uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 28*25781fd4SRahul Gupta TEE_PARAM_TYPE_VALUE_OUTPUT, 29*25781fd4SRahul Gupta TEE_PARAM_TYPE_NONE, 30*25781fd4SRahul Gupta TEE_PARAM_TYPE_NONE); 31*25781fd4SRahul Gupta if (exp_param_types != param_types) { 32*25781fd4SRahul Gupta EMSG("Invalid Param types"); 33*25781fd4SRahul Gupta return TEE_ERROR_BAD_PARAMETERS; 34*25781fd4SRahul Gupta } 35*25781fd4SRahul Gupta 36*25781fd4SRahul Gupta val = params[0].value.a; 37*25781fd4SRahul Gupta 38*25781fd4SRahul Gupta bcm_iproc_sotp_mem_read(val, 1, &sotp_row_value); 39*25781fd4SRahul Gupta reg_pair_from_64(sotp_row_value, ¶ms[1].value.a, 40*25781fd4SRahul Gupta ¶ms[1].value.b); 41*25781fd4SRahul Gupta 42*25781fd4SRahul Gupta return TEE_SUCCESS; 43*25781fd4SRahul Gupta } 44*25781fd4SRahul Gupta 45*25781fd4SRahul Gupta static TEE_Result pta_sotp_write(uint32_t param_types __unused, 46*25781fd4SRahul Gupta TEE_Param params[TEE_NUM_PARAMS] __unused) 47*25781fd4SRahul Gupta { 48*25781fd4SRahul Gupta /* Nothing as of now */ 49*25781fd4SRahul Gupta return TEE_ERROR_NOT_IMPLEMENTED; 50*25781fd4SRahul Gupta } 51*25781fd4SRahul Gupta 52*25781fd4SRahul Gupta static TEE_Result invoke_command(void *session_context __unused, 53*25781fd4SRahul Gupta uint32_t cmd_id, 54*25781fd4SRahul Gupta uint32_t param_types, 55*25781fd4SRahul Gupta TEE_Param params[TEE_NUM_PARAMS]) 56*25781fd4SRahul Gupta { 57*25781fd4SRahul Gupta TEE_Result res = TEE_SUCCESS; 58*25781fd4SRahul Gupta 59*25781fd4SRahul Gupta DMSG("command entry point[%d] for \"%s\"", cmd_id, SOTP_TA_NAME); 60*25781fd4SRahul Gupta 61*25781fd4SRahul Gupta switch (cmd_id) { 62*25781fd4SRahul Gupta case PTA_BCM_SOTP_CMD_READ: 63*25781fd4SRahul Gupta res = pta_sotp_read(param_types, params); 64*25781fd4SRahul Gupta break; 65*25781fd4SRahul Gupta case PTA_BCM_SOTP_CMD_WRITE: 66*25781fd4SRahul Gupta res = pta_sotp_write(param_types, params); 67*25781fd4SRahul Gupta break; 68*25781fd4SRahul Gupta default: 69*25781fd4SRahul Gupta EMSG("cmd %d Not supported %s", cmd_id, SOTP_TA_NAME); 70*25781fd4SRahul Gupta res = TEE_ERROR_NOT_SUPPORTED; 71*25781fd4SRahul Gupta break; 72*25781fd4SRahul Gupta } 73*25781fd4SRahul Gupta 74*25781fd4SRahul Gupta return res; 75*25781fd4SRahul Gupta } 76*25781fd4SRahul Gupta 77*25781fd4SRahul Gupta pseudo_ta_register(.uuid = SOTP_SERVICE_UUID, 78*25781fd4SRahul Gupta .name = SOTP_TA_NAME, 79*25781fd4SRahul Gupta .flags = PTA_DEFAULT_FLAGS, 80*25781fd4SRahul Gupta .invoke_command_entry_point = invoke_command); 81