1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Following copyright information was take from the original file
* <drivers/char/tpm/tpm_tis_core.h> where the definitions were moved
* from:
*
* Copyright (C) 2005, 2006 IBM Corporation
* Copyright (C) 2014, 2015 Intel Corporation
*
* Authors:
* Leendert van Doorn <leendert@watson.ibm.com>
* Kylene Hall <kjhall@us.ibm.com>
*
* Maintained by: <tpmdd-devel@lists.sourceforge.net>
*
* Device driver for TCG/TCPA TPM (trusted platform module).
* Specifications at www.trustedcomputinggroup.org
*
* This device driver implements the TPM interface as defined in
* the TCG TPM Interface Spec version 1.2, revision 1.0.
*/
#ifndef __LINUX_TPM_PTP_H__
#define __LINUX_TPM_PTP_H__
/*
* TCG PC Client Platform TPM Profile (PTP) Specification
* https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profile-ptp-specification/
*/
/* TIS/FIFO macros and definitions */
enum tis_access {
TPM_ACCESS_VALID = 0x80,
TPM_ACCESS_ACTIVE_LOCALITY = 0x20, /* (R) */
TPM_ACCESS_RELINQUISH_LOCALITY = 0x20, /* (W) */
TPM_ACCESS_REQUEST_PENDING = 0x04, /* (W) */
TPM_ACCESS_REQUEST_USE = 0x02, /* (W) */
};
enum tis_status {
TPM_STS_VALID = 0x80, /* (R) */
TPM_STS_COMMAND_READY = 0x40, /* (R) */
TPM_STS_DATA_AVAIL = 0x10, /* (R) */
TPM_STS_DATA_EXPECT = 0x08, /* (R) */
TPM_STS_GO = 0x20, /* (W) */
TPM_STS_RESPONSE_RETRY = 0x02, /* (R) */
TPM_STS_READ_ZERO = 0x23, /* bits that must be zero on read */
};
enum tis_int_flags {
TPM_GLOBAL_INT_ENABLE = 0x80000000,
TPM_INTF_BURST_COUNT_STATIC = 0x100,
TPM_INTF_CMD_READY_INT = 0x080,
TPM_INTF_INT_EDGE_FALLING = 0x040,
TPM_INTF_INT_EDGE_RISING = 0x020,
TPM_INTF_INT_LEVEL_LOW = 0x010,
TPM_INTF_INT_LEVEL_HIGH = 0x008,
TPM_INTF_LOCALITY_CHANGE_INT = 0x004,
TPM_INTF_STS_VALID_INT = 0x002,
TPM_INTF_DATA_AVAIL_INT = 0x001,
};
enum tis_defaults {
TIS_MEM_LEN = 0x5000,
TIS_SHORT_TIMEOUT = 750, /* ms */
TIS_LONG_TIMEOUT = 4000, /* 4 secs */
TIS_TIMEOUT_MIN_ATML = 14700, /* usecs */
TIS_TIMEOUT_MAX_ATML = 15000, /* usecs */
};
#define TIS_MEM_X86_LPC_BASE 0xFED40000
#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000
enum tis_x86_defaults {
TIS_MEM_X86_LEN = 0x5000,
ILB_REMAP_SIZE = 0x100,
LPC_CNTRL_OFFSET = 0x84,
LPC_CLKRUN_EN = (1 << 2),
};
/*
* Some timeout values are needed before it is known whether the chip is
* TPM 1.0 or TPM 2.0.
*/
#define TIS_TIMEOUT_A_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_A)
#define TIS_TIMEOUT_B_MAX max_t(int, TIS_LONG_TIMEOUT, TPM2_TIMEOUT_B)
#define TIS_TIMEOUT_C_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_C)
#define TIS_TIMEOUT_D_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_D)
#define TPM_ACCESS(l) (0x0000 | ((l) << 12))
#define TPM_INT_ENABLE(l) (0x0008 | ((l) << 12))
#define TPM_INT_VECTOR(l) (0x000C | ((l) << 12))
#define TPM_INT_STATUS(l) (0x0010 | ((l) << 12))
#define TPM_INTF_CAPS(l) (0x0014 | ((l) << 12))
#define TPM_STS(l) (0x0018 | ((l) << 12))
#define TPM_STS3(l) (0x001b | ((l) << 12))
#define TPM_DATA_FIFO(l) (0x0024 | ((l) << 12))
#define TPM_INTF_ID(l) (0x0030 | ((l) << 12))
#define TPM_DID_VID(l) (0x0F00 | ((l) << 12))
#define TPM_RID(l) (0x0F04 | ((l) << 12))
/* TPM HW Interface and Capabilities */
#define TPM_TIS_INTF_ACTIVE 0x00
#define TPM_CRB_INTF_ACTIVE 0x01
#define TPM_INTID_INTERFACE_TYPE GENMASK(3, 0)
#define TPM_INTID_INTERFACE_VERSION GENMASK(7, 4)
#define TPM_INTID_CAP_LOCALITY BIT(8)
#define TPM_INTID_CAP_TIS BIT(13)
#define TPM_INTID_CAP_CRB BIT(14)
#define TPM_INTID_CAP_IF_RES GENMASK(16, 15)
#define TPM_INTID_INTERFACE_SELECTOR GENMASK(18, 17)
#define TPM_INTID_INTF_SEL_LOCK BIT(19)
#define TPM_TIS_INTF_12 0x00
#define TPM_TIS_INTF_13 0x02
#define TPM2_TIS_INTF_13 0x03
#define TPM_INTF_DATA_AVAIL_INT_SUPPORT BIT(0)
#define TPM_INTF_STS_VALID_INT_SUPPORT BIT(1)
#define TPM_INTF_LOCALITY_CHANGE_INT_SUPPORT BIT(2)
#define TPM_INTF_INTERRUPT_LEVEL_HIGH BIT(3)
#define TPM_INTF_INTERRUPT_LEVEL_LOW BIT(4)
#define TPM_INTF_INTERRUPT_EDGE_RISING BIT(5)
#define TPM_INTF_INTERRUPT_EDGE_FALLING BIT(6)
#define TPM_INTF_COMMAND_READY_INT_SUPPORT BIT(7)
#define TPM_INTF_BURST_COUNT_STATIC BIT(8)
#define TPM_INTF_DATA_TRANSFER_SIZE_SUPPORT GENMASK(10, 9)
#define TPM_INTF_INTERFACE_VERSION GENMASK(30, 28)
#endif
|