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