linux/drivers/char/tpm/tpm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2004 IBM Corporation
   4 * Copyright (C) 2015 Intel Corporation
   5 *
   6 * Authors:
   7 * Leendert van Doorn <leendert@watson.ibm.com>
   8 * Dave Safford <safford@watson.ibm.com>
   9 * Reiner Sailer <sailer@watson.ibm.com>
  10 * Kylene Hall <kjhall@us.ibm.com>
  11 *
  12 * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  13 *
  14 * Device driver for TCG/TCPA TPM (trusted platform module).
  15 * Specifications at www.trustedcomputinggroup.org
  16 */
  17
  18#ifndef __TPM_H__
  19#define __TPM_H__
  20
  21#include <linux/module.h>
  22#include <linux/delay.h>
  23#include <linux/mutex.h>
  24#include <linux/sched.h>
  25#include <linux/platform_device.h>
  26#include <linux/io.h>
  27#include <linux/tpm.h>
  28#include <linux/tpm_eventlog.h>
  29
  30#ifdef CONFIG_X86
  31#include <asm/intel-family.h>
  32#endif
  33
  34#define TPM_MINOR               224     /* officially assigned */
  35#define TPM_BUFSIZE             4096
  36#define TPM_NUM_DEVICES         65536
  37#define TPM_RETRY               50
  38
  39enum tpm_timeout {
  40        TPM_TIMEOUT = 5,        /* msecs */
  41        TPM_TIMEOUT_RETRY = 100, /* msecs */
  42        TPM_TIMEOUT_RANGE_US = 300,     /* usecs */
  43        TPM_TIMEOUT_POLL = 1,   /* msecs */
  44        TPM_TIMEOUT_USECS_MIN = 100,      /* usecs */
  45        TPM_TIMEOUT_USECS_MAX = 500      /* usecs */
  46};
  47
  48/* TPM addresses */
  49enum tpm_addr {
  50        TPM_SUPERIO_ADDR = 0x2E,
  51        TPM_ADDR = 0x4E,
  52};
  53
  54#define TPM_WARN_RETRY          0x800
  55#define TPM_WARN_DOING_SELFTEST 0x802
  56#define TPM_ERR_DEACTIVATED     0x6
  57#define TPM_ERR_DISABLED        0x7
  58#define TPM_ERR_INVALID_POSTINIT 38
  59
  60#define TPM_TAG_RQU_COMMAND 193
  61
  62/* TPM2 specific constants. */
  63#define TPM2_SPACE_BUFFER_SIZE          16384 /* 16 kB */
  64
  65struct  stclear_flags_t {
  66        __be16  tag;
  67        u8      deactivated;
  68        u8      disableForceClear;
  69        u8      physicalPresence;
  70        u8      physicalPresenceLock;
  71        u8      bGlobalLock;
  72} __packed;
  73
  74struct tpm1_version {
  75        u8 major;
  76        u8 minor;
  77        u8 rev_major;
  78        u8 rev_minor;
  79} __packed;
  80
  81struct tpm1_version2 {
  82        __be16 tag;
  83        struct tpm1_version version;
  84} __packed;
  85
  86struct  timeout_t {
  87        __be32  a;
  88        __be32  b;
  89        __be32  c;
  90        __be32  d;
  91} __packed;
  92
  93struct duration_t {
  94        __be32  tpm_short;
  95        __be32  tpm_medium;
  96        __be32  tpm_long;
  97} __packed;
  98
  99struct permanent_flags_t {
 100        __be16  tag;
 101        u8      disable;
 102        u8      ownership;
 103        u8      deactivated;
 104        u8      readPubek;
 105        u8      disableOwnerClear;
 106        u8      allowMaintenance;
 107        u8      physicalPresenceLifetimeLock;
 108        u8      physicalPresenceHWEnable;
 109        u8      physicalPresenceCMDEnable;
 110        u8      CEKPUsed;
 111        u8      TPMpost;
 112        u8      TPMpostLock;
 113        u8      FIPS;
 114        u8      operator;
 115        u8      enableRevokeEK;
 116        u8      nvLocked;
 117        u8      readSRKPub;
 118        u8      tpmEstablished;
 119        u8      maintenanceDone;
 120        u8      disableFullDALogicInfo;
 121} __packed;
 122
 123typedef union {
 124        struct  permanent_flags_t perm_flags;
 125        struct  stclear_flags_t stclear_flags;
 126        __u8    owned;
 127        __be32  num_pcrs;
 128        struct tpm1_version version1;
 129        struct tpm1_version2 version2;
 130        __be32  manufacturer_id;
 131        struct timeout_t  timeout;
 132        struct duration_t duration;
 133} cap_t;
 134
 135enum tpm_capabilities {
 136        TPM_CAP_FLAG = 4,
 137        TPM_CAP_PROP = 5,
 138        TPM_CAP_VERSION_1_1 = 0x06,
 139        TPM_CAP_VERSION_1_2 = 0x1A,
 140};
 141
 142enum tpm_sub_capabilities {
 143        TPM_CAP_PROP_PCR = 0x101,
 144        TPM_CAP_PROP_MANUFACTURER = 0x103,
 145        TPM_CAP_FLAG_PERM = 0x108,
 146        TPM_CAP_FLAG_VOL = 0x109,
 147        TPM_CAP_PROP_OWNER = 0x111,
 148        TPM_CAP_PROP_TIS_TIMEOUT = 0x115,
 149        TPM_CAP_PROP_TIS_DURATION = 0x120,
 150};
 151
 152
 153/* 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - 18
 154 * bytes, but 128 is still a relatively large number of random bytes and
 155 * anything much bigger causes users of struct tpm_cmd_t to start getting
 156 * compiler warnings about stack frame size. */
 157#define TPM_MAX_RNG_DATA        128
 158
 159extern struct class *tpm_class;
 160extern struct class *tpmrm_class;
 161extern dev_t tpm_devt;
 162extern const struct file_operations tpm_fops;
 163extern const struct file_operations tpmrm_fops;
 164extern struct idr dev_nums_idr;
 165
 166ssize_t tpm_transmit(struct tpm_chip *chip, u8 *buf, size_t bufsiz);
 167int tpm_get_timeouts(struct tpm_chip *);
 168int tpm_auto_startup(struct tpm_chip *chip);
 169
 170int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_suspend_pcr);
 171int tpm1_auto_startup(struct tpm_chip *chip);
 172int tpm1_do_selftest(struct tpm_chip *chip);
 173int tpm1_get_timeouts(struct tpm_chip *chip);
 174unsigned long tpm1_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
 175int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, const u8 *hash,
 176                    const char *log_msg);
 177int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf);
 178ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
 179                    const char *desc, size_t min_cap_length);
 180int tpm1_get_random(struct tpm_chip *chip, u8 *out, size_t max);
 181int tpm1_get_pcr_allocation(struct tpm_chip *chip);
 182unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
 183int tpm_pm_suspend(struct device *dev);
 184int tpm_pm_resume(struct device *dev);
 185
 186static inline void tpm_msleep(unsigned int delay_msec)
 187{
 188        usleep_range((delay_msec * 1000) - TPM_TIMEOUT_RANGE_US,
 189                     delay_msec * 1000);
 190};
 191
 192int tpm_chip_start(struct tpm_chip *chip);
 193void tpm_chip_stop(struct tpm_chip *chip);
 194struct tpm_chip *tpm_find_get_ops(struct tpm_chip *chip);
 195
 196struct tpm_chip *tpm_chip_alloc(struct device *dev,
 197                                const struct tpm_class_ops *ops);
 198struct tpm_chip *tpmm_chip_alloc(struct device *pdev,
 199                                 const struct tpm_class_ops *ops);
 200int tpm_chip_register(struct tpm_chip *chip);
 201void tpm_chip_unregister(struct tpm_chip *chip);
 202
 203void tpm_sysfs_add_device(struct tpm_chip *chip);
 204
 205
 206#ifdef CONFIG_ACPI
 207extern void tpm_add_ppi(struct tpm_chip *chip);
 208#else
 209static inline void tpm_add_ppi(struct tpm_chip *chip)
 210{
 211}
 212#endif
 213
 214int tpm2_get_timeouts(struct tpm_chip *chip);
 215int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx,
 216                  struct tpm_digest *digest, u16 *digest_size_ptr);
 217int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx,
 218                    struct tpm_digest *digests);
 219int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max);
 220ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id,
 221                        u32 *value, const char *desc);
 222
 223ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip);
 224int tpm2_auto_startup(struct tpm_chip *chip);
 225void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type);
 226unsigned long tpm2_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
 227int tpm2_probe(struct tpm_chip *chip);
 228int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip);
 229int tpm2_find_cc(struct tpm_chip *chip, u32 cc);
 230int tpm2_init_space(struct tpm_space *space, unsigned int buf_size);
 231void tpm2_del_space(struct tpm_chip *chip, struct tpm_space *space);
 232void tpm2_flush_space(struct tpm_chip *chip);
 233int tpm2_prepare_space(struct tpm_chip *chip, struct tpm_space *space, u8 *cmd,
 234                       size_t cmdsiz);
 235int tpm2_commit_space(struct tpm_chip *chip, struct tpm_space *space, void *buf,
 236                      size_t *bufsiz);
 237
 238void tpm_bios_log_setup(struct tpm_chip *chip);
 239void tpm_bios_log_teardown(struct tpm_chip *chip);
 240int tpm_dev_common_init(void);
 241void tpm_dev_common_exit(void);
 242#endif
 243