xref: /optee_os/core/include/drivers/ls_sfp.h (revision 999da91a441b12cff7fdf0e192ba726a2756d77e)
1011c182aSAndrew Mustea /* SPDX-License-Identifier: BSD-2-Clause */
2011c182aSAndrew Mustea /*
3011c182aSAndrew Mustea  * Copyright 2022 Microsoft
4011c182aSAndrew Mustea  *
5011c182aSAndrew Mustea  * Definitions for the NXP LX2160A-series Security Fuse Processor (SFP) driver.
6011c182aSAndrew Mustea  */
7011c182aSAndrew Mustea 
8011c182aSAndrew Mustea #ifndef __DRIVERS_LS_SFP_H
9011c182aSAndrew Mustea #define __DRIVERS_LS_SFP_H
10011c182aSAndrew Mustea 
11011c182aSAndrew Mustea #include <drivers/ls_gpio.h>
12011c182aSAndrew Mustea #include <stdlib.h>
13011c182aSAndrew Mustea #include <tee_api_types.h>
14011c182aSAndrew Mustea 
15011c182aSAndrew Mustea /* SFP instruction register */
16011c182aSAndrew Mustea /* SFP is big endian */
17011c182aSAndrew Mustea #define SFP_INGR_PROGFB_CMD 0x2
18011c182aSAndrew Mustea #define SFP_INGR_ERROR_MASK 0x100
19385b0436SAndrew Mustea #define SFP_INGR_FUSE_TIMEOUT_US 150000
20011c182aSAndrew Mustea 
21011c182aSAndrew Mustea /* SFP configuration register */
22*999da91aSAndrew Mustea #define SFP_SFPCR_SB_MASK 0x20000000
23*999da91aSAndrew Mustea #define SFP_SFPCR_SB_OFFSET 29
24011c182aSAndrew Mustea 
25011c182aSAndrew Mustea /* SFP OEM security policy register 0 */
26*999da91aSAndrew Mustea #define SFP_OSPR0_WP_MASK 0x1
27*999da91aSAndrew Mustea #define SFP_OSPR0_ITS_MASK 0x4
28*999da91aSAndrew Mustea #define SFP_OSPR0_ITS_OFFSET 0x2
29011c182aSAndrew Mustea 
30011c182aSAndrew Mustea /* SFP OEM security policy register 1 */
31011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_MASK 0x7
32011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_OPEN 0x0
33011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_CLOSED_NOTIFY 0x1
34011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_CLOSED_SILENT 0x2
35011c182aSAndrew Mustea #define SFP_OSPR1_DBLEV_CLOSED 0x4
36011c182aSAndrew Mustea 
37011c182aSAndrew Mustea /**
38011c182aSAndrew Mustea  * struct ls_sfp_data - Compact data struct of all SFP registers.
39011c182aSAndrew Mustea  * @ingr:		Instruction Register.
40011c182aSAndrew Mustea  * @svhesr:		Secret Value Hamming Error Status Register.
41011c182aSAndrew Mustea  * @sfpcr:		SFP Configuration Register.
42011c182aSAndrew Mustea  * @version:		SFP Version Register.
43011c182aSAndrew Mustea  * @ospr0:		OEM Security Policy Register 0.
44011c182aSAndrew Mustea  * @ospr1:		OEM Security Policy Register 1.
45011c182aSAndrew Mustea  * @dcvr0:		Debug Challenge Value Register 0.
46011c182aSAndrew Mustea  * @dcvr1:		Debug Challenge Value Register 1.
47011c182aSAndrew Mustea  * @drvr0:		Debug Response Value Register 0.
48011c182aSAndrew Mustea  * @drvr1:		Debug Response Value Register 1.
49011c182aSAndrew Mustea  * @fswpr:		Factory Section Write Protect Register.
50011c182aSAndrew Mustea  * @fuidr0:		Factory Unique ID Register 0.
51011c182aSAndrew Mustea  * @fuidr1:		Factory Unique ID Register 1.
52011c182aSAndrew Mustea  * @isbccr:		ISBC Configuration Register.
53011c182aSAndrew Mustea  * @fspfr[0x3]:		Factory Scratch Pad Fuse Registers.
54011c182aSAndrew Mustea  * @otpmkr[0x8]:	One Time Programmable Master Key.
55011c182aSAndrew Mustea  * @srkhr[0x8]:		Super Root Key Hash Register.
56011c182aSAndrew Mustea  * @ouidr[0x5]:		OEM Unique ID/Scratch Pad Fuse Registers.
57011c182aSAndrew Mustea  */
58011c182aSAndrew Mustea struct ls_sfp_data {
59011c182aSAndrew Mustea 	uint32_t ingr;
60011c182aSAndrew Mustea 	uint32_t svhesr;
61011c182aSAndrew Mustea 	uint32_t sfpcr;
62011c182aSAndrew Mustea 	uint32_t version;
63011c182aSAndrew Mustea 	uint32_t ospr0;
64011c182aSAndrew Mustea 	uint32_t ospr1;
65011c182aSAndrew Mustea 	uint32_t dcvr0;
66011c182aSAndrew Mustea 	uint32_t dcvr1;
67011c182aSAndrew Mustea 	uint32_t drvr0;
68011c182aSAndrew Mustea 	uint32_t drvr1;
69011c182aSAndrew Mustea 	uint32_t fswpr;
70011c182aSAndrew Mustea 	uint32_t fuidr0;
71011c182aSAndrew Mustea 	uint32_t fuidr1;
72011c182aSAndrew Mustea 	uint32_t isbccr;
73011c182aSAndrew Mustea 	uint32_t fspfr[0x3];
74011c182aSAndrew Mustea 	uint32_t otpmkr[0x8];
75011c182aSAndrew Mustea 	uint32_t srkhr[0x8];
76011c182aSAndrew Mustea 	uint32_t ouidr[0x5];
77011c182aSAndrew Mustea };
78011c182aSAndrew Mustea 
79011c182aSAndrew Mustea /**
80011c182aSAndrew Mustea  * ls_sfp_read() - Read a copy of the SFP register data if the SFP driver was
81011c182aSAndrew Mustea  *		   successfully initialized.
82011c182aSAndrew Mustea  * @data:	Location to save SFP data.
83011c182aSAndrew Mustea  *
84011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error
85011c182aSAndrew Mustea  */
86011c182aSAndrew Mustea TEE_Result ls_sfp_read(struct ls_sfp_data *data);
87011c182aSAndrew Mustea 
88011c182aSAndrew Mustea /**
89011c182aSAndrew Mustea  * ls_sfp_get_debug_level() - Read the last 3 bits of the SFP OSPR1 register
90011c182aSAndrew Mustea  *			      which denotes the debug level.
91011c182aSAndrew Mustea  * @dblev:	Pointer location to store the read debug level.
92011c182aSAndrew Mustea  *
93011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
94011c182aSAndrew Mustea  */
95011c182aSAndrew Mustea TEE_Result ls_sfp_get_debug_level(uint32_t *dblev);
96011c182aSAndrew Mustea 
97011c182aSAndrew Mustea /**
98011c182aSAndrew Mustea  * ls_sfp_get_its() - Read bit 29 of the SFP OSPR0 register which denotes the
99011c182aSAndrew Mustea  *		      ITS flag.
100011c182aSAndrew Mustea  * @its:	Pointer location to store the ITS flag.
101011c182aSAndrew Mustea  *
102011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
103011c182aSAndrew Mustea  */
104011c182aSAndrew Mustea TEE_Result ls_sfp_get_its(uint32_t *its);
105011c182aSAndrew Mustea 
106011c182aSAndrew Mustea /**
107011c182aSAndrew Mustea  * ls_sfp_get_ouid() - Read the SFP OUID register at the given index.
108011c182aSAndrew Mustea  * @index:	Index of the OUID register to read.
109011c182aSAndrew Mustea  * @ouid:	Pointer location to store the OIUD register value.
110011c182aSAndrew Mustea  *
111011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
112011c182aSAndrew Mustea  */
113011c182aSAndrew Mustea TEE_Result ls_sfp_get_ouid(uint32_t index, uint32_t *ouid);
114011c182aSAndrew Mustea 
115011c182aSAndrew Mustea /**
116011c182aSAndrew Mustea  * ls_sfp_get_sb() - Read bit 2 of the SFP SFPCR register which denotes the
117011c182aSAndrew Mustea  *		     secure boot flag.
118011c182aSAndrew Mustea  * @sb:		Pointer location to store the secure boot flag.
119011c182aSAndrew Mustea  *
120011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
121011c182aSAndrew Mustea  */
122011c182aSAndrew Mustea TEE_Result ls_sfp_get_sb(uint32_t *sb);
123011c182aSAndrew Mustea 
124011c182aSAndrew Mustea /**
125011c182aSAndrew Mustea  * ls_sfp_get_srkh() - Read the SFP SRKH register at the given index.
126011c182aSAndrew Mustea  * @index:	Index of the SRKH register to read.
127011c182aSAndrew Mustea  * @srkh:	Pointer location to store the SRKH register value.
128011c182aSAndrew Mustea  *
129011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
130011c182aSAndrew Mustea  */
131011c182aSAndrew Mustea TEE_Result ls_sfp_get_srkh(uint32_t index, uint32_t *srkh);
132011c182aSAndrew Mustea 
133011c182aSAndrew Mustea /**
134011c182aSAndrew Mustea  * ls_sfp_set_debug_level() - Set the last 3 bits of the SFP OSPR1 register
135011c182aSAndrew Mustea  *			      which denotes the debug level.
136011c182aSAndrew Mustea  * @dblev:	Value to write into the SFP OSPR1 register.
137011c182aSAndrew Mustea  *
138011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
139011c182aSAndrew Mustea  */
140011c182aSAndrew Mustea TEE_Result ls_sfp_set_debug_level(uint32_t dblev);
141011c182aSAndrew Mustea 
142011c182aSAndrew Mustea /**
143011c182aSAndrew Mustea  * ls_sfp_set_its_wp() - Set bits 29 and 31 of the SFP OSPR0 register which
144011c182aSAndrew Mustea  *			 denote the ITS and write protect flags respectively.
145011c182aSAndrew Mustea  *
146011c182aSAndrew Mustea  * WARNING - Setting the ITS and write protect flags will lock the mirror
147011c182aSAndrew Mustea  * registers and permanently prevent any further programming of the fuse block.
148011c182aSAndrew Mustea  * The system will also be forced to always attempt to secure boot which
149011c182aSAndrew Mustea  * requires signature validation and the absence of any hardware security
150011c182aSAndrew Mustea  * violations when booting.
151011c182aSAndrew Mustea  *
152011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
153011c182aSAndrew Mustea  */
154011c182aSAndrew Mustea TEE_Result ls_sfp_set_its_wp(void);
155011c182aSAndrew Mustea 
156011c182aSAndrew Mustea /**
157011c182aSAndrew Mustea  * ls_sfp_set_ouid() - Write to the SFP OUID register at the given index.
158011c182aSAndrew Mustea  * @index:	Index of the OUID register to write.
159011c182aSAndrew Mustea  * @ouid:	Value to write into the SFP OUID register.
160011c182aSAndrew Mustea  *
161011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
162011c182aSAndrew Mustea  */
163011c182aSAndrew Mustea TEE_Result ls_sfp_set_ouid(uint32_t index, uint32_t ouid);
164011c182aSAndrew Mustea 
165011c182aSAndrew Mustea /**
166011c182aSAndrew Mustea  * ls_sfp_status() - Check if the SFP driver was initialized successfully.
167011c182aSAndrew Mustea  *
168011c182aSAndrew Mustea  * Return:	TEE_SUCCESS or > 0 on error.
169011c182aSAndrew Mustea  */
170011c182aSAndrew Mustea TEE_Result ls_sfp_status(void);
171011c182aSAndrew Mustea 
172011c182aSAndrew Mustea #endif /* __DRIVERS_LS_SFP_H */
173