Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.4-rc4 317 lines 8.0 kB view raw
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 31enum tpm_timeout { 32 TPM_TIMEOUT = 5, /* msecs */ 33}; 34 35/* TPM addresses */ 36enum 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 46extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr, 47 char *); 48extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr, 49 char *); 50extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr, 51 char *); 52extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr, 53 char *); 54extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr, 55 const char *, size_t); 56extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr, 57 char *); 58extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr, 59 char *); 60extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr, 61 char *); 62extern ssize_t tpm_show_temp_deactivated(struct device *, 63 struct device_attribute *attr, char *); 64extern ssize_t tpm_show_durations(struct device *, 65 struct device_attribute *attr, char *); 66extern ssize_t tpm_show_timeouts(struct device *, 67 struct device_attribute *attr, char *); 68 69struct tpm_chip; 70 71struct 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 104struct 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 130static inline void tpm_chip_put(struct tpm_chip *chip) 131{ 132 module_put(chip->dev->driver->owner); 133} 134 135static inline int tpm_read_index(int base, int index) 136{ 137 outb(index, base); 138 return inb(base+1) & 0xFF; 139} 140 141static inline void tpm_write_index(int base, int index, int value) 142{ 143 outb(index, base); 144 outb(value & 0xFF, base+1); 145} 146struct tpm_input_header { 147 __be16 tag; 148 __be32 length; 149 __be32 ordinal; 150}__attribute__((packed)); 151 152struct tpm_output_header { 153 __be16 tag; 154 __be32 length; 155 __be32 return_code; 156}__attribute__((packed)); 157 158struct 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 167struct tpm_version_t { 168 u8 Major; 169 u8 Minor; 170 u8 revMajor; 171 u8 revMinor; 172}__attribute__((packed)); 173 174struct tpm_version_1_2_t { 175 __be16 tag; 176 u8 Major; 177 u8 Minor; 178 u8 revMajor; 179 u8 revMinor; 180}__attribute__((packed)); 181 182struct timeout_t { 183 __be32 a; 184 __be32 b; 185 __be32 c; 186 __be32 d; 187}__attribute__((packed)); 188 189struct duration_t { 190 __be32 tpm_short; 191 __be32 tpm_medium; 192 __be32 tpm_long; 193}__attribute__((packed)); 194 195struct 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 219typedef 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 231struct tpm_getcap_params_in { 232 __be32 cap; 233 __be32 subcap_size; 234 __be32 subcap; 235}__attribute__((packed)); 236 237struct tpm_getcap_params_out { 238 __be32 cap_size; 239 cap_t cap; 240}__attribute__((packed)); 241 242struct 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 253typedef union { 254 struct tpm_input_header in; 255 struct tpm_output_header out; 256} tpm_cmd_header; 257 258#define TPM_DIGEST_SIZE 20 259struct tpm_pcrread_out { 260 u8 pcr_result[TPM_DIGEST_SIZE]; 261}__attribute__((packed)); 262 263struct tpm_pcrread_in { 264 __be32 pcr_idx; 265}__attribute__((packed)); 266 267struct tpm_pcrextend_in { 268 __be32 pcr_idx; 269 u8 hash[TPM_DIGEST_SIZE]; 270}__attribute__((packed)); 271 272typedef 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 282struct tpm_cmd_t { 283 tpm_cmd_header header; 284 tpm_cmd_params params; 285}__attribute__((packed)); 286 287ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *); 288 289extern int tpm_get_timeouts(struct tpm_chip *); 290extern void tpm_gen_interrupt(struct tpm_chip *); 291extern int tpm_do_selftest(struct tpm_chip *); 292extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); 293extern struct tpm_chip* tpm_register_hardware(struct device *, 294 const struct tpm_vendor_specific *); 295extern int tpm_open(struct inode *, struct file *); 296extern int tpm_release(struct inode *, struct file *); 297extern void tpm_dev_vendor_release(struct tpm_chip *); 298extern ssize_t tpm_write(struct file *, const char __user *, size_t, 299 loff_t *); 300extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *); 301extern void tpm_remove_hardware(struct device *); 302extern int tpm_pm_suspend(struct device *, pm_message_t); 303extern int tpm_pm_resume(struct device *); 304extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long, 305 wait_queue_head_t *); 306#ifdef CONFIG_ACPI 307extern struct dentry ** tpm_bios_log_setup(char *); 308extern void tpm_bios_log_teardown(struct dentry **); 309#else 310static inline struct dentry ** tpm_bios_log_setup(char *name) 311{ 312 return NULL; 313} 314static inline void tpm_bios_log_teardown(struct dentry **dir) 315{ 316} 317#endif