// SPDX-License-Identifier: BSD-2-Clause /* * Copyright 2019 Broadcom. */ #include #include #include #include #include #include #include #define BNXT_SERVICE_UUID \ {0x6272636D, 0x2019, 0x0716, \ {0x42, 0x43, 0x4D, 0x5F, 0x53, 0x43, 0x48, 0x49} } /* * enum pta_bnxt_cmd - commands supported by this PTA * PTA_BNXT_FASTBOOT: boot bnxt device by copying f/w into sram * * PTA_BNXT_HEALTH_STATUS: check health of bnxt device * [out] value[0].a - health status * * PTA_BNXT_HANDSHAKE_STATUS: check bnxt device is booted * [inout] value[0].a - max timeout value * value[0].a - boot status * * PTA_BNXT_CRASH_DUMP_COPY: copy the core dump into shm * [inout] memref[0].buf: destination addr * [in] value[1].a: offset * [in] value[1].b: size */ enum pta_bnxt_cmd { PTA_BNXT_FASTBOOT = 0, PTA_BNXT_HEALTH_STATUS, PTA_BNXT_HANDSHAKE_STATUS, PTA_BNXT_CRASH_DUMP_COPY, }; #define BNXT_TA_NAME "pta_bnxt.ta" static TEE_Result get_bnxt_status(uint32_t type, TEE_Param p[TEE_NUM_PARAMS]) { if (type != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE)) return TEE_ERROR_BAD_PARAMETERS; p[0].value.a = bnxt_health_status(); return TEE_SUCCESS; } static TEE_Result get_bnxt_handshake_status(uint32_t type, TEE_Param p[TEE_NUM_PARAMS]) { if (type != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE)) return TEE_ERROR_BAD_PARAMETERS; p[0].value.a = bnxt_wait_handshake(p[0].value.a); return TEE_SUCCESS; } static TEE_Result copy_bnxt_crash_dump(uint32_t types, TEE_Param params[TEE_NUM_PARAMS]) { uint32_t *d = NULL; uint32_t offset = 0; uint32_t req_len = 0; TEE_Result res = TEE_SUCCESS; if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT, TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE)) { DMSG("bad parameters types: 0x%" PRIx32, types); return TEE_ERROR_BAD_PARAMETERS; } d = (uint32_t *)params[0].memref.buffer; offset = params[1].value.a; req_len = params[1].value.b; if (!d || params[0].memref.size < req_len) return TEE_ERROR_BAD_PARAMETERS; res = bnxt_copy_crash_dump((uint8_t *)d, offset, req_len); return res; } static TEE_Result invoke_command(void *session_context __unused, uint32_t cmd_id, uint32_t param_types __unused, TEE_Param params[TEE_NUM_PARAMS] __unused) { TEE_Result res = TEE_SUCCESS; DMSG("command entry point[%d] for \"%s\"", cmd_id, BNXT_TA_NAME); switch (cmd_id) { case PTA_BNXT_FASTBOOT: DMSG("bnxt fastboot"); if (bnxt_load_fw(1) != BNXT_SUCCESS) return TEE_ERROR_TARGET_DEAD; break; case PTA_BNXT_HEALTH_STATUS: DMSG("bnxt health status"); return get_bnxt_status(param_types, params); case PTA_BNXT_HANDSHAKE_STATUS: DMSG("bnxt handshake status"); return get_bnxt_handshake_status(param_types, params); case PTA_BNXT_CRASH_DUMP_COPY: DMSG("bnxt copy crash dump data"); return copy_bnxt_crash_dump(param_types, params); default: DMSG("cmd: %d Not supported %s", cmd_id, BNXT_TA_NAME); res = TEE_ERROR_NOT_SUPPORTED; break; } return res; } pseudo_ta_register(.uuid = BNXT_SERVICE_UUID, .name = BNXT_TA_NAME, .flags = PTA_DEFAULT_FLAGS | TA_FLAG_DEVICE_ENUM, .invoke_command_entry_point = invoke_command);