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