xref: /optee_os/core/pta/bcm/sotp.c (revision 25781fd49bdfcf2f1a99f8ae9bca7359ec54cd23)
1*25781fd4SRahul Gupta // SPDX-License-Identifier: BSD-2-Clause
2*25781fd4SRahul Gupta /*
3*25781fd4SRahul Gupta  * Copyright (c) 2019, Broadcom
4*25781fd4SRahul Gupta  */
5*25781fd4SRahul Gupta 
6*25781fd4SRahul Gupta #include <drivers/bcm_sotp.h>
7*25781fd4SRahul Gupta #include <io.h>
8*25781fd4SRahul Gupta #include <kernel/misc.h>
9*25781fd4SRahul Gupta #include <kernel/pseudo_ta.h>
10*25781fd4SRahul Gupta 
11*25781fd4SRahul Gupta #define SOTP_SERVICE_UUID \
12*25781fd4SRahul Gupta 		{0x6272636D, 0x2018, 0x1101,  \
13*25781fd4SRahul Gupta 		{0x42, 0x43, 0x4D, 0x5F, 0x53, 0x4F, 0x54, 0x50} }
14*25781fd4SRahul Gupta 
15*25781fd4SRahul Gupta enum pta_bcm_sotp_cmd {
16*25781fd4SRahul Gupta 	PTA_BCM_SOTP_CMD_READ = 0,
17*25781fd4SRahul Gupta 	PTA_BCM_SOTP_CMD_WRITE,
18*25781fd4SRahul Gupta };
19*25781fd4SRahul Gupta 
20*25781fd4SRahul Gupta #define SOTP_TA_NAME		"pta_bcm_sotp.ta"
21*25781fd4SRahul Gupta 
22*25781fd4SRahul Gupta static TEE_Result pta_sotp_read(uint32_t param_types,
23*25781fd4SRahul Gupta 				TEE_Param params[TEE_NUM_PARAMS])
24*25781fd4SRahul Gupta {
25*25781fd4SRahul Gupta 	uint64_t sotp_row_value = 0;
26*25781fd4SRahul Gupta 	uint32_t val = 0;
27*25781fd4SRahul Gupta 	uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
28*25781fd4SRahul Gupta 						   TEE_PARAM_TYPE_VALUE_OUTPUT,
29*25781fd4SRahul Gupta 						   TEE_PARAM_TYPE_NONE,
30*25781fd4SRahul Gupta 						   TEE_PARAM_TYPE_NONE);
31*25781fd4SRahul Gupta 	if (exp_param_types != param_types) {
32*25781fd4SRahul Gupta 		EMSG("Invalid Param types");
33*25781fd4SRahul Gupta 		return TEE_ERROR_BAD_PARAMETERS;
34*25781fd4SRahul Gupta 	}
35*25781fd4SRahul Gupta 
36*25781fd4SRahul Gupta 	val = params[0].value.a;
37*25781fd4SRahul Gupta 
38*25781fd4SRahul Gupta 	bcm_iproc_sotp_mem_read(val, 1, &sotp_row_value);
39*25781fd4SRahul Gupta 	reg_pair_from_64(sotp_row_value, &params[1].value.a,
40*25781fd4SRahul Gupta 			 &params[1].value.b);
41*25781fd4SRahul Gupta 
42*25781fd4SRahul Gupta 	return TEE_SUCCESS;
43*25781fd4SRahul Gupta }
44*25781fd4SRahul Gupta 
45*25781fd4SRahul Gupta static TEE_Result pta_sotp_write(uint32_t param_types __unused,
46*25781fd4SRahul Gupta 				 TEE_Param params[TEE_NUM_PARAMS] __unused)
47*25781fd4SRahul Gupta {
48*25781fd4SRahul Gupta 	/* Nothing as of now */
49*25781fd4SRahul Gupta 	return TEE_ERROR_NOT_IMPLEMENTED;
50*25781fd4SRahul Gupta }
51*25781fd4SRahul Gupta 
52*25781fd4SRahul Gupta static TEE_Result invoke_command(void *session_context __unused,
53*25781fd4SRahul Gupta 				 uint32_t cmd_id,
54*25781fd4SRahul Gupta 				 uint32_t param_types,
55*25781fd4SRahul Gupta 				 TEE_Param params[TEE_NUM_PARAMS])
56*25781fd4SRahul Gupta {
57*25781fd4SRahul Gupta 	TEE_Result res = TEE_SUCCESS;
58*25781fd4SRahul Gupta 
59*25781fd4SRahul Gupta 	DMSG("command entry point[%d] for \"%s\"", cmd_id, SOTP_TA_NAME);
60*25781fd4SRahul Gupta 
61*25781fd4SRahul Gupta 	switch (cmd_id) {
62*25781fd4SRahul Gupta 	case PTA_BCM_SOTP_CMD_READ:
63*25781fd4SRahul Gupta 		res = pta_sotp_read(param_types, params);
64*25781fd4SRahul Gupta 		break;
65*25781fd4SRahul Gupta 	case PTA_BCM_SOTP_CMD_WRITE:
66*25781fd4SRahul Gupta 		res = pta_sotp_write(param_types, params);
67*25781fd4SRahul Gupta 		break;
68*25781fd4SRahul Gupta 	default:
69*25781fd4SRahul Gupta 		EMSG("cmd %d Not supported %s", cmd_id, SOTP_TA_NAME);
70*25781fd4SRahul Gupta 		res = TEE_ERROR_NOT_SUPPORTED;
71*25781fd4SRahul Gupta 		break;
72*25781fd4SRahul Gupta 	}
73*25781fd4SRahul Gupta 
74*25781fd4SRahul Gupta 	return res;
75*25781fd4SRahul Gupta }
76*25781fd4SRahul Gupta 
77*25781fd4SRahul Gupta pseudo_ta_register(.uuid = SOTP_SERVICE_UUID,
78*25781fd4SRahul Gupta 		   .name = SOTP_TA_NAME,
79*25781fd4SRahul Gupta 		   .flags = PTA_DEFAULT_FLAGS,
80*25781fd4SRahul Gupta 		   .invoke_command_entry_point = invoke_command);
81