1*c6d054ebSManorit Chawdhry // SPDX-License-Identifier: BSD-2-Clause
2*c6d054ebSManorit Chawdhry /*
3*c6d054ebSManorit Chawdhry * Texas Instruments System Control Interface Driver
4*c6d054ebSManorit Chawdhry *
5*c6d054ebSManorit Chawdhry * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
6*c6d054ebSManorit Chawdhry * Manorit Chawdhry <m-chawdhry@ti.com>
7*c6d054ebSManorit Chawdhry */
8*c6d054ebSManorit Chawdhry
9*c6d054ebSManorit Chawdhry #include <drivers/ti_sci.h>
10*c6d054ebSManorit Chawdhry #include <inttypes.h>
11*c6d054ebSManorit Chawdhry #include <k3/otp_keywriting_ta.h>
12*c6d054ebSManorit Chawdhry #include <kernel/pseudo_ta.h>
13*c6d054ebSManorit Chawdhry
write_otp_row(uint32_t param_types,TEE_Param params[4])14*c6d054ebSManorit Chawdhry static TEE_Result write_otp_row(uint32_t param_types, TEE_Param params[4])
15*c6d054ebSManorit Chawdhry {
16*c6d054ebSManorit Chawdhry TEE_Result ret = TEE_SUCCESS;
17*c6d054ebSManorit Chawdhry const uint32_t exp_param_types =
18*c6d054ebSManorit Chawdhry TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
19*c6d054ebSManorit Chawdhry TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
20*c6d054ebSManorit Chawdhry TEE_PARAM_TYPE_NONE);
21*c6d054ebSManorit Chawdhry
22*c6d054ebSManorit Chawdhry /*
23*c6d054ebSManorit Chawdhry * Safely get the invocation parameters
24*c6d054ebSManorit Chawdhry */
25*c6d054ebSManorit Chawdhry if (param_types != exp_param_types)
26*c6d054ebSManorit Chawdhry return TEE_ERROR_BAD_PARAMETERS;
27*c6d054ebSManorit Chawdhry
28*c6d054ebSManorit Chawdhry ret = ti_sci_write_otp_row(params[0].value.a, params[1].value.a,
29*c6d054ebSManorit Chawdhry params[1].value.b);
30*c6d054ebSManorit Chawdhry if (ret)
31*c6d054ebSManorit Chawdhry return ret;
32*c6d054ebSManorit Chawdhry
33*c6d054ebSManorit Chawdhry DMSG("Written the value: 0x%08"PRIx32, params[1].value.a);
34*c6d054ebSManorit Chawdhry
35*c6d054ebSManorit Chawdhry return TEE_SUCCESS;
36*c6d054ebSManorit Chawdhry }
37*c6d054ebSManorit Chawdhry
read_otp_mmr(uint32_t param_types,TEE_Param params[4])38*c6d054ebSManorit Chawdhry static TEE_Result read_otp_mmr(uint32_t param_types, TEE_Param params[4])
39*c6d054ebSManorit Chawdhry {
40*c6d054ebSManorit Chawdhry TEE_Result ret = TEE_SUCCESS;
41*c6d054ebSManorit Chawdhry const uint32_t exp_param_types =
42*c6d054ebSManorit Chawdhry TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
43*c6d054ebSManorit Chawdhry TEE_PARAM_TYPE_VALUE_OUTPUT,
44*c6d054ebSManorit Chawdhry TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
45*c6d054ebSManorit Chawdhry
46*c6d054ebSManorit Chawdhry /*
47*c6d054ebSManorit Chawdhry * Safely get the invocation parameters
48*c6d054ebSManorit Chawdhry */
49*c6d054ebSManorit Chawdhry if (param_types != exp_param_types)
50*c6d054ebSManorit Chawdhry return TEE_ERROR_BAD_PARAMETERS;
51*c6d054ebSManorit Chawdhry
52*c6d054ebSManorit Chawdhry ret = ti_sci_read_otp_mmr(params[0].value.a, ¶ms[1].value.a);
53*c6d054ebSManorit Chawdhry if (ret)
54*c6d054ebSManorit Chawdhry return ret;
55*c6d054ebSManorit Chawdhry
56*c6d054ebSManorit Chawdhry DMSG("Got the value: 0x%08"PRIx32, params[1].value.a);
57*c6d054ebSManorit Chawdhry
58*c6d054ebSManorit Chawdhry return TEE_SUCCESS;
59*c6d054ebSManorit Chawdhry }
60*c6d054ebSManorit Chawdhry
lock_otp_row(uint32_t param_types,TEE_Param params[4])61*c6d054ebSManorit Chawdhry static TEE_Result lock_otp_row(uint32_t param_types, TEE_Param params[4])
62*c6d054ebSManorit Chawdhry {
63*c6d054ebSManorit Chawdhry TEE_Result ret = TEE_SUCCESS;
64*c6d054ebSManorit Chawdhry int hw_write_lock = 0;
65*c6d054ebSManorit Chawdhry int hw_read_lock = 0;
66*c6d054ebSManorit Chawdhry int soft_lock = 0;
67*c6d054ebSManorit Chawdhry const uint32_t exp_param_types =
68*c6d054ebSManorit Chawdhry TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE,
69*c6d054ebSManorit Chawdhry TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
70*c6d054ebSManorit Chawdhry
71*c6d054ebSManorit Chawdhry /*
72*c6d054ebSManorit Chawdhry * Safely get the invocation parameters
73*c6d054ebSManorit Chawdhry */
74*c6d054ebSManorit Chawdhry if (param_types != exp_param_types)
75*c6d054ebSManorit Chawdhry return TEE_ERROR_BAD_PARAMETERS;
76*c6d054ebSManorit Chawdhry
77*c6d054ebSManorit Chawdhry if (params[0].value.b & K3_OTP_KEYWRITING_SOFT_LOCK)
78*c6d054ebSManorit Chawdhry soft_lock = 0x5A;
79*c6d054ebSManorit Chawdhry if (params[0].value.b & K3_OTP_KEYWRITING_HW_READ_LOCK)
80*c6d054ebSManorit Chawdhry hw_read_lock = 0x5A;
81*c6d054ebSManorit Chawdhry if (params[0].value.b & K3_OTP_KEYWRITING_HW_WRITE_LOCK)
82*c6d054ebSManorit Chawdhry hw_write_lock = 0x5A;
83*c6d054ebSManorit Chawdhry
84*c6d054ebSManorit Chawdhry DMSG("hw_write_lock: 0x%#x", hw_write_lock);
85*c6d054ebSManorit Chawdhry DMSG("hw_read_lock: 0x%#x", hw_read_lock);
86*c6d054ebSManorit Chawdhry DMSG("soft_lock: 0x%#x", soft_lock);
87*c6d054ebSManorit Chawdhry
88*c6d054ebSManorit Chawdhry ret = ti_sci_lock_otp_row(params[0].value.a, hw_write_lock,
89*c6d054ebSManorit Chawdhry hw_read_lock, soft_lock);
90*c6d054ebSManorit Chawdhry
91*c6d054ebSManorit Chawdhry if (ret)
92*c6d054ebSManorit Chawdhry return ret;
93*c6d054ebSManorit Chawdhry
94*c6d054ebSManorit Chawdhry DMSG("Locked the row: 0x%08"PRIx32, params[1].value.a);
95*c6d054ebSManorit Chawdhry
96*c6d054ebSManorit Chawdhry return TEE_SUCCESS;
97*c6d054ebSManorit Chawdhry }
98*c6d054ebSManorit Chawdhry
invoke_command(void * session __unused,uint32_t command,uint32_t param_types,TEE_Param params[4])99*c6d054ebSManorit Chawdhry static TEE_Result invoke_command(void *session __unused,
100*c6d054ebSManorit Chawdhry uint32_t command, uint32_t param_types,
101*c6d054ebSManorit Chawdhry TEE_Param params[4])
102*c6d054ebSManorit Chawdhry {
103*c6d054ebSManorit Chawdhry switch (command) {
104*c6d054ebSManorit Chawdhry case TA_OTP_KEYWRITING_CMD_READ_MMR:
105*c6d054ebSManorit Chawdhry return read_otp_mmr(param_types, params);
106*c6d054ebSManorit Chawdhry case TA_OTP_KEYWRITING_CMD_WRITE_ROW:
107*c6d054ebSManorit Chawdhry return write_otp_row(param_types, params);
108*c6d054ebSManorit Chawdhry case TA_OTP_KEYWRITING_CMD_LOCK_ROW:
109*c6d054ebSManorit Chawdhry return lock_otp_row(param_types, params);
110*c6d054ebSManorit Chawdhry default:
111*c6d054ebSManorit Chawdhry EMSG("Command ID 0x%"PRIx32" is not supported", command);
112*c6d054ebSManorit Chawdhry return TEE_ERROR_NOT_SUPPORTED;
113*c6d054ebSManorit Chawdhry }
114*c6d054ebSManorit Chawdhry }
115*c6d054ebSManorit Chawdhry
116*c6d054ebSManorit Chawdhry pseudo_ta_register(.uuid = PTA_K3_OTP_KEYWRITING_UUID,
117*c6d054ebSManorit Chawdhry .name = PTA_K3_OTP_KEYWRITING_NAME,
118*c6d054ebSManorit Chawdhry .flags = PTA_DEFAULT_FLAGS,
119*c6d054ebSManorit Chawdhry .invoke_command_entry_point = invoke_command);
120