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_timeout { 32 TPM_TIMEOUT = 5, /* msecs */ 33 }; 34 35 /* TPM addresses */ 36 enum tpm_addr { 37 TPM_SUPERIO_ADDR = 0x2E, 38 TPM_ADDR = 0x4E, 39 }; 40 41 #define TPM_WARN_DOING_SELFTEST 0x802 42 #define TPM_ERR_DEACTIVATED 0x6 43 #define TPM_ERR_DISABLED 0x7 44 45 #define TPM_HEADER_SIZE 10 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 *); 52 extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr, 53 char *); 54 extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr, 55 const char *, size_t); 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 *); 64 extern ssize_t tpm_show_durations(struct device *, 65 struct device_attribute *attr, char *); 66 extern ssize_t tpm_show_timeouts(struct device *, 67 struct device_attribute *attr, char *); 68 69 struct tpm_chip; 70 71 struct tpm_vendor_specific { 72 const u8 req_complete_mask; 73 const u8 req_complete_val; 74 const u8 req_canceled; 75 void __iomem *iobase; /* ioremapped address */ 76 unsigned long base; /* TPM base address */ 77 78 int irq; 79 int probed_irq; 80 81 int region_size; 82 int have_region; 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 *); 87 u8 (*status) (struct tpm_chip *); 88 void (*release) (struct device *); 89 struct miscdevice miscdev; 90 struct attribute_group *attr_group; 91 struct list_head list; 92 int locality; 93 unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */ 94 bool timeout_adjusted; 95 unsigned long duration[3]; /* jiffies */ 96 bool duration_adjusted; 97 98 wait_queue_head_t read_queue; 99 wait_queue_head_t int_queue; 100 }; 101 102 struct tpm_chip { 103 struct device *dev; /* Device stuff */ 104 105 int dev_num; /* /dev/tpm# */ 106 unsigned long is_open; /* only one allowed */ 107 int time_expired; 108 109 /* Data passed to and from the tpm via the read/write calls */ 110 u8 *data_buffer; 111 atomic_t data_pending; 112 struct mutex buffer_mutex; 113 114 struct timer_list user_read_timer; /* user needs to claim result */ 115 struct work_struct work; 116 struct mutex tpm_mutex; /* tpm is processing */ 117 118 struct tpm_vendor_specific vendor; 119 120 struct dentry **bios_dir; 121 122 struct list_head list; 123 void (*release) (struct device *); 124 }; 125 126 #define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor) 127 128 static inline void tpm_chip_put(struct tpm_chip *chip) 129 { 130 module_put(chip->dev->driver->owner); 131 } 132 133 static inline int tpm_read_index(int base, int index) 134 { 135 outb(index, base); 136 return inb(base+1) & 0xFF; 137 } 138 139 static inline void tpm_write_index(int base, int index, int value) 140 { 141 outb(index, base); 142 outb(value & 0xFF, base+1); 143 } 144 struct tpm_input_header { 145 __be16 tag; 146 __be32 length; 147 __be32 ordinal; 148 }__attribute__((packed)); 149 150 struct tpm_output_header { 151 __be16 tag; 152 __be32 length; 153 __be32 return_code; 154 }__attribute__((packed)); 155 156 struct stclear_flags_t { 157 __be16 tag; 158 u8 deactivated; 159 u8 disableForceClear; 160 u8 physicalPresence; 161 u8 physicalPresenceLock; 162 u8 bGlobalLock; 163 }__attribute__((packed)); 164 165 struct tpm_version_t { 166 u8 Major; 167 u8 Minor; 168 u8 revMajor; 169 u8 revMinor; 170 }__attribute__((packed)); 171 172 struct tpm_version_1_2_t { 173 __be16 tag; 174 u8 Major; 175 u8 Minor; 176 u8 revMajor; 177 u8 revMinor; 178 }__attribute__((packed)); 179 180 struct timeout_t { 181 __be32 a; 182 __be32 b; 183 __be32 c; 184 __be32 d; 185 }__attribute__((packed)); 186 187 struct duration_t { 188 __be32 tpm_short; 189 __be32 tpm_medium; 190 __be32 tpm_long; 191 }__attribute__((packed)); 192 193 struct permanent_flags_t { 194 __be16 tag; 195 u8 disable; 196 u8 ownership; 197 u8 deactivated; 198 u8 readPubek; 199 u8 disableOwnerClear; 200 u8 allowMaintenance; 201 u8 physicalPresenceLifetimeLock; 202 u8 physicalPresenceHWEnable; 203 u8 physicalPresenceCMDEnable; 204 u8 CEKPUsed; 205 u8 TPMpost; 206 u8 TPMpostLock; 207 u8 FIPS; 208 u8 operator; 209 u8 enableRevokeEK; 210 u8 nvLocked; 211 u8 readSRKPub; 212 u8 tpmEstablished; 213 u8 maintenanceDone; 214 u8 disableFullDALogicInfo; 215 }__attribute__((packed)); 216 217 typedef union { 218 struct permanent_flags_t perm_flags; 219 struct stclear_flags_t stclear_flags; 220 bool owned; 221 __be32 num_pcrs; 222 struct tpm_version_t tpm_version; 223 struct tpm_version_1_2_t tpm_version_1_2; 224 __be32 manufacturer_id; 225 struct timeout_t timeout; 226 struct duration_t duration; 227 } cap_t; 228 229 struct tpm_getcap_params_in { 230 __be32 cap; 231 __be32 subcap_size; 232 __be32 subcap; 233 }__attribute__((packed)); 234 235 struct tpm_getcap_params_out { 236 __be32 cap_size; 237 cap_t cap; 238 }__attribute__((packed)); 239 240 struct tpm_readpubek_params_out { 241 u8 algorithm[4]; 242 u8 encscheme[2]; 243 u8 sigscheme[2]; 244 __be32 paramsize; 245 u8 parameters[12]; /*assuming RSA*/ 246 __be32 keysize; 247 u8 modulus[256]; 248 u8 checksum[20]; 249 }__attribute__((packed)); 250 251 typedef union { 252 struct tpm_input_header in; 253 struct tpm_output_header out; 254 } tpm_cmd_header; 255 256 #define TPM_DIGEST_SIZE 20 257 struct tpm_pcrread_out { 258 u8 pcr_result[TPM_DIGEST_SIZE]; 259 }__attribute__((packed)); 260 261 struct tpm_pcrread_in { 262 __be32 pcr_idx; 263 }__attribute__((packed)); 264 265 struct tpm_pcrextend_in { 266 __be32 pcr_idx; 267 u8 hash[TPM_DIGEST_SIZE]; 268 }__attribute__((packed)); 269 270 typedef union { 271 struct tpm_getcap_params_out getcap_out; 272 struct tpm_readpubek_params_out readpubek_out; 273 u8 readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)]; 274 struct tpm_getcap_params_in getcap_in; 275 struct tpm_pcrread_in pcrread_in; 276 struct tpm_pcrread_out pcrread_out; 277 struct tpm_pcrextend_in pcrextend_in; 278 } tpm_cmd_params; 279 280 struct tpm_cmd_t { 281 tpm_cmd_header header; 282 tpm_cmd_params params; 283 }__attribute__((packed)); 284 285 ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *); 286 287 extern int tpm_get_timeouts(struct tpm_chip *); 288 extern void tpm_gen_interrupt(struct tpm_chip *); 289 extern int tpm_do_selftest(struct tpm_chip *); 290 extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); 291 extern struct tpm_chip* tpm_register_hardware(struct device *, 292 const struct tpm_vendor_specific *); 293 extern int tpm_open(struct inode *, struct file *); 294 extern int tpm_release(struct inode *, struct file *); 295 extern void tpm_dev_vendor_release(struct tpm_chip *); 296 extern ssize_t tpm_write(struct file *, const char __user *, size_t, 297 loff_t *); 298 extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *); 299 extern void tpm_remove_hardware(struct device *); 300 extern int tpm_pm_suspend(struct device *, pm_message_t); 301 extern int tpm_pm_resume(struct device *); 302 extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long, 303 wait_queue_head_t *); 304 #ifdef CONFIG_ACPI 305 extern struct dentry ** tpm_bios_log_setup(char *); 306 extern void tpm_bios_log_teardown(struct dentry **); 307 #else 308 static inline struct dentry ** tpm_bios_log_setup(char *name) 309 { 310 return NULL; 311 } 312 static inline void tpm_bios_log_teardown(struct dentry **dir) 313 { 314 } 315 #endif 316