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 #define TPM_VID_INTEL 0x8086 103 104 struct tpm_chip { 105 struct device *dev; /* Device stuff */ 106 107 int dev_num; /* /dev/tpm# */ 108 unsigned long is_open; /* only one allowed */ 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; 114 struct mutex buffer_mutex; 115 116 struct timer_list user_read_timer; /* user needs to claim result */ 117 struct work_struct work; 118 struct mutex tpm_mutex; /* tpm is processing */ 119 120 struct tpm_vendor_specific vendor; 121 122 struct dentry **bios_dir; 123 124 struct list_head list; 125 void (*release) (struct device *); 126 }; 127 128 #define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor) 129 130 static inline void tpm_chip_put(struct tpm_chip *chip) 131 { 132 module_put(chip->dev->driver->owner); 133 } 134 135 static inline int tpm_read_index(int base, int index) 136 { 137 outb(index, base); 138 return inb(base+1) & 0xFF; 139 } 140 141 static inline void tpm_write_index(int base, int index, int value) 142 { 143 outb(index, base); 144 outb(value & 0xFF, base+1); 145 } 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]; 246 __be32 paramsize; 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 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 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; 277 struct tpm_pcrread_in pcrread_in; 278 struct tpm_pcrread_out pcrread_out; 279 struct tpm_pcrextend_in pcrextend_in; 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 *); 288 289 extern int tpm_get_timeouts(struct tpm_chip *); 290 extern void tpm_gen_interrupt(struct tpm_chip *); 291 extern int tpm_do_selftest(struct tpm_chip *); 292 extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); 293 extern struct tpm_chip* tpm_register_hardware(struct device *, 294 const struct tpm_vendor_specific *); 295 extern int tpm_open(struct inode *, struct file *); 296 extern int tpm_release(struct inode *, struct file *); 297 extern void tpm_dev_vendor_release(struct tpm_chip *); 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 *); 301 extern void tpm_remove_hardware(struct device *); 302 extern int tpm_pm_suspend(struct device *, pm_message_t); 303 extern int tpm_pm_resume(struct device *); 304 extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long, 305 wait_queue_head_t *); 306 #ifdef CONFIG_ACPI 307 extern struct dentry ** tpm_bios_log_setup(char *); 308 extern void tpm_bios_log_teardown(struct dentry **); 309 #else 310 static inline struct dentry ** tpm_bios_log_setup(char *name) 311 { 312 return NULL; 313 } 314 static inline void tpm_bios_log_teardown(struct dentry **dir) 315 { 316 } 317 #endif 318