blob: e753305640c11d071d5969e8be974bb32b617d56 [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright 2019 Broadcom.
*/
#include <drivers/bcm/bnxt.h>
#include <io.h>
#include <kernel/misc.h>
#include <kernel/pseudo_ta.h>
#include <mm/core_memprot.h>
#include <string.h>
#include <util.h>
#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);