]>
Commit | Line | Data |
---|---|---|
b886d83c | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
659aaf2b RA |
2 | /* |
3 | * Copyright (C) 2004,2007,2008 IBM Corporation | |
4 | * | |
5 | * Authors: | |
6 | * Leendert van Doorn <leendert@watson.ibm.com> | |
7 | * Dave Safford <safford@watson.ibm.com> | |
8 | * Reiner Sailer <sailer@watson.ibm.com> | |
9 | * Kylene Hall <kjhall@us.ibm.com> | |
10 | * Debora Velarde <dvelarde@us.ibm.com> | |
11 | * | |
12 | * Maintained by: <tpmdd_devel@lists.sourceforge.net> | |
13 | * | |
14 | * Device driver for TCG/TCPA TPM (trusted platform module). | |
15 | * Specifications at www.trustedcomputinggroup.org | |
659aaf2b RA |
16 | */ |
17 | #ifndef __LINUX_TPM_H__ | |
18 | #define __LINUX_TPM_H__ | |
19 | ||
901615cb RS |
20 | #include <linux/hw_random.h> |
21 | #include <linux/acpi.h> | |
22 | #include <linux/cdev.h> | |
23 | #include <linux/fs.h> | |
aa042475 RS |
24 | #include <crypto/hash_info.h> |
25 | ||
1c16c963 | 26 | #define TPM_DIGEST_SIZE 20 /* Max TPM v1.2 PCR size */ |
aa042475 | 27 | #define TPM_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE |
1c16c963 | 28 | |
01ad1fa7 | 29 | struct tpm_chip; |
954650ef JS |
30 | struct trusted_key_payload; |
31 | struct trusted_key_options; | |
01ad1fa7 | 32 | |
aa042475 RS |
33 | enum tpm_algorithms { |
34 | TPM_ALG_ERROR = 0x0000, | |
35 | TPM_ALG_SHA1 = 0x0004, | |
36 | TPM_ALG_KEYEDHASH = 0x0008, | |
37 | TPM_ALG_SHA256 = 0x000B, | |
38 | TPM_ALG_SHA384 = 0x000C, | |
39 | TPM_ALG_SHA512 = 0x000D, | |
40 | TPM_ALG_NULL = 0x0010, | |
41 | TPM_ALG_SM3_256 = 0x0012, | |
42 | }; | |
43 | ||
44 | struct tpm_digest { | |
45 | u16 alg_id; | |
46 | u8 digest[TPM_MAX_DIGEST_SIZE]; | |
47 | } __packed; | |
48 | ||
879b5892 RS |
49 | struct tpm_bank_info { |
50 | u16 alg_id; | |
51 | u16 digest_size; | |
52 | u16 crypto_id; | |
53 | }; | |
54 | ||
cae8b441 JG |
55 | enum TPM_OPS_FLAGS { |
56 | TPM_OPS_AUTO_STARTUP = BIT(0), | |
57 | }; | |
58 | ||
01ad1fa7 | 59 | struct tpm_class_ops { |
cae8b441 | 60 | unsigned int flags; |
01ad1fa7 JG |
61 | const u8 req_complete_mask; |
62 | const u8 req_complete_val; | |
63 | bool (*req_canceled)(struct tpm_chip *chip, u8 status); | |
64 | int (*recv) (struct tpm_chip *chip, u8 *buf, size_t len); | |
65 | int (*send) (struct tpm_chip *chip, u8 *buf, size_t len); | |
66 | void (*cancel) (struct tpm_chip *chip); | |
67 | u8 (*status) (struct tpm_chip *chip); | |
36ce0897 | 68 | void (*update_timeouts)(struct tpm_chip *chip, |
8e54caf4 | 69 | unsigned long *timeout_cap); |
627448e8 TW |
70 | int (*go_idle)(struct tpm_chip *chip); |
71 | int (*cmd_ready)(struct tpm_chip *chip); | |
877c57d0 | 72 | int (*request_locality)(struct tpm_chip *chip, int loc); |
888d867d | 73 | int (*relinquish_locality)(struct tpm_chip *chip, int loc); |
b3e958ce | 74 | void (*clk_enable)(struct tpm_chip *chip, bool value); |
01ad1fa7 JG |
75 | }; |
76 | ||
901615cb RS |
77 | #define TPM_NUM_EVENT_LOG_FILES 3 |
78 | ||
79 | /* Indexes the duration array */ | |
80 | enum tpm_duration { | |
81 | TPM_SHORT = 0, | |
82 | TPM_MEDIUM = 1, | |
83 | TPM_LONG = 2, | |
84 | TPM_LONG_LONG = 3, | |
85 | TPM_UNDEFINED, | |
86 | TPM_NUM_DURATIONS = TPM_UNDEFINED, | |
87 | }; | |
88 | ||
89 | #define TPM_PPI_VERSION_LEN 3 | |
90 | ||
91 | struct tpm_space { | |
92 | u32 context_tbl[3]; | |
93 | u8 *context_buf; | |
94 | u32 session_tbl[3]; | |
95 | u8 *session_buf; | |
2a7fbebf | 96 | u32 buf_size; |
901615cb RS |
97 | }; |
98 | ||
99 | struct tpm_bios_log { | |
100 | void *bios_event_log; | |
101 | void *bios_event_log_end; | |
102 | }; | |
103 | ||
104 | struct tpm_chip_seqops { | |
105 | struct tpm_chip *chip; | |
106 | const struct seq_operations *seqops; | |
107 | }; | |
108 | ||
109 | struct tpm_chip { | |
110 | struct device dev; | |
111 | struct device devs; | |
112 | struct cdev cdev; | |
113 | struct cdev cdevs; | |
114 | ||
115 | /* A driver callback under ops cannot be run unless ops_sem is held | |
116 | * (sometimes implicitly, eg for the sysfs code). ops becomes null | |
117 | * when the driver is unregistered, see tpm_try_get_ops. | |
118 | */ | |
119 | struct rw_semaphore ops_sem; | |
120 | const struct tpm_class_ops *ops; | |
121 | ||
122 | struct tpm_bios_log log; | |
123 | struct tpm_chip_seqops bin_log_seqops; | |
124 | struct tpm_chip_seqops ascii_log_seqops; | |
125 | ||
126 | unsigned int flags; | |
127 | ||
128 | int dev_num; /* /dev/tpm# */ | |
129 | unsigned long is_open; /* only one allowed */ | |
130 | ||
131 | char hwrng_name[64]; | |
132 | struct hwrng hwrng; | |
133 | ||
134 | struct mutex tpm_mutex; /* tpm is processing */ | |
135 | ||
136 | unsigned long timeout_a; /* jiffies */ | |
137 | unsigned long timeout_b; /* jiffies */ | |
138 | unsigned long timeout_c; /* jiffies */ | |
139 | unsigned long timeout_d; /* jiffies */ | |
140 | bool timeout_adjusted; | |
141 | unsigned long duration[TPM_NUM_DURATIONS]; /* jiffies */ | |
142 | bool duration_adjusted; | |
143 | ||
144 | struct dentry *bios_dir[TPM_NUM_EVENT_LOG_FILES]; | |
145 | ||
146 | const struct attribute_group *groups[3]; | |
147 | unsigned int groups_cnt; | |
148 | ||
149 | u32 nr_allocated_banks; | |
150 | struct tpm_bank_info *allocated_banks; | |
151 | #ifdef CONFIG_ACPI | |
152 | acpi_handle acpi_dev_handle; | |
153 | char ppi_version[TPM_PPI_VERSION_LEN + 1]; | |
154 | #endif /* CONFIG_ACPI */ | |
155 | ||
156 | struct tpm_space work_space; | |
157 | u32 last_cc; | |
158 | u32 nr_commands; | |
159 | u32 *cc_attrs_tbl; | |
160 | ||
161 | /* active locality */ | |
162 | int locality; | |
163 | }; | |
164 | ||
ff76ec18 | 165 | #if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE) |
659aaf2b | 166 | |
aad887f6 | 167 | extern int tpm_is_tpm2(struct tpm_chip *chip); |
879b5892 RS |
168 | extern int tpm_pcr_read(struct tpm_chip *chip, u32 pcr_idx, |
169 | struct tpm_digest *digest); | |
0b6cf6b9 RS |
170 | extern int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, |
171 | struct tpm_digest *digests); | |
aad887f6 JS |
172 | extern int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen); |
173 | extern int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max); | |
174 | extern int tpm_seal_trusted(struct tpm_chip *chip, | |
954650ef JS |
175 | struct trusted_key_payload *payload, |
176 | struct trusted_key_options *options); | |
aad887f6 | 177 | extern int tpm_unseal_trusted(struct tpm_chip *chip, |
954650ef JS |
178 | struct trusted_key_payload *payload, |
179 | struct trusted_key_options *options); | |
aaae8153 | 180 | extern struct tpm_chip *tpm_default_chip(void); |
d6ba4521 | 181 | #else |
aad887f6 | 182 | static inline int tpm_is_tpm2(struct tpm_chip *chip) |
954650ef JS |
183 | { |
184 | return -ENODEV; | |
185 | } | |
95adc6b4 | 186 | |
879b5892 RS |
187 | static inline int tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, |
188 | struct tpm_digest *digest) | |
aad887f6 | 189 | { |
d6ba4521 MZ |
190 | return -ENODEV; |
191 | } | |
95adc6b4 TW |
192 | |
193 | static inline int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, | |
0b6cf6b9 | 194 | struct tpm_digest *digests) |
aad887f6 | 195 | { |
d6ba4521 MZ |
196 | return -ENODEV; |
197 | } | |
95adc6b4 | 198 | |
aad887f6 JS |
199 | static inline int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) |
200 | { | |
c749ba91 MZ |
201 | return -ENODEV; |
202 | } | |
aad887f6 JS |
203 | static inline int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max) |
204 | { | |
41ab999c KY |
205 | return -ENODEV; |
206 | } | |
954650ef | 207 | |
aad887f6 | 208 | static inline int tpm_seal_trusted(struct tpm_chip *chip, |
954650ef JS |
209 | struct trusted_key_payload *payload, |
210 | struct trusted_key_options *options) | |
211 | { | |
212 | return -ENODEV; | |
213 | } | |
aad887f6 | 214 | static inline int tpm_unseal_trusted(struct tpm_chip *chip, |
954650ef JS |
215 | struct trusted_key_payload *payload, |
216 | struct trusted_key_options *options) | |
217 | { | |
218 | return -ENODEV; | |
219 | } | |
aaae8153 SB |
220 | static inline struct tpm_chip *tpm_default_chip(void) |
221 | { | |
222 | return NULL; | |
223 | } | |
659aaf2b RA |
224 | #endif |
225 | #endif |