1d64485e4SEtienne Carriere /* SPDX-License-Identifier: BSD-3-Clause */
2d64485e4SEtienne Carriere /*
37dfc80abSGatien Chevallier * Copyright (c) 2017-2022, STMicroelectronics
4d64485e4SEtienne Carriere */
5d64485e4SEtienne Carriere
6*fbe66cf8SEtienne Carriere #ifndef __DRIVERS_STM32_BSEC_H
7*fbe66cf8SEtienne Carriere #define __DRIVERS_STM32_BSEC_H
8d64485e4SEtienne Carriere
9301b3eb5SEtienne Carriere #include <compiler.h>
10d64485e4SEtienne Carriere #include <stdint.h>
11d64485e4SEtienne Carriere #include <tee_api.h>
12d64485e4SEtienne Carriere
131ff52b85SGatien Chevallier /* BSEC_DEBUG */
141ff52b85SGatien Chevallier #define BSEC_HDPEN BIT(4)
151ff52b85SGatien Chevallier #define BSEC_SPIDEN BIT(5)
161ff52b85SGatien Chevallier #define BSEC_SPINDEN BIT(6)
171ff52b85SGatien Chevallier #define BSEC_DBGSWGEN BIT(10)
181ff52b85SGatien Chevallier #define BSEC_DEBUG_ALL (BSEC_HDPEN | \
191ff52b85SGatien Chevallier BSEC_SPIDEN | \
201ff52b85SGatien Chevallier BSEC_SPINDEN | \
211ff52b85SGatien Chevallier BSEC_DBGSWGEN)
221ff52b85SGatien Chevallier
238396f62eSGatien Chevallier #define BSEC_BITS_PER_WORD (8U * sizeof(uint32_t))
248396f62eSGatien Chevallier #define BSEC_BYTES_PER_WORD sizeof(uint32_t)
258396f62eSGatien Chevallier
267dfc80abSGatien Chevallier /* BSEC different global states */
277dfc80abSGatien Chevallier enum stm32_bsec_sec_state {
287dfc80abSGatien Chevallier BSEC_STATE_SEC_CLOSED,
297dfc80abSGatien Chevallier BSEC_STATE_SEC_OPEN,
307dfc80abSGatien Chevallier BSEC_STATE_INVALID
317dfc80abSGatien Chevallier };
327dfc80abSGatien Chevallier
33d64485e4SEtienne Carriere /*
34d64485e4SEtienne Carriere * Load OTP from SAFMEM and provide its value
35d64485e4SEtienne Carriere * @value: Output read value
36d64485e4SEtienne Carriere * @otp_id: OTP number
37d64485e4SEtienne Carriere * Return a TEE_Result compliant return value
38d64485e4SEtienne Carriere */
39d64485e4SEtienne Carriere TEE_Result stm32_bsec_shadow_read_otp(uint32_t *value, uint32_t otp_id);
40d64485e4SEtienne Carriere
41d64485e4SEtienne Carriere /*
420042538eSEtienne Carriere * Copy SAFMEM OTP to BSEC data.
430042538eSEtienne Carriere * @otp_id: OTP number.
440042538eSEtienne Carriere * Return a TEE_Result compliant return value
450042538eSEtienne Carriere */
460042538eSEtienne Carriere TEE_Result stm32_bsec_shadow_register(uint32_t otp_id);
470042538eSEtienne Carriere
480042538eSEtienne Carriere /*
49d64485e4SEtienne Carriere * Read an OTP data value
50d64485e4SEtienne Carriere * @value: Output read value
51d64485e4SEtienne Carriere * @otp_id: OTP number
52d64485e4SEtienne Carriere * Return a TEE_Result compliant return value
53d64485e4SEtienne Carriere */
54d64485e4SEtienne Carriere TEE_Result stm32_bsec_read_otp(uint32_t *value, uint32_t otp_id);
55d64485e4SEtienne Carriere
56d64485e4SEtienne Carriere /*
57d64485e4SEtienne Carriere * Write value in BSEC data register
58d64485e4SEtienne Carriere * @value: Value to write
59d64485e4SEtienne Carriere * @otp_id: OTP number
60d64485e4SEtienne Carriere * Return a TEE_Result compliant return value
61d64485e4SEtienne Carriere */
62d64485e4SEtienne Carriere TEE_Result stm32_bsec_write_otp(uint32_t value, uint32_t otp_id);
63d64485e4SEtienne Carriere
64d64485e4SEtienne Carriere /*
65d64485e4SEtienne Carriere * Program a bit in SAFMEM without BSEC data refresh
66d64485e4SEtienne Carriere * @value: Value to program.
67d64485e4SEtienne Carriere * @otp_id: OTP number.
68d64485e4SEtienne Carriere * Return a TEE_Result compliant return value
69d64485e4SEtienne Carriere */
70301b3eb5SEtienne Carriere #ifdef CFG_STM32_BSEC_WRITE
71d64485e4SEtienne Carriere TEE_Result stm32_bsec_program_otp(uint32_t value, uint32_t otp_id);
72301b3eb5SEtienne Carriere #else
stm32_bsec_program_otp(uint32_t value __unused,uint32_t otp_id __unused)73301b3eb5SEtienne Carriere static inline TEE_Result stm32_bsec_program_otp(uint32_t value __unused,
74301b3eb5SEtienne Carriere uint32_t otp_id __unused)
75301b3eb5SEtienne Carriere {
76301b3eb5SEtienne Carriere return TEE_ERROR_NOT_SUPPORTED;
77301b3eb5SEtienne Carriere }
78301b3eb5SEtienne Carriere #endif
79d64485e4SEtienne Carriere
80d64485e4SEtienne Carriere /*
81d64485e4SEtienne Carriere * Permanent lock of OTP in SAFMEM
82d64485e4SEtienne Carriere * @otp_id: OTP number
83d64485e4SEtienne Carriere * Return a TEE_Result compliant return value
84d64485e4SEtienne Carriere */
8538df614fSLionel Debieve #ifdef CFG_STM32_BSEC_WRITE
86d64485e4SEtienne Carriere TEE_Result stm32_bsec_permanent_lock_otp(uint32_t otp_id);
8738df614fSLionel Debieve #else
stm32_bsec_permanent_lock_otp(uint32_t otp_id __unused)8838df614fSLionel Debieve static inline TEE_Result stm32_bsec_permanent_lock_otp(uint32_t otp_id __unused)
8938df614fSLionel Debieve {
9038df614fSLionel Debieve return TEE_ERROR_NOT_SUPPORTED;
9138df614fSLionel Debieve }
9238df614fSLionel Debieve #endif
93d64485e4SEtienne Carriere
94d64485e4SEtienne Carriere /*
95d64485e4SEtienne Carriere * Enable/disable debug service
96d64485e4SEtienne Carriere * @value: Value to write
97d64485e4SEtienne Carriere * Return a TEE_Result compliant return value
98d64485e4SEtienne Carriere */
99d64485e4SEtienne Carriere TEE_Result stm32_bsec_write_debug_conf(uint32_t value);
100d64485e4SEtienne Carriere
101d64485e4SEtienne Carriere /* Return debug configuration read from BSEC */
102d64485e4SEtienne Carriere uint32_t stm32_bsec_read_debug_conf(void);
103d64485e4SEtienne Carriere
104d64485e4SEtienne Carriere /*
105d64485e4SEtienne Carriere * Write shadow-read lock
106d64485e4SEtienne Carriere * @otp_id: OTP number
107ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
108d64485e4SEtienne Carriere */
109ef9888dcSEtienne Carriere TEE_Result stm32_bsec_set_sr_lock(uint32_t otp_id);
110d64485e4SEtienne Carriere
111d64485e4SEtienne Carriere /*
112d64485e4SEtienne Carriere * Read shadow-read lock
113d64485e4SEtienne Carriere * @otp_id: OTP number
114ef9888dcSEtienne Carriere * @locked: (out) true if shadow-read is locked, false if not locked.
115ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
116d64485e4SEtienne Carriere */
117ef9888dcSEtienne Carriere TEE_Result stm32_bsec_read_sr_lock(uint32_t otp_id, bool *locked);
118d64485e4SEtienne Carriere
119d64485e4SEtienne Carriere /*
120d64485e4SEtienne Carriere * Write shadow-write lock
121d64485e4SEtienne Carriere * @otp_id: OTP number
122ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
123d64485e4SEtienne Carriere */
124ef9888dcSEtienne Carriere TEE_Result stm32_bsec_set_sw_lock(uint32_t otp_id);
125d64485e4SEtienne Carriere
126d64485e4SEtienne Carriere /*
127d64485e4SEtienne Carriere * Read shadow-write lock
128d64485e4SEtienne Carriere * @otp_id: OTP number
129ef9888dcSEtienne Carriere * @locked: (out) true if shadow-write is locked, false if not locked.
130ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
131d64485e4SEtienne Carriere */
132ef9888dcSEtienne Carriere TEE_Result stm32_bsec_read_sw_lock(uint32_t otp_id, bool *locked);
133d64485e4SEtienne Carriere
134d64485e4SEtienne Carriere /*
135d64485e4SEtienne Carriere * Write shadow-program lock
136d64485e4SEtienne Carriere * @otp_id: OTP number
137ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
138d64485e4SEtienne Carriere */
139ef9888dcSEtienne Carriere TEE_Result stm32_bsec_set_sp_lock(uint32_t otp_id);
140d64485e4SEtienne Carriere
141d64485e4SEtienne Carriere /*
142d64485e4SEtienne Carriere * Read shadow-program lock
143d64485e4SEtienne Carriere * @otp_id: OTP number
144ef9888dcSEtienne Carriere * @locked: (out) true if shadow-program is locked, false if not locked.
145ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
146d64485e4SEtienne Carriere */
147ef9888dcSEtienne Carriere TEE_Result stm32_bsec_read_sp_lock(uint32_t otp_id, bool *locked);
148d64485e4SEtienne Carriere
149d64485e4SEtienne Carriere /*
150d64485e4SEtienne Carriere * Read permanent lock status
151d64485e4SEtienne Carriere * @otp_id: OTP number
152ef9888dcSEtienne Carriere * @locked: (out) true if permanent lock is locked, false if not locked.
153ef9888dcSEtienne Carriere * Return a TEE_Result compliant return value
154d64485e4SEtienne Carriere */
155ef9888dcSEtienne Carriere TEE_Result stm32_bsec_read_permanent_lock(uint32_t otp_id, bool *locked);
156d64485e4SEtienne Carriere
157d64485e4SEtienne Carriere /*
1587dfc80abSGatien Chevallier * Return true if OTP can be read, false otherwise
1597dfc80abSGatien Chevallier * @otp_id: OTP number
1607dfc80abSGatien Chevallier */
1617dfc80abSGatien Chevallier bool stm32_bsec_can_access_otp(uint32_t otp_id);
1627dfc80abSGatien Chevallier
1637dfc80abSGatien Chevallier /*
164d64485e4SEtienne Carriere * Return true if non-secure world is allowed to read the target OTP
165d64485e4SEtienne Carriere * @otp_id: OTP number
166d64485e4SEtienne Carriere */
167d64485e4SEtienne Carriere bool stm32_bsec_nsec_can_access_otp(uint32_t otp_id);
168d64485e4SEtienne Carriere
16993114f2eSGatien Chevallier /*
17093114f2eSGatien Chevallier * Find and get OTP location from its name.
17193114f2eSGatien Chevallier * @name: sub-node name to look up.
17293114f2eSGatien Chevallier * @otp_id: pointer to output OTP number or NULL.
1739f007225SPatrick Delaunay * @otp_bit_offset: pointer to output OTP bit offset in the NVMEM cell or NULL.
17493114f2eSGatien Chevallier * @otp_bit_len: pointer to output OTP length in bits or NULL.
17593114f2eSGatien Chevallier * Return a TEE_Result compliant status
17693114f2eSGatien Chevallier */
17793114f2eSGatien Chevallier TEE_Result stm32_bsec_find_otp_in_nvmem_layout(const char *name,
17893114f2eSGatien Chevallier uint32_t *otp_id,
1799f007225SPatrick Delaunay uint8_t *otp_bit_offset,
18093114f2eSGatien Chevallier size_t *otp_bit_len);
18193114f2eSGatien Chevallier
1827dfc80abSGatien Chevallier /*
183893a762dSPatrick Delaunay * Find and get OTP location from its phandle.
184893a762dSPatrick Delaunay * @phandle: node phandle to look up.
185893a762dSPatrick Delaunay * @otp_id: pointer to read OTP number or NULL.
186893a762dSPatrick Delaunay * @otp_bit_offset: pointer to read offset in OTP in bits or NULL.
187893a762dSPatrick Delaunay * @otp_bit_len: pointer to read OTP length in bits or NULL.
188893a762dSPatrick Delaunay * Return a TEE_Result compliant status
189893a762dSPatrick Delaunay */
190893a762dSPatrick Delaunay TEE_Result stm32_bsec_find_otp_by_phandle(const uint32_t phandle,
191893a762dSPatrick Delaunay uint32_t *otp_id,
192893a762dSPatrick Delaunay uint8_t *otp_bit_offset,
193893a762dSPatrick Delaunay size_t *otp_bit_len);
194893a762dSPatrick Delaunay
195893a762dSPatrick Delaunay /*
1967dfc80abSGatien Chevallier * Get BSEC global sec state.
1977dfc80abSGatien Chevallier * @sec_state: Global BSEC current sec state
1987dfc80abSGatien Chevallier * Return a TEE_Result compliant status
1997dfc80abSGatien Chevallier */
2007dfc80abSGatien Chevallier TEE_Result stm32_bsec_get_state(enum stm32_bsec_sec_state *sec_state);
2017dfc80abSGatien Chevallier
202*fbe66cf8SEtienne Carriere #endif /*__DRIVERS_STM32_BSEC_H*/
203