cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tpm.h (6860B)


      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);
    237int tpm_devs_add(struct tpm_chip *chip);
    238void tpm_devs_remove(struct tpm_chip *chip);
    239
    240void tpm_bios_log_setup(struct tpm_chip *chip);
    241void tpm_bios_log_teardown(struct tpm_chip *chip);
    242int tpm_dev_common_init(void);
    243void tpm_dev_common_exit(void);
    244#endif