xref: /openbmc/u-boot/drivers/tpm/tpm_tis.h (revision 90d3aed4)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2011 Infineon Technologies
4  *
5  * Authors:
6  * Peter Huewe <huewe.external@infineon.com>
7  *
8  * Version: 2.1.1
9  *
10  * Description:
11  * Device driver for TCG/TCPA TPM (trusted platform module).
12  * Specifications at www.trustedcomputinggroup.org
13  *
14  * It is based on the Linux kernel driver tpm.c from Leendert van
15  * Dorn, Dave Safford, Reiner Sailer, and Kyleen Hall.
16  */
17 
18 #ifndef _TPM_TIS_I2C_H
19 #define _TPM_TIS_I2C_H
20 
21 #include <linux/compiler.h>
22 #include <linux/types.h>
23 
24 /**
25  * struct tpm_tis_phy_ops - low-level TPM bus operations
26  */
27 struct tpm_tis_phy_ops {
28 	/* read_bytes() - Read a number of bytes from the device
29 	 *
30 	 * @udev:   TPM device
31 	 * @addr:   offset from device base
32 	 * @len:    len to read
33 	 * @result: data read
34 	 *
35 	 * @return: 0 on success, negative on failure
36 	 */
37 	int (*read_bytes)(struct udevice *udev, u32 addr, u16 len,
38 			  u8 *result);
39 	/* write_bytes() - Read a number of bytes from the device
40 	 *
41 	 * @udev:   TPM device
42 	 * @addr:   offset from device base
43 	 * @len:    len to read
44 	 * @value:  data to write
45 	 *
46 	 * @return: 0 on success, negative on failure
47 	 */
48 	int (*write_bytes)(struct udevice *udev, u32 addr, u16 len,
49 			   const u8 *value);
50 	/* read32() - Read a 32bit value of the device
51 	 *
52 	 * @udev:   TPM device
53 	 * @addr:   offset from device base
54 	 * @result: data read
55 	 *
56 	 * @return: 0 on success, negative on failure
57 	 */
58 	int (*read32)(struct udevice *udev, u32 addr, u32 *result);
59 	/* write32() - write a 32bit value to the device
60 	 *
61 	 * @udev: TPM device
62 	 * @addr: offset from device base
63 	 * @src:  data to write
64 	 *
65 	 * @return: 0 on success, negative on failure
66 	 */
67 	int (*write32)(struct udevice *udev, u32 addr, u32 src);
68 };
69 
70 enum tis_int_flags {
71 	TPM_GLOBAL_INT_ENABLE = 0x80000000,
72 	TPM_INTF_BURST_COUNT_STATIC = 0x100,
73 	TPM_INTF_CMD_READY_INT = 0x080,
74 	TPM_INTF_INT_EDGE_FALLING = 0x040,
75 	TPM_INTF_INT_EDGE_RISING = 0x020,
76 	TPM_INTF_INT_LEVEL_LOW = 0x010,
77 	TPM_INTF_INT_LEVEL_HIGH = 0x008,
78 	TPM_INTF_LOCALITY_CHANGE_INT = 0x004,
79 	TPM_INTF_STS_VALID_INT = 0x002,
80 	TPM_INTF_DATA_AVAIL_INT = 0x001,
81 };
82 
83 #define TPM_ACCESS(l)                   (0x0000 | ((l) << 12))
84 #define TPM_INT_ENABLE(l)               (0x0008 | ((l) << 12))
85 #define TPM_STS(l)                      (0x0018 | ((l) << 12))
86 #define TPM_DATA_FIFO(l)                (0x0024 | ((l) << 12))
87 #define TPM_DID_VID(l)                  (0x0f00 | ((l) << 12))
88 #define TPM_RID(l)                      (0x0f04 | ((l) << 12))
89 #define TPM_INTF_CAPS(l)                (0x0014 | ((l) << 12))
90 
91 enum tpm_timeout {
92 	TPM_TIMEOUT_MS			= 5,
93 	TIS_SHORT_TIMEOUT_MS		= 750,
94 	TIS_LONG_TIMEOUT_MS		= 2000,
95 	SLEEP_DURATION_US		= 60,
96 	SLEEP_DURATION_LONG_US		= 210,
97 };
98 
99 /* Size of external transmit buffer (used in tpm_transmit)*/
100 #define TPM_BUFSIZE 4096
101 
102 /* Index of Count field in TPM response buffer */
103 #define TPM_RSP_SIZE_BYTE	2
104 #define TPM_RSP_RC_BYTE		6
105 
106 struct tpm_chip {
107 	int is_open;
108 	int locality;
109 	u32 vend_dev;
110 	u8 rid;
111 	unsigned long timeout_a, timeout_b, timeout_c, timeout_d;  /* msec */
112 	ulong chip_type;
113 	struct tpm_tis_phy_ops *phy_ops;
114 };
115 
116 struct tpm_input_header {
117 	__be16 tag;
118 	__be32 length;
119 	__be32 ordinal;
120 } __packed;
121 
122 struct tpm_output_header {
123 	__be16 tag;
124 	__be32 length;
125 	__be32 return_code;
126 } __packed;
127 
128 struct timeout_t {
129 	__be32 a;
130 	__be32 b;
131 	__be32 c;
132 	__be32 d;
133 } __packed;
134 
135 struct duration_t {
136 	__be32 tpm_short;
137 	__be32 tpm_medium;
138 	__be32 tpm_long;
139 } __packed;
140 
141 union cap_t {
142 	struct timeout_t timeout;
143 	struct duration_t duration;
144 };
145 
146 struct tpm_getcap_params_in {
147 	__be32 cap;
148 	__be32 subcap_size;
149 	__be32 subcap;
150 } __packed;
151 
152 struct tpm_getcap_params_out {
153 	__be32 cap_size;
154 	union cap_t cap;
155 } __packed;
156 
157 union tpm_cmd_header {
158 	struct tpm_input_header in;
159 	struct tpm_output_header out;
160 };
161 
162 union tpm_cmd_params {
163 	struct tpm_getcap_params_out getcap_out;
164 	struct tpm_getcap_params_in getcap_in;
165 };
166 
167 struct tpm_cmd_t {
168 	union tpm_cmd_header header;
169 	union tpm_cmd_params params;
170 } __packed;
171 
172 /* Max number of iterations after i2c NAK */
173 #define MAX_COUNT		3
174 
175 #ifndef __TPM_V2_H
176 /*
177  * Max number of iterations after i2c NAK for 'long' commands
178  *
179  * We need this especially for sending TPM_READY, since the cleanup after the
180  * transtion to the ready state may take some time, but it is unpredictable
181  * how long it will take.
182  */
183 #define MAX_COUNT_LONG		50
184 
185 enum tis_access {
186 	TPM_ACCESS_VALID		= 0x80,
187 	TPM_ACCESS_ACTIVE_LOCALITY	= 0x20,
188 	TPM_ACCESS_REQUEST_PENDING	= 0x04,
189 	TPM_ACCESS_REQUEST_USE		= 0x02,
190 };
191 
192 enum tis_status {
193 	TPM_STS_VALID			= 0x80,
194 	TPM_STS_COMMAND_READY		= 0x40,
195 	TPM_STS_GO			= 0x20,
196 	TPM_STS_DATA_AVAIL		= 0x10,
197 	TPM_STS_DATA_EXPECT		= 0x08,
198 };
199 #endif
200 
201 /**
202  * tpm_tis_open - Open the device and request locality 0
203  *
204  * @dev:  TPM device
205  *
206  * @return: 0 on success, negative on failure
207  */
208 int tpm_tis_open(struct udevice *udev);
209 /**
210  * tpm_tis_close - Close the device and release locality
211  *
212  * @dev:  TPM device
213  *
214  * @return: 0 on success, negative on failure
215  */
216 int tpm_tis_close(struct udevice *udev);
217 /** tpm_tis_cleanup - Get the device in ready state and release locality
218  *
219  * @dev:  TPM device
220  *
221  * @return: always 0
222  */
223 int tpm_tis_cleanup(struct udevice *udev);
224 /**
225  * tpm_tis_send - send data to the device
226  *
227  * @dev:  TPM device
228  * @buf:  buffer to send
229  * @len:  size of the buffer
230  *
231  * @return: number of bytes sent or negative on failure
232  */
233 int tpm_tis_send(struct udevice *udev, const u8 *buf, size_t len);
234 /**
235  * tpm_tis_recv_data - Receive data from a device. Wrapper for tpm_tis_recv
236  *
237  * @dev:  TPM device
238  * @buf:  buffer to copy data
239  * @size: buffer size
240  *
241  * @return: bytes read or negative on failure
242  */
243 int tpm_tis_recv(struct udevice *udev, u8 *buf, size_t count);
244 /**
245  * tpm_tis_get_desc - Get the TPM description
246  *
247  * @dev:  TPM device
248  * @buf:  buffer to fill data
249  * @size: buffer size
250  *
251  * @return: Number of characters written (or would have been written) in buffer
252  */
253 int tpm_tis_get_desc(struct udevice *udev, char *buf, int size);
254 /**
255  * tpm_tis_init - inititalize the device
256  *
257  * @dev:  TPM device
258  *
259  * @return: 0 on success, negative on failure
260  */
261 int tpm_tis_init(struct udevice *udev);
262 /**
263  * tpm_tis_ops_register - register the PHY ops for the device
264  *
265  * @dev: TPM device
266  * @ops: tpm_tis_phy_ops ops for the device
267  */
268 void tpm_tis_ops_register(struct udevice *udev, struct tpm_tis_phy_ops *ops);
269 #endif
270