1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/poll.h>
28#include <linux/slab.h>
29#include <linux/mutex.h>
30#include <linux/spinlock.h>
31#include <linux/freezer.h>
32
33#include "tpm.h"
34#include "tpm_eventlog.h"
35
36#define TPM_MAX_ORDINAL 243
37#define TSC_MAX_ORDINAL 12
38#define TPM_PROTECTED_COMMAND 0x00
39#define TPM_CONNECTION_COMMAND 0x40
40
41
42
43
44
45
46static int tpm_suspend_pcr;
47module_param_named(suspend_pcr, tpm_suspend_pcr, uint, 0644);
48MODULE_PARM_DESC(suspend_pcr,
49 "PCR to use for dummy writes to faciltate flush on suspend.");
50
51
52
53
54
55
56
57
58
59static const u8 tpm_ordinal_duration[TPM_MAX_ORDINAL] = {
60 TPM_UNDEFINED,
61 TPM_UNDEFINED,
62 TPM_UNDEFINED,
63 TPM_UNDEFINED,
64 TPM_UNDEFINED,
65 TPM_UNDEFINED,
66 TPM_UNDEFINED,
67 TPM_UNDEFINED,
68 TPM_UNDEFINED,
69 TPM_UNDEFINED,
70 TPM_SHORT,
71 TPM_SHORT,
72 TPM_MEDIUM,
73 TPM_LONG,
74 TPM_LONG,
75 TPM_MEDIUM,
76 TPM_SHORT,
77 TPM_SHORT,
78 TPM_MEDIUM,
79 TPM_LONG,
80 TPM_SHORT,
81 TPM_SHORT,
82 TPM_MEDIUM,
83 TPM_MEDIUM,
84 TPM_MEDIUM,
85 TPM_SHORT,
86 TPM_SHORT,
87 TPM_MEDIUM,
88 TPM_SHORT,
89 TPM_SHORT,
90 TPM_MEDIUM,
91 TPM_LONG,
92 TPM_MEDIUM,
93 TPM_SHORT,
94 TPM_SHORT,
95 TPM_SHORT,
96 TPM_MEDIUM,
97 TPM_MEDIUM,
98 TPM_UNDEFINED,
99 TPM_UNDEFINED,
100 TPM_MEDIUM,
101 TPM_LONG,
102 TPM_MEDIUM,
103 TPM_SHORT,
104 TPM_SHORT,
105 TPM_SHORT,
106 TPM_SHORT,
107 TPM_SHORT,
108 TPM_SHORT,
109 TPM_LONG,
110 TPM_MEDIUM,
111 TPM_MEDIUM,
112 TPM_UNDEFINED,
113 TPM_UNDEFINED,
114 TPM_UNDEFINED,
115 TPM_UNDEFINED,
116 TPM_UNDEFINED,
117 TPM_UNDEFINED,
118 TPM_UNDEFINED,
119 TPM_UNDEFINED,
120 TPM_MEDIUM,
121 TPM_MEDIUM,
122 TPM_MEDIUM,
123 TPM_SHORT,
124 TPM_SHORT,
125 TPM_MEDIUM,
126 TPM_UNDEFINED,
127 TPM_UNDEFINED,
128 TPM_UNDEFINED,
129 TPM_UNDEFINED,
130 TPM_SHORT,
131 TPM_SHORT,
132 TPM_UNDEFINED,
133 TPM_UNDEFINED,
134 TPM_UNDEFINED,
135 TPM_UNDEFINED,
136 TPM_UNDEFINED,
137 TPM_UNDEFINED,
138 TPM_UNDEFINED,
139 TPM_UNDEFINED,
140 TPM_LONG,
141 TPM_UNDEFINED,
142 TPM_MEDIUM,
143 TPM_LONG,
144 TPM_SHORT,
145 TPM_UNDEFINED,
146 TPM_UNDEFINED,
147 TPM_UNDEFINED,
148 TPM_UNDEFINED,
149 TPM_UNDEFINED,
150 TPM_SHORT,
151 TPM_SHORT,
152 TPM_SHORT,
153 TPM_SHORT,
154 TPM_SHORT,
155 TPM_UNDEFINED,
156 TPM_UNDEFINED,
157 TPM_UNDEFINED,
158 TPM_UNDEFINED,
159 TPM_UNDEFINED,
160 TPM_MEDIUM,
161 TPM_SHORT,
162 TPM_SHORT,
163 TPM_UNDEFINED,
164 TPM_UNDEFINED,
165 TPM_UNDEFINED,
166 TPM_UNDEFINED,
167 TPM_UNDEFINED,
168 TPM_UNDEFINED,
169 TPM_UNDEFINED,
170 TPM_SHORT,
171 TPM_SHORT,
172 TPM_SHORT,
173 TPM_SHORT,
174 TPM_SHORT,
175 TPM_SHORT,
176 TPM_SHORT,
177 TPM_SHORT,
178 TPM_UNDEFINED,
179 TPM_UNDEFINED,
180 TPM_LONG,
181 TPM_LONG,
182 TPM_MEDIUM,
183 TPM_UNDEFINED,
184 TPM_SHORT,
185 TPM_SHORT,
186 TPM_SHORT,
187 TPM_LONG,
188 TPM_SHORT,
189 TPM_SHORT,
190 TPM_SHORT,
191 TPM_MEDIUM,
192 TPM_UNDEFINED,
193 TPM_SHORT,
194 TPM_MEDIUM,
195 TPM_UNDEFINED,
196 TPM_UNDEFINED,
197 TPM_UNDEFINED,
198 TPM_UNDEFINED,
199 TPM_UNDEFINED,
200 TPM_SHORT,
201 TPM_SHORT,
202 TPM_UNDEFINED,
203 TPM_UNDEFINED,
204 TPM_UNDEFINED,
205 TPM_UNDEFINED,
206 TPM_UNDEFINED,
207 TPM_UNDEFINED,
208 TPM_UNDEFINED,
209 TPM_UNDEFINED,
210 TPM_SHORT,
211 TPM_MEDIUM,
212 TPM_MEDIUM,
213 TPM_SHORT,
214 TPM_SHORT,
215 TPM_UNDEFINED,
216 TPM_UNDEFINED,
217 TPM_UNDEFINED,
218 TPM_UNDEFINED,
219 TPM_UNDEFINED,
220 TPM_SHORT,
221 TPM_SHORT,
222 TPM_SHORT,
223 TPM_SHORT,
224 TPM_UNDEFINED,
225 TPM_UNDEFINED,
226 TPM_UNDEFINED,
227 TPM_UNDEFINED,
228 TPM_UNDEFINED,
229 TPM_UNDEFINED,
230 TPM_LONG,
231 TPM_UNDEFINED,
232 TPM_UNDEFINED,
233 TPM_UNDEFINED,
234 TPM_UNDEFINED,
235 TPM_UNDEFINED,
236 TPM_UNDEFINED,
237 TPM_UNDEFINED,
238 TPM_UNDEFINED,
239 TPM_UNDEFINED,
240 TPM_MEDIUM,
241 TPM_SHORT,
242 TPM_MEDIUM,
243 TPM_MEDIUM,
244 TPM_MEDIUM,
245 TPM_MEDIUM,
246 TPM_SHORT,
247 TPM_UNDEFINED,
248 TPM_UNDEFINED,
249 TPM_UNDEFINED,
250 TPM_UNDEFINED,
251 TPM_UNDEFINED,
252 TPM_UNDEFINED,
253 TPM_UNDEFINED,
254 TPM_UNDEFINED,
255 TPM_UNDEFINED,
256 TPM_UNDEFINED,
257 TPM_UNDEFINED,
258 TPM_UNDEFINED,
259 TPM_UNDEFINED,
260 TPM_SHORT,
261 TPM_UNDEFINED,
262 TPM_UNDEFINED,
263 TPM_UNDEFINED,
264 TPM_SHORT,
265 TPM_SHORT,
266 TPM_SHORT,
267 TPM_SHORT,
268 TPM_SHORT,
269 TPM_SHORT,
270 TPM_MEDIUM,
271 TPM_UNDEFINED,
272 TPM_MEDIUM,
273 TPM_MEDIUM,
274 TPM_MEDIUM,
275 TPM_UNDEFINED,
276 TPM_MEDIUM,
277 TPM_UNDEFINED,
278 TPM_UNDEFINED,
279 TPM_SHORT,
280 TPM_SHORT,
281 TPM_SHORT,
282 TPM_SHORT,
283 TPM_SHORT,
284 TPM_SHORT,
285 TPM_UNDEFINED,
286 TPM_UNDEFINED,
287 TPM_UNDEFINED,
288 TPM_UNDEFINED,
289 TPM_UNDEFINED,
290 TPM_SHORT,
291 TPM_LONG,
292 TPM_MEDIUM,
293 TPM_UNDEFINED,
294 TPM_UNDEFINED,
295 TPM_UNDEFINED,
296 TPM_UNDEFINED,
297 TPM_UNDEFINED,
298 TPM_UNDEFINED,
299 TPM_UNDEFINED,
300 TPM_SHORT,
301 TPM_UNDEFINED,
302 TPM_MEDIUM,
303};
304
305
306
307
308unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
309 u32 ordinal)
310{
311 int duration_idx = TPM_UNDEFINED;
312 int duration = 0;
313
314
315
316
317
318 if (ordinal < TPM_MAX_ORDINAL)
319 duration_idx = tpm_ordinal_duration[ordinal];
320
321 if (duration_idx != TPM_UNDEFINED)
322 duration = chip->duration[duration_idx];
323 if (duration <= 0)
324 return 2 * 60 * HZ;
325 else
326 return duration;
327}
328EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
329
330
331
332
333ssize_t tpm_transmit(struct tpm_chip *chip, const u8 *buf, size_t bufsiz,
334 unsigned int flags)
335{
336 ssize_t rc;
337 u32 count, ordinal;
338 unsigned long stop;
339
340 if (bufsiz < TPM_HEADER_SIZE)
341 return -EINVAL;
342
343 if (bufsiz > TPM_BUFSIZE)
344 bufsiz = TPM_BUFSIZE;
345
346 count = be32_to_cpu(*((__be32 *) (buf + 2)));
347 ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
348 if (count == 0)
349 return -ENODATA;
350 if (count > bufsiz) {
351 dev_err(&chip->dev,
352 "invalid count value %x %zx\n", count, bufsiz);
353 return -E2BIG;
354 }
355
356 if (!(flags & TPM_TRANSMIT_UNLOCKED))
357 mutex_lock(&chip->tpm_mutex);
358
359 rc = chip->ops->send(chip, (u8 *) buf, count);
360 if (rc < 0) {
361 dev_err(&chip->dev,
362 "tpm_transmit: tpm_send: error %zd\n", rc);
363 goto out;
364 }
365
366 if (chip->flags & TPM_CHIP_FLAG_IRQ)
367 goto out_recv;
368
369 if (chip->flags & TPM_CHIP_FLAG_TPM2)
370 stop = jiffies + tpm2_calc_ordinal_duration(chip, ordinal);
371 else
372 stop = jiffies + tpm_calc_ordinal_duration(chip, ordinal);
373 do {
374 u8 status = chip->ops->status(chip);
375 if ((status & chip->ops->req_complete_mask) ==
376 chip->ops->req_complete_val)
377 goto out_recv;
378
379 if (chip->ops->req_canceled(chip, status)) {
380 dev_err(&chip->dev, "Operation Canceled\n");
381 rc = -ECANCELED;
382 goto out;
383 }
384
385 msleep(TPM_TIMEOUT);
386 rmb();
387 } while (time_before(jiffies, stop));
388
389 chip->ops->cancel(chip);
390 dev_err(&chip->dev, "Operation Timed out\n");
391 rc = -ETIME;
392 goto out;
393
394out_recv:
395 rc = chip->ops->recv(chip, (u8 *) buf, bufsiz);
396 if (rc < 0)
397 dev_err(&chip->dev,
398 "tpm_transmit: tpm_recv: error %zd\n", rc);
399out:
400 if (!(flags & TPM_TRANSMIT_UNLOCKED))
401 mutex_unlock(&chip->tpm_mutex);
402 return rc;
403}
404
405#define TPM_DIGEST_SIZE 20
406#define TPM_RET_CODE_IDX 6
407
408ssize_t tpm_transmit_cmd(struct tpm_chip *chip, const void *cmd,
409 int len, unsigned int flags, const char *desc)
410{
411 const struct tpm_output_header *header;
412 int err;
413
414 len = tpm_transmit(chip, (const u8 *)cmd, len, flags);
415 if (len < 0)
416 return len;
417 else if (len < TPM_HEADER_SIZE)
418 return -EFAULT;
419
420 header = cmd;
421
422 err = be32_to_cpu(header->return_code);
423 if (err != 0 && desc)
424 dev_err(&chip->dev, "A TPM error (%d) occurred %s\n", err,
425 desc);
426
427 return err;
428}
429
430#define TPM_INTERNAL_RESULT_SIZE 200
431#define TPM_ORD_GET_CAP cpu_to_be32(101)
432#define TPM_ORD_GET_RANDOM cpu_to_be32(70)
433
434static const struct tpm_input_header tpm_getcap_header = {
435 .tag = TPM_TAG_RQU_COMMAND,
436 .length = cpu_to_be32(22),
437 .ordinal = TPM_ORD_GET_CAP
438};
439
440ssize_t tpm_getcap(struct tpm_chip *chip, __be32 subcap_id, cap_t *cap,
441 const char *desc)
442{
443 struct tpm_cmd_t tpm_cmd;
444 int rc;
445
446 tpm_cmd.header.in = tpm_getcap_header;
447 if (subcap_id == CAP_VERSION_1_1 || subcap_id == CAP_VERSION_1_2) {
448 tpm_cmd.params.getcap_in.cap = subcap_id;
449
450 tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(0);
451 tpm_cmd.header.in.length -= cpu_to_be32(sizeof(__be32));
452 } else {
453 if (subcap_id == TPM_CAP_FLAG_PERM ||
454 subcap_id == TPM_CAP_FLAG_VOL)
455 tpm_cmd.params.getcap_in.cap = TPM_CAP_FLAG;
456 else
457 tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
458 tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
459 tpm_cmd.params.getcap_in.subcap = subcap_id;
460 }
461 rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
462 desc);
463 if (!rc)
464 *cap = tpm_cmd.params.getcap_out.cap;
465 return rc;
466}
467EXPORT_SYMBOL_GPL(tpm_getcap);
468
469#define TPM_ORD_STARTUP cpu_to_be32(153)
470#define TPM_ST_CLEAR cpu_to_be16(1)
471#define TPM_ST_STATE cpu_to_be16(2)
472#define TPM_ST_DEACTIVATED cpu_to_be16(3)
473static const struct tpm_input_header tpm_startup_header = {
474 .tag = TPM_TAG_RQU_COMMAND,
475 .length = cpu_to_be32(12),
476 .ordinal = TPM_ORD_STARTUP
477};
478
479static int tpm_startup(struct tpm_chip *chip, __be16 startup_type)
480{
481 struct tpm_cmd_t start_cmd;
482 start_cmd.header.in = tpm_startup_header;
483
484 start_cmd.params.startup_in.startup_type = startup_type;
485 return tpm_transmit_cmd(chip, &start_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
486 "attempting to start the TPM");
487}
488
489int tpm_get_timeouts(struct tpm_chip *chip)
490{
491 struct tpm_cmd_t tpm_cmd;
492 unsigned long new_timeout[4];
493 unsigned long old_timeout[4];
494 struct duration_t *duration_cap;
495 ssize_t rc;
496
497 if (chip->flags & TPM_CHIP_FLAG_TPM2) {
498
499 chip->timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A);
500 chip->timeout_b = msecs_to_jiffies(TPM2_TIMEOUT_B);
501 chip->timeout_c = msecs_to_jiffies(TPM2_TIMEOUT_C);
502 chip->timeout_d = msecs_to_jiffies(TPM2_TIMEOUT_D);
503 chip->duration[TPM_SHORT] =
504 msecs_to_jiffies(TPM2_DURATION_SHORT);
505 chip->duration[TPM_MEDIUM] =
506 msecs_to_jiffies(TPM2_DURATION_MEDIUM);
507 chip->duration[TPM_LONG] =
508 msecs_to_jiffies(TPM2_DURATION_LONG);
509 return 0;
510 }
511
512 tpm_cmd.header.in = tpm_getcap_header;
513 tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
514 tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
515 tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_TIMEOUT;
516 rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
517 NULL);
518
519 if (rc == TPM_ERR_INVALID_POSTINIT) {
520
521
522 dev_info(&chip->dev, "Issuing TPM_STARTUP");
523 if (tpm_startup(chip, TPM_ST_CLEAR))
524 return rc;
525
526 tpm_cmd.header.in = tpm_getcap_header;
527 tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
528 tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
529 tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_TIMEOUT;
530 rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
531 0, NULL);
532 }
533 if (rc) {
534 dev_err(&chip->dev,
535 "A TPM error (%zd) occurred attempting to determine the timeouts\n",
536 rc);
537 goto duration;
538 }
539
540 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
541 be32_to_cpu(tpm_cmd.header.out.length)
542 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 4 * sizeof(u32))
543 return -EINVAL;
544
545 old_timeout[0] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.a);
546 old_timeout[1] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.b);
547 old_timeout[2] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.c);
548 old_timeout[3] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.d);
549 memcpy(new_timeout, old_timeout, sizeof(new_timeout));
550
551
552
553
554
555 if (chip->ops->update_timeouts != NULL)
556 chip->timeout_adjusted =
557 chip->ops->update_timeouts(chip, new_timeout);
558
559 if (!chip->timeout_adjusted) {
560
561 if (new_timeout[0] != 0 && new_timeout[0] < 1000) {
562 int i;
563
564
565 for (i = 0; i != ARRAY_SIZE(new_timeout); i++)
566 new_timeout[i] *= 1000;
567 chip->timeout_adjusted = true;
568 }
569 }
570
571
572 if (chip->timeout_adjusted) {
573 dev_info(&chip->dev,
574 HW_ERR "Adjusting reported timeouts: A %lu->%luus B %lu->%luus C %lu->%luus D %lu->%luus\n",
575 old_timeout[0], new_timeout[0],
576 old_timeout[1], new_timeout[1],
577 old_timeout[2], new_timeout[2],
578 old_timeout[3], new_timeout[3]);
579 }
580
581 chip->timeout_a = usecs_to_jiffies(new_timeout[0]);
582 chip->timeout_b = usecs_to_jiffies(new_timeout[1]);
583 chip->timeout_c = usecs_to_jiffies(new_timeout[2]);
584 chip->timeout_d = usecs_to_jiffies(new_timeout[3]);
585
586duration:
587 tpm_cmd.header.in = tpm_getcap_header;
588 tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
589 tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
590 tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_DURATION;
591
592 rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 0,
593 "attempting to determine the durations");
594 if (rc)
595 return rc;
596
597 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
598 be32_to_cpu(tpm_cmd.header.out.length)
599 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
600 return -EINVAL;
601
602 duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
603 chip->duration[TPM_SHORT] =
604 usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short));
605 chip->duration[TPM_MEDIUM] =
606 usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_medium));
607 chip->duration[TPM_LONG] =
608 usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_long));
609
610
611
612
613
614
615 if (chip->duration[TPM_SHORT] < (HZ / 100)) {
616 chip->duration[TPM_SHORT] = HZ;
617 chip->duration[TPM_MEDIUM] *= 1000;
618 chip->duration[TPM_LONG] *= 1000;
619 chip->duration_adjusted = true;
620 dev_info(&chip->dev, "Adjusting TPM timeout parameters.");
621 }
622 return 0;
623}
624EXPORT_SYMBOL_GPL(tpm_get_timeouts);
625
626#define TPM_ORD_CONTINUE_SELFTEST 83
627#define CONTINUE_SELFTEST_RESULT_SIZE 10
628
629static const struct tpm_input_header continue_selftest_header = {
630 .tag = TPM_TAG_RQU_COMMAND,
631 .length = cpu_to_be32(10),
632 .ordinal = cpu_to_be32(TPM_ORD_CONTINUE_SELFTEST),
633};
634
635
636
637
638
639
640
641
642static int tpm_continue_selftest(struct tpm_chip *chip)
643{
644 int rc;
645 struct tpm_cmd_t cmd;
646
647 cmd.header.in = continue_selftest_header;
648 rc = tpm_transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE, 0,
649 "continue selftest");
650 return rc;
651}
652
653#define TPM_ORDINAL_PCRREAD cpu_to_be32(21)
654#define READ_PCR_RESULT_SIZE 30
655static const struct tpm_input_header pcrread_header = {
656 .tag = TPM_TAG_RQU_COMMAND,
657 .length = cpu_to_be32(14),
658 .ordinal = TPM_ORDINAL_PCRREAD
659};
660
661int tpm_pcr_read_dev(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
662{
663 int rc;
664 struct tpm_cmd_t cmd;
665
666 cmd.header.in = pcrread_header;
667 cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);
668 rc = tpm_transmit_cmd(chip, &cmd, READ_PCR_RESULT_SIZE, 0,
669 "attempting to read a pcr value");
670
671 if (rc == 0)
672 memcpy(res_buf, cmd.params.pcrread_out.pcr_result,
673 TPM_DIGEST_SIZE);
674 return rc;
675}
676
677
678
679
680
681
682
683
684int tpm_is_tpm2(u32 chip_num)
685{
686 struct tpm_chip *chip;
687 int rc;
688
689 chip = tpm_chip_find_get(chip_num);
690 if (chip == NULL)
691 return -ENODEV;
692
693 rc = (chip->flags & TPM_CHIP_FLAG_TPM2) != 0;
694
695 tpm_put_ops(chip);
696
697 return rc;
698}
699EXPORT_SYMBOL_GPL(tpm_is_tpm2);
700
701
702
703
704
705
706
707
708
709
710
711
712int tpm_pcr_read(u32 chip_num, int pcr_idx, u8 *res_buf)
713{
714 struct tpm_chip *chip;
715 int rc;
716
717 chip = tpm_chip_find_get(chip_num);
718 if (chip == NULL)
719 return -ENODEV;
720 if (chip->flags & TPM_CHIP_FLAG_TPM2)
721 rc = tpm2_pcr_read(chip, pcr_idx, res_buf);
722 else
723 rc = tpm_pcr_read_dev(chip, pcr_idx, res_buf);
724 tpm_put_ops(chip);
725 return rc;
726}
727EXPORT_SYMBOL_GPL(tpm_pcr_read);
728
729
730
731
732
733
734
735
736
737
738
739#define TPM_ORD_PCR_EXTEND cpu_to_be32(20)
740#define EXTEND_PCR_RESULT_SIZE 34
741static const struct tpm_input_header pcrextend_header = {
742 .tag = TPM_TAG_RQU_COMMAND,
743 .length = cpu_to_be32(34),
744 .ordinal = TPM_ORD_PCR_EXTEND
745};
746
747int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)
748{
749 struct tpm_cmd_t cmd;
750 int rc;
751 struct tpm_chip *chip;
752
753 chip = tpm_chip_find_get(chip_num);
754 if (chip == NULL)
755 return -ENODEV;
756
757 if (chip->flags & TPM_CHIP_FLAG_TPM2) {
758 rc = tpm2_pcr_extend(chip, pcr_idx, hash);
759 tpm_put_ops(chip);
760 return rc;
761 }
762
763 cmd.header.in = pcrextend_header;
764 cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx);
765 memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE);
766 rc = tpm_transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE, 0,
767 "attempting extend a PCR value");
768
769 tpm_put_ops(chip);
770 return rc;
771}
772EXPORT_SYMBOL_GPL(tpm_pcr_extend);
773
774
775
776
777
778
779
780
781
782int tpm_do_selftest(struct tpm_chip *chip)
783{
784 int rc;
785 unsigned int loops;
786 unsigned int delay_msec = 100;
787 unsigned long duration;
788 u8 dummy[TPM_DIGEST_SIZE];
789
790 duration = tpm_calc_ordinal_duration(chip, TPM_ORD_CONTINUE_SELFTEST);
791
792 loops = jiffies_to_msecs(duration) / delay_msec;
793
794 rc = tpm_continue_selftest(chip);
795
796
797
798 if (rc)
799 return rc;
800
801 do {
802
803 rc = tpm_pcr_read_dev(chip, 0, dummy);
804
805
806
807
808 if (rc == -ETIME) {
809 dev_info(
810 &chip->dev, HW_ERR
811 "TPM command timed out during continue self test");
812 msleep(delay_msec);
813 continue;
814 }
815
816 if (rc == TPM_ERR_DISABLED || rc == TPM_ERR_DEACTIVATED) {
817 dev_info(&chip->dev,
818 "TPM is disabled/deactivated (0x%X)\n", rc);
819
820
821
822
823 return 0;
824 }
825 if (rc != TPM_WARN_DOING_SELFTEST)
826 return rc;
827 msleep(delay_msec);
828 } while (--loops > 0);
829
830 return rc;
831}
832EXPORT_SYMBOL_GPL(tpm_do_selftest);
833
834
835
836
837
838
839
840
841int tpm1_auto_startup(struct tpm_chip *chip)
842{
843 int rc;
844
845 rc = tpm_get_timeouts(chip);
846 if (rc)
847 goto out;
848 rc = tpm_do_selftest(chip);
849 if (rc) {
850 dev_err(&chip->dev, "TPM self test failed\n");
851 goto out;
852 }
853
854 return rc;
855out:
856 if (rc > 0)
857 rc = -ENODEV;
858 return rc;
859}
860
861int tpm_send(u32 chip_num, void *cmd, size_t buflen)
862{
863 struct tpm_chip *chip;
864 int rc;
865
866 chip = tpm_chip_find_get(chip_num);
867 if (chip == NULL)
868 return -ENODEV;
869
870 rc = tpm_transmit_cmd(chip, cmd, buflen, 0, "attempting tpm_cmd");
871
872 tpm_put_ops(chip);
873 return rc;
874}
875EXPORT_SYMBOL_GPL(tpm_send);
876
877static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8 mask,
878 bool check_cancel, bool *canceled)
879{
880 u8 status = chip->ops->status(chip);
881
882 *canceled = false;
883 if ((status & mask) == mask)
884 return true;
885 if (check_cancel && chip->ops->req_canceled(chip, status)) {
886 *canceled = true;
887 return true;
888 }
889 return false;
890}
891
892int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
893 wait_queue_head_t *queue, bool check_cancel)
894{
895 unsigned long stop;
896 long rc;
897 u8 status;
898 bool canceled = false;
899
900
901 status = chip->ops->status(chip);
902 if ((status & mask) == mask)
903 return 0;
904
905 stop = jiffies + timeout;
906
907 if (chip->flags & TPM_CHIP_FLAG_IRQ) {
908again:
909 timeout = stop - jiffies;
910 if ((long)timeout <= 0)
911 return -ETIME;
912 rc = wait_event_interruptible_timeout(*queue,
913 wait_for_tpm_stat_cond(chip, mask, check_cancel,
914 &canceled),
915 timeout);
916 if (rc > 0) {
917 if (canceled)
918 return -ECANCELED;
919 return 0;
920 }
921 if (rc == -ERESTARTSYS && freezing(current)) {
922 clear_thread_flag(TIF_SIGPENDING);
923 goto again;
924 }
925 } else {
926 do {
927 msleep(TPM_TIMEOUT);
928 status = chip->ops->status(chip);
929 if ((status & mask) == mask)
930 return 0;
931 } while (time_before(jiffies, stop));
932 }
933 return -ETIME;
934}
935EXPORT_SYMBOL_GPL(wait_for_tpm_stat);
936
937#define TPM_ORD_SAVESTATE cpu_to_be32(152)
938#define SAVESTATE_RESULT_SIZE 10
939
940static const struct tpm_input_header savestate_header = {
941 .tag = TPM_TAG_RQU_COMMAND,
942 .length = cpu_to_be32(10),
943 .ordinal = TPM_ORD_SAVESTATE
944};
945
946
947
948
949
950int tpm_pm_suspend(struct device *dev)
951{
952 struct tpm_chip *chip = dev_get_drvdata(dev);
953 struct tpm_cmd_t cmd;
954 int rc, try;
955
956 u8 dummy_hash[TPM_DIGEST_SIZE] = { 0 };
957
958 if (chip == NULL)
959 return -ENODEV;
960
961 if (chip->flags & TPM_CHIP_FLAG_TPM2) {
962 tpm2_shutdown(chip, TPM2_SU_STATE);
963 return 0;
964 }
965
966
967 if (tpm_suspend_pcr) {
968 cmd.header.in = pcrextend_header;
969 cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(tpm_suspend_pcr);
970 memcpy(cmd.params.pcrextend_in.hash, dummy_hash,
971 TPM_DIGEST_SIZE);
972 rc = tpm_transmit_cmd(chip, &cmd, EXTEND_PCR_RESULT_SIZE, 0,
973 "extending dummy pcr before suspend");
974 }
975
976
977 for (try = 0; try < TPM_RETRY; try++) {
978 cmd.header.in = savestate_header;
979 rc = tpm_transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, 0,
980 NULL);
981
982
983
984
985
986
987
988
989
990
991
992 if (rc != TPM_WARN_RETRY)
993 break;
994 msleep(TPM_TIMEOUT_RETRY);
995 }
996
997 if (rc)
998 dev_err(&chip->dev,
999 "Error (%d) sending savestate before suspend\n", rc);
1000 else if (try > 0)
1001 dev_warn(&chip->dev, "TPM savestate took %dms\n",
1002 try * TPM_TIMEOUT_RETRY);
1003
1004 return rc;
1005}
1006EXPORT_SYMBOL_GPL(tpm_pm_suspend);
1007
1008
1009
1010
1011
1012int tpm_pm_resume(struct device *dev)
1013{
1014 struct tpm_chip *chip = dev_get_drvdata(dev);
1015
1016 if (chip == NULL)
1017 return -ENODEV;
1018
1019 return 0;
1020}
1021EXPORT_SYMBOL_GPL(tpm_pm_resume);
1022
1023#define TPM_GETRANDOM_RESULT_SIZE 18
1024static const struct tpm_input_header tpm_getrandom_header = {
1025 .tag = TPM_TAG_RQU_COMMAND,
1026 .length = cpu_to_be32(14),
1027 .ordinal = TPM_ORD_GET_RANDOM
1028};
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038int tpm_get_random(u32 chip_num, u8 *out, size_t max)
1039{
1040 struct tpm_chip *chip;
1041 struct tpm_cmd_t tpm_cmd;
1042 u32 recd, num_bytes = min_t(u32, max, TPM_MAX_RNG_DATA);
1043 int err, total = 0, retries = 5;
1044 u8 *dest = out;
1045
1046 if (!out || !num_bytes || max > TPM_MAX_RNG_DATA)
1047 return -EINVAL;
1048
1049 chip = tpm_chip_find_get(chip_num);
1050 if (chip == NULL)
1051 return -ENODEV;
1052
1053 if (chip->flags & TPM_CHIP_FLAG_TPM2) {
1054 err = tpm2_get_random(chip, out, max);
1055 tpm_put_ops(chip);
1056 return err;
1057 }
1058
1059 do {
1060 tpm_cmd.header.in = tpm_getrandom_header;
1061 tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes);
1062
1063 err = tpm_transmit_cmd(chip, &tpm_cmd,
1064 TPM_GETRANDOM_RESULT_SIZE + num_bytes,
1065 0, "attempting get random");
1066 if (err)
1067 break;
1068
1069 recd = be32_to_cpu(tpm_cmd.params.getrandom_out.rng_data_len);
1070 memcpy(dest, tpm_cmd.params.getrandom_out.rng_data, recd);
1071
1072 dest += recd;
1073 total += recd;
1074 num_bytes -= recd;
1075 } while (retries-- && total < max);
1076
1077 tpm_put_ops(chip);
1078 return total ? total : -EIO;
1079}
1080EXPORT_SYMBOL_GPL(tpm_get_random);
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091int tpm_seal_trusted(u32 chip_num, struct trusted_key_payload *payload,
1092 struct trusted_key_options *options)
1093{
1094 struct tpm_chip *chip;
1095 int rc;
1096
1097 chip = tpm_chip_find_get(chip_num);
1098 if (chip == NULL || !(chip->flags & TPM_CHIP_FLAG_TPM2))
1099 return -ENODEV;
1100
1101 rc = tpm2_seal_trusted(chip, payload, options);
1102
1103 tpm_put_ops(chip);
1104 return rc;
1105}
1106EXPORT_SYMBOL_GPL(tpm_seal_trusted);
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117int tpm_unseal_trusted(u32 chip_num, struct trusted_key_payload *payload,
1118 struct trusted_key_options *options)
1119{
1120 struct tpm_chip *chip;
1121 int rc;
1122
1123 chip = tpm_chip_find_get(chip_num);
1124 if (chip == NULL || !(chip->flags & TPM_CHIP_FLAG_TPM2))
1125 return -ENODEV;
1126
1127 rc = tpm2_unseal_trusted(chip, payload, options);
1128
1129 tpm_put_ops(chip);
1130
1131 return rc;
1132}
1133EXPORT_SYMBOL_GPL(tpm_unseal_trusted);
1134
1135static int __init tpm_init(void)
1136{
1137 int rc;
1138
1139 tpm_class = class_create(THIS_MODULE, "tpm");
1140 if (IS_ERR(tpm_class)) {
1141 pr_err("couldn't create tpm class\n");
1142 return PTR_ERR(tpm_class);
1143 }
1144
1145 rc = alloc_chrdev_region(&tpm_devt, 0, TPM_NUM_DEVICES, "tpm");
1146 if (rc < 0) {
1147 pr_err("tpm: failed to allocate char dev region\n");
1148 class_destroy(tpm_class);
1149 return rc;
1150 }
1151
1152 return 0;
1153}
1154
1155static void __exit tpm_exit(void)
1156{
1157 idr_destroy(&dev_nums_idr);
1158 class_destroy(tpm_class);
1159 unregister_chrdev_region(tpm_devt, TPM_NUM_DEVICES);
1160}
1161
1162subsys_initcall(tpm_init);
1163module_exit(tpm_exit);
1164
1165MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
1166MODULE_DESCRIPTION("TPM Driver");
1167MODULE_VERSION("2.0");
1168MODULE_LICENSE("GPL");
1169