linux/drivers/char/tpm/tpm.h
<<
>>
Prefs
   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
  41extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
  42                                char *);
  43extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
  44                                char *);
  45extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr,
  46                                char *);
  47extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr,
  48                                char *);
  49extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr,
  50                                const char *, size_t);
  51extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr,
  52                                char *);
  53extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr,
  54                                char *);
  55extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
  56                                char *);
  57extern ssize_t tpm_show_temp_deactivated(struct device *,
  58                                         struct device_attribute *attr, char *);
  59extern ssize_t tpm_show_durations(struct device *,
  60                                  struct device_attribute *attr, char *);
  61extern ssize_t tpm_show_timeouts(struct device *,
  62                                 struct device_attribute *attr, char *);
  63
  64struct tpm_chip;
  65
  66struct 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
  97struct 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
 123static inline void tpm_chip_put(struct tpm_chip *chip)
 124{
 125        module_put(chip->dev->driver->owner);
 126}
 127
 128static inline int tpm_read_index(int base, int index)
 129{
 130        outb(index, base);
 131        return inb(base+1) & 0xFF;
 132}
 133
 134static inline void tpm_write_index(int base, int index, int value)
 135{
 136        outb(index, base);
 137        outb(value & 0xFF, base+1);
 138}
 139struct tpm_input_header {
 140        __be16  tag;
 141        __be32  length;
 142        __be32  ordinal;
 143}__attribute__((packed));
 144
 145struct tpm_output_header {
 146        __be16  tag;
 147        __be32  length;
 148        __be32  return_code;
 149}__attribute__((packed));
 150
 151struct  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
 160struct  tpm_version_t {
 161        u8      Major;
 162        u8      Minor;
 163        u8      revMajor;
 164        u8      revMinor;
 165}__attribute__((packed));
 166
 167struct  tpm_version_1_2_t {
 168        __be16  tag;
 169        u8      Major;
 170        u8      Minor;
 171        u8      revMajor;
 172        u8      revMinor;
 173}__attribute__((packed));
 174
 175struct  timeout_t {
 176        __be32  a;
 177        __be32  b;
 178        __be32  c;
 179        __be32  d;
 180}__attribute__((packed));
 181
 182struct duration_t {
 183        __be32  tpm_short;
 184        __be32  tpm_medium;
 185        __be32  tpm_long;
 186}__attribute__((packed));
 187
 188struct 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
 212typedef 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
 224struct  tpm_getcap_params_in {
 225        __be32  cap;
 226        __be32  subcap_size;
 227        __be32  subcap;
 228}__attribute__((packed));
 229
 230struct  tpm_getcap_params_out {
 231        __be32  cap_size;
 232        cap_t   cap;
 233}__attribute__((packed));
 234
 235struct  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
 246typedef union {
 247        struct  tpm_input_header in;
 248        struct  tpm_output_header out;
 249} tpm_cmd_header;
 250
 251#define TPM_DIGEST_SIZE 20
 252struct tpm_pcrread_out {
 253        u8      pcr_result[TPM_DIGEST_SIZE];
 254}__attribute__((packed));
 255
 256struct tpm_pcrread_in {
 257        __be32  pcr_idx;
 258}__attribute__((packed));
 259
 260struct tpm_pcrextend_in {
 261        __be32  pcr_idx;
 262        u8      hash[TPM_DIGEST_SIZE];
 263}__attribute__((packed));
 264
 265typedef 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
 275struct tpm_cmd_t {
 276        tpm_cmd_header  header;
 277        tpm_cmd_params  params;
 278}__attribute__((packed));
 279
 280ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *);
 281
 282extern void tpm_get_timeouts(struct tpm_chip *);
 283extern void tpm_gen_interrupt(struct tpm_chip *);
 284extern void tpm_continue_selftest(struct tpm_chip *);
 285extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
 286extern struct tpm_chip* tpm_register_hardware(struct device *,
 287                                 const struct tpm_vendor_specific *);
 288extern int tpm_open(struct inode *, struct file *);
 289extern int tpm_release(struct inode *, struct file *);
 290extern void tpm_dev_vendor_release(struct tpm_chip *);
 291extern ssize_t tpm_write(struct file *, const char __user *, size_t,
 292                         loff_t *);
 293extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
 294extern void tpm_remove_hardware(struct device *);
 295extern int tpm_pm_suspend(struct device *, pm_message_t);
 296extern int tpm_pm_resume(struct device *);
 297
 298#ifdef CONFIG_ACPI
 299extern struct dentry ** tpm_bios_log_setup(char *);
 300extern void tpm_bios_log_teardown(struct dentry **);
 301#else
 302static inline struct dentry ** tpm_bios_log_setup(char *name)
 303{
 304        return NULL;
 305}
 306static inline void tpm_bios_log_teardown(struct dentry **dir)
 307{
 308}
 309#endif
 310