aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/agp/generic.c8
-rw-r--r--drivers/char/hw_random/atmel-rng.c12
-rw-r--r--drivers/char/hw_random/n2-drv.c13
-rw-r--r--drivers/char/hw_random/octeon-rng.c13
-rw-r--r--drivers/char/hw_random/pasemi-rng.c12
-rw-r--r--drivers/char/hw_random/picoxcell-rng.c12
-rw-r--r--drivers/char/hw_random/ppc4xx-rng.c12
-rw-r--r--drivers/char/hw_random/timeriomem-rng.c13
-rw-r--r--drivers/char/hw_random/virtio-rng.c2
-rw-r--r--drivers/char/tpm/Kconfig2
-rw-r--r--drivers/char/tpm/tpm.c137
-rw-r--r--drivers/char/tpm/tpm.h9
-rw-r--r--drivers/char/tpm/tpm_tis.c84
-rw-r--r--drivers/char/virtio_console.c140
14 files changed, 273 insertions, 196 deletions
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
index b072648dc3f6..17e05d1076b3 100644
--- a/drivers/char/agp/generic.c
+++ b/drivers/char/agp/generic.c
@@ -514,12 +514,12 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
514 switch (*bridge_agpstat & 7) { 514 switch (*bridge_agpstat & 7) {
515 case 4: 515 case 4:
516 *bridge_agpstat |= (AGPSTAT2_2X | AGPSTAT2_1X); 516 *bridge_agpstat |= (AGPSTAT2_2X | AGPSTAT2_1X);
517 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x4 rate" 517 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x4 rate. "
518 "Fixing up support for x2 & x1\n"); 518 "Fixing up support for x2 & x1\n");
519 break; 519 break;
520 case 2: 520 case 2:
521 *bridge_agpstat |= AGPSTAT2_1X; 521 *bridge_agpstat |= AGPSTAT2_1X;
522 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x2 rate" 522 printk(KERN_INFO PFX "BIOS bug. AGP bridge claims to only support x2 rate. "
523 "Fixing up support for x1\n"); 523 "Fixing up support for x1\n");
524 break; 524 break;
525 default: 525 default:
@@ -693,7 +693,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
693 *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD); 693 *bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
694 *vga_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD); 694 *vga_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
695 } else { 695 } else {
696 printk(KERN_INFO PFX "Fell back to AGPx4 mode because"); 696 printk(KERN_INFO PFX "Fell back to AGPx4 mode because ");
697 if (!(*bridge_agpstat & AGPSTAT3_8X)) { 697 if (!(*bridge_agpstat & AGPSTAT3_8X)) {
698 printk(KERN_INFO PFX "bridge couldn't do x8. bridge_agpstat:%x (orig=%x)\n", 698 printk(KERN_INFO PFX "bridge couldn't do x8. bridge_agpstat:%x (orig=%x)\n",
699 *bridge_agpstat, origbridge); 699 *bridge_agpstat, origbridge);
@@ -956,7 +956,7 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge)
956 bridge->driver->cache_flush(); 956 bridge->driver->cache_flush();
957#ifdef CONFIG_X86 957#ifdef CONFIG_X86
958 if (set_memory_uc((unsigned long)table, 1 << page_order)) 958 if (set_memory_uc((unsigned long)table, 1 << page_order))
959 printk(KERN_WARNING "Could not set GATT table memory to UC!"); 959 printk(KERN_WARNING "Could not set GATT table memory to UC!\n");
960 960
961 bridge->gatt_table = (void *)table; 961 bridge->gatt_table = (void *)table;
962#else 962#else
diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c
index 241df2e76aba..f518b99f53f5 100644
--- a/drivers/char/hw_random/atmel-rng.c
+++ b/drivers/char/hw_random/atmel-rng.c
@@ -141,17 +141,7 @@ static struct platform_driver atmel_trng_driver = {
141 }, 141 },
142}; 142};
143 143
144static int __init atmel_trng_init(void) 144module_platform_driver(atmel_trng_driver);
145{
146 return platform_driver_register(&atmel_trng_driver);
147}
148module_init(atmel_trng_init);
149
150static void __exit atmel_trng_exit(void)
151{
152 platform_driver_unregister(&atmel_trng_driver);
153}
154module_exit(atmel_trng_exit);
155 145
156MODULE_LICENSE("GPL"); 146MODULE_LICENSE("GPL");
157MODULE_AUTHOR("Peter Korsgaard <jacmet@sunsite.dk>"); 147MODULE_AUTHOR("Peter Korsgaard <jacmet@sunsite.dk>");
diff --git a/drivers/char/hw_random/n2-drv.c b/drivers/char/hw_random/n2-drv.c
index c3de70de00d4..ebd48f0135da 100644
--- a/drivers/char/hw_random/n2-drv.c
+++ b/drivers/char/hw_random/n2-drv.c
@@ -770,15 +770,4 @@ static struct platform_driver n2rng_driver = {
770 .remove = __devexit_p(n2rng_remove), 770 .remove = __devexit_p(n2rng_remove),
771}; 771};
772 772
773static int __init n2rng_init(void) 773module_platform_driver(n2rng_driver);
774{
775 return platform_driver_register(&n2rng_driver);
776}
777
778static void __exit n2rng_exit(void)
779{
780 platform_driver_unregister(&n2rng_driver);
781}
782
783module_init(n2rng_init);
784module_exit(n2rng_exit);
diff --git a/drivers/char/hw_random/octeon-rng.c b/drivers/char/hw_random/octeon-rng.c
index 9cd0feca318c..0943edc782a1 100644
--- a/drivers/char/hw_random/octeon-rng.c
+++ b/drivers/char/hw_random/octeon-rng.c
@@ -131,18 +131,7 @@ static struct platform_driver octeon_rng_driver = {
131 .remove = __exit_p(octeon_rng_remove), 131 .remove = __exit_p(octeon_rng_remove),
132}; 132};
133 133
134static int __init octeon_rng_mod_init(void) 134module_platform_driver(octeon_rng_driver);
135{
136 return platform_driver_register(&octeon_rng_driver);
137}
138
139static void __exit octeon_rng_mod_exit(void)
140{
141 platform_driver_unregister(&octeon_rng_driver);
142}
143
144module_init(octeon_rng_mod_init);
145module_exit(octeon_rng_mod_exit);
146 135
147MODULE_AUTHOR("David Daney"); 136MODULE_AUTHOR("David Daney");
148MODULE_LICENSE("GPL"); 137MODULE_LICENSE("GPL");
diff --git a/drivers/char/hw_random/pasemi-rng.c b/drivers/char/hw_random/pasemi-rng.c
index 1d504815e6db..3a632673aed5 100644
--- a/drivers/char/hw_random/pasemi-rng.c
+++ b/drivers/char/hw_random/pasemi-rng.c
@@ -148,17 +148,7 @@ static struct platform_driver rng_driver = {
148 .remove = rng_remove, 148 .remove = rng_remove,
149}; 149};
150 150
151static int __init rng_init(void) 151module_platform_driver(rng_driver);
152{
153 return platform_driver_register(&rng_driver);
154}
155module_init(rng_init);
156
157static void __exit rng_exit(void)
158{
159 platform_driver_unregister(&rng_driver);
160}
161module_exit(rng_exit);
162 152
163MODULE_LICENSE("GPL"); 153MODULE_LICENSE("GPL");
164MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>"); 154MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>");
diff --git a/drivers/char/hw_random/picoxcell-rng.c b/drivers/char/hw_random/picoxcell-rng.c
index 990d55a5e3e8..97bd891422c7 100644
--- a/drivers/char/hw_random/picoxcell-rng.c
+++ b/drivers/char/hw_random/picoxcell-rng.c
@@ -191,17 +191,7 @@ static struct platform_driver picoxcell_trng_driver = {
191 }, 191 },
192}; 192};
193 193
194static int __init picoxcell_trng_init(void) 194module_platform_driver(picoxcell_trng_driver);
195{
196 return platform_driver_register(&picoxcell_trng_driver);
197}
198module_init(picoxcell_trng_init);
199
200static void __exit picoxcell_trng_exit(void)
201{
202 platform_driver_unregister(&picoxcell_trng_driver);
203}
204module_exit(picoxcell_trng_exit);
205 195
206MODULE_LICENSE("GPL"); 196MODULE_LICENSE("GPL");
207MODULE_AUTHOR("Jamie Iles"); 197MODULE_AUTHOR("Jamie Iles");
diff --git a/drivers/char/hw_random/ppc4xx-rng.c b/drivers/char/hw_random/ppc4xx-rng.c
index b8afa6a4ff67..c51762c13031 100644
--- a/drivers/char/hw_random/ppc4xx-rng.c
+++ b/drivers/char/hw_random/ppc4xx-rng.c
@@ -139,17 +139,7 @@ static struct platform_driver ppc4xx_rng_driver = {
139 .remove = ppc4xx_rng_remove, 139 .remove = ppc4xx_rng_remove,
140}; 140};
141 141
142static int __init ppc4xx_rng_init(void) 142module_platform_driver(ppc4xx_rng_driver);
143{
144 return platform_driver_register(&ppc4xx_rng_driver);
145}
146module_init(ppc4xx_rng_init);
147
148static void __exit ppc4xx_rng_exit(void)
149{
150 platform_driver_unregister(&ppc4xx_rng_driver);
151}
152module_exit(ppc4xx_rng_exit);
153 143
154MODULE_LICENSE("GPL"); 144MODULE_LICENSE("GPL");
155MODULE_AUTHOR("Josh Boyer <jwboyer@linux.vnet.ibm.com>"); 145MODULE_AUTHOR("Josh Boyer <jwboyer@linux.vnet.ibm.com>");
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c
index a8428e6f64a9..f1a1618db1fb 100644
--- a/drivers/char/hw_random/timeriomem-rng.c
+++ b/drivers/char/hw_random/timeriomem-rng.c
@@ -149,18 +149,7 @@ static struct platform_driver timeriomem_rng_driver = {
149 .remove = __devexit_p(timeriomem_rng_remove), 149 .remove = __devexit_p(timeriomem_rng_remove),
150}; 150};
151 151
152static int __init timeriomem_rng_init(void) 152module_platform_driver(timeriomem_rng_driver);
153{
154 return platform_driver_register(&timeriomem_rng_driver);
155}
156
157static void __exit timeriomem_rng_exit(void)
158{
159 platform_driver_unregister(&timeriomem_rng_driver);
160}
161
162module_init(timeriomem_rng_init);
163module_exit(timeriomem_rng_exit);
164 153
165MODULE_LICENSE("GPL"); 154MODULE_LICENSE("GPL");
166MODULE_AUTHOR("Alexander Clouter <alex@digriz.org.uk>"); 155MODULE_AUTHOR("Alexander Clouter <alex@digriz.org.uk>");
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
index fd699ccecf5b..723725bbb96b 100644
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -47,7 +47,7 @@ static void register_buffer(u8 *buf, size_t size)
47 sg_init_one(&sg, buf, size); 47 sg_init_one(&sg, buf, size);
48 48
49 /* There should always be room for one buffer. */ 49 /* There should always be room for one buffer. */
50 if (virtqueue_add_buf(vq, &sg, 0, 1, buf) < 0) 50 if (virtqueue_add_buf(vq, &sg, 0, 1, buf, GFP_KERNEL) < 0)
51 BUG(); 51 BUG();
52 52
53 virtqueue_kick(vq); 53 virtqueue_kick(vq);
diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig
index fa567f1158c2..7fc75e47e6d0 100644
--- a/drivers/char/tpm/Kconfig
+++ b/drivers/char/tpm/Kconfig
@@ -27,6 +27,7 @@ if TCG_TPM
27 27
28config TCG_TIS 28config TCG_TIS
29 tristate "TPM Interface Specification 1.2 Interface" 29 tristate "TPM Interface Specification 1.2 Interface"
30 depends on X86
30 ---help--- 31 ---help---
31 If you have a TPM security chip that is compliant with the 32 If you have a TPM security chip that is compliant with the
32 TCG TIS 1.2 TPM specification say Yes and it will be accessible 33 TCG TIS 1.2 TPM specification say Yes and it will be accessible
@@ -35,6 +36,7 @@ config TCG_TIS
35 36
36config TCG_NSC 37config TCG_NSC
37 tristate "National Semiconductor TPM Interface" 38 tristate "National Semiconductor TPM Interface"
39 depends on X86
38 ---help--- 40 ---help---
39 If you have a TPM security chip from National Semiconductor 41 If you have a TPM security chip from National Semiconductor
40 say Yes and it will be accessible from within Linux. To 42 say Yes and it will be accessible from within Linux. To
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 361a1dff8f77..6a8771f47a55 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -27,6 +27,7 @@
27#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/mutex.h> 28#include <linux/mutex.h>
29#include <linux/spinlock.h> 29#include <linux/spinlock.h>
30#include <linux/freezer.h>
30 31
31#include "tpm.h" 32#include "tpm.h"
32 33
@@ -440,7 +441,6 @@ out:
440} 441}
441 442
442#define TPM_DIGEST_SIZE 20 443#define TPM_DIGEST_SIZE 20
443#define TPM_ERROR_SIZE 10
444#define TPM_RET_CODE_IDX 6 444#define TPM_RET_CODE_IDX 6
445 445
446enum tpm_capabilities { 446enum tpm_capabilities {
@@ -469,12 +469,14 @@ static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
469 len = tpm_transmit(chip,(u8 *) cmd, len); 469 len = tpm_transmit(chip,(u8 *) cmd, len);
470 if (len < 0) 470 if (len < 0)
471 return len; 471 return len;
472 if (len == TPM_ERROR_SIZE) { 472 else if (len < TPM_HEADER_SIZE)
473 err = be32_to_cpu(cmd->header.out.return_code); 473 return -EFAULT;
474 dev_dbg(chip->dev, "A TPM error (%d) occurred %s\n", err, desc); 474
475 return err; 475 err = be32_to_cpu(cmd->header.out.return_code);
476 } 476 if (err != 0)
477 return 0; 477 dev_err(chip->dev, "A TPM error (%d) occurred %s\n", err, desc);
478
479 return err;
478} 480}
479 481
480#define TPM_INTERNAL_RESULT_SIZE 200 482#define TPM_INTERNAL_RESULT_SIZE 200
@@ -530,7 +532,7 @@ void tpm_gen_interrupt(struct tpm_chip *chip)
530} 532}
531EXPORT_SYMBOL_GPL(tpm_gen_interrupt); 533EXPORT_SYMBOL_GPL(tpm_gen_interrupt);
532 534
533void tpm_get_timeouts(struct tpm_chip *chip) 535int tpm_get_timeouts(struct tpm_chip *chip)
534{ 536{
535 struct tpm_cmd_t tpm_cmd; 537 struct tpm_cmd_t tpm_cmd;
536 struct timeout_t *timeout_cap; 538 struct timeout_t *timeout_cap;
@@ -552,7 +554,7 @@ void tpm_get_timeouts(struct tpm_chip *chip)
552 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || 554 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
553 be32_to_cpu(tpm_cmd.header.out.length) 555 be32_to_cpu(tpm_cmd.header.out.length)
554 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 4 * sizeof(u32)) 556 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 4 * sizeof(u32))
555 return; 557 return -EINVAL;
556 558
557 timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout; 559 timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
558 /* Don't overwrite default if value is 0 */ 560 /* Don't overwrite default if value is 0 */
@@ -583,12 +585,12 @@ duration:
583 rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 585 rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
584 "attempting to determine the durations"); 586 "attempting to determine the durations");
585 if (rc) 587 if (rc)
586 return; 588 return rc;
587 589
588 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || 590 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
589 be32_to_cpu(tpm_cmd.header.out.length) 591 be32_to_cpu(tpm_cmd.header.out.length)
590 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32)) 592 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
591 return; 593 return -EINVAL;
592 594
593 duration_cap = &tpm_cmd.params.getcap_out.cap.duration; 595 duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
594 chip->vendor.duration[TPM_SHORT] = 596 chip->vendor.duration[TPM_SHORT] =
@@ -610,20 +612,36 @@ duration:
610 chip->vendor.duration_adjusted = true; 612 chip->vendor.duration_adjusted = true;
611 dev_info(chip->dev, "Adjusting TPM timeout parameters."); 613 dev_info(chip->dev, "Adjusting TPM timeout parameters.");
612 } 614 }
615 return 0;
613} 616}
614EXPORT_SYMBOL_GPL(tpm_get_timeouts); 617EXPORT_SYMBOL_GPL(tpm_get_timeouts);
615 618
616void tpm_continue_selftest(struct tpm_chip *chip) 619#define TPM_ORD_CONTINUE_SELFTEST 83
620#define CONTINUE_SELFTEST_RESULT_SIZE 10
621
622static struct tpm_input_header continue_selftest_header = {
623 .tag = TPM_TAG_RQU_COMMAND,
624 .length = cpu_to_be32(10),
625 .ordinal = cpu_to_be32(TPM_ORD_CONTINUE_SELFTEST),
626};
627
628/**
629 * tpm_continue_selftest -- run TPM's selftest
630 * @chip: TPM chip to use
631 *
632 * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
633 * a TPM error code.
634 */
635static int tpm_continue_selftest(struct tpm_chip *chip)
617{ 636{
618 u8 data[] = { 637 int rc;
619 0, 193, /* TPM_TAG_RQU_COMMAND */ 638 struct tpm_cmd_t cmd;
620 0, 0, 0, 10, /* length */
621 0, 0, 0, 83, /* TPM_ORD_ContinueSelfTest */
622 };
623 639
624 tpm_transmit(chip, data, sizeof(data)); 640 cmd.header.in = continue_selftest_header;
641 rc = transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE,
642 "continue selftest");
643 return rc;
625} 644}
626EXPORT_SYMBOL_GPL(tpm_continue_selftest);
627 645
628ssize_t tpm_show_enabled(struct device * dev, struct device_attribute * attr, 646ssize_t tpm_show_enabled(struct device * dev, struct device_attribute * attr,
629 char *buf) 647 char *buf)
@@ -718,7 +736,7 @@ static struct tpm_input_header pcrread_header = {
718 .ordinal = TPM_ORDINAL_PCRREAD 736 .ordinal = TPM_ORDINAL_PCRREAD
719}; 737};
720 738
721int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf) 739static int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
722{ 740{
723 int rc; 741 int rc;
724 struct tpm_cmd_t cmd; 742 struct tpm_cmd_t cmd;
@@ -798,6 +816,45 @@ int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)
798} 816}
799EXPORT_SYMBOL_GPL(tpm_pcr_extend); 817EXPORT_SYMBOL_GPL(tpm_pcr_extend);
800 818
819/**
820 * tpm_do_selftest - have the TPM continue its selftest and wait until it
821 * can receive further commands
822 * @chip: TPM chip to use
823 *
824 * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
825 * a TPM error code.
826 */
827int tpm_do_selftest(struct tpm_chip *chip)
828{
829 int rc;
830 u8 digest[TPM_DIGEST_SIZE];
831 unsigned int loops;
832 unsigned int delay_msec = 1000;
833 unsigned long duration;
834
835 duration = tpm_calc_ordinal_duration(chip,
836 TPM_ORD_CONTINUE_SELFTEST);
837
838 loops = jiffies_to_msecs(duration) / delay_msec;
839
840 rc = tpm_continue_selftest(chip);
841 /* This may fail if there was no TPM driver during a suspend/resume
842 * cycle; some may return 10 (BAD_ORDINAL), others 28 (FAILEDSELFTEST)
843 */
844 if (rc)
845 return rc;
846
847 do {
848 rc = __tpm_pcr_read(chip, 0, digest);
849 if (rc != TPM_WARN_DOING_SELFTEST)
850 return rc;
851 msleep(delay_msec);
852 } while (--loops > 0);
853
854 return rc;
855}
856EXPORT_SYMBOL_GPL(tpm_do_selftest);
857
801int tpm_send(u32 chip_num, void *cmd, size_t buflen) 858int tpm_send(u32 chip_num, void *cmd, size_t buflen)
802{ 859{
803 struct tpm_chip *chip; 860 struct tpm_chip *chip;
@@ -1005,6 +1062,46 @@ ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
1005} 1062}
1006EXPORT_SYMBOL_GPL(tpm_store_cancel); 1063EXPORT_SYMBOL_GPL(tpm_store_cancel);
1007 1064
1065int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
1066 wait_queue_head_t *queue)
1067{
1068 unsigned long stop;
1069 long rc;
1070 u8 status;
1071
1072 /* check current status */
1073 status = chip->vendor.status(chip);
1074 if ((status & mask) == mask)
1075 return 0;
1076
1077 stop = jiffies + timeout;
1078
1079 if (chip->vendor.irq) {
1080again:
1081 timeout = stop - jiffies;
1082 if ((long)timeout <= 0)
1083 return -ETIME;
1084 rc = wait_event_interruptible_timeout(*queue,
1085 ((chip->vendor.status(chip)
1086 & mask) == mask),
1087 timeout);
1088 if (rc > 0)
1089 return 0;
1090 if (rc == -ERESTARTSYS && freezing(current)) {
1091 clear_thread_flag(TIF_SIGPENDING);
1092 goto again;
1093 }
1094 } else {
1095 do {
1096 msleep(TPM_TIMEOUT);
1097 status = chip->vendor.status(chip);
1098 if ((status & mask) == mask)
1099 return 0;
1100 } while (time_before(jiffies, stop));
1101 }
1102 return -ETIME;
1103}
1104EXPORT_SYMBOL_GPL(wait_for_tpm_stat);
1008/* 1105/*
1009 * Device file system interface to the TPM 1106 * Device file system interface to the TPM
1010 * 1107 *
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index 9c4163cfa3ce..8c1df302fbb6 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -38,6 +38,8 @@ enum tpm_addr {
38 TPM_ADDR = 0x4E, 38 TPM_ADDR = 0x4E,
39}; 39};
40 40
41#define TPM_WARN_DOING_SELFTEST 0x802
42#define TPM_HEADER_SIZE 10
41extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr, 43extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
42 char *); 44 char *);
43extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr, 45extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
@@ -279,9 +281,9 @@ struct tpm_cmd_t {
279 281
280ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *); 282ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *);
281 283
282extern void tpm_get_timeouts(struct tpm_chip *); 284extern int tpm_get_timeouts(struct tpm_chip *);
283extern void tpm_gen_interrupt(struct tpm_chip *); 285extern void tpm_gen_interrupt(struct tpm_chip *);
284extern void tpm_continue_selftest(struct tpm_chip *); 286extern int tpm_do_selftest(struct tpm_chip *);
285extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); 287extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
286extern struct tpm_chip* tpm_register_hardware(struct device *, 288extern struct tpm_chip* tpm_register_hardware(struct device *,
287 const struct tpm_vendor_specific *); 289 const struct tpm_vendor_specific *);
@@ -294,7 +296,8 @@ extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
294extern void tpm_remove_hardware(struct device *); 296extern void tpm_remove_hardware(struct device *);
295extern int tpm_pm_suspend(struct device *, pm_message_t); 297extern int tpm_pm_suspend(struct device *, pm_message_t);
296extern int tpm_pm_resume(struct device *); 298extern int tpm_pm_resume(struct device *);
297 299extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
300 wait_queue_head_t *);
298#ifdef CONFIG_ACPI 301#ifdef CONFIG_ACPI
299extern struct dentry ** tpm_bios_log_setup(char *); 302extern struct dentry ** tpm_bios_log_setup(char *);
300extern void tpm_bios_log_teardown(struct dentry **); 303extern void tpm_bios_log_teardown(struct dentry **);
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
index 3f4051a7c5a7..10cc44ceb5d1 100644
--- a/drivers/char/tpm/tpm_tis.c
+++ b/drivers/char/tpm/tpm_tis.c
@@ -29,8 +29,6 @@
29#include <linux/freezer.h> 29#include <linux/freezer.h>
30#include "tpm.h" 30#include "tpm.h"
31 31
32#define TPM_HEADER_SIZE 10
33
34enum tis_access { 32enum tis_access {
35 TPM_ACCESS_VALID = 0x80, 33 TPM_ACCESS_VALID = 0x80,
36 TPM_ACCESS_ACTIVE_LOCALITY = 0x20, 34 TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
@@ -193,54 +191,14 @@ static int get_burstcount(struct tpm_chip *chip)
193 return -EBUSY; 191 return -EBUSY;
194} 192}
195 193
196static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
197 wait_queue_head_t *queue)
198{
199 unsigned long stop;
200 long rc;
201 u8 status;
202
203 /* check current status */
204 status = tpm_tis_status(chip);
205 if ((status & mask) == mask)
206 return 0;
207
208 stop = jiffies + timeout;
209
210 if (chip->vendor.irq) {
211again:
212 timeout = stop - jiffies;
213 if ((long)timeout <= 0)
214 return -ETIME;
215 rc = wait_event_interruptible_timeout(*queue,
216 ((tpm_tis_status
217 (chip) & mask) ==
218 mask), timeout);
219 if (rc > 0)
220 return 0;
221 if (rc == -ERESTARTSYS && freezing(current)) {
222 clear_thread_flag(TIF_SIGPENDING);
223 goto again;
224 }
225 } else {
226 do {
227 msleep(TPM_TIMEOUT);
228 status = tpm_tis_status(chip);
229 if ((status & mask) == mask)
230 return 0;
231 } while (time_before(jiffies, stop));
232 }
233 return -ETIME;
234}
235
236static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) 194static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
237{ 195{
238 int size = 0, burstcnt; 196 int size = 0, burstcnt;
239 while (size < count && 197 while (size < count &&
240 wait_for_stat(chip, 198 wait_for_tpm_stat(chip,
241 TPM_STS_DATA_AVAIL | TPM_STS_VALID, 199 TPM_STS_DATA_AVAIL | TPM_STS_VALID,
242 chip->vendor.timeout_c, 200 chip->vendor.timeout_c,
243 &chip->vendor.read_queue) 201 &chip->vendor.read_queue)
244 == 0) { 202 == 0) {
245 burstcnt = get_burstcount(chip); 203 burstcnt = get_burstcount(chip);
246 for (; burstcnt > 0 && size < count; burstcnt--) 204 for (; burstcnt > 0 && size < count; burstcnt--)
@@ -282,8 +240,8 @@ static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count)
282 goto out; 240 goto out;
283 } 241 }
284 242
285 wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, 243 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
286 &chip->vendor.int_queue); 244 &chip->vendor.int_queue);
287 status = tpm_tis_status(chip); 245 status = tpm_tis_status(chip);
288 if (status & TPM_STS_DATA_AVAIL) { /* retry? */ 246 if (status & TPM_STS_DATA_AVAIL) { /* retry? */
289 dev_err(chip->dev, "Error left over data\n"); 247 dev_err(chip->dev, "Error left over data\n");
@@ -317,7 +275,7 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
317 status = tpm_tis_status(chip); 275 status = tpm_tis_status(chip);
318 if ((status & TPM_STS_COMMAND_READY) == 0) { 276 if ((status & TPM_STS_COMMAND_READY) == 0) {
319 tpm_tis_ready(chip); 277 tpm_tis_ready(chip);
320 if (wait_for_stat 278 if (wait_for_tpm_stat
321 (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b, 279 (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b,
322 &chip->vendor.int_queue) < 0) { 280 &chip->vendor.int_queue) < 0) {
323 rc = -ETIME; 281 rc = -ETIME;
@@ -333,8 +291,8 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
333 count++; 291 count++;
334 } 292 }
335 293
336 wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, 294 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
337 &chip->vendor.int_queue); 295 &chip->vendor.int_queue);
338 status = tpm_tis_status(chip); 296 status = tpm_tis_status(chip);
339 if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) { 297 if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) {
340 rc = -EIO; 298 rc = -EIO;
@@ -345,8 +303,8 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
345 /* write last byte */ 303 /* write last byte */
346 iowrite8(buf[count], 304 iowrite8(buf[count],
347 chip->vendor.iobase + TPM_DATA_FIFO(chip->vendor.locality)); 305 chip->vendor.iobase + TPM_DATA_FIFO(chip->vendor.locality));
348 wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, 306 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
349 &chip->vendor.int_queue); 307 &chip->vendor.int_queue);
350 status = tpm_tis_status(chip); 308 status = tpm_tis_status(chip);
351 if ((status & TPM_STS_DATA_EXPECT) != 0) { 309 if ((status & TPM_STS_DATA_EXPECT) != 0) {
352 rc = -EIO; 310 rc = -EIO;
@@ -381,7 +339,7 @@ static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
381 339
382 if (chip->vendor.irq) { 340 if (chip->vendor.irq) {
383 ordinal = be32_to_cpu(*((__be32 *) (buf + 6))); 341 ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
384 if (wait_for_stat 342 if (wait_for_tpm_stat
385 (chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID, 343 (chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
386 tpm_calc_ordinal_duration(chip, ordinal), 344 tpm_calc_ordinal_duration(chip, ordinal),
387 &chip->vendor.read_queue) < 0) { 345 &chip->vendor.read_queue) < 0) {
@@ -432,6 +390,9 @@ static int probe_itpm(struct tpm_chip *chip)
432out: 390out:
433 itpm = rem_itpm; 391 itpm = rem_itpm;
434 tpm_tis_ready(chip); 392 tpm_tis_ready(chip);
393 /* some TPMs need a break here otherwise they will not work
394 * correctly on the immediately subsequent command */
395 msleep(chip->vendor.timeout_b);
435 release_locality(chip, chip->vendor.locality, 0); 396 release_locality(chip, chip->vendor.locality, 0);
436 397
437 return rc; 398 return rc;
@@ -614,7 +575,17 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
614 dev_dbg(dev, "\tData Avail Int Support\n"); 575 dev_dbg(dev, "\tData Avail Int Support\n");
615 576
616 /* get the timeouts before testing for irqs */ 577 /* get the timeouts before testing for irqs */
617 tpm_get_timeouts(chip); 578 if (tpm_get_timeouts(chip)) {
579 dev_err(dev, "Could not get TPM timeouts and durations\n");
580 rc = -ENODEV;
581 goto out_err;
582 }
583
584 if (tpm_do_selftest(chip)) {
585 dev_err(dev, "TPM self test failed\n");
586 rc = -ENODEV;
587 goto out_err;
588 }
618 589
619 /* INTERRUPT Setup */ 590 /* INTERRUPT Setup */
620 init_waitqueue_head(&chip->vendor.read_queue); 591 init_waitqueue_head(&chip->vendor.read_queue);
@@ -722,7 +693,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
722 list_add(&chip->vendor.list, &tis_chips); 693 list_add(&chip->vendor.list, &tis_chips);
723 spin_unlock(&tis_lock); 694 spin_unlock(&tis_lock);
724 695
725 tpm_continue_selftest(chip);
726 696
727 return 0; 697 return 0;
728out_err: 698out_err:
@@ -790,7 +760,7 @@ static int tpm_tis_pnp_resume(struct pnp_dev *dev)
790 760
791 ret = tpm_pm_resume(&dev->dev); 761 ret = tpm_pm_resume(&dev->dev);
792 if (!ret) 762 if (!ret)
793 tpm_continue_selftest(chip); 763 tpm_do_selftest(chip);
794 764
795 return ret; 765 return ret;
796} 766}
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 8e3c46d67cb3..b58b56187065 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -392,7 +392,7 @@ static int add_inbuf(struct virtqueue *vq, struct port_buffer *buf)
392 392
393 sg_init_one(sg, buf->buf, buf->size); 393 sg_init_one(sg, buf->buf, buf->size);
394 394
395 ret = virtqueue_add_buf(vq, sg, 0, 1, buf); 395 ret = virtqueue_add_buf(vq, sg, 0, 1, buf, GFP_ATOMIC);
396 virtqueue_kick(vq); 396 virtqueue_kick(vq);
397 return ret; 397 return ret;
398} 398}
@@ -457,7 +457,7 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
457 vq = portdev->c_ovq; 457 vq = portdev->c_ovq;
458 458
459 sg_init_one(sg, &cpkt, sizeof(cpkt)); 459 sg_init_one(sg, &cpkt, sizeof(cpkt));
460 if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt) >= 0) { 460 if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt, GFP_ATOMIC) >= 0) {
461 virtqueue_kick(vq); 461 virtqueue_kick(vq);
462 while (!virtqueue_get_buf(vq, &len)) 462 while (!virtqueue_get_buf(vq, &len))
463 cpu_relax(); 463 cpu_relax();
@@ -506,7 +506,7 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count,
506 reclaim_consumed_buffers(port); 506 reclaim_consumed_buffers(port);
507 507
508 sg_init_one(sg, in_buf, in_count); 508 sg_init_one(sg, in_buf, in_count);
509 ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf); 509 ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf, GFP_ATOMIC);
510 510
511 /* Tell Host to go! */ 511 /* Tell Host to go! */
512 virtqueue_kick(out_vq); 512 virtqueue_kick(out_vq);
@@ -1271,6 +1271,20 @@ static void remove_port(struct kref *kref)
1271 kfree(port); 1271 kfree(port);
1272} 1272}
1273 1273
1274static void remove_port_data(struct port *port)
1275{
1276 struct port_buffer *buf;
1277
1278 /* Remove unused data this port might have received. */
1279 discard_port_data(port);
1280
1281 reclaim_consumed_buffers(port);
1282
1283 /* Remove buffers we queued up for the Host to send us data in. */
1284 while ((buf = virtqueue_detach_unused_buf(port->in_vq)))
1285 free_buf(buf);
1286}
1287
1274/* 1288/*
1275 * Port got unplugged. Remove port from portdev's list and drop the 1289 * Port got unplugged. Remove port from portdev's list and drop the
1276 * kref reference. If no userspace has this port opened, it will 1290 * kref reference. If no userspace has this port opened, it will
@@ -1278,8 +1292,6 @@ static void remove_port(struct kref *kref)
1278 */ 1292 */
1279static void unplug_port(struct port *port) 1293static void unplug_port(struct port *port)
1280{ 1294{
1281 struct port_buffer *buf;
1282
1283 spin_lock_irq(&port->portdev->ports_lock); 1295 spin_lock_irq(&port->portdev->ports_lock);
1284 list_del(&port->list); 1296 list_del(&port->list);
1285 spin_unlock_irq(&port->portdev->ports_lock); 1297 spin_unlock_irq(&port->portdev->ports_lock);
@@ -1300,14 +1312,7 @@ static void unplug_port(struct port *port)
1300 hvc_remove(port->cons.hvc); 1312 hvc_remove(port->cons.hvc);
1301 } 1313 }
1302 1314
1303 /* Remove unused data this port might have received. */ 1315 remove_port_data(port);
1304 discard_port_data(port);
1305
1306 reclaim_consumed_buffers(port);
1307
1308 /* Remove buffers we queued up for the Host to send us data in. */
1309 while ((buf = virtqueue_detach_unused_buf(port->in_vq)))
1310 free_buf(buf);
1311 1316
1312 /* 1317 /*
1313 * We should just assume the device itself has gone off -- 1318 * We should just assume the device itself has gone off --
@@ -1659,6 +1664,28 @@ static const struct file_operations portdev_fops = {
1659 .owner = THIS_MODULE, 1664 .owner = THIS_MODULE,
1660}; 1665};
1661 1666
1667static void remove_vqs(struct ports_device *portdev)
1668{
1669 portdev->vdev->config->del_vqs(portdev->vdev);
1670 kfree(portdev->in_vqs);
1671 kfree(portdev->out_vqs);
1672}
1673
1674static void remove_controlq_data(struct ports_device *portdev)
1675{
1676 struct port_buffer *buf;
1677 unsigned int len;
1678
1679 if (!use_multiport(portdev))
1680 return;
1681
1682 while ((buf = virtqueue_get_buf(portdev->c_ivq, &len)))
1683 free_buf(buf);
1684
1685 while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq)))
1686 free_buf(buf);
1687}
1688
1662/* 1689/*
1663 * Once we're further in boot, we get probed like any other virtio 1690 * Once we're further in boot, we get probed like any other virtio
1664 * device. 1691 * device.
@@ -1764,9 +1791,7 @@ free_vqs:
1764 /* The host might want to notify mgmt sw about device add failure */ 1791 /* The host might want to notify mgmt sw about device add failure */
1765 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, 1792 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
1766 VIRTIO_CONSOLE_DEVICE_READY, 0); 1793 VIRTIO_CONSOLE_DEVICE_READY, 0);
1767 vdev->config->del_vqs(vdev); 1794 remove_vqs(portdev);
1768 kfree(portdev->in_vqs);
1769 kfree(portdev->out_vqs);
1770free_chrdev: 1795free_chrdev:
1771 unregister_chrdev(portdev->chr_major, "virtio-portsdev"); 1796 unregister_chrdev(portdev->chr_major, "virtio-portsdev");
1772free: 1797free:
@@ -1804,21 +1829,8 @@ static void virtcons_remove(struct virtio_device *vdev)
1804 * have to just stop using the port, as the vqs are going 1829 * have to just stop using the port, as the vqs are going
1805 * away. 1830 * away.
1806 */ 1831 */
1807 if (use_multiport(portdev)) { 1832 remove_controlq_data(portdev);
1808 struct port_buffer *buf; 1833 remove_vqs(portdev);
1809 unsigned int len;
1810
1811 while ((buf = virtqueue_get_buf(portdev->c_ivq, &len)))
1812 free_buf(buf);
1813
1814 while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq)))
1815 free_buf(buf);
1816 }
1817
1818 vdev->config->del_vqs(vdev);
1819 kfree(portdev->in_vqs);
1820 kfree(portdev->out_vqs);
1821
1822 kfree(portdev); 1834 kfree(portdev);
1823} 1835}
1824 1836
@@ -1832,6 +1844,68 @@ static unsigned int features[] = {
1832 VIRTIO_CONSOLE_F_MULTIPORT, 1844 VIRTIO_CONSOLE_F_MULTIPORT,
1833}; 1845};
1834 1846
1847#ifdef CONFIG_PM
1848static int virtcons_freeze(struct virtio_device *vdev)
1849{
1850 struct ports_device *portdev;
1851 struct port *port;
1852
1853 portdev = vdev->priv;
1854
1855 vdev->config->reset(vdev);
1856
1857 virtqueue_disable_cb(portdev->c_ivq);
1858 cancel_work_sync(&portdev->control_work);
1859 /*
1860 * Once more: if control_work_handler() was running, it would
1861 * enable the cb as the last step.
1862 */
1863 virtqueue_disable_cb(portdev->c_ivq);
1864 remove_controlq_data(portdev);
1865
1866 list_for_each_entry(port, &portdev->ports, list) {
1867 virtqueue_disable_cb(port->in_vq);
1868 virtqueue_disable_cb(port->out_vq);
1869 /*
1870 * We'll ask the host later if the new invocation has
1871 * the port opened or closed.
1872 */
1873 port->host_connected = false;
1874 remove_port_data(port);
1875 }
1876 remove_vqs(portdev);
1877
1878 return 0;
1879}
1880
1881static int virtcons_restore(struct virtio_device *vdev)
1882{
1883 struct ports_device *portdev;
1884 struct port *port;
1885 int ret;
1886
1887 portdev = vdev->priv;
1888
1889 ret = init_vqs(portdev);
1890 if (ret)
1891 return ret;
1892
1893 if (use_multiport(portdev))
1894 fill_queue(portdev->c_ivq, &portdev->cvq_lock);
1895
1896 list_for_each_entry(port, &portdev->ports, list) {
1897 port->in_vq = portdev->in_vqs[port->id];
1898 port->out_vq = portdev->out_vqs[port->id];
1899
1900 fill_queue(port->in_vq, &port->inbuf_lock);
1901
1902 /* Get port open/close status on the host */
1903 send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
1904 }
1905 return 0;
1906}
1907#endif
1908
1835static struct virtio_driver virtio_console = { 1909static struct virtio_driver virtio_console = {
1836 .feature_table = features, 1910 .feature_table = features,
1837 .feature_table_size = ARRAY_SIZE(features), 1911 .feature_table_size = ARRAY_SIZE(features),
@@ -1841,6 +1915,10 @@ static struct virtio_driver virtio_console = {
1841 .probe = virtcons_probe, 1915 .probe = virtcons_probe,
1842 .remove = virtcons_remove, 1916 .remove = virtcons_remove,
1843 .config_changed = config_intr, 1917 .config_changed = config_intr,
1918#ifdef CONFIG_PM
1919 .freeze = virtcons_freeze,
1920 .restore = virtcons_restore,
1921#endif
1844}; 1922};
1845 1923
1846static int __init init(void) 1924static int __init init(void)