xref: /optee_os/core/pta/bcm/bnxt.c (revision c17b9e1c337584e82c108d4c3eaeac9c7aed6525)
16c5fa4feSVikas Gupta // SPDX-License-Identifier: BSD-2-Clause
26c5fa4feSVikas Gupta /*
36c5fa4feSVikas Gupta  * Copyright 2019 Broadcom.
46c5fa4feSVikas Gupta  */
56c5fa4feSVikas Gupta 
66c5fa4feSVikas Gupta #include <drivers/bcm/bnxt.h>
76c5fa4feSVikas Gupta #include <io.h>
86c5fa4feSVikas Gupta #include <kernel/misc.h>
96c5fa4feSVikas Gupta #include <kernel/pseudo_ta.h>
106c5fa4feSVikas Gupta #include <mm/core_memprot.h>
116c5fa4feSVikas Gupta #include <string.h>
126c5fa4feSVikas Gupta #include <util.h>
136c5fa4feSVikas Gupta 
146c5fa4feSVikas Gupta #define BNXT_SERVICE_UUID \
156c5fa4feSVikas Gupta 		{0x6272636D, 0x2019, 0x0716,  \
166c5fa4feSVikas Gupta 		{0x42, 0x43, 0x4D, 0x5F, 0x53, 0x43, 0x48, 0x49} }
176c5fa4feSVikas Gupta 
18*c17b9e1cSSheetal Tigadoli /*
19*c17b9e1cSSheetal Tigadoli  * enum pta_bnxt_cmd - commands supported by this PTA
20*c17b9e1cSSheetal Tigadoli  * PTA_BNXT_FASTBOOT:		boot bnxt device by copying f/w into sram
21*c17b9e1cSSheetal Tigadoli  *
22*c17b9e1cSSheetal Tigadoli  * PTA_BNXT_HEALTH_STATUS:	check health of bnxt device
23*c17b9e1cSSheetal Tigadoli  *					[out] value[0].a - health status
24*c17b9e1cSSheetal Tigadoli  *
25*c17b9e1cSSheetal Tigadoli  * PTA_BNXT_HANDSHAKE_STATUS:	check bnxt device is booted
26*c17b9e1cSSheetal Tigadoli  *					[inout] value[0].a - max timeout value
27*c17b9e1cSSheetal Tigadoli  *						value[0].a - boot status
28*c17b9e1cSSheetal Tigadoli  *
29*c17b9e1cSSheetal Tigadoli  * PTA_BNXT_CRASH_DUMP_COPY:	copy the core dump into shm
30*c17b9e1cSSheetal Tigadoli  *					[inout] memref[0].buf: destination addr
31*c17b9e1cSSheetal Tigadoli  *					[in] value[1].a: offset
32*c17b9e1cSSheetal Tigadoli  *					[in] value[1].b: size
33*c17b9e1cSSheetal Tigadoli  */
346c5fa4feSVikas Gupta enum pta_bnxt_cmd {
356c5fa4feSVikas Gupta 	PTA_BNXT_FASTBOOT = 0,
36*c17b9e1cSSheetal Tigadoli 	PTA_BNXT_HEALTH_STATUS,
37*c17b9e1cSSheetal Tigadoli 	PTA_BNXT_HANDSHAKE_STATUS,
38*c17b9e1cSSheetal Tigadoli 	PTA_BNXT_CRASH_DUMP_COPY,
396c5fa4feSVikas Gupta };
406c5fa4feSVikas Gupta 
416c5fa4feSVikas Gupta #define BNXT_TA_NAME		"pta_bnxt.ta"
426c5fa4feSVikas Gupta 
get_bnxt_status(uint32_t type,TEE_Param p[TEE_NUM_PARAMS])43*c17b9e1cSSheetal Tigadoli static TEE_Result get_bnxt_status(uint32_t type, TEE_Param p[TEE_NUM_PARAMS])
446c5fa4feSVikas Gupta {
45*c17b9e1cSSheetal Tigadoli 	if (type != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT,
46*c17b9e1cSSheetal Tigadoli 				    TEE_PARAM_TYPE_NONE,
47*c17b9e1cSSheetal Tigadoli 				    TEE_PARAM_TYPE_NONE,
48*c17b9e1cSSheetal Tigadoli 				    TEE_PARAM_TYPE_NONE))
49*c17b9e1cSSheetal Tigadoli 		return TEE_ERROR_BAD_PARAMETERS;
50*c17b9e1cSSheetal Tigadoli 
51*c17b9e1cSSheetal Tigadoli 	p[0].value.a = bnxt_health_status();
52*c17b9e1cSSheetal Tigadoli 
536c5fa4feSVikas Gupta 	return TEE_SUCCESS;
546c5fa4feSVikas Gupta }
556c5fa4feSVikas Gupta 
get_bnxt_handshake_status(uint32_t type,TEE_Param p[TEE_NUM_PARAMS])56*c17b9e1cSSheetal Tigadoli static TEE_Result get_bnxt_handshake_status(uint32_t type,
57*c17b9e1cSSheetal Tigadoli 					    TEE_Param p[TEE_NUM_PARAMS])
586c5fa4feSVikas Gupta {
59*c17b9e1cSSheetal Tigadoli 	if (type != TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT,
60*c17b9e1cSSheetal Tigadoli 				    TEE_PARAM_TYPE_NONE,
61*c17b9e1cSSheetal Tigadoli 				    TEE_PARAM_TYPE_NONE,
62*c17b9e1cSSheetal Tigadoli 				    TEE_PARAM_TYPE_NONE))
63*c17b9e1cSSheetal Tigadoli 		return TEE_ERROR_BAD_PARAMETERS;
646c5fa4feSVikas Gupta 
65*c17b9e1cSSheetal Tigadoli 	p[0].value.a = bnxt_wait_handshake(p[0].value.a);
66*c17b9e1cSSheetal Tigadoli 
676c5fa4feSVikas Gupta 	return TEE_SUCCESS;
686c5fa4feSVikas Gupta }
696c5fa4feSVikas Gupta 
copy_bnxt_crash_dump(uint32_t types,TEE_Param params[TEE_NUM_PARAMS])70*c17b9e1cSSheetal Tigadoli static TEE_Result copy_bnxt_crash_dump(uint32_t types,
71*c17b9e1cSSheetal Tigadoli 				       TEE_Param params[TEE_NUM_PARAMS])
726c5fa4feSVikas Gupta {
73*c17b9e1cSSheetal Tigadoli 	uint32_t *d = NULL;
74*c17b9e1cSSheetal Tigadoli 	uint32_t offset = 0;
75*c17b9e1cSSheetal Tigadoli 	uint32_t req_len = 0;
76*c17b9e1cSSheetal Tigadoli 	TEE_Result res = TEE_SUCCESS;
77*c17b9e1cSSheetal Tigadoli 
78*c17b9e1cSSheetal Tigadoli 	if (types != TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INOUT,
79*c17b9e1cSSheetal Tigadoli 				     TEE_PARAM_TYPE_VALUE_INPUT,
80*c17b9e1cSSheetal Tigadoli 				     TEE_PARAM_TYPE_NONE,
81*c17b9e1cSSheetal Tigadoli 				     TEE_PARAM_TYPE_NONE)) {
82*c17b9e1cSSheetal Tigadoli 		DMSG("bad parameters types: 0x%" PRIx32, types);
83*c17b9e1cSSheetal Tigadoli 		return TEE_ERROR_BAD_PARAMETERS;
84*c17b9e1cSSheetal Tigadoli 	}
85*c17b9e1cSSheetal Tigadoli 
86*c17b9e1cSSheetal Tigadoli 	d = (uint32_t *)params[0].memref.buffer;
87*c17b9e1cSSheetal Tigadoli 	offset = params[1].value.a;
88*c17b9e1cSSheetal Tigadoli 	req_len = params[1].value.b;
89*c17b9e1cSSheetal Tigadoli 
90*c17b9e1cSSheetal Tigadoli 	if (!d || params[0].memref.size < req_len)
91*c17b9e1cSSheetal Tigadoli 		return TEE_ERROR_BAD_PARAMETERS;
92*c17b9e1cSSheetal Tigadoli 
93*c17b9e1cSSheetal Tigadoli 	res = bnxt_copy_crash_dump((uint8_t *)d, offset, req_len);
94*c17b9e1cSSheetal Tigadoli 
95*c17b9e1cSSheetal Tigadoli 	return res;
966c5fa4feSVikas Gupta }
976c5fa4feSVikas Gupta 
invoke_command(void * session_context __unused,uint32_t cmd_id,uint32_t param_types __unused,TEE_Param params[TEE_NUM_PARAMS]__unused)986c5fa4feSVikas Gupta static TEE_Result invoke_command(void *session_context __unused,
996c5fa4feSVikas Gupta 				 uint32_t cmd_id,
1006c5fa4feSVikas Gupta 				 uint32_t param_types __unused,
1016c5fa4feSVikas Gupta 				 TEE_Param params[TEE_NUM_PARAMS] __unused)
1026c5fa4feSVikas Gupta {
1036c5fa4feSVikas Gupta 	TEE_Result res = TEE_SUCCESS;
1046c5fa4feSVikas Gupta 
1056c5fa4feSVikas Gupta 	DMSG("command entry point[%d] for \"%s\"", cmd_id, BNXT_TA_NAME);
1066c5fa4feSVikas Gupta 
1076c5fa4feSVikas Gupta 	switch (cmd_id) {
1086c5fa4feSVikas Gupta 	case PTA_BNXT_FASTBOOT:
109*c17b9e1cSSheetal Tigadoli 		DMSG("bnxt fastboot");
1106c5fa4feSVikas Gupta 		if (bnxt_load_fw(1) != BNXT_SUCCESS)
1116c5fa4feSVikas Gupta 			return TEE_ERROR_TARGET_DEAD;
1126c5fa4feSVikas Gupta 		break;
113*c17b9e1cSSheetal Tigadoli 	case PTA_BNXT_HEALTH_STATUS:
114*c17b9e1cSSheetal Tigadoli 		DMSG("bnxt health status");
115*c17b9e1cSSheetal Tigadoli 		return get_bnxt_status(param_types, params);
116*c17b9e1cSSheetal Tigadoli 	case PTA_BNXT_HANDSHAKE_STATUS:
117*c17b9e1cSSheetal Tigadoli 		DMSG("bnxt handshake status");
118*c17b9e1cSSheetal Tigadoli 		return get_bnxt_handshake_status(param_types, params);
119*c17b9e1cSSheetal Tigadoli 	case PTA_BNXT_CRASH_DUMP_COPY:
120*c17b9e1cSSheetal Tigadoli 		DMSG("bnxt copy crash dump data");
121*c17b9e1cSSheetal Tigadoli 		return copy_bnxt_crash_dump(param_types, params);
1226c5fa4feSVikas Gupta 	default:
123*c17b9e1cSSheetal Tigadoli 		DMSG("cmd: %d Not supported %s", cmd_id, BNXT_TA_NAME);
1246c5fa4feSVikas Gupta 		res = TEE_ERROR_NOT_SUPPORTED;
1256c5fa4feSVikas Gupta 		break;
1266c5fa4feSVikas Gupta 	}
1276c5fa4feSVikas Gupta 
1286c5fa4feSVikas Gupta 	return res;
1296c5fa4feSVikas Gupta }
1306c5fa4feSVikas Gupta 
1316c5fa4feSVikas Gupta pseudo_ta_register(.uuid = BNXT_SERVICE_UUID,
1326c5fa4feSVikas Gupta 		   .name = BNXT_TA_NAME,
1336c5fa4feSVikas Gupta 		   .flags = PTA_DEFAULT_FLAGS | TA_FLAG_DEVICE_ENUM,
1346c5fa4feSVikas Gupta 		   .invoke_command_entry_point = invoke_command);
135