xref: /openbmc/u-boot/drivers/tpm/tpm_tis.h (revision 1259dcd79c70f97a1606b4b06190c8fa7a1810d1)
1*1259dcd7SChristophe Ricard /*
2*1259dcd7SChristophe Ricard  * Copyright (C) 2011 Infineon Technologies
3*1259dcd7SChristophe Ricard  *
4*1259dcd7SChristophe Ricard  * Authors:
5*1259dcd7SChristophe Ricard  * Peter Huewe <huewe.external@infineon.com>
6*1259dcd7SChristophe Ricard  *
7*1259dcd7SChristophe Ricard  * Version: 2.1.1
8*1259dcd7SChristophe Ricard  *
9*1259dcd7SChristophe Ricard  * Description:
10*1259dcd7SChristophe Ricard  * Device driver for TCG/TCPA TPM (trusted platform module).
11*1259dcd7SChristophe Ricard  * Specifications at www.trustedcomputinggroup.org
12*1259dcd7SChristophe Ricard  *
13*1259dcd7SChristophe Ricard  * It is based on the Linux kernel driver tpm.c from Leendert van
14*1259dcd7SChristophe Ricard  * Dorn, Dave Safford, Reiner Sailer, and Kyleen Hall.
15*1259dcd7SChristophe Ricard  *
16*1259dcd7SChristophe Ricard  * SPDX-License-Identifier:	GPL-2.0
17*1259dcd7SChristophe Ricard  */
18*1259dcd7SChristophe Ricard 
19*1259dcd7SChristophe Ricard #ifndef _TPM_TIS_I2C_H
20*1259dcd7SChristophe Ricard #define _TPM_TIS_I2C_H
21*1259dcd7SChristophe Ricard 
22*1259dcd7SChristophe Ricard #include <linux/compiler.h>
23*1259dcd7SChristophe Ricard #include <linux/types.h>
24*1259dcd7SChristophe Ricard 
25*1259dcd7SChristophe Ricard enum tpm_timeout {
26*1259dcd7SChristophe Ricard 	TPM_TIMEOUT_MS			= 5,
27*1259dcd7SChristophe Ricard 	TIS_SHORT_TIMEOUT_MS		= 750,
28*1259dcd7SChristophe Ricard 	TIS_LONG_TIMEOUT_MS		= 2000,
29*1259dcd7SChristophe Ricard 	SLEEP_DURATION_US		= 60,
30*1259dcd7SChristophe Ricard 	SLEEP_DURATION_LONG_US		= 210,
31*1259dcd7SChristophe Ricard };
32*1259dcd7SChristophe Ricard 
33*1259dcd7SChristophe Ricard /* Size of external transmit buffer (used in tpm_transmit)*/
34*1259dcd7SChristophe Ricard #define TPM_BUFSIZE 4096
35*1259dcd7SChristophe Ricard 
36*1259dcd7SChristophe Ricard /* Index of Count field in TPM response buffer */
37*1259dcd7SChristophe Ricard #define TPM_RSP_SIZE_BYTE	2
38*1259dcd7SChristophe Ricard #define TPM_RSP_RC_BYTE		6
39*1259dcd7SChristophe Ricard 
40*1259dcd7SChristophe Ricard struct tpm_chip {
41*1259dcd7SChristophe Ricard 	int is_open;
42*1259dcd7SChristophe Ricard 	int locality;
43*1259dcd7SChristophe Ricard 	u32 vend_dev;
44*1259dcd7SChristophe Ricard 	unsigned long timeout_a, timeout_b, timeout_c, timeout_d;  /* msec */
45*1259dcd7SChristophe Ricard 	ulong chip_type;
46*1259dcd7SChristophe Ricard };
47*1259dcd7SChristophe Ricard 
48*1259dcd7SChristophe Ricard struct tpm_input_header {
49*1259dcd7SChristophe Ricard 	__be16 tag;
50*1259dcd7SChristophe Ricard 	__be32 length;
51*1259dcd7SChristophe Ricard 	__be32 ordinal;
52*1259dcd7SChristophe Ricard } __packed;
53*1259dcd7SChristophe Ricard 
54*1259dcd7SChristophe Ricard struct tpm_output_header {
55*1259dcd7SChristophe Ricard 	__be16 tag;
56*1259dcd7SChristophe Ricard 	__be32 length;
57*1259dcd7SChristophe Ricard 	__be32 return_code;
58*1259dcd7SChristophe Ricard } __packed;
59*1259dcd7SChristophe Ricard 
60*1259dcd7SChristophe Ricard struct timeout_t {
61*1259dcd7SChristophe Ricard 	__be32 a;
62*1259dcd7SChristophe Ricard 	__be32 b;
63*1259dcd7SChristophe Ricard 	__be32 c;
64*1259dcd7SChristophe Ricard 	__be32 d;
65*1259dcd7SChristophe Ricard } __packed;
66*1259dcd7SChristophe Ricard 
67*1259dcd7SChristophe Ricard struct duration_t {
68*1259dcd7SChristophe Ricard 	__be32 tpm_short;
69*1259dcd7SChristophe Ricard 	__be32 tpm_medium;
70*1259dcd7SChristophe Ricard 	__be32 tpm_long;
71*1259dcd7SChristophe Ricard } __packed;
72*1259dcd7SChristophe Ricard 
73*1259dcd7SChristophe Ricard union cap_t {
74*1259dcd7SChristophe Ricard 	struct timeout_t timeout;
75*1259dcd7SChristophe Ricard 	struct duration_t duration;
76*1259dcd7SChristophe Ricard };
77*1259dcd7SChristophe Ricard 
78*1259dcd7SChristophe Ricard struct tpm_getcap_params_in {
79*1259dcd7SChristophe Ricard 	__be32 cap;
80*1259dcd7SChristophe Ricard 	__be32 subcap_size;
81*1259dcd7SChristophe Ricard 	__be32 subcap;
82*1259dcd7SChristophe Ricard } __packed;
83*1259dcd7SChristophe Ricard 
84*1259dcd7SChristophe Ricard struct tpm_getcap_params_out {
85*1259dcd7SChristophe Ricard 	__be32 cap_size;
86*1259dcd7SChristophe Ricard 	union cap_t cap;
87*1259dcd7SChristophe Ricard } __packed;
88*1259dcd7SChristophe Ricard 
89*1259dcd7SChristophe Ricard union tpm_cmd_header {
90*1259dcd7SChristophe Ricard 	struct tpm_input_header in;
91*1259dcd7SChristophe Ricard 	struct tpm_output_header out;
92*1259dcd7SChristophe Ricard };
93*1259dcd7SChristophe Ricard 
94*1259dcd7SChristophe Ricard union tpm_cmd_params {
95*1259dcd7SChristophe Ricard 	struct tpm_getcap_params_out getcap_out;
96*1259dcd7SChristophe Ricard 	struct tpm_getcap_params_in getcap_in;
97*1259dcd7SChristophe Ricard };
98*1259dcd7SChristophe Ricard 
99*1259dcd7SChristophe Ricard struct tpm_cmd_t {
100*1259dcd7SChristophe Ricard 	union tpm_cmd_header header;
101*1259dcd7SChristophe Ricard 	union tpm_cmd_params params;
102*1259dcd7SChristophe Ricard } __packed;
103*1259dcd7SChristophe Ricard 
104*1259dcd7SChristophe Ricard /* Max number of iterations after i2c NAK */
105*1259dcd7SChristophe Ricard #define MAX_COUNT		3
106*1259dcd7SChristophe Ricard 
107*1259dcd7SChristophe Ricard /*
108*1259dcd7SChristophe Ricard  * Max number of iterations after i2c NAK for 'long' commands
109*1259dcd7SChristophe Ricard  *
110*1259dcd7SChristophe Ricard  * We need this especially for sending TPM_READY, since the cleanup after the
111*1259dcd7SChristophe Ricard  * transtion to the ready state may take some time, but it is unpredictable
112*1259dcd7SChristophe Ricard  * how long it will take.
113*1259dcd7SChristophe Ricard  */
114*1259dcd7SChristophe Ricard #define MAX_COUNT_LONG		50
115*1259dcd7SChristophe Ricard 
116*1259dcd7SChristophe Ricard enum tis_access {
117*1259dcd7SChristophe Ricard 	TPM_ACCESS_VALID		= 0x80,
118*1259dcd7SChristophe Ricard 	TPM_ACCESS_ACTIVE_LOCALITY	= 0x20,
119*1259dcd7SChristophe Ricard 	TPM_ACCESS_REQUEST_PENDING	= 0x04,
120*1259dcd7SChristophe Ricard 	TPM_ACCESS_REQUEST_USE		= 0x02,
121*1259dcd7SChristophe Ricard };
122*1259dcd7SChristophe Ricard 
123*1259dcd7SChristophe Ricard enum tis_status {
124*1259dcd7SChristophe Ricard 	TPM_STS_VALID			= 0x80,
125*1259dcd7SChristophe Ricard 	TPM_STS_COMMAND_READY		= 0x40,
126*1259dcd7SChristophe Ricard 	TPM_STS_GO			= 0x20,
127*1259dcd7SChristophe Ricard 	TPM_STS_DATA_AVAIL		= 0x10,
128*1259dcd7SChristophe Ricard 	TPM_STS_DATA_EXPECT		= 0x08,
129*1259dcd7SChristophe Ricard };
130*1259dcd7SChristophe Ricard 
131*1259dcd7SChristophe Ricard #endif
132