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 * 10 * Maintained by: <tpmdd-devel@lists.sourceforge.net> 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> 22 #include <linux/delay.h> 23 #include <linux/fs.h> 24 #include <linux/mutex.h> 25 #include <linux/sched.h> 26 #include <linux/miscdevice.h> 27 #include <linux/platform_device.h> 28 #include <linux/io.h> 29 #include <linux/tpm.h> 30 31 enum tpm_const { 32 TPM_MINOR = 224, /* officially assigned */ 33 TPM_BUFSIZE = 4096, 34 TPM_NUM_DEVICES = 256, 35 TPM_RETRY = 50, /* 5 seconds */ 36 }; 37 38 enum tpm_timeout { 39 TPM_TIMEOUT = 5, /* msecs */ 40 TPM_TIMEOUT_RETRY = 100 /* msecs */ 41 }; 42 43 /* TPM addresses */ 44 enum tpm_addr { 45 TPM_SUPERIO_ADDR = 0x2E, 46 TPM_ADDR = 0x4E, 47 }; 48 49 /* Indexes the duration array */ 50 enum tpm_duration { 51 TPM_SHORT = 0, 52 TPM_MEDIUM = 1, 53 TPM_LONG = 2, 54 TPM_UNDEFINED, 55 }; 56 57 #define TPM_WARN_RETRY 0x800 58 #define TPM_WARN_DOING_SELFTEST 0x802 59 #define TPM_ERR_DEACTIVATED 0x6 60 #define TPM_ERR_DISABLED 0x7 61 #define TPM_ERR_INVALID_POSTINIT 38 62 63 #define TPM_HEADER_SIZE 10 64 struct tpm_chip; 65 66 struct tpm_vendor_specific { 67 void __iomem *iobase; /* ioremapped address */ 68 unsigned long base; /* TPM base address */ 69 70 int irq; 71 int probed_irq; 72 73 int region_size; 74 int have_region; 75 76 struct miscdevice miscdev; 77 struct list_head list; 78 int locality; 79 unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */ 80 bool timeout_adjusted; 81 unsigned long duration[3]; /* jiffies */ 82 bool duration_adjusted; 83 void *priv; 84 85 wait_queue_head_t read_queue; 86 wait_queue_head_t int_queue; 87 88 u16 manufacturer_id; 89 }; 90 91 #define TPM_VPRIV(c) (c)->vendor.priv 92 93 #define TPM_VID_INTEL 0x8086 94 #define TPM_VID_WINBOND 0x1050 95 #define TPM_VID_STM 0x104A 96 97 struct tpm_chip { 98 struct device *dev; /* Device stuff */ 99 const struct tpm_class_ops *ops; 100 101 int dev_num; /* /dev/tpm# */ 102 char devname[7]; 103 unsigned long is_open; /* only one allowed */ 104 int time_expired; 105 106 struct mutex tpm_mutex; /* tpm is processing */ 107 108 struct tpm_vendor_specific vendor; 109 110 struct dentry **bios_dir; 111 112 struct list_head list; 113 void (*release) (struct device *); 114 }; 115 116 #define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor) 117 118 static inline void tpm_chip_put(struct tpm_chip *chip) 119 { 120 module_put(chip->dev->driver->owner); 121 } 122 123 static inline int tpm_read_index(int base, int index) 124 { 125 outb(index, base); 126 return inb(base+1) & 0xFF; 127 } 128 129 static inline void tpm_write_index(int base, int index, int value) 130 { 131 outb(index, base); 132 outb(value & 0xFF, base+1); 133 } 134 struct tpm_input_header { 135 __be16 tag; 136 __be32 length; 137 __be32 ordinal; 138 } __packed; 139 140 struct tpm_output_header { 141 __be16 tag; 142 __be32 length; 143 __be32 return_code; 144 } __packed; 145 146 #define TPM_TAG_RQU_COMMAND cpu_to_be16(193) 147 148 struct stclear_flags_t { 149 __be16 tag; 150 u8 deactivated; 151 u8 disableForceClear; 152 u8 physicalPresence; 153 u8 physicalPresenceLock; 154 u8 bGlobalLock; 155 } __packed; 156 157 struct tpm_version_t { 158 u8 Major; 159 u8 Minor; 160 u8 revMajor; 161 u8 revMinor; 162 } __packed; 163 164 struct tpm_version_1_2_t { 165 __be16 tag; 166 u8 Major; 167 u8 Minor; 168 u8 revMajor; 169 u8 revMinor; 170 } __packed; 171 172 struct timeout_t { 173 __be32 a; 174 __be32 b; 175 __be32 c; 176 __be32 d; 177 } __packed; 178 179 struct duration_t { 180 __be32 tpm_short; 181 __be32 tpm_medium; 182 __be32 tpm_long; 183 } __packed; 184 185 struct permanent_flags_t { 186 __be16 tag; 187 u8 disable; 188 u8 ownership; 189 u8 deactivated; 190 u8 readPubek; 191 u8 disableOwnerClear; 192 u8 allowMaintenance; 193 u8 physicalPresenceLifetimeLock; 194 u8 physicalPresenceHWEnable; 195 u8 physicalPresenceCMDEnable; 196 u8 CEKPUsed; 197 u8 TPMpost; 198 u8 TPMpostLock; 199 u8 FIPS; 200 u8 operator; 201 u8 enableRevokeEK; 202 u8 nvLocked; 203 u8 readSRKPub; 204 u8 tpmEstablished; 205 u8 maintenanceDone; 206 u8 disableFullDALogicInfo; 207 } __packed; 208 209 typedef union { 210 struct permanent_flags_t perm_flags; 211 struct stclear_flags_t stclear_flags; 212 bool owned; 213 __be32 num_pcrs; 214 struct tpm_version_t tpm_version; 215 struct tpm_version_1_2_t tpm_version_1_2; 216 __be32 manufacturer_id; 217 struct timeout_t timeout; 218 struct duration_t duration; 219 } cap_t; 220 221 enum tpm_capabilities { 222 TPM_CAP_FLAG = cpu_to_be32(4), 223 TPM_CAP_PROP = cpu_to_be32(5), 224 CAP_VERSION_1_1 = cpu_to_be32(0x06), 225 CAP_VERSION_1_2 = cpu_to_be32(0x1A) 226 }; 227 228 enum tpm_sub_capabilities { 229 TPM_CAP_PROP_PCR = cpu_to_be32(0x101), 230 TPM_CAP_PROP_MANUFACTURER = cpu_to_be32(0x103), 231 TPM_CAP_FLAG_PERM = cpu_to_be32(0x108), 232 TPM_CAP_FLAG_VOL = cpu_to_be32(0x109), 233 TPM_CAP_PROP_OWNER = cpu_to_be32(0x111), 234 TPM_CAP_PROP_TIS_TIMEOUT = cpu_to_be32(0x115), 235 TPM_CAP_PROP_TIS_DURATION = cpu_to_be32(0x120), 236 237 }; 238 239 struct tpm_getcap_params_in { 240 __be32 cap; 241 __be32 subcap_size; 242 __be32 subcap; 243 } __packed; 244 245 struct tpm_getcap_params_out { 246 __be32 cap_size; 247 cap_t cap; 248 } __packed; 249 250 struct tpm_readpubek_params_out { 251 u8 algorithm[4]; 252 u8 encscheme[2]; 253 u8 sigscheme[2]; 254 __be32 paramsize; 255 u8 parameters[12]; /*assuming RSA*/ 256 __be32 keysize; 257 u8 modulus[256]; 258 u8 checksum[20]; 259 } __packed; 260 261 typedef union { 262 struct tpm_input_header in; 263 struct tpm_output_header out; 264 } tpm_cmd_header; 265 266 struct tpm_pcrread_out { 267 u8 pcr_result[TPM_DIGEST_SIZE]; 268 } __packed; 269 270 struct tpm_pcrread_in { 271 __be32 pcr_idx; 272 } __packed; 273 274 struct tpm_pcrextend_in { 275 __be32 pcr_idx; 276 u8 hash[TPM_DIGEST_SIZE]; 277 } __packed; 278 279 /* 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - 18 280 * bytes, but 128 is still a relatively large number of random bytes and 281 * anything much bigger causes users of struct tpm_cmd_t to start getting 282 * compiler warnings about stack frame size. */ 283 #define TPM_MAX_RNG_DATA 128 284 285 struct tpm_getrandom_out { 286 __be32 rng_data_len; 287 u8 rng_data[TPM_MAX_RNG_DATA]; 288 } __packed; 289 290 struct tpm_getrandom_in { 291 __be32 num_bytes; 292 } __packed; 293 294 struct tpm_startup_in { 295 __be16 startup_type; 296 } __packed; 297 298 typedef union { 299 struct tpm_getcap_params_out getcap_out; 300 struct tpm_readpubek_params_out readpubek_out; 301 u8 readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)]; 302 struct tpm_getcap_params_in getcap_in; 303 struct tpm_pcrread_in pcrread_in; 304 struct tpm_pcrread_out pcrread_out; 305 struct tpm_pcrextend_in pcrextend_in; 306 struct tpm_getrandom_in getrandom_in; 307 struct tpm_getrandom_out getrandom_out; 308 struct tpm_startup_in startup_in; 309 } tpm_cmd_params; 310 311 struct tpm_cmd_t { 312 tpm_cmd_header header; 313 tpm_cmd_params params; 314 } __packed; 315 316 ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *); 317 318 ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, 319 size_t bufsiz); 320 extern int tpm_get_timeouts(struct tpm_chip *); 321 extern void tpm_gen_interrupt(struct tpm_chip *); 322 extern int tpm_do_selftest(struct tpm_chip *); 323 extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); 324 extern struct tpm_chip* tpm_register_hardware(struct device *, 325 const struct tpm_class_ops *ops); 326 extern void tpm_dev_vendor_release(struct tpm_chip *); 327 extern void tpm_remove_hardware(struct device *); 328 extern int tpm_pm_suspend(struct device *); 329 extern int tpm_pm_resume(struct device *); 330 extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long, 331 wait_queue_head_t *, bool); 332 333 int tpm_dev_add_device(struct tpm_chip *chip); 334 void tpm_dev_del_device(struct tpm_chip *chip); 335 int tpm_sysfs_add_device(struct tpm_chip *chip); 336 void tpm_sysfs_del_device(struct tpm_chip *chip); 337 338 int tpm_pcr_read_dev(struct tpm_chip *chip, int pcr_idx, u8 *res_buf); 339 340 #ifdef CONFIG_ACPI 341 extern int tpm_add_ppi(struct kobject *); 342 extern void tpm_remove_ppi(struct kobject *); 343 #else 344 static inline int tpm_add_ppi(struct kobject *parent) 345 { 346 return 0; 347 } 348 349 static inline void tpm_remove_ppi(struct kobject *parent) 350 { 351 } 352 #endif 353