1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (c) 2019, Broadcom 4 */ 5 6 #include <drivers/bcm_hwrng.h> 7 #include <io.h> 8 #include <kernel/pseudo_ta.h> 9 #include <trace.h> 10 11 #define HWRNG_SERVICE_UUID \ 12 { 0x6272636D, 0x2019, 0x0201, \ 13 { 0x42, 0x43, 0x4D, 0x5F, 0x52, 0x4E, 0x47, 0x30 } } 14 15 /* 16 * Get a HW generated random number 17 * 18 * [out] value[0].a: Generated 32-bit random number 19 */ 20 #define PTA_BCM_HWRNG_CMD_GET 0 21 22 #define HWRNG_TA_NAME "pta_hwrng.ta" 23 24 static TEE_Result pta_hwrng_get(uint32_t param_types, 25 TEE_Param params[TEE_NUM_PARAMS]) 26 { 27 uint32_t num_words = 0; 28 uint32_t rnd_num = 0; 29 uint32_t res = 0; 30 uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT, 31 TEE_PARAM_TYPE_NONE, 32 TEE_PARAM_TYPE_NONE, 33 TEE_PARAM_TYPE_NONE); 34 35 if (exp_param_types != param_types) { 36 EMSG("Invalid Param types"); 37 return TEE_ERROR_BAD_PARAMETERS; 38 } 39 40 num_words = bcm_hwrng_read_rng(&rnd_num, 1); 41 42 if (num_words < 1) { 43 res = TEE_ERROR_NO_DATA; 44 } else { 45 DMSG("Random Value is: 0x%08x", rnd_num); 46 params[0].value.a = rnd_num; 47 res = TEE_SUCCESS; 48 } 49 50 return res; 51 } 52 53 static TEE_Result invoke_command(void *session_context __unused, 54 uint32_t cmd_id, 55 uint32_t param_types, 56 TEE_Param params[TEE_NUM_PARAMS]) 57 { 58 TEE_Result res = TEE_SUCCESS; 59 60 DMSG("command entry point[%d] for \"%s\"", cmd_id, HWRNG_TA_NAME); 61 62 switch (cmd_id) { 63 case PTA_BCM_HWRNG_CMD_GET: 64 res = pta_hwrng_get(param_types, params); 65 break; 66 default: 67 EMSG("cmd: %d Not supported %s", cmd_id, HWRNG_TA_NAME); 68 res = TEE_ERROR_NOT_SUPPORTED; 69 break; 70 } 71 72 return res; 73 } 74 75 pseudo_ta_register(.uuid = HWRNG_SERVICE_UUID, 76 .name = HWRNG_TA_NAME, 77 .flags = PTA_DEFAULT_FLAGS, 78 .invoke_command_entry_point = invoke_command); 79