| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2004 IBM Corporation | 
|  | 3 | * | 
|  | 4 | * Authors: | 
|  | 5 | * Leendert van Doorn <leendert@watson.ibm.com> | 
|  | 6 | * Dave Safford <safford@watson.ibm.com> | 
|  | 7 | * Reiner Sailer <sailer@watson.ibm.com> | 
|  | 8 | * Kylene Hall <kjhall@us.ibm.com> | 
|  | 9 | * | 
| Kent Yoder | 8e81cc1 | 2007-08-22 14:01:04 -0700 | [diff] [blame] | 10 | * Maintained by: <tpmdd-devel@lists.sourceforge.net> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | * | 
|  | 12 | * Device driver for TCG/TCPA TPM (trusted platform module). | 
|  | 13 | * Specifications at www.trustedcomputinggroup.org | 
|  | 14 | * | 
|  | 15 | * This program is free software; you can redistribute it and/or | 
|  | 16 | * modify it under the terms of the GNU General Public License as | 
|  | 17 | * published by the Free Software Foundation, version 2 of the | 
|  | 18 | * License. | 
|  | 19 | * | 
|  | 20 | */ | 
|  | 21 | #include <linux/module.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 22 | #include <linux/delay.h> | 
|  | 23 | #include <linux/fs.h> | 
| Matthias Kaehlcke | d081d47 | 2007-05-08 00:32:02 -0700 | [diff] [blame] | 24 | #include <linux/mutex.h> | 
| Al Viro | 914e263 | 2006-10-18 13:55:46 -0400 | [diff] [blame] | 25 | #include <linux/sched.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 | #include <linux/miscdevice.h> | 
| Al Viro | bbc5b21 | 2005-11-01 15:14:05 +0000 | [diff] [blame] | 27 | #include <linux/platform_device.h> | 
| Andrew Morton | 276ad0c | 2006-03-25 03:07:35 -0800 | [diff] [blame] | 28 | #include <linux/io.h> | 
| Rajiv Andrade | 659aaf2 | 2009-02-02 15:23:44 -0200 | [diff] [blame] | 29 | #include <linux/tpm.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 30 |  | 
| Kylene Hall | 3122a88 | 2005-06-23 22:01:48 -0700 | [diff] [blame] | 31 | enum tpm_timeout { | 
|  | 32 | TPM_TIMEOUT = 5,	/* msecs */ | 
|  | 33 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 |  | 
|  | 35 | /* TPM addresses */ | 
| Kylene Hall | 3122a88 | 2005-06-23 22:01:48 -0700 | [diff] [blame] | 36 | enum tpm_addr { | 
| Kylene Jo Hall | daacdfa | 2005-06-25 14:55:39 -0700 | [diff] [blame] | 37 | TPM_SUPERIO_ADDR = 0x2E, | 
| Kylene Hall | 3122a88 | 2005-06-23 22:01:48 -0700 | [diff] [blame] | 38 | TPM_ADDR = 0x4E, | 
| Kylene Hall | 3122a88 | 2005-06-23 22:01:48 -0700 | [diff] [blame] | 39 | }; | 
|  | 40 |  | 
| Stefan Berger | 68d6e67 | 2011-11-11 12:57:04 -0500 | [diff] [blame] | 41 | #define TPM_WARN_DOING_SELFTEST 0x802 | 
| Stefan Berger | be40541 | 2012-01-17 22:07:30 -0500 | [diff] [blame] | 42 | #define TPM_ERR_DEACTIVATED     0x6 | 
|  | 43 | #define TPM_ERR_DISABLED        0x7 | 
|  | 44 |  | 
| Rajiv Andrade | b9e3238 | 2011-11-01 17:00:52 -0200 | [diff] [blame] | 45 | #define TPM_HEADER_SIZE		10 | 
| Kylene Hall | 6659ca2 | 2005-06-23 22:02:00 -0700 | [diff] [blame] | 46 | extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr, | 
|  | 47 | char *); | 
|  | 48 | extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr, | 
|  | 49 | char *); | 
|  | 50 | extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr, | 
|  | 51 | char *); | 
| Kylene Jo Hall | 08e96e4 | 2006-04-22 02:37:50 -0700 | [diff] [blame] | 52 | extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr, | 
|  | 53 | char *); | 
| Kylene Hall | 6659ca2 | 2005-06-23 22:02:00 -0700 | [diff] [blame] | 54 | extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr, | 
|  | 55 | const char *, size_t); | 
| Kylene Jo Hall | 08e96e4 | 2006-04-22 02:37:50 -0700 | [diff] [blame] | 56 | extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr, | 
|  | 57 | char *); | 
|  | 58 | extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr, | 
|  | 59 | char *); | 
|  | 60 | extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr, | 
|  | 61 | char *); | 
|  | 62 | extern ssize_t tpm_show_temp_deactivated(struct device *, | 
|  | 63 | struct device_attribute *attr, char *); | 
| Stefan Berger | 04ab229 | 2011-03-30 12:13:25 -0400 | [diff] [blame] | 64 | extern ssize_t tpm_show_durations(struct device *, | 
|  | 65 | struct device_attribute *attr, char *); | 
| Stefan Berger | 6259210 | 2011-03-30 12:13:28 -0400 | [diff] [blame] | 66 | extern ssize_t tpm_show_timeouts(struct device *, | 
|  | 67 | struct device_attribute *attr, char *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 68 |  | 
|  | 69 | struct tpm_chip; | 
|  | 70 |  | 
|  | 71 | struct tpm_vendor_specific { | 
| Kylene Jo Hall | e0dd03c | 2006-04-22 02:37:26 -0700 | [diff] [blame] | 72 | const u8 req_complete_mask; | 
|  | 73 | const u8 req_complete_val; | 
|  | 74 | const u8 req_canceled; | 
| Kylene Jo Hall | ad5ea3c | 2005-11-13 16:07:41 -0800 | [diff] [blame] | 75 | void __iomem *iobase;		/* ioremapped address */ | 
|  | 76 | unsigned long base;		/* TPM base address */ | 
|  | 77 |  | 
| Leendert van Doorn | 27084ef | 2006-04-22 02:38:03 -0700 | [diff] [blame] | 78 | int irq; | 
| Stefan Berger | a7b6682 | 2011-03-30 12:13:32 -0400 | [diff] [blame] | 79 | int probed_irq; | 
| Leendert van Doorn | 27084ef | 2006-04-22 02:38:03 -0700 | [diff] [blame] | 80 |  | 
| Kylene Jo Hall | ad5ea3c | 2005-11-13 16:07:41 -0800 | [diff] [blame] | 81 | int region_size; | 
|  | 82 | int have_region; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 |  | 
|  | 84 | int (*recv) (struct tpm_chip *, u8 *, size_t); | 
|  | 85 | int (*send) (struct tpm_chip *, u8 *, size_t); | 
|  | 86 | void (*cancel) (struct tpm_chip *); | 
| Kylene Jo Hall | b4ed3e3 | 2005-10-30 15:03:23 -0800 | [diff] [blame] | 87 | u8 (*status) (struct tpm_chip *); | 
| Richard MUSIL | 5bd91f1 | 2008-02-06 01:37:02 -0800 | [diff] [blame] | 88 | void (*release) (struct device *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 89 | struct miscdevice miscdev; | 
| Kylene Hall | 6659ca2 | 2005-06-23 22:02:00 -0700 | [diff] [blame] | 90 | struct attribute_group *attr_group; | 
| Leendert van Doorn | 27084ef | 2006-04-22 02:38:03 -0700 | [diff] [blame] | 91 | struct list_head list; | 
|  | 92 | int locality; | 
| Kylene Jo Hall | 36b2002 | 2006-04-22 02:38:19 -0700 | [diff] [blame] | 93 | unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */ | 
| Stefan Berger | 6259210 | 2011-03-30 12:13:28 -0400 | [diff] [blame] | 94 | bool timeout_adjusted; | 
| Kylene Jo Hall | 36b2002 | 2006-04-22 02:38:19 -0700 | [diff] [blame] | 95 | unsigned long duration[3]; /* jiffies */ | 
| Stefan Berger | 04ab229 | 2011-03-30 12:13:25 -0400 | [diff] [blame] | 96 | bool duration_adjusted; | 
| Leendert van Doorn | 27084ef | 2006-04-22 02:38:03 -0700 | [diff] [blame] | 97 |  | 
|  | 98 | wait_queue_head_t read_queue; | 
|  | 99 | wait_queue_head_t int_queue; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 100 | }; | 
|  | 101 |  | 
| Stefan Berger | 4e401fb | 2012-01-20 12:58:49 -0500 | [diff] [blame] | 102 | #define TPM_VID_INTEL    0x8086 | 
|  | 103 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 104 | struct tpm_chip { | 
| Kylene Jo Hall | e659a3f | 2005-10-30 15:03:24 -0800 | [diff] [blame] | 105 | struct device *dev;	/* Device stuff */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 106 |  | 
|  | 107 | int dev_num;		/* /dev/tpm# */ | 
| Rajiv Andrade | dc36d32 | 2008-10-11 09:04:02 +1100 | [diff] [blame] | 108 | unsigned long is_open;	/* only one allowed */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 109 | int time_expired; | 
|  | 110 |  | 
|  | 111 | /* Data passed to and from the tpm via the read/write calls */ | 
|  | 112 | u8 *data_buffer; | 
|  | 113 | atomic_t data_pending; | 
| Matthias Kaehlcke | d081d47 | 2007-05-08 00:32:02 -0700 | [diff] [blame] | 114 | struct mutex buffer_mutex; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 115 |  | 
|  | 116 | struct timer_list user_read_timer;	/* user needs to claim result */ | 
| Kylene Jo Hall | 09e12f9 | 2005-11-13 16:07:43 -0800 | [diff] [blame] | 117 | struct work_struct work; | 
| Matthias Kaehlcke | d081d47 | 2007-05-08 00:32:02 -0700 | [diff] [blame] | 118 | struct mutex tpm_mutex;	/* tpm is processing */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 119 |  | 
| Kylene Jo Hall | 90dda52 | 2006-04-22 02:37:15 -0700 | [diff] [blame] | 120 | struct tpm_vendor_specific vendor; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 |  | 
| Kylene Jo Hall | 55a82ab | 2006-01-08 01:03:15 -0800 | [diff] [blame] | 122 | struct dentry **bios_dir; | 
|  | 123 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 124 | struct list_head list; | 
| Richard MUSIL | 5bd91f1 | 2008-02-06 01:37:02 -0800 | [diff] [blame] | 125 | void (*release) (struct device *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 126 | }; | 
|  | 127 |  | 
| Leendert van Doorn | 27084ef | 2006-04-22 02:38:03 -0700 | [diff] [blame] | 128 | #define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor) | 
|  | 129 |  | 
| Mimi Zohar | a0e3934 | 2010-11-23 17:50:32 -0500 | [diff] [blame] | 130 | static inline void tpm_chip_put(struct tpm_chip *chip) | 
|  | 131 | { | 
|  | 132 | module_put(chip->dev->driver->owner); | 
|  | 133 | } | 
|  | 134 |  | 
| Kylene Jo Hall | daacdfa | 2005-06-25 14:55:39 -0700 | [diff] [blame] | 135 | static inline int tpm_read_index(int base, int index) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 136 | { | 
| Kylene Jo Hall | daacdfa | 2005-06-25 14:55:39 -0700 | [diff] [blame] | 137 | outb(index, base); | 
|  | 138 | return inb(base+1) & 0xFF; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 139 | } | 
|  | 140 |  | 
| Kylene Jo Hall | daacdfa | 2005-06-25 14:55:39 -0700 | [diff] [blame] | 141 | static inline void tpm_write_index(int base, int index, int value) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 142 | { | 
| Kylene Jo Hall | daacdfa | 2005-06-25 14:55:39 -0700 | [diff] [blame] | 143 | outb(index, base); | 
|  | 144 | outb(value & 0xFF, base+1); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 | } | 
| Rajiv Andrade | 0883743 | 2009-02-02 15:23:43 -0200 | [diff] [blame] | 146 | struct tpm_input_header { | 
|  | 147 | __be16	tag; | 
|  | 148 | __be32	length; | 
|  | 149 | __be32	ordinal; | 
|  | 150 | }__attribute__((packed)); | 
|  | 151 |  | 
|  | 152 | struct tpm_output_header { | 
|  | 153 | __be16	tag; | 
|  | 154 | __be32	length; | 
|  | 155 | __be32	return_code; | 
|  | 156 | }__attribute__((packed)); | 
|  | 157 |  | 
|  | 158 | struct	stclear_flags_t { | 
|  | 159 | __be16	tag; | 
|  | 160 | u8	deactivated; | 
|  | 161 | u8	disableForceClear; | 
|  | 162 | u8	physicalPresence; | 
|  | 163 | u8	physicalPresenceLock; | 
|  | 164 | u8	bGlobalLock; | 
|  | 165 | }__attribute__((packed)); | 
|  | 166 |  | 
|  | 167 | struct	tpm_version_t { | 
|  | 168 | u8	Major; | 
|  | 169 | u8	Minor; | 
|  | 170 | u8	revMajor; | 
|  | 171 | u8	revMinor; | 
|  | 172 | }__attribute__((packed)); | 
|  | 173 |  | 
|  | 174 | struct	tpm_version_1_2_t { | 
|  | 175 | __be16	tag; | 
|  | 176 | u8	Major; | 
|  | 177 | u8	Minor; | 
|  | 178 | u8	revMajor; | 
|  | 179 | u8	revMinor; | 
|  | 180 | }__attribute__((packed)); | 
|  | 181 |  | 
|  | 182 | struct	timeout_t { | 
|  | 183 | __be32	a; | 
|  | 184 | __be32	b; | 
|  | 185 | __be32	c; | 
|  | 186 | __be32	d; | 
|  | 187 | }__attribute__((packed)); | 
|  | 188 |  | 
|  | 189 | struct duration_t { | 
|  | 190 | __be32	tpm_short; | 
|  | 191 | __be32	tpm_medium; | 
|  | 192 | __be32	tpm_long; | 
|  | 193 | }__attribute__((packed)); | 
|  | 194 |  | 
|  | 195 | struct permanent_flags_t { | 
|  | 196 | __be16	tag; | 
|  | 197 | u8	disable; | 
|  | 198 | u8	ownership; | 
|  | 199 | u8	deactivated; | 
|  | 200 | u8	readPubek; | 
|  | 201 | u8	disableOwnerClear; | 
|  | 202 | u8	allowMaintenance; | 
|  | 203 | u8	physicalPresenceLifetimeLock; | 
|  | 204 | u8	physicalPresenceHWEnable; | 
|  | 205 | u8	physicalPresenceCMDEnable; | 
|  | 206 | u8	CEKPUsed; | 
|  | 207 | u8	TPMpost; | 
|  | 208 | u8	TPMpostLock; | 
|  | 209 | u8	FIPS; | 
|  | 210 | u8	operator; | 
|  | 211 | u8	enableRevokeEK; | 
|  | 212 | u8	nvLocked; | 
|  | 213 | u8	readSRKPub; | 
|  | 214 | u8	tpmEstablished; | 
|  | 215 | u8	maintenanceDone; | 
|  | 216 | u8	disableFullDALogicInfo; | 
|  | 217 | }__attribute__((packed)); | 
|  | 218 |  | 
|  | 219 | typedef union { | 
|  | 220 | struct	permanent_flags_t perm_flags; | 
|  | 221 | struct	stclear_flags_t	stclear_flags; | 
|  | 222 | bool	owned; | 
|  | 223 | __be32	num_pcrs; | 
|  | 224 | struct	tpm_version_t	tpm_version; | 
|  | 225 | struct	tpm_version_1_2_t tpm_version_1_2; | 
|  | 226 | __be32	manufacturer_id; | 
|  | 227 | struct timeout_t  timeout; | 
|  | 228 | struct duration_t duration; | 
|  | 229 | } cap_t; | 
|  | 230 |  | 
|  | 231 | struct	tpm_getcap_params_in { | 
|  | 232 | __be32	cap; | 
|  | 233 | __be32	subcap_size; | 
|  | 234 | __be32	subcap; | 
|  | 235 | }__attribute__((packed)); | 
|  | 236 |  | 
|  | 237 | struct	tpm_getcap_params_out { | 
|  | 238 | __be32	cap_size; | 
|  | 239 | cap_t	cap; | 
|  | 240 | }__attribute__((packed)); | 
|  | 241 |  | 
|  | 242 | struct	tpm_readpubek_params_out { | 
|  | 243 | u8	algorithm[4]; | 
|  | 244 | u8	encscheme[2]; | 
|  | 245 | u8	sigscheme[2]; | 
| Rajiv Andrade | 02a077c | 2010-06-14 13:58:22 -0300 | [diff] [blame] | 246 | __be32	paramsize; | 
| Rajiv Andrade | 0883743 | 2009-02-02 15:23:43 -0200 | [diff] [blame] | 247 | u8	parameters[12]; /*assuming RSA*/ | 
|  | 248 | __be32	keysize; | 
|  | 249 | u8	modulus[256]; | 
|  | 250 | u8	checksum[20]; | 
|  | 251 | }__attribute__((packed)); | 
|  | 252 |  | 
|  | 253 | typedef union { | 
|  | 254 | struct	tpm_input_header in; | 
|  | 255 | struct	tpm_output_header out; | 
|  | 256 | } tpm_cmd_header; | 
|  | 257 |  | 
| Rajiv Andrade | 659aaf2 | 2009-02-02 15:23:44 -0200 | [diff] [blame] | 258 | #define TPM_DIGEST_SIZE 20 | 
|  | 259 | struct tpm_pcrread_out { | 
|  | 260 | u8	pcr_result[TPM_DIGEST_SIZE]; | 
|  | 261 | }__attribute__((packed)); | 
|  | 262 |  | 
|  | 263 | struct tpm_pcrread_in { | 
|  | 264 | __be32	pcr_idx; | 
|  | 265 | }__attribute__((packed)); | 
|  | 266 |  | 
|  | 267 | struct tpm_pcrextend_in { | 
|  | 268 | __be32	pcr_idx; | 
|  | 269 | u8	hash[TPM_DIGEST_SIZE]; | 
|  | 270 | }__attribute__((packed)); | 
|  | 271 |  | 
| Rajiv Andrade | 0883743 | 2009-02-02 15:23:43 -0200 | [diff] [blame] | 272 | typedef union { | 
|  | 273 | struct	tpm_getcap_params_out getcap_out; | 
|  | 274 | struct	tpm_readpubek_params_out readpubek_out; | 
|  | 275 | u8	readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)]; | 
|  | 276 | struct	tpm_getcap_params_in getcap_in; | 
| Rajiv Andrade | 659aaf2 | 2009-02-02 15:23:44 -0200 | [diff] [blame] | 277 | struct	tpm_pcrread_in	pcrread_in; | 
|  | 278 | struct	tpm_pcrread_out	pcrread_out; | 
|  | 279 | struct	tpm_pcrextend_in pcrextend_in; | 
| Rajiv Andrade | 0883743 | 2009-02-02 15:23:43 -0200 | [diff] [blame] | 280 | } tpm_cmd_params; | 
|  | 281 |  | 
|  | 282 | struct tpm_cmd_t { | 
|  | 283 | tpm_cmd_header	header; | 
|  | 284 | tpm_cmd_params	params; | 
|  | 285 | }__attribute__((packed)); | 
|  | 286 |  | 
|  | 287 | ssize_t	tpm_getcap(struct device *, __be32, cap_t *, const char *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 288 |  | 
| Stefan Berger | 2b30a90 | 2011-11-11 12:57:02 -0500 | [diff] [blame] | 289 | extern int tpm_get_timeouts(struct tpm_chip *); | 
| Kylene Jo Hall | 08e96e4 | 2006-04-22 02:37:50 -0700 | [diff] [blame] | 290 | extern void tpm_gen_interrupt(struct tpm_chip *); | 
| Stefan Berger | 68d6e67 | 2011-11-11 12:57:04 -0500 | [diff] [blame] | 291 | extern int tpm_do_selftest(struct tpm_chip *); | 
| Kylene Jo Hall | 9e18ee1 | 2006-04-22 02:37:38 -0700 | [diff] [blame] | 292 | extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); | 
| Kylene Jo Hall | e0dd03c | 2006-04-22 02:37:26 -0700 | [diff] [blame] | 293 | extern struct tpm_chip* tpm_register_hardware(struct device *, | 
|  | 294 | const struct tpm_vendor_specific *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 295 | extern int tpm_open(struct inode *, struct file *); | 
|  | 296 | extern int tpm_release(struct inode *, struct file *); | 
| Rajiv Andrade | 253115b | 2008-10-11 09:04:39 +1100 | [diff] [blame] | 297 | extern void tpm_dev_vendor_release(struct tpm_chip *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 298 | extern ssize_t tpm_write(struct file *, const char __user *, size_t, | 
|  | 299 | loff_t *); | 
|  | 300 | extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *); | 
| Kylene Jo Hall | e659a3f | 2005-10-30 15:03:24 -0800 | [diff] [blame] | 301 | extern void tpm_remove_hardware(struct device *); | 
| Rafael J. Wysocki | 035e2ce | 2012-07-06 19:09:01 +0200 | [diff] [blame] | 302 | extern int tpm_pm_suspend(struct device *); | 
| Kylene Jo Hall | ce2c87d | 2005-10-30 15:03:25 -0800 | [diff] [blame] | 303 | extern int tpm_pm_resume(struct device *); | 
| Rajiv Andrade | fd04886 | 2011-09-16 14:39:40 -0300 | [diff] [blame] | 304 | extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long, | 
|  | 305 | wait_queue_head_t *); | 
| Kylene Jo Hall | 55a82ab | 2006-01-08 01:03:15 -0800 | [diff] [blame] | 306 | #ifdef CONFIG_ACPI | 
|  | 307 | extern struct dentry ** tpm_bios_log_setup(char *); | 
|  | 308 | extern void tpm_bios_log_teardown(struct dentry **); | 
|  | 309 | #else | 
| Daniel Walker | bb53a76 | 2006-05-15 09:44:27 -0700 | [diff] [blame] | 310 | static inline struct dentry ** tpm_bios_log_setup(char *name) | 
| Kylene Jo Hall | 55a82ab | 2006-01-08 01:03:15 -0800 | [diff] [blame] | 311 | { | 
|  | 312 | return NULL; | 
|  | 313 | } | 
|  | 314 | static inline void tpm_bios_log_teardown(struct dentry **dir) | 
|  | 315 | { | 
|  | 316 | } | 
|  | 317 | #endif |