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_const {
  32        TPM_MINOR = 224,        /* officially assigned */
  33        TPM_BUFSIZE = 4096,
  34        TPM_NUM_DEVICES = 256,
  35        TPM_RETRY = 50,         /* 5 seconds */
  36};
  37
  38enum tpm_timeout {
  39        TPM_TIMEOUT = 5,        /* msecs */
  40        TPM_TIMEOUT_RETRY = 100 /* msecs */
  41};
  42
  43/* TPM addresses */
  44enum tpm_addr {
  45        TPM_SUPERIO_ADDR = 0x2E,
  46        TPM_ADDR = 0x4E,
  47};
  48
  49/* Indexes the duration array */
  50enum tpm_duration {
  51        TPM_SHORT = 0,
  52        TPM_MEDIUM = 1,
  53        TPM_LONG = 2,
  54        TPM_UNDEFINED,
  55};
  56
  57#define TPM_WARN_RETRY          0x800
  58#define TPM_WARN_DOING_SELFTEST 0x802
  59#define TPM_ERR_DEACTIVATED     0x6
  60#define TPM_ERR_DISABLED        0x7
  61#define TPM_ERR_INVALID_POSTINIT 38
  62
  63#define TPM_HEADER_SIZE         10
  64struct tpm_chip;
  65
  66struct tpm_vendor_specific {
  67        void __iomem *iobase;           /* ioremapped address */
  68        unsigned long base;             /* TPM base address */
  69
  70        int irq;
  71        int probed_irq;
  72
  73        int region_size;
  74        int have_region;
  75
  76        struct miscdevice miscdev;
  77        struct list_head list;
  78        int locality;
  79        unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */
  80        bool timeout_adjusted;
  81        unsigned long duration[3]; /* jiffies */
  82        bool duration_adjusted;
  83        void *priv;
  84
  85        wait_queue_head_t read_queue;
  86        wait_queue_head_t int_queue;
  87
  88        u16 manufacturer_id;
  89};
  90
  91#define TPM_VPRIV(c)    (c)->vendor.priv
  92
  93#define TPM_VID_INTEL    0x8086
  94#define TPM_VID_WINBOND  0x1050
  95#define TPM_VID_STM      0x104A
  96
  97struct tpm_chip {
  98        struct device *dev;     /* Device stuff */
  99        const struct tpm_class_ops *ops;
 100
 101        int dev_num;            /* /dev/tpm# */
 102        char devname[7];
 103        unsigned long is_open;  /* only one allowed */
 104        int time_expired;
 105
 106        struct mutex tpm_mutex; /* tpm is processing */
 107
 108        struct tpm_vendor_specific vendor;
 109
 110        struct dentry **bios_dir;
 111
 112        struct list_head list;
 113        void (*release) (struct device *);
 114};
 115
 116#define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor)
 117
 118static inline void tpm_chip_put(struct tpm_chip *chip)
 119{
 120        module_put(chip->dev->driver->owner);
 121}
 122
 123static inline int tpm_read_index(int base, int index)
 124{
 125        outb(index, base);
 126        return inb(base+1) & 0xFF;
 127}
 128
 129static inline void tpm_write_index(int base, int index, int value)
 130{
 131        outb(index, base);
 132        outb(value & 0xFF, base+1);
 133}
 134struct tpm_input_header {
 135        __be16  tag;
 136        __be32  length;
 137        __be32  ordinal;
 138} __packed;
 139
 140struct tpm_output_header {
 141        __be16  tag;
 142        __be32  length;
 143        __be32  return_code;
 144} __packed;
 145
 146#define TPM_TAG_RQU_COMMAND cpu_to_be16(193)
 147
 148struct  stclear_flags_t {
 149        __be16  tag;
 150        u8      deactivated;
 151        u8      disableForceClear;
 152        u8      physicalPresence;
 153        u8      physicalPresenceLock;
 154        u8      bGlobalLock;
 155} __packed;
 156
 157struct  tpm_version_t {
 158        u8      Major;
 159        u8      Minor;
 160        u8      revMajor;
 161        u8      revMinor;
 162} __packed;
 163
 164struct  tpm_version_1_2_t {
 165        __be16  tag;
 166        u8      Major;
 167        u8      Minor;
 168        u8      revMajor;
 169        u8      revMinor;
 170} __packed;
 171
 172struct  timeout_t {
 173        __be32  a;
 174        __be32  b;
 175        __be32  c;
 176        __be32  d;
 177} __packed;
 178
 179struct duration_t {
 180        __be32  tpm_short;
 181        __be32  tpm_medium;
 182        __be32  tpm_long;
 183} __packed;
 184
 185struct permanent_flags_t {
 186        __be16  tag;
 187        u8      disable;
 188        u8      ownership;
 189        u8      deactivated;
 190        u8      readPubek;
 191        u8      disableOwnerClear;
 192        u8      allowMaintenance;
 193        u8      physicalPresenceLifetimeLock;
 194        u8      physicalPresenceHWEnable;
 195        u8      physicalPresenceCMDEnable;
 196        u8      CEKPUsed;
 197        u8      TPMpost;
 198        u8      TPMpostLock;
 199        u8      FIPS;
 200        u8      operator;
 201        u8      enableRevokeEK;
 202        u8      nvLocked;
 203        u8      readSRKPub;
 204        u8      tpmEstablished;
 205        u8      maintenanceDone;
 206        u8      disableFullDALogicInfo;
 207} __packed;
 208
 209typedef union {
 210        struct  permanent_flags_t perm_flags;
 211        struct  stclear_flags_t stclear_flags;
 212        bool    owned;
 213        __be32  num_pcrs;
 214        struct  tpm_version_t   tpm_version;
 215        struct  tpm_version_1_2_t tpm_version_1_2;
 216        __be32  manufacturer_id;
 217        struct timeout_t  timeout;
 218        struct duration_t duration;
 219} cap_t;
 220
 221enum tpm_capabilities {
 222        TPM_CAP_FLAG = cpu_to_be32(4),
 223        TPM_CAP_PROP = cpu_to_be32(5),
 224        CAP_VERSION_1_1 = cpu_to_be32(0x06),
 225        CAP_VERSION_1_2 = cpu_to_be32(0x1A)
 226};
 227
 228enum tpm_sub_capabilities {
 229        TPM_CAP_PROP_PCR = cpu_to_be32(0x101),
 230        TPM_CAP_PROP_MANUFACTURER = cpu_to_be32(0x103),
 231        TPM_CAP_FLAG_PERM = cpu_to_be32(0x108),
 232        TPM_CAP_FLAG_VOL = cpu_to_be32(0x109),
 233        TPM_CAP_PROP_OWNER = cpu_to_be32(0x111),
 234        TPM_CAP_PROP_TIS_TIMEOUT = cpu_to_be32(0x115),
 235        TPM_CAP_PROP_TIS_DURATION = cpu_to_be32(0x120),
 236
 237};
 238
 239struct  tpm_getcap_params_in {
 240        __be32  cap;
 241        __be32  subcap_size;
 242        __be32  subcap;
 243} __packed;
 244
 245struct  tpm_getcap_params_out {
 246        __be32  cap_size;
 247        cap_t   cap;
 248} __packed;
 249
 250struct  tpm_readpubek_params_out {
 251        u8      algorithm[4];
 252        u8      encscheme[2];
 253        u8      sigscheme[2];
 254        __be32  paramsize;
 255        u8      parameters[12]; /*assuming RSA*/
 256        __be32  keysize;
 257        u8      modulus[256];
 258        u8      checksum[20];
 259} __packed;
 260
 261typedef union {
 262        struct  tpm_input_header in;
 263        struct  tpm_output_header out;
 264} tpm_cmd_header;
 265
 266struct tpm_pcrread_out {
 267        u8      pcr_result[TPM_DIGEST_SIZE];
 268} __packed;
 269
 270struct tpm_pcrread_in {
 271        __be32  pcr_idx;
 272} __packed;
 273
 274struct tpm_pcrextend_in {
 275        __be32  pcr_idx;
 276        u8      hash[TPM_DIGEST_SIZE];
 277} __packed;
 278
 279/* 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - 18
 280 * bytes, but 128 is still a relatively large number of random bytes and
 281 * anything much bigger causes users of struct tpm_cmd_t to start getting
 282 * compiler warnings about stack frame size. */
 283#define TPM_MAX_RNG_DATA        128
 284
 285struct tpm_getrandom_out {
 286        __be32 rng_data_len;
 287        u8     rng_data[TPM_MAX_RNG_DATA];
 288} __packed;
 289
 290struct tpm_getrandom_in {
 291        __be32 num_bytes;
 292} __packed;
 293
 294struct tpm_startup_in {
 295        __be16  startup_type;
 296} __packed;
 297
 298typedef union {
 299        struct  tpm_getcap_params_out getcap_out;
 300        struct  tpm_readpubek_params_out readpubek_out;
 301        u8      readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)];
 302        struct  tpm_getcap_params_in getcap_in;
 303        struct  tpm_pcrread_in  pcrread_in;
 304        struct  tpm_pcrread_out pcrread_out;
 305        struct  tpm_pcrextend_in pcrextend_in;
 306        struct  tpm_getrandom_in getrandom_in;
 307        struct  tpm_getrandom_out getrandom_out;
 308        struct tpm_startup_in startup_in;
 309} tpm_cmd_params;
 310
 311struct tpm_cmd_t {
 312        tpm_cmd_header  header;
 313        tpm_cmd_params  params;
 314} __packed;
 315
 316ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *);
 317
 318ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf,
 319                     size_t bufsiz);
 320extern int tpm_get_timeouts(struct tpm_chip *);
 321extern void tpm_gen_interrupt(struct tpm_chip *);
 322extern int tpm_do_selftest(struct tpm_chip *);
 323extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
 324extern struct tpm_chip* tpm_register_hardware(struct device *,
 325                                              const struct tpm_class_ops *ops);
 326extern void tpm_dev_vendor_release(struct tpm_chip *);
 327extern void tpm_remove_hardware(struct device *);
 328extern int tpm_pm_suspend(struct device *);
 329extern int tpm_pm_resume(struct device *);
 330extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
 331                             wait_queue_head_t *, bool);
 332
 333int tpm_dev_add_device(struct tpm_chip *chip);
 334void tpm_dev_del_device(struct tpm_chip *chip);
 335int tpm_sysfs_add_device(struct tpm_chip *chip);
 336void tpm_sysfs_del_device(struct tpm_chip *chip);
 337
 338int tpm_pcr_read_dev(struct tpm_chip *chip, int pcr_idx, u8 *res_buf);
 339
 340#ifdef CONFIG_ACPI
 341extern int tpm_add_ppi(struct kobject *);
 342extern void tpm_remove_ppi(struct kobject *);
 343#else
 344static inline int tpm_add_ppi(struct kobject *parent)
 345{
 346        return 0;
 347}
 348
 349static inline void tpm_remove_ppi(struct kobject *parent)
 350{
 351}
 352#endif
 353