1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright 2019 Broadcom. 4 */ 5 6 #include <drivers/bcm/bnxt.h> 7 #include <io.h> 8 #include <kernel/misc.h> 9 #include <kernel/pseudo_ta.h> 10 #include <mm/core_memprot.h> 11 #include <string.h> 12 #include <util.h> 13 14 #define BNXT_SERVICE_UUID \ 15 {0x6272636D, 0x2019, 0x0716, \ 16 {0x42, 0x43, 0x4D, 0x5F, 0x53, 0x43, 0x48, 0x49} } 17 18 /* 19 * enum pta_bnxt_cmd - commands supported by this PTA 20 * PTA_BNXT_FASTBOOT: boot bnxt device by copying f/w into sram 21 * 22 * PTA_BNXT_HEALTH_STATUS: check health of bnxt device 23 * [out] value[0].a - health status 24 * 25 * PTA_BNXT_HANDSHAKE_STATUS: check bnxt device is booted 26 * [inout] value[0].a - max timeout value 27 * value[0].a - boot status 28 * 29 * PTA_BNXT_CRASH_DUMP_COPY: copy the core dump into shm 30 * [inout] memref[0].buf: destination addr 31 * [in] value[1].a: offset 32 * [in] value[1].b: size 33 */ 34 enum pta_bnxt_cmd { 35 PTA_BNXT_FASTBOOT = 0, 36 PTA_BNXT_HEALTH_STATUS, 37 PTA_BNXT_HANDSHAKE_STATUS, 38 PTA_BNXT_CRASH_DUMP_COPY, 39 }; 40 41 #define BNXT_TA_NAME "pta_bnxt.ta" 42 43 static TEE_Result get_bnxt_status(uint32_t type, TEE_Param p[TEE_NUM_PARAMS]) 44 { 45 if (type != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT, 46 TEE_PARAM_TYPE_NONE, 47 TEE_PARAM_TYPE_NONE, 48 TEE_PARAM_TYPE_NONE)) 49 return TEE_ERROR_BAD_PARAMETERS; 50 51 p[0].value.a = bnxt_health_status(); 52 53 return TEE_SUCCESS; 54 } 55 56 static TEE_Result get_bnxt_handshake_status(uint32_t type, 57 TEE_Param p[TEE_NUM_PARAMS]) 58 { 59 if (type != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT, 60 TEE_PARAM_TYPE_NONE, 61 TEE_PARAM_TYPE_NONE, 62 TEE_PARAM_TYPE_NONE)) 63 return TEE_ERROR_BAD_PARAMETERS; 64 65 p[0].value.a = bnxt_wait_handshake(p[0].value.a); 66 67 return TEE_SUCCESS; 68 } 69 70 static TEE_Result copy_bnxt_crash_dump(uint32_t types, 71 TEE_Param params[TEE_NUM_PARAMS]) 72 { 73 uint32_t *d = NULL; 74 uint32_t offset = 0; 75 uint32_t req_len = 0; 76 TEE_Result res = TEE_SUCCESS; 77 78 if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT, 79 TEE_PARAM_TYPE_VALUE_INPUT, 80 TEE_PARAM_TYPE_NONE, 81 TEE_PARAM_TYPE_NONE)) { 82 DMSG("bad parameters types: 0x%" PRIx32, types); 83 return TEE_ERROR_BAD_PARAMETERS; 84 } 85 86 d = (uint32_t *)params[0].memref.buffer; 87 offset = params[1].value.a; 88 req_len = params[1].value.b; 89 90 if (!d || params[0].memref.size < req_len) 91 return TEE_ERROR_BAD_PARAMETERS; 92 93 res = bnxt_copy_crash_dump((uint8_t *)d, offset, req_len); 94 95 return res; 96 } 97 98 static TEE_Result invoke_command(void *session_context __unused, 99 uint32_t cmd_id, 100 uint32_t param_types __unused, 101 TEE_Param params[TEE_NUM_PARAMS] __unused) 102 { 103 TEE_Result res = TEE_SUCCESS; 104 105 DMSG("command entry point[%d] for \"%s\"", cmd_id, BNXT_TA_NAME); 106 107 switch (cmd_id) { 108 case PTA_BNXT_FASTBOOT: 109 DMSG("bnxt fastboot"); 110 if (bnxt_load_fw(1) != BNXT_SUCCESS) 111 return TEE_ERROR_TARGET_DEAD; 112 break; 113 case PTA_BNXT_HEALTH_STATUS: 114 DMSG("bnxt health status"); 115 return get_bnxt_status(param_types, params); 116 case PTA_BNXT_HANDSHAKE_STATUS: 117 DMSG("bnxt handshake status"); 118 return get_bnxt_handshake_status(param_types, params); 119 case PTA_BNXT_CRASH_DUMP_COPY: 120 DMSG("bnxt copy crash dump data"); 121 return copy_bnxt_crash_dump(param_types, params); 122 default: 123 DMSG("cmd: %d Not supported %s", cmd_id, BNXT_TA_NAME); 124 res = TEE_ERROR_NOT_SUPPORTED; 125 break; 126 } 127 128 return res; 129 } 130 131 pseudo_ta_register(.uuid = BNXT_SERVICE_UUID, 132 .name = BNXT_TA_NAME, 133 .flags = PTA_DEFAULT_FLAGS | TA_FLAG_DEVICE_ENUM, 134 .invoke_command_entry_point = invoke_command); 135